Imported Upstream version 7.68.0 24/225724/1 upstream/7.68.0
authorSeonah Moon <seonah1.moon@samsung.com>
Mon, 24 Feb 2020 06:56:49 +0000 (15:56 +0900)
committerSeonah Moon <seonah1.moon@samsung.com>
Mon, 24 Feb 2020 06:57:31 +0000 (15:57 +0900)
Change-Id: I37422e43c2c4c25904a4fc2a391c4a32ba3b9f5c

1590 files changed:
CHANGES
CMake/CurlSymbolHiding.cmake
CMake/CurlTests.c
CMake/FindBearSSL.cmake [new file with mode: 0644]
CMake/FindGSS.cmake
CMake/OtherTests.cmake
CMake/Platforms/WindowsCache.cmake
CMakeLists.txt
COPYING
Makefile.am
Makefile.in
README
RELEASE-NOTES
acinclude.m4
aclocal.m4
buildconf.bat
configure
configure.ac
docs/ALTSVC.md [new file with mode: 0644]
docs/BINDINGS.md
docs/BUG-BOUNTY.md [new file with mode: 0644]
docs/BUGS
docs/CHECKSRC.md
docs/CIPHERS.md
docs/CODE_STYLE.md
docs/CONTRIBUTE.md
docs/CURL-DISABLE.md [new file with mode: 0644]
docs/DEPRECATE.md
docs/ESNI.md [new file with mode: 0644]
docs/EXPERIMENTAL.md [new file with mode: 0644]
docs/FAQ
docs/FEATURES
docs/GOVERNANCE.md
docs/HISTORY.md
docs/HTTP-COOKIES.md
docs/HTTP2.md
docs/HTTP3.md [new file with mode: 0644]
docs/INSTALL.md
docs/INTERNALS.md
docs/KNOWN_BUGS
docs/LICENSE-MIXING.md
docs/MANUAL [deleted file]
docs/Makefile.am
docs/Makefile.in
docs/PARALLEL-TRANSFERS.md [new file with mode: 0644]
docs/RELEASE-PROCEDURE.md
docs/ROADMAP.md
docs/SECURITY-PROCESS.md
docs/SSL-PROBLEMS.md
docs/THANKS
docs/TODO
docs/cmdline-opts/Makefile.in
docs/cmdline-opts/Makefile.inc
docs/cmdline-opts/alt-svc.d [new file with mode: 0644]
docs/cmdline-opts/cacert.d
docs/cmdline-opts/cert.d
docs/cmdline-opts/config.d
docs/cmdline-opts/cookie.d
docs/cmdline-opts/data.d
docs/cmdline-opts/doh-url.d
docs/cmdline-opts/dump-header.d
docs/cmdline-opts/etag-compare.d [new file with mode: 0644]
docs/cmdline-opts/etag-save.d [new file with mode: 0644]
docs/cmdline-opts/gen.pl
docs/cmdline-opts/http0.9.d [new file with mode: 0644]
docs/cmdline-opts/http2.d
docs/cmdline-opts/http3.d [new file with mode: 0644]
docs/cmdline-opts/key.d
docs/cmdline-opts/max-redirs.d
docs/cmdline-opts/netrc-file.d
docs/cmdline-opts/no-progress-meter.d [new file with mode: 0644]
docs/cmdline-opts/parallel-immediate.d [new file with mode: 0644]
docs/cmdline-opts/parallel-max.d [new file with mode: 0644]
docs/cmdline-opts/parallel.d [new file with mode: 0644]
docs/cmdline-opts/pinnedpubkey.d
docs/cmdline-opts/proto-redir.d
docs/cmdline-opts/proto.d
docs/cmdline-opts/proxy-tls13-ciphers.d
docs/cmdline-opts/proxy-user.d
docs/cmdline-opts/proxytunnel.d
docs/cmdline-opts/quote.d
docs/cmdline-opts/resolve.d
docs/cmdline-opts/retry.d
docs/cmdline-opts/sasl-authzid.d [new file with mode: 0644]
docs/cmdline-opts/ssl-no-revoke.d
docs/cmdline-opts/tls-max.d
docs/cmdline-opts/tls13-ciphers.d
docs/cmdline-opts/tlspassword.d
docs/cmdline-opts/tlsuser.d
docs/cmdline-opts/tlsv1.0.d
docs/cmdline-opts/tlsv1.1.d
docs/cmdline-opts/tlsv1.2.d
docs/cmdline-opts/user.d
docs/cmdline-opts/version.d
docs/cmdline-opts/write-out.d
docs/curl-config.1
docs/curl.1
docs/examples/10-at-a-time.c
docs/examples/Makefile.am
docs/examples/Makefile.in
docs/examples/Makefile.inc
docs/examples/Makefile.netware
docs/examples/altsvc.c [new file with mode: 0644]
docs/examples/anyauthput.c
docs/examples/cacertinmem.c
docs/examples/chkspeed.c
docs/examples/crawler.c
docs/examples/curlgtk.c
docs/examples/curlx.c
docs/examples/ephiperfifo.c
docs/examples/evhiperfifo.c
docs/examples/externalsocket.c
docs/examples/fileupload.c
docs/examples/fopen.c
docs/examples/ftp-wildcard.c
docs/examples/ftpget.c
docs/examples/ftpgetinfo.c
docs/examples/ftpsget.c
docs/examples/ftpupload.c
docs/examples/ghiper.c
docs/examples/hiperfifo.c
docs/examples/href_extractor.c
docs/examples/htmltidy.c
docs/examples/htmltitle.cpp
docs/examples/http-post.c
docs/examples/http2-download.c
docs/examples/http2-serverpush.c
docs/examples/http2-upload.c
docs/examples/http3-present.c [new file with mode: 0644]
docs/examples/http3.c [new file with mode: 0644]
docs/examples/httpcustomheader.c
docs/examples/https.c
docs/examples/imap-append.c
docs/examples/imap-authzid.c [new file with mode: 0644]
docs/examples/imap-list.c
docs/examples/imap-lsub.c
docs/examples/imap-noop.c
docs/examples/imap-store.c
docs/examples/multi-app.c
docs/examples/multi-event.c [new file with mode: 0644]
docs/examples/multi-poll.c [new file with mode: 0644]
docs/examples/multithread.c
docs/examples/pop3-authzid.c [new file with mode: 0644]
docs/examples/pop3-dele.c
docs/examples/pop3-list.c
docs/examples/pop3-noop.c
docs/examples/pop3-retr.c
docs/examples/pop3-ssl.c
docs/examples/pop3-stat.c
docs/examples/pop3-uidl.c
docs/examples/postinmemory.c
docs/examples/postit2-formadd.c
docs/examples/postit2.c
docs/examples/resolve.c
docs/examples/rtsp.c
docs/examples/sampleconv.c
docs/examples/sendrecv.c
docs/examples/sessioninfo.c
docs/examples/sftpget.c
docs/examples/sftpuploadresume.c
docs/examples/shared-connection-cache.c
docs/examples/smooth-gtk-thread.c
docs/examples/smtp-authzid.c [new file with mode: 0644]
docs/examples/smtp-expn.c
docs/examples/smtp-mime.c
docs/examples/smtp-ssl.c
docs/examples/smtp-tls.c
docs/examples/smtp-vrfy.c
docs/examples/sslbackend.c
docs/examples/synctime.c
docs/examples/threaded-shared-conn.c
docs/examples/threaded-ssl.c
docs/examples/url2file.c
docs/examples/urlapi.c [new file with mode: 0644]
docs/examples/usercertinmem.c
docs/libcurl/Makefile.in
docs/libcurl/Makefile.inc
docs/libcurl/curl_easy_cleanup.3
docs/libcurl/curl_easy_duphandle.3
docs/libcurl/curl_easy_escape.3
docs/libcurl/curl_easy_getinfo.3
docs/libcurl/curl_easy_init.3
docs/libcurl/curl_easy_pause.3
docs/libcurl/curl_easy_perform.3
docs/libcurl/curl_easy_recv.3
docs/libcurl/curl_easy_reset.3
docs/libcurl/curl_easy_send.3
docs/libcurl/curl_easy_setopt.3
docs/libcurl/curl_easy_strerror.3
docs/libcurl/curl_easy_unescape.3
docs/libcurl/curl_escape.3
docs/libcurl/curl_formadd.3
docs/libcurl/curl_formfree.3
docs/libcurl/curl_formget.3
docs/libcurl/curl_free.3
docs/libcurl/curl_getdate.3
docs/libcurl/curl_getenv.3
docs/libcurl/curl_global_cleanup.3
docs/libcurl/curl_global_init.3
docs/libcurl/curl_global_init_mem.3
docs/libcurl/curl_global_sslset.3
docs/libcurl/curl_mime_addpart.3
docs/libcurl/curl_mime_data.3
docs/libcurl/curl_mime_data_cb.3
docs/libcurl/curl_mime_encoder.3
docs/libcurl/curl_mime_filedata.3
docs/libcurl/curl_mime_filename.3
docs/libcurl/curl_mime_free.3
docs/libcurl/curl_mime_headers.3
docs/libcurl/curl_mime_init.3
docs/libcurl/curl_mime_name.3
docs/libcurl/curl_mime_subparts.3
docs/libcurl/curl_mime_type.3
docs/libcurl/curl_mprintf.3
docs/libcurl/curl_multi_add_handle.3
docs/libcurl/curl_multi_assign.3
docs/libcurl/curl_multi_cleanup.3
docs/libcurl/curl_multi_fdset.3
docs/libcurl/curl_multi_info_read.3
docs/libcurl/curl_multi_init.3
docs/libcurl/curl_multi_perform.3
docs/libcurl/curl_multi_poll.3 [new file with mode: 0644]
docs/libcurl/curl_multi_remove_handle.3
docs/libcurl/curl_multi_setopt.3
docs/libcurl/curl_multi_socket.3
docs/libcurl/curl_multi_socket_action.3
docs/libcurl/curl_multi_strerror.3
docs/libcurl/curl_multi_timeout.3
docs/libcurl/curl_multi_wait.3
docs/libcurl/curl_multi_wakeup.3 [new file with mode: 0644]
docs/libcurl/curl_share_cleanup.3
docs/libcurl/curl_share_init.3
docs/libcurl/curl_share_setopt.3
docs/libcurl/curl_share_strerror.3
docs/libcurl/curl_slist_append.3
docs/libcurl/curl_slist_free_all.3
docs/libcurl/curl_strequal.3
docs/libcurl/curl_unescape.3
docs/libcurl/curl_url.3
docs/libcurl/curl_url_cleanup.3
docs/libcurl/curl_url_dup.3
docs/libcurl/curl_url_get.3
docs/libcurl/curl_url_set.3
docs/libcurl/curl_version.3
docs/libcurl/curl_version_info.3
docs/libcurl/libcurl-easy.3
docs/libcurl/libcurl-env.3
docs/libcurl/libcurl-errors.3
docs/libcurl/libcurl-multi.3
docs/libcurl/libcurl-security.3
docs/libcurl/libcurl-share.3
docs/libcurl/libcurl-symbols.3
docs/libcurl/libcurl-thread.3
docs/libcurl/libcurl-tutorial.3
docs/libcurl/libcurl-url.3
docs/libcurl/libcurl.3
docs/libcurl/opts/CURLINFO_ACTIVESOCKET.3
docs/libcurl/opts/CURLINFO_APPCONNECT_TIME.3
docs/libcurl/opts/CURLINFO_APPCONNECT_TIME_T.3
docs/libcurl/opts/CURLINFO_CERTINFO.3
docs/libcurl/opts/CURLINFO_CONDITION_UNMET.3
docs/libcurl/opts/CURLINFO_CONNECT_TIME.3
docs/libcurl/opts/CURLINFO_CONNECT_TIME_T.3
docs/libcurl/opts/CURLINFO_CONTENT_LENGTH_DOWNLOAD.3
docs/libcurl/opts/CURLINFO_CONTENT_LENGTH_DOWNLOAD_T.3
docs/libcurl/opts/CURLINFO_CONTENT_LENGTH_UPLOAD.3
docs/libcurl/opts/CURLINFO_CONTENT_LENGTH_UPLOAD_T.3
docs/libcurl/opts/CURLINFO_CONTENT_TYPE.3
docs/libcurl/opts/CURLINFO_COOKIELIST.3
docs/libcurl/opts/CURLINFO_EFFECTIVE_URL.3
docs/libcurl/opts/CURLINFO_FILETIME.3
docs/libcurl/opts/CURLINFO_FILETIME_T.3
docs/libcurl/opts/CURLINFO_FTP_ENTRY_PATH.3
docs/libcurl/opts/CURLINFO_HEADER_SIZE.3
docs/libcurl/opts/CURLINFO_HTTPAUTH_AVAIL.3
docs/libcurl/opts/CURLINFO_HTTP_CONNECTCODE.3
docs/libcurl/opts/CURLINFO_HTTP_VERSION.3
docs/libcurl/opts/CURLINFO_LASTSOCKET.3
docs/libcurl/opts/CURLINFO_LOCAL_IP.3
docs/libcurl/opts/CURLINFO_LOCAL_PORT.3
docs/libcurl/opts/CURLINFO_NAMELOOKUP_TIME.3
docs/libcurl/opts/CURLINFO_NAMELOOKUP_TIME_T.3
docs/libcurl/opts/CURLINFO_NUM_CONNECTS.3
docs/libcurl/opts/CURLINFO_OS_ERRNO.3
docs/libcurl/opts/CURLINFO_PRETRANSFER_TIME.3
docs/libcurl/opts/CURLINFO_PRETRANSFER_TIME_T.3
docs/libcurl/opts/CURLINFO_PRIMARY_IP.3
docs/libcurl/opts/CURLINFO_PRIMARY_PORT.3
docs/libcurl/opts/CURLINFO_PRIVATE.3
docs/libcurl/opts/CURLINFO_PROTOCOL.3
docs/libcurl/opts/CURLINFO_PROXYAUTH_AVAIL.3
docs/libcurl/opts/CURLINFO_PROXY_SSL_VERIFYRESULT.3
docs/libcurl/opts/CURLINFO_REDIRECT_COUNT.3
docs/libcurl/opts/CURLINFO_REDIRECT_TIME.3
docs/libcurl/opts/CURLINFO_REDIRECT_TIME_T.3
docs/libcurl/opts/CURLINFO_REDIRECT_URL.3
docs/libcurl/opts/CURLINFO_REQUEST_SIZE.3
docs/libcurl/opts/CURLINFO_RESPONSE_CODE.3
docs/libcurl/opts/CURLINFO_RETRY_AFTER.3 [new file with mode: 0644]
docs/libcurl/opts/CURLINFO_RTSP_CLIENT_CSEQ.3
docs/libcurl/opts/CURLINFO_RTSP_CSEQ_RECV.3
docs/libcurl/opts/CURLINFO_RTSP_SERVER_CSEQ.3
docs/libcurl/opts/CURLINFO_RTSP_SESSION_ID.3
docs/libcurl/opts/CURLINFO_SCHEME.3
docs/libcurl/opts/CURLINFO_SIZE_DOWNLOAD.3
docs/libcurl/opts/CURLINFO_SIZE_DOWNLOAD_T.3
docs/libcurl/opts/CURLINFO_SIZE_UPLOAD.3
docs/libcurl/opts/CURLINFO_SIZE_UPLOAD_T.3
docs/libcurl/opts/CURLINFO_SPEED_DOWNLOAD.3
docs/libcurl/opts/CURLINFO_SPEED_DOWNLOAD_T.3
docs/libcurl/opts/CURLINFO_SPEED_UPLOAD.3
docs/libcurl/opts/CURLINFO_SPEED_UPLOAD_T.3
docs/libcurl/opts/CURLINFO_SSL_ENGINES.3
docs/libcurl/opts/CURLINFO_SSL_VERIFYRESULT.3
docs/libcurl/opts/CURLINFO_STARTTRANSFER_TIME.3
docs/libcurl/opts/CURLINFO_STARTTRANSFER_TIME_T.3
docs/libcurl/opts/CURLINFO_TLS_SESSION.3
docs/libcurl/opts/CURLINFO_TLS_SSL_PTR.3
docs/libcurl/opts/CURLINFO_TOTAL_TIME.3
docs/libcurl/opts/CURLINFO_TOTAL_TIME_T.3
docs/libcurl/opts/CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE.3
docs/libcurl/opts/CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE.3
docs/libcurl/opts/CURLMOPT_MAXCONNECTS.3
docs/libcurl/opts/CURLMOPT_MAX_CONCURRENT_STREAMS.3 [new file with mode: 0644]
docs/libcurl/opts/CURLMOPT_MAX_HOST_CONNECTIONS.3
docs/libcurl/opts/CURLMOPT_MAX_PIPELINE_LENGTH.3
docs/libcurl/opts/CURLMOPT_MAX_TOTAL_CONNECTIONS.3
docs/libcurl/opts/CURLMOPT_PIPELINING.3
docs/libcurl/opts/CURLMOPT_PIPELINING_SERVER_BL.3
docs/libcurl/opts/CURLMOPT_PIPELINING_SITE_BL.3
docs/libcurl/opts/CURLMOPT_PUSHDATA.3
docs/libcurl/opts/CURLMOPT_PUSHFUNCTION.3
docs/libcurl/opts/CURLMOPT_SOCKETDATA.3
docs/libcurl/opts/CURLMOPT_SOCKETFUNCTION.3
docs/libcurl/opts/CURLMOPT_TIMERDATA.3
docs/libcurl/opts/CURLMOPT_TIMERFUNCTION.3
docs/libcurl/opts/CURLOPT_ABSTRACT_UNIX_SOCKET.3
docs/libcurl/opts/CURLOPT_ACCEPTTIMEOUT_MS.3
docs/libcurl/opts/CURLOPT_ACCEPT_ENCODING.3
docs/libcurl/opts/CURLOPT_ADDRESS_SCOPE.3
docs/libcurl/opts/CURLOPT_ALTSVC.3 [new file with mode: 0644]
docs/libcurl/opts/CURLOPT_ALTSVC_CTRL.3 [new file with mode: 0644]
docs/libcurl/opts/CURLOPT_APPEND.3
docs/libcurl/opts/CURLOPT_AUTOREFERER.3
docs/libcurl/opts/CURLOPT_BUFFERSIZE.3
docs/libcurl/opts/CURLOPT_CAINFO.3
docs/libcurl/opts/CURLOPT_CAPATH.3
docs/libcurl/opts/CURLOPT_CERTINFO.3
docs/libcurl/opts/CURLOPT_CHUNK_BGN_FUNCTION.3
docs/libcurl/opts/CURLOPT_CHUNK_DATA.3
docs/libcurl/opts/CURLOPT_CHUNK_END_FUNCTION.3
docs/libcurl/opts/CURLOPT_CLOSESOCKETDATA.3
docs/libcurl/opts/CURLOPT_CLOSESOCKETFUNCTION.3
docs/libcurl/opts/CURLOPT_CONNECTTIMEOUT.3
docs/libcurl/opts/CURLOPT_CONNECTTIMEOUT_MS.3
docs/libcurl/opts/CURLOPT_CONNECT_ONLY.3
docs/libcurl/opts/CURLOPT_CONNECT_TO.3
docs/libcurl/opts/CURLOPT_CONV_FROM_NETWORK_FUNCTION.3
docs/libcurl/opts/CURLOPT_CONV_FROM_UTF8_FUNCTION.3
docs/libcurl/opts/CURLOPT_CONV_TO_NETWORK_FUNCTION.3
docs/libcurl/opts/CURLOPT_COOKIE.3
docs/libcurl/opts/CURLOPT_COOKIEFILE.3
docs/libcurl/opts/CURLOPT_COOKIEJAR.3
docs/libcurl/opts/CURLOPT_COOKIELIST.3
docs/libcurl/opts/CURLOPT_COOKIESESSION.3
docs/libcurl/opts/CURLOPT_COPYPOSTFIELDS.3
docs/libcurl/opts/CURLOPT_CRLF.3
docs/libcurl/opts/CURLOPT_CRLFILE.3
docs/libcurl/opts/CURLOPT_CURLU.3 [new file with mode: 0644]
docs/libcurl/opts/CURLOPT_CUSTOMREQUEST.3
docs/libcurl/opts/CURLOPT_DEBUGDATA.3
docs/libcurl/opts/CURLOPT_DEBUGFUNCTION.3
docs/libcurl/opts/CURLOPT_DEFAULT_PROTOCOL.3
docs/libcurl/opts/CURLOPT_DIRLISTONLY.3
docs/libcurl/opts/CURLOPT_DISALLOW_USERNAME_IN_URL.3
docs/libcurl/opts/CURLOPT_DNS_CACHE_TIMEOUT.3
docs/libcurl/opts/CURLOPT_DNS_INTERFACE.3
docs/libcurl/opts/CURLOPT_DNS_LOCAL_IP4.3
docs/libcurl/opts/CURLOPT_DNS_LOCAL_IP6.3
docs/libcurl/opts/CURLOPT_DNS_SERVERS.3
docs/libcurl/opts/CURLOPT_DNS_SHUFFLE_ADDRESSES.3
docs/libcurl/opts/CURLOPT_DNS_USE_GLOBAL_CACHE.3
docs/libcurl/opts/CURLOPT_DOH_URL.3
docs/libcurl/opts/CURLOPT_EGDSOCKET.3
docs/libcurl/opts/CURLOPT_ERRORBUFFER.3
docs/libcurl/opts/CURLOPT_EXPECT_100_TIMEOUT_MS.3
docs/libcurl/opts/CURLOPT_FAILONERROR.3
docs/libcurl/opts/CURLOPT_FILETIME.3
docs/libcurl/opts/CURLOPT_FNMATCH_DATA.3
docs/libcurl/opts/CURLOPT_FNMATCH_FUNCTION.3
docs/libcurl/opts/CURLOPT_FOLLOWLOCATION.3
docs/libcurl/opts/CURLOPT_FORBID_REUSE.3
docs/libcurl/opts/CURLOPT_FRESH_CONNECT.3
docs/libcurl/opts/CURLOPT_FTPPORT.3
docs/libcurl/opts/CURLOPT_FTPSSLAUTH.3
docs/libcurl/opts/CURLOPT_FTP_ACCOUNT.3
docs/libcurl/opts/CURLOPT_FTP_ALTERNATIVE_TO_USER.3
docs/libcurl/opts/CURLOPT_FTP_CREATE_MISSING_DIRS.3
docs/libcurl/opts/CURLOPT_FTP_FILEMETHOD.3
docs/libcurl/opts/CURLOPT_FTP_RESPONSE_TIMEOUT.3
docs/libcurl/opts/CURLOPT_FTP_SKIP_PASV_IP.3
docs/libcurl/opts/CURLOPT_FTP_SSL_CCC.3
docs/libcurl/opts/CURLOPT_FTP_USE_EPRT.3
docs/libcurl/opts/CURLOPT_FTP_USE_EPSV.3
docs/libcurl/opts/CURLOPT_FTP_USE_PRET.3
docs/libcurl/opts/CURLOPT_GSSAPI_DELEGATION.3
docs/libcurl/opts/CURLOPT_HAPPY_EYEBALLS_TIMEOUT_MS.3
docs/libcurl/opts/CURLOPT_HAPROXYPROTOCOL.3
docs/libcurl/opts/CURLOPT_HEADER.3
docs/libcurl/opts/CURLOPT_HEADERDATA.3
docs/libcurl/opts/CURLOPT_HEADERFUNCTION.3
docs/libcurl/opts/CURLOPT_HEADEROPT.3
docs/libcurl/opts/CURLOPT_HTTP09_ALLOWED.3 [new file with mode: 0644]
docs/libcurl/opts/CURLOPT_HTTP200ALIASES.3
docs/libcurl/opts/CURLOPT_HTTPAUTH.3
docs/libcurl/opts/CURLOPT_HTTPGET.3
docs/libcurl/opts/CURLOPT_HTTPHEADER.3
docs/libcurl/opts/CURLOPT_HTTPPOST.3
docs/libcurl/opts/CURLOPT_HTTPPROXYTUNNEL.3
docs/libcurl/opts/CURLOPT_HTTP_CONTENT_DECODING.3
docs/libcurl/opts/CURLOPT_HTTP_TRANSFER_DECODING.3
docs/libcurl/opts/CURLOPT_HTTP_VERSION.3
docs/libcurl/opts/CURLOPT_IGNORE_CONTENT_LENGTH.3
docs/libcurl/opts/CURLOPT_INFILESIZE.3
docs/libcurl/opts/CURLOPT_INFILESIZE_LARGE.3
docs/libcurl/opts/CURLOPT_INTERFACE.3
docs/libcurl/opts/CURLOPT_INTERLEAVEDATA.3
docs/libcurl/opts/CURLOPT_INTERLEAVEFUNCTION.3
docs/libcurl/opts/CURLOPT_IOCTLDATA.3
docs/libcurl/opts/CURLOPT_IOCTLFUNCTION.3
docs/libcurl/opts/CURLOPT_IPRESOLVE.3
docs/libcurl/opts/CURLOPT_ISSUERCERT.3
docs/libcurl/opts/CURLOPT_KEEP_SENDING_ON_ERROR.3
docs/libcurl/opts/CURLOPT_KEYPASSWD.3
docs/libcurl/opts/CURLOPT_KRBLEVEL.3
docs/libcurl/opts/CURLOPT_LOCALPORT.3
docs/libcurl/opts/CURLOPT_LOCALPORTRANGE.3
docs/libcurl/opts/CURLOPT_LOGIN_OPTIONS.3
docs/libcurl/opts/CURLOPT_LOW_SPEED_LIMIT.3
docs/libcurl/opts/CURLOPT_LOW_SPEED_TIME.3
docs/libcurl/opts/CURLOPT_MAIL_AUTH.3
docs/libcurl/opts/CURLOPT_MAIL_FROM.3
docs/libcurl/opts/CURLOPT_MAIL_RCPT.3
docs/libcurl/opts/CURLOPT_MAXAGE_CONN.3 [new file with mode: 0644]
docs/libcurl/opts/CURLOPT_MAXCONNECTS.3
docs/libcurl/opts/CURLOPT_MAXFILESIZE.3
docs/libcurl/opts/CURLOPT_MAXFILESIZE_LARGE.3
docs/libcurl/opts/CURLOPT_MAXREDIRS.3
docs/libcurl/opts/CURLOPT_MAX_RECV_SPEED_LARGE.3
docs/libcurl/opts/CURLOPT_MAX_SEND_SPEED_LARGE.3
docs/libcurl/opts/CURLOPT_MIMEPOST.3
docs/libcurl/opts/CURLOPT_NETRC.3
docs/libcurl/opts/CURLOPT_NETRC_FILE.3
docs/libcurl/opts/CURLOPT_NEW_DIRECTORY_PERMS.3
docs/libcurl/opts/CURLOPT_NEW_FILE_PERMS.3
docs/libcurl/opts/CURLOPT_NOBODY.3
docs/libcurl/opts/CURLOPT_NOPROGRESS.3
docs/libcurl/opts/CURLOPT_NOPROXY.3
docs/libcurl/opts/CURLOPT_NOSIGNAL.3
docs/libcurl/opts/CURLOPT_OPENSOCKETDATA.3
docs/libcurl/opts/CURLOPT_OPENSOCKETFUNCTION.3
docs/libcurl/opts/CURLOPT_PASSWORD.3
docs/libcurl/opts/CURLOPT_PATH_AS_IS.3
docs/libcurl/opts/CURLOPT_PINNEDPUBLICKEY.3
docs/libcurl/opts/CURLOPT_PIPEWAIT.3
docs/libcurl/opts/CURLOPT_PORT.3
docs/libcurl/opts/CURLOPT_POST.3
docs/libcurl/opts/CURLOPT_POSTFIELDS.3
docs/libcurl/opts/CURLOPT_POSTFIELDSIZE.3
docs/libcurl/opts/CURLOPT_POSTFIELDSIZE_LARGE.3
docs/libcurl/opts/CURLOPT_POSTQUOTE.3
docs/libcurl/opts/CURLOPT_POSTREDIR.3
docs/libcurl/opts/CURLOPT_PREQUOTE.3
docs/libcurl/opts/CURLOPT_PRE_PROXY.3
docs/libcurl/opts/CURLOPT_PRIVATE.3
docs/libcurl/opts/CURLOPT_PROGRESSDATA.3
docs/libcurl/opts/CURLOPT_PROGRESSFUNCTION.3
docs/libcurl/opts/CURLOPT_PROTOCOLS.3
docs/libcurl/opts/CURLOPT_PROXY.3
docs/libcurl/opts/CURLOPT_PROXYAUTH.3
docs/libcurl/opts/CURLOPT_PROXYHEADER.3
docs/libcurl/opts/CURLOPT_PROXYPASSWORD.3
docs/libcurl/opts/CURLOPT_PROXYPORT.3
docs/libcurl/opts/CURLOPT_PROXYTYPE.3
docs/libcurl/opts/CURLOPT_PROXYUSERNAME.3
docs/libcurl/opts/CURLOPT_PROXYUSERPWD.3
docs/libcurl/opts/CURLOPT_PROXY_CAINFO.3
docs/libcurl/opts/CURLOPT_PROXY_CAPATH.3
docs/libcurl/opts/CURLOPT_PROXY_CRLFILE.3
docs/libcurl/opts/CURLOPT_PROXY_KEYPASSWD.3
docs/libcurl/opts/CURLOPT_PROXY_PINNEDPUBLICKEY.3
docs/libcurl/opts/CURLOPT_PROXY_SERVICE_NAME.3
docs/libcurl/opts/CURLOPT_PROXY_SSLCERT.3
docs/libcurl/opts/CURLOPT_PROXY_SSLCERTTYPE.3
docs/libcurl/opts/CURLOPT_PROXY_SSLKEY.3
docs/libcurl/opts/CURLOPT_PROXY_SSLKEYTYPE.3
docs/libcurl/opts/CURLOPT_PROXY_SSLVERSION.3
docs/libcurl/opts/CURLOPT_PROXY_SSL_CIPHER_LIST.3
docs/libcurl/opts/CURLOPT_PROXY_SSL_OPTIONS.3
docs/libcurl/opts/CURLOPT_PROXY_SSL_VERIFYHOST.3
docs/libcurl/opts/CURLOPT_PROXY_SSL_VERIFYPEER.3
docs/libcurl/opts/CURLOPT_PROXY_TLS13_CIPHERS.3
docs/libcurl/opts/CURLOPT_PROXY_TLSAUTH_PASSWORD.3
docs/libcurl/opts/CURLOPT_PROXY_TLSAUTH_TYPE.3
docs/libcurl/opts/CURLOPT_PROXY_TLSAUTH_USERNAME.3
docs/libcurl/opts/CURLOPT_PROXY_TRANSFER_MODE.3
docs/libcurl/opts/CURLOPT_PUT.3
docs/libcurl/opts/CURLOPT_QUOTE.3
docs/libcurl/opts/CURLOPT_RANDOM_FILE.3
docs/libcurl/opts/CURLOPT_RANGE.3
docs/libcurl/opts/CURLOPT_READDATA.3
docs/libcurl/opts/CURLOPT_READFUNCTION.3
docs/libcurl/opts/CURLOPT_REDIR_PROTOCOLS.3
docs/libcurl/opts/CURLOPT_REFERER.3
docs/libcurl/opts/CURLOPT_REQUEST_TARGET.3
docs/libcurl/opts/CURLOPT_RESOLVE.3
docs/libcurl/opts/CURLOPT_RESOLVER_START_DATA.3
docs/libcurl/opts/CURLOPT_RESOLVER_START_FUNCTION.3
docs/libcurl/opts/CURLOPT_RESUME_FROM.3
docs/libcurl/opts/CURLOPT_RESUME_FROM_LARGE.3
docs/libcurl/opts/CURLOPT_RTSP_CLIENT_CSEQ.3
docs/libcurl/opts/CURLOPT_RTSP_REQUEST.3
docs/libcurl/opts/CURLOPT_RTSP_SERVER_CSEQ.3
docs/libcurl/opts/CURLOPT_RTSP_SESSION_ID.3
docs/libcurl/opts/CURLOPT_RTSP_STREAM_URI.3
docs/libcurl/opts/CURLOPT_RTSP_TRANSPORT.3
docs/libcurl/opts/CURLOPT_SASL_AUTHZID.3 [new file with mode: 0644]
docs/libcurl/opts/CURLOPT_SASL_IR.3
docs/libcurl/opts/CURLOPT_SEEKDATA.3
docs/libcurl/opts/CURLOPT_SEEKFUNCTION.3
docs/libcurl/opts/CURLOPT_SERVICE_NAME.3
docs/libcurl/opts/CURLOPT_SHARE.3
docs/libcurl/opts/CURLOPT_SOCKOPTDATA.3
docs/libcurl/opts/CURLOPT_SOCKOPTFUNCTION.3
docs/libcurl/opts/CURLOPT_SOCKS5_AUTH.3
docs/libcurl/opts/CURLOPT_SOCKS5_GSSAPI_NEC.3
docs/libcurl/opts/CURLOPT_SOCKS5_GSSAPI_SERVICE.3
docs/libcurl/opts/CURLOPT_SSH_AUTH_TYPES.3
docs/libcurl/opts/CURLOPT_SSH_COMPRESSION.3
docs/libcurl/opts/CURLOPT_SSH_HOST_PUBLIC_KEY_MD5.3
docs/libcurl/opts/CURLOPT_SSH_KEYDATA.3
docs/libcurl/opts/CURLOPT_SSH_KEYFUNCTION.3
docs/libcurl/opts/CURLOPT_SSH_KNOWNHOSTS.3
docs/libcurl/opts/CURLOPT_SSH_PRIVATE_KEYFILE.3
docs/libcurl/opts/CURLOPT_SSH_PUBLIC_KEYFILE.3
docs/libcurl/opts/CURLOPT_SSLCERT.3
docs/libcurl/opts/CURLOPT_SSLCERTTYPE.3
docs/libcurl/opts/CURLOPT_SSLENGINE.3
docs/libcurl/opts/CURLOPT_SSLENGINE_DEFAULT.3
docs/libcurl/opts/CURLOPT_SSLKEY.3
docs/libcurl/opts/CURLOPT_SSLKEYTYPE.3
docs/libcurl/opts/CURLOPT_SSLVERSION.3
docs/libcurl/opts/CURLOPT_SSL_CIPHER_LIST.3
docs/libcurl/opts/CURLOPT_SSL_CTX_DATA.3
docs/libcurl/opts/CURLOPT_SSL_CTX_FUNCTION.3
docs/libcurl/opts/CURLOPT_SSL_ENABLE_ALPN.3
docs/libcurl/opts/CURLOPT_SSL_ENABLE_NPN.3
docs/libcurl/opts/CURLOPT_SSL_FALSESTART.3
docs/libcurl/opts/CURLOPT_SSL_OPTIONS.3
docs/libcurl/opts/CURLOPT_SSL_SESSIONID_CACHE.3
docs/libcurl/opts/CURLOPT_SSL_VERIFYHOST.3
docs/libcurl/opts/CURLOPT_SSL_VERIFYPEER.3
docs/libcurl/opts/CURLOPT_SSL_VERIFYSTATUS.3
docs/libcurl/opts/CURLOPT_STDERR.3
docs/libcurl/opts/CURLOPT_STREAM_DEPENDS.3
docs/libcurl/opts/CURLOPT_STREAM_DEPENDS_E.3
docs/libcurl/opts/CURLOPT_STREAM_WEIGHT.3
docs/libcurl/opts/CURLOPT_SUPPRESS_CONNECT_HEADERS.3
docs/libcurl/opts/CURLOPT_TCP_FASTOPEN.3
docs/libcurl/opts/CURLOPT_TCP_KEEPALIVE.3
docs/libcurl/opts/CURLOPT_TCP_KEEPIDLE.3
docs/libcurl/opts/CURLOPT_TCP_KEEPINTVL.3
docs/libcurl/opts/CURLOPT_TCP_NODELAY.3
docs/libcurl/opts/CURLOPT_TELNETOPTIONS.3
docs/libcurl/opts/CURLOPT_TFTP_BLKSIZE.3
docs/libcurl/opts/CURLOPT_TFTP_NO_OPTIONS.3
docs/libcurl/opts/CURLOPT_TIMECONDITION.3
docs/libcurl/opts/CURLOPT_TIMEOUT.3
docs/libcurl/opts/CURLOPT_TIMEOUT_MS.3
docs/libcurl/opts/CURLOPT_TIMEVALUE.3
docs/libcurl/opts/CURLOPT_TIMEVALUE_LARGE.3
docs/libcurl/opts/CURLOPT_TLS13_CIPHERS.3
docs/libcurl/opts/CURLOPT_TLSAUTH_PASSWORD.3
docs/libcurl/opts/CURLOPT_TLSAUTH_TYPE.3
docs/libcurl/opts/CURLOPT_TLSAUTH_USERNAME.3
docs/libcurl/opts/CURLOPT_TRAILERDATA.3 [new file with mode: 0644]
docs/libcurl/opts/CURLOPT_TRAILERFUNCTION.3 [new file with mode: 0644]
docs/libcurl/opts/CURLOPT_TRANSFERTEXT.3
docs/libcurl/opts/CURLOPT_TRANSFER_ENCODING.3
docs/libcurl/opts/CURLOPT_UNIX_SOCKET_PATH.3
docs/libcurl/opts/CURLOPT_UNRESTRICTED_AUTH.3
docs/libcurl/opts/CURLOPT_UPLOAD.3
docs/libcurl/opts/CURLOPT_UPLOAD_BUFFERSIZE.3
docs/libcurl/opts/CURLOPT_URL.3
docs/libcurl/opts/CURLOPT_USERAGENT.3
docs/libcurl/opts/CURLOPT_USERNAME.3
docs/libcurl/opts/CURLOPT_USERPWD.3
docs/libcurl/opts/CURLOPT_USE_SSL.3
docs/libcurl/opts/CURLOPT_VERBOSE.3
docs/libcurl/opts/CURLOPT_WILDCARDMATCH.3
docs/libcurl/opts/CURLOPT_WRITEDATA.3
docs/libcurl/opts/CURLOPT_WRITEFUNCTION.3
docs/libcurl/opts/CURLOPT_XFERINFODATA.3
docs/libcurl/opts/CURLOPT_XFERINFOFUNCTION.3
docs/libcurl/opts/CURLOPT_XOAUTH2_BEARER.3
docs/libcurl/opts/Makefile.in
docs/libcurl/opts/Makefile.inc
docs/libcurl/symbols-in-versions
include/Makefile.in
include/curl/Makefile.am
include/curl/Makefile.in
include/curl/curl.h
include/curl/curlver.h
include/curl/easy.h
include/curl/mprintf.h
include/curl/multi.h
include/curl/stdcheaders.h
include/curl/system.h
include/curl/typecheck-gcc.h
include/curl/urlapi.h
lib/CMakeLists.txt
lib/Makefile.Watcom
lib/Makefile.am
lib/Makefile.in
lib/Makefile.inc
lib/Makefile.m32
lib/Makefile.netware
lib/altsvc.c [new file with mode: 0644]
lib/altsvc.h [new file with mode: 0644]
lib/amigaos.c
lib/amigaos.h
lib/asyn-ares.c
lib/asyn-thread.c
lib/asyn.h
lib/base64.c
lib/checksrc.pl
lib/config-amigaos.h
lib/config-dos.h
lib/config-mac.h
lib/config-os400.h
lib/config-plan9.h [new file with mode: 0644]
lib/config-riscos.h
lib/config-symbian.h
lib/config-tpf.h
lib/config-vxworks.h
lib/config-win32.h
lib/config-win32ce.h
lib/conncache.c
lib/conncache.h
lib/connect.c
lib/connect.h
lib/cookie.c
lib/cookie.h
lib/curl_addrinfo.c
lib/curl_addrinfo.h
lib/curl_base64.h
lib/curl_config.h.cmake
lib/curl_config.h.in
lib/curl_des.c
lib/curl_des.h
lib/curl_endian.c
lib/curl_endian.h
lib/curl_fnmatch.c
lib/curl_fnmatch.h
lib/curl_get_line.c [new file with mode: 0644]
lib/curl_get_line.h [moved from lib/vtls/axtls.h with 73% similarity]
lib/curl_gethostname.h
lib/curl_gssapi.c
lib/curl_gssapi.h
lib/curl_ldap.h
lib/curl_md4.h
lib/curl_md5.h
lib/curl_memory.h
lib/curl_memrchr.h
lib/curl_multibyte.c
lib/curl_multibyte.h
lib/curl_ntlm_core.c
lib/curl_ntlm_core.h
lib/curl_ntlm_wb.c
lib/curl_ntlm_wb.h
lib/curl_path.c
lib/curl_printf.h
lib/curl_rtmp.c
lib/curl_rtmp.h
lib/curl_sasl.c
lib/curl_setup.h
lib/curl_setup_once.h
lib/curl_sha256.h
lib/curl_sspi.c
lib/curl_sspi.h
lib/curl_threads.c
lib/curl_threads.h
lib/curlx.h
lib/dict.c
lib/dict.h
lib/doh.c
lib/doh.h
lib/dotdot.c
lib/dotdot.h
lib/easy.c
lib/easyif.h
lib/escape.c
lib/file.c
lib/file.h
lib/fileinfo.c
lib/formdata.c
lib/formdata.h
lib/ftp.c
lib/ftp.h
lib/ftplistparser.c
lib/ftplistparser.h
lib/getenv.c
lib/getinfo.c
lib/getinfo.h
lib/gopher.c
lib/gopher.h
lib/hash.h
lib/hostasyn.c
lib/hostcheck.c
lib/hostcheck.h
lib/hostip.c
lib/hostip.h
lib/hostip4.c
lib/hostip6.c
lib/hostsyn.c
lib/http.c
lib/http.h
lib/http2.c
lib/http2.h
lib/http_chunks.c
lib/http_chunks.h
lib/http_digest.c
lib/http_digest.h
lib/http_negotiate.c
lib/http_negotiate.h
lib/http_ntlm.c
lib/http_ntlm.h
lib/http_proxy.c
lib/if2ip.c
lib/if2ip.h
lib/imap.c
lib/imap.h
lib/inet_ntop.c
lib/inet_ntop.h
lib/inet_pton.c
lib/inet_pton.h
lib/krb5.c
lib/ldap.c
lib/libcurl.plist
lib/libcurl.rc
lib/llist.h
lib/md4.c
lib/md5.c
lib/memdebug.c
lib/memdebug.h
lib/mime.c
lib/mime.h
lib/mprintf.c
lib/multi.c
lib/multihandle.h
lib/multiif.h
lib/netrc.c
lib/netrc.h
lib/non-ascii.c
lib/nonblock.c
lib/nonblock.h
lib/openldap.c
lib/parsedate.c
lib/parsedate.h
lib/pingpong.c
lib/pingpong.h
lib/pipeline.c [deleted file]
lib/pipeline.h [deleted file]
lib/pop3.c
lib/pop3.h
lib/progress.c
lib/quic.h [new file with mode: 0644]
lib/rand.c
lib/rand.h
lib/rtsp.c
lib/rtsp.h
lib/security.c
lib/select.c
lib/select.h
lib/sendf.c
lib/setopt.c
lib/setopt.h
lib/setup-os400.h
lib/sha256.c
lib/sigpipe.h
lib/slist.c
lib/slist.h
lib/smb.c
lib/smtp.c
lib/smtp.h
lib/sockaddr.h
lib/socketpair.c [new file with mode: 0644]
lib/socketpair.h [new file with mode: 0644]
lib/socks.c
lib/socks.h
lib/socks_gssapi.c
lib/socks_sspi.c
lib/splay.c
lib/splay.h
lib/strcase.c
lib/strcase.h
lib/strdup.c
lib/strerror.c
lib/strerror.h
lib/strtok.c
lib/strtok.h
lib/strtoofft.c
lib/system_win32.c
lib/system_win32.h
lib/telnet.c
lib/telnet.h
lib/tftp.c
lib/tftp.h
lib/timeval.c
lib/timeval.h
lib/transfer.c
lib/transfer.h
lib/url.c
lib/url.h
lib/urlapi-int.h
lib/urlapi.c
lib/urldata.h
lib/vauth/cleartext.c
lib/vauth/cram.c
lib/vauth/digest.c
lib/vauth/digest.h
lib/vauth/digest_sspi.c
lib/vauth/krb5_gssapi.c
lib/vauth/krb5_sspi.c
lib/vauth/ntlm.c
lib/vauth/ntlm_sspi.c
lib/vauth/oauth2.c
lib/vauth/spnego_gssapi.c
lib/vauth/spnego_sspi.c
lib/vauth/vauth.c
lib/vauth/vauth.h
lib/version.c
lib/vquic/ngtcp2.c [new file with mode: 0644]
lib/vquic/ngtcp2.h [new file with mode: 0644]
lib/vquic/quiche.c [new file with mode: 0644]
lib/vquic/quiche.h [new file with mode: 0644]
lib/vssh/libssh.c [moved from lib/ssh-libssh.c with 96% similarity]
lib/vssh/libssh2.c [moved from lib/ssh.c with 94% similarity]
lib/vssh/ssh.h [moved from lib/ssh.h with 96% similarity]
lib/vtls/axtls.c [deleted file]
lib/vtls/bearssl.c [new file with mode: 0644]
lib/vtls/bearssl.h [new file with mode: 0644]
lib/vtls/gskit.c
lib/vtls/gskit.h
lib/vtls/gtls.c
lib/vtls/mbedtls.c
lib/vtls/mbedtls.h
lib/vtls/mesalink.c
lib/vtls/nss.c
lib/vtls/openssl.c
lib/vtls/polarssl.c
lib/vtls/polarssl.h
lib/vtls/polarssl_threadlock.c
lib/vtls/polarssl_threadlock.h
lib/vtls/schannel.c
lib/vtls/schannel.h
lib/vtls/schannel_verify.c
lib/vtls/sectransp.c [moved from lib/vtls/darwinssl.c with 94% similarity]
lib/vtls/sectransp.h [moved from lib/vtls/darwinssl.h with 80% similarity]
lib/vtls/vtls.c
lib/vtls/vtls.h
lib/vtls/wolfssl.c [moved from lib/vtls/cyassl.c with 78% similarity]
lib/vtls/wolfssl.h [moved from lib/vtls/cyassl.h with 79% similarity]
lib/warnless.c
lib/warnless.h
lib/wildcard.c
lib/wildcard.h
lib/x509asn1.c
lib/x509asn1.h
ltmain.sh
m4/ax_code_coverage.m4 [deleted file]
m4/curl-compilers.m4
m4/curl-confopts.m4
m4/curl-functions.m4
m4/libtool.m4
packages/AIX/Makefile.am [deleted file]
packages/AIX/Makefile.in [deleted file]
packages/AIX/RPM/Makefile.am [deleted file]
packages/AIX/RPM/Makefile.in [deleted file]
packages/AIX/RPM/README [deleted file]
packages/AIX/RPM/curl.spec.in [deleted file]
packages/DOS/common.dj
packages/Linux/Makefile.am [deleted file]
packages/Linux/Makefile.in [deleted file]
packages/Linux/RPM/Makefile.am [deleted file]
packages/Linux/RPM/Makefile.in [deleted file]
packages/Linux/RPM/README [deleted file]
packages/Linux/RPM/curl-ssl.spec.in [deleted file]
packages/Linux/RPM/curl.spec.in [deleted file]
packages/Linux/RPM/make_curl_rpm [deleted file]
packages/Makefile.am
packages/Makefile.in
packages/NetWare/get_exp.awk [deleted file]
packages/NetWare/get_ver.awk [deleted file]
packages/OS400/README.OS400
packages/OS400/ccsidcurl.c
packages/OS400/ccsidcurl.h
packages/OS400/curl.inc.in
packages/OS400/os400sys.c
packages/Solaris/Makefile.am [deleted file]
packages/Solaris/Makefile.in [deleted file]
packages/Symbian/group/libcurl.mmp
packages/Win32/Makefile.am [deleted file]
packages/Win32/Makefile.in [deleted file]
packages/Win32/README [deleted file]
packages/Win32/cygwin/Makefile.am [deleted file]
packages/Win32/cygwin/Makefile.in [deleted file]
packages/Win32/cygwin/README [deleted file]
packages/vms/Makefile.in
packages/vms/config_h.com
packages/vms/curl_crtl_init.c
packages/vms/curl_gnv_build_steps.txt
packages/vms/generate_config_vms_h_curl.com
packages/vms/gnv_link_curl.com
packages/vms/setup_gnv_curl_build.com
plan9/BUILD.PLAN9.txt [new file with mode: 0644]
plan9/include/mkfile [new file with mode: 0644]
plan9/lib/mkfile [new file with mode: 0644]
plan9/lib/mkfile.inc [new file with mode: 0755]
plan9/mkfile [new file with mode: 0644]
plan9/mkfile.proto [new file with mode: 0644]
plan9/src/mkfile [new file with mode: 0644]
plan9/src/mkfile.inc [new file with mode: 0755]
projects/README
projects/Windows/VC10/curl-all.sln
projects/Windows/VC10/lib/libcurl.sln
projects/Windows/VC10/lib/libcurl.vcxproj
projects/Windows/VC10/src/curl.sln
projects/Windows/VC10/src/curl.vcxproj
projects/Windows/VC11/curl-all.sln
projects/Windows/VC11/lib/libcurl.sln
projects/Windows/VC11/lib/libcurl.vcxproj
projects/Windows/VC11/src/curl.sln
projects/Windows/VC11/src/curl.vcxproj
projects/Windows/VC12/curl-all.sln
projects/Windows/VC12/lib/libcurl.sln
projects/Windows/VC12/lib/libcurl.vcxproj
projects/Windows/VC12/src/curl.sln
projects/Windows/VC12/src/curl.vcxproj
projects/Windows/VC14/curl-all.sln
projects/Windows/VC14/lib/libcurl.sln
projects/Windows/VC14/lib/libcurl.vcxproj
projects/Windows/VC14/src/curl.sln
projects/Windows/VC14/src/curl.vcxproj
projects/Windows/VC15/lib/libcurl.vcxproj
projects/Windows/VC15/src/curl.vcxproj
projects/Windows/VC6/lib/libcurl.dsp
projects/Windows/VC6/src/curl.dsp
projects/Windows/VC7.1/curl-all.sln
projects/Windows/VC7.1/lib/libcurl.sln
projects/Windows/VC7.1/lib/libcurl.vcproj
projects/Windows/VC7.1/src/curl.sln
projects/Windows/VC7.1/src/curl.vcproj
projects/Windows/VC7/curl-all.sln
projects/Windows/VC7/lib/libcurl.sln
projects/Windows/VC7/lib/libcurl.vcproj
projects/Windows/VC7/src/curl.sln
projects/Windows/VC7/src/curl.vcproj
projects/Windows/VC8/curl-all.sln
projects/Windows/VC8/lib/libcurl.sln
projects/Windows/VC8/lib/libcurl.vcproj
projects/Windows/VC8/src/curl.sln
projects/Windows/VC8/src/curl.vcproj
projects/Windows/VC9/curl-all.sln
projects/Windows/VC9/lib/libcurl.sln
projects/Windows/VC9/lib/libcurl.vcproj
projects/Windows/VC9/src/curl.sln
projects/Windows/VC9/src/curl.vcproj
projects/build-openssl.bat
projects/checksrc.bat
projects/generate.bat
scripts/Makefile.am
scripts/Makefile.in
scripts/completion.pl [new file with mode: 0755]
scripts/zsh.pl [deleted file]
src/CMakeLists.txt
src/Makefile.am
src/Makefile.in
src/Makefile.inc
src/Makefile.netware
src/curl.rc
src/mkhelp.pl
src/slist_wc.c
src/slist_wc.h
src/tool_binmode.c
src/tool_binmode.h
src/tool_bname.c
src/tool_bname.h
src/tool_cb_dbg.c
src/tool_cb_dbg.h
src/tool_cb_hdr.c
src/tool_cb_hdr.h
src/tool_cb_prg.c
src/tool_cb_rea.c
src/tool_cb_rea.h
src/tool_cb_see.c
src/tool_cb_see.h
src/tool_cb_wrt.c
src/tool_cb_wrt.h
src/tool_cfgable.c
src/tool_cfgable.h
src/tool_convert.c
src/tool_convert.h
src/tool_dirhie.c
src/tool_dirhie.h
src/tool_doswin.c
src/tool_doswin.h
src/tool_easysrc.c
src/tool_formparse.c
src/tool_formparse.h
src/tool_getparam.c
src/tool_getparam.h
src/tool_getpass.c
src/tool_help.c
src/tool_help.h
src/tool_helpers.c
src/tool_helpers.h
src/tool_homedir.c
src/tool_homedir.h
src/tool_hugehelp.c
src/tool_hugehelp.h
src/tool_libinfo.c
src/tool_libinfo.h
src/tool_main.c
src/tool_main.h
src/tool_metalink.c
src/tool_metalink.h
src/tool_msgs.c
src/tool_msgs.h
src/tool_operate.c
src/tool_operate.h
src/tool_operhlp.c
src/tool_operhlp.h
src/tool_panykey.c
src/tool_panykey.h
src/tool_paramhlp.c
src/tool_paramhlp.h
src/tool_parsecfg.c
src/tool_parsecfg.h
src/tool_progress.c [new file with mode: 0644]
src/tool_progress.h [new file with mode: 0644]
src/tool_sdecls.h
src/tool_setopt.c
src/tool_setopt.h
src/tool_setup.h
src/tool_sleep.c
src/tool_sleep.h
src/tool_strdup.h
src/tool_urlglob.c
src/tool_urlglob.h
src/tool_util.c
src/tool_util.h
src/tool_version.h
src/tool_vms.c
src/tool_vms.h
src/tool_writeout.c
src/tool_writeout.h
src/tool_xattr.c
src/tool_xattr.h
tests/FILEFORMAT
tests/Makefile.am
tests/Makefile.in
tests/README
tests/certs/Makefile.in
tests/certs/Server-localhost-lastSAN-sv.crl
tests/certs/Server-localhost-lastSAN-sv.crt
tests/certs/Server-localhost-lastSAN-sv.csr
tests/certs/Server-localhost-lastSAN-sv.der
tests/certs/Server-localhost-lastSAN-sv.key
tests/certs/Server-localhost-lastSAN-sv.pem
tests/certs/Server-localhost-lastSAN-sv.pub.der
tests/certs/Server-localhost-lastSAN-sv.pub.pem
tests/certs/scripts/Makefile.in
tests/data/Makefile.in
tests/data/Makefile.inc
tests/data/test1001
tests/data/test1002
tests/data/test1008
tests/data/test1010
tests/data/test1016
tests/data/test1017
tests/data/test1018
tests/data/test1019
tests/data/test1020
tests/data/test1021
tests/data/test1026
tests/data/test1034
tests/data/test1046
tests/data/test1048
tests/data/test1050
tests/data/test1059
tests/data/test1060
tests/data/test1061
tests/data/test1063
tests/data/test1077
tests/data/test1078
tests/data/test1082
tests/data/test1083
tests/data/test1087
tests/data/test1088
tests/data/test1091
tests/data/test1092
tests/data/test1097
tests/data/test1098
tests/data/test1100
tests/data/test1104
tests/data/test1106
tests/data/test1133
tests/data/test1135
tests/data/test1136
tests/data/test1141
tests/data/test1142
tests/data/test1144
tests/data/test1149
tests/data/test1150
tests/data/test1155
tests/data/test1156
tests/data/test1159 [new file with mode: 0644]
tests/data/test1160
tests/data/test1162
tests/data/test1164
tests/data/test1165 [new file with mode: 0644]
tests/data/test1166 [new file with mode: 0644]
tests/data/test1172 [new file with mode: 0644]
tests/data/test1173 [new file with mode: 0644]
tests/data/test1174 [new file with mode: 0644]
tests/data/test1175 [new file with mode: 0644]
tests/data/test1201
tests/data/test1213
tests/data/test1214
tests/data/test1215
tests/data/test1216
tests/data/test1218
tests/data/test1220
tests/data/test1221
tests/data/test1222
tests/data/test1225
tests/data/test1228
tests/data/test1230
tests/data/test1232
tests/data/test1233
tests/data/test1241
tests/data/test1246
tests/data/test1253
tests/data/test1254
tests/data/test1256
tests/data/test1257
tests/data/test1262
tests/data/test1263
tests/data/test1266
tests/data/test1267
tests/data/test1269 [moved from tests/data/test2070 with 51% similarity]
tests/data/test1270 [new file with mode: 0644]
tests/data/test1271 [new file with mode: 0644]
tests/data/test1287
tests/data/test1288
tests/data/test1291
tests/data/test1293 [new file with mode: 0644]
tests/data/test1307
tests/data/test1314
tests/data/test1319
tests/data/test1320
tests/data/test1321
tests/data/test1322
tests/data/test1329
tests/data/test1330
tests/data/test1331
tests/data/test1400
tests/data/test1401
tests/data/test1402
tests/data/test1403
tests/data/test1404
tests/data/test1405
tests/data/test1406
tests/data/test1407
tests/data/test1412
tests/data/test1415
tests/data/test1418
tests/data/test1420
tests/data/test1421
tests/data/test1425
tests/data/test1426
tests/data/test1428
tests/data/test1429
tests/data/test143
tests/data/test1445
tests/data/test1447
tests/data/test1448
tests/data/test1449
tests/data/test1455
tests/data/test1456
tests/data/test1457 [new file with mode: 0644]
tests/data/test1458 [new file with mode: 0644]
tests/data/test150
tests/data/test1509
tests/data/test1514
tests/data/test1518 [new file with mode: 0644]
tests/data/test1519 [new file with mode: 0644]
tests/data/test1523 [new file with mode: 0644]
tests/data/test1525
tests/data/test1526
tests/data/test1527
tests/data/test1528
tests/data/test1529
tests/data/test153
tests/data/test1538
tests/data/test1541 [new file with mode: 0644]
tests/data/test155
tests/data/test1554
tests/data/test1558 [new file with mode: 0644]
tests/data/test1559 [new file with mode: 0644]
tests/data/test1560
tests/data/test1561 [new file with mode: 0644]
tests/data/test1562 [new file with mode: 0644]
tests/data/test1563 [new file with mode: 0644]
tests/data/test1564 [new file with mode: 0644]
tests/data/test1565 [new file with mode: 0644]
tests/data/test159
tests/data/test1591 [new file with mode: 0644]
tests/data/test1592 [new file with mode: 0644]
tests/data/test1593 [new file with mode: 0644]
tests/data/test1594 [new file with mode: 0644]
tests/data/test1595 [new file with mode: 0644]
tests/data/test1596 [new file with mode: 0644]
tests/data/test16
tests/data/test162
tests/data/test1621 [new file with mode: 0644]
tests/data/test165
tests/data/test1650
tests/data/test1652 [new file with mode: 0644]
tests/data/test1653 [new file with mode: 0644]
tests/data/test1654 [new file with mode: 0644]
tests/data/test1655 [new file with mode: 0644]
tests/data/test167
tests/data/test168
tests/data/test169
tests/data/test170
tests/data/test171
tests/data/test176
tests/data/test179
tests/data/test183
tests/data/test184
tests/data/test185
tests/data/test188
tests/data/test189
tests/data/test19
tests/data/test1904
tests/data/test1905 [new file with mode: 0644]
tests/data/test1906 [new file with mode: 0644]
tests/data/test1907 [new file with mode: 0644]
tests/data/test196
tests/data/test197
tests/data/test198
tests/data/test20
tests/data/test200
tests/data/test2000
tests/data/test2001
tests/data/test2002
tests/data/test2003
tests/data/test2004
tests/data/test2005
tests/data/test2006
tests/data/test2007
tests/data/test2008
tests/data/test2009
tests/data/test2010
tests/data/test2011
tests/data/test2012
tests/data/test2013
tests/data/test2014
tests/data/test2015
tests/data/test2016
tests/data/test2017
tests/data/test2018
tests/data/test2019
tests/data/test202
tests/data/test2020
tests/data/test2021
tests/data/test2022
tests/data/test2025
tests/data/test2028
tests/data/test2029
tests/data/test203
tests/data/test2030
tests/data/test2031
tests/data/test2032
tests/data/test2033
tests/data/test204
tests/data/test2046
tests/data/test2047
tests/data/test2050
tests/data/test2055
tests/data/test2056
tests/data/test2057
tests/data/test2058
tests/data/test2059
tests/data/test206
tests/data/test2060
tests/data/test2071
tests/data/test2076 [new file with mode: 0644]
tests/data/test2077 [new file with mode: 0644]
tests/data/test2078 [new file with mode: 0644]
tests/data/test208
tests/data/test209
tests/data/test2100
tests/data/test213
tests/data/test217
tests/data/test219
tests/data/test231
tests/data/test233
tests/data/test234
tests/data/test239
tests/data/test243
tests/data/test244
tests/data/test256
tests/data/test257
tests/data/test258
tests/data/test259
tests/data/test263
tests/data/test264
tests/data/test265
tests/data/test267
tests/data/test275
tests/data/test278
tests/data/test279
tests/data/test287
tests/data/test288
tests/data/test299
tests/data/test306
tests/data/test31
tests/data/test317
tests/data/test318
tests/data/test327 [new file with mode: 0644]
tests/data/test328 [new file with mode: 0644]
tests/data/test329 [new file with mode: 0644]
tests/data/test330 [new file with mode: 0644]
tests/data/test331 [new file with mode: 0644]
tests/data/test332 [new file with mode: 0644]
tests/data/test333 [new file with mode: 0644]
tests/data/test334 [new file with mode: 0644]
tests/data/test335 [new file with mode: 0644]
tests/data/test336 [new file with mode: 0644]
tests/data/test337 [new file with mode: 0644]
tests/data/test338 [moved from tests/data/test536 with 51% similarity]
tests/data/test339 [new file with mode: 0644]
tests/data/test341 [new file with mode: 0644]
tests/data/test342 [new file with mode: 0644]
tests/data/test343 [new file with mode: 0644]
tests/data/test355 [new file with mode: 0644]
tests/data/test356 [new file with mode: 0644]
tests/data/test43
tests/data/test46
tests/data/test490 [new file with mode: 0644]
tests/data/test491 [new file with mode: 0644]
tests/data/test492 [new file with mode: 0644]
tests/data/test5
tests/data/test503
tests/data/test504
tests/data/test506
tests/data/test523
tests/data/test539
tests/data/test540
tests/data/test547
tests/data/test548
tests/data/test549
tests/data/test550
tests/data/test551
tests/data/test555
tests/data/test558
tests/data/test561
tests/data/test563
tests/data/test564
tests/data/test578
tests/data/test590
tests/data/test597
tests/data/test61
tests/data/test62
tests/data/test63
tests/data/test651
tests/data/test653
tests/data/test658 [new file with mode: 0644]
tests/data/test659 [new file with mode: 0644]
tests/data/test66
tests/data/test660 [new file with mode: 0644]
tests/data/test661 [new file with mode: 0644]
tests/data/test662 [new file with mode: 0644]
tests/data/test663 [new file with mode: 0644]
tests/data/test67
tests/data/test68
tests/data/test69
tests/data/test702
tests/data/test703
tests/data/test704
tests/data/test705
tests/data/test709
tests/data/test711
tests/data/test714
tests/data/test715
tests/data/test716 [new file with mode: 0644]
tests/data/test717 [new file with mode: 0644]
tests/data/test79
tests/data/test80
tests/data/test81
tests/data/test819
tests/data/test82
tests/data/test822
tests/data/test825
tests/data/test827
tests/data/test83
tests/data/test831
tests/data/test833
tests/data/test834
tests/data/test835
tests/data/test84
tests/data/test842
tests/data/test843
tests/data/test844
tests/data/test845
tests/data/test848 [new file with mode: 0644]
tests/data/test849 [new file with mode: 0644]
tests/data/test85
tests/data/test865
tests/data/test868
tests/data/test871
tests/data/test873
tests/data/test877
tests/data/test879
tests/data/test880
tests/data/test881
tests/data/test887
tests/data/test888
tests/data/test889
tests/data/test89
tests/data/test890
tests/data/test892 [new file with mode: 0644]
tests/data/test893 [new file with mode: 0644]
tests/data/test90
tests/data/test903
tests/data/test906
tests/data/test91
tests/data/test919
tests/data/test921
tests/data/test93
tests/data/test933
tests/data/test935
tests/data/test936
tests/data/test937
tests/data/test94
tests/data/test946
tests/data/test947
tests/data/test948
tests/data/test949
tests/data/test95
tests/data/test953 [new file with mode: 0644]
tests/data/test954 [new file with mode: 0644]
tests/dictserver.py
tests/disable-scan.pl [new file with mode: 0755]
tests/error-codes.pl [new file with mode: 0644]
tests/ftpserver.pl
tests/getpart.pm
tests/http_pipe.py [deleted file]
tests/httpserver.pl
tests/libtest/CMakeLists.txt
tests/libtest/Makefile.am
tests/libtest/Makefile.in
tests/libtest/Makefile.inc
tests/libtest/chkdecimalpoint.c
tests/libtest/first.c
tests/libtest/lib1156.c
tests/libtest/lib1502.c
tests/libtest/lib1506.c
tests/libtest/lib1510.c
tests/libtest/lib1512.c
tests/libtest/lib1515.c
tests/libtest/lib1518.c [new file with mode: 0644]
tests/libtest/lib1522.c
tests/libtest/lib1523.c [new file with mode: 0644]
tests/libtest/lib1529.c
tests/libtest/lib1537.c
tests/libtest/lib1541.c [new file with mode: 0644]
tests/libtest/lib1555.c
tests/libtest/lib1557.c
tests/libtest/lib1558.c [new file with mode: 0644]
tests/libtest/lib1559.c [new file with mode: 0644]
tests/libtest/lib1560.c
tests/libtest/lib1564.c [new file with mode: 0644]
tests/libtest/lib1565.c [new file with mode: 0644]
tests/libtest/lib1591.c [new file with mode: 0644]
tests/libtest/lib1592.c [new file with mode: 0644]
tests/libtest/lib1593.c [new file with mode: 0644]
tests/libtest/lib1594.c [new file with mode: 0644]
tests/libtest/lib1900.c
tests/libtest/lib1905.c [new file with mode: 0644]
tests/libtest/lib1906.c [new file with mode: 0644]
tests/libtest/lib1907.c [new file with mode: 0644]
tests/libtest/lib506.c
tests/libtest/lib509.c
tests/libtest/lib518.c
tests/libtest/lib530.c
tests/libtest/lib536.c [deleted file]
tests/libtest/lib537.c
tests/libtest/lib540.c
tests/libtest/lib541.c
tests/libtest/lib553.c
tests/libtest/lib556.c
tests/libtest/lib557.c
tests/libtest/lib569.c
tests/libtest/lib571.c
tests/libtest/lib597.c
tests/libtest/lib658.c [new file with mode: 0644]
tests/libtest/lib659.c [new file with mode: 0644]
tests/libtest/lib661.c [new file with mode: 0644]
tests/libtest/libauthretry.c
tests/libtest/libntlmconnect.c
tests/libtest/mk-lib1521.pl
tests/libtest/stub_gssapi.c
tests/libtest/test.h
tests/libtest/testtrace.c
tests/manpage-scan.pl
tests/manpage-syntax.pl [new file with mode: 0644]
tests/objnames-test08.sh [moved from lib/objnames-test08.sh with 97% similarity]
tests/objnames-test10.sh [moved from lib/objnames-test10.sh with 97% similarity]
tests/objnames.inc [moved from lib/objnames.inc with 100% similarity]
tests/python_dependencies/impacket/nmb.py
tests/python_dependencies/impacket/ntlm.py
tests/python_dependencies/impacket/smb.py
tests/python_dependencies/impacket/smb3.py
tests/python_dependencies/impacket/smbserver.py
tests/python_dependencies/impacket/spnego.py
tests/python_dependencies/impacket/structure.py
tests/python_dependencies/impacket/uuid.py
tests/runtests.1
tests/runtests.pl
tests/secureserver.pl
tests/server/CMakeLists.txt
tests/server/Makefile.am
tests/server/Makefile.in
tests/server/Makefile.inc
tests/server/disabled.c [new file with mode: 0644]
tests/server/fake_ntlm.c
tests/server/resolve.c
tests/server/rtspd.c
tests/server/sockfilt.c
tests/server/socksd.c [new file with mode: 0644]
tests/server/sws.c
tests/server/tftpd.c
tests/server/util.c
tests/smbserver.py
tests/sshhelp.pm
tests/sshserver.pl [changed mode: 0755->0644]
tests/symbol-scan.pl
tests/testcurl.1
tests/unit/CMakeLists.txt
tests/unit/Makefile.am
tests/unit/Makefile.in
tests/unit/Makefile.inc
tests/unit/README
tests/unit/curlcheck.h
tests/unit/unit1303.c
tests/unit/unit1304.c
tests/unit/unit1307.c
tests/unit/unit1397.c
tests/unit/unit1398.c
tests/unit/unit1399.c
tests/unit/unit1604.c
tests/unit/unit1607.c
tests/unit/unit1608.c
tests/unit/unit1609.c
tests/unit/unit1620.c
tests/unit/unit1621.c [new file with mode: 0644]
tests/unit/unit1650.c
tests/unit/unit1651.c
tests/unit/unit1652.c [new file with mode: 0644]
tests/unit/unit1653.c [new file with mode: 0644]
tests/unit/unit1654.c [new file with mode: 0644]
tests/unit/unit1655.c [new file with mode: 0644]
winbuild/BUILD.WINDOWS.txt
winbuild/Makefile.vc
winbuild/MakefileBuild.vc
winbuild/gen_resp_file.bat

diff --git a/CHANGES b/CHANGES
index 221e90c..b1f1e20 100644 (file)
--- a/CHANGES
+++ b/CHANGES
 
                                   Changelog
 
-Version 7.62.0 (30 Oct 2018)
+Version 7.68.0 (8 Jan 2020)
 
-Daniel Stenberg (30 Oct 2018)
-- RELEASE-NOTES: 7.62.0
+Daniel Stenberg (8 Jan 2020)
+- RELEASE-NOTES: 7.68.0
 
-- THANKS: 7.62.0 status
+- THANKS: updated with names from the 7.68.0 release
 
-Daniel Gustafsson (30 Oct 2018)
-- vtls: add MesaLink to curl_sslbackend enum
+- RELEASE-PROCEDURE: add four future release dates
   
-  MesaLink support was added in commit 57348eb97d1b8fc3742e02c but the
-  backend was never added to the curl_sslbackend enum in curl/curl.h.
-  This adds the new backend to the enum and updates the relevant docs.
+  and remove four past release dates
   
-  Closes #3195
-  Reviewed-by: Daniel Stenberg <daniel@haxx.se>
+  [skip ci]
 
-Daniel Stenberg (30 Oct 2018)
-- [Ruslan Baratov brought this change]
+Marcel Raad (6 Jan 2020)
+- TrackMemory tests: always remove CR before LF
+  
+  It was removed for output containing ' =' via `s/ =.*//`. With classic
+  MinGW, this made lines with `free()` end with CRLF, but lines with e.g.
+  `malloc()` end with only LF. The tests expect LF only.
+  
+  Closes https://github.com/curl/curl/pull/4788
 
-  cmake: Remove unused CURL_CONFIG_HAS_BEEN_RUN_BEFORE variable
+Daniel Stenberg (6 Jan 2020)
+- multi.h: move INITIAL_MAX_CONCURRENT_STREAMS from public header
+  
+  ... to the private multihhandle.h. It is not for public use and it
+  wasn't prefixed correctly anyway!
   
-  Closes #3191
+  Closes #4790
 
-- test2080: verify the fix for CVE-2018-16842
+- file: fix copyright year range
+  
+  Follow-up to 1b71bc532bd
 
-- voutf: fix bad arethmetic when outputting warnings to stderr
+- curl -w: handle a blank input file correctly
+  
+  Previously it would end up with an uninitialized memory buffer that
+  would lead to a crash or junk getting output.
+  
+  Added test 1271 to verify.
   
-  CVE-2018-16842
   Reported-by: Brian Carpenter
-  Bug: https://curl.haxx.se/docs/CVE-2018-16842.html
-
-- [Tuomo Rinne brought this change]
+  Closes #4786
 
-  cmake: uniform ZLIB to use USE_ variable and clean curl-config.cmake.in
+- file: on Windows, refuse paths that start with \\
   
-  Closes #3123
-
-- [Tuomo Rinne brought this change]
-
-  cmake: add find_dependency call for ZLIB to CMake config file
-
-- [Tuomo Rinne brought this change]
+  ... as that might cause an unexpected SMB connection to a given host
+  name.
+  
+  Reported-by: Fernando Muñoz
+  CVE-2019-15601
+  Bug: https://curl.haxx.se/docs/CVE-2019-15601.html
 
-  cmake: add support for transitive ZLIB target
+Jay Satiro (6 Jan 2020)
+- CURLOPT_READFUNCTION.3: fix fopen params in example
 
-- unit1650: fix "null pointer passed as argument 1 to memcmp"
+- CURLOPT_READFUNCTION.3: fix variable name in example
   
-  Detected by UndefinedBehaviorSanitizer
+  Reported-by: Paul Joyce
   
-  Closes #3187
+  Fixes https://github.com/curl/curl/issues/4787
 
-- travis: add a "make tidy" build that runs clang-tidy
+Daniel Stenberg (5 Jan 2020)
+- curl:getparameter return error for --http3 if libcurl doesn't support
   
-  Closes #3182
+  Closes #4785
 
-- unit1300: fix stack-use-after-scope AddressSanitizer warning
+- docs: mention CURL_MAX_INPUT_LENGTH restrictions
   
-  Closes #3186
-
-- Curl_auth_create_plain_message: fix too-large-input-check
+  ... for curl_easy_setopt() and curl_url_set().
   
-  CVE-2018-16839
-  Reported-by: Harry Sintonen
-  Bug: https://curl.haxx.se/docs/CVE-2018-16839.html
+  [skip ci]
+  
+  Closes #4783
 
-- Curl_close: clear data->multi_easy on free to avoid use-after-free
+- curl: properly free mimepost data
   
-  Regression from b46cfbc068 (7.59.0)
-  CVE-2018-16840
-  Reported-by: Brian Carpenter (Geeknik Labs)
+  ... as it could otherwise leak memory when a transfer failed.
   
-  Bug: https://curl.haxx.se/docs/CVE-2018-16840.html
-
-- [randomswdev brought this change]
+  Added test 1293 to verify.
+  
+  Reported-by: Brian Carpenter
+  Fixes #4781
+  Closes #4782
 
-  system.h: use proper setting with Sun C++ as well
+- curl: cleanup multi handle on failure
   
-  system.h selects the proper Sun settings when __SUNPRO_C is defined. The
-  Sun compiler does not define it when compiling C++ files.  I'm adding a
-  check also on __SUNPRO_CC to allow curl to work properly also when used
-  in a C++ project on Sun Solaris.
+  ... to fix memory leak in error path.
   
-  Closes #3181
+  Fixes #4772
+  Closes #4780
+  Reported-by: Brian Carpenter
 
-- rand: add comment to skip a clang-tidy false positive
+Marcel Raad (3 Jan 2020)
+- lib: fix compiler warnings with `CURL_DISABLE_VERBOSE_STRINGS`
+  
+  Closes https://github.com/curl/curl/pull/4775
 
-- test1651: unit test Curl_extract_certinfo()
+Daniel Stenberg (3 Jan 2020)
+- COPYING: it's 2020!
   
-  The version used for Gskit, NSS, GnuTLS, WolfSSL and schannel.
+  [skip ci]
 
-- x509asn1: always check return code from getASN1Element()
+Jay Satiro (3 Jan 2020)
+- [Marc Aldorasi brought this change]
 
-- Makefile: add 'tidy' target that runs clang-tidy
+  tests: Fix bounce requests with truncated writes
   
-  Available in the root, src and lib dirs.
+  Prior to this change the swsbounce check in service_connection could
+  fail because prevtestno and prevpartno were not set, which would cause
+  the wrong response data to be sent to some tests and cause them to fail.
   
-  Closes #3163
+  Ref: https://github.com/curl/curl/pull/4717#issuecomment-570240785
 
-- RELEASE-PROCEDURE: adjust the release dates
+Marcel Raad (31 Dec 2019)
+- tool: make a few char pointers point to const char instead
+  
+  These are read-only.
   
-  See: https://curl.haxx.se/mail/lib-2018-10/0107.html
+  Closes https://github.com/curl/curl/pull/4771
 
-Patrick Monnerat (27 Oct 2018)
-- x509asn1: suppress left shift on signed value
+Jay Satiro (31 Dec 2019)
+- tests: Change NTLM tests to require SSL
   
-  Use an unsigned variable: as the signed operation behavior is undefined,
-  this change silents clang-tidy about it.
+  Prior to this change tests that required NTLM feature did not require
+  SSL feature.
   
-  Ref: https://github.com/curl/curl/pull/3163
-  Reported-By: Daniel Stenberg
-
-Michael Kaufmann (27 Oct 2018)
-- multi: Fix error handling in the SENDPROTOCONNECT state
+  There are pending changes to cmake builds that will allow enabling NTLM
+  in non-SSL builds in Windows. In that case the NTLM auth strings created
+  are different from what is expected by the NTLM tests and they fail:
+  
+  "The issue with NTLM is that previous non-SSL builds would not enable
+  NTLM and so the NTLM tests would be skipped."
   
-  If Curl_protocol_connect() returns an error code,
-  handle the error instead of switching to the next state.
+  Assisted-by: marc-groundctl@users.noreply.github.com
   
-  Closes #3170
+  Ref: https://github.com/curl/curl/pull/4717#issuecomment-566218729
+  
+  Closes https://github.com/curl/curl/pull/4768
 
-Daniel Stenberg (27 Oct 2018)
-- RELEASE-NOTES: synced
+- [Michael Forney brought this change]
 
-- openssl: output the correct cipher list on TLS 1.3 error
+  bearssl: Improve I/O handling
   
-  When failing to set the 1.3 cipher suite, the wrong string pointer would
-  be used in the error message. Most often saying "(nil)".
+  Factor out common I/O loop as bearssl_run_until, which reads/writes TLS
+  records until the desired engine state is reached. This is now used for
+  the handshake, read, write, and close.
   
-  Reported-by: Ricky-Tigg on github
-  Fixes #3178
-  Closes #3180
-
-- docs/CIPHERS: fix the TLS 1.3 cipher names
+  Match OpenSSL SSL_write behavior, and don't return the number of bytes
+  written until the corresponding records have been completely flushed
+  across the socket. This involves keeping track of the length of data
+  buffered into the TLS engine, and assumes that when CURLE_AGAIN is
+  returned, the write function will be called again with the same data
+  and length arguments. This is the same requirement of SSL_write.
   
-  ... picked straight from the OpenSSL man page:
-  https://www.openssl.org/docs/manmaster/man3/SSL_CTX_set_ciphersuites.html
+  Handle TLS close notify as EOF when reading by returning 0.
   
-  Reported-by: Ricky-Tigg on github
-  Bug: #3178
+  Closes https://github.com/curl/curl/pull/4748
 
-Marcel Raad (27 Oct 2018)
-- travis: install gnutls-bin package
+- travis: Fix error detection
   
-  This is required for gnutls-serv, which enables a few more tests.
+  - Stop using inline shell scripts for before_script and script sections.
   
-  Closes https://github.com/curl/curl/pull/2958
-
-Daniel Gustafsson (26 Oct 2018)
-- ssh: free the session on init failures
+  Prior to this change Travis could ignore errors from commands in inline
+  scripts. I don't understand how or why it happens. This is a workaround.
   
-  Ensure to clear the session object in case the libssh2 initialization
-  fails.
+  Assisted-by: Simon Warta
   
-  It could be argued that the libssh2 error function should be called to
-  get a proper error message in this case. But since the only error path
-  in libssh2_knownhost_init() is memory a allocation failure it's safest
-  to avoid since the libssh2 error handling allocates memory.
+  Ref: https://github.com/travis-ci/travis-ci/issues/1066
   
-  Closes #3179
-  Reviewed-by: Daniel Stenberg <daniel@haxx.se>
+  Fixes https://github.com/curl/curl/issues/3730
+  Closes https://github.com/curl/curl/pull/3755
 
-Daniel Stenberg (26 Oct 2018)
-- docs/RELEASE-PROCEDURE: remove old entries, modify the Dec 2018 date
+- tool_operate: fix mem leak when failed config parse
   
-  ... I'm moving it up one week due to travels. The rest stays.
-
-- [Daniel Gustafsson brought this change]
-
-  openssl: make 'done' a proper boolean
+  Found by fuzzing the config file.
   
-  Closes #3176
+  Reported-by: Geeknik Labs
+  
+  Fixes https://github.com/curl/curl/issues/4767
 
-- gtls: Values stored to but never read
+- [Xiang Xiao brought this change]
+
+  lib: remove erroneous +x file permission on some c files
   
-  Detected by clang-tidy
+  Modified by commit eb9a604 accidentally.
   
-  Closes #3176
+  Closes https://github.com/curl/curl/pull/4756
 
-- [Alexey Eremikhin brought this change]
+- [Xiang Xiao brought this change]
 
-  curl.1: --ipv6 mutexes ipv4 (fixed typo)
+  lib: fix warnings found when porting to NuttX
   
-  Fixes #3171
-  Closes #3172
-
-- tool_main: make TerminalSettings static
+  - Undefine DEBUGASSERT in curl_setup_once.h in case it was already
+    defined as a system macro.
   
-  Reported-by: Gisle Vanem
-  Bug: https://github.com/curl/curl/commit/becfe1233ff2b6b0c3e1b6a10048b55b68c2539f#commitcomment-31008819
-  Closes #3161
-
-- curl-config.in: remove dependency on bc
+  - Don't compile write32_le in curl_endian unless
+    CURL_SIZEOF_CURL_OFF_T > 4, since it's only used by Curl_write64_le.
   
-  Reported-by: Dima Pasechnik
-  Fixes #3143
-  Closes #3174
-
-- [Gisle Vanem brought this change]
+  - Include <arpa/inet.h> in socketpair.c.
+  
+  Closes https://github.com/curl/curl/pull/4756
 
-  rtmp: fix for compiling with lwIP
+- os400: Add missing CURLE error constants
   
-  Compiling on _WIN32 and with USE_LWIPSOCK, causes this error:
-    curl_rtmp.c(223,3):  error: use of undeclared identifier 'setsockopt'
-      setsockopt(r->m_sb.sb_socket, SOL_SOCKET, SO_RCVTIMEO,
-      ^
-    curl_rtmp.c(41,32):  note: expanded from macro 'setsockopt'
-    #define setsockopt(a,b,c,d,e) (setsockopt)(a,b,c,(const char *)d,(int)e)
-                                   ^
-  Closes #3155
+  Bug: https://github.com/curl/curl/pull/4754#issuecomment-569126922
+  Reported-by: Emil Engler
 
-- configure: remove CURL_CONFIGURE_CURL_SOCKLEN_T
+- CURLOPT_HEADERFUNCTION.3: Document that size is always 1
   
-  Follow-up to #3166 which did the cmake part of this. This type/define is
-  not used.
+  For compatibility with `fwrite`, the `CURLOPT_HEADERFUNCTION` callback
+  is passed two `size_t` parameters which, when multiplied, designate the
+  number of bytes of data passed in. In practice, CURL always sets the
+  first parameter (`size`) to 1.
   
-  Closes #3168
-
-- [Ruslan Baratov brought this change]
-
-  cmake: remove unused variables
+  This practice is also enshrined in documentation and cannot be changed
+  in future. The documentation states that the default callback is
+  `fwrite`, which means `fwrite` must be a suitable function for this
+  purpose. However, the documentation also states that the callback must
+  return the number of *bytes* it successfully handled, whereas ISO C
+  `fwrite` returns the number of items (each of size `size`) which it
+  wrote. The only way these numbers can be equal is if `size` is 1.
   
-  Remove variables:
-  * HAVE_SOCKLEN_T
-  * CURL_SIZEOF_CURL_SOCKLEN_T
-  * CURL_TYPEOF_CURL_SOCKLEN_T
+  Since `size` is 1 and can never be changed in future anyway, document
+  that fact explicitly and let users rely on it.
   
-  Closes #3166
-
-Michael Kaufmann (25 Oct 2018)
-- urldata: Fix comment in header
+  Reported-by: Frank Gevaerts
+  Commit-message-by: Christopher Head
   
-  The "connecting" function is used by multiple protocols, not only FTP
+  Ref: https://github.com/curl/curl/pull/2787
+  
+  Fixes https://github.com/curl/curl/issues/4758
 
-- netrc: free temporary strings if memory allocation fails
+- examples/postinmemory.c: Call curl_global_cleanup always
   
-  - Change the inout parameters after all needed memory has been
-    allocated. Do not change them if something goes wrong.
-  - Free the allocated temporary strings if strdup() fails.
+  Prior to this change curl_global_cleanup was not called if
+  curl_easy_init failed.
   
-  Closes #3122
-
-Daniel Stenberg (24 Oct 2018)
-- [Ruslan Baratov brought this change]
-
-  config: Remove unused SIZEOF_VOIDP
+  Reported-by: kouzhudong@users.noreply.github.com
   
-  Closes #3162
+  Fixes https://github.com/curl/curl/issues/4751
 
-- RELEASE-NOTES: synced
+Daniel Stenberg (21 Dec 2019)
+- url2file.c: fix copyright year
+  
+  Follow-up to 525787269599b5
 
-GitHub (23 Oct 2018)
-- [Gisle Vanem brought this change]
+- [Rickard Hallerbäck brought this change]
 
-  Fix for compiling with lwIP (3)
+  examples/url2file.c: corrected a comment
   
-  lwIP on Windows does not have a WSAIoctl() function.
-  But it do have a SO_SNDBUF option to lwip_setsockopt(). But it currently does nothing.
+  The comment was confusing and suggested that setting CURLOPT_NOPROGRESS
+  to 0L would both enable and disable debug output at the same time, like
+  a Schrödinger's cat of CURLOPTs.
+  
+  Closes #4745
+
+- HISTORY: OSS-Fuzz started fuzzing libcurl in 2017
 
-Daniel Stenberg (23 Oct 2018)
-- Curl_follow: return better errors on URL problems
+- RELEASE-NOTES: synced
+
+Jay Satiro (20 Dec 2019)
+- ngtcp2: Support the latest update key callback type
   
-  ... by making the converter function global and accessible.
+  - Remove our cb_update_key in favor of ngtcp2's new
+    ngtcp2_crypto_update_key_cb which does the same thing.
   
-  Closes #3153
-
-- Curl_follow: remove remaining free(newurl)
+  Several days ago the ngtcp2_update_key callback function prototype was
+  changed in ngtcp2/ngtcp2@42ce09c. Though it would be possible to
+  fix up our cb_update_key for that change they also added
+  ngtcp2_crypto_update_key_cb which does the same thing so we'll use that
+  instead.
   
-  Follow-up to 05564e750e8f0c. This function no longer frees the passed-in
-  URL.
+  Ref: https://github.com/ngtcp2/ngtcp2/commit/42ce09c
   
-  Reported-by: Michael Kaufmann
-  Bug: https://github.com/curl/curl/commit/05564e750e8f0c79016c680f301ce251e6e86155#commitcomm
-  ent-30985666
+  Closes https://github.com/curl/curl/pull/4735
 
-Daniel Gustafsson (23 Oct 2018)
-- headers: end all headers with guard comment
+Daniel Stenberg (19 Dec 2019)
+- sws: search for "Testno:" header uncondtionally if no testno
   
-  Most headerfiles end with a /* <headerguard> */ comment, but it was
-  missing from some. The comment isn't the most important part of our
-  code documentation but consistency has an intrinsic value in itself.
-  This adds header guard comments to the files that were lacking it.
+  Even if the initial request line wasn't found. With the fix to 1455, the
+  test number is now detected correctly.
   
-  Closes #3158
-  Reviewed-by: Jay Satiro <raysatiro@yahoo.com>
-  Reviewed-by: Daniel Stenberg <daniel@haxx.se>
-
-Jay Satiro (23 Oct 2018)
-- CIPHERS.md: Mention the options used to set TLS 1.3 ciphers
+  (Problem found when running tests in random order.)
   
-  Closes https://github.com/curl/curl/pull/3159
+  Closes #4744
 
-Daniel Stenberg (20 Oct 2018)
-- docs/BUG-BOUNTY: the sponsors actually decide the amount
+- tests: set LC_ALL in more tests
   
-  Retract the previous approach as the sponsors will be the ones to set the
-  final amounts.
+  Follow-up to 23208e330ac0c21
   
-  Closes #3152
-  [ci skip]
+  Closes #4743
 
-- multi: avoid double-free
+- test165: set LC_ALL=en_US.UTF-8 too
   
-  Curl_follow() no longer frees the string. Make sure it happens in the
-  caller function, like we normally handle allocations.
+  On my current Debian Unstable with libidn2 2.2.0, I get an error if
+  LC_ALL is set to blank. Then curl errors out with:
   
-  This bug was introduced with the use of the URL API internally, it has
-  never been in a release version
+  curl: (3) Failed to convert www.åäö.se to ACE; could not convert string to UTF-8
   
-  Reported-by: Dario Weißer
-  Closes #3149
+  Closes #4738
 
-- multi: make the closure handle "inherit" CURLOPT_NOSIGNAL
+- curl.h: add two defines for the "pre ISO C" case
   
-  Otherwise, closing that handle can still cause surprises!
+  Without this fix, this caused a compilation failure on AIX with IBM xlc
+  13.1.3 compiler.
   
-  Reported-by: Martin Ankerl
-  Fixes #3138
-  Closes #3147
+  Reported-by: Ram Krushna Mishra
+  Fixes #4739
+  Closes #4740
 
-Marcel Raad (19 Oct 2018)
-- VS projects: add USE_IPV6
+- create_conn: prefer multiplexing to using new connections
   
-  The Visual Studio builds didn't use IPv6. Add it to all projects since
-  Visual Studio 2008, which is verified to build via AppVeyor.
+  ... as it would previously prefer new connections rather than
+  multiplexing in most conditions! The (now removed) code was a leftover
+  from the Pipelining code that was translated wrongly into a
+  multiplex-only world.
   
-  Closes https://github.com/curl/curl/pull/3137
+  Reported-by: Kunal Ekawde
+  Bug: https://curl.haxx.se/mail/lib-2019-12/0060.html
+  Closes #4732
 
-- config_win32: enable LDAPS
+- test1456: remove the use of a fixed local port
   
-  As done in the autotools and CMake builds by default.
+  Fixup the test to instead not compare the port number. It sometimes
+  caused problems like this:
   
-  Closes https://github.com/curl/curl/pull/3137
-
-Daniel Stenberg (18 Oct 2018)
-- travis: add build for "configure --disable-verbose"
+  "curl: (45) bind failed with errno 98: Address already in use"
   
-  Closes #3144
+  Closes #4733
 
-Kamil Dudka (17 Oct 2018)
-- tool_cb_hdr: handle failure of rename()
+Jay Satiro (18 Dec 2019)
+- CURLOPT_QUOTE.3: fix typos
   
-  Detected by Coverity.
+  Prior to this change the EXAMPLE in the QUOTE/PREQUOTE/POSTQUOTE man
+  pages would not compile because a variable name was incorrect.
   
-  Closes #3140
-  Reviewed-by: Jay Satiro
-
-Daniel Stenberg (17 Oct 2018)
-- RELEASE-NOTES: synced
-
-- docs/SECURITY-PROCESS: the hackerone IBB program drops curl
+  Reported-by: Bylon2@users.noreply.github.com
   
-  ... now there's only BountyGraph.
+  Fixes https://github.com/curl/curl/issues/4736
 
-Jay Satiro (16 Oct 2018)
-- [Matthew Whitehead brought this change]
+- [Gisle Vanem brought this change]
 
-  x509asn1: Fix SAN IP address verification
+  strerror: Fix compiler warning "empty expression"
   
-  For IP addresses in the subject alternative name field, the length
-  of the IP address (and hence the number of bytes to perform a
-  memcmp on) is incorrectly calculated to be zero. The code previously
-  subtracted q from name.end. where in a successful case q = name.end
-  and therefore addrlen equalled 0. The change modifies the code to
-  subtract name.beg from name.end to calculate the length correctly.
+  - Remove the final semi-colon in the SEC2TXT() macro definition.
   
-  The issue only affects libcurl with GSKit SSL, not other SSL backends.
-  The issue is not a security issue as IP verification would always fail.
+  Before:  #define SEC2TXT(sec) case sec: txt = #sec; break;
   
-  Fixes #3102
-  Closes #3141
-
-Daniel Gustafsson (15 Oct 2018)
-- INSTALL: mention mesalink in TLS section
+  After:   #define SEC2TXT(sec) case sec: txt = #sec; break
   
-  Commit 57348eb97d1b8fc3742e02c6587d2d02ff592da5 added support for the
-  MesaLink vtls backend, but missed updating the TLS section containing
-  supported backends in the docs.
+  Prior to this change SEC2TXT(foo); would generate break;; which caused
+  the empty expression warning.
   
-  Closes #3134
-  Reviewed-by: Daniel Stenberg <daniel@haxx.se>
+  Ref: https://github.com/curl/curl/commit/5b22e1a#r36458547
 
-Marcel Raad (14 Oct 2018)
-- nonblock: fix unused parameter warning
+Daniel Stenberg (18 Dec 2019)
+- curl/parseconfig: use curl_free() to free memory allocated by libcurl
   
-  If USE_BLOCKING_SOCKETS is defined, curlx_nonblock's arguments are not
-  used.
+  Reported-by: bxac on github
+  Fixes #4730
+  Closes #4731
 
-Michael Kaufmann (13 Oct 2018)
-- Curl_follow: Always free the passed new URL
+- curl/parseconfig: fix mem-leak
   
-  Closes #3124
+  When looping, first trying '.curlrc' and then '_curlrc', the function
+  would not free the first string.
+  
+  Closes #4731
 
-Viktor Szakats (12 Oct 2018)
-- replace rawgit links [ci skip]
+- CURLOPT_URL.3: "curl supports SMB version 1 (only)"
   
-  Ref: https://rawgit.com/ "RawGit has reached the end of its useful life"
-  Ref: https://news.ycombinator.com/item?id=18202481
-  Closes https://github.com/curl/curl/pull/3131
+  [skip ci]
 
-Daniel Stenberg (12 Oct 2018)
-- docs/BUG-BOUNTY.md: for vulns published since Aug 1st 2018
+- test1270: a basic -w redirect_url test
   
-  [ci skip]
+  Closes #4728
+
+- HISTORY: the SMB(S) support landed in 2014
 
-- travis: make distcheck scan for BOM markers
+- define: remove HAVE_ENGINE_LOAD_BUILTIN_ENGINES, not used anymore
   
-  and remove BOM from projects/wolfssl_override.props
+  It is covered by USE_OPENSSL_ENGINE now.
   
-  Closes #3126
+  Reported-by: Gisle Vanem
+  Bug: https://github.com/curl/curl/commit/87b9337c8f76c21c57b204e88b68c6ecf3bd1ac0#commitcomment-36447951
+  
+  Closes #4725
 
-Marcel Raad (11 Oct 2018)
-- CMake: remove BOM
+- lib: remove ASSIGNWITHINCONDITION exceptions, use our code style
   
-  Accidentally aded in commit 1bb86057ff07083deeb0b00f8ad35879ec4d03ea.
+  ... even for macros
   
-  Reported-by: Viktor Szakats
-  Ref: https://github.com/curl/curl/pull/3120#issuecomment-428673136
+  Reviewed-by: Daniel Gustafsson
+  Reviewed-by: Jay Satiro
+  Reported-by: Jay Satiro
+  Fixes #4683
+  Closes #4722
 
-Daniel Gustafsson (10 Oct 2018)
-- transfer: fix typo in comment
+- tests: make sure checksrc runs on header files too
 
-Michael Kaufmann (10 Oct 2018)
-- docs: add "see also" links for SSL options
+- Revert "checksrc: fix regexp for ASSIGNWITHINCONDITION"
   
-  - link TLS 1.2 and TLS 1.3 options
-  - link proxy and non-proxy options
+  This reverts commit ba82673dac3e8d00a76aa5e3779a0cb80e7442af.
   
-  Closes #3121
+  Bug: #4683
 
-Marcel Raad (10 Oct 2018)
-- AppVeyor: remove BDIR variable that sneaked in again
+- KNOWN_BUGS: TLS session cache doesn't work with TFO
   
-  Removed in ae762e1abebe3a5fe75658583c85059a0957ef6e, accidentally added
-  again in 9f3be5672dc4dda30ab43e0152e13d714a84d762.
+  [skip ci]
+  Closes #4301
 
-- CMake: disable -Wpedantic-ms-format
-  
-  As done in the autotools build. This is required for MinGW, which
-  supports only %I64 for printing 64-bit values, but warns about it.
+- KNOWN_BUGS: Connection information when using TCP Fast Open
   
-  Closes https://github.com/curl/curl/pull/3120
+  Also point to #4296 for more details
+  Closes #4296
 
-Viktor Szakats (9 Oct 2018)
-- ldap: show precise LDAP call in error message on Windows
-  
-  Also add a unique but common text ('bind via') to make it
-  easy to grep this specific failure regardless of platform.
+- KNOWN_BUGS: LDAP on Windows doesn't work
   
-  Ref: https://github.com/curl/curl/pull/878/files#diff-7a636f08047c4edb53a240f540b4ecf6R468
-  Closes https://github.com/curl/curl/pull/3118
-  Reviewed-by: Daniel Stenberg <daniel@haxx.se>
-  Reviewed-by: Marcel Raad <Marcel.Raad@teamviewer.com>
+  Closes #4261
 
-Daniel Stenberg (9 Oct 2018)
-- docs/DEPRECATE: minor reformat to render nicer on web
+- docs: TLS SRP doesn't work with TLS 1.3
+  
+  Reported-by: sayrer on github
+  Closes #4262
+  [skip ci]
 
-Daniel Gustafsson (9 Oct 2018)
-- CURLOPT_SSL_VERIFYSTATUS: Fix typo
+Dan Fandrich (16 Dec 2019)
+- cirrus: Switch to the FreeBSD 12.1 point release & enable more tests.
   
-  Changes s/OSCP/OCSP/ and bumps the copyright year due to the change.
+  A few tests are now passing on FreeBSD, so no longer skip them.
+  [skip ci]
 
-Marcel Raad (9 Oct 2018)
-- curl_setup: define NOGDI on Windows
+Daniel Stenberg (16 Dec 2019)
+- azure: the macos cmake doesn't need to install cmake
   
-  This avoids an ERROR macro clash between <wingdi.h> and <arpa/tftp.h>
-  on MinGW.
+   Error: cmake 3.15.5 is already installed
+   To upgrade to 3.16.1, run `brew upgrade cmake`.
   
-  Closes https://github.com/curl/curl/pull/3113
+  Closes #4723
 
-- Windows: fixes for MinGW targeting Windows Vista
+Jay Satiro (15 Dec 2019)
+- winbuild: Document CURL_STATICLIB requirement for static libcurl
+  
+  A static libcurl (ie winbuild mode=static) requires that the user define
+  CURL_STATICLIB when using it in their application. This is already
+  covered in the FAQ and INSTALL.md, but is a pretty important point so
+  now it's noted in the BUILD.WINDOWS.txt as well.
   
-  Classic MinGW has neither InitializeCriticalSectionEx nor
-  GetTickCount64, independent of the target Windows version.
+  Assisted-by: Michael Vittiglio
   
-  Closes https://github.com/curl/curl/pull/3113
+  Closes https://github.com/curl/curl/pull/4721
 
-Daniel Stenberg (8 Oct 2018)
-- TODO: fixed 'API for URL parsing/splitting'
+Daniel Stenberg (15 Dec 2019)
+- [Santino Keupp brought this change]
 
-Daniel Gustafsson (8 Oct 2018)
-- KNOWN_BUGS: Fix various typos
+  libssh2: add support for ECDSA and ed25519 knownhost keys
   
-  Closes #3112
-  Reviewed-by: Daniel Stenberg <daniel@haxx.se>
+  ... if a new enough libssh2 version is present.
+  
+  Source: https://curl.haxx.se/mail/archive-2019-12/0023.html
+  Co-Authored-by: Daniel Stenberg
+  Closes #4714
 
-Viktor Szakats (8 Oct 2018)
-- spelling fixes [ci skip]
+- lib1591: free memory properly on OOM, in the trailers callback
   
-  as detected by codespell 1.14.0
+  Detected by torture tests.
   
-  Closes https://github.com/curl/curl/pull/3114
-  Reviewed-by: Marcel Raad <Marcel.Raad@teamviewer.com>
+  Closes #4720
+
+- runtests: --repeat=[num] to repeat tests
+  
+  Closes #4715
 
-Daniel Stenberg (8 Oct 2018)
 - RELEASE-NOTES: synced
 
-- curl_ntlm_wb: check aprintf() return codes
+- azure: add a torture test on mac
   
-  ... when they return NULL we're out of memory and MUST return failure.
+  Uses --shallow=25 to keep it small enough to get through in time.
   
-  closes #3111
+  Closes #4712
 
-- docs/BUG-BOUNTY: proposed additional docs
+- multi: free sockhash on OOM
   
-  Bug bounty explainer. See https://bountygraph.com/programs/curl
+  This would otherwise leak memory in the error path.
   
-  Closes #3067
-
-- [Rick Deist brought this change]
-
-  hostip: fix check on Curl_shuffle_addr return value
+  Detected by torture test 1540.
   
-  Closes #3110
+  Closes #4713
 
-- FILE: fix CURLOPT_NOBODY and CURLOPT_HEADER output
-  
-  Now FILE transfers send headers to the header callback like HTTP and
-  other protocols. Also made curl_easy_getinfo(...CURLINFO_PROTOCOL...)
-  work for FILE in the callbacks.
+Marcel Raad (13 Dec 2019)
+- tests: use DoH feature for DoH tests
   
-  Makes "curl -i file://.." and "curl -I file://.." work like before
-  again. Applied the bold header logic to them too.
+  Previously, http/2 was used instead.
   
-  Regression from c1c2762 (7.61.0)
-  
-  Reported-by: Shaun Jackman
-  Fixes #3083
-  Closes #3101
+  Assisted-by: Jay Satiro
+  Closes https://github.com/curl/curl/pull/4692
 
-Daniel Gustafsson (7 Oct 2018)
-- gskit: make sure to terminate version string
+- hostip: suppress compiler warning
   
-  In case a very small buffer was passed to the version function, it could
-  result in the buffer not being NULL-terminated since strncpy() doesn't
-  guarantee a terminator on an overflowed buffer. Rather than adding code
-  to terminate (and handle zero-sized buffers), move to using snprintf()
-  instead like all the other vtls backends.
+  With `--disable-doh --disable-threaded-resolver`, the `dns` parameter
+  is not used.
   
-  Closes #3105
-  Reviewed-by: Daniel Stenberg <daniel@haxx.se>
-  Reviewed-by: Viktor Szakats <commit@vszakats.net>
+  Closes https://github.com/curl/curl/pull/4692
 
-- TODO: add LD_PRELOAD support on macOS
+- tests: fix build with `CURL_DISABLE_DOH`
   
-  Add DYLD_INSERT_LIBRARIES support to the TODO list. Reported in #2394.
+  Closes https://github.com/curl/curl/pull/4692
 
-- runtests: skip ld_preload tests on macOS
+Daniel Stenberg (13 Dec 2019)
+- azure: add a torture test
   
-  The LD_PRELOAD functionality doesn't exist on macOS, so skip any tests
-  requiring it.
+  Skipping all FTP tests for speed reasons.
   
-  Fixes #2394
-  Closes #3106
-  Reported-by: Github user @jakirkham
-  Reviewed-by: Daniel Stenberg <daniel@haxx.se>
+  Closes #4697
 
-Marcel Raad (7 Oct 2018)
-- AppVeyor: use Debug builds to run tests
+- azure: make the default build use --enable-debug --enable-werror
+
+- ntlm_wb: fix double-free in OOM
   
-  This enables more tests.
+  Detected by torture testing test 1310
   
-  Closes https://github.com/curl/curl/pull/3104
+  Closes #4710
 
-- AppVeyor: add HTTP_ONLY build
+Dan Fandrich (13 Dec 2019)
+- cirrus: Drop the FreeBSD 10.4 build
   
-  Closes https://github.com/curl/curl/pull/3104
+  Upstream support for 10.4 ended a year ago, and it looks like the image
+  is now gone, too.
+  [skip ci]
 
-- AppVeyor: add WinSSL builds
+Daniel Stenberg (13 Dec 2019)
+- unit1620: fix bad free in OOM
   
-  Use the oldest and latest Windows SDKs for them.
-  Also, remove all but one OpenSSL build.
-  
-  Closes https://github.com/curl/curl/pull/3104
+  Closes #4709
 
-- AppVeyor: add remaining Visual Studio versions
+- unit1609: fix mem-leak in OOM
   
-  This adds Visual Studio 9 and 10 builds.
-  There's no 64-bit VC9 compiler on AppVeyor, so use it as the Win32
-  build. Also, VC9 cannot be used for running the test suite.
+  Closes #4709
+
+- unit1607: fix mem-leak in OOM
   
-  Closes https://github.com/curl/curl/pull/3104
+  Closes #4709
 
-- AppVeyor: break long line
+- lib1559: fix mem-leak in OOM
   
-  Closes https://github.com/curl/curl/pull/3104
+  Closes #4709
 
-- AppVeyor: remove unused BDIR variable
+- lib1557: fix mem-leak in OOM
   
-  Closes https://github.com/curl/curl/pull/3104
+  Closes #4709
 
-Daniel Stenberg (6 Oct 2018)
-- test2100: test DoH using IPv4-only
+- altsvc: make the save function ignore NULL filenames
   
-  To make it only send one DoH request and avoid the race condition that
-  could lead to the requests getting sent in reversed order and thus
-  making it hard to compare in the test case.
+  It might happen in OOM situations. Detected bv torture tests.
   
-  Fixes #3107
-  Closes #3108
+  Closes #4707
 
-- tests/FILEFORMAT: mention how to use <fileN> and <stripfileN> too
+- curl: fix memory leak in OOM in etags logic
   
-  [ci skip]
-
-- RELEASE-NOTES: synced
-
-- [Dmitry Kostjuchenko brought this change]
-
-  timeval: fix use of weak symbol clock_gettime() on Apple platforms
+  Detected by torture tests
   
-  Closes #3048
+  Closes #4706
 
-- doh: keep the IPv4 address in (original) network byte order
+- doh: make it behave when built without proxy support
   
-  Ideally this will fix the reversed order shown in SPARC tests:
+  Reported-by: Marcel Raad
+  Bug: https://github.com/curl/curl/pull/4692#issuecomment-564115734
+  
+  Closes #4704
+
+- curl: improved cleanup in upload error path
   
-    resp 8: Expected 127.0.0.1 got 1.0.0.127
+  Memory leak found by torture test 58
   
-  Closes #3091
+  Closes #4705
 
-Jay Satiro (5 Oct 2018)
-- INTERNALS.md: wrap lines longer than 79
+- mailmap: fix Andrew Ishchuk
 
-Daniel Gustafsson (5 Oct 2018)
-- INTERNALS: escape reference to parameter
-  
-  The parameter reference <string> was causing rendering issues in the
-  generated HTML page, as <string> isn't a valid HTML tag. Fix by back-
-  tick escaping it.
+- travis: make torture use --shallow=40
   
-  Closes #3099
-  Reviewed-by: Jay Satiro <raysatiro@yahoo.com>
-  Reviewed-by: Daniel Stenberg <daniel@haxx.se>
+  As a first step to enable it to run over a more diverse set of tests in
+  a reasonable time.
 
-- checksrc: handle zero scoped ignore commands
+- runtests: introduce --shallow to reduce huge torture tests
   
-  If a !checksrc! disable command specified to ignore zero errors, it was
-  still added to the ignore block even though nothing was ignored. While
-  there were no blocks ignored that shouldn't be ignored, the processing
-  ended with with a warning:
+  When set, shallow mode limits runtests -t to make no more than NUM fails
+  per test case. If more are found, it will randomly discard entries until
+  the number is right. The random seed can also be set.
   
-  <filename>:<line>:<col>: warning: Unused ignore: LONGLINE (UNUSEDIGNORE)
-   /* !checksrc! disable LONGLINE 0 */
-                      ^
-  Fix by instead treating a zero ignore as a a badcommand and throw a
-  warning for that one.
+  This is particularly useful when running MANY tests as then most torture
+  failures will already fail the same functions over and over and make the
+  total operation painfully tedious.
   
-  Closes #3096
-  Reviewed-by: Daniel Stenberg <daniel@haxx.se>
+  Closes #4699
 
-- checksrc: enable strict mode and warnings
+- conncache: CONNECT_ONLY connections assumed always in-use
   
-  Enable strict and warnings mode for checksrc to ensure we aren't missing
-  anything due to bugs in the checking code. This uncovered a few things
-  which are all fixed in this commit:
+  This makes them never to be considered "the oldest" to be discarded when
+  reaching the connection cache limit. The reasoning here is that
+  CONNECT_ONLY is primarily used in combination with using the
+  connection's socket post connect and since that is used outside of
+  curl's knowledge we must assume that it is in use until explicitly
+  closed.
   
-  * several variables were used uninitialized
-  * several variables were not defined in the correct scope
-  * the whitelist filehandle was read even if the file didn't exist
-  * the enable_warn() call when a disable counter had expired was passing
-    incorrect variables, but since the checkwarn() call is unlikely to hit
-    (the counter is only decremented to zero on actual ignores) it didn't
-    manifest a problem.
-  
-  Closes #3090
-  Reviewed-by: Daniel Stenberg <daniel@haxx.se>
-  Reviewed-by: Marcel Raad <Marcel.Raad@teamviewer.com>
+  Reported-by: Pavel Pavlov
+  Reported-by: Pavel Löbl
+  Fixes #4426
+  Fixes #4369
+  Closes #4696
 
-Marcel Raad (5 Oct 2018)
-- CMake: suppress MSVC warning C4127 for libtest
-  
-  It's issued by older Windows SDKs (prior to version 8.0).
+- [Gisle Vanem brought this change]
 
-Sergei Nikulov (5 Oct 2018)
-- Merge branch 'dmitrykos-fix_missing_CMake_defines'
+  vtls: make BearSSL possible to set with CURL_SSL_BACKEND
+  
+  Ref: https://github.com/curl/curl/commit/9b879160df01e7ddbb4770904391d3b74114302b#commitcomment-36355622
+  
+  Closes #4698
 
-- [Dmitry Kostjuchenko brought this change]
+- RELEASE-NOTES: synced
 
-  cmake: test and set missed defines during configuration
+- travis: remove "coverage", make it "torture"
   
-  Added configuration checks for HAVE_BUILTIN_AVAILABLE and HAVE_CLOCK_GETTIME_MONOTONIC.
+  The coveralls service and test coverage numbers are just too unreliable.
+  Removed badge from README.md as well.
   
-  Closes #3097
+  Fixes #4694
+  Closes #4695
 
-Marcel Raad (5 Oct 2018)
-- AppVeyor: disable test 500
+- azure: add libssh2 and cmake macos builds
   
-  It almost always results in
-  "starttransfer vs total: 0.000001 0.000000".
-  I cannot reproduce this locally, so disable it for now.
+  Removed the macos libssh2 build from travis
   
-  Closes https://github.com/curl/curl/pull/3100
+  Closes #4686
 
-- AppVeyor: set custom install prefix
+- curl: use errorf() better
   
-  CMake's default has spaces and in 32-bit mode parentheses, which result
-  in syntax errors in curl-config.
+  Change series of error outputs to use errorf().
   
-  Closes https://github.com/curl/curl/pull/3100
+  Only errors that are due to mistakes in command line option usage should
+  use helpf(), other types of errors in the tool should rather use
+  errorf().
+  
+  Closes #4691
+
+Jay Satiro (9 Dec 2019)
+- [Marc Hoersken brought this change]
 
-- AppVeyor: Remove non-SSL non-test builds
+  tests: make it possible to set executable extensions
   
-  They don't add much value.
+  This enables the use of Windows Subsystem for Linux (WSL) to run the
+  testsuite against Windows binaries while using Linux servers.
   
-  Closes https://github.com/curl/curl/pull/3100
-
-- AppVeyor: run test suite
+  This commit introduces the following environment variables:
+  - CURL_TEST_EXE_EXT: set the executable extension for all components
+  - CURL_TEST_EXE_EXT_TOOL: set it for the curl tool only
+  - CURL_TEST_EXE_EXT_SSH: set it for the SSH tools only
+  
+  Later testcurl.pl could be adjusted to make use of those variables.
+  - CURL_TEST_EXE_EXT_SRV: set it for the test servers only
   
-  Use the preinstalled MSYS2 bash for that.
-  Disable test 1139 as the CMake build doesn't generate curl.1.
+  (This is one of several commits to support use of WSL for the tests.)
   
-  Ref: https://github.com/curl/curl/issues/3070#issuecomment-425922224
-  Closes https://github.com/curl/curl/pull/3100
+  Closes https://github.com/curl/curl/pull/3899
 
-- AppVeyor: use in-tree build
+- [Marc Hoersken brought this change]
+
+  tests: fix permissions of ssh keys in WSL
   
-  Required to run the tests.
+  Keys created on Windows Subsystem for Linux (WSL) require it for some
+  reason.
   
-  Closes https://github.com/curl/curl/pull/3100
-
-Daniel Stenberg (4 Oct 2018)
-- doh: make sure TTL isn't re-inited by second (discarded?) response
+  (This is one of several commits to support use of WSL for the tests.)
   
-  Closes #3092
+  Ref: https://github.com/curl/curl/pull/3899
 
-- test320: strip out more HTML when comparing
+- [Marc Hoersken brought this change]
+
+  tests: use \r\n for log messages in WSL
   
-  To make the test case work with different gnutls-serv versions better.
+  Bash in Windows Subsystem for Linux (WSL) requires it for some reason.
   
-  Reported-by: Kamil Dudka
-  Fixes #3093
-  Closes #3094
-
-Marcel Raad (4 Oct 2018)
-- runtests: use Windows paths for Windows curl
+  (This is one of several commits to support use of WSL for the tests.)
   
-  curl generated by CMake's Visual Studio generator has "Windows" in the
-  version number.
+  Ref: https://github.com/curl/curl/pull/3899
 
-Daniel Stenberg (4 Oct 2018)
-- [Colin Hogben brought this change]
+- [Andrew Ishchuk brought this change]
 
-  tests/negtelnetserver.py: fix Python2-ism in neg TELNET server
+  winbuild: Define CARES_STATICLIB when WITH_CARES=static
   
-  Fix problems caused by differences in treatment of bytes objects between
-  python2 and python3.
+  When libcurl is built with MODE=static, c-ares is forced into static
+  linkage too. That doesn't happen when MODE=dll so linker would break
+  over undefined symbols.
   
-  Fixes #2929
-  Closes #3080
+  closes https://github.com/curl/curl/pull/4688
 
-Daniel Gustafsson (3 Oct 2018)
-- memory: ensure to check allocation results
+Daniel Stenberg (9 Dec 2019)
+- conn: always set bits.close with connclose()
   
-  The result of a memory allocation should always be checked, as we may
-  run under memory pressure where even a small allocation can fail. This
-  adds checking and error handling to a few cases where the allocation
-  wasn't checked for success. In the ftp case, the freeing of the path
-  variable is moved ahead of the allocation since there is little point
-  in keeping it around across the strdup, and the separation makes for
-  more readable code. In nwlib, the lock is aslo freed in the error path.
+  Closes #4690
+
+- cirrus: enable clang sanitizers on freebsd 13
+
+- conncache: fix multi-thread use of shared connection cache
   
-  Also bumps the copyright years on affected files.
+  It could accidentally let the connection get used by more than one
+  thread, leading to double-free and more.
   
-  Closes #3084
-  Reviewed-by: Jay Satiro <raysatiro@yahoo.com>
-  Reviewed-by: Daniel Stenberg <daniel@haxx.se>
+  Reported-by: Christopher Reid
+  Fixes #4544
+  Closes #4557
 
-- comment: Fix multiple typos in function parameters
+- azure: add a vanilla macos build
   
-  Ensure that the parameters in the comment match the actual names in the
-  prototype.
-  
-  Closes #3079
-  Reviewed-by: Daniel Stenberg <daniel@haxx.se>
+  Closes #4685
 
-- CURLOPT_SSLVERSION.3: fix typos and consistent spelling
+- curl: make the etag load logic work without fseek
   
-  Use TLS vX.Y throughout the document, instead of TLS X.Y, as that was
-  already done in all but a few cases. Also fix a few typos.
+  The fseek()s were unnecessary and caused Coverity warning CID 1456554
   
-  Closes #3076
-  Reviewed-by: Marcel Raad <Marcel.Raad@teamviewer.com>
-  Reviewed-by: Daniel Stenberg <daniel@haxx.se>
+  Closes #4681
 
-- SECURITY-PROCESS: make links into hyperlinks
-  
-  Use proper Markdown hyperlink format for the Bountygraph links in order
-  for the generated website page to be more user friendly. Also link to
-  the sponsors to give them a little extra credit.
+- mailmap: Mohammad Hasbini
+
+- [Mohammad Hasbini brought this change]
+
+  docs: fix some typos
   
-  Closes #3082
-  Reviewed-by: Daniel Stenberg <daniel@haxx.se>
+  Closes #4680
 
-Jay Satiro (3 Oct 2018)
-- CURLOPT_HEADER.3: fix typo
+- RELEASE-NOTES: synced
 
-- nss: fix nssckbi module loading on Windows
+Jay Satiro (5 Dec 2019)
+- lib: fix some loose ends for recently added CURLSSLOPT_NO_PARTIALCHAIN
   
-  - Use .DLL extension instead of .so to load modules on Windows.
+  Add support for CURLSSLOPT_NO_PARTIALCHAIN in CURLOPT_PROXY_SSL_OPTIONS
+  and OS400 package spec.
   
-  Bug: https://curl.haxx.se/mail/lib-2018-09/0077.html
-  Reported-by: Maxime Legros
+  Also I added the option to the NameValue list in the tool even though it
+  isn't exposed as a command-line option (...yet?). (NameValue stringizes
+  the option name for the curl cmd -> libcurl source generator)
   
-  Ref: https://github.com/curl/curl/pull/3016/#issuecomment-423069442
+  Follow-up to 564d88a which added CURLSSLOPT_NO_PARTIALCHAIN.
   
-  Closes https://github.com/curl/curl/pull/3086
+  Ref: https://github.com/curl/curl/pull/4655
 
-- data-binary.d: clarify default content-type is x-www-form-urlencoded
+- setopt: Fix ALPN / NPN user option when built without HTTP2
   
-  - Advise user that --data-binary sends a default content type of
-    x-www-form-urlencoded, and to have the data treated as arbitrary
-    binary data by the server set the content-type header to octet-stream.
+  - Stop treating lack of HTTP2 as an unknown option error result for
+    CURLOPT_SSL_ENABLE_ALPN and CURLOPT_SSL_ENABLE_NPN.
   
-  Ref: https://github.com/curl/curl/pull/2852#issuecomment-426465094
+  Prior to this change it was impossible to disable ALPN / NPN if libcurl
+  was built without HTTP2. Setting either option would result in
+  CURLE_UNKNOWN_OPTION and the respective internal option would not be
+  set. That was incorrect since ALPN and NPN are used independent of
+  HTTP2.
   
-  Closes https://github.com/curl/curl/pull/3085
-
-Marcel Raad (2 Oct 2018)
-- test1299: use single quotes around asterisk
+  Reported-by: Shailesh Kapse
   
-  Ref: https://github.com/curl/curl/issues/1751#issuecomment-321522580
+  Fixes https://github.com/curl/curl/issues/4668
+  Closes https://github.com/curl/curl/pull/4672
 
-Daniel Stenberg (2 Oct 2018)
-- docs/CIPHERS: mention the colon separation for OpenSSL
+Daniel Stenberg (5 Dec 2019)
+- etag: allow both --etag-compare and --etag-save in same cmdline
   
-  Bug: #3077
+  Fixes #4669
+  Closes #4678
 
-- runtests: ignore disabled even when ranges are given
+Marcel Raad (5 Dec 2019)
+- curl_setup: fix `CURLRES_IPV6` condition
   
-  runtests.pl support running a range of tests, like "44 to 127". Starting
-  now, the code makes sure that even such given ranges will ignore tests
-  that are marked as disabled.
+  Move the definition of `CURLRES_IPV6` to before undefining
+  `HAVE_GETADDRINFO`. Regression from commit 67a08dca27a which caused
+  some tests to fail and others to be skipped with c-ares.
   
-  Disabled tests can still be run by explictly specifying that test
-  number.
-  
-  Closes #3075
+  Fixes https://github.com/curl/curl/issues/4673
+  Closes https://github.com/curl/curl/pull/4677
 
-- urlapi: starting with a drive letter on win32 is not an abs url
-  
-  ... and libcurl doesn't support any single-letter URL schemes (if there
-  even exist any) so it should be fairly risk-free.
+Daniel Stenberg (5 Dec 2019)
+- test342: make it return a 304 as the tag matches
+
+Peter Wu (4 Dec 2019)
+- CMake: add support for building with the NSS vtls backend
   
-  Reported-by: Marcel Raad
+  Options are cross-checked with configure.ac and acinclude.m4.
+  Tested on Arch Linux, untested on other platforms like Windows or macOS.
   
-  Fixes #3070
-  Closes #3071
+  Closes #4663
+  Reviewed-by: Kamil Dudka
 
-Marcel Raad (2 Oct 2018)
-- doh: fix curl_easy_setopt argument type
+Daniel Stenberg (4 Dec 2019)
+- azure: add more builds
   
-  CURLOPT_POSTFIELDSIZE is long. Fixes a compiler warning on 64-bit
-  MinGW.
+  ... removed two from travis (that now runs on azure instead)
+  
+  Closes #4671
 
-Daniel Stenberg (2 Oct 2018)
-- RELEASE-NOTES: synced
+- CURLOPT_VERBOSE.3: see also ERRORBUFFER
 
-Jay Satiro (1 Oct 2018)
-- [Ruslan Baratov brought this change]
+- hostip4.c: bump copyright year range
 
-  CMake: Improve config installation
-  
-  Use 'GNUInstallDirs' standard module to set destinations of installed
-  files.
-  
-  Use uppercase "CURL" names instead of lowercase "curl" to match standard
-  'FindCURL.cmake' CMake module:
-  * https://cmake.org/cmake/help/latest/module/FindCURL.html
+Marcel Raad (3 Dec 2019)
+- configure: enable IPv6 support without `getaddrinfo`
   
-  Meaning:
-  * Install 'CURLConfig.cmake' instead of 'curl-config.cmake'
-  * User should call 'find_package(CURL)' instead of 'find_package(curl)'
+  This makes it possible to recognize and connect to literal IPv6
+  addresses when `getaddrinfo` is not available, which is already the
+  case for the CMake build. This affects e.g. classic MinGW because it
+  still targets Windows 2000 by default, where `getaddrinfo` is not
+  available, but general IPv6 support is.
   
-  Use 'configure_package_config_file' function to generate
-  'CURLConfig.cmake' file. This will make 'curl-config.cmake.in' template
-  file smaller and handle components better.  E.g.  current configuration
-  report no error if user specified unknown components (note: new
-  configuration expects no components, report error if user will try to
-  specify any).
+  Instead of checking for `getaddrinfo`, check for `sockaddr_in6` as the
+  CMake build does.
   
-  Closes https://github.com/curl/curl/pull/2849
+  Closes https://github.com/curl/curl/pull/4662
 
-Daniel Stenberg (1 Oct 2018)
-- test1650: make it depend on http/2
+- curl_setup: disable IPv6 resolver without `getaddrinfo`
   
-  Follow-up to 570008c99da0ccbb as it gets link errors.
+  Also, use `CURLRES_IPV6` only for actual DNS resolution, not for IPv6
+  address support. This makes it possible to connect to IPv6 literals by
+  setting `ENABLE_IPV6` even without `getaddrinfo` support. It also fixes
+  the CMake build when using the synchronous resolver without
+  `getaddrinfo` support.
   
-  Reported-by: Michael Kaufmann
-  Closes #3068
+  Closes https://github.com/curl/curl/pull/4662
 
-- [Nate Prewitt brought this change]
-
-  MANUAL: minor grammar fix
+Daniel Stenberg (3 Dec 2019)
+- github action/azure pipeline: run 'make test-nonflaky' for tests
   
-  Noticed a typo reading through the docs.
+  To match travis and give more info on failures.
+
+- openssl: CURLSSLOPT_NO_PARTIALCHAIN can disable partial cert chains
   
-  Closes #3069
+  Closes #4655
 
-- doh: only build if h2 enabled
+- openssl: set X509_V_FLAG_PARTIAL_CHAIN
   
-  The DoH spec says "HTTP/2 [RFC7540] is the minimum RECOMMENDED version
-  of HTTP for use with DoH".
+  Have intermediate certificates in the trust store be treated as
+  trust-anchors, in the same way as self-signed root CA certificates
+  are. This allows users to verify servers using the intermediate cert
+  only, instead of needing the whole chain.
   
-  Reported-by: Marcel Raad
-  Closes #3066
-
-- test2100: require http2 to run
+  Other TLS backends already accept partial chains.
   
-  Reported-by: Marcel Raad
-  Fixes #3064
-  Closes #3065
+  Reported-by: Jeffrey Walton
+  Bug: https://curl.haxx.se/mail/lib-2019-11/0094.html
 
-- multi: fix memory leak in content encoding related error path
+- curl: show better error message when no homedir is found
   
-  ... a missing multi_done() call.
-  
-  Credit to OSS-Fuzz
-  Bug: https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=10728
-  Closes #3063
+  Reported-by: Vlastimil Ovčáčík
+  Fixes #4644
+  Closes #4665
 
-- travis: bump the Secure Transport build to use xcode 10
+- OPENSOCKETFUNCTION.3: correct the purpose description
   
-  Due to an issue with travis
-  (https://github.com/travis-ci/travis-ci/issues/9956) we've been using
-  Xcode 9.2 for darwinssl builds for a while. Now xcode 10 is offered as
-  an alternative and as it builds curl+darwinssl fine that seems like a
-  better choice.
+  Reported-by: Jeff Mears
+  Bug: https://curl.haxx.se/mail/lib-2019-12/0007.html
   
-  Closes #3062
+  Closes #4667
 
-- [Rich Turner brought this change]
+- [Peter Wu brought this change]
 
-  curl: enabled Windows VT Support and UTF-8 output
+  travis: do not use OVERRIDE_CC or OVERRIDE_CXX if empty
   
-  Enabled Console VT support (if running OS supports VT) in tool_main.c.
+  Fixes the macOS builds where OVERRIDE_CC and OVERRIDE_CXX are not set.
   
-  Fixes #3008
-  Closes #3011
+  Reported-by: Jay Satiro
+  Fixes #4659
+  Closes #4661
+  Closes #4664
 
-- multi: fix location URL memleak in error path
-  
-  Follow-up to #3044 - fix a leak OSS-Fuzz detected
-  Closes #3057
+- azure-pipelines: fix the test script
 
-Sergei Nikulov (28 Sep 2018)
-- cmake: fixed path used in generation of docs/tests during curl build through add_subdicectory(...)
+- Azure Pipelines: initial CI setup
+  
+  [skip ci]
 
-- [Brad King brought this change]
+- docs: add "added: 7.68.0" to the --etag-* docs
 
-  cmake: Backport to work with CMake 3.0 again
-  
-  Changes in commit 7867aaa9a0 (cmake: link curl to the OpenSSL targets
-  instead of lib absolute paths, 2018-07-17) and commit f826b4ce98 (cmake:
-  bumped minimum version to 3.4, 2018-07-19) required CMake 3.4 to fix
-  issue #2746.  This broke support for users on older versions of CMake
-  even if they just want to build curl and do not care whether transitive
-  dependencies work.
+- copyright: fix the year ranges for two files
   
-  Backport the logic to work with CMake 3.0 again by implementing the
-  fix only when the version of CMake is at least 3.4.
+  Follow-up to 9c1806ae
 
-Marcel Raad (27 Sep 2018)
-- curl_threads: fix classic MinGW compile break
+Jay Satiro (1 Dec 2019)
+- build: Disable Visual Studio warning "conditional expression is constant"
   
-  Classic MinGW still has _beginthreadex's return type as unsigned long
-  instead of uintptr_t [0]. uintptr_t is not even defined because of [1].
+  - Disable warning C4127 "conditional expression is constant" globally
+    in curl_setup.h for when building with Microsoft's compiler.
   
-  [0] https://sourceforge.net/p/mingw/mingw-org-wsl/ci/wsl-5.1-release/tree/mingwrt/include/process.h#l167
-  [1] https://sourceforge.net/p/mingw/mingw-org-wsl/ci/wsl-5.1-release/tree/mingwrt/include/process.h#l90
+  This mainly affects building with the Visual Studio project files found
+  in the projects dir.
   
-  Bug: https://github.com/curl/curl/issues/2924#issuecomment-424334807
-  Closes https://github.com/curl/curl/pull/3051
-
-Daniel Stenberg (26 Sep 2018)
-- configure: s/AC_RUN_IFELSE/CURL_RUN_IFELSE
+  Prior to this change the cmake and winbuild build systems already
+  disabled 4127 globally for when building with Microsoft's compiler.
+  Also, 4127 was already disabled for all build systems in the limited
+  circumstance of the WHILE_FALSE macro which disabled the warning
+  specifically for while(0). This commit removes the WHILE_FALSE macro and
+  all other cruft in favor of disabling globally in curl_setup.
   
-  fix a few leftovers
+  Background:
   
-  Fixes #3006
-  Closes #3049
-
-- [Doron Behar brought this change]
-
-  example/htmltidy: fix include paths of tidy libraries
+  We have various macros that cause 0 or 1 to be evaluated, which would
+  cause warning C4127 in Visual Studio. For example this causes it:
   
-  Closes #3050
-
-- RELEASE-NOTES: synced
-
-- Curl_http2_done: fix memleak in error path
+      #define Curl_resolver_asynch() 1
   
-  Free 'header_recvbuf' unconditionally even if 'h2' isn't (yet) set, for
-  early failures.
+  Full behavior is not clearly defined and inconsistent across versions.
+  However it is documented that since VS 2015 Update 3 Microsoft has
+  addressed this somewhat but not entirely, not warning on while(true) for
+  example.
   
-  Detected by OSS-Fuzz
+  Prior to this change some C4127 warnings occurred when I built with
+  Visual Studio using the generated projects in the projects dir.
   
-  Bug: https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=10669
-  Closes #3046
+  Closes https://github.com/curl/curl/pull/4658
 
-- http: fix memleak in rewind error path
+- openssl: retrieve reported LibreSSL version at runtime
   
-  If the rewind would fail, a strdup() would not get freed.
+  - Retrieve LibreSSL runtime version when supported (>= 2.7.1).
   
-  Detected by OSS-Fuzz
+  For earlier versions we continue to use the compile-time version.
   
-  Bug: https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=10665
-  Closes #3044
+  Ref: https://man.openbsd.org/OPENSSL_VERSION_NUMBER.3
+  
+  Closes https://github.com/curl/curl/pull/2425
 
-Viktor Szakats (24 Sep 2018)
-- test320: fix regression in [ci skip]
+- strerror: Add Curl_winapi_strerror for Win API specific errors
   
-  The value in question is coming directly from `gnutls-serv`, so it cannot
-  be modified freely.
+  - In all code call Curl_winapi_strerror instead of Curl_strerror when
+    the error code is known to be from Windows GetLastError.
   
-  Reported-by: Marcel Raad
-  Ref: https://github.com/curl/curl/commit/6ae6b2a533e8630afbb21f570305bd4ceece6348#commitcomment-30621004
-
-Daniel Stenberg (24 Sep 2018)
-- Curl_retry_request: fix memory leak
+  Curl_strerror prefers CRT error codes (errno) over Windows API error
+  codes (GetLastError) when the two overlap. When we know the error code
+  is from GetLastError it is more accurate to prefer the Windows API error
+  messages.
   
-  Detected by OSS-Fuzz
+  Reported-by: Richard Alcock
   
-  Bug: https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=10648
-  Closes #3042
+  Fixes https://github.com/curl/curl/issues/4550
+  Closes https://github.com/curl/curl/pull/4581
 
-- openssl: load built-in engines too
+Daniel Stenberg (2 Dec 2019)
+- global_init: undo the "intialized" bump in case of failure
   
-  Regression since 38203f1
+  ... so that failures in the global init function don't count as a
+  working init and it can then be called again.
   
-  Reported-by: Jean Fabrice
-  Fixes #3023
-  Closes #3040
-
-- [Christian Heimes brought this change]
+  Reported-by: Paul Groke
+  Fixes #4636
+  Closes #4653
 
-  OpenSSL: enable TLS 1.3 post-handshake auth
-  
-  OpenSSL 1.1.1 requires clients to opt-in for post-handshake
-  authentication.
+- parsedate: offer a getdate_capped() alternative
   
-  Fixes: https://github.com/curl/curl/issues/3026
-  Signed-off-by: Christian Heimes <christian@python.org>
+  ... and use internally. This function will return TIME_T_MAX instead of
+  failure if the parsed data is found to be larger than what can be
+  represented. TIME_T_MAX being the largest value curl can represent.
   
-  Closes https://github.com/curl/curl/pull/3027
+  Reviewed-by: Daniel Gustafsson
+  Reported-by: JanB on github
+  Fixes #4152
+  Closes #4651
 
-- [Even Rouault brought this change]
+- docs: add more references to curl_multi_poll
+  
+  Fixes #4643
+  Closes #4652
 
-  Curl_dedotdotify(): always nul terminate returned string.
-  
-  This fixes potential out-of-buffer access on "file:./" URL
-  
-  $ valgrind curl "file:./"
-  ==24516== Memcheck, a memory error detector
-  ==24516== Copyright (C) 2002-2015, and GNU GPL'd, by Julian Seward et al.
-  ==24516== Using Valgrind-3.11.0 and LibVEX; rerun with -h for copyright info
-  ==24516== Command: /home/even/install-curl-git/bin/curl file:./
-  ==24516==
-  ==24516== Conditional jump or move depends on uninitialised value(s)
-  ==24516==    at 0x4C31F9C: strcmp (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
-  ==24516==    by 0x4EBB315: seturl (urlapi.c:801)
-  ==24516==    by 0x4EBB568: parseurl (urlapi.c:861)
-  ==24516==    by 0x4EBC509: curl_url_set (urlapi.c:1199)
-  ==24516==    by 0x4E644C6: parseurlandfillconn (url.c:2044)
-  ==24516==    by 0x4E67AEF: create_conn (url.c:3613)
-  ==24516==    by 0x4E68A4F: Curl_connect (url.c:4119)
-  ==24516==    by 0x4E7F0A4: multi_runsingle (multi.c:1440)
-  ==24516==    by 0x4E808E5: curl_multi_perform (multi.c:2173)
-  ==24516==    by 0x4E7558C: easy_transfer (easy.c:686)
-  ==24516==    by 0x4E75801: easy_perform (easy.c:779)
-  ==24516==    by 0x4E75868: curl_easy_perform (easy.c:798)
-  
-  Was originally spotted by
-  https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=10637
-  Credit to OSS-Fuzz
+- sha256: bump the copyright year range
   
-  Closes #3039
+  Follow-up from 66e21520f
 
-Viktor Szakats (23 Sep 2018)
-- update URLs in tests
+Daniel Gustafsson (28 Nov 2019)
+- curl_setup_once: consistently use WHILE_FALSE in macros
   
-  - and one in docs/MANUAL as well
+  The WHILE_FALSE construction is used to avoid compiler warnings in
+  macro constructions. This fixes a few instances where it was not
+  used in order to keep the code consistent.
   
-  Closes https://github.com/curl/curl/pull/3038
+  Closes #4649
+  Reviewed-by: Daniel Stenberg <daniel@haxx.se>
 
-- whitespace fixes
+Daniel Stenberg (28 Nov 2019)
+- [Steve Holme brought this change]
+
+  http_ntlm: Remove duplicate NSS initialisation
   
-  - replace tabs with spaces where possible
-  - remove line ending spaces
-  - remove double/triple newlines at EOF
-  - fix a non-UTF-8 character
-  - cleanup a few indentations/line continuations
-    in manual examples
+  Given that this is performed by the NTLM code there is no need to
+  perform the initialisation in the HTTP layer. This also keeps the
+  initialisation the same as the SASL based protocols and also fixes a
+  possible compilation issue if both NSS and SSPI were to be used as
+  multiple SSL backends.
   
-  Closes https://github.com/curl/curl/pull/3037
+  Reviewed-by: Kamil Dudka
+  Closes #3935
 
-Daniel Stenberg (23 Sep 2018)
-- http: add missing return code check
+Daniel Gustafsson (28 Nov 2019)
+- checksrc: fix regexp for ASSIGNWITHINCONDITION
   
-  Detected by Coverity. CID 1439610.
+  The regexp looking for assignments within conditions was too greedy
+  and matched a too long string in the case of multiple conditionals
+  on the same line. This is basically only a problem in single line
+  macros, and the code which exemplified this was essentially:
   
-  Follow-up from 46e164069d1a523
+    do { if((x) != NULL) { x = NULL; } } while(0)
   
-  Closes #3034
-
-- ftp: don't access pointer before NULL check
+  ..where the final parenthesis of while(0) matched the regexp, and
+  the legal assignment in the block triggered the warning. Fix by
+  making the regexp less greedy by matching for the tell-tale signs
+  of the if statement ending.
   
-  Detected by Coverity. CID 1439611.
+  Also remove the one occurrence where the warning was disabled due
+  to a construction like the above, where the warning didn't apply
+  when fixed.
   
-  Follow-up from 46e164069d1a523
+  Closes #4647
+  Reviewed-by: Daniel Stenberg <daniel@haxx.se>
+
+Daniel Stenberg (28 Nov 2019)
+- RELEASE-NOTES: synced
+
+- [Maros Priputen brought this change]
 
-- unit1650: fix out of boundary access
+  curl: two new command line options for etags
   
-  Fixes #2987
-  Closes #3035
+  --etag-compare and --etag-save
+  
+  Suggested-by: Paul Hoffman
+  Fixes #4277
+  Closes #4543
+
+Daniel Gustafsson (28 Nov 2019)
+- docs: fix typos
 
-Viktor Szakats (23 Sep 2018)
-- docs/examples: URL updates
+Daniel Stenberg (28 Nov 2019)
+- mailmap: Niall O'Reilly's name
+
+- [Niall O'Reilly brought this change]
+
+  doh: use dedicated probe slots
   
-  - also update two URLs outside of docs/examples
-  - fix spelling of filename persistant.c
-  - fix three long lines that started failing checksrc.pl
+  ... to easier allow additional DNS transactions.
   
-  Closes https://github.com/curl/curl/pull/3036
+  Closes #4629
 
-- examples/Makefile.m32: sync with core [ci skip]
+- travis: build ngtcp2 with --enable-lib-only
   
-  also:
-  - fix two warnings in synctime.c (one of them Windows-specific)
-  - upgrade URLs in synctime.c and remove a broken one
+  ... makes it skip the examples and other stuff we don't neeed.
   
-  Closes https://github.com/curl/curl/pull/3033
+  Closes #4646
 
-Daniel Stenberg (22 Sep 2018)
-- examples/parseurl.c: show off the URL API a bit
+- [David Benjamin brought this change]
+
+  ngtcp2: fix thread-safety bug in error-handling
+  
+  ERR_error_string(NULL) should never be called. It places the error in a
+  global buffer, which is not thread-safe. Use ERR_error_string_n with a
+  local buffer instead.
   
-  Closes #3030
+  Closes #4645
 
-- SECURITY-PROCESS: mention the bountygraph program [ci skip]
+- travis: export the CC/CXX variables when set
   
-  Closes #3032
+  Suggested-by: Peter Wu
+  Fixes #4637
+  Closes #4640
 
-- url: use the URL API internally as well
+Marcel Raad (26 Nov 2019)
+- dist: add error-codes.pl
   
-  ... to make it a truly unified URL parser.
+  Follow-up to commit 74f441c6d31.
+  This should fix test 1175 when run via the daily source tarballs.
   
-  Closes #3017
+  Closes https://github.com/curl/curl/pull/4638
 
-Viktor Szakats (22 Sep 2018)
-- URL and mailmap updates, remove an obsolete directory [ci skip]
+Daniel Stenberg (26 Nov 2019)
+- [John Schroeder brought this change]
+
+  curl: fix --upload-file . hangs if delay in STDIN
+  
+  Attempt to unpause a busy read in the CURLOPT_XFERINFOFUNCTION.
   
-  Closes https://github.com/curl/curl/pull/3031
+  When uploading from stdin in non-blocking mode, a delay in reading
+  the stream (EAGAIN) causes curl to pause sending data
+  (CURL_READFUNC_PAUSE).  Prior to this change, a busy read was
+  detected and unpaused only in the CURLOPT_WRITEFUNCTION handler.
+  This change performs the same busy read handling in a
+  CURLOPT_XFERINFOFUNCTION handler.
+  
+  Fixes #2051
+  Closes #4599
+  Reported-by: bdry on github
 
-Daniel Stenberg (22 Sep 2018)
-- RELEASE-NOTES: synced
+- [John Schroeder brought this change]
 
-- configure: force-use -lpthreads on HPUX
+  XFERINFOFUNCTION: support CURL_PROGRESSFUNC_CONTINUE
   
-  When trying to detect pthreads use on HPUX the checks will succeed
-  without the correct -l option but then end up failing at run-time.
+  (also for PROGRESSFUNCTION)
   
-  Reported-by: Eason-Yu on github
-  Fixes #2697
-  Closes #3025
+  By returning this value from the callback, the internal progress
+  function call is still called afterward.
+  
+  Closes #4599
 
-- [Erik Minekus brought this change]
+- [Michael Forney brought this change]
 
-  Curl_saferealloc: Fixed typo in docblock
+  TLS: add BearSSL vtls implementation
   
-  Closes #3029
+  Closes #4597
 
-- urlapi: fix support for address scope in IPv6 numerical addresses
+- curl_multi_wakeup.3: add example and AVAILABILITY
   
-  Closes #3024
+  Reviewed-by: Gergely Nagy
+  Closes #4635
 
-- [Loganaden Velvindron brought this change]
+- [Gergely Nagy brought this change]
 
-  GnutTLS: TLS 1.3 support
+  multi: add curl_multi_wakeup()
   
-  Closes #2971
-
-- TODO: c-ares and CURLOPT_OPENSOCKETFUNCTION
+  This commit adds curl_multi_wakeup() which was previously in the TODO
+  list under the curl_multi_unblock name.
   
-  Removed DoH.
+  On some platforms and with some configurations this feature might not be
+  available or can fail, in these cases a new error code
+  (CURLM_WAKEUP_FAILURE) is returned from curl_multi_wakeup().
   
-  Closes #2734
+  Fixes #4418
+  Closes #4608
 
-Jay Satiro (20 Sep 2018)
-- vtls: fix ssl version "or later" behavior change for many backends
+Jay Satiro (24 Nov 2019)
+- [Xiaoyin Liu brought this change]
+
+  schannel: fix --tls-max for when min is --tlsv1 or default
   
-  - Treat CURL_SSLVERSION_MAX_NONE the same as
-    CURL_SSLVERSION_MAX_DEFAULT. Prior to this change NONE would mean use
-    the minimum version also as the maximum.
+  Prior to this change schannel ignored --tls-max (CURL_SSLVERSION_MAX_
+  macros) when --tlsv1 (CURL_SSLVERSION_TLSv1) or default TLS
+  (CURL_SSLVERSION_DEFAULT), using a max of TLS 1.2 always.
   
-  This is a follow-up to 6015cef which changed the behavior of setting
-  the SSL version so that the requested version would only be the minimum
-  and not the maximum. It appears it was (mostly) implemented in OpenSSL
-  but not other backends. In other words CURL_SSLVERSION_TLSv1_0 used to
-  mean use just TLS v1.0 and now it means use TLS v1.0 *or later*.
+  Closes https://github.com/curl/curl/pull/4633
+
+- checksrc.bat: Add a check for vquic and vssh directories
   
-  - Fix CURL_SSLVERSION_MAX_DEFAULT for OpenSSL.
+  Ref: https://github.com/curl/curl/pull/4607
+
+- projects: Fix Visual Studio projects SSH builds
   
-  Prior to this change CURL_SSLVERSION_MAX_DEFAULT with OpenSSL was
-  erroneously treated as always TLS 1.3, and would cause an error if
-  OpenSSL was built without TLS 1.3 support.
+  - Generate VQUIC and VSSH filenames in Visual Studio project files.
   
-  Co-authored-by: Daniel Gustafsson
+  Prior to this change generated Visual Studio project configurations that
+  enabled SSH did not build properly. Broken since SSH files were moved to
+  lib/vssh 3 months ago in 5b2d703.
   
-  Fixes https://github.com/curl/curl/issues/2969
-  Closes https://github.com/curl/curl/pull/3012
+  Fixes https://github.com/curl/curl/issues/4492
+  Fixes https://github.com/curl/curl/issues/4630
+  Closes https://github.com/curl/curl/pull/4607
+
+Daniel Stenberg (23 Nov 2019)
+- RELEASE-NOTES: synced
 
-Daniel Stenberg (20 Sep 2018)
-- certs: generate tests certs with sha256 digest algorithm
+Jay Satiro (22 Nov 2019)
+- openssl: Revert to less sensitivity for SYSCALL errors
   
-  As OpenSSL 1.1.1 starts to complain and fail on sha1 CAs:
+  - Disable the extra sensitivity except in debug builds (--enable-debug).
   
-  "SSL certificate problem: CA signature digest algorithm too weak"
+  - Improve SYSCALL error message logic in ossl_send and ossl_recv so that
+    "No error" / "Success" socket error text isn't shown on SYSCALL error.
   
-  Closes #3014
-
-- urlapi: document the error codes, remove two unused ones
+  Prior to this change 0ab38f5 (precedes 7.67.0) increased the sensitivity
+  of OpenSSL's SSL_ERROR_SYSCALL error so that abrupt server closures were
+  also considered errors. For example, a server that does not send a known
+  protocol termination point (eg HTTP content length or chunked encoding)
+  _and_ does not send a TLS termination point (close_notify alert) would
+  cause an error if it closed the connection.
   
-  Assisted-by: Daniel Gustafsson
-  Closes #3019
+  To be clear that behavior made it into release build 7.67.0
+  unintentionally. Several users have reported it as an issue.
+  
+  Ultimately the idea is a good one, since it can help prevent against a
+  truncation attack. Other SSL backends may already behave similarly (such
+  as Windows native OS SSL Schannel). However much more of our user base
+  is using OpenSSL and there is a mass of legacy users in that space, so I
+  think that behavior should be partially reverted and then rolled out
+  slowly.
+  
+  This commit changes the behavior so that the increased sensitivity is
+  disabled in all curl builds except curl debug builds (DEBUGBUILD). If
+  after a period of time there are no major issues then it can be enabled
+  in dev and release builds with the newest OpenSSL (1.1.1+), since users
+  using the newest OpenSSL are the least likely to have legacy problems.
+  
+  Bug: https://github.com/curl/curl/issues/4409#issuecomment-555955794
+  Reported-by: Bjoern Franke
+  
+  Fixes https://github.com/curl/curl/issues/4624
+  Closes https://github.com/curl/curl/pull/4623
+
+- [Daniel Stenberg brought this change]
 
-- urlapi: add CURLU_GUESS_SCHEME and fix hostname acceptance
+  openssl: improve error message for SYSCALL during connect
   
-  In order for this API to fully work for libcurl itself, it now offers a
-  CURLU_GUESS_SCHEME flag that makes it "guess" scheme based on the host
-  name prefix just like libcurl always did. If there's no known prefix, it
-  will guess "http://".
+  Reported-by: Paulo Roberto Tomasi
+  Bug: https://curl.haxx.se/mail/archive-2019-11/0005.html
+  
+  Closes https://github.com/curl/curl/pull/4593
+
+Daniel Stenberg (22 Nov 2019)
+- test1175: verify symbols-in-versions and libcurl-errors.3 in sync
   
-  Separately, it relaxes the check of the host name so that IDN host names
-  can be passed in as well.
+  Closes #4628
+
+- include: make CURLE_HTTP3 use a new error code
   
-  Both these changes are necessary for libcurl itself to use this API.
+  To avoid potential issues with error code reuse.
   
-  Assisted-by: Daniel Gustafsson
-  Closes #3018
+  Reported-by: Christoph M. Becker
+  Assisted-by: Dan Fandrich
+  Fixes #4601
+  Closes #4627
+
+- bump: next release will be 7.68.0
 
-Kamil Dudka (19 Sep 2018)
-- nss: try to connect even if libnssckbi.so fails to load
+- curl: add --parallel-immediate
   
-  One can still use CA certificates stored in NSS database.
+  Starting with this change when doing parallel transfers, without this
+  option set, curl will prefer to create new transfers multiplexed on an
+  existing connection rather than creating a brand new one.
   
-  Reported-by: Maxime Legros
-  Bug: https://curl.haxx.se/mail/lib-2018-09/0077.html
+  --parallel-immediate can be set to tell curl to prefer to use new
+  connections rather than to wait and try to multiplex.
   
-  Closes #3016
+  libcurl-wise, this means that curl will set CURLOPT_PIPEWAIT by default
+  on parallel transfers.
+  
+  Suggested-by: Tom van der Woerdt
+  Closes #4500
+
+Daniel Gustafsson (20 Nov 2019)
+- [Victor Magierski brought this change]
 
-Daniel Gustafsson (19 Sep 2018)
-- urlapi: don't set value which is never read
+  docs: fix typos
   
-  In the CURLUPART_URL case, there is no codepath which invokes url
-  decoding so remove the assignment of the urldecode variable. This
-  fixes the deadstore bug-report from clang static analysis.
+  Change 'experiemental' to 'experimental'.
   
-  Closes #3015
-  Reviewed-by: Daniel Stenberg <daniel@haxx.se>
+  Closes #4618
+  Reviewed-by: Daniel Gustafsson <daniel@yesql.se>
 
-- todo: Update reference to already done item
+Jay Satiro (18 Nov 2019)
+- projects: Fix Visual Studio wolfSSL configurations
   
-  TODO item 1.1 was implemented in commit 946ce5b61f, update reference
-  to it with instead referencing the implemented option.
+  - s/USE_CYASSL/USE_WOLFSSL/
   
-  Closes #3013
-  Reviewed-by: Daniel Stenberg <daniel@haxx.se>
+  - Remove old compatibility macros.
+  
+  Follow-up to 1c6c59a from several months ago when CyaSSL named symbols
+  were renamed to wolfSSL. The wolfSSL library was formerly named CyaSSL
+  and we kept using their old name for compatibility reasons, until
+  earlier this year.
 
-Daniel Stenberg (18 Sep 2018)
+Daniel Stenberg (18 Nov 2019)
 - RELEASE-NOTES: synced
 
-- [slodki brought this change]
+- [Javier Blazquez brought this change]
 
-  cmake: don't require OpenSSL if USE_OPENSSL=OFF
-  
-  User must have OpenSSL installed even if not used by libcurl at all
-  since 7.61.1 release.  Broken at
-  7867aaa9a01decf93711428462335be8cef70212
+  ngtcp2: use overflow buffer for extra HTTP/3 data
   
-  Reviewed-by: Sergei Nikulov
-  Closes #3001
+  Fixes #4525
+  Closes #4603
 
-- curl_multi_wait: call getsock before figuring out timeout
+- altsvc: bump to h3-24
   
-  .... since getsock may update the expiry timer.
+  ... as both ngtcp2 and quiche now support that in their master branches
   
-  Fixes #2996
-  Closes #3000
+  Closes #4604
 
-- examples/http2-pushinmemory: receive HTTP/2 pushed files in memory
+- ngtcp2: free used resources on disconnect
   
-  Closes #3004
+  Fixes #4614
+  Closes #4615
 
-Daniel Gustafsson (18 Sep 2018)
-- darwinssl: Fix realloc memleak
+- ngtcp2: handle key updates as ngtcp2 master branch tells us
   
-  The reallocation was using the input pointer for the return value, which
-  leads to a memory leak on reallication failure. Fix by instead use the
-  safe internal API call Curl_saferealloc().
+  Reviewed-by: Tatsuhiro Tsujikawa
   
-  Closes #3005
-  Reviewed-by: Daniel Stenberg <daniel@haxx.se>
-  Reviewed-by: Nick Zitzmann <nickzman@gmail.com>
+  Fixes #4612
+  Closes #4613
 
-- [Kruzya brought this change]
+Jay Satiro (17 Nov 2019)
+- [Gergely Nagy brought this change]
 
-  examples: Fix memory leaks from realloc errors
+  multi: Fix curl_multi_poll wait when extra_fds && !extra_nfds
+  
+  Prior to this change:
+  
+  The check if an extra wait is necessary was based not on the
+  number of extra fds but on the pointer.
+  
+  If a non-null pointer was given in extra_fds, but extra_nfds
+  was zero, then the wait was skipped even though poll was not
+  called.
   
-  Make sure to not overwrite the reallocated pointer in realloc() calls
-  to avoid a memleak on memory errors.
+  Closes https://github.com/curl/curl/pull/4610
 
-- memory: add missing curl_printf header
+- lib: Move lib/ssh.h -> lib/vssh/ssh.h
   
-  ftp_send_command() was using vsnprintf() without including the libcurl
-  *rintf() replacement header. Fix by including curl_printf.h and also
-  add curl_memory.h while at it since memdebug.h depends on it.
+  Follow-up to 5b2d703 which moved ssh source files to vssh.
   
-  Closes #2999
-  Reviewed-by: Daniel Stenberg <daniel@haxx.se>
+  Closes https://github.com/curl/curl/pull/4609
 
-Daniel Stenberg (16 Sep 2018)
-- [Si brought this change]
+Daniel Stenberg (16 Nov 2019)
+- [Andreas Falkenhahn brought this change]
 
-  curl: update --tlsv* descriptions in --help output
+  INSTALL.md: provide Android build instructions
   
-  Closes #2994
+  Closes #4606
+
+- [Niall O'Reilly brought this change]
 
-- http: made Curl_add_buffer functions take a pointer-pointer
+  doh: improced both encoding and decoding
   
-  ... so that they can clear the original pointer on failure, which makes
-  the error-paths and their cleanups easier.
+  Improved estimation of expected_len and updated related comments;
+  increased strictness of QNAME-encoding, adding error detection for empty
+  labels and names longer than the overall limit; avoided treating DNAME
+  as unexpected;
   
-  Closes #2992
-
-- http2: fix memory leaks on error-path
-
-- [Rikard Falkeborn brought this change]
+  updated unit test 1655 with more thorough set of proofs and tests
+  
+  Closes #4598
 
-  libtest: Add chkdecimalpoint to .gitignore
+- ngtcp2: increase QUIC window size when data is consumed
   
-  Closes #2998
+  Assisted-by: Javier Blazquez
+  Ref #4525 (partial fix)
+  Closes #4600
 
-Viktor Szakats (14 Sep 2018)
-- secure Openwall URLs
+- [Melissa Mears brought this change]
 
-Daniel Stenberg (14 Sep 2018)
-- openssl: show "proper" version number for libressl builds
+  config-win32: cpu-machine-OS for Windows on ARM
   
-  Closes #2989
+  Define the OS macro properly for Windows on ARM builds.  Also, we might
+  as well add the GCC-style IA-64 macro.
+  
+  Closes #4590
 
-- [Rainer Jung brought this change]
+- examples: add multi-poll.c
+  
+  Show how curl_multi_poll() makes it even easier to use the multi
+  interface.
+  
+  Closes #4596
 
-  openssl: assume engine support in 0.9.8 or later
+- multi_poll: avoid busy-loop when called without easy handles attached
   
-  Fixes #2983
-  Closes #2988
+  Fixes #4594
+  Closes #4595
+  Reported-by: 3dyd on github
 
-Daniel Gustafsson (13 Sep 2018)
-- sendf: use failf() rather than Curl_failf()
+- curl: fix -T globbing
   
-  The failf() macro is the name used for invoking Curl_failf(). While
-  there isn't a way to turn off failf like there is for infof, but it's
-  still a good idea to use the macro.
+  Regression from e59371a4936f8 (7.67.0)
   
-  Reviewed-by: Daniel Stenberg <daniel@haxx.se>
+  Added test 490, 491 and 492 to verify the functionality.
+  
+  Reported-by: Kamil Dudka
+  Reported-by: Anderson Sasaki
+  
+  Fixes #4588
+  Closes #4591
+
+- HISTORY: added cmake, HTTP/3 and parallel downloads with curl
 
-- sendf: Fix whitespace in infof/failf concatenation
+- quiche: reject headers in the wrong order
   
-  Strings broken on multiple rows in the .c file need to have appropriate
-  whitespace padding on either side of the concatenation point to render
-  a correct amalgamated string. Fix by adding a space at the occurrences
-  found.
+  Pseudo header MUST come before regular headers or cause an error.
   
-  Closes #2986
-  Reviewed-by: Daniel Stenberg <daniel@haxx.se>
+  Reported-by: Cynthia Coan
+  Fixes #4571
+  Closes #4584
 
-- krb5: fix memory leak in krb_auth
+- openssl: prevent recursive function calls from ctx callbacks
   
-  The FTP command allocated by aprintf() must be freed after usage.
+  Follow the pattern of many other callbacks.
   
-  Reviewed-by: Daniel Stenberg <daniel@haxx.se>
+  Ref: #4546
+  Closes #4585
 
-- ftp: include command in Curl_ftpsend sendbuffer
+- CURL-DISABLE: initial docs for the CURL_DISABLE_* defines
   
-  Commit 8238ba9c5f10414a88f502bf3f5d5a42d632984c inadvertently removed
-  the actual command to be sent from the send buffer in a refactoring.
-  Add back copying the command into the buffer. Also add more guards
-  against malformed input while at it.
+  The disable-scan script used in test 1165 is extended to also verify
+  that the docs cover all used defines and all defines offered by
+  configure.
   
-  Closes #2985
-  Reviewed-by: Daniel Stenberg <daniel@haxx.se>
+  Reported-by: SLDiggie on github
+  Fixes #4545
+  Closes #4587
 
-- ntlm_wb: Fix memory leaks in ntlm_wb_response
+- remove_handle: clear expire timers after multi_done()
   
-  When erroring out on a request being too large, the existing buffer was
-  leaked. Fix by explicitly freeing on the way out.
+  Since 59041f0, a new timer might be set in multi_done() so the clearing
+  of the timers need to happen afterwards!
   
-  Closes #2966
-  Reviewed-by: Daniel Stenberg <daniel@haxx.se>
+  Reported-by: Max Kellermann
+  Fixes #4575
+  Closes #4583
 
-Daniel Stenberg (13 Sep 2018)
-- [Yiming Jing brought this change]
+Marcel Raad (10 Nov 2019)
+- test1558: use double slash after file:
+  
+  Classic MinGW / MSYS 1 doesn't support `MSYS2_ARG_CONV_EXCL`, so this
+  test unnecessarily failed when using `file:/` instead of `file:///`.
+  
+  Closes https://github.com/curl/curl/pull/4554
 
-  travis: build the MesaLink vtls backend with MesaLink 0.7.1
+Daniel Stenberg (10 Nov 2019)
+- pause: avoid updating socket if done was already called
+  
+  ... avoids unnecesary recursive risk when the transfer is already done.
+  
+  Reported-by: Richard Bowker
+  Fixes #4563
+  Closes #4574
 
-- [Yiming Jing brought this change]
-
-  runtests.pl: run tests against the MesaLink vtls backend
-
-- [Yiming Jing brought this change]
-
-  vtls: add a MesaLink vtls backend
+Jay Satiro (9 Nov 2019)
+- strerror: Fix an error looking up some Windows error strings
   
-  Closes #2984
-
-- [Yiming Jing brought this change]
-
-  configure.ac: add a MesaLink vtls backend
-
-- [Dave Reisner brought this change]
-
-  curl_url_set.3: properly escape \n in example code
+  - Use FORMAT_MESSAGE_IGNORE_INSERTS to ignore format specifiers in
+    Windows error strings.
   
-  This yields
+  Since we are not in control of the error code we don't know what
+  information may be needed by the error string's format specifiers.
   
-    "the scheme is %s\n"
+  Prior to this change Windows API error strings which contain specifiers
+  (think specifiers like similar to printf specifiers) would not be shown.
+  The FormatMessage Windows API call which turns a Windows error code into
+  a string could fail and set error ERROR_INVALID_PARAMETER if that error
+  string contained a format specifier. FormatMessage expects a va_list for
+  the specifiers, unless inserts are ignored in which case no substitution
+  is attempted.
   
-  instead of
-  
-    "the scheme is %s0
-  
-  Closes #2970
+  Ref: https://devblogs.microsoft.com/oldnewthing/20071128-00/?p=24353
 
-- [Dave Reisner brought this change]
+- [r-a-sattarov brought this change]
 
-  curl_url_set.3: fix typo in reference to CURLU_APPENDQUERY
-
-- urlglob: improve error message
+  system.h: fix for MCST lcc compiler
   
-  to help user understand what the problem is
+  Fixed build by MCST lcc compiler on MCST Elbrus 2000 architecture and do
+  some code cleanup.
   
-  Reported-by: Daniel Shahaf
+  e2k (Elbrus 2000) - this is VLIW/EPIC architecture, like Intel Itanium
+  architecture.
   
-  Fixes #2763
-  Closes #2977
-
-- [Yiming Jing brought this change]
-
-  tests/certs: rebuild certs with 2048-bit RSA keys
+  Ref: https://en.wikipedia.org/wiki/Elbrus_2000
   
-  The previous test certificates contained RSA keys of only 1024 bits.
-  However, RSA claims that 1024-bit RSA keys are likely to become
-  crackable some time before 2010. The NIST recommends at least 2048-bit
-  keys for RSA for now.
+  Closes https://github.com/curl/curl/pull/4576
+
+Daniel Stenberg (8 Nov 2019)
+- TODO: curl_multi_unblock
   
-  Better use full 2048 also for testing.
+  Closes #4418
+
+- TODO: Run web-platform-tests url tests
   
-  Closes #2973
+  Closes #4477
 
-Daniel Gustafsson (12 Sep 2018)
-- TODO: fix typo in item
+- TODO: 1.4 alt-svc sharing
   
-  Closes #2968
-  Reviewed-by: Daniel Stenberg <daniel@haxx.se>
+  Closes #4476
 
-Marcel Raad (12 Sep 2018)
-- anyauthput: fix compiler warning on 64-bit Windows
+- test1560: require IPv6 for IPv6 aware URL parsing
   
-  On Windows, the read function from <io.h> is used, which has its byte
-  count parameter as unsigned int instead of size_t.
+  The URL parser function can't reject a bad IPv6 address properly when
+  curl was built without IPv6 support.
   
-  Closes https://github.com/curl/curl/pull/2972
+  Reported-by: Marcel Raad
+  Fixes #4556
+  Closes #4572
 
-Viktor Szakats (12 Sep 2018)
-- lib: fix gcc8 warning on Windows
+- checksrc: repair the copyrightyear check
   
-  Closes https://github.com/curl/curl/pull/2979
-
-Jay Satiro (12 Sep 2018)
-- openssl: fix gcc8 warning
+  - Consider a modified file to be committed this year.
   
-  - Use memcpy instead of strncpy to copy a string without termination,
-    since gcc8 warns about using strncpy to copy as many bytes from a
-    string as its length.
+  - Make the travis CHECKSRC also do COPYRIGHTYEAR scan in examples and
+    includes
   
-  Suggested-by: Viktor Szakats
+  - Ignore 0 parents when getting latest commit date of file.
   
-  Closes https://github.com/curl/curl/issues/2980
-
-Daniel Stenberg (10 Sep 2018)
-- libcurl-url.3: overview man page for the URL API
+  since in the CI we're dealing with a truncated repo of last 50 commits,
+  the file's most recent commit may not be available. when this happens
+  git log and rev-list show the initial commit (ie first commit not to be
+  truncated) but that's incorrect so ignore it.
   
-  Closes #2967
-
-- example/asiohiper: insert warning comment about its status
+  Ref: https://github.com/curl/curl/pull/4547
   
-  This example is simply not working correctly but there's nobody around
-  with the skills and energy to fix it.
+  Closes https://github.com/curl/curl/pull/4549
   
-  Closes #2407
+  Co-authored-by: Jay Satiro
 
-Kamil Dudka (10 Sep 2018)
-- docs/cmdline-opts: update the documentation of --tlsv1.0
+- copyrights: fix copyright year range
   
-  ... to reflect the changes in 6015cefb1b2cfde4b4850121c42405275e5e77d9
+  .. because checksrc's copyright year check stopped working.
   
-  Closes #2955
-
-- docs/examples: do not wait when no transfers are running
+  Ref: https://github.com/curl/curl/pull/4547
   
-  Closes #2948
+  Closes https://github.com/curl/curl/pull/4549
 
-Daniel Stenberg (10 Sep 2018)
-- [Daniel Gustafsson brought this change]
+- RELEASE-NOTES: synced
 
-  cookies: Move failure case label to end of function
-  
-  Rather than jumping backwards to where failure cleanup happens
-  to be performed, move the failure case to end of the function
-  where it is expected per existing coding convention.
-  
-  Closes #2965
+- curlver: bump to 7.67.1
 
-- [Daniel Gustafsson brought this change]
+- mailmap: fixup Massimiliano Fantuzzi
 
-  misc: fix typos in comments
+- scripts/contributors: make committers get included too
   
-  Closes #2963
+  in addition to authors
 
-- [Daniel Gustafsson brought this change]
+Jay Satiro (8 Nov 2019)
+- [Massimiliano Fantuzzi brought this change]
 
-  cookies: fix leak when writing cookies to file
-  
-  If the formatting fails, we error out on a fatal error and
-  clean up on the way out. The array was however freed within
-  the wrong scope and was thus never freed in case the cookies
-  were written to a file instead of STDOUT.
+  configure: fix typo in help text
   
-  Closes #2957
+  Closes https://github.com/curl/curl/pull/4570
 
-- [Daniel Gustafsson brought this change]
+Daniel Stenberg (7 Nov 2019)
+- [Christian Schmitz brought this change]
 
-  cookies: Remove redundant expired check
+  ntlm: USE_WIN32_CRYPTO check removed to get USE_NTLM2SESSION set
   
-  Expired cookies have already been purged at a later expiration time
-  before this check, so remove the redundant check.
-  
-  closes #2962
+  Closes #3704
 
-- ntlm_wb: bail out if the response gets overly large
-  
-  Exit the realloc() loop if the response turns out ridiculously large to
-  avoid worse problems.
+Jay Satiro (6 Nov 2019)
+- [Wyatt O'Day brought this change]
+
+  build: fix for CURL_DISABLE_DOH
   
-  Reported-by: Harry Sintonen
-  Closes #2959
+  Fixes https://github.com/curl/curl/issues/4565
+  Closes https://github.com/curl/curl/pull/4566
 
-- [Daniel Gustafsson brought this change]
+- [Leonardo Taccari brought this change]
 
-  url.c: fix comment typo and indentation
+  configure: avoid unportable `==' test(1) operator
   
-  Closes #2960
+  Closes https://github.com/curl/curl/pull/4567
 
-- urlapi: avoid derefencing a possible NULL pointer
-  
-  Coverity CID 1439134
+Version 7.67.0 (5 Nov 2019)
 
+Daniel Stenberg (5 Nov 2019)
 - RELEASE-NOTES: synced
-
-Marcel Raad (8 Sep 2018)
-- test324: fix after 3f3b26d6feb0667714902e836af608094235fca2
   
-  The expected error code is now 60. 51 is dead.
-
-Daniel Stenberg (8 Sep 2018)
-- curl_url_set.3: correct description
+  The 7.67.0 release
 
-- curl_url-docs: fix AVAILABILITY as Added in curl 7.62.0
+- THANKS: add new names from 7.67.0
 
-- URL-API
+- configure: only say ipv6 enabled when the variable is set
   
-  See header file and man pages for API. All documented API details work
-  and are tested in the 1560 test case.
+  Previously it could say "IPv6: enabled" at the end of the configure run
+  but the define wasn't set because of a missing getaddrinfo().
   
-  Closes #2842
+  Reported-by: Marcel Raad
+  Fixes #4555
+  Closes #4560
 
-- curl_easy_upkeep: removed 'conn' from the name
+Marcel Raad (2 Nov 2019)
+- certs/Server-localhost-lastSAN-sv: regenerate with sha256
   
-  ... including the associated option.
+  All other certificates were regenerated in commit ba782baac30, but
+  this one was missed.
+  Fixes test3001 on modern systems.
   
-  Fixes #2951
-  Closes #2952
+  Closes https://github.com/curl/curl/pull/4551
 
-- [Max Dymond brought this change]
+Daniel Stenberg (2 Nov 2019)
+- [Vilhelm Prytz brought this change]
 
-  upkeep: add a connection upkeep API: curl_easy_conn_upkeep()
-  
-  Add functionality so that protocols can do custom keepalive on their
-  connections, when an external API function is called.
+  copyrights: update all copyright notices to 2019 on files changed this year
   
-  Add docs for the new options in 7.62.0
-  
-  Closes #1641
+  Closes #4547
 
-- [Philipp Waehnert brought this change]
+- [Bastien Bouclet brought this change]
 
-  configure: add option to disable automatic OpenSSL config loading
-  
-  Sometimes it may be considered a security risk to load an external
-  OpenSSL configuration automatically inside curl_global_init(). The
-  configuration option --disable-ssl-auto-load-config disables this
-  automatism. The Windows build scripts winbuild/Makefile.vs provide a
-  corresponding option ENABLE_SSL_AUTO_LOAD_CONFIG accepting a boolean
-  value.
+  mbedtls: add error message for cert validity starting in the future
   
-  Setting neither of these options corresponds to the previous behavior
-  loading the external OpenSSL configuration automatically.
-  
-  Fixes #2724
-  Closes #2791
+  Closes #4552
 
-- doh: minor edits to please Coverity
+Jay Satiro (1 Nov 2019)
+- schannel_verify: Fix concurrent openings of CA file
+  
+  - Open the CA file using FILE_SHARE_READ mode so that others can read
+    from it as well.
   
-  The gcc typecheck macros and coverity combined made it warn on the 2nd
-  argument for ERROR_CHECK_SETOPT(). Here's minor rearrange to please it.
+  Prior to this change our schannel code opened the CA file without
+  sharing which meant concurrent openings (eg an attempt from another
+  thread or process) would fail during the time it was open without
+  sharing, which in curl's case would cause error:
+  "schannel: failed to open CA file".
   
-  Coverity CID 1439115 and CID 1439114.
+  Bug: https://curl.haxx.se/mail/lib-2019-10/0104.html
+  Reported-by: Richard Alcock
 
-- schannel: avoid switch-cases that go to default anyway
+Daniel Stenberg (31 Oct 2019)
+- gtls: make gnutls_bye() not wait for response on shutdown
   
-  SEC_E_APPLICATION_PROTOCOL_MISMATCH isn't defined in some versions of
-  mingw and would require an ifdef otherwise.
+  ... as it can make it wait there for a long time for no good purpose.
   
-  Reported-by: Thomas Glanzmann
-  Approved-by: Marc Hörsken
-  Bug: https://curl.haxx.se/mail/lib-2018-09/0020.html
-  Closes #2950
+  Patched-by: Jay Satiro
+  Reported-by: Bylon2 on github
+  Adviced-by: Nikos Mavrogiannopoulos
+  
+  Fixes #4487
+  Closes #4541
 
-- [Nicklas Avén brought this change]
+- [Michał Janiszewski brought this change]
 
-  imap: change from "FETCH" to "UID FETCH"
+  appveyor: publish artifacts on appveyor
   
-  ... and add "MAILINDEX".
+  This allows obtaining upstream builds of curl directly from appveyor for
+  all the available configurations
   
-  As described in #2789, this is a suggested solution.  Changing UID=xx to
-  actually get mail with UID xx and add "MAILINDEX" to get a mail with a
-  special index in the mail box (old behavior).  So MAILINDEX=1 gives the
-  first non deleted mail in the mail box.
-  
-  Fixes #2789
-  Closes #2815
+  Closes #4509
 
-- CURLOPT_UPLOAD_BUFFERSIZE: set upload buffer size
+- url: make Curl_close() NULLify the pointer too
   
-  This is step 3 of #2888.
+  This is the common pattern used in the code and by a unified approach we
+  avoid mistakes.
   
-  Fixes #2888
-  Closes #2896
-
-- travis: add the DOH tests to the torture testing
+  Closes #4534
 
-- DOH: add test case 1650 and 2100
+- [Trivikram Kamat brought this change]
 
-- curl: --doh-url added
-
-- setopt: add CURLOPT_DOH_URL
+  INSTALL: add missing space for configure commands
   
-  Closes #2668
-
-- [Han Han brought this change]
+  Closes #4539
 
-  ssl: deprecate CURLE_SSL_CACERT in favour of a unified error code
+- url: Curl_free_request_state() should also free doh handles
   
-  Long live CURLE_PEER_FAILED_VERIFICATION
-
-- [Han Han brought this change]
+  ... or risk DoH memory leaks.
+  
+  Reported-by: Paul Dreik
+  Fixes #4463
+  Closes #4527
 
-  x509asn1: return CURLE_PEER_FAILED_VERIFICATION on failure to parse cert
+- examples: remove the "this exact code has not been verified"
   
-  CURLE_PEER_FAILED_VERIFICATION makes more sense because Curl_parseX509
-  does not allocate memory internally as its first argument is a pointer
-  to the certificate structure. The same error code is also returned by
-  Curl_verifyhost when its call to Curl_parseX509 fails so the change
-  makes error handling more consistent.
+  ... as really confuses the reader to not know what to believe!
 
-- [Han Han brought this change]
+- [Trivikram Kamat brought this change]
 
-  openssl: return CURLE_PEER_FAILED_VERIFICATION on failure to parse issuer
+  HTTP3: fix typo somehere1 > somewhere1
   
-  Failure to extract the issuer name from the server certificate should
-  return a more specific error code like on other TLS backends.
+  Closes #4535
 
-- [Han Han brought this change]
+Jay Satiro (28 Oct 2019)
+- [Javier Blazquez brought this change]
 
-  schannel: unified error code handling
+  HTTP3: fix invalid use of sendto for connected UDP socket
   
-  Closes #2901
+  On macOS/BSD, trying to call sendto on a connected UDP socket fails
+  with a EISCONN error. Because the singleipconnect has already called
+  connect on the socket when we're trying to use it for QUIC transfers
+  we need to use plain send instead.
+  
+  Fixes #4529
+  Closes https://github.com/curl/curl/pull/4533
 
-- [Han Han brought this change]
+Daniel Stenberg (28 Oct 2019)
+- RELEASE-NOTES: synced
 
-  darwinssl: more specific and unified error codes
-  
-  Closes #2901
+- [Javier Blazquez brought this change]
 
-- CURLOPT_DNS_USE_GLOBAL_CACHE: deprecated
+  HTTP3: fix Windows build
   
-  Disable the CURLOPT_DNS_USE_GLOBAL_CACHE option and mark it for
-  deprecation and complete removal in six months.
+  The ngtcp2 QUIC backend was using the MSG_DONTWAIT flag for send/recv
+  in order to perform nonblocking operations. On Windows this flag does
+  not exist. Instead, the socket must be set to nonblocking mode via
+  ioctlsocket.
   
-  Bug: https://curl.haxx.se/mail/lib-2018-09/0010.html
-  Closes #2942
+  This change sets the nonblocking flag on UDP sockets used for QUIC on
+  all platforms so the use of MSG_DONTWAIT is not needed.
+  
+  Fixes #4531
+  Closes #4532
 
-- url: default to CURL_HTTP_VERSION_2TLS if built h2-enabled
+Marcel Raad (27 Oct 2019)
+- appveyor: add --disable-proxy autotools build
+  
+  This would have caught issue #3926.
   
-  Closes #2709
+  Also make formatting more consistent.
+  
+  Closes https://github.com/curl/curl/pull/4526
 
-- multiplex: enable by default
+Daniel Stenberg (25 Oct 2019)
+- appveyor: make winbuilds with DEBUG=no/yes and VS 2015/2017
+  
+  ... and invoke "curl -V" once done
   
-  Starting 7.62.0, multiplexing is enabled by default in multi handles.
+  Co-Authored-By: Jay Satiro
+  
+  Closes #4523
 
-- [Jim Fuller brought this change]
+- [Francois Rivard brought this change]
 
-  tests: add unit tests for url.c
+  schannel: reverse the order of certinfo insertions
   
-  Approved-by: Daniel Gustafsson
-  Closes #2937
+  Fixes #4518
+  Closes #4519
 
-- test1452: mark as flaky
+Marcel Raad (24 Oct 2019)
+- test1591: fix spelling of http feature
   
-  makes it not run in the CI builds
+  The test never got run because the feature name is `http` in lowercase.
   
-  Closes #2941
+  Closes https://github.com/curl/curl/pull/4520
+
+Daniel Stenberg (23 Oct 2019)
+- [Michał Janiszewski brought this change]
 
-- pipelining: deprecated
+  appveyor: Use two parallel compilation on appveyor with CMake
   
-  Transparently. The related curl_multi_setopt() options all still returns
-  OK when pipelining is selected.
+  Appveyor provides 2 CPUs for each builder[1], make sure to use parallel
+  compilation, when running with CMake. CMake learned this new option in
+  version 3.12[2] and the version provided by appveyor is fresh enough.
   
-  To re-enable the support, the single line change in lib/multi.c needs to
-  be reverted.
+  Curl doesn't really take that long to build and it is using the slowest
+  builder available, msbuild, so expect only a moderate improvement in
+  build times.
   
-  See docs/DEPRECATE.md
+  [1] https://www.appveyor.com/docs/build-environment/
+  [2] https://cmake.org/cmake/help/v3.12/release/3.12.html
   
-  Closes #2705
+  Closes #4508
 
-- RELEASE-NOTES: start working on 7.62.0
+- conn-reuse: requests wanting NTLM can reuse non-NTLM connections
+  
+  Added test case 338 to verify.
+  
+  Reported-by: Daniel Silverstone
+  Fixes #4499
+  Closes #4514
 
-Version 7.61.1 (4 Sep 2018)
+Marcel Raad (23 Oct 2019)
+- tests: add missing proxy features
 
-Daniel Stenberg (4 Sep 2018)
-- THANKS: 7.61.1 status
+Daniel Stenberg (22 Oct 2019)
+- RELEASE-NOTES: synced
 
-- RELEASE-NOTES: 7.61.1
+Marcel Raad (21 Oct 2019)
+- tests: use %FILE_PWD for file:// URLs
+  
+  This way, we always have exactly one slash after the host name, making
+  the tests pass when curl is compiled with the MSYS GCC.
+  
+  Closes https://github.com/curl/curl/pull/4512
 
-- Curl_getoff_all_pipelines: ignore unused return values
+- tests: add `connect to non-listen` keywords
+  
+  These tests try to connect to ports nothing is listening on.
   
-  Since scan-build would warn on the dead "Dead store/Dead increment"
+  Closes https://github.com/curl/curl/pull/4511
 
-Viktor Szakats (4 Sep 2018)
-- sftp: fix indentation
+- runtests: get textaware info from curl instead of perl
+  
+  The MSYS system on Windows can run the test suite for curl built with
+  any toolset. When built with the MSYS GCC, curl uses Unix line endings,
+  while it uses Windows line endings when built with the MinGW GCC, and
+  `^O` reports 'msys' in both cases. Use the curl executable itself to
+  determine the line endings instead, which reports 'x86_64-pc-msys' when
+  built with the MSYS GCC.
+  
+  Closes https://github.com/curl/curl/pull/4506
 
-Daniel Stenberg (4 Sep 2018)
-- [Przemysław Tomaszewski brought this change]
+Daniel Stenberg (20 Oct 2019)
+- [Michał Janiszewski brought this change]
 
-  sftp: don't send post-qoute sequence when retrying a connection
+  appveyor: Add MSVC ARM64 build
   
-  Fixes #2939
-  Closes #2940
+  Closes #4507
 
-Kamil Dudka (3 Sep 2018)
-- url, vtls: make CURLOPT{,_PROXY}_TLS13_CIPHERS work
+- http2_recv: a closed stream trumps pause state
   
-  This is a follow-up to PR #2607 and PR #2926.
+  ... and thus should return 0, not EAGAIN.
   
-  Closes #2936
+  Reported-by: Tom van der Woerdt
+  Fixes #4496
+  Closes #4505
 
-Daniel Stenberg (3 Sep 2018)
-- [Jay Satiro brought this change]
-
-  tool_operate: Add http code 408 to transient list for --retry
+- http2: expire a timeout at end of stream
   
-  - Treat 408 request timeout as transient so that curl will retry the
-    request if --retry was used.
+  To make sure that transfer is being dealt with. Streams without
+  Content-Length need a final read to notice the end-of-stream state.
   
-  Closes #2925
+  Reported-by: Tom van der Woerdt
+  Fixes #4496
 
-- [Jay Satiro brought this change]
+Dan Fandrich (18 Oct 2019)
+- travis: Add an ARM64 build
+  
+  Test 323 is failing for some reason, so disable it there for now.
 
-  openssl: Fix setting TLS 1.3 cipher suites
+Marcel Raad (18 Oct 2019)
+- examples/sslbackend: fix -Wchar-subscripts warning
   
-  The flag indicating TLS 1.3 cipher support in the OpenSSL backend was
-  missing.
+  With the `isdigit` implementation that comes with MSYS2, the argument
+  is used as an array subscript, resulting in a -Wchar-subscripts
+  warning. `isdigit`'s behavior is undefined if the argument is negative
+  and not EOF [0]. As done in lib/curl_ctype.h, cast the `char` variable
+  to `unsigned char` to avoid that.
   
-  Bug: https://github.com/curl/curl/pull/2607#issuecomment-417283187
-  Reported-by: Kamil Dudka
+  [0] https://en.cppreference.com/w/c/string/byte/isdigit
   
-  Closes #2926
+  Closes https://github.com/curl/curl/pull/4503
 
-- Curl_ntlm_core_mk_nt_hash: return error on too long password
+Daniel Stenberg (18 Oct 2019)
+- configure: remove all cyassl references
   
-  ... since it would cause an integer overflow if longer than (max size_t
-  / 2).
+  In particular, this removes the case where configure would find an old
+  cyall installation rather than a wolfssl one if present. The library is
+  named wolfssl in modern days so there's no real need to keep support for
+  the former.
   
-  This is CVE-2018-14618
-  
-  Bug: https://curl.haxx.se/docs/CVE-2018-14618.html
-  Closes #2756
-  Reported-by: Zhaoyang Wu
-
-- [Rikard Falkeborn brought this change]
+  Reported-by: Jacob Barthelmeh
+  Closes #4502
 
-  http2: Use correct format identifier for stream_id
+Marcel Raad (17 Oct 2019)
+- test1162: disable MSYS2's POSIX path conversion
   
-  Closes #2928
+  This avoids MSYS2 converting the backslasb in the URL to a slash,
+  causing the test to fail.
 
-Marcel Raad (2 Sep 2018)
-- test1148: fix precheck output
-  
-  "precheck command error" is not very helpful.
+Daniel Stenberg (17 Oct 2019)
+- RELEASE-NOTES: synced
 
-Daniel Stenberg (1 Sep 2018)
-- all: s/int/size_t cleanup
+Jay Satiro (16 Oct 2019)
+- CURLOPT_TIMEOUT.3: Clarify transfer timeout time includes queue time
   
-  Assisted-by: Rikard Falkeborn
+  Prior to this change some users did not understand that the "request"
+  starts when the handle is added to the multi handle, or probably they
+  did not understand that some of those transfers may be queued and that
+  time is included in timeout.
   
-  Closes #2922
-
-- ssh-libssh: use FALLTHROUGH to silence gcc8
+  Reported-by: Jeroen Ooms
+  
+  Fixes https://github.com/curl/curl/issues/4486
+  Closes https://github.com/curl/curl/pull/4489
 
-Jay Satiro (31 Aug 2018)
-- tool_operate: Fix setting proxy TLS 1.3 ciphers
+- [Stian Soiland-Reyes brought this change]
 
-Daniel Stenberg (31 Aug 2018)
-- [Daniel Gustafsson brought this change]
-
-  cookies: support creation-time attribute for cookies
+  tool_operate: Fix retry sleep time shown to user when Retry-After
+  
+  - If server header Retry-After is being used for retry sleep time then
+    show that value to the user instead of the normal retry sleep time.
   
-  According to RFC6265 section 5.4, cookies with equal path lengths
-  SHOULD be sorted by creation-time (earlier first). This adds a
-  creation-time record to the cookie struct in order to make cookie
-  sorting more deterministic. The creation-time is defined as the
-  order of the cookies in the jar, the first cookie read fro the
-  jar being the oldest. The creation-time is thus not serialized
-  into the jar. Also remove the strcmp() matching in the sorting as
-  there is no lexicographic ordering in RFC6265. Existing tests are
-  updated to match.
+  This is a follow-up to 640b973 (7.66.0) which changed curl tool so that
+  the value from Retry-After header overrides other retry timing options.
   
-  Closes #2524
+  Closes https://github.com/curl/curl/pull/4498
 
-Marcel Raad (31 Aug 2018)
-- Don't use Windows path %PWD for SSH tests
+Daniel Stenberg (16 Oct 2019)
+- url: normalize CURLINFO_EFFECTIVE_URL
   
-  All these tests failed on Windows because something like
-  sftp://%HOSTIP:%SSHPORT%PWD/
-  expanded to
-  sftp://127.0.0.1:1234c:/msys64/home/bla/curl
-  and then curl complained about the port number ending with a letter.
+  The URL extracted with CURLINFO_EFFECTIVE_URL was returned as given as
+  input in most cases, which made it not get a scheme prefixed like before
+  if the URL was given without one, and it didn't remove dotdot sequences
+  etc.
   
-  Use the original POSIX path instead of the Windows path created in
-  checksystem to fix this.
+  Added test case 1907 to verify that this now works as intended and as
+  before 7.62.0.
   
-  Closes https://github.com/curl/curl/pull/2920
+  Regression introduced in 7.62.0
+  
+  Reported-by: Christophe Dervieux
+  Fixes #4491
+  Closes #4493
 
-Jay Satiro (29 Aug 2018)
-- CURLOPT_SSL_CTX_FUNCTION.3: clarify connection reuse warning
+Marcel Raad (16 Oct 2019)
+- tests: line ending fixes for Windows
   
-  Reported-by: Daniel Stenberg
+  Mark some files as text.
   
-  Closes https://github.com/curl/curl/issues/2916
+  Closes https://github.com/curl/curl/pull/4490
 
-Daniel Stenberg (28 Aug 2018)
-- THANKS-filter: dedup Daniel Jeliński
-
-- RELEASE-NOTES: synced
-
-- CURLOPT_ACCEPT_ENCODING.3: list them comma-separated [ci skip]
-
-- CURLOPT_SSL_CTX_FUNCTION.3: might cause unintended connection reuse [ci skip]
+- tests: use proxy feature
   
-  Added a warning!
+  This makes the tests succeed when using --disable-proxy.
   
-  Closes #2915
+  Closes https://github.com/curl/curl/pull/4488
 
-- curl: fix time-of-check, time-of-use race in dir creation
+- smbserver: fix Python 3 compatibility
   
-  Patch-by: Jay Satiro
-  Detected by Coverity
-  Fixes #2739
-  Closes #2912
+  Python 2's `ConfigParser` module is spelled `configparser` in Python 3.
+  
+  Closes https://github.com/curl/curl/pull/4484
 
-- cmdline-opts/page-footer: fix edit mistake
+- security: silence conversion warning
   
-  There was a missing newline.
+  With MinGW-w64, `curl_socket_t` is is a 32 or 64 bit unsigned integer,
+  while `read` expects a 32 bit signed integer.
+  Use `sread` instead of `read` to use the correct parameter type.
   
-  follow-up to a7ba60bb7250
+  Closes https://github.com/curl/curl/pull/4483
 
-- docs: clarify NO_PROXY env variable functionality
+- connect: silence sign-compare warning
+  
+  With MinGW-w64 using WinSock, `curl_socklen_t` is signed, while the
+  result of `sizeof` is unsigned.
   
-  Reported-by: Kirill Marchuk
-  Fixes #2773
-  Closes #2911
+  Closes https://github.com/curl/curl/pull/4483
 
-Marcel Raad (24 Aug 2018)
-- lib1522: fix curl_easy_setopt argument type
+Daniel Stenberg (13 Oct 2019)
+- TODO: Handle growing SFTP files
   
-  CURLOPT_POSTFIELDSIZE is a long option.
+  Closes #4344
 
-- curl_threads: silence bad-function-cast warning
+- KNOWN_BUGS: remove "CURLFORM_CONTENTLEN in an array"
   
-  As uintptr_t and HANDLE are always the same size, this warning is
-  harmless. Just silence it using an intermediate uintptr_t variable.
+  The curl_formadd() function is deprecated and shouldn't be used so the
+  real fix for applications is to switch to the curl_mime_* API.
+
+- KNOWN_BUGS: "LDAP on Windows does authentication wrong"
   
-  Closes https://github.com/curl/curl/pull/2908
+  Closes #3116
 
-Daniel Stenberg (24 Aug 2018)
-- README: add appveyor build badge [ci skip]
+- appveyor: add a winbuild that uses VS2017
   
-  Closes #2913
+  Closes #4482
 
-- [Ihor Karpenko brought this change]
+- [Harry Sintonen brought this change]
 
-  schannel: client certificate store opening fix
+  socketpair: fix include and define for older TCP header systems
   
-  1) Using CERT_STORE_OPEN_EXISTING_FLAG ( or CERT_STORE_READONLY_FLAG )
-  while opening certificate store would be sufficient in this scenario and
-  less-demanding in sense of required user credentials ( for example,
-  IIS_IUSRS will get "Access Denied" 0x05 error for existing CertOpenStore
-  call without any of flags mentioned above ),
+  fixed build for systems that need netinet/in.h for IPPROTO_TCP and are
+  missing INADDR_LOOPBACK
   
-  2) as 'cert_store_name' is a DWORD, attempt to format its value like a
-  string ( in "Failed to open cert store" error message ) will throw null
-  pointer exception
-  
-  3) adding GetLastError(), in my opinion, will make error message more
-  useful.
-  
-  Bug: https://curl.haxx.se/mail/lib-2018-08/0198.html
+  Closes #4480
+
+- socketpair: fix double-close in error case
   
-  Closes #2909
+  Follow-up to bc2dbef0afc08
 
-- [Leonardo Taccari brought this change]
+- gskit: use the generic Curl_socketpair
 
-  gopher: Do not translate `?' to `%09'
-  
-  Since GOPHER support was added in curl `?' character was automatically
-  translated to `%09' (`\t').
+- asyn-thread: make use of Curl_socketpair() where available
+
+- socketpair: an implemention for Windows and more
   
-  However, this behaviour does not seems documented in RFC 4266 and for
-  search selectors it is documented to directly use `%09' in the URL.
-  Apart that several gopher servers in the current gopherspace have CGI
-  support where `?' is used as part of the selector and translating it to
-  `%09' often leads to surprising results.
+  Curl_socketpair() is designed to be used and work everywhere if there's
+  no native version or the native version isn't good enough.
   
-  Closes #2910
+  Closes #4466
 
-Marcel Raad (23 Aug 2018)
-- cookie tests: treat files as text
-  
-  Fixes test failures because of wrong line endings on Windows.
+- RELEASE-NOTES: synced
 
-Daniel Stenberg (23 Aug 2018)
-- libcurl-thread.3: expand somewhat on the NO_SIGNAL motivation
+- connect: return CURLE_OPERATION_TIMEDOUT for errno == ETIMEDOUT
   
-  Multi-threaded applictions basically MUST set CURLOPT_NO_SIGNAL to 1L to
-  avoid the risk of getting a SIGPIPE.
+  Previosly all connect() failures would return CURLE_COULDNT_CONNECT, no
+  matter what errno said.
   
-  Either way, a multi-threaded application that uses libcurl/openssl needs
-  to have a signhandler for or ignore SIGPIPE on its own.
+  This makes for example --retry work on these transfer failures.
   
-  Based on discussions in #2800
-  Closes #2904
+  Reported-by: Nathaniel J. Smith
+  Fixes #4461
+  Clsoes #4462
 
-- RELEASE-NOTES: synced
+- cirrus: switch off blackhole status on the freebsd CI machines
 
-Marcel Raad (22 Aug 2018)
-- Tests: fixes for Windows
+- tests: use port 2 instead of 60000 for a safer non-listening port
   
-  - test 1268 requires unix sockets
-  - test 2072 must be disabled also for MSYS/MinGW
+  ... when the tests want "connection refused".
 
-Daniel Stenberg (22 Aug 2018)
-- http2: abort the send_callback if not setup yet
+- KNOWN_BUGS: IDN tests failing on Windows
   
-  When Curl_http2_done() gets called before the http2 data is setup all
-  the way, we cannot send anything and this should just return an error.
-  
-  Detected by OSS-Fuzz
-  Bug: https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=10012
+  Closes #3747
 
-- http2: remove four unused nghttp2 callbacks
+Dan Fandrich (9 Oct 2019)
+- cirrus: Increase the git clone depth.
   
-  Closes #2903
+  If more commits are submitted to master between the time of triggering
+  the first Cirrus build and the time the final build gets started, the
+  desired commit is no longer at HEAD and the build will error out.
+  [skip ci]
 
-- x509asn1: use FALLTHROUGH
-  
-  ... as no other comments are accepted since 014ed7c22f51463
+Daniel Stenberg (9 Oct 2019)
+- docs: make sure the --no-progress-meter docs file is in dist too
 
-Marcel Raad (21 Aug 2018)
-- test1148: disable if decimal separator is not point
+- docs: document it as --no-progress-meter instead of the reverse
   
-  Modifying the locale with environment variables doesn't work for native
-  Windows applications. Just disable the test in this case if the decimal
-  separator is something different than a point. Use a precheck with a
-  small C program to achieve that.
+  Follow-up to 93373a960c3bb4
   
-  Closes https://github.com/curl/curl/pull/2786
+  Reported-by: infinnovation-dev on github
+  Fixes #4474
+  Closes #4475
 
-- Enable more GCC warnings
+Dan Fandrich (9 Oct 2019)
+- cirrus: Switch the FreeBSD 11.x build to 11.3 and add a 13.0 build.
   
-  This enables the following additional warnings:
-  -Wold-style-definition
-  -Warray-bounds=2 instead of the default 1
-  -Wformat=2, but only for GCC 4.8+ as Wno-format-nonliteral is not
-   respected for older versions
-  -Wunused-const-variable, which enables level 2 instead of the default 1
-  -Warray-bounds also in debug mode through -ftree-vrp
-  -Wnull-dereference also in debug mode through
-   -fdelete-null-pointer-checks
-  
-  Closes https://github.com/curl/curl/pull/2747
+  Also, select the images using image_family to get the latest snapshots
+  automatically.
+  [skip ci]
 
-- curl-compilers: enable -Wimplicit-fallthrough=4 for GCC
+Daniel Stenberg (8 Oct 2019)
+- curl: --no-progress-meter
   
-  This enables level 4 instead of the default level 3, which of the
-  currently used comments only allows /* FALLTHROUGH */ to silence the
-  warning.
+  New option that allows a user to ONLY switch off curl's progress meter
+  and leave everything else in "talkative" mode.
   
-  Closes https://github.com/curl/curl/pull/2747
+  Reported-by: Piotr Komborski
+  Fixes #4422
+  Closes #4470
 
-- curl-compilers: enable -Wbad-function-cast on GCC
-  
-  This warning used to be enabled only for clang as it's a bit stricter
-  on GCC. Silence the remaining occurrences and enable it on GCC too.
+- TODO: Consult %APPDATA% also for .netrc
   
-  Closes https://github.com/curl/curl/pull/2747
+  Closes #4016
 
-- configure: conditionally enable pedantic-errors
+- CURLOPT_TIMEOUT.3: remove the mention of "minutes"
   
-  Enable pedantic-errors for GCC >= 5 with --enable-werror. Before GCC 5,
-  pedantic-errors was synonymous to -Werror=pedantic [0], which is still
-  the case for clang [1]. With GCC 5, it became complementary [2].
+  ... just say that limiting operations risk aborting otherwise fine
+  working transfers. If that means seconds, minutes or hours, we leave to
+  the user.
   
-  Also fix a resulting error in acinclude.m4 as main's return type was
-  missing, which is illegal in C99.
+  Reported-by: Martin Gartner
+  Closes #4469
+
+- [Andrei Valeriu BICA brought this change]
+
+  docs: added multi-event.c example
   
-  [0] https://gcc.gnu.org/onlinedocs/gcc-4.9.0/gcc/Warning-Options.html
-  [1] https://clang.llvm.org/docs/UsersManual.html#options-to-control-error-and-warning-messages
-  [2] https://gcc.gnu.org/onlinedocs/gcc-5.1.0/gcc/Warning-Options.html
+  Similar to multi-uv.c but using libevent 2. This is a simpler libevent
+  integration example then hiperfifo.c.
   
-  Closes https://github.com/curl/curl/pull/2747
+  Closes #4471
 
-- Remove unused definitions
-  
-  Closes https://github.com/curl/curl/pull/2747
+Jay Satiro (5 Oct 2019)
+- [Nicolas brought this change]
 
-Daniel Stenberg (21 Aug 2018)
-- x509asn1: make several functions static
+  ldap: fix OOM error on missing query string
   
-  and remove the private SIZE_T_MAX define and use the generic one.
+  - Allow missing queries, don't return NO_MEMORY error in such a case.
   
-  Closes #2902
-
-- INTERNALS: require GnuTLS >= 2.11.3
+  It is acceptable for there to be no specified query string, for example:
   
-  Since the public pinning support was brought in e644866caf4. GnuTLS
-  2.11.3 was released in October 2010.
+  curl ldap://ldap.forumsys.com
   
-  Figured out in #2890
-
-- http2: avoid set_stream_user_data() before stream is assigned
+  A regression bug in 1b443a7 caused this issue.
   
-  ... before the stream is started, we have it set to -1.
+  This is a partial fix for #4261.
   
-  Fixes #2894
-  Closes #2898
-
-- SSLCERTS: improve the openssl command line
+  Bug: https://github.com/curl/curl/issues/4261#issuecomment-525543077
+  Reported-by: Jojojov@users.noreply.github.com
+  Analyzed-by: Samuel Surtees
   
-  ... for extracting certs from a live HTTPS server to make a cacerts.pem
-  from them.
+  Closes https://github.com/curl/curl/pull/4467
 
-- docs/SECURITY-PROCESS: now we name the files after the CVE id
+- [Paul B. Omta brought this change]
+
+  build: Remove unused HAVE_LIBSSL and HAVE_LIBCRYPTO defines
+  
+  Closes https://github.com/curl/curl/pull/4460
 
+Daniel Stenberg (5 Oct 2019)
 - RELEASE-NOTES: synced
 
-- upload: change default UPLOAD_BUFSIZE to 64KB
-  
-  To make uploads significantly faster in some circumstances.
-  
-  Part 2 of #2888
-  Closes #2892
+- [Stian Soiland-Reyes brought this change]
 
-- upload: allocate upload buffer on-demand
+  curl: ensure HTTP 429 triggers --retry
   
-  Saves 16KB on the easy handle for operations that don't need that
-  buffer.
+  This completes #3794.
   
-  Part 1 of #2888
+  Also make sure the new tests from #4195 are enabled
+  
+  Closes #4465
 
-- [Laurent Bonnans brought this change]
+Marcel Raad (4 Oct 2019)
+- [apique brought this change]
 
-  vtls: reinstantiate engine on duplicated handles
+  winbuild: add ENABLE_UNICODE option
   
-  Handles created with curl_easy_duphandle do not use the SSL engine set
-  up in the original handle. This fixes the issue by storing the engine
-  name in the internal url state and setting the engine from its name
-  inside curl_easy_duphandle.
+  Fixes https://github.com/curl/curl/issues/4308
+  Closes https://github.com/curl/curl/pull/4309
+
+Daniel Stenberg (4 Oct 2019)
+- ngtcp2: adapt to API change
   
-  Reported-by: Anton Gerasimov
-  Signed-of-by: Laurent Bonnans
-  Fixes #2829
-  Closes #2833
+  Closes #4457
 
-- http2: make sure to send after RST_STREAM
+- cookies: change argument type for Curl_flush_cookies
   
-  If this is the last stream on this connection, the RST_STREAM might not
-  get pushed to the wire otherwise.
+  The second argument is really a 'bool' so use that and pass in TRUE/FALSE
+  to make it clear.
   
-  Fixes #2882
-  Closes #2887
-  Researched-by: Michael Kaufmann
+  Closes #4455
 
-- test1268: check the stderr output as "text"
+- http2: move state-init from creation to pre-transfer
   
-  Follow-up to 099f37e9c57
+  To make sure that the HTTP/2 state is initialized correctly for
+  duplicated handles. It would otherwise easily generate "spurious"
+  PRIORITY frames to get sent over HTTP/2 connections when duplicated easy
+  handles were used.
   
-  Pointed-out-by: Marcel Raad
+  Reported-by: Daniel Silverstone
+  Fixes #4303
+  Closes #4442
 
-- urldata: remove unused pipe_broke struct field
+- urlapi: fix use-after-free bug
   
-  This struct field is never set TRUE in any existing code path. This
-  change removes the field completely.
+  Follow-up from 2c20109a9b5d04
   
-  Closes #2871
+  Added test 663 to verify.
+  
+  Reported by OSS-Fuzz
+  Bug: https://crbug.com/oss-fuzz/17954
+  
+  Closes #4453
 
-- curl: warn the user if a given file name looks like an option
+- [Paul Dreik brought this change]
+
+  cookie: avoid harmless use after free
   
-  ... simply because this is usually a sign of the user having omitted the
-  file name and the next option is instead "eaten" by the parser as a file
-  name.
+  This fix removes a use after free which can be triggered by
+  the internal cookie fuzzer, but otherwise is probably
+  impossible to trigger from an ordinary application.
   
-  Add test1268 to verify
+  The following program reproduces it:
   
-  Closes #2885
-
-- http2: check nghttp2_session_set_stream_user_data return code
+          curl_global_init(CURL_GLOBAL_DEFAULT);
+          CURL*  handle=curl_easy_init();
+          CookieInfo* info=Curl_cookie_init(handle,NULL,NULL,false);
+          curl_easy_setopt(handle, CURLOPT_COOKIEJAR, "/dev/null");
+          Curl_flush_cookies(handle, true);
+          Curl_cookie_cleanup(info);
+          curl_easy_cleanup(handle);
+          curl_global_cleanup();
   
-  Might help bug #2688 debugging
+  This was found through fuzzing.
   
-  Closes #2880
+  Closes #4454
 
-- travis: revert back to gcc-7 for coverage builds
-  
-  ... since the gcc-8 ones seem to fail frequently.
+- [Denis Chaplygin brought this change]
+
+  docs: add note on failed handles not being counted by curl_multi_perform
   
-  Follow-up from b85207199544ca
+  Closes #4446
+
+- CURLMOPT_MAX_CONCURRENT_STREAMS.3: fix SEE ALSO typo
+
+- [Niall O'Reilly brought this change]
+
+  ESNI: initial build/setup
   
-  Closes #2886
+  Closes #4011
 
 - RELEASE-NOTES: synced
+
+- redirect: when following redirects to an absolute URL, URL encode it
   
-  ... and now listed in alphabetical order!
+  ... to make it handle for example (RFC violating) embeded spaces.
+  
+  Reported-by: momala454 on github
+  Fixes #4445
+  Closes #4447
+
+- urlapi: fix URL encoding when setting a full URL
 
-- [Adrien brought this change]
+- tool_operate: rename functions to make more sense
 
-  CMake: CMake config files are defining CURL_STATICLIB for static builds
+- curl: create easy handles on-demand and not ahead of time
   
-  This change allows to use the CMake config files generated by Curl's
-  CMake scripts for static builds of the library.
-  The symbol CURL_STATIC lib must be defined to compile downstream,
-  thus the config package is the perfect place to do so.
+  This should again enable crazy-large download ranges of the style
+  [1-10000000] that otherwise easily ran out of memory starting in 7.66.0
+  when this new handle allocating scheme was introduced.
   
-  Fixes #2817
-  Closes #2823
-  Reported-by: adnn on github
-  Reviewed-by: Sergei Nikulov
+  Reported-by: Peter Sumatra
+  Fixes #4393
+  Closes #4438
 
-- TODO: host name sections in config files
+- [Kunal Ekawde brought this change]
 
-Kamil Dudka (14 Aug 2018)
-- ssh-libssh: fix infinite connect loop on invalid private key
+  CURLMOPT_MAX_CONCURRENT_STREAMS: new setopt
   
-  Added test 656 (based on test 604) to verify the fix.
+  Closes #4410
+
+- chunked-encoding: stop hiding the CURLE_BAD_CONTENT_ENCODING error
   
-  Bug: https://bugzilla.redhat.com/1595135
+  Unknown content-encoding would get returned as CURLE_WRITE_ERROR if the
+  response is chunked-encoded.
   
-  Closes #2879
+  Reported-by: Ilya Kosarev
+  Fixes #4310
+  Closes #4449
 
-- ssh-libssh: reduce excessive verbose output about pubkey auth
+Marcel Raad (1 Oct 2019)
+- checksrc: fix uninitialized variable warning
   
-  The verbose message "Authentication using SSH public key file" was
-  printed each time the ssh_userauth_publickey_auto() was called, which
-  meant each time a packet was transferred over network because the API
-  operates in non-blocking mode.
+  The loop doesn't need to be executed without a file argument.
   
-  This patch makes sure that the verbose message is printed just once
-  (when the authentication state is entered by the SSH state machine).
+  Closes https://github.com/curl/curl/pull/4444
 
-Daniel Stenberg (14 Aug 2018)
-- travis: disable h2 torture tests for "coverage"
+- urlapi: fix unused variable warning
   
-  Since they started to fail almost 100% since a few days.
+  `dest` is only used with `ENABLE_IPV6`.
   
-  Closes #2876
+  Closes https://github.com/curl/curl/pull/4444
 
-Marcel Raad (14 Aug 2018)
-- travis: update to GCC 8
+- lib: silence conversion warnings
   
-  Closes https://github.com/curl/curl/pull/2869
+  Closes https://github.com/curl/curl/pull/4444
 
-Daniel Stenberg (13 Aug 2018)
-- http: fix for tiny "HTTP/0.9" response
+- AppVeyor: add 32-bit MinGW-w64 build
   
-  Deal with tiny "HTTP/0.9" (header-less) responses by checking the
-  status-line early, even before a full "HTTP/" is received to allow
-  detecting 0.9 properly.
+  With WinSSL and testing enabled so that it would have detected most of
+  the warnings fixed in [0] and [1].
   
-  Test 1266 and 1267 added to verify.
+  [0] https://github.com/curl/curl/pull/4398
+  [1] https://github.com/curl/curl/pull/4415
   
-  Fixes #2420
-  Closes #2872
+  Closes https://github.com/curl/curl/pull/4433
 
-Kamil Dudka (13 Aug 2018)
-- docs: add disallow-username-in-url.d and haproxy-protocol.d on the list
+- AppVeyor: remove MSYS2_ARG_CONV_EXCL for winbuild
   
-  ... to make make the files appear in distribution tarballs
+  It's only used for MSYS2 with MinGW.
   
-  Closes #2856
+  Closes
 
-- .travis.yml: verify that man pages can be regenerated
-  
-  ... when curl is built from distribution tarball
-  
-  Closes #2856
+Daniel Stenberg (30 Sep 2019)
+- [Emil Engler brought this change]
 
-Marcel Raad (11 Aug 2018)
-- Split non-portable part off test 1133
-  
-  Split off testing file names with double quotes into new test 1158.
-  Disable it for MSYS using a precheck as it doesn't support file names
-  with double quotes (but Cygwin does, for example).
+  git: add tests/server/disabled to .gitignore
   
-  Fixes https://github.com/curl/curl/issues/2796
-  Closes https://github.com/curl/curl/pull/2854
+  Closes #4441
 
-Jay Satiro (11 Aug 2018)
-- projects: Improve Windows perl detection in batch scripts
+- altsvc: accept quoted ma and persist values
   
-  - Determine if perl is in the user's PATH by running perl.exe.
+  As mandated by the spec. Test 1654 is extended to verify.
   
-  Prior to this change detection was done by checking the PATH for perl/
-  but that did not work in all cases (eg git install includes perl but
-  not in perl/ path).
-  
-  Bug: https://github.com/curl/curl/pull/2865
-  Reported-by: Daniel Jeliński
+  Closes #4443
 
-- [Michael Kaufmann brought this change]
+- mailmap: a Lucas fix
 
-  docs: Improve the manual pages of some callbacks
-  
-  - CURLOPT_HEADERFUNCTION: add newlines
-  - CURLOPT_INTERLEAVEFUNCTION: fix the description of 'userdata'
-  - CURLOPT_READDATA: mention crashes, same as in CURLOPT_WRITEDATA
-  - CURLOPT_READFUNCTION: rename 'instream' to 'userdata' and explain
-    how to set it
+Alessandro Ghedini (29 Sep 2019)
+- [Lucas Pardue brought this change]
+
+  quiche: update HTTP/3 config creation to new API
+
+Daniel Stenberg (29 Sep 2019)
+- BINDINGS: PureBasic, Net::Curl for perl and Nim
+
+- BINDINGS: Kapito is an Erlang library, basically a binding
+
+- BINDINGS: added clj-curl
   
-  Closes https://github.com/curl/curl/pull/2868
+  Reported-by: Lucas Severo
+
+- [Jay Satiro brought this change]
 
-Marcel Raad (11 Aug 2018)
-- GCC: silence -Wcast-function-type uniformly
+  docs: disambiguate CURLUPART_HOST is for host name (ie no port)
   
-  Pointed-out-by: Rikard Falkeborn
-  Closes https://github.com/curl/curl/pull/2860
+  Closes #4424
 
-- Silence GCC 8 cast-function-type warnings
+- cookies: using a share with cookies shouldn't enable the cookie engine
   
-  On Windows, casting between unrelated function types is fine and
-  sometimes even necessary, so just use an intermediate cast to
-  (void (*) (void)) to silence the warning as described in [0].
+  The 'share object' only sets the storage area for cookies. The "cookie
+  engine" still needs to be enabled or activated using the normal cookie
+  options.
   
-  [0] https://gcc.gnu.org/onlinedocs/gcc-8.1.0/gcc/Warning-Options.html
+  This caused the curl command line tool to accidentally use cookies
+  without having been told to, since curl switched to using shared cookies
+  in 7.66.0.
   
-  Closes https://github.com/curl/curl/pull/2860
-
-Daniel Stenberg (11 Aug 2018)
-- CURLINFO_SIZE_UPLOAD: fix missing counter update
+  Test 1166 verifies
   
-  Adds test 1522 for verification.
+  Updated test 506
   
-  Reported-by: cjmsoregan
-  Fixes #2847
-  Closes #2864
+  Fixes #4429
+  Closes #4434
 
-- [Daniel Jelinski brought this change]
-
-  Documentation: fix CURLOPT_SSH_COMPRESSION copy/paste bug
-  
-  Closes #2867
+- setopt: handle ALTSVC set to NULL
 
 - RELEASE-NOTES: synced
 
-- openssl: fix potential NULL pointer deref in is_pkcs11_uri
+- [grdowns brought this change]
+
+  INSTALL: add vcpkg installation instructions
   
-  Follow-up to 298d2565e
-  Coverity CID 1438387
+  Closes #4435
 
-Marcel Raad (10 Aug 2018)
-- travis: execute "set -eo pipefail" for coverage build
+- [Zenju brought this change]
+
+  FTP: add test for FTPFILE_NOCWD: Avoid redundant CWDs
   
-  Follow-up to 2de63ab179eb78630ee039ad94fb2a5423df522d and
-  0b87c963252d3504552ee0c8cf4402bd65a80af5.
+  Add libtest 661
   
-  Closes https://github.com/curl/curl/pull/2862
+  Closes #4417
+
+- [Zenju brought this change]
 
-Daniel Stenberg (10 Aug 2018)
-- lib1502: fix memory leak in torture test
+  FTP: url-decode path before evaluation
   
-  Reported-by: Marcel Raad
-  Fixes #2861
-  Closes #2863
+  Closes #4428
 
-- docs: mention NULL is fine input to several functions
+Marcel Raad (27 Sep 2019)
+- tests: fix narrowing conversion warnings
+  
+  `timediff_t` is 64 bits wide also on 32-bit systems since
+  commit b1616dad8f0.
   
-  Fixes #2837
-  Closes #2858
-  Reported-by: Markus Elfring
+  Closes https://github.com/curl/curl/pull/4415
 
-- [Bas van Schaik brought this change]
+Jay Satiro (27 Sep 2019)
+- [julian brought this change]
 
-  README.md: add LGTM.com code quality grade for C/C++
+  vtls: Fix comment typo about macosx-version-min compiler flag
   
-  Closes #2857
+  Closes https://github.com/curl/curl/pull/4425
 
-- [Rikard Falkeborn brought this change]
+Daniel Stenberg (26 Sep 2019)
+- [Yechiel Kalmenson brought this change]
 
-  test1531: Add timeout
-  
-  Previously, the macro TEST_HANG_TIMEOUT was unused, but since there is
-  looping going on, we might as well add timing instead of removing it.
+  README: minor grammar fix
   
-  Closes #2853
+  Closes #4431
 
-- [Rikard Falkeborn brought this change]
+- [Spezifant brought this change]
 
-  test1540: Remove unused macro TEST_HANG_TIMEOUT
-  
-  The macro has never been used, and it there is not really any place
-  where it would make sense to add timing checks.
+  HTTP3: fix prefix parameter for ngtcp2 build
   
-  Closes #2852
+  Closes #4430
 
-- [Rikard Falkeborn brought this change]
+- quiche: don't close connection at end of stream!
 
-  asyn-thread: Remove unused macro
-  
-  The macro seems to never have been used.
+- quiche: set 'drain' when returning without having drained the queues
+
+- Revert "FTP: url-decode path before evaluation"
   
-  Closes #2852
+  This reverts commit 2f036a72d543e96128bd75cb0fedd88815fd42e2.
 
-- [Rikard Falkeborn brought this change]
+- HTTP3: merged and simplified the two 'running' sections
 
-  http_proxy: Remove unused macro SELECT_TIMEOUT
+- HTTP3: show an --alt-svc using example too
+
+- [Zenju brought this change]
+
+  FTP: url-decode path before evaluation
   
-  Usage was removed in 5113ad0424044458ac497fa1458ebe0101356b22.
+  Closes #4423
+
+- openssl: use strerror on SSL_ERROR_SYSCALL
   
-  Closes #2852
+  Instead of showing the somewhat nonsensical errno number, use strerror()
+  to provide a more relatable error message.
+  
+  Closes #4411
 
-- [Rikard Falkeborn brought this change]
+- HTTP3: update quic.aiortc.org + add link to server list
+  
+  Reported-by: Jeremy Lainé
 
-  formdata: Remove unused macro HTTPPOST_CONTENTTYPE_DEFAULT
+Jay Satiro (26 Sep 2019)
+- url: don't set appconnect time for non-ssl/non-ssh connections
   
-  Its usage was removed in
-  84ad1fd3047815f9c6e78728bb351b828eac10b1.
+  Prior to this change non-ssl/non-ssh connections that were reused set
+  TIMER_APPCONNECT [1]. Arguably that was incorrect since no SSL/SSH
+  handshake took place.
   
-  Closes #2852
-
-- [Rikard Falkeborn brought this change]
+  [1]: TIMER_APPCONNECT is publicly known as CURLINFO_APPCONNECT_TIME in
+  libcurl and %{time_appconnect} in the curl tool. It is documented as
+  "the time until the SSL/SSH handshake is completed".
+  
+  Reported-by: Marcel Hernandez
+  
+  Ref: https://github.com/curl/curl/issues/3760
+  
+  Closes https://github.com/curl/curl/pull/3773
 
-  telnet: Remove unused macros TELOPTS and TELCMDS
+Daniel Stenberg (25 Sep 2019)
+- ngtcp2: remove fprintf() calls
   
-  Their usage was removed in 3a145180cc754a5959ca971ef3cd243c5c83fc51.
+  - convert some of them to H3BUF() calls to infof()
+  - remove some of them completely
+  - made DEBUG_HTTP3 defined only if CURLDEBUG is set for now
   
-  Closes #2852
+  Closes #4421
 
-- [Daniel Jelinski brought this change]
+- [Jay Satiro brought this change]
 
-  openssl: fix debug messages
+  url: fix the NULL hostname compiler warning case
   
-  Fixes #2806
-  Closes #2843
+  Closes #4403
 
-- configure: fix for -lpthread detection with OpenSSL and pkg-config
-  
-  ... by making sure it uses the -I provided by pkg-config!
+- [Jay Satiro brought this change]
+
+  travis: move the go install to linux-only
   
-  Reported-by: pszemus on github
-  Fixes #2848
-  Closes #2850
+  ... to repair the build again
+  Closes #4403
 
-- RELEASE-NOTES: synced
+- altsvc: correct the #ifdef for the ngtcp2 backend
 
-- windows: follow up to the buffer-tuning 1ba1dba7
+- altsvc: save h3 as h3-23
   
-  Somehow I didn't include the amended version of the previous fix. This
-  is the missing piece.
+  Follow-up to d176a2c7e5
+
+- urlapi: question mark within fragment is still fragment
   
-  Pointed-out-by: Viktor Szakats
+  The parser would check for a query part before fragment, which caused it
+  to do wrong when the fragment contains a question mark.
+  
+  Extended test 1560 to verify.
+  
+  Reported-by: Alex Konev
+  Fixes #4412
+  Closes #4413
 
-- [Daniel Jelinski brought this change]
+- [Alex Samorukov brought this change]
 
-  windows: implement send buffer tuning
+  HTTP3.md: move -p for mkdir, remove -j for make
   
-  Significantly enhances upload performance on modern Windows versions.
+  - mkdir on OSX/Darwin requires `-p` argument before dir
   
-  Bug: https://curl.haxx.se/mail/lib-2018-07/0080.html
-  Closes #2762
-  Fixes #2224
-
-- [Anderson Toshiyuki Sasaki brought this change]
+  - portabbly figuring out number of cores is an exercise for somewhere
+    else
+  
+  Closes #4407
 
-  ssl: set engine implicitly when a PKCS#11 URI is provided
+Patrick Monnerat (24 Sep 2019)
+- os400: getpeername() and getsockname() return ebcdic AF_UNIX sockaddr,
   
-  This allows the use of PKCS#11 URI for certificates and keys without
-  setting the corresponding type as "ENG" and the engine as "pkcs11"
-  explicitly. If a PKCS#11 URI is provided for certificate, key,
-  proxy_certificate or proxy_key, the corresponding type is set as "ENG"
-  if not provided and the engine is set to "pkcs11" if not provided.
+  As libcurl now uses these 2 system functions, wrappers are needed on os400
+  to convert returned AF_UNIX sockaddrs to ascii.
   
-  Acked-by: Nikos Mavrogiannopoulos
-  Closes #2333
+  This is a follow-up to commit 7fb54ef.
+  See also #4037.
+  Closes #4214
 
-- [Ruslan Baratov brought this change]
+Jay Satiro (24 Sep 2019)
+- [Lucas Pardue brought this change]
 
-  CMake: Respect BUILD_SHARED_LIBS
+  strcase: fix raw lowercasing the letter X
   
-  Use standard CMake variable BUILD_SHARED_LIBS instead of introducing
-  custom option CURL_STATICLIB.
+  Casing mistake in Curl_raw_tolower 'X' wasn't lowercased as 'x' prior to
+  this change.
   
-  Use '-DBUILD_SHARED_LIBS=%SHARED%' in appveyor.yml.
+  Follow-up to 0023fce which added the function several days ago.
   
-  Reviewed-by: Sergei Nikulov
-  Closes #2755
+  Ref: https://github.com/curl/curl/pull/4401#discussion_r327396546
+  
+  Closes https://github.com/curl/curl/pull/4408
 
-- [John Butterfield brought this change]
+Daniel Stenberg (23 Sep 2019)
+- http2: Expression 'stream->stream_id != - 1' is always true
+  
+  PVS-Studio warning
+  Fixes #4402
 
-  cmake: bumped minimum version to 3.4
+- http2: A value is being subtracted from the unsigned variable
   
-  Closes #2753
+  PVS-Studio warning
+  Fixes #4402
 
-- [John Butterfield brought this change]
+- libssh: part of conditional expression is always true: !result
+  
+  PVS-Studio warning
+  Fixed #4402
 
-  cmake: link curl to the OpenSSL targets instead of lib absolute paths
+- libssh: part of conditional expression is always true
   
-  Reviewed-by: Jakub Zakrzewski
-  Reviewed-by: Sergei Nikulov
-  Closes #2753
+  PVS-Studio warning
+  Fixes #4402
 
-- travis: build darwinssl on macos 10.12
+- libssh: The expression is excessive or contains a misprint
   
-  ... as building on 10.13.x before 10.13.4 leads to link errors.
+  PVS-Studio warning
+  Fixes #4402
+
+- quiche: The expression must be surrounded by parentheses
   
-  Assisted-by: Nick Zitzmann
-  Fixes #2835
-  Closes #2845
+  PVS-Studio warning
+  Fixes #4402
 
-- DEPRECATE: remove release date from 7.62.0
+- vauth: The parameter 'status' must be surrounded by parentheses
   
-  Since it will slip and the version is the important part there, not the
-  date.
+  PVS-Studio warning
+  Fixes #4402
+
+- [Paul Dreik brought this change]
 
-- lib/Makefile: only do symbol hiding if told to
+  doh: allow only http and https in debug mode
   
-  This restores the ability to build a static lib with
-  --disable-symbol-hiding to keep non-curl_ symbols.
+  Otherwise curl may be told to use for instance pop3 to
+  communicate with the doh server, which most likely
+  is not what you want.
   
-  Researched-by: Dan Fandrich
-  Reported-by: Ran Mozes
-  Fixes #2830
-  Closes #2831
-
-Marcel Raad (2 Aug 2018)
-- hostip: fix unused variable warning
+  Found through fuzzing.
   
-  addresses is only used in an infof call, which is a macro expanding to
-  nothing if CURL_DISABLE_VERBOSE_STRINGS is set.
+  Closes #4406
+
+- [Paul Dreik brought this change]
 
-Daniel Stenberg (2 Aug 2018)
-- test1307: disabled
+  doh: return early if there is no time left
   
-  Turns out that since we're using the native fnmatch function now when
-  available, and they simply disagree on a huge number of test patterns
-  that make it hard to test this function like this...
+  Closes #4406
+
+- [Barry Pollard brought this change]
+
+  http: lowercase headernames for HTTP/2 and HTTP/3
   
-  Fixes #2825
+  Closes #4401
+  Fixes #4400
 
-- smb: don't mark it done in smb_do
+Marcel Raad (23 Sep 2019)
+- vtls: fix narrowing conversion warnings
   
-  Follow-up to 09e401e01bf9. The SMB protocol handler needs to use its
-  doing function too, which requires smb_do() to not mark itself as
-  done...
+  Curl_timeleft returns `timediff_t`, which is 64 bits wide also on
+  32-bit systems since commit b1616dad8f0.
   
-  Closes #2822
+  Closes https://github.com/curl/curl/pull/4398
 
-- [Rikard Falkeborn brought this change]
+Daniel Stenberg (23 Sep 2019)
+- [Joel Depooter brought this change]
 
-  general: fix printf specifiers
+  winbuild: Add manifest to curl.exe for proper OS version detection
+  
+  This is a small fix to commit ebd213270a017a6830928ee2e1f4a9cabc799898
+  in pull request #1221. That commit added the CURL_EMBED_MANIFEST flag to
+  CURL_RC_FLAGS. However, later in the file CURL_RC_FLAGS is
+  overwritten. The fix is to append values to CURL_RC_FLAGS instead of
+  overwriting
   
-  Closes #2818
+  Closes #4399
 
 - RELEASE-NOTES: synced
 
-- mailmap: Daniel Jelinski
-
-- [Harry Sintonen brought this change]
+Marcel Raad (22 Sep 2019)
+- openssl: fix compiler warning with LibreSSL
+  
+  It was already fixed for BoringSSL in commit a0f8fccb1e0.
+  LibreSSL has had the second argument to SSL_CTX_set_min_proto_version
+  as uint16_t ever since the function was added in [0].
+  
+  [0] https://github.com/libressl-portable/openbsd/commit/56f107201baefb5533486d665a58d8f57fd3aeda
+  
+  Closes https://github.com/curl/curl/pull/4397
 
-  HTTP: Don't attempt to needlessly decompress redirect body
+Daniel Stenberg (22 Sep 2019)
+- curl: exit the create_transfers loop on errors
   
-  This change fixes a regression where redirect body would needlessly be
-  decompressed even though it was to be ignored anyway. As it happens this
-  causes secondary issues since there appears to be a bug in apache2 that
-  it in certain conditions generates a corrupt zlib response. The
-  regression was created by commit:
-  dbcced8e32b50c068ac297106f0502ee200a1ebd
+  When looping around the ranges and given URLs to create transfers, all
+  errors should exit the loop and return. Previously it would keep
+  looping.
   
-  Discovered-by: Harry Sintonen
-  Closes #2798
+  Reported-by: SumatraPeter on github
+  Bug: #4393
+  Closes #4396
 
-- curl: use Content-Disposition before the "URL end" for -OJ
+Jay Satiro (21 Sep 2019)
+- socks: Fix destination host shown on SOCKS5 error
+  
+  Prior to this change when a server returned a socks5 connect error then
+  curl would parse the destination address:port from that data and show it
+  to the user as the destination:
+  
+  curld -v --socks5 10.0.3.1:1080 http://google.com:99
+  * SOCKS5 communication to google.com:99
+  * SOCKS5 connect to IPv4 172.217.12.206 (locally resolved)
+  * Can't complete SOCKS5 connection to 253.127.0.0:26673. (1)
+  curl: (7) Can't complete SOCKS5 connection to 253.127.0.0:26673. (1)
+  
+  That's incorrect because the address:port included in the connect error
+  is actually a bind address:port (typically unused) and not the
+  destination address:port. This fix changes curl to show the destination
+  information that curl sent to the server instead:
+  
+  curld -v --socks5 10.0.3.1:1080 http://google.com:99
+  * SOCKS5 communication to google.com:99
+  * SOCKS5 connect to IPv4 172.217.7.14:99 (locally resolved)
+  * Can't complete SOCKS5 connection to 172.217.7.14:99. (1)
+  curl: (7) Can't complete SOCKS5 connection to 172.217.7.14:99. (1)
   
-  Regression introduced in 7.61.0
+  curld -v --socks5-hostname 10.0.3.1:1080 http://google.com:99
+  * SOCKS5 communication to google.com:99
+  * SOCKS5 connect to google.com:99 (remotely resolved)
+  * Can't complete SOCKS5 connection to google.com:99. (1)
+  curl: (7) Can't complete SOCKS5 connection to google.com:99. (1)
   
-  Reported-by: Thomas Klausner
-  Fixes #2783
-  Closes #2813
+  Ref: https://tools.ietf.org/html/rfc1928#section-6
+  
+  Closes https://github.com/curl/curl/pull/4394
 
-- [Daniel Jelinski brought this change]
+Daniel Stenberg (21 Sep 2019)
+- travis: enable ngtcp2 h3-23 builds
 
-  retry: return error if rewind was necessary but didn't happen
+- altsvc: both backends run h3-23 now
   
-  Fixes #2801
-  Closes #2812
+  Closes #4395
 
-- http2: clear the drain counter in Curl_http2_done
+- http: fix warning on conversion from int to bit
   
-  Reported-by: Andrei Virtosu
-  Fixes #2800
-  Closes #2809
+  Follow-up from 03ebe66d70
 
-- smb: fix memory leak on early failure
-  
-  ... by making sure connection related data (->share) is stored in the
-  connection and not in the easy handle.
+- urldata: use 'bool' for the bit type on MSVC compilers
   
-  Detected by OSS-fuzz
-  Bug: https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=9369
-  Fixes #2769
-  Closes #2810
+  Closes #4387
+  Fixes #4379
 
-- travis: run a 'make checksrc' too
+- appveyor: upgrade VS2017 to VS2019
   
-  ... to make sure the examples are all checked.
-  
-  Closes #2811
-
-Jay Satiro (29 Jul 2018)
-- examples/ephiperfifo: checksrc compliance
+  Closes #4383
 
-- [Michael Kaufmann brought this change]
+- [Zenju brought this change]
 
-  sws: handle EINTR when calling select()
+  FTP: FTPFILE_NOCWD: avoid redundant CWDs
   
-  Closes https://github.com/curl/curl/pull/2808
+  Closes #4382
 
-Daniel Stenberg (29 Jul 2018)
-- test1157: follow-up to 35ecffb9
+- cookie: pass in the correct cookie amount to qsort()
+  
+  As the loop discards cookies without domain set. This bug would lead to
+  qsort() trying to sort uninitialized pointers. We have however not found
+  it a security problem.
   
-  Ignore the user-agent line.
-  Pointed-out-by: Marcel Raad
+  Reported-by: Paul Dreik
+  Closes #4386
 
-Michael Kaufmann (29 Jul 2018)
-- tests/http_pipe.py: Use /usr/bin/env to find python
+- [Paul Dreik brought this change]
 
-Daniel Stenberg (28 Jul 2018)
-- TODO: Support Authority Information Access certificate extension (AIA)
+  urlapi: avoid index underflow for short ipv6 hostnames
   
-  Closes #2793
-
-- conn_free: updated comment to clarify
+  If the input hostname is "[", hlen will underflow to max of size_t when
+  it is subtracted with 2.
+  
+  hostname[hlen] will then cause a warning by ubsanitizer:
   
-  Let's call it disassociate instead of disconnect since the latter term
-  is used so much for (TCP) connections already.
+  runtime error: addition of unsigned offset to 0x<snip> overflowed to
+  0x<snip>
+  
+  I think that in practice, the generated code will work, and the output
+  of hostname[hlen] will be the first character "[".
+  
+  This can be demonstrated by the following program (tested in both clang
+  and gcc, with -O3)
+  
+  int main() {
+    char* hostname=strdup("[");
+    size_t hlen = strlen(hostname);
+  
+    hlen-=2;
+    hostname++;
+    printf("character is %d\n",+hostname[hlen]);
+    free(hostname-1);
+  }
+  
+  I found this through fuzzing, and even if it seems harmless, the proper
+  thing is to return early with an error.
+  
+  Closes #4389
+
+- [Tatsuhiro Tsujikawa brought this change]
 
-- test1157: test -H from empty file
+  ngtcp2: compile with latest ngtcp2 + nghttp3 draft-23
   
-  Verifies bugfix #2797
+  Closes #4392
 
-- [Tobias Blomberg brought this change]
+- THANKS-filter: deal with my typos 'Jat' => 'Jay'
 
-  curl: Fix segfault when -H @headerfile is empty
+- travis: use go master
   
-  The curl binary would crash if the -H command line option was given a
-  filename to read using the @filename syntax but that file was empty.
+  ... as the boringssl builds needs a very recent version
   
-  Closes #2797
+  Co-authored-by: Jat Satiro
+  Closes #4361
 
-- mime: check Curl_rand_hex's return code
+- tool_operate: removed unused variable 'done'
   
-  Bug: https://curl.haxx.se/mail/archive-2018-07/0015.html
-  Reported-by: Jeffrey Walton
-  Closes #2795
+  Fixes warning detected by PVS-Studio
+  Fixes #4374
 
-- [Josh Bialkowski brought this change]
+- tool_operate: Expression 'config->resume_from' is always true
+  
+  Fixes warning detected by PVS-Studio
+  Fixes #4374
 
-  docs/examples: add hiperfifo example using linux epoll/timerfd
+- tool_getparam: remove duplicate switch case
   
-  Closes #2804
+  Fixes warning detected by PVS-Studio
+  Fixes #4374
 
-- [Darío Hereñú brought this change]
+- libssh2: part of conditional expression is always true: !result
+  
+  Fixes warning detected by PVS-Studio
+  Fixes #4374
 
-  docs/INSTALL.md: minor formatting fixes
+- urlapi: Expression 'storep' is always true
   
-  Closes #2794
+  Fixes warning detected by PVS-Studio
+  Fixes #4374
 
-- [Christopher Head brought this change]
+- urlapi: 'scheme' is always true
+  
+  Fixes warning detected by PVS-Studio
+  Fixes #4374
 
-  docs/CURLOPT_URL: fix indentation
+- urlapi: part of conditional expression is always true: (relurl[0] == '/')
   
-  The statement, “The application does not have to keep the string around
-  after setting this option,” appears to be indented under the RTMP
-  paragraph. It actually applies to all protocols, not just RTMP.
-  Eliminate the extra indentation.
+  Fixes warning detected by PVS-Studio
+  Fixes #4374
+
+- setopt: store CURLOPT_RTSP_SERVER_CSEQ correctly
   
-  Closes #2788
+  Fixes bug detected by PVS-Studio
+  Fixes #4374
 
-- [Christopher Head brought this change]
+- mime: make Curl_mime_duppart() assert if called without valid dst
+  
+  Fixes warning detected by PVS-Studio
+  Fixes #4374
 
-  docs/CURLOPT_WRITEFUNCTION: size is always 1
+- http_proxy: part of conditional expression is always true: !error
   
-  For compatibility with `fwrite`, the `CURLOPT_WRITEFUNCTION` callback is
-  passed two `size_t` parameters which, when multiplied, designate the
-  number of bytes of data passed in. In practice, CURL always sets the
-  first parameter (`size`) to 1.
+  Fixes warning detected by PVS-Studio
+  Fixes #4374
+
+- imap: merged two case-branches performing the same action
   
-  This practice is also enshrined in documentation and cannot be changed
-  in future. The documentation states that the default callback is
-  `fwrite`, which means `fwrite` must be a suitable function for this
-  purpose. However, the documentation also states that the callback must
-  return the number of *bytes* it successfully handled, whereas ISO C
-  `fwrite` returns the number of items (each of size `size`) which it
-  wrote. The only way these numbers can be equal is if `size` is 1.
+  Fixes warning detected by PVS-Studio
+  Fixes #4374
+
+- multi: value '2L' is assigned to a boolean
   
-  Since `size` is 1 and can never be changed in future anyway, document
-  that fact explicitly and let users rely on it.
+  Fixes warning detected by PVS-Studio
+  Fixes #4374
+
+- easy: part of conditional expression is always true: !result
   
-  Closes #2787
+  Fixes warning detected by PVS-Studio
+  Fixes #4374
 
-- [Carie Pointer brought this change]
+- netrc: part of conditional expression is always true: !done
+  
+  Fixes warning detected by PVS-Studio
+  Fixes #4374
 
-  wolfSSL/CyaSSL: Fix memory leak in Curl_cyassl_random
+- version: Expression 'left > 1' is always true
   
-  RNG structure must be freed by call to FreeRng after its use in
-  Curl_cyassl_random. This call fixes Valgrind failures when running the
-  test suite with wolfSSL.
+  Fixes warning detected by PVS-Studio
+  Fixes #4374
+
+- url: remove dead code
   
-  Closes #2784
+  Fixes warning detected by PVS-Studio
+  Fixes #4374
 
-- [Even Rouault brought this change]
+- url: part of expression is always true: (bundle->multiuse == 0)
+  
+  Fixes warning detected by PVS-Studio
+  Fixes #4374
 
-  reuse_conn(): free old_conn->options
+- ftp: the conditional expression is always true
   
-  This fixes a memory leak when CURLOPT_LOGIN_OPTIONS is used, together with
-  connection reuse.
+  ... both !result and (ftp->transfer != FTPTRANSFER_BODY)!
   
-  I found this with oss-fuzz on GDAL and curl master:
-  https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=9582
-  I couldn't reproduce with the oss-fuzz original test case, but looking
-  at curl source code pointed to this well reproducable leak.
+  Fixes warning detected by PVS-Studio
+  Fixes #4374
+
+- ftp: Expression 'ftpc->wait_data_conn' is always false
   
-  Closes #2790
+  Fixes warning detected by PVS-Studio
+  Fixes #4374
 
-Marcel Raad (25 Jul 2018)
-- [Daniel Jelinski brought this change]
+- ftp: Expression 'ftpc->wait_data_conn' is always true
+  
+  Fixes warning detected by PVS-Studio
+  Fixes #4374
 
-  system_win32: fix version checking
+- ftp: part of conditional expression is always true: !result
   
-  In the current version, VERSION_GREATER_THAN_EQUAL 6.3 will return false
-  when run on windows 10.0. This patch addresses that error.
+  Fixes warning detected by PVS-Studio
+  Fixes #4374
+
+- http: fix Expression 'http->postdata' is always false
   
-  Closes https://github.com/curl/curl/pull/2792
+  Fixes warning detected by PVS-Studio
+  Fixes #4374
+  Reported-by: Valerii Zapodovnikov
 
-Daniel Stenberg (24 Jul 2018)
-- [Johannes Schindelin brought this change]
+- [Niall O'Reilly brought this change]
 
-  auth: pick Bearer authentication whenever a token is available
+  doh: avoid truncating DNS QTYPE to lower octet
   
-  So far, the code tries to pick an authentication method only if
-  user/password credentials are available, which is not the case for
-  Bearer authentictation...
-  
-  Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
-  Closes #2754
+  Closes #4381
 
-- [Johannes Schindelin brought this change]
+- [Jens Finkhaeuser brought this change]
 
-  auth: only ever pick CURLAUTH_BEARER if we *have* a Bearer token
+  urlapi: CURLU_NO_AUTHORITY allows empty authority/host part
+  
+  CURLU_NO_AUTHORITY is intended for use with unknown schemes (i.e. not
+  "file:///") to override cURL's default demand that an authority exists.
   
-  The Bearer authentication was added to cURL 7.61.0, but there is a
-  problem: if CURLAUTH_ANY is selected, and the server supports multiple
-  authentication methods including the Bearer method, we strongly prefer
-  that latter method (only CURLAUTH_NEGOTIATE beats it), and if the Bearer
-  authentication fails, we will never even try to attempt any other
-  method.
+  Closes #4349
+
+- version: next release will be 7.67.0
+
+- RELEASE-NOTES: synced
+
+- url: only reuse TLS connections with matching pinning
   
-  This is particularly unfortunate when we already know that we do not
-  have any Bearer token to work with.
+  If the requests have different CURLOPT_PINNEDPUBLICKEY strings set, the
+  connection should not be reused.
   
-  Such a scenario happens e.g. when using Git to push to Visual Studio
-  Team Services (which supports Basic and Bearer authentication among
-  other methods) and specifying the Personal Access Token directly in the
-  URL (this aproach is frequently taken by automated builds).
+  Bug: https://curl.haxx.se/mail/lib-2019-09/0061.html
+  Reported-by: Sebastian Haglund
   
-  Let's make sure that we have a Bearer token to work with before we
-  select the Bearer authentication among the available authentication
-  methods.
+  Closes #4347
+
+- README: add OSS-Fuzz badge [skip ci]
   
-  Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
-  Closes #2754
+  Closes #4380
+
+Michael Kaufmann (18 Sep 2019)
+- http: merge two "case" statements
 
-Marcel Raad (22 Jul 2018)
-- test320: treat curl320.out file as binary
+Daniel Stenberg (18 Sep 2019)
+- [Zenju brought this change]
+
+  FTP: remove trailing slash from path for LIST/MLSD
   
-  Otherwise, LF line endings are converted to CRLF on Windows,
-  but no conversion is done for the reply, so the test case fails.
+  Closes #4348
+
+- mime: when disabled, avoid C99 macro
   
-  Closes https://github.com/curl/curl/pull/2776
+  Closes #4368
 
-Daniel Stenberg (22 Jul 2018)
-- vtls: set conn->data when closing TLS
+- url: cleanup dangling DOH request headers too
   
-  Follow-up to 1b76c38904f0. The VTLS backends that close down the TLS
-  layer for a connection still needs a Curl_easy handle for the session_id
-  cache etc.
+  Follow-up to 9bc44ff64d9081
   
-  Fixes #2764
-  Closes #2771
+  Credit to OSS-Fuzz
+  Bug: https://crbug.com/oss-fuzz/17269
+  
+  Closes #4372
 
-Marcel Raad (21 Jul 2018)
-- tests: fixes for Windows line endlings
+- [Christoph M. Becker brought this change]
+
+  http2: relax verification of :authority in push promise requests
+  
+  If the :authority pseudo header field doesn't contain an explicit port,
+  we assume it is valid for the default port, instead of rejecting the
+  request for all ports.
   
-  Set mode="text" when line endings depend on the system representation.
+  Ref: https://curl.haxx.se/mail/lib-2019-09/0041.html
   
-  Closes https://github.com/curl/curl/pull/2772
+  Closes #4365
 
-- test214: disable MSYS2's POSIX path conversion for URL
+- doh: clean up dangling DOH handles and memory on easy close
   
-  By default, the MSYS2 bash converts all backslashes to forward slashes
-  in URLs. Disable this with MSYS2_ARG_CONV_EXCL for the test to pass.
+  If you set the same URL for target as for DoH (and it isn't a DoH
+  server), like "https://example.com" in both, the easy handles used for
+  the DoH requests could be left "dangling" and end up not getting freed.
   
-  Ref https://github.com/msys2/msys2/wiki/Porting#filesystem-namespaces
+  Reported-by: Paul Dreik
+  Closes #4366
 
-Daniel Stenberg (20 Jul 2018)
-- http2: several cleanups
+- unit1655: make it C90 compliant
   
-  - separate easy handle from connections better
-  - added asserts on a number of places
-  - added sanity check of pipelines for debug builds
+  Unclear why this was not detected in the CI.
   
-  Closes #2751
+  Follow-up to b7666027296a
 
-- smb_getsock: always wait for write socket too
+- smb: check for full size message before reading message details
   
-  ... the protocol is doing read/write a lot, so it needs to write often
-  even when downloading. A more proper fix could check for eactly when it
-  wants to write and only ask for it then.
+  To avoid reading of uninitialized data.
   
-  Without this fix, an SMB download could easily get stuck when the event-driven
-  API was used.
-  
-  Closes #2768
+  Assisted-by: Max Dymond
+  Bug: https://crbug.com/oss-fuzz/16907
+  Closes #4363
 
-Marcel Raad (20 Jul 2018)
-- test1143: disable MSYS2's POSIX path conversion
+- quiche: persist connection details
   
-  By default, the MSYS2 bash interprets http:/%HOSTIP:%HTTPPORT/want/1143
-  as a POSIX file list and converts it to a Windows file list.
-  Disable this with MSYS2_ARG_CONV_EXCL for the test to pass.
+  ... like we do for other protocols at connect time. This makes "curl -I"
+  and other things work.
   
-  Ref https://github.com/msys2/msys2/wiki/Porting#filesystem-namespaces
-  Closes https://github.com/curl/curl/pull/2765
+  Reported-by: George Liu
+  Fixes #4358
+  Closes #4360
 
-Daniel Stenberg (18 Jul 2018)
-- RELEASE-NOTES: sync
+- openssl: fix warning with boringssl and SSL_CTX_set_min_proto_version
   
-  ... and work toward 7.61.1
+  Follow-up to ffe34b7b59
+  Closes #4359
 
-- [Ruslan Baratov brought this change]
+- [Paul Dreik brought this change]
 
-  CMake: Update scripts to use consistent style
+  doh: fix undefined behaviour and open up for gcc and clang optimization
   
-  Closes #2727
-  Reviewed-by: Sergei Nikulov
-
-- header output: switch off all styles, not just unbold
+  The undefined behaviour is annoying when running fuzzing with
+  sanitizers. The codegen is the same, but the meaning is now not up for
+  dispute. See https://cppinsights.io/s/516a2ff4
   
-  ... the "unbold" sequence doesn't work on the mac Terminal.
+  By incrementing the pointer first, both gcc and clang recognize this as
+  a bswap and optimizes it to a single instruction.  See
+  https://godbolt.org/z/994Zpx
   
-  Reported-by: Zero King
-  Fixes #2736
-  Closes #2738
-
-Nick Zitzmann (14 Jul 2018)
-- [Rodger Combs brought this change]
+  Closes #4350
 
-  darwinssl: add support for ALPN negotiation
+- [Paul Dreik brought this change]
 
-Marcel Raad (14 Jul 2018)
-- test1422: add required file feature
+  doh: fix (harmless) buffer overrun
   
-  curl configured with --enable-debug --disable-file currently complains
-  on test1422:
-  Info: Protocol "file" not supported or disabled in libcurl
+  Added unit test case 1655 to verify.
+  Close #4352
   
-  Make test1422 dependend on enabled FILE protocol to fix this.
-  
-  Fixes https://github.com/curl/curl/issues/2741
-  Closes https://github.com/curl/curl/pull/2742
+  the code correctly finds the flaws in the old code,
+  if one temporarily restores doh.c to the old version.
 
-Patrick Monnerat (12 Jul 2018)
-- content_encoding: accept up to 4 unknown trailer bytes after raw deflate data
-  
-  Some servers issue raw deflate data that may be followed by an undocumented
-  trailer. This commit makes curl tolerate such a trailer of up to 4 bytes
-  before considering the data is in error.
-  
-  Reported-by: clbr on github
-  Fixes #2719
+Alessandro Ghedini (15 Sep 2019)
+- docs: remove trailing ':' from section names in CURLOPT_TRAILER* man
 
-Daniel Stenberg (12 Jul 2018)
-- smb: fix memory-leak in URL parse error path
-  
-  Detected by OSS-Fuzz
-  Bug: https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=9369
-  Closes #2740
+- docs: fix typo in CURLOPT_HTTP_VERSION man
 
-Marcel Raad (12 Jul 2018)
-- schannel: enable CALG_TLS1PRF for w32api >= 5.1
+GitHub (14 Sep 2019)
+- [Daniel Stenberg brought this change]
+
+  CI: inintial github action job
   
-  The definition of CALG_TLS1PRF has been fixed in the 5.1 branch:
-  https://osdn.net/projects/mingw/scm/git/mingw-org-wsl/commits/73aedcc0f2e6ba370de0d86ab878ad76a0dda7b5
+  First shot at a CI build on github actions
 
-Daniel Stenberg (12 Jul 2018)
-- docs/SECURITY-PROCESS: mention bounty, drop pre-notify
+Daniel Stenberg (13 Sep 2019)
+- appveyor: add a winbuild
   
-  + The hackerone bounty and its process
+  Assisted-by: Marcel Raad
+  Assisted-by: Jay Satiro
   
-  - We don't and can't handle pre-notification
+  Closes #4324
 
-- multi: always do the COMPLETED procedure/state
+- FTP: allow "rubbish" prepended to the SIZE response
   
-  It was previously erroneously skipped in some situations.
+  This is a protocol violation but apparently there are legacy proprietary
+  servers doing this.
   
-  libtest/libntlmconnect.c wrongly depended on wrong behavior (that it
-  would get a zero timeout) when no handles are "running" in a multi
-  handle. That behavior is no longer present with this fix. Now libcurl
-  will always return a -1 timeout when all handles are completed.
-  
-  Closes #2733
-
-- Curl_getoff_all_pipelines: improved for multiplexed
+  Added test 336 and 337 to verify.
   
-  On multiplexed connections, transfers can be removed from anywhere not
-  just at the head as for pipelines.
+  Reported-by: Philippe Marguinaud
+  Closes #4339
 
-- ares: check for NULL in completed-callback
+- [Zenju brought this change]
 
-- conn: remove the boolean 'inuse' field
+  FTP: skip CWD to entry dir when target is absolute
   
-  ... as the usage needs to be counted.
+  Closes #4332
 
-- [Paul Howarth brought this change]
-
-  openssl: assume engine support in 1.0.0 or later
+Kamil Dudka (13 Sep 2019)
+- curl: fix memory leaked by parse_metalink()
   
-  Commit 38203f1585da changed engine detection to be version-based,
-  with a baseline of openssl 1.0.1. This does in fact break builds
-  with openssl 1.0.0, which has engine support - the configure script
-  detects that ENGINE_cleanup() is available - but <openssl/engine.h>
-  doesn't get included to declare it.
+  This commit fixes a regression introduced by curl-7_65_3-5-gb88940850.
+  Detected by tests 2005, 2008, 2009, 2010, 2011, and 2012 with valgrind
+  and libmetalink enabled.
   
-  According to upstream documentation, engine support was added to
-  mainstream openssl builds as of version 0.9.7:
-  https://github.com/openssl/openssl/blob/master/README.ENGINE
+  Closes #4326
+
+Daniel Stenberg (13 Sep 2019)
+- parsedate: still provide the name arrays when disabled
   
-  This commit drops the version test down to 1.0.0 as version 1.0.0d
-  is the oldest version I have to test with.
+  If FILE or FTP are enabled, since they also use them!
   
-  Closes #2732
+  Reported-by: Roland Hieber
+  Fixes #4325
+  Closes #4343
 
-Marcel Raad (11 Jul 2018)
-- schannel: fix MinGW compile break
-  
-  Original MinGW's w32api has a sytax error in its definition of
-  CALG_TLS1PRF [0]. Don't use original MinGW w32api's CALG_TLS1PRF
-  until this bug [1] is fixed.
+- [Gilles Vollant brought this change]
+
+  curl:file2string: load large files much faster
   
-  [0] https://osdn.net/projects/mingw/scm/git/mingw-org-wsl/blobs/d1d4a17e51a2b78e252ef0147d483267d56c90cc/w32api/include/wincrypt.h
-  [1] https://osdn.net/projects/mingw/ticket/38391
+  ... by using a more efficient realloc scheme.
   
-  Fixes https://github.com/curl/curl/pull/2721#issuecomment-403636043
-  Closes https://github.com/curl/curl/pull/2728
+  Bug: https://curl.haxx.se/mail/lib-2019-09/0045.html
+  Closes #4336
 
-Daniel Stenberg (11 Jul 2018)
-- examples/crawler.c: move #ifdef to column 0
+- openssl: close_notify on the FTP data connection doesn't mean closure
   
-  Apparently the C => HTML converter on the web site doesn't quite like it
-  otherwise.
+  For FTPS transfers, curl gets close_notify on the data connection
+  without that being a signal to close the control connection!
   
-  Reported-by: Jeroen Ooms
-
-Version 7.61.0 (11 Jul 2018)
+  Regression since 3f5da4e59a556fc (7.65.0)
+  
+  Reported-by: Zenju on github
+  Reviewed-by: Jay Satiro
+  Fixes #4329
+  Closes #4340
 
-Daniel Stenberg (11 Jul 2018)
-- release: 7.61.0
+- [Jimmy Gaussen brought this change]
 
-- TODO: Configurable loading of OpenSSL configuration file
+  docs/HTTP3: fix `--with-ssl` ngtcp2 configure flag
   
-  Closes #2724
+  Closes #4338
 
-- post303.d: clarify that this is an RFC violation
-  
-  ... and not the other way around, which this previously said.
-  
-  Reported-by: Vasiliy Faronov
-  Fixes #2723
-  Closes #2726
+- RELEASE-NOTES: synced
 
-- [Ruslan Baratov brought this change]
+- curlver: bump to 7.66.1
 
-  CMake: remove redundant and old end-of-block syntax
-  
-  Reviewed-by: Jakub Zakrzewski
-  Closes #2715
+- [Zenju brought this change]
 
-Jay Satiro (9 Jul 2018)
-- lib/curl_setup.h: remove unicode character
+  setopt: make it easier to add new enum values
+  
+  ... by using the *_LAST define names better.
   
-  Follow-up to 82ce416.
+  Closes #4321
+
+- asyn-thread: s/AF_LOCAL/AF_UNIX for Solaris
   
-  Ref: https://github.com/curl/curl/commit/8272ec5#commitcomment-29646818
+  Reported-by: Dagobert Michelsen
+  Fixes #4328
+  Closes #4333
 
-Daniel Stenberg (9 Jul 2018)
-- lib/curl_setup.h: remove unicode bom from 8272ec50f02
+- [Bernhard Walle brought this change]
 
-Marcel Raad (9 Jul 2018)
-- schannel: fix -Wsign-compare warning
+  winbuild/MakefileBuild.vc: Add vssh
   
-  MinGW warns:
-  /lib/vtls/schannel.c:219:64: warning: signed and unsigned type in
-  conditional expression [-Wsign-compare]
+  Without that modification, the Windows build using the makefiles doesn't
+  work.
   
-  Fix this by casting the ptrdiff_t to size_t as we know it's positive.
+  Signed-off-by: Bernhard Walle <bernhard.walle@posteo.eu>
   
-  Closes https://github.com/curl/curl/pull/2721
+  Fixes #4322
+  Closes #4323
 
-- schannel: workaround for wrong function signature in w32api
+Bernhard Walle (11 Sep 2019)
+- winbuild/MakefileBuild.vc: Fix line endings
   
-  Original MinGW's w32api has CryptHashData's second parameter as BYTE *
-  instead of const BYTE *.
+  The file had mixed line endings.
   
-  Closes https://github.com/curl/curl/pull/2721
+  Signed-off-by: Bernhard Walle <bernhard.walle@posteo.eu>
 
-- schannel: make more cipher options conditional
+Jay Satiro (11 Sep 2019)
+- ldap: Stop using wide char version of ldapp_err2string
   
-  They are not defined in the original MinGW's <wincrypt.h>.
+  Despite ldapp_err2string being documented by MS as returning a
+  PCHAR (char *), when UNICODE it is mapped to ldap_err2stringW and
+  returns PWCHAR (wchar_t *).
   
-  Closes https://github.com/curl/curl/pull/2721
-
-- curl_setup: include <winerror.h> before <windows.h>
+  We have lots of code that expects ldap_err2string to return char *,
+  most of it failf used like this:
   
-  Otherwise, only part of it gets pulled in through <windows.h> on
-  original MinGW.
+  failf(data, "LDAP local: Some error: %s", ldap_err2string(rc));
   
-  Fixes https://github.com/curl/curl/issues/2361
-  Closes https://github.com/curl/curl/pull/2721
+  Closes https://github.com/curl/curl/pull/4272
 
-- examples: fix -Wformat warnings
-  
-  When size_t is not a typedef for unsigned long (as usually the case on
-  Windows), GCC emits -Wformat warnings when using lu and lx format
-  specifiers with size_t. Silence them with explicit casts to
-  unsigned long.
-  
-  Closes https://github.com/curl/curl/pull/2721
+Version 7.66.0 (10 Sep 2019)
+
+Daniel Stenberg (10 Sep 2019)
+- RELEASE-NOTES: curl 7.66.0
 
-Daniel Stenberg (9 Jul 2018)
-- smtp: use the upload buffer size for scratch buffer malloc
+- THANKS: from the 7.66.0 release
+
+- curl: make sure the parallel transfers do them all
   
-  ... not the read buffer size, as that can be set smaller and thus cause
-  a buffer overflow! CVE-2018-0500
+  The logic could erroneously break the loop too early before all
+  transfers had been transferred.
   
-  Reported-by: Peter Wu
-  Bug: https://curl.haxx.se/docs/adv_2018-70a2.html
+  Reported-by: Tom van der Woerdt
+  Fixes #4316
+  Closes #4317
 
-- [Dave Reisner brought this change]
+- urlapi: one colon is enough for the strspn() input (typo)
 
-  scripts: include _curl as part of CLEANFILES
+- urlapi: verify the IPv6 numerical address
+  
+  It needs to parse correctly. Otherwise it could be tricked into letting
+  through a-f using host names that libcurl would then resolve. Like
+  '[ab.be]'.
   
-  Closes #2718
+  Reported-by: Thomas Vegas
+  Closes #4315
 
-- [Nick Zitzmann brought this change]
+- [Clément Notin brought this change]
 
-  darwinssl: allow High Sierra users to build the code using GCC
+  openssl: use SSL_CTX_set_<min|max>_proto_version() when available
   
-  ...but GCC users lose out on TLS 1.3 support, since we can't weak-link
-  enumeration constants.
+  OpenSSL 1.1.0 adds SSL_CTX_set_<min|max>_proto_version() that we now use
+  when available.  Existing code is preserved for older versions of
+  OpenSSL.
   
-  Fixes #2656
-  Closes #2703
+  Closes #4304
 
-- [Ruslan Baratov brought this change]
+- [Clément Notin brought this change]
 
-  CMake: Remove unused 'output_var' from 'collect_true'
-  
-  Variable 'output_var' is not used and can be removed.
-  Function 'collect_true' renamed to 'count_true'.
+  openssl: indent, re-organize and add comments
 
-- [Ruslan Baratov brought this change]
+- [migueljcrum brought this change]
 
-  CMake: Remove unused functions
+  sspi: fix memory leaks
   
-  Closes #2711
+  Closes #4299
 
-- KNOWN_BUGS: Stick to same family over SOCKS proxy
+- travis: disable ngtcp2 builds (again)
 
-- libssh: goto DISCONNECT state on error, not SSH_SESSION_FREE
+- Curl_fillreadbuffer: avoid double-free trailer buf on error
   
-  ... because otherwise not everything get closed down correctly.
+  Reviewed-by: Jay Satiro
+  Reported-by: Thomas Vegas
   
-  Fixes #2708
-  Closes #2712
+  Closes #4307
 
-- libssh: include line number in state change debug messages
+- tool_setopt: handle a libcurl build without netrc support
   
-  Closes #2713
+  Reported-by: codesniffer13 on github
+  Fixes #4302
+  Closes #4305
 
-- KNOWN_BUGS: Borland support is dropped, AIX problem is too old
-
-- [Jeroen Ooms brought this change]
-
-  example/crawler.c: simple crawler based on libxml2
+- security:read_data fix bad realloc()
   
-  Closes #2706
-
-- RELEASE-NOTES: synced
+  ... that could end up a double-free
+  
+  CVE-2019-5481
+  Bug: https://curl.haxx.se/docs/CVE-2019-5481.html
 
-- DEPRECATE: include year when specifying date
+- [Thomas Vegas brought this change]
 
-- DEPRECATE: linkified
+  tftp: Alloc maximum blksize, and use default unless OACK is received
+  
+  Fixes potential buffer overflow from 'recvfrom()', should the server
+  return an OACK without blksize.
+  
+  Bug: https://curl.haxx.se/docs/CVE-2019-5482.html
+  CVE-2019-5482
 
-- DEPRECATE: mention the PR that disabled axTLS
+- [Thomas Vegas brought this change]
 
-- docs/DEPRECATE.md: spelling and minor formatting
+  tftp: return error when packet is too small for options
 
-- DEPRECATE: new doc describing planned item removals
-  
-  Closes #2704
+- KNOWN_BUGS/TODO: cleanup and remove outdated issues
 
-- [Gisle Vanem brought this change]
+- RELEASE-NOTES: synced
 
-  telnet: fix clang warnings
+- netrc: free 'home' on error
   
-  telnet.c(1401,28): warning: cast from function call of type 'int' to
-  non-matching type 'HANDLE' (aka 'void *') [-Wbad-function-cast]
+  Follow-up to f9c7ba9096ec2
   
-  Fixes #2696
-  Closes #2700
-
-- docs: fix missed option name markups
-
-- [Gaurav Malhotra brought this change]
-
-  openssl: Remove some dead code
+  Coverity CID 1453474
   
-  Closes #2698
+  Closes #4291
 
-- openssl: make the requested TLS version the *minimum* wanted
+- urldata: avoid 'generic', use dedicated pointers
   
-  The code treated the set version as the *exact* version to require in
-  the TLS handshake, which is not what other TLS backends do and probably
-  not what most people expect either.
+  For the 'proto' union within the connectdata struct.
   
-  Reported-by: Andreas Olsson
-  Assisted-by: Gaurav Malhotra
-  Fixes #2691
-  Closes #2694
-
-- RELEASE-NOTES: synced
+  Closes #4290
 
-- openssl: allow TLS 1.3 by default
+- cleanup: move functions out of url.c and make them static
   
-  Reported-by: Andreas Olsson
-  Fixes #2692
-  Closes #2693
-
-- [Adrian Peniak brought this change]
+  Closes #4289
 
-  CURLINFO_TLS_SSL_PTR.3: improve the example
+- smtp: check for and bail out on too short EHLO response
   
-  The previous example was a little bit confusing, because SSL* structure
-  (or other "in use" SSL connection pointer) is not accessible after the
-  transfer is completed, therefore working with the raw TLS library
-  specific pointer needs to be done during transfer.
+  Otherwise, a three byte response would make the smtp_state_ehlo_resp()
+  function misbehave.
   
-  Closes #2690
-
-- travis: add a build using the synchronous name resolver
+  Credit to OSS-Fuzz
+  Bug: https://crbug.com/oss-fuzz/16918
   
-  ... since default uses the threaded one and we test the c-ares build
-  already.
+  Assisted-by: Max Dymond
   
-  Closes #2689
+  Closes #4287
 
-- configure: remove CURL_CHECK_NI_WITHSCOPEID too
+- smb: init *msg to NULL in smb_send_and_recv()
   
-  Since it isn't used either and requires the getnameinfo check
+  ... it might otherwise return OK from this function leaving that pointer
+  uninitialized.
   
-  Follow-up to 0aeca41702d2
-
-- getnameinfo: not used
+  Bug: https://crbug.com/oss-fuzz/16907
   
-  Closes #2687
+  Closes #4286
 
-- easy_perform: use *multi_timeout() to get wait times
+- ROADMAP: updated after recent user poll
   
-  ... and trim the threaded Curl_resolver_getsock() to return zero
-  millisecond wait times during the first three milliseconds so that
-  localhost or names in the OS resolver cache gets detected and used
-  faster.
-  
-  Closes #2685
+  In rough prio order
+
+- THANKS: remove duplicate
 
-Max Dymond (27 Jun 2018)
-- configure: Add dependent libraries after crypto
+- Curl_addr2string: take an addrlen argument too
   
-  The linker is pretty dumb and processes things left to right, keeping a
-  tally of symbols it hasn't resolved yet. So, we need -ldl to appear
-  after -lcrypto otherwise the linker won't find the dl functions.
+  This allows the function to figure out if a unix domain socket has a
+  file name or not associated with it! When a socket is created with
+  socketpair(), as done in the fuzzer testing, the path struct member is
+  uninitialized and must not be accessed.
   
-  Closes #2684
+  Bug: https://crbug.com/oss-fuzz/16699
+  
+  Closes #4283
 
-Daniel Stenberg (27 Jun 2018)
-- GOVERNANCE: linkify, changed some titles
+- [Rolf Eike Beer brought this change]
 
-- GOVERNANCE: add maintainer details/duties
+  CMake: remove needless newlines at end of gss variables
 
-- url: check Curl_conncache_add_conn return code
-  
-  ... it was previously unchecked in two places and thus errors could
-  remain undetected and cause trouble.
-  
-  Closes #2681
+- [Rolf Eike Beer brought this change]
 
-- include/README: remove "hacking" advice, not the right place
+  CI: remove duplicate configure flag for LGTM.com
 
-- RELEASE-NOTES: synced
+- [Rolf Eike Beer brought this change]
 
-- CURLOPT_SSL_VERIFYPEER.3: fix syntax mistake
+  CMake: use platform dependent name for dlopen() library
   
-  Follow-up to b6a16afa0aa5
+  Closes #4279
 
-- netrc: use a larger buffer
+- quiche: expire when poll returned data
   
-  ... to work with longer passwords etc. Grow it from a 256 to a 4096
-  bytes buffer.
+  ... to make sure we continue draining the queue until empty
   
-  Reported-by: Dario Nieuwenhuis
-  Fixes #2676
-  Closes #2680
+  Closes #4281
 
-- [Patrick Schlangen brought this change]
-
-  CURLOPT_SSL_VERIFYPEER.3: Add performance note
+- quiche: decrease available buffer size, don't assign it!
   
-  Closes #2673
+  Found-by: Jeremy Lainé
 
-- [Javier Blazquez brought this change]
+- RELEASE-NOTES: synced
 
-  multi: fix crash due to dangling entry in connect-pending list
-  
-  Fixes #2677
-  Closes #2679
+- [Kyohei Kadota brought this change]
 
-- ConnectionExists: make sure conn->data is set when "taking" a connection
-  
-  Follow-up to 2c15693.
-  
-  Bug #2674
-  Closes #2675
+  curl: fix include conditions
 
-- [Kevin R. Bulgrien brought this change]
+- [Kyohei Kadota brought this change]
 
-  system.h: fix for gcc on 32 bit OpenServer
+  plan9: fix installation instructions
   
-  Bug: https://curl.haxx.se/mail/lib-2018-06/0100.html
+  Closes #4276
 
-- [Raphael Gozzo brought this change]
-
-  cmake: allow multiple SSL backends
+- ngtcp2: on h3 stream close, call expire
   
-  This will make possible to select the SSL backend (using
-  curl_global_sslset()) even when the libcurl is built using CMake
+  ... to trigger a new read to detect the stream close!
   
-  Closes #2665
+  Closes #4275
+
+- [Tatsuhiro Tsujikawa brought this change]
 
-- url: fix dangling conn->data pointer
+  ngtcp2: build latest ngtcp2 and ngtcp2_crypto_openssl
   
-  By masking sure to use the *current* easy handle with extracted
-  connections from the cache, and make sure to NULLify the ->data pointer
-  when the connection is put into the cache to make this mistake easier to
-  detect in the future.
+  Closes #4278
+
+- ngtcp2: set flow control window to stream buffer size
   
-  Reported-by: Will Dietz
-  Fixes #2669
-  Closes #2672
+  Closes #4274
 
-- CURLOPT_INTERFACE.3: interface names not supported on Windows
+- [Christopher Head brought this change]
 
-- travis: run more tests for coverage check
+  CURLOPT_HEADERFUNCTION.3: clarify
   
-  ... run a few more tortured based and run all tests event-based.
-  
-  Closes #2664
+  Closes #4273
 
-- multi: fix memory leak when stopped during name resolve
-  
-  When the application just started the transfer and then stops it while
-  the name resolve in the background thread hasn't completed, we need to
-  wait for the resolve to complete and then cleanup data accordingly.
+- CURLINFO docs: mention that in redirects times are added
   
-  Enabled test 1553 again and added test 1590 to also check when the host
-  name resolves successfully.
-  
-  Detected by OSS-fuzz.
-  Closes #1968
+  Suggested-by: Brandon Dong
+  Fixes #4250
+  Closes #4269
 
-Viktor Szakats (15 Jun 2018)
-- maketgz: delete .bak files, fix indentation
+- travis: enable ngtcp2 builds again
   
-  Ref: https://github.com/curl/curl/pull/2660
+  Switched to the openssl-quic-draft-22 openssl branch.
   
-  Closes https://github.com/curl/curl/pull/2662
+  Closes #4271
 
-Daniel Stenberg (15 Jun 2018)
-- runtests.pl: remove debug leftover from bb9a340c73f3
+- HTTP3: switched openssl branch to use
 
-- curl-confopts.m4: fix typo from ed224f23d5beb
-  
-  Fixes my local configure to detect a custom installed c-ares without
-  pkgconfig.
+- [Tatsuhiro Tsujikawa brought this change]
 
-- docs/RELEASE-PROCEDURE.md: renamed to use .md extension
+  ngtcp2: Build with latest ngtcp2 and ngtcp2_crypto_openssl
   
-  Closes #2663
+  Closes #4270
 
-- RELEASE-PROCEDURE: gpg sign the tags
+- http2: when marked for closure and wanted to close == OK
+  
+  It could otherwise return an error even when closed correctly if GOAWAY
+  had been received previously.
+  
+  Reported-by: Tom van der Woerdt
+  Fixes #4267
+  Closes #4268
 
 - RELEASE-NOTES: synced
 
-- CURLOPT_HTTPAUTH.3: CURLAUTH_BEARER was added in 7.61.0
-
-- [Mamta Upadhyay brought this change]
-
-  maketgz: fix sed issues on OSX
+- build-openssl: fix build with Visual Studio 2019
   
-  maketgz creates release tarballs and removes the -DEV string in curl
-  version (e.g. 7.58.0-DEV), else -DEV shows up on command line when curl
-  is run. maketgz works fine on linux but fails on OSX. Problem is with
-  the sed commands that use option -i without an extension. Maketgz
-  expects GNU sed instead of BSD and this simply won't work on OSX. Adding
-  a backup extension .bak after -i fixes this issue
-  
-  Running the script as if on OSX gives this error:
-  
-  sed: -e: No such file or directory
+  Reviewed-by: Marcel Raad
+  Contributed-by: osabc on github
+  Fixes #4188
+  Closes #4266
+
+Kamil Dudka (26 Aug 2019)
+- vauth: return CURLE_AUTH_ERROR on gss_init_sec_context() failure
   
-  Adding a .bak extension resolves it
+  This is a follow-up to https://github.com/curl/curl/pull/3864 .
   
-  Closes #2660
+  Closes #4224
 
-- configure: enhance ability to detect/build with static openssl
+Daniel Stenberg (26 Aug 2019)
+- KNOWN_BUGS: USE_UNIX_SOCKETS on Windows
   
-  Fix the -ldl and -ldl + -lpthread checks for OpenSSL, necessary for
-  building with static libs without pkg-config.
+  Closes #4040
+
+- quiche: send the HTTP body correctly on callback uploads
   
-  Reported-by: Marcel Raad
-  Fixes #2199
-  Closes #2659
+  Closes #4265
 
-- configure: use pkg-config for c-ares detection
+- travis: disable ngtcp2 builds (temporarily)
   
-  First check if there's c-ares information given as pkg-config info and use
-  that as first preference.
+  Just too many API changes right now
   
-  Reported-by: pszemus on github
-  Fixes #2203
-  Closes #2658
+  Closes #4264
 
-- GOVERNANCE.md: explains how this project is run
+- ngtcp2: add support for SSLKEYLOGFILE
   
-  Closes #2657
+  Closes #4260
 
-- KNOWN_BUGS: NTLM doen't support password with § character
+- ngtcp2: improve h3 response receiving
   
-  Closes #2120
+  Closes #4259
+
+- ngtcp2: use nghttp3_version()
 
-- KNOWN_BUGS: slow connect to localhost on Windows
+- ngtcp2: sync with upstream API changes
   
-  Closes #2281
+  Assisted-by: Tatsuhiro Tsujikawa
 
-- [Matteo Bignotti brought this change]
+- [Kyle Abramowitz brought this change]
 
-  mk-ca-bundle.pl: make -u delete certdata.txt if found not changed
+  scp: fix directory name length used in memcpy
   
-  certdata.txt should be deleted also when the process is interrupted by
-  "same certificate downloaded, exiting"
+  Fix read off end of array due to bad pointer math in getworkingpath for
+  SCP home directory case.
   
-  The certdata.txt is currently kept on disk even if you give the -u
-  option
-  
-  Closes #2655
+  Closes #4258
 
-- progress: remove a set of unused defines
+- http: the 'closed' struct field is used by both ngh2 and ngh3
   
-  Reported-by: Peter Wu
-  Closes #2654
-
-- TODO: "Option to refuse usernames in URLs" done
+  and remove 'header_recvbuf', not used for anything
   
-  Implemented by Björn in 946ce5b61f
-
-- [Lyman Epp brought this change]
-
-  Curl_init_do: handle NULL connection pointer passed in
+  Reported-by: Jeremy Lainé
   
-  Closes #2653
+  Closes #4257
 
-- runtests: support variables in <strippart>
+- ngtcp2: accept upload via callback
   
-  ... and make use of that to make 1455 work better without using a fixed
-  local port number.
-  
-  Fixes #2649
-  Closes #2650
+  Closes #4256
 
-- Curl_debug: remove dead printhost code
+- defines: avoid underscore-prefixed defines
   
-  The struct field is never set (since 5e0d9aea3) so remove the use of it
-  and remove the connectdata pointer from the prototype.
+  Double-underscored or underscore plus uppercase letter at least.
   
-  Reported-by: Tejas
-  Bug: https://curl.haxx.se/mail/lib-2018-06/0054.html
-  Closes #2647
-
-Viktor Szakats (12 Jun 2018)
-- schannel: avoid incompatible pointer warning
+  ... as they're claimed to be reserved.
   
-  with clang-6.0:
-  ```
-  vtls/schannel_verify.c: In function 'add_certs_to_store':
-  vtls/schannel_verify.c:212:30: warning: passing argument 11 of 'CryptQueryObject' from incompatible pointer type [-Wincompatible-pointer-types]
-                                &cert_context)) {
-                                ^
-  In file included from /usr/share/mingw-w64/include/schannel.h:10:0,
-                   from /usr/share/mingw-w64/include/schnlsp.h:9,
-                   from vtls/schannel.h:29,
-                   from vtls/schannel_verify.c:40:
-  /usr/share/mingw-w64/include/wincrypt.h:4437:26: note: expected 'const void **' but argument is of type 'CERT_CONTEXT ** {aka struct _CERT_CONTEXT **}'
-     WINIMPM WINBOOL WINAPI CryptQueryObject (DWORD dwObjectType, const void *pvObject, DWORD dwExpectedContentTypeFlags, DWORD dwExpectedFormatTypeFlags, DWORD dwFlags,
-                            ^~~~~~~~~~~~~~~~
-  ```
-  Ref: https://msdn.microsoft.com/library/windows/desktop/aa380264
+  Reported-by: patnyb on github
   
-  Closes https://github.com/curl/curl/pull/2648
+  Fixes #4254
+  Closes #4255
 
-Daniel Stenberg (12 Jun 2018)
-- [Robert Prag brought this change]
-
-  schannel: support selecting ciphers
+- travis: add a build using ngtcp2 + nghttp3 (and a patched OpenSSL)
   
-  Given the contstraints of SChannel, I'm exposing these as the algorithms
-  themselves instead; while replicating the ciphersuite as specified by
-  OpenSSL would have been preferable, I found no way in the SChannel API
-  to do so.
+  Runs no tests
   
-  To use this from the commandline, you need to pass the names of contants
-  defining the desired algorithms. For example, curl --ciphers
-  "CALG_SHA1:CALG_RSA_SIGN:CALG_RSA_KEYX:CALG_AES_128:CALG_DH_EPHEM"
-  https://github.com The specific names come from wincrypt.h
+  Closes #4253
+
+- travis: bump to using nghttp2 version 1.39.2
   
-  Closes #2630
+  Closes #4252
 
-- [Bernhard M. Wiedemann brought this change]
+- [Gisle Vanem brought this change]
 
-  test 46: make test pass after 2025
-  
-  shifting the expiry date to 2037 for now
-  to be before the possibly problematic year 2038
+  docs/examples/curlx: fix errors
   
-  similar in spirit to commit e6293cf8764e9eecb
+  Initialise 'mimetype' and require the -p12 arg.
   
-  Closes #2646
+  Closes #4248
 
-- [Marian Klymov brought this change]
-
-  cppcheck: fix warnings
-  
-  - Get rid of variable that was generating false positive warning
-  (unitialized)
+- cleanup: remove DOT_CHAR completely
   
-  - Fix issues in tests
+  Follow-up to f9c7ba9096ec
   
-  - Reduce scope of several variables all over
+  The use of DOT_CHAR for ".ssh" was probably a mistake and is removed
+  now.
   
-  etc
+  Pointed-out-by: Gisle Vanem
+  Bug: https://github.com/curl/curl/pull/4230#issuecomment-522960638
   
-  Closes #2631
+  Closes #4247
 
-- openssl: assume engine support in 1.0.1 or later
+- spnego_sspi: add typecast to fix build warning
   
-  Previously it was checked for in configure/cmake, but that would then
-  leave other build systems built without engine support.
+  Reported in build "Win32 target on Debian Stretch (64-bit) -
+  i686-w64-mingw32 - gcc-20170516"
   
-  While engine support probably existed prior to 1.0.1, I decided to play
-  safe. If someone experience a problem with this, we can widen the
-  version check.
+  Closes #4245
+
+- openssl: build warning free with boringssl
   
-  Fixes #2641
-  Closes #2644
+  Closes #4244
 
-- RELEASE-NOTES: synced
+- curl: make --libcurl use CURL_HTTP_VERSION_3
+  
+  Closes #4243
+
+- ngtcp2: make postfields-set posts work
+  
+  Closes #4242
 
-- RELEASE-PROCEDURE: update the release calendar for 2019
+- http: remove chunked-encoding and expect header use for HTTP/3
 
-- [Gisle Vanem brought this change]
+- [Alessandro Ghedini brought this change]
 
-  boringssl + schannel: undef X509_NAME in lib/schannel.h
+  configure: use pkg-config to detect quiche
   
-  Fixes the build problem when both boringssl and schannel are enabled.
+  This removes the need to hard-code the quiche target path in
+  configure.ac.
   
-  Fixes #2634
-  Closes #2643
-
-- [Vladimir Kotal brought this change]
-
-  mk-ca-bundle.pl: leave certificate name untouched in decode()
+  This depends on https://github.com/cloudflare/quiche/pull/128
   
-  Closes #2640
-
-- [Rikard Falkeborn brought this change]
+  Closes #4237
 
-  tests/libtests/Makefile.am: Add lib1521.c to CLEANFILES
+- CURLOPT_SSL_VERIFYHOST: treat the value 1 as 2
   
-  This removes the generated lib1521.c when running make clean.
+  For a long time (since 7.28.1) we've returned error when setting the
+  value to 1 to make applications notice that we stopped supported the old
+  behavior for 1. Starting now, we treat 1 and 2 exactly the same.
   
-  Closes #2633
-
-- [Rikard Falkeborn brought this change]
+  Closes #4241
 
-  tests/libtest: Add lib1521 to nodist_SOURCES
+- curl: use .curlrc (with a dot) on Windows as well
   
-  Since 467da3af0, lib1521.c is generated instead of checked in. According
-  to the commit message, the intention was to remove it from the tarball
-  as well. However, it is still present when running make dist. To remove
-  it, add it to nodist_lib1521_SOURCES. This also means there is no need
-  for the manually added dist-rule in the Makefile.
+  Fall-back to _curlrc if the dot-version is missing.
   
-  Also update CMakelists.txt to handle the fact that we now may have
-  nodist_SOURCES.
-
-- [Stephan Mühlstrasser brought this change]
+  Co-Authored-By: Steve Holme
+  
+  Closes #4230
 
-  system.h: add support for IBM xlc C compiler
+- netrc: make the code try ".netrc" on Windows as well
   
-  Added a section to system.h guarded with __xlc__ for the IBM xml C
-  compiler. Before this change the section titled 'generic "safe guess" on
-  old 32 bit style' was used, which resulted in a wrong definition of
-  CURL_TYPEOF_CURL_SOCKLEN_T, and for 64-bit also CURL_TYPEOF_CURL_OFF_T
-  was wrong.
+  ... but fall back and try "_netrc" too if the dot version didn't work.
   
-  Compilation warnings fixed with this change:
+  Co-Authored-By: Steve Holme
+
+- ngtcp2: use ngtcp2_version() to get the run-time version
   
-    CC       libcurl_la-ftp.lo
-  "ftp.c", line 290.55: 1506-280 (W) Function argument assignment between types "unsigned long* restrict" and "int*" is not allowed.
-  "ftp.c", line 293.48: 1506-280 (W) Function argument assignment between types "unsigned long* restrict" and "int*" is not allowed.
-  "ftp.c", line 1070.49: 1506-280 (W) Function argument assignment between types "unsigned long* restrict" and "int*" is not allowed.
-  "ftp.c", line 1154.53: 1506-280 (W) Function argument assignment between types "unsigned long* restrict" and "int*" is not allowed.
-  "ftp.c", line 1187.51: 1506-280 (W) Function argument assignment between types "unsigned long* restrict" and "int*" is not allowed.
-    CC       libcurl_la-connect.lo
-  "connect.c", line 448.56: 1506-280 (W) Function argument assignment between types "unsigned long* restrict" and "int*" is not allowed.
-  "connect.c", line 516.66: 1506-280 (W) Function argument assignment between types "unsigned long* restrict" and "int*" is not allowed.
-  "connect.c", line 687.55: 1506-280 (W) Function argument assignment between types "unsigned long* restrict" and "int*" is not allowed.
-  "connect.c", line 696.55: 1506-280 (W) Function argument assignment between types "unsigned long* restrict" and "int*" is not allowed.
-    CC       libcurl_la-tftp.lo
-  "tftp.c", line 1115.33: 1506-280 (W) Function argument assignment between types "unsigned long* restrict" and "int*" is not allowed.
+  ... which of course doesn't have to be the same used at build-time.
   
-  Closes #2637
+  Function just recently merged in ngtcp2.
 
-- cmdline-opts/cert-type.d: mention "p12" as a recognized type as well
-
-Viktor Szakats (3 Jun 2018)
-- spelling fixes
+- ngtcp2: move the h3 initing to immediately after the rx key
   
-  Detected using the `codespell` tool (version 1.13.0).
+  To fix a segfault and to better deal with 0-RTT
   
-  Also secure and fix an URL.
+  Assisted-by: Tatsuhiro Tsujikawa
 
-Daniel Stenberg (2 Jun 2018)
-- axtls: follow-up spell fix of comment
+- [Alessandro Ghedini brought this change]
 
-- axTLS: not considered fit for use
+  quiche: register debug callback once and earlier
   
-  URL: https://curl.haxx.se/mail/lib-2018-06/0000.html
+  The quiche debug callback is global and can only be initialized once, so
+  make sure we don't do it multiple times (e.g. if multiple requests are
+  executed).
   
-  This is step one. It adds #error statements that require source edits to
-  make curl build again if asked to use axTLS. At a later stage we might
-  remove the axTLS specific code completely.
+  In addition this initializes the callback before the connection is
+  created, so we get logs for the handshake as well.
   
-  Closes #2628
+  Closes #4236
 
-- build: remove the Borland specific makefiles
+- ssh: add a generic Curl_ssh_version function for SSH backends
   
-  According to the user survey 2018, not even one out of 670 users use
-  them. Nobody on the mailing list spoke up for them either.
-  
-  Closes #2629
+  Closes #4235
 
-- curl_addrinfo: use same #ifdef conditions in source as header
-  
-  ... for curl_dofreeaddrinfo
+- base64: check for SSH, not specific SSH backends
 
-- multi: remove a DEBUGF()
+- vssh: move ssh init/cleanup functions into backend code
+
+- vssh: create directory for SSH backend code
+
+- TODO/ROADMAP: remove "refuse downgrade redirects" and HTTP/3
   
-  ... it might call infof() with a NULL first argument that isn't harmful
-  but makes it not do anything. The infof() line is not very useful
-  anymore, it has served it purpose. Good riddance!
+  HTTP3 is now already in full progress
   
-  Fixes #2627
+  Downgrade redirects can be achived almost exactly like that by setting
+  CURLOPT_REDIR_PROTOCOLS.
 
-- [Alibek.Jorajev brought this change]
+- RELEASE-NOTES: synced
 
-  CURLOPT_RESOLVE: always purge old entry first
-  
-  If there's an existing entry using the selected name.
+- travis: add a quiche build
   
-  Closes #2622
+  Closes #4207
 
-- fnmatch: use the system one if available
+- http: fix use of credentials from URL when using HTTP proxy
   
-  If configure detects fnmatch to be available, use that instead of our
-  custom one for FTP wildcard pattern matching. For standard compliance,
-  to reduce our footprint and to use already well tested and well
-  exercised code.
+  When a username and password are provided in the URL, they were wrongly
+  removed from the stored URL so that subsequent uses of the same URL
+  wouldn't find the crendentials. This made doing HTTP auth with multiple
+  connections (like Digest) mishave.
   
-  A POSIX fnmatch behaves slightly different than the internal function
-  for a few test patterns currently and the macOS one yet slightly
-  different. Test case 1307 is adjusted for these differences.
+  Regression from 46e164069d1a5230 (7.62.0)
   
-  Closes #2626
-
-Patrick Monnerat (31 May 2018)
-- os400: add new option in ILE/RPG binding
+  Test case 335 added to verify.
   
-  Follow-up to commit 946ce5b
-
-Daniel Stenberg (31 May 2018)
-- tests/libtest/.gitignore: follow-up fix to ignore lib5* too
-
-- KNOWN_BUGS: CURL_GLOBAL_SSL
+  Reported-by: Mike Crowe
   
-  Closes #2276
+  Fixes #4228
+  Closes #4229
 
-- [Bernhard Walle brought this change]
+- [Mike Crowe brought this change]
 
-  configure: check for declaration of getpwuid_r
+  tests: Replace outdated test case numbering documentation
   
-  On our x86 Android toolchain, getpwuid_r is implemented but the header
-  is missing:
+  Tests are no longer grouped by numeric range[1]. Let's stop saying that
+  and provide some alternative advice for numbering tests.
   
-   netrc.c:81:7: error: implicit declaration of function 'getpwuid_r' [-Werror=implicit-function-declaration]
+  [1] https://curl.haxx.se/mail/lib-2019-08/0043.html
   
-  Unfortunately, the function is used in curl_ntlm_wb.c, too, so I moved
-  the prototype to curl_setup.h.
+  Closes #4227
+
+- travis: reduce number of torture tests in 'coverage'
+  
+  ... to make it complete in time. This cut seems not almost not affect
+  the coverage percentage and yet completes within 35 minutes on travis
+  where the previous runs recently always timed out after 50.
   
-  Signed-off-by: Bernhard Walle <bernhard@bwalle.de>
-  Closes #2609
+  Closes #4223
 
-- [Rikard Falkeborn brought this change]
+- [Igor Makarov brought this change]
 
-  tests: update .gitignore for libtests
+  configure: use -lquiche to link to quiche
   
-  Closes #2624
-
-- [Rikard Falkeborn brought this change]
+  Closes #4226
 
-  strictness: correct {infof, failf} format specifiers
+- ngtcp2: provide the callbacks as a static struct
   
-  Closes #2623
+  ... instead of having them in quicsocket
 
-- [Björn Stenberg brought this change]
+- [Tatsuhiro Tsujikawa brought this change]
 
-  option: disallow username in URL
-  
-  Adds CURLOPT_DISALLOW_USERNAME_IN_URL and --disallow-username-in-url. Makes
-  libcurl reject URLs with a username in them.
+  ngtcp2: add missing nghttp3_conn_add_write_offset call
   
-  Closes #2340
+  Closes #4225
 
-- libcurl-security.3: improved layout for two rememdy lists
+- [Tatsuhiro Tsujikawa brought this change]
 
-- libcurl-security.3: refer to URL instead of in-source markdown file
+  ngtcp2: deal with stream close
 
-Viktor Szakats (30 May 2018)
-- curl.rc: embed manifest for correct Windows version detection
-  
-  * enable it in `src/Makefile.m32`
-  * enable it in `winbuild/MakefileBuild.vc` if a custom manifest is
-    _not_ enabled via the existing `EMBED_MANIFEST` option
-  * enable it for all Windows CMake builds (also disable the built-in
-    minimal manifest, added by CMake by default.)
-  
-  For other build systems, add the `-DCURL_EMBED_MANIFEST` option to
-  the list of RC (Resource Compiler) flags to enable the manifest
-  included in `src/curl.rc`. This may require to disable whatever
-  automatic or other means in which way another manifest is added to
-  `curl.exe`.
-  
-  Notice that Borland C doesn't support this method due to a
-  long-pending resource compiler bug. Watcom C may also not handle
-  it correctly when the `-zm` `wrc` option is used (this option may
-  be unnecessary though) and regardless of options in certain earlier
-  revisions of the 2.0 beta version.
-  
-  Closes https://github.com/curl/curl/pull/1221
-  Fixes https://github.com/curl/curl/issues/2591
+- [Tatsuhiro Tsujikawa brought this change]
 
-Patrick Monnerat (30 May 2018)
-- os400: sync EBCDIC wrappers and ILE/RPG binding with latest options
+  ngtcp2: Consume QUIC STREAM data properly
 
-- os400: implement mime api EBCDIC wrappers
-  
-  Also sync ILE/RPG binding to define the new functions.
+- [Tatsuhiro Tsujikawa brought this change]
 
-Daniel Stenberg (29 May 2018)
-- setopt: add TLS 1.3 ciphersuites
-  
-  Adds CURLOPT_TLS13_CIPHERS and CURLOPT_PROXY_TLS13_CIPHERS.
-  
-  curl: added --tls13-ciphers and --proxy-tls13-ciphers
-  
-  Fixes #2435
-  Reported-by: zzq1015 on github
-  Closes #2607
+  ngtcp2: don't reinitialize SSL on Retry
 
-- configure: override AR_FLAGS to silence warning
-  
-  The automake default ar flags are 'cru', but the 'u' flag in there
-  causes warnings on many modern Linux distros. Removing 'u' may have a
-  minor performance impact on older distros but should not cause harm.
-  
-  Explained on the automake mailing list already back in April 2015:
-  
-  https://www.mail-archive.com/automake-patches@gnu.org/msg07705.html
-  
-  Reported-by: elephoenix on github
-  Fixes #2617
-  Closes #2619
+- multi: getsock improvements for QUIC connecting
 
-Sergei Nikulov (29 May 2018)
-- cmake: fixed comments in compile checks code
+- connect: connections are persistent by default for HTTP/3
 
-Daniel Stenberg (29 May 2018)
-- INSTALL: LDFLAGS=-Wl,-R/usr/local/ssl/lib
+- quiche: happy eyeballs
   
-  ... the older description doesn't work
-  
-  Reported-by: Peter Varga
-  Fixes #2615
-  Closes #2616
+  Closes #4220
 
-- [Will Dietz brought this change]
+- ngtcp2: do QUIC connections happy-eyeballs friendly
 
-  KNOWN_BUGS: restore text regarding #2101.
+- curl_version: bump string buffer size to 250
   
-  This was added earlier but appears to have been removed accidentally.
+  With HTTP/3 libs and plenty TLS libs, I manged to hit the limit (which
+  causes a truncated output).
+
+- CURLOPT_ALTSVC.3: use a "" file name to not load from a file
+
+Jay Satiro (14 Aug 2019)
+- vauth: Use CURLE_AUTH_ERROR for auth function errors
   
-  AFAICT this is very much still an issue.
+  - Add new error code CURLE_AUTH_ERROR.
   
-  -----
+  Prior to this change auth function errors were signaled by
+  CURLE_OUT_OF_MEMORY and CURLE_RECV_ERROR, and neither one was
+  technically correct.
   
-  I say "accidentally" because the text seems to have harmlessly snuck
-  into [1] (which makes no mention of it).  [1] was later reverted for
-  unspecified reasons in [2], presumably because the mentioned issue was
-  fixed or invalid.
+  Ref: https://github.com/curl/curl/pull/3848
   
-  [1] de9fac00c40db321d44fa6fbab6eb62ec4c83998
-  [2] 16d1f369403cbb04bd7b085eabbeebf159473fc2
+  Co-authored-by: Dominik Hölzl
   
-  Closes #2618
+  Closes https://github.com/curl/curl/pull/3864
 
-- fnmatch: insist on escaped bracket to match
+Daniel Stenberg (13 Aug 2019)
+- curl_version_info: make the quic_version a const
   
-  A non-escaped bracket ([) is for a character group - as documented. It
-  will *not* match an individual bracket anymore. Test case 1307 updated
-  accordingly to match.
+  Follow-up from 1a2df1518ad8653f
   
-  Problem detected by OSS-Fuzz, although this fix is probably not a final
-  fix for the notorious timeout issues.
+  Closes #4222
+
+- examples: add http3.c, altsvc.c and http3-present.c
   
-  Bug: https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=8525
-  Closes #2614
+  Closes #4221
 
-Patrick Monnerat (28 May 2018)
-- psl: use latest psl and refresh it periodically
+Peter Wu (13 Aug 2019)
+- nss: use TLSv1.3 as default if supported
   
-  The latest psl is cached in the multi or share handle. It is refreshed
-  before use after 72 hours.
-  New share lock CURL_LOCK_DATA_PSL controls the psl cache sharing.
-  If the latest psl is not available, the builtin psl is used.
+  SSL_VersionRangeGetDefault returns (TLSv1.0, TLSv1.2) as supported
+  range in NSS 3.45. It looks like the intention is to raise the minimum
+  version rather than lowering the maximum, so adjust accordingly. Note
+  that the caller (nss_setup_connect) initializes the version range to
+  (TLSv1.0, TLSv1.3), so there is no need to check for >= TLSv1.0 again.
   
-  Reported-by: Yaakov Selkowitz
-  Fixes #2553
-  Closes #2601
+  Closes #4187
+  Reviewed-by: Daniel Stenberg
+  Reviewed-by: Kamil Dudka
 
-Daniel Stenberg (28 May 2018)
-- [Fabrice Fontaine brought this change]
+Daniel Stenberg (13 Aug 2019)
+- quic.h: remove unused proto
 
-  configure: fix ssh2 linking when built with a static mbedtls
-  
-  The ssh2 pkg-config file could contain the following lines when build
-  with a static version of mbedtls:
-     Libs: -L${libdir} -lssh2 /xxx/libmbedcrypto.a
-     Libs.private: /xxx/libmbedcrypto.a
-  
-  This static mbedtls library must be used to correctly detect ssh2
-  support and this library must be copied in libcurl.pc otherwise
-  compilation of any application (such as upmpdcli) with libcurl will fail
-  when trying to found mbedtls functions included in libssh2.  So, replace
-  pkg-config --libs-only-l by pkg-config --libs.
+- curl_version_info.3: mentioned ALTSVC and HTTP3
   
-  Fixes:
-   - http://autobuild.buildroot.net/results/43e24b22a77f616d6198c10435dcc23cc3b9088a
-  
-  Signed-off-by: Fabrice Fontaine <fontaine.fabrice@gmail.com>
-  Closes #2613
-
-- RELEASE-NOTES: synced
+  ... and sorted the list alphabetically
 
-- [Bernhard Walle brought this change]
+- lib/quic.c: unused - removed
 
-  cmake: check for getpwuid_r
+- CURLOPT_ALTSVC_CTRL.3: remove CURLALTSVC_ALTUSED
   
-  The autotools-based build system does it, so we do it also in CMake.
-  
-  Bug: #2609
-  Signed-off-by: Bernhard Walle <bernhard@bwalle.de>
-
-- cmdline-opts/gen.pl: warn if mutexes: or see-also: list non-existing options
+  Follow-up to 98c3f148 that removed it from the header file
 
-- [Frank Gevaerts brought this change]
+- [Junho Choi brought this change]
 
-  curl.1: Fix cmdline-opts reference errors.
+  docs/HTTP3: simplify quiche build instruction
   
-  --data, --form, and --ntlm were declared to be mutually exclusive with
-  non-existing options. --data and --form referred to --upload (which is
-  short for --upload-file and therefore did work, so this one was merely
-  a bit confusing), --ntlm referred to --negotiated instead of --negotiate.
+  Use --recursive to get boringssl in one line
   
-  Closes #2612
+  Closes #4219
 
-- [Frank Gevaerts brought this change]
+- altsvc: make it use h3-22 with ngtcp2 as well
 
-  docs: fix cmdline-opts metadata headers case consistency.
+- ngtcp2: initial h3 request work
   
-  Almost all headers start with an uppercase letter, but some didn't.
+  Closes #4217
 
-- mailmap: Max Savenkov
-
-Sergei Nikulov (28 May 2018)
-- [Max Savenkov brought this change]
-
-  Fix the test for fsetxattr and strerror_r tests in CMake to work without compiling
+- curl_version_info: offer quic (and h3) library info
+  
+  Closes #4216
 
-Daniel Stenberg (27 May 2018)
-- mailmap: a Richard Alcock fixup
+- HTTP3: use ngtcp2's draft-22 branch
 
-- [Richard Alcock brought this change]
+- RELEASE-NOTES: synced
 
-  schannel: add failf calls for client certificate failures
+- CURLOPT_READFUNCTION.3: provide inline example
   
-  Closes #2604
+  ... instead of mentioning one in another place
 
-- [Richard Alcock brought this change]
+- [Tatsuhiro Tsujikawa brought this change]
 
-  winbuild: In MakefileBuild.vc fix typo DISTDIR->DIRDIST
+  ngtcp2: send HTTP/3 request with nghttp3
   
-  Change requirement from $(DISTDIR) to $(DIRDIST)
+  This commit makes sending HTTP/3 request with nghttp3 work.  It
+  minimally receives HTTP response and calls nghttp3 callbacks, but no
+  processing is made at the moment.
   
-  closes #2603
+  Closes #4215
 
-- [Richard Alcock brought this change]
+- nghttp3: initial h3 template code added
 
-  winbuild: only delete OUTFILE if it exists
+- nghttp3: required when ngtcp2 is used for QUIC
   
-  This removes the slightly annoying "Could not file LIBCURL_OBJS.inc" and
-  "Could not find CURL_OBJS.inc.inc" message when building into a clean
-  folder.
+  - checked for by configure
+  - updated docs/HTTP3.md
+  - shown in the version string
   
-  closes #2602
+  Closes #4210
 
-- [Alejandro R. Sedeño brought this change]
+- [Eric Wong brought this change]
 
-  content_encoding: handle zlib versions too old for Z_BLOCK
+  asyn-thread: issue CURL_POLL_REMOVE before closing socket
   
-  Fallback on Z_SYNC_FLUSH when Z_BLOCK is not available.
+  This avoids EBADF errors from EPOLL_CTL_DEL operations in the
+  ephiperfifo.c example.  EBADF is dangerous in multi-threaded
+  applications where I rely on epoll_ctl to operate on the same
+  epoll description from different threads.
   
-  Fixes #2606
-  Closes #2608
+  Follow-up to eb9a604f8d7db8
+  
+  Bug: https://curl.haxx.se/mail/lib-2019-08/0026.html
+  Closes #4211
+
+- [Carlo Marcelo Arenas Belón brought this change]
 
-- multi: provide a socket to wait for in Curl_protocol_getsock
+  configure: avoid undefined check_for_ca_bundle
   
-  ... even when there's no protocol specific handler setup.
+  instead of using a "greater than 0" test, check for variable being
+  set, as it is always set to 1, and could be left unset if non of
+  OPENSSL MBEDTLS GNUTLS WOLFSSL is being configured for.
   
-  Bug: https://curl.haxx.se/mail/lib-2018-05/0062.html
-  Reported-by: Sean Miller
-  Closes #2600
+  Closes #4213
 
-- [Linus Lewandowski brought this change]
+- [Tatsuhiro Tsujikawa brought this change]
 
-  httpauth: add support for Bearer tokens
+  ngtcp2: Send ALPN h3-22
   
-  Closes #2102
+  Closes #4212
 
-- TODO: CURLINFO_PAUSE_STATE
-  
-  Closes #2588
+- [Tatsuhiro Tsujikawa brought this change]
+
+  ngtcp2: use ngtcp2_settings_default and specify initial_ts
 
-Sergei Nikulov (24 May 2018)
-- cmake: set -d postfix for debug builds if not specified
-         using -DCMAKE_DEBUG_POSTFIX explicitly
+- curl_global_init_mem.3: mention it was added in 7.12.0
+
+- [Tatsuhiro Tsujikawa brought this change]
+
+  ngtcp2: make the QUIC handshake work
   
-         fixes #2121, obsoletes #2384
+  Closes #4209
 
-Daniel Stenberg (23 May 2018)
-- configure: add basic test of --with-ssl prefix
+- [Alex Mayorga brought this change]
+
+  HTTP3.md: Update quiche build instructions
   
-  When given a prefix, the $PREFIX_OPENSSL/lib/openssl.pc or
-  $PREFIX_OPENSSL/include/openssl/ssl.h files must be present or cause an
-  error. Helps users detect when giving configure the wrong path.
+  Added cloning for quiche and BoringSSL and modified the build
+  instructions so they work on a clean folder.
   
-  Reported-by: Oleg Pudeyev
-  Assisted-by: Per Malmberg
-  Fixes #2580
+  Closes #4208
 
-Patrick Monnerat (22 May 2018)
-- http resume: skip body if http code 416 (range error) is ignored.
-  
-  This avoids appending error data to already existing good data.
+- CURLOPT_H3: removed
   
-  Test 92 is updated to match this change.
-  New test 1156 checks all combinations of --range/--resume, --fail,
-  Content-Range header and http status code 200/416.
+  There's no use for this anymore and it was never in a release.
   
-  Fixes #1163
-  Reported-By: Ithubg on github
-  Closes #2578
+  Closes #4206
 
-Daniel Stenberg (22 May 2018)
-- tftp: make sure error is zero terminated before printfing it
-
-- configure: add missing m4/ax_compile_check_sizeof.m4
+- http3: make connection reuse work
   
-  follow-up to mistake in 6876ccf90b4
+  Closes #4204
 
-Jay Satiro (22 May 2018)
-- [Johannes Schindelin brought this change]
+- quiche: add SSLKEYLOGFILE support
 
-  schannel: make CAinfo parsing resilient to CR/LF
-  
-  OpenSSL has supported --cacert for ages, always accepting LF-only line
-  endings ("Unix line endings") as well as CR/LF line endings ("Windows
-  line endings").
-  
-  When we introduced support for --cacert also with Secure Channel (or in
-  cURL speak: "WinSSL"), we did not take care to support CR/LF line
-  endings, too, even if we are much more likely to receive input in that
-  form when using Windows.
-  
-  Let's fix that.
+- cleanup: s/curl_debug/curl_dbg_debug in comments and docs
   
-  Happily, CryptQueryObject(), the function we use to parse the ca-bundle,
-  accepts CR/LF input already, and the trailing LF before the END
-  CERTIFICATE marker catches naturally any CR/LF line ending, too. So all
-  we need to care about is the BEGIN CERTIFICATE marker. We do not
-  actually need to verify here that the line ending is CR/LF. Just
-  checking for a CR or an LF is really plenty enough.
+  Leftovers from the function rename back in 76b63489495
   
-  Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
+  Reported-by: Gisle Vanem
+  Bug: https://github.com/curl/curl/commit/f3e0f071b14fcb46a453f69bdf4e062bcaacf362#com
+  mitcomment-34601751
   
-  Closes https://github.com/curl/curl/pull/2592
-
-Daniel Stenberg (22 May 2018)
-- CURLOPT_ACCEPT_ENCODING.3: add brotli and clarify a bit
+  Closes #4203
 
 - RELEASE-NOTES: synced
 
-- KNOWN_BUGS: mention the -O with %-encoded file names
+- alt-svc: add protocol version selection masking
   
-  Closes #2573
-
-- checksrc: make sure sizeof() is used *with* parentheses
+  So that users can mask in/out specific HTTP versions when Alt-Svc is
+  used.
   
-  ... and unify the source code to adhere.
+   - Removed "h2c" and updated test case accordingly
+   - Changed how the altsvc struct is laid out
+   - Added ifdefs to make the unittest run even in a quiche-tree
   
-  Closes #2563
+  Closes #4201
 
-- curl: added --styled-output
+- http3: fix the HTTP/3 in the request, make alt-svc set right versions
   
-  It is enabled by default, so --no-styled-output will switch off the
-  detection/use of bold headers.
-  
-  Closes #2538
+  Closes #4200
 
-- curl: show headers in bold
+- alt-svc: send Alt-Used: in redirected requests
   
-  The feature is only enabled if the output is believed to be a tty.
+  RFC 7838 section 5:
   
-  -J: There's some minor differences and improvements in -J handling, as
-  now J should work with -i and it actually creates a file first using the
-  initial name and then *renames* that to the one found in
-  Content-Disposition (if any).
+     When using an alternative service, clients SHOULD include an Alt-Used
+     header field in all requests.
   
-  -i: only shows headers for HTTP transfers now (as documented).
-  Previously it would also show for pieces of the transfer that were HTTP
-  (for example when doing FTP over a HTTP proxy).
+  Removed CURLALTSVC_ALTUSED again (feature is still EXPERIMENTAL thus
+  this is deemed ok).
   
-  -i: now shows trailers as well. Previously they were not shown at all.
+  You can disable sending this header just like you disable any other HTTP
+  header in libcurl.
   
-  --libcurl: the CURLOPT_HEADER is no longer set, as the header output is
-  now done in the header callback.
+  Closes #4199
 
-- configure: compile-time SIZEOF checks
+- CURLOPT_HTTP_VERSION: seting this to 3 forces HTTP/3 use directly
   
-  ... instead of exeucting code to get the size. Removes the use of
-  LD_LIBRARY_PATH for this.
+  Even though it cannot fall-back to a lower HTTP version automatically. The
+  safer way to upgrade remains via CURLOPT_ALTSVC.
   
-  Fixes #2586
-  Closes #2589
-  Reported-by: Bernhard Walle
-
-- configure: replace AC_TRY_RUN with CURL_RUN_IFELSE
+  CURLOPT_H3 no longer has any bits that do anything and might be removed
+  before we remove the experimental label.
   
-  ... and export LD_LIBRARY_PATH properly. This is a follow-up from
-  2d4c215.
+  Updated the curl tool accordingly to use "--http3".
   
-  Fixes #2586
-  Reported-by: Bernhard Walle
+  Closes #4197
 
-- docs: clarify CURLOPT_HTTPGET somewhat
+- docs/ALTSVC: remove what works and the experimental explanation
   
-  Reported-by: bsammon on github
-  Fixes #2590
-
-- curl_fnmatch: only allow two asterisks for matching
+  Also, put the TODO items at the bottom.
   
-  The previous limit of 5 can still end up in situation that takes a very
-  long time and consumes a lot of CPU.
+  Closes #4198
+
+- docs/EXPERIMENTAL: explain what it means and what's experimental now
+
+- curl: make use of CURLINFO_RETRY_AFTER when retrying
   
-  If there is still a rare use case for this, a user can provide their own
-  fnmatch callback for a version that allows a larger set of wildcards.
+  If a Retry-After: header was used in the response, that value overrides
+  other retry timing options.
   
-  This commit was triggered by yet another OSS-Fuzz timeout due to this.
-  Bug: https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=8369
+  Fixes #3794
+  Closes #4195
+
+- curl: use CURLINFO_PROTOCOL to check for HTTP(s)
   
-  Closes #2587
+  ... instead of CURLINFO_EFFECTIVE_URL to avoid string operations.
 
-- checksrc: fix too long line
+- CURLINFO_RETRY_AFTER: parse the Retry-After header value
   
-  follow-up to e05ad5d
+  This is only the libcurl part that provides the information. There's no
+  user of the parsed value. This change includes three new tests for the
+  parser.
+  
+  Ref: #3794
 
-- [Aleks brought this change]
+- docs/ALTSVC.md: first basic file format description
 
-  docs: mention HAproxy protocol "version 1"
+- curl: have -w's 'http_version' show '3' for HTTP/3
   
-  ...as there's also a version 2.
+  Closes #4196
+
+- curl.h: add CURL_HTTP_VERSION_3 to the version enum
   
-  Closes #2579
+  It can't be set for CURLOPT_HTTP_VERSION, but it can be extracted with
+  CURLINFO_HTTP_VERSION.
+
+- quiche: make use of the connection timeout API properly
+
+- quiche: make POSTFIELDS posts work
+
+- quiche: improved error handling and memory cleanups
+
+- quiche: flush egress in h3_stream_recv() too
 
-- examples/progressfunc: make it build on older libcurls
+- RELEASE-NOTES: synced
+
+Jay Satiro (6 Aug 2019)
+- [Patrick Monnerat brought this change]
+
+  os400: take care of CURLOPT_SASL_AUTHZID in curl_easy_setopt_ccsid().
   
-  This example was changed in ce2140a8c1 to use the new microsecond based
-  getinfo option. This change makes it conditionally keep using the older
-  option so that the example still builds with older libcurl versions.
+  Ref: https://github.com/curl/curl/issues/3653
+  Ref: https://github.com/curl/curl/pull/3790
   
-  Closes #2584
-
-- stub_gssapi: fix numerous 'unused parameter' warnings
+  NOTE: This commit was cherry-picked and is part of a series of commits
+  that added the authzid feature for upcoming 7.66.0. The series was
+  temporarily reverted in db8ec1f so that it would not ship in a 7.65.x
+  patch release.
   
-  follow-up to d9e92fd9fd1d
+  Closes https://github.com/curl/curl/pull/4186
 
-- [Philip Prindeville brought this change]
-
-  getinfo: add microsecond precise timers for various intervals
+- tests: Fix the line endings for the SASL alt-auth tests
   
-  Provide a set of new timers that return the time intervals using integer
-  number of microseconds instead of floats.
+  - Change data and protocol sections to CRLF line endings.
   
-  The new info names are as following:
+  Prior to this change the tests would fail or hang, which is because
+  certain sections such as protocol require CRLF line endings.
   
-  CURLINFO_APPCONNECT_TIME_T
-  CURLINFO_CONNECT_TIME_T
-  CURLINFO_NAMELOOKUP_TIME_T
-  CURLINFO_PRETRANSFER_TIME_T
-  CURLINFO_REDIRECT_TIME_T
-  CURLINFO_STARTTRANSFER_TIME_T
-  CURLINFO_TOTAL_TIME_T
+  Follow-up to grandparent commit which added the tests.
   
-  Closes #2495
-
-- openssl: acknowledge --tls-max for default version too
+  Ref: https://github.com/curl/curl/issues/3653
+  Ref: https://github.com/curl/curl/pull/3790
   
-  ... previously it only used the max setting if a TLS version was also
-  explicitly asked for.
+  NOTE: This commit was cherry-picked and is part of a series of commits
+  that added the authzid feature for upcoming 7.66.0. The series was
+  temporarily reverted in db8ec1f so that it would not ship in a 7.65.x
+  patch release.
   
-  Reported-by: byte_bucket
-  Fixes #2571
-  Closes #2572
+  Closes https://github.com/curl/curl/pull/4186
 
-- bump: start working on the pending 7.61.0
+- [Steve Holme brought this change]
 
-- [Dagobert Michelsen brought this change]
-
-  tests/libtest/Makefile: Do not unconditionally add gcc-specific flags
+  examples: Added SASL PLAIN authorisation identity (authzid) examples
   
-  The warning flag leads e.g. Sun Studio compiler to bail out.
+  Ref: https://github.com/curl/curl/issues/3653
+  Ref: https://github.com/curl/curl/pull/3790
   
-  Closes #2576
-
-- schannel_verify: fix build for non-schannel
+  NOTE: This commit was cherry-picked and is part of a series of commits
+  that added the authzid feature for upcoming 7.66.0. The series was
+  temporarily reverted in db8ec1f so that it would not ship in a 7.65.x
+  patch release.
+  
+  Closes https://github.com/curl/curl/pull/4186
 
-Jay Satiro (16 May 2018)
-- rand: fix typo
+- [Steve Holme brought this change]
 
-- schannel: disable manual verify if APIs not available
+  curl: --sasl-authzid added to support CURLOPT_SASL_AUTHZID from the tool
+  
+  Ref: https://github.com/curl/curl/issues/3653
+  Ref: https://github.com/curl/curl/pull/3790
   
-  .. because original MinGW and old compilers do not have the Windows API
-  definitions needed to support manual verification.
+  NOTE: This commit was cherry-picked and is part of a series of commits
+  that added the authzid feature for upcoming 7.66.0. The series was
+  temporarily reverted in db8ec1f so that it would not ship in a 7.65.x
+  patch release.
+  
+  Closes https://github.com/curl/curl/pull/4186
 
-- [Archangel_SDY brought this change]
+- [Steve Holme brought this change]
 
-  schannel: disable client cert option if APIs not available
+  sasl: Implement SASL authorisation identity via CURLOPT_SASL_AUTHZID
+  
+  Added the ability for the calling program to specify the authorisation
+  identity (authzid), the identity to act as, in addition to the
+  authentication identity (authcid) and password when using SASL PLAIN
+  authentication.
+  
+  Fixes #3653
+  Closes #3790
   
-  Original MinGW targets Windows 2000 by default, which lacks some APIs and
-  definitions for this feature. Disable it if these APIs are not available.
+  NOTE: This commit was cherry-picked and is part of a series of commits
+  that added the authzid feature for upcoming 7.66.0. The series was
+  temporarily reverted in db8ec1f so that it would not ship in a 7.65.x
+  patch release.
   
-  Closes https://github.com/curl/curl/pull/2522
+  Closes https://github.com/curl/curl/pull/4186
 
-Version 7.60.0 (15 May 2018)
+Daniel Stenberg (6 Aug 2019)
+- docs/HTTP3: refreshed as it is now in master and HTTP/3 can be tested
 
-Daniel Stenberg (15 May 2018)
-- RELEASE-NOTES: 7.60.0 release
+- [Yiming Jing brought this change]
 
-- THANKS: added people from the curl 7.60.0 release
+  mesalink: implement client authentication
+  
+  Closes #4184
 
-- docs/libcurl/index.html: removed
+- curl_multi_poll: a sister to curl_multi_wait() that waits more
   
-  The HTML files are long gone from the dist, now remove the last HTML
-  file pointing to those missing files.
+  Repeatedly we see problems where using curl_multi_wait() is difficult or
+  just awkward because if it has no file descriptor to wait for
+  internally, it returns immediately and leaves it to the caller to wait
+  for a small amount of time in order to avoid occasional busy-looping.
   
-  d
-
-- [steini2000 brought this change]
+  This is often missed or misunderstood, leading to underperforming
+  applications.
+  
+  This change introduces curl_multi_poll() as a replacement drop-in
+  function that accepts the exact same set of arguments. This function
+  works identically to curl_multi_wait() - EXCEPT - for the case when
+  there's nothing to wait for internally, as then this function will by
+  itself wait for a "suitable" short time before it returns. This
+  effectiely avoids all risks of busy-looping and should also make it less
+  likely that apps "over-wait".
+  
+  This also changes the curl tool to use this funtion internally when
+  doing parallel transfers and changes curl_easy_perform() to use it
+  internally.
+  
+  Closes #4163
 
-  http2: remove unused variable
+- quiche:h3_stream_recv return 0 at end of stream
   
-  Closes #2570
+  ... and remove some verbose messages we don't need. Made transfers from
+  facebook.com work better.
 
-- [steini2000 brought this change]
+- altsvc: make quiche use h3-22 now
 
-  http2: use easy handle of stream for logging
+- quiche: show the actual version number
 
-- gcc: disable picky gcc-8 function pointer warnings in two places
+- quiche: first working HTTP/3 request
   
-  Reported-by: Rikard Falkeborn
-  Bug: #2560
-  Closes #2569
-
-- http2: use the correct function pointer typedef
+   - enable debug log
+   - fix use of quiche API
+   - use download buffer
+   - separate header/body
   
-  Fixes gcc-8 picky compiler warnings
-  Reported-by: Rikard Falkeborn
-  Bug: #2560
-  Closes #2568
+  Closes #4193
 
-- CODE_STYLE: mention return w/o parens, but sizeof with
+- http09: disable HTTP/0.9 by default in both tool and library
   
-  ... and remove the github markdown syntax so that it renders better on
-  the web site. Also, don't use back-ticks inlined to allow the CSS to
-  highlight source code better.
-
-- [Rikard Falkeborn brought this change]
-
-  examples: Fix format specifiers
+  As the plan has been laid out in DEPRECATED. Update docs accordingly and
+  verify in test 1174. Now requires the option to be set to allow HTTP/0.9
+  responses.
   
-  Closes #2561
+  Closes #4191
 
-- [Rikard Falkeborn brought this change]
+- quiche: initial h3 request send/receive
 
-  tool: Fix format specifiers
+- lib/Makefile.am: make checksrc run in vquic too
 
-- [Rikard Falkeborn brought this change]
+- altsvc: fix removal of expired cache entry
+  
+  Closes #4192
 
-  ntlm: Fix format specifiers
+- RELEASE-NOTES: synced
 
-- [Rikard Falkeborn brought this change]
+Steve Holme (4 Aug 2019)
+- md4: Use our own MD4 implementation when no crypto libraries are available
+  
+  Closes #3780
 
-  tests: Fix format specifiers
+- md4: No need to include Curl_md4.h for each TLS library
 
-- [Rikard Falkeborn brought this change]
+- md4: No need for the NTLM code to call Curl_md4it() for each TLS library
+  
+  As the NTLM code no longer calls any of TLS libraries' specific MD4
+  functions, there is no need to call this function for each #ifdef.
 
-  lib: Fix format specifiers
+- md4: Move the mbed TLS MD4 implementation out of the NTLM code
 
-- contributors.sh: use "on github", not at
+- md4: Move the WinCrypt implementation out of the NTLM code
 
-- http2: getsock fix for uploads
-  
-  When there's an upload in progress, make sure to wait for the socket to
-  become writable.
-  
-  Detected-by: steini2000 on github
-  Bug: #2520
-  Closes #2567
+- md4: Move the SecureTransport implementation out of the NTLM code
 
-- pingpong: fix response cache memcpy overflow
-  
-  Response data for a handle with a large buffer might be cached and then
-  used with the "closure" handle when it has a smaller buffer and then the
-  larger cache will be copied and overflow the new smaller heap based
-  buffer.
-  
-  Reported-by: Dario Weisser
-  CVE: CVE-2018-1000300
-  Bug: https://curl.haxx.se/docs/adv_2018-82c2.html
+- md4: Use the Curl_md4it() function for OpenSSL based NTLM
 
-- http: restore buffer pointer when bad response-line is parsed
-  
-  ... leaving the k->str could lead to buffer over-reads later on.
-  
-  CVE: CVE-2018-1000301
-  Assisted-by: Max Dymond
-  
-  Detected by OSS-Fuzz.
-  Bug: https://curl.haxx.se/docs/adv_2018-b138.html
-  Bug: https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=7105
+- md4: Move the GNU TLS gcrypt MD4 implementation out of the NTLM code
 
-Patrick Monnerat (13 May 2018)
-- cookies: do not take cookie name as a parameter
-  
-  RFC 6265 section 4.2.1 does not set restrictions on cookie names.
-  This is a follow-up to commit 7f7fcd0.
-  Also explicitly check proper syntax of cookie name/value pair.
-  
-  New test 1155 checks that cookie names are not reserved words.
-  
-  Reported-By: anshnd at github
-  Fixes #2564
-  Closes #2566
+- md4: Move the GNU TLS Nettle MD4 implementation out of the NTLM code
 
-Daniel Stenberg (12 May 2018)
-- smb: reject negative file sizes
-  
-  Assisted-by: Max Dymond
+Jay Satiro (4 Aug 2019)
+- OS400: Add CURLOPT_H3 symbols
   
-  Detected by OSS-Fuzz
-  Bug: https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=8245
-
-- setup_transfer: deal with both sockets being -1
+  Follow-up to 3af0e76 which added experimental H3 support.
   
-  Detected by Coverity; CID 1435559.  Follow-up to f8d608f38d00. It would
-  index the array with -1 if neither index was a socket.
+  Closes https://github.com/curl/curl/pull/4185
 
-- travis: add build using NSS
-  
-  Closes #2558
+Daniel Stenberg (3 Aug 2019)
+- url: make use of new HTTP version if alt-svc has one
 
-- [Sunny Purushe brought this change]
+- url: set conn->transport to default TCP at init time
 
-  openssl: change FILE ops to BIO ops
-  
-  To make builds with VS2015 work. Recent changes in VS2015 _IOB_ENTRIES
-  handling is causing problems. This fix changes the OpenSSL backend code
-  to use BIO functions instead of FILE I/O functions to circumvent those
-  problems.
+- altsvc: with quiche, use the quiche h3 alpn string
   
-  Closes #2512
+  Closes #4183
 
-- travis: add a build using WolfSSL
+- alt-svc: more liberal ALPN name parsing
   
-  Assisted-by: Dan Fandrich
+  Allow pretty much anything to be part of the ALPN identifier. In
+  particular minus, which is used for "h3-20" (in-progress HTTP/3
+  versions) etc.
   
-  Closes #2528
-
-- RELEASE-NOTES: typo
-
-- RELEASE-NOTES: synced
+  Updated test 356.
+  Closes #4182
 
-- [Daniel Gustafsson brought this change]
+- quiche: use the proper HTTP/3 ALPN
 
-  URLs: fix one more http url
+- quiche: add failf() calls for two error cases
   
-  This file wasn't included in commit 4af40b3646d3b09 which updated all
-  haxx.se http urls to https. The file was committed prior to that update,
-  but may have been merged after it and hence didn't get updated.
+  To aid debugging
   
-  Closes #2550
+  Closes #4181
 
-- github/lock: auto-lock closed issues after 90 days of inactivity
+- mailmap: added Kyohei Kadota
 
-- vtls: fix missing commas
+Kamil Dudka (1 Aug 2019)
+- http_negotiate: improve handling of gss_init_sec_context() failures
   
-  follow-up to e66cca046cef
-
-- vtls: use unified "supports" bitfield member in backends
+  If HTTPAUTH_GSSNEGOTIATE was used for a POST request and
+  gss_init_sec_context() failed, the POST request was sent
+  with empty body.  This commit also restores the original
+  behavior of `curl --fail --negotiate`, which was changed
+  by commit 6c6035532383e300c712e4c1cd9fdd749ed5cf59.
   
-  ... instead of previous separate struct fields, to make it easier to
-  extend and change individual backends without having to modify them all.
+  Add regression tests 2077 and 2078 to cover this.
   
-  closes #2547
+  Fixes #3992
+  Closes #4171
 
-- transfer: don't unset writesockfd on setup of multiplexed conns
+Daniel Stenberg (1 Aug 2019)
+- mailmap: added 4 more names
   
-  Curl_setup_transfer() can be called to setup a new individual transfer
-  over a multiplexed connection so it shouldn't unset writesockfd.
-  
-  Bug: #2520
-  Closes #2549
+  Evgeny Grin, Peter Pih, Anton Malov and Marquis de Muesli
 
-- [Frank Gevaerts brought this change]
+- mailmap: add Giorgos Oikonomou
 
-  configure: put CURLDEBUG and DEBUGBUILD in lib/curl_config.h
+- src/makefile: fix uncompressed hugehelp.c generation
   
-  They are removed from the compiler flags.
+  Regression from 5cf5d57ab9 (7.64.1)
   
-  This ensures that make dependency tracking will force a rebuild whenever
-  configure --enable-debug or --enable-curldebug changes.
-  
-  Closes #2548
+  Fixed-by: Lance Ware
+  Fixes #4176
+  Closes #4177
+
+- appveyor: pass on -k to make
 
-- http: don't set the "rewind" flag when not uploading anything
+- timediff: make it 64 bit (if possible) even with 32 bit time_t
   
-  It triggers an assert.
+  ... to make it hold microseconds too.
   
-  Detected by OSS-Fuzz
-  Bug: https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=8144
-  Closes #2546
+  Fixes #4165
+  Closes #4168
 
-- travis: add an mbedtls build
-  
-  Closes #2531
+- ROADMAP: parallel transfers are merged now
 
-- configure: only check for CA bundle for file-using SSL backends
-  
-  When only building with SSL backends that don't use the CA bundle file
-  (by default), skip the check.
+- getenv: support up to 4K environment variable contents on windows
   
-  Fixes #2543
-  Fixes #2180
-  Closes #2545
+  Reported-by: Michal Čaplygin
+  Fixes #4174
+  Closes #4175
 
-- ssh-libssh.c: fix left shift compiler warning
-  
-  ssh-libssh.c:2429:21: warning: result of '1 << 31' requires 33 bits to
-  represent, but 'int' only has 32 bits [-Wshift-overflow=]
+- [Kyohei Kadota brought this change]
+
+  plan9: add support for running on Plan 9
   
-  'len' will never be that big anyway so I converted the run-time check to
-  a regular assert.
+  Closes #3701
+
+- [Kyohei Kadota brought this change]
+
+  ntlm: explicit type casting
 
-- [Stephan Mühlstrasser brought this change]
+- [Justin brought this change]
 
-  URL: fix ASCII dependency in strcpy_url and strlen_url
+  curl.h: fix outdated comment
   
-  Commit 3c630f9b0af097663a64e5c875c580aa9808a92b partially reverted the
-  changes from commit dd7521bcc1b7a6fcb53c31f9bd1192fcc884bd56 because of
-  the problem that strcpy_url() was modified unilaterally without also
-  modifying strlen_url(). As a consequence strcpy_url() was again
-  depending on ASCII encoding.
+  Closes #4167
+
+- curl: remove outdated comment
   
-  This change fixes strlen_url() and strcpy_url() in parallel to use a
-  common host-encoding independent criterion for deciding whether an URL
-  character must be %-escaped.
+  Turned bad with commit b8894085000
   
-  Closes #2535
-
-- [Denis Ollier brought this change]
+  Reported-by: niallor on github
+  Fixes #4172
+  Closes #4173
 
-  docs: remove extraneous commas in man pages
+- cleanup: remove the 'numsocks' argument used in many places
   
-  Closes #2544
-
-- RELEASE-NOTES: synced
+  It was used (intended) to pass in the size of the 'socks' array that is
+  also passed to these functions, but was rarely actually checked/used and
+  the array is defined to a fixed size of MAX_SOCKSPEREASYHANDLE entries
+  that should be used instead.
+  
+  Closes #4169
 
-- Revert "TODO: remove configure --disable-pthreads"
+- readwrite_data: repair setting the TIMER_STARTTRANSFER stamp
   
-  This reverts commit d5d683a97f9765bddfd964fe32e137aa6e703ed3.
+  Regression, broken in commit 65eb65fde64bd5f (curl 7.64.1)
   
-  --disable-pthreads can be used to disable pthreads and get the threaded
-  resolver to use the windows threading when building with mingw.
-
-- vtls: don't define MD5_DIGEST_LENGTH for wolfssl
+  Reported-by: Jonathan Cardoso Machado
+  Assisted-by: Jay Satiro
   
-  ... as it defines it (too)
-
-- TODO: remove configure --disable-pthreads
+  Fixes #4136
+  Closes #4162
 
-Jay Satiro (2 May 2018)
-- [David Garske brought this change]
+- mailmap: Amit Katyal
 
-  wolfssl: Fix non-blocking connect
+- asyn-thread: removed unused variable
   
-  Closes https://github.com/curl/curl/pull/2542
+  Follow-up to eb9a604f. Mistake caused by me when I edited the commit
+  before push...
 
-Daniel Stenberg (30 Apr 2018)
-- CURLOPT_URL.3: add ENCODING section [ci skip]
-  
-  Feedback-by: Michael Kilburn
+- RELEASE-NOTES: synced
 
-- KNOWN_BUGS: Client cert with Issuer DN differs between backends
-  
-  Closes #1411
+- [Amit Katyal brought this change]
 
-- KNOWN_BUGS: Passive transfer tries only one IP address
+  asyn-thread: create a socketpair to wait on
   
-  Closes #1508
+  Closes #4157
 
-- KNOWN_BUGS: --upload-file . hang if delay in STDIN
+- curl: cap the maximum allowed values for retry time arguments
   
-  Closes #2051
-
-- KNOWN_BUGS: Connection information when using TCP Fast Open
+  ... to avoid integer overflows later when multiplying with 1000 to
+  convert seconds to milliseconds.
+  
+  Added test 1269 to verify.
   
-  Closes #1332
+  Reported-by: Jason Lee
+  Closes #4166
 
-- travis: enable libssh2 on both macos and Linux
+- progress: reset download/uploaded counter
   
-  It seems to not be detected by default anymore (which is a bug I
-  believe)
+  ... to make CURLOPT_MAX_RECV_SPEED_LARGE and
+  CURLOPT_MAX_SEND_SPEED_LARGE work correctly on subsequent transfers that
+  reuse the same handle.
   
-  Closes #2541
+  Fixed-by: Ironbars13 on github
+  Fixes #4084
+  Closes #4161
 
-- TODO: Support the clienthello extension
+- http2_recv: trigger another read when the last data is returned
   
-  Closes #2299
-
-- TODO: CLOEXEC
+  ... so that end-of-stream is detected properly.
   
-  Closes #2252
+  Reported-by: Tom van der Woerdt
+  Fixes #4043
+  Closes #4160
 
-- tests: provide 'manual' as a feature to optionally require
+- curl: avoid uncessary libcurl timeouts (in parallel mode)
   
-  ... and make test 1026 rely on that feature so that --disable-manual
-  builds don't cause test failures.
+  When curl_multi_wait() returns OK without file descriptors to wait for,
+  it might already have done a long timeout.
   
-  Reported-by: Max Dymond and Anders Roxell
-  Fixes #2533
-  Closes #2540
-
-- CURLINFO_PROTOCOL.3: mention the existing defined names
+  Closes #4159
 
-Jay Satiro (27 Apr 2018)
-- [Daniel Gustafsson brought this change]
+- [Balazs Kovacsics brought this change]
 
-  cookies: remove unused macro
+  HTTP: use chunked Transfer-Encoding for HTTP_POST if size unknown
   
-  Commit 2bc230de63 made the macro MAX_COOKIE_LINE_TXT become unused,
-  so remove as it's not part of the published API.
+  If using the read callback for HTTP_POST, and POSTFIELDSIZE is not set,
+  automatically add a Transfer-Encoding: chunked header, same as it is
+  already done for HTTP_PUT, HTTP_POST_FORM and HTTP_POST_MIME.  Update
+  test 1514 according to the new behaviour.
   
-  Closes https://github.com/curl/curl/pull/2537
+  Closes #4138
 
-Daniel Stenberg (27 Apr 2018)
-- [Daniel Gustafsson brought this change]
+Jay Satiro (29 Jul 2019)
+- [Daniel Stenberg brought this change]
 
-  checksrc: force indentation of lines after an else
+  winbuild: add vquic to list of build directories
   
-  This extends the INDENTATION case to also handle 'else' statements
-  and require proper indentation on the following line. Also fixes the
-  offending cases found in the codebase.
+  This fixes the winbuild build method which broke several days ago
+  when experimental quic support was added in 3af0e76.
   
-  Closes #2532
+  Reported-by: Michael Lee
+  
+  Fixes https://github.com/curl/curl/issues/4158
 
-- http2: fix null pointer dereference in http2_connisdead
+- easy: resize receive buffer on easy handle reset
+  
+  - In curl_easy_reset attempt to resize the receive buffer to its default
+    size. If realloc fails then continue using the previous size.
   
-  This function can get called on a connection that isn't setup enough to
-  have the 'recv_underlying' function pointer initialized so it would try
-  to call the NULL pointer.
+  Prior to this change curl_easy_reset did not properly handle resetting
+  the receive buffer (data->state.buffer). It reset the variable holding
+  its size (data->set.buffer_size) to the default size (READBUFFER_SIZE)
+  but then did not actually resize the buffer. If a user resized the
+  buffer by using CURLOPT_BUFFERSIZE to set the size smaller than the
+  default, later called curl_easy_reset and attempted to reuse the handle
+  then a heap overflow would very likely occur during that handle's next
+  transfer.
   
-  Reported-by: Dario Weisser
+  Reported-by: Felix Hädicke
   
-  Follow-up to db1b2c7fe9b093f8 (never shipped in a release)
-  Closes #2536
+  Fixes https://github.com/curl/curl/issues/4143
+  Closes https://github.com/curl/curl/pull/4145
 
-- http2: get rid of another strstr()
+- [Brad Spencer brought this change]
+
+  examples: Avoid reserved names in hiperfifo examples
   
-  Follow-up to 1514c44655e12e: replace another strstr() call done on a
-  buffer that might not be zero terminated - with a memchr() call, even if
-  we know the substring will be found.
+  - Trade in __attribute__((unused)) for the classic (void)x to silence
+    unused symbols.
   
-  Assisted-by: Max Dymond
+  Because the classic way is not gcc specific. Also because the prior
+  method mapped to symbol _Unused, which starts with _ and a capital
+  letter which is reserved.
   
-  Detected by OSS-Fuzz
-  Bug: https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=8021
+  Assisted-by: The Infinnovation team
   
-  Closes #2534
-
-- cyassl: adapt to libraries without TLS 1.0 support built-in
+  Bug: https://github.com/curl/curl/issues/4120#issuecomment-512542108
   
-  WolfSSL doesn't enable it by default anymore
-
-- configure: provide --with-wolfssl as an alias for --with-cyassl
+  Closes https://github.com/curl/curl/pull/4153
 
+Daniel Stenberg (25 Jul 2019)
 - RELEASE-NOTES: synced
 
-- [Daniel Gustafsson brought this change]
+- [Felix Hädicke brought this change]
 
-  os400.c: fix ASSIGNWITHINCONDITION checksrc warnings
-  
-  All occurrences of assignment within conditional expression in
-  os400sys.c rewritten into two steps: first assignment and then the check
-  on the success of the assignment. Also adjust related incorrect brace
-  positions to match project indentation style.
+  ssh-libssh: do not specify O_APPEND when not in append mode
   
-  This was spurred by seeing "if((inp = input_token))", but while in there
-  all warnings were fixed.
+  Specifying O_APPEND in conjunction with O_TRUNC and O_CREAT does not
+  make much sense. And this combination of flags is not accepted by all
+  SFTP servers (at least not Apache SSHD).
   
-  There should be no functional change from these changes.
-  
-  Closes #2525
+  Fixes #4147
+  Closes #4148
 
-- [Daniel Gustafsson brought this change]
+- [Gergely Nagy brought this change]
 
-  cookies: ensure that we have cookies before writing jar
+  multi: call detach_connection before Curl_disconnect
   
-  The jar should be written iff there are cookies, so ensure that we still
-  have cookies after expiration to avoid creating an empty file.
+  Curl_disconnect bails out if conn->easyq is not empty, detach_connection
+  needs to be called first to remove the current easy from the queue.
   
-  Closes #2529
+  Fixes #4144
+  Closes #4151
 
-- strcpy_url: only %-encode values >= 0x80
+Jay Satiro (23 Jul 2019)
+- tool_operate: fix implicit call to easysrc_cleanup
   
-  OSS-Fuzz detected
+  easysrc_cleanup is only defined when CURL_DISABLE_LIBCURL_OPTION is not
+  defined, and prior to this change would be called regardless.
   
-  https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=8000
+  Bug: https://github.com/curl/curl/pull/3804#issuecomment-513922637
+  Reported-by: Marcel Raad
   
-  Broke in dd7521bcc1b7
+  Closes https://github.com/curl/curl/pull/4142
 
-- mime: avoid NULL pointer dereference risk
-  
-  Coverity detected, CID 1435120
+Daniel Stenberg (22 Jul 2019)
+- curl:create_transfers check return code from curl_easy_setopt
   
-  Closes #2527
-
-- [Stephan Mühlstrasser brought this change]
-
-  ctype: restore character classification for non-ASCII platforms
+  From commit b8894085
   
-  With commit 4272a0b0fc49a1ac0ceab5c4a365c9f6ab8bf8e2 curl-speficic
-  character classification macros and functions were introduced in
-  curl_ctype.[ch] to avoid dependencies on the locale. This broke curl on
-  non-ASCII, e.g. EBCDIC platforms. This change restores the previous set
-  of character classification macros when CURL_DOES_CONVERSIONS is
-  defined.
+  Pointed out by Coverity CID 1451703
   
-  Closes #2494
+  Closes #4134
 
-- ftplistparser: keep state between invokes
+- HTTP3: initial (experimental) support
   
-  Fixes FTP wildcard parsing when done over a number of read buffers.
+  USe configure --with-ngtcp2 or --with-quiche
   
-  Regression from f786d1f14
+  Using either option will enable a HTTP3 build.
+  Co-authored-by: Alessandro Ghedini <alessandro@ghedini.me>
   
-  Reported-by: wncboy on github
-  Fixes #2445
-  Closes #2526
+  Closes #3500
 
-- examples/http2-upload: expand buffer to avoid silly warning
+- curl: remove dead code
   
-  http2-upload.c:135:44: error: ‘%02d’ directive output may be truncated
-  writing between 2 and 11 bytes into a region of size between 8 and 17
-
-- examples/sftpuploadresume: typecast fseek argument to long
+  The loop never loops (since b889408500), pointed out by Coverity (CID
+  1451702)
   
-  /docs/examples/sftpuploadresume.c:102:12: warning: conversion to 'long
-  int' from 'curl_off_t {aka long long int}' may alter its value
+  Closes #4133
+
+- docs/PARALLEL-TRANSFERS: correct the version number
 
-- Revert "ftplistparser: keep state between invokes"
+- docs/PARALLEL-TRANSFERS: added
+
+- curl: support parallel transfers
   
-  This reverts commit abbc8457d85aca74b7cfda1d394b0844932b2934.
+  This is done by making sure each individual transfer is first added to a
+  linked list as then they can be performed serially, or at will, in
+  parallel.
   
-  Caused fuzzer problems on travis not seen when this was a PR!
+  Closes #3804
 
-- Curl_memchr: zero length input can't match
+- docs/MANUAL.md: converted to markdown from plain text
   
-  Avoids undefined behavior.
+  ... will make it render as a nicer web page.
   
-  Reported-by: Geeknik Labs
+  Closes #4131
 
-- ftplistparser: keep state between invokes
+- curl_version_info: provide nghttp2 details
   
-  Fixes FTP wildcard parsing when doing over a number of read buffers.
+  Introducing CURLVERSION_SIXTH with nghttp2 info.
   
-  Regression from f786d1f14
-  
-  Reported-by: wncboy on github
-  Fixes #2445
-  Closes #2519
+  Closes #4121
+
+- bump: start working on 7.66.0
 
-- ftplistparser: renamed some members and variables
+- source: remove names from source comments
+  
+  Several reasons:
+  
+  - we can't add everyone who's helping out so its unfair to just a few
+  selected ones.
+  - we already list all helpers in THANKS and in RELEASE-NOTES for each
+  release
+  - we don't want to give the impression that some parts of the code is
+  "owned" or "controlled" by specific persons
   
-  ... to make them better spell out what they're for.
+  Assisted-by: Daniel Gustafsson
+  Closes #4129
 
-- RELEASE-NOTES: synced
+Version 7.65.3 (19 Jul 2019)
 
-- [Christian Schmitz brought this change]
+Daniel Stenberg (19 Jul 2019)
+- RELEASE-NOTES: 7.65.3
 
-  curl_global_sslset: always provide available backends
-  
-  Closes #2499
+- THANKS: 7.65.3 status
 
-- http2: convert an assert to run-time check
+- progress: make the progress meter appear again
   
-  Fuzzing has proven we can reach code in on_frame_recv with status_code
-  not having been set, so let's detect that in run-time (instead of with
-  assert) and error error accordingly.
+  Fix regression caused by 21080e1
   
-  (This should no longer happen with the latest nghttp2)
-  
-  Detected by OSS-Fuzz
-  Bug: https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=7903
-  Closes #2514
+  Reported-by: Chih-Hsuan Yen
+  Fixes #4122
+  Closes #4124
 
-- curl.1: clarify that options and URLs can be mixed
-  
-  Fixes #2515
-  Closes #2517
+- version: bump to 7.65.3
+
+- RELEASE-NOTES: Contributors or now 1990
+
+Version 7.65.2 (17 Jul 2019)
 
-Jay Satiro (23 Apr 2018)
-- [Archangel_SDY brought this change]
+Daniel Stenberg (17 Jul 2019)
+- RELEASE-NOTES: 7.65.2
 
-  CURLOPT_SSLCERT.3: improve WinSSL-specific usage info
+- THANKS: add contributors from 7.65.2
+
+Jay Satiro (17 Jul 2019)
+- [aasivov brought this change]
+
+  cmake: Fix finding Brotli on case-sensitive file systems
   
-  Ref: https://github.com/curl/curl/pull/2376#issuecomment-381858780
+  - Find package "Brotli" instead of "BROTLI" since the former is the
+    casing used for CMake/FindBrotli.cmake, and otherwise find_package
+    may fail on a case-sensitive file system.
   
-  Closes https://github.com/curl/curl/pull/2504
+  Fixes https://github.com/curl/curl/issues/4117
 
-- [Archangel_SDY brought this change]
-
-  schannel: fix build error on targets <= XP
+- CURLOPT_RANGE.3: Caution against using it for HTTP PUT
   
-  - Use CRYPT_STRING_HEX instead of CRYPT_STRING_HEXRAW since XP doesn't
-    support the latter.
+  AFAICT CURLOPT_RANGE does not support ranged HTTP PUT uploads so I've
+  cautioned against using it for that purpose and included a workaround.
   
-  Ref: https://github.com/curl/curl/pull/2376#issuecomment-382153668
+  Bug: https://curl.haxx.se/mail/lib-2019-04/0075.html
+  Reported-by: Christopher Head
   
-  Closes https://github.com/curl/curl/pull/2504
+  Closes https://github.com/curl/curl/issues/3814
 
-Daniel Stenberg (23 Apr 2018)
-- Revert "ftplistparser: keep state between invokes"
-  
-  This reverts commit 8fb78f9ddc6d858d630600059b8ad84a80892fd9.
+- [Stefano Simonelli brought this change]
+
+  CURLOPT_SEEKDATA.3: fix variable name
   
-  Unfortunately this fix introduces memory leaks I've not been able to fix
-  in several days. Reverting this for now to get the leaks fixed.
+  Closes https://github.com/curl/curl/pull/4118
+
+- [Giorgos Oikonomou brought this change]
 
-Jay Satiro (21 Apr 2018)
-- tool_help: clarify --max-time unit of time is seconds
+  CIPHERS.md: Explain Schannel error SEC_E_ALGORITHM_MISMATCH
   
-  Before:
-   -m, --max-time <time> Maximum time allowed for the transfer
+  If the SSL backend is Schannel and the user specifies an Schannel CALG_
+  that is not supported by the protocol or the server then curl returns
+  CURLE_SSL_CONNECT_ERROR (35) SEC_E_ALGORITHM_MISMATCH.
   
-  After:
-   -m, --max-time <seconds> Maximum time allowed for the transfer
+  Fixes https://github.com/curl/curl/issues/3389
+  Closes https://github.com/curl/curl/pull/4106
+
+- [Daniel Gustafsson brought this change]
 
-Daniel Stenberg (20 Apr 2018)
-- http2: handle GOAWAY properly
+  nss: inspect returnvalue of token check
   
-  When receiving REFUSED_STREAM, mark the connection for close and retry
-  streams accordingly on another/fresh connection.
+  PK11_IsPresent() checks for the token for the given slot is available,
+  and sets needlogin flags for the PK11_Authenticate() call.  Should it
+  return false, we should however treat it as an error and bail out.
   
-  Reported-by: Terry Wu
-  Fixes #2416
-  Fixes #1618
-  Closes #2510
+  Closes https://github.com/curl/curl/pull/4110
 
-- http2: clear the "drain counter" when a stream is closed
+- docs: Explain behavior change in --tlsv1. options since 7.54
   
-  This fixes the notorious "httpc->drain_total >= data->state.drain"
-  assert.
+  Since 7.54 --tlsv1. options use the specified version or later, however
+  older versions of curl documented it as using just the specified version
+  which may or may not have happened depending on the TLS library.
+  Document this discrepancy to allay confusion for users familiar with the
+  old documentation that expect just the specified version.
   
-  Reported-by: Anders Bakken
-  
-  Fixes #1680
-  Closes #2509
+  Fixes https://github.com/curl/curl/issues/4097
+  Closes https://github.com/curl/curl/pull/4119
 
-- http2: avoid strstr() on data not zero terminated
+- libcurl: Restrict redirect schemes (follow-up)
   
-  It's not strictly clear if the API contract allows us to call strstr()
-  on a string that isn't zero terminated even when we know it will find
-  the substring, and clang's ASAN check dislikes us for it.
+  - Allow FTPS on redirect.
   
-  Also added a check of the return code in case it fails, even if I can't
-  think of a situation how that can trigger.
+  - Update default allowed redirect protocols in documentation.
   
-  Detected by OSS-Fuzz
-  Closes #2513
-  Bug: https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=7760
-
-- [Stephan Mühlstrasser brought this change]
-
-  openssl: fix subjectAltName check on non-ASCII platforms
+  Follow-up to 6080ea0.
   
-  Curl_cert_hostcheck operates with the host character set, therefore the
-  ASCII subjectAltName string retrieved with OpenSSL must be converted to
-  the host encoding before comparison.
+  Ref: https://github.com/curl/curl/pull/4094
   
-  Closes #2493
+  Closes https://github.com/curl/curl/pull/4115
 
-Jay Satiro (20 Apr 2018)
-- openssl: Add support for OpenSSL 1.1.1 verbose-mode trace messages
-  
-  - Support handling verbose-mode trace messages of type
-    SSL3_RT_INNER_CONTENT_TYPE, SSL3_MT_ENCRYPTED_EXTENSIONS,
-    SSL3_MT_END_OF_EARLY_DATA, SSL3_MT_KEY_UPDATE, SSL3_MT_NEXT_PROTO,
-    SSL3_MT_MESSAGE_HASH
+Daniel Stenberg (16 Jul 2019)
+- test1173: make it also check all libcurl option man pages
   
-  Reported-by: iz8mbw@users.noreply.github.com
+  ... and adjust those that cause errors
   
-  Fixes https://github.com/curl/curl/issues/2403
+  Closes #4116
 
-Daniel Stenberg (19 Apr 2018)
-- ftplistparser: keep state between invokes
+- curl: only accept COLUMNS less than 10000
   
-  Regression from f786d1f14
+  ... as larger values would rather indicate something silly (and could
+  potentially cause buffer problems).
   
-  Reported-by: wncboy on github
-  Fixes #2445
-  Closes #2508
+  Reported-by: pendrek at hackerone
+  Closes #4114
 
-- detect_proxy: only show proxy use if it had contents
-
-- http2: handle on_begin_headers() called more than once
+- dist: add manpage-syntax.pl
   
-  This triggered an assert if called more than once in debug mode (and a
-  memory leak if not debug build). With the right sequence of HTTP/2
-  headers incoming it can happen.
+  follow-up to 7fb66c403
+
+- test1173: detect some basic man page format mistakes
   
-  Detected by OSS-Fuzz
+  Triggered by PR #4111
   
-  Closes #2507
-  Bug: https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=7764
+  Closes #4113
 
-Jay Satiro (18 Apr 2018)
-- [Dan McNulty brought this change]
+Jay Satiro (15 Jul 2019)
+- [Bjarni Ingi Gislason brought this change]
 
-  schannel: add support for CURLOPT_CAINFO
-  
-  - Move verify_certificate functionality in schannel.c into a new
-    file called schannel_verify.c. Additionally, some structure defintions
-    from schannel.c have been moved to schannel.h to allow them to be
-    used in schannel_verify.c.
-  
-  - Make verify_certificate functionality for Schannel available on
-    all versions of Windows instead of just Windows CE. verify_certificate
-    will be invoked on Windows CE or when the user specifies
-    CURLOPT_CAINFO and CURLOPT_SSL_VERIFYPEER.
+  docs: Fix missing lines caused by undefined macros
   
-  - In verify_certificate, create a custom certificate chain engine that
-    exclusively trusts the certificate store backed by the CURLOPT_CAINFO
-    file.
+  - Escape apostrophes at line start.
   
-  - doc updates of --cacert/CAINFO support for schannel
+  Some lines begin with a "'" (apostrophe, single quote), which is then
+  interpreted as a control character in *roff.
   
-  - Use CERT_NAME_SEARCH_ALL_NAMES_FLAG when invoking CertGetNameString
-    when available. This implements a TODO in schannel.c to improve
-    handling of multiple SANs in a certificate. In particular, all SANs
-    will now be searched instead of just the first name.
+  Such lines are interpreted as being a call to a macro, and if
+  undefined, the lines are removed from the output.
   
-  - Update tool_operate.c to not search for the curl-ca-bundle.crt file
-    when using Schannel to maintain backward compatibility. Previously,
-    any curl-ca-bundle.crt file found in that search would have been
-    ignored by Schannel. But, with CAINFO support, the file found by
-    that search would have been used as the certificate store and
-    could cause issues for any users that have curl-ca-bundle.crt in
-    the search path.
+  Bug: https://bugs.debian.org/926352
+  Signed-off-by: Bjarni Ingi Gislason <bjarniig@rhi.hi.is>
   
-  - Update url.c to not set the build time CURL_CA_BUNDLE if the selected
-    SSL backend is Schannel. We allow setting CA location for schannel
-    only when explicitly specified by the user via CURLOPT_CAINFO /
-    --cacert.
+  Submitted-by: Alessandro Ghedini
   
-  - Add new test cases 3000 and 3001. These test cases check that the first
-    and last SAN, respectively, matches the connection hostname. New test
-    certificates have been added for these cases. For 3000, the certificate
-    prefix is Server-localhost-firstSAN and for 3001, the certificate
-    prefix is Server-localhost-secondSAN.
-  
-  - Remove TODO 15.2 (Add support for custom server certificate
-    validation), this commit addresses it.
+  Closes https://github.com/curl/curl/pull/4111
+
+Daniel Stenberg (14 Jul 2019)
+- libcurl-security.3: update to new CURLOPT_REDIR_PROTOCOLS defaults
   
-  Closes https://github.com/curl/curl/pull/1325
+  follow-up to 6080ea098
 
-- schannel: fix warning
+- [Linos Giannopoulos brought this change]
+
+  libcurl: Add testcase for gopher redirects
   
-  - Fix warning 'integer from pointer without a cast' on 3rd arg in
-    CertOpenStore. The arg type HCRYPTPROV may be a pointer or integer
-    type of the same size.
+  The testcase ensures that redirects to CURLPROTO_GOPHER won't be
+  allowed, by default, in the future. Also, curl is being used
+  for convenience while keeping the testcases DRY.
   
-  Follow-up to e35b025.
+  The expected error code is CURLE_UNSUPPORTED_PROTOCOL when the client is
+  redirected to CURLPROTO_GOPHER
   
-  Caught by Marc's CI builds.
+  Signed-off-by: Linos Giannopoulos <lgian@skroutz.gr>
 
-- [Jakub Wilk brought this change]
+- [Linos Giannopoulos brought this change]
 
-  docs: fix typos
+  libcurl: Restrict redirect schemes
   
-  Closes https://github.com/curl/curl/pull/2503
-
-Daniel Stenberg (17 Apr 2018)
-- RELEASE-NOTES: synced
-
-Jay Satiro (17 Apr 2018)
-- [Kees Dekker brought this change]
-
-  winbuild: Support custom devel paths for each dependency
+  All protocols except for CURLPROTO_FILE/CURLPROTO_SMB and their TLS
+  counterpart were allowed for redirect. This vastly broadens the
+  exploitation surface in case of a vulnerability such as SSRF [1], where
+  libcurl-based clients are forced to make requests to arbitrary hosts.
   
-  - Support custom devel paths for c-ares, mbedTLS, nghttp2, libSSH2,
-    OpenSSL and zlib. Respectively: CARES_PATH, MBEDTLS_PATH,
-    NGHTTP2_PATH, SSH2_PATH, SSL_PATH and ZLIB_PATH.
+  For instance, CURLPROTO_GOPHER can be used to smuggle any TCP-based
+  protocol by URL-encoding a payload in the URI. Gopher will open a TCP
+  connection and send the payload.
   
-  - Use lib.exe for making the static library instead of link.exe /lib.
-    The latter is undocumented and could cause problems as noted in the
-    comments.
+  Only HTTP/HTTPS and FTP are allowed. All other protocols have to be
+  explicitly enabled for redirects through CURLOPT_REDIR_PROTOCOLS.
   
-  - Remove a dangling URL that no longer worked. (I was not able to find
-    the IDN download at MSDN/microsoft.com, so it seems to be removed.)
+  [1]: https://www.acunetix.com/blog/articles/server-side-request-forgery-vulnerability/
   
-  - Remove custom override for release-ssh2-ssl-dll-zlib configuration.
-    Nobody knows why it was there and as far as we can see is unnecessary.
+  Signed-off-by: Linos Giannopoulos <lgian@skroutz.gr>
   
-  Closes https://github.com/curl/curl/pull/2474
+  Closes #4094
 
-Daniel Stenberg (17 Apr 2018)
-- [Jess brought this change]
+- [Zenju brought this change]
 
-  README.md: add backers and sponsors
+  openssl: define HAVE_SSL_GET_SHUTDOWN based on version number
   
-  Closes #2484
+  Closes #4100
 
-- [Archangel_SDY brought this change]
+- [Peter Simonyi brought this change]
 
-  schannel: add client certificate authentication
+  http: allow overriding timecond with custom header
   
-  Users can now specify a client certificate in system certificates store
-  explicitly using expression like `--cert "CurrentUser\MY\<thumbprint>"`
+  With CURLOPT_TIMECONDITION set, a header is automatically added (e.g.
+  If-Modified-Since).  Allow this to be replaced or suppressed with
+  CURLOPT_HTTPHEADER.
   
-  Closes #2376
+  Fixes #4103
+  Closes #4109
 
-Marcel Raad (16 Apr 2018)
-- [toughengineer brought this change]
+Jay Satiro (11 Jul 2019)
+- [Juergen Hoetzel brought this change]
 
-  ntlm_sspi: fix authentication using Credential Manager
+  smb: Use the correct error code for access denied on file open
   
-  If you pass empty user/pass asking curl to use Windows Credential
-  Storage (as stated in the docs) and it has valid credentials for the
-  domain, e.g.
-  curl -v -u : --ntlm example.com
-  currently authentication fails.
-  This change fixes it by providing proper SPN string to the SSPI API
-  calls.
+  - Return CURLE_REMOTE_ACCESS_DENIED for SMB access denied on file open.
   
-  Fixes https://github.com/curl/curl/issues/1622
-  Closes https://github.com/curl/curl/pull/1660
-
-Daniel Stenberg (16 Apr 2018)
-- configure: keep LD_LIBRARY_PATH changes local
+  Prior to this change CURLE_REMOTE_FILE_NOT_FOUND was returned instead.
   
-  ... only set it when we actually have to run tests to reduce its impact
-  on for example build commands etc.
+  Closes https://github.com/curl/curl/pull/4095
+
+- [Daniel Gustafsson brought this change]
+
+  DEPRECATE: fixup versions and spelling
   
-  Fixes #2490
-  Closes #2492
+  Correctly set the July 17 version to 7.65.2, and update spelling to
+  be consistent. Also fix a typo.
   
-  Reported-by: Dmitry Mikhirev
+  Closes https://github.com/curl/curl/pull/4107
 
-Marcel Raad (16 Apr 2018)
-- urldata: make service names unconditional
+- [Gisle Vanem brought this change]
+
+  system_win32: fix clang warning
   
-  The ifdefs have become quite long. Also, the condition for the
-  definition of CURLOPT_SERVICE_NAME and for setting it from
-  CURLOPT_SERVICE_NAME have diverged. We will soon also need the two
-  options for NTLM, at least when using SSPI, for
-  https://github.com/curl/curl/pull/1660.
-  Just make the definitions unconditional to make that easier.
+  - Declare variable in header as extern.
   
-  Closes https://github.com/curl/curl/pull/2479
+  Bug: https://github.com/curl/curl/commit/48b9ea4#commitcomment-34084597
 
-Daniel Stenberg (16 Apr 2018)
-- test1148: tolerate progress updates better
+Daniel Gustafsson (10 Jul 2019)
+- headers: Remove no longer exported functions
+  
+  There were a leftover few prototypes of Curl_ functions that we used to
+  export but no longer do, this removes those prototypes and cleans up any
+  comments still referring to them.
+  
+  Curl_write32_le(), Curl_strcpy_url(), Curl_strlen_url(), Curl_up_free()
+  Curl_concat_url(), Curl_detach_connnection(), Curl_http_setup_conn()
+  were made static in 05b100aee247bb9bec8e9a1b0166496aa4248d1c.
+  Curl_http_perhapsrewind() made static in 574aecee208f79d391f10d57520b3.
   
-  Fixes #2446
-  Closes #2488
+  For the remainder, I didn't trawl the Git logs hard enough to capture
+  their exact time of deletion, but they were all gone: Curl_splayprint(),
+  Curl_http2_send_request(), Curl_global_host_cache_dtor(),
+  Curl_scan_cache_used(), Curl_hostcache_destroy(), Curl_second_connect(),
+  Curl_http_auth_stage() and Curl_close_connections().
+  
+  Closes #4096
+  Reviewed-by: Daniel Stenberg <daniel@haxx.se>
 
-- [Christian Schmitz brought this change]
+- CMake: fix typos and spelling
 
-  ssh: show libSSH2 error code when closing fails
-  
-  Closes #2500
+- [Kyle Edwards brought this change]
 
-Jay Satiro (15 Apr 2018)
-- [Daniel Gustafsson brought this change]
+  CMake: Convert errant elseif() to else()
+  
+  CMake interprets an elseif() with no arguments as elseif(FALSE),
+  resulting in the elseif() block not being executed. That is not what
+  was intended here. Change the empty elseif() to an else() as it was
+  intended.
+  
+  Closes #4101
+  Reported-by: Artalus <artalus-mail@yandex.ru>
+  Reviewed-by: Daniel Gustafsson <daniel@yesql.se>
 
-  vauth: Fix typo
+- buildconf: fix header filename
   
-  Address various spellings of "credentials".
+  The header file inclusion had a typo, it should be .h and not .hd.
+  Fix by renaming.
   
-  Closes https://github.com/curl/curl/pull/2496
+  Fixes #4102
+  Reported-by: AceCrow on Github
 
-- [Dagobert Michelsen brought this change]
+- [Jan Chren brought this change]
 
-  system.h: Add sparcv8plus to oracle/sunpro 32-bit detection
+  configure: fix --disable-code-coverage
   
-  With specific compiler options selecting the arch like -xarch=sparc on
-  newer compilers like Oracle Studio 12.4 there is no definition of
-  __sparcv8 but __sparcv8plus which means the V9 ISA, but limited to the
-  32ÎíÎñbit subset defined by the V8plus ISA specification, without the
-  Visual Instruction Set (VIS), and without other implementation-specific
-  ISA extensions. So it should be the same as __sparcv8.
+  This fixes the case when --disable-code-coverage supplied to ./configure
+  would result in coverage="yes" being set.
   
-  Closes https://github.com/curl/curl/pull/2491
+  Closes #4099
+  Reviewed-by: Daniel Gustafsson <daniel@yesql.se>
+
+- cleanup: fix typo in comment
 
+- RELEASE-NOTES: synced
+
+Jay Satiro (6 Jul 2019)
 - [Daniel Gustafsson brought this change]
 
-  checksrc: Fix typo
+  nss: support using libnss on macOS
   
-  Fix typo in "semicolon" spelling and remove stray tab character.
+  The file suffix for dynamically loadable objects on macOS is .dylib,
+  which need to be added for the module definitions in order to get the
+  NSS TLS backend to work properly on macOS.
   
-  Closes https://github.com/curl/curl/pull/2498
+  Closes https://github.com/curl/curl/pull/4046
 
 - [Daniel Gustafsson brought this change]
 
-  all: Refactor malloc+memset to use calloc
+  nss: don't set unused parameter
   
-  When a zeroed out allocation is required, use calloc() rather than
-  malloc() followed by an explicit memset(). The result will be the
-  same, but using calloc() everywhere increases consistency in the
-  codebase and avoids the risk of subtle bugs when code is injected
-  between malloc and memset by accident.
+  The value of the maxPTDs parameter to PR_Init() has since at least
+  NSPR 2.1, which was released sometime in 1998, been marked ignored
+  as is accordingly not used in the initialization code.  Setting it
+  to a value when calling PR_Init() is thus benign, but indicates an
+  intent which may be misleading. Reset the value to zero to improve
+  clarity.
   
-  Closes https://github.com/curl/curl/pull/2497
+  Closes https://github.com/curl/curl/pull/4054
+
+- [Daniel Gustafsson brought this change]
 
-Daniel Stenberg (12 Apr 2018)
-- duphandle: make sure CURLOPT_RESOLVE is duplicated fine too
+  nss: only cache valid CRL entries
   
-  Verified in test 1502 now
+  Change the logic around such that we only keep CRLs that NSS actually
+  ended up caching around for later deletion.  If CERT_CacheCRL() fails
+  then there is little point in delaying the freeing of the CRL as it
+  is not used.
   
-  Fixes #2485
-  Closes #2486
-  Reported-by: Ernst Sjöstrand
+  Closes https://github.com/curl/curl/pull/4053
 
-- mailmap: add a monnerat fixup [ci skip]
+- [Gergely Nagy brought this change]
 
-- proxy: show getenv proxy use in verbose output
+  lib: Use UTF-8 encoding in comments
   
-  ... to aid debugging etc as it sometimes isn't immediately obvious why
-  curl uses or doesn't use a proxy.
+  Some editors and IDEs assume that source files use UTF-8 file encodings.
+  It also fixes the build with MSVC when /utf-8 command line option is
+  used (this option is mandatory for some other open-source projects, this
+  is useful when using the same options is desired for building all
+  libraries of a project).
   
-  Inspired by #2477
-  
-  Closes #2480
+  Closes https://github.com/curl/curl/pull/4087
 
-- travis: build libpsl and make builds use it
-  
-  closes #2471
+- [Caleb Raitto brought this change]
 
-- travis: bump to clang 6 and gcc 7
+  CURLOPT_HEADEROPT.3: Fix example
   
-  Extra-eye-on-this-by: Marcel Raad
+  Fix an issue where example builds a curl_slist, but fails to actually
+  use it, or free it.
   
-  Closes #2478
+  Closes https://github.com/curl/curl/pull/4090
 
-Marcel Raad (10 Apr 2018)
-- travis: use trusty for coverage build
+- [Shankar Jadhavar brought this change]
+
+  winbuild: Change Makefile to honor ENABLE_OPENSSL_AUTO_LOAD_CONFIG
   
-  This works now and precise is in the process of being decommissioned.
+  - Made changes so that ENABLE_OPENSSL_AUTO_LOAD_CONFIG will be honored.
   
-  Closes https://github.com/curl/curl/pull/2476
-
-- lib: silence null-dereference warnings
+  - Also removed some ^M chars from file.
   
-  In debug mode, MingGW-w64's GCC 7.3 issues null-dereference warnings
-  when dereferencing pointers after DEBUGASSERT-ing that they are not
-  NULL.
-  Fix this by removing the DEBUGASSERTs.
+  Prior to this change while building on Windows platform even if we pass
+  the ENABLE_OPENSSL_AUTO_LOAD_CONFIG option with value as "no" it does
+  not set the CURL_DISABLE_OPENSSL_AUTO_LOAD_CONFIG flag.
   
-  Suggested-by: Daniel Stenberg
-  Ref: https://github.com/curl/curl/pull/2463
+  Closes https://github.com/curl/curl/pull/4086
 
-- [Kees Dekker brought this change]
+Daniel Stenberg (4 Jul 2019)
+- doh-url.d: added in 7.62.0
 
-  winbuild: fix URL
+Jay Satiro (30 Jun 2019)
+- docs: Fix links to OpenSSL docs
   
-  Follow up on https://github.com/curl/curl/pull/2472.
-  Now using en-us instead of nl-nl as language code in the URL.
+  OpenSSL changed their manual locations and does not redirect to the new
+  locations.
   
-  Closes https://github.com/curl/curl/pull/2475
+  Bug: https://curl.haxx.se/mail/lib-2019-06/0056.html
+  Reported-by: Daniel Stenberg
 
-Daniel Stenberg (9 Apr 2018)
-- [Kees Dekker brought this change]
+Daniel Stenberg (26 Jun 2019)
+- [Gaël PORTAY brought this change]
 
-  winbuild: updated the documentation
+  curl_multi_wait.3: escape backslash in example
   
-  The setenv command no longer exists and visual studio build prompts got
-  changed. Used Visual Studio 2015/2017 as reference.
+  The backslash in the character Line Feed must be escaped.
   
-  Closes #2472
-
-- test1136: fix cookie order after commit c990eadd1277
-
-- build: cleanup to fix clang warnings/errors
+  The current man-page outputs the code as following:
   
-  unit1309 and vtls/gtls: error: arithmetic on a null pointer treated as a
-  cast from integer to pointer is a GNU extension
+          fprintf(stderr, "curl_multi failed, code %d.0, mc);
   
-  Reported-by: Rikard Falkeborn
+  The commit fixes it as follow:
   
-  Fixes #2466
-  Closes #2468
-
-Jay Satiro (7 Apr 2018)
-- examples/sftpuploadresmue: Fix Windows large file seek
+          fprintf(stderr, "curl_multi failed, code %d\n", mc);
   
-  - Use _fseeki64 instead of fseek (long) to seek curl_off_t in Windows.
+  Closes #4079
+
+- openssl: disable engine if OPENSSL_NO_UI_CONSOLE is defined
   
-  - Use CURL_FORMAT_CURL_OFF_T specifier instead of %ld to print
-    curl_off_t.
+  ... since that needs UI_OpenSSL() which isn't provided when OpenSSL is
+  built with OPENSSL_NO_UI_CONSOLE which happens when OpenSSL is built for
+  UWP (with "VC-WIN32-UWP").
   
-  Caught by Marc's CI builds.
+  Reported-by: Vasily Lobaskin
+  Fixes #4073
+  Closes #4077
 
-Daniel Stenberg (7 Apr 2018)
-- curl_setup: provide a CURL_SA_FAMILY_T type if none exists
+- test1521: adapt to SLISTPOINT
+  
+  The header now has the slist-using options marked as SLISTPOINT so this
+  makes sure test 1521 understands that.
   
-  ... and use this type instead of 'sa_family_t' in the code since several
-  platforms don't have it.
+  Follow-up to ae99b4de1c443ae989
   
-  Closes #2463
+  Closes #4074
 
-- [Eric Gallager brought this change]
+- win32: make DLL loading a no-op for UWP
+  
+  Reported-by: Michael Brehm
+  Fixes #4060
+  Closes #4072
 
-  build: add picky compiler warning flags for gcc 6 and 7
+- [1ocalhost brought this change]
 
-- configure: detect sa_family_t
+  configure: fix typo '--disable-http-uath'
+  
+  Closes #4076
 
-Jay Satiro (7 Apr 2018)
-- [Stefan Agner brought this change]
+- [Niklas Hambüchen brought this change]
 
-  tool_operate: Fix retry on FTP 4xx to ignore other protocols
+  docs: fix string suggesting HTTP/2 is not the default
   
-  Only treat response code as FTP response codes in case the
-  protocol type is FTP.
+  Commit 25fd1057c9c86e3 made HTTP2 the default, and further down in the
+  man page that new default is mentioned, but the section at the top
+  contradicted it until now.
   
-  This fixes an issue where an HTTP download was treated as FTP
-  in case libcurl returned with 33. This happens when the
-  download has already finished and the server responses 416:
-    HTTP/1.1 416 Requested Range Not Satisfiable
+  Also remove claim that setting the HTTP version is not sensible.
   
-  This should not be treated as an FTP error.
-  
-  Fixes #2464
-  Closes #2465
-
-Daniel Stenberg (6 Apr 2018)
-- hash: calculate sizes with size_t instead of longs
-  
-  ... since they return size_t anyway!
-  
-  closes #2462
+  Closes #4075
 
 - RELEASE-NOTES: synced
 
-- [Jay Satiro brought this change]
+- [Stephan Szabo brought this change]
 
-  build-openssl.bat: Refer to VS2017 as VC14.1 instead of VC15
-  
-  .. and do the same for build-wolfssl.bat.
+  tests: update fixed IP for hostip/clientip split
   
-  Because MS calls it VC14.1.
+  These tests give differences for me on linux when using a hostip
+  pointing to the external ip address for the local machine.
   
-  Closes https://github.com/curl/curl/pull/2189
+  Closes #4070
 
-- [Kees Dekker brought this change]
-
-  winbuild: make the clean target work without build-type
+Daniel Gustafsson (24 Jun 2019)
+- http: clarify header buffer size calculation
   
-  Due to the check in Makefile.vc and MakefileBuild.vc, no make call can
-  be invoked unless a build-type was specified. However, a clean target
-  only existed when a build type was specified. As a result, the clean
-  target was unreachable. Made clean target unconditional.
+  The header buffer size calculation can from static analysis seem to
+  overlow as it performs an addition between two size_t variables and
+  stores the result in a size_t variable. Overflow is however guarded
+  against elsewhere since the input to the addition is regulated by
+  the maximum read buffer size. Clarify this with a comment since the
+  question was asked.
   
-  Closes #2455
-
-- [patelvivekv1993 brought this change]
+  Reviewed-by: Daniel Stenberg <daniel@haxx.se>
 
-  build-openssl.bat: allow custom paths for VS and perl
+Daniel Stenberg (24 Jun 2019)
+- KNOWN_BUGS: Don't clear digest for single realm
   
-  Fixes #2430
-  Closes #2457
+  Closes #3267
 
-- [Laurie Clark-Michalek brought this change]
+- KNOWN_BUGS: Schannel disable CURLOPT_SSL_VERIFYPEER and verify hostname
+  
+  Closes #3284
 
-  FTP: allow PASV on IPv6 connections when a proxy is being used
+- http2: call done_sending on end of upload
   
-  In the situation of a client connecting to an FTP server using an IPv6
-  tunnel proxy, the connection info will indicate that the connection is
-  IPv6. However, because the server behing the proxy is IPv4, it is
-  permissable to attempt PSV mode. In the case of the FTP server being
-  IPv4 only, EPSV will always fail, and with the current logic curl will
-  be unable to connect to the server, as the IPv6 fwdproxy causes curl to
-  think that EPSV is impossible.
+  To make sure a HTTP/2 stream registers the end of stream.
   
-  Closes #2432
+  Bug #4043 made me find this problem but this fix doesn't correct the
+  reported issue.
+  
+  Closes #4068
 
-- [Jon DeVree brought this change]
+- [James Brown brought this change]
 
-  file: restore old behavior for file:////foo/bar URLs
+  c-ares: honor port numbers in CURLOPT_DNS_SERVERS
   
-  curl 7.57.0 and up interpret this according to Appendix E.3.2 of RFC
-  8089 but then returns an error saying this is unimplemented. This is
-  actually a regression in behavior on both Windows and Unix.
+  By using ares_set_servers_ports_csv on new enough c-ares.
   
-  Before curl 7.57.0 this URL was treated as a path of "//foo/bar" and
-  then passed to the relevant OS API. This means that the behavior of this
-  case is actually OS dependent.
+  Fixes #4066
+  Closes #4067
+
+Daniel Gustafsson (24 Jun 2019)
+- CURLMOPT_SOCKETFUNCTION.3: fix typo
+
+Daniel Stenberg (24 Jun 2019)
+- [Koen Dergent brought this change]
+
+  curl: skip CURLOPT_PROXY_CAPATH for disabled-proxy builds
   
-  The Unix path resolution rules say that the OS must handle swallowing
-  the extra "/" and so this path is the same as "/foo/bar"
+  Closes #4061
+
+- test153: fix content-length to avoid occasional hang
   
-  The Windows path resolution rules say that this is a UNC path and
-  automatically handles the SMB access for the program. So curl on Windows
-  was already doing Appendix E.3.2 without any special code in curl.
+  Closes #4065
+
+- RELEASE-NOTES: synced
+
+- multi: enable multiplexing by default (again)
   
-  Regression
+  It was originally made default in d7c4213bd0c (7.62.0) but mistakenly
+  reverted in commit 2f44e94efb3d (7.65.0). Now enabled again.
   
-  Closes #2438
+  Closes #4051
 
-- [Gaurav Malhotra brought this change]
+- typecheck: add 3 missing strings and a callback data pointer
+  
+  Closes #4050
 
-  Revert "openssl: Don't add verify locations when verifypeer==0"
+- tests: add disable-scan.pl to dist
   
-  This reverts commit dc85437736e1fc90e689bb1f6c51c8f1aa9430eb.
+  follow-up from 29177f422a5
   
-  libcurl (with the OpenSSL backend) performs server certificate verification
-  even if verifypeer == 0 and the verification result is available using
-  CURLINFO_SSL_VERIFYRESULT. The commit that is being reverted caused the
-  CURLINFO_SSL_VERIFYRESULT to not have useful information for the
-  verifypeer == 0 use case (it would always have
-  X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY).
+  Closes #4059
+
+- http2: don't call stream-close on already closed streams
   
-  Closes #2451
+  Closes #4055
 
-- [Wyatt O'Day brought this change]
+Marcel Raad (20 Jun 2019)
+- travis: enable alt-svc for coverage build
+  
+  Closes
 
-  tls: fix mbedTLS 2.7.0 build + handle sha256 failures
+- travis: enable libssh2 for coverage build
   
-  (mbedtls 2.70 compiled with MBEDTLS_DEPRECATED_REMOVED)
+  It was enabled by default before commit c92d2e14cfb.
   
-  Closes #2453
-
-- [Lauri Kasanen brought this change]
-
-  cookie: case-insensitive hashing for the domains
+  Disable torture tests 600 and 601 because of
+  https://github.com/curl/curl/issues/1678.
   
-  closes #2458
+  Closes
 
-Patrick Monnerat (4 Apr 2018)
-- cookie: fix and optimize 2nd top level domain name extraction
+- travis: disable threaded resolver for coverage build
   
-  This fixes a segfault occurring when a name of the (invalid) form "domain..tld"
-  is processed.
+  This enables more tests.
   
-  test46 updated to cover this case.
+  Closes
+
+- travis: enable brotli for all xenial jobs
   
-  Follow-up to commit c990ead.
+  There's no need for a separate job, and no need to build it from source
+  with Xenial.
   
-  Ref: https://github.com/curl/curl/pull/2440
+  Closes
 
-Daniel Stenberg (4 Apr 2018)
-- openssl: provide defines for argument typecasts to build warning-free
+- travis: enable warnings-as-errors for coverage build
   
-  ... as OpenSSL >= 1.1.0 and libressl >= 2.7.0 use different argument types.
+  Closes
 
-- [Bernard Spil brought this change]
+GitHub (20 Jun 2019)
+- [Gisle Vanem brought this change]
 
-  openssl: fix build with LibreSSL 2.7
-  
-   - LibreSSL 2.7 implements (most of) OpenSSL 1.1 API
+  system_win32: fix typo
+
+Daniel Stenberg (20 Jun 2019)
+- typecheck: CURLOPT_CONNECT_TO takes an slist too
   
-  Fixes #2319
-  Closes #2447
-  Closes #2448
+  Additionally, add an alias in curl.h for slist-using options so that
+  we can grep/parse those out at will.
   
-  Signed-off-by: Bernard Spil <brnrd@FreeBSD.org>
+  Closes #4042
 
-- [Lauri Kasanen brought this change]
+- [Stephan Szabo brought this change]
 
-  cookie: store cookies per top-level-domain-specific hash table
+  tests: support non-localhost HOSTIP for dict/smb servers
+  
+  smbserver.py/dictserver.py were explicitly using localhost/127.0.0.1 for
+  binding the server which when we were running the tests with a separate
+  HOSTIP and CLIENTIP had failures verifying the server from the device we
+  were testing.
   
-  This makes libcurl handle thousands of cookies much better and speedier.
+  This changes them to take the address from runtests.py and default to
+  localhost/127.0.0.1 if none is given.
   
-  Closes #2440
+  Closes #4048
 
-- [Lauri Kasanen brought this change]
+- test1523: basic test of CURLOPT_LOW_SPEED_LIMIT
 
-  cookies: when reading from a file, only remove_expired once
+- configure: --disable-progress-meter
   
-  This drops the cookie load time for 8k cookies from 178ms to 15ms.
+  Builds libcurl without support for the built-in progress meter.
   
-  Closes #2441
+  Closes #4023
 
-- test1148: set a fixed locale for the test
+- curl: improved skip-setopt-options when built with disabled features
   
-  ...as otherwise it might use a different decimal sign.
+  Reduces #ifdefs in src/tool_operate.c
   
-  Bug: #2436
-  Reported-by: Oumph on github
+  Follow-up from 4e86f2fc4e6
+  Closes #3936
 
-Jay Satiro (31 Mar 2018)
-- docs: fix CURLINFO_*_T examples use of CURL_FORMAT_CURL_OFF_T
+Steve Holme (18 Jun 2019)
+- netrc: Return the correct error code when out of memory
   
-  - Put a percent sign before each CURL_FORMAT_CURL_OFF_T in printf.
+  Introduced in 763c5178.
   
-  For example "%" CURL_FORMAT_CURL_OFF_T becomes %lld or similar.
-  
-  Bug: https://curl.haxx.se/mail/lib-2018-03/0140.html
-  Reported-by: David L.
+  Closes #4036
 
-Sergei Nikulov (27 Mar 2018)
-- [Michał Janiszewski brought this change]
+Daniel Stenberg (18 Jun 2019)
+- config-os400: add getpeername and getsockname defines
+  
+  Reported-by: jonrumsey on github
+  Fixes #4037
+  Closes #4039
 
-  cmake: Add advapi32 as explicit link library for win32
+- runtests: keep logfiles around by default
+  
+  Make '-k' a no-op. The singletest function now clears the log directory
+  BEFORE each individual test and not after, which makes it possible to
+  always keep the logfiles around after a test has been run. No need to
+  specify -k anymore. Keeping the option parsing around to work with users
+  of old habits.
   
-  ARM targets need advapi32 explicitly.
+  Some tests also didn't work properly when -k was used (since the old
+  logs would be kep when a new test starts) which this change also fixes.
   
-  Closes #2363
+  Closes #4035
 
-Daniel Stenberg (27 Mar 2018)
-- TODO: connection cache sharing is now supporte
+- [Gergely Nagy brought this change]
 
-Jay Satiro (26 Mar 2018)
-- travis: enable apt retry on fail
+  openssl: fix pubkey/signature algorithm detection in certinfo
   
-  This is a workaround for an unsolved travis issue that is causing CI
-  instances to sporadically fail due to 'unable to connect' issues during
-  apt stage.
+  Certinfo gives the same result for all OpenSSL versions.
+  Also made printing RSA pubkeys consistent with older versions.
   
-  Ref: https://github.com/travis-ci/travis-ci/issues/8507
-  Ref: https://github.com/travis-ci/travis-ci/issues/9112#issuecomment-376305909
+  Reported-by: Michael Wallner
+  Fixes #3706
+  Closes #4030
 
-Michael Kaufmann (26 Mar 2018)
-- runtests.pl: fix warning 'use of uninitialized value'
+- conn_maxage: move the check to prune_dead_connections()
   
-  follow-up to a9a7b60
+  ... and avoid the locking issue.
   
-  Closes #2428
+  Reported-by: Kunal Ekawde
+  Fixes #4029
+  Closes #4032
 
-Daniel Stenberg (24 Mar 2018)
-- gitignore: ignore more generated files
-
-- threaded resolver: track resolver time and set suitable timeout values
-  
-  In order to make curl_multi_timeout() return suitable "sleep" times even
-  when there's no socket to wait for while the name is being resolved in a
-  helper thread.
+- tests: have runtests figure out disabled features
   
-  It will increases the timeouts as time passes.
+  ... so that runtests can skip individual test cases that test features
+  that are explicitly disabled in this build. This new logic is intended
+  for disabled features that aren't otherwise easily visible through the
+  curl_version_info() or other API calls.
   
-  Closes #2419
-
-- [Howard Chu brought this change]
-
-  openldap: fix for NULL return from ldap_get_attribute_ber()
+  tests/server/disabled is a newly built executable that will output a
+  list of disabled features. Outputs nothing for a default build.
   
-  Closes #2399
-
-GitHub (22 Mar 2018)
-- [Sergei Nikulov brought this change]
-
-  travis-ci: enable -Werror for CMake builds (#2418)
+  Closes #3950
 
-- [Sergei Nikulov brought this change]
-
-  cmake: avoid warn-as-error during config checks (#2411)
+- test188/189: fix Content-Length
   
-  - Move the CURL_WERROR option processing after the configuration checks
-    to avoid failures in case of warnings during the configuration checks.
+  This cures the flaky test results
   
-  This is a partial fix for #2358
+  Closes #4034
 
-- [Sergei Nikulov brought this change]
+- [Thomas Gamper brought this change]
 
-  timeval: remove compilation warning by casting (#2417)
+  winbuild: use WITH_PREFIX if given
   
-  This is fixes #2358
+  Closes #4031
 
-Daniel Stenberg (22 Mar 2018)
-- http2: read pending frames (including GOAWAY) in connection-check
+Daniel Gustafsson (17 Jun 2019)
+- openssl: remove outdated comment
   
-  If a connection has received a GOAWAY frame while not being used, the
-  function now reads frames off the connection before trying to reuse it
-  to avoid reusing connections the server has told us not to use.
+  OpenSSL used to call exit(1) on syntax errors in OPENSSL_config(),
+  which is why we switched to CONF_modules_load_file() and introduced
+  a comment stating why. This behavior was however changed in OpenSSL
+  commit abdd677125f3a9e3082f8c5692203590fdb9b860, so remove the now
+  outdated and incorrect comment. The mentioned commit also declares
+  OPENSSL_config() deprecated so keep the current coding.
   
-  Reported-by: Alex Baines
-  Fixes #1967
-  Closes #2402
+  Closes #4033
+  Reviewed-by: Daniel Stenberg <daniel@haxx.se>
 
-- [Bas van Schaik brought this change]
+Daniel Stenberg (16 Jun 2019)
+- RELEASE-NOTES: synced
 
-  CI: add lgtm.yml for tweaking lgtm.com analysis
+Patrick Monnerat (16 Jun 2019)
+- os400: make vsetopt() non-static as Curl_vsetopt() for os400 support.
+  
+  Use it in curl_easy_setopt_ccsid().
   
-  Closes #2414
+  Reported-by: jonrumsey on github
+  Fixes #3833
+  Closes #4028
 
-- CURLINFO_SSL_VERIFYRESULT.3: fix the example, add some text
+Daniel Stenberg (15 Jun 2019)
+- runtests: report single test time + total duration
   
-  Reported-by: Michal Trybus
+  ... after each successful test.
   
-  Fixes #2400
+  Closes #4027
 
-- TODO: expand ~/ in config files
+- multi: fix the transfer hash function
   
-  Closes #2317
-
-- cookie.d: mention that "-" as filename means stdin
+  Follow-up from 8b987cc7eb
   
-  Reported-by: Dongliang Mu
-  Fixes #2410
+  Reported-by: Tom van der Woerdt
+  Fixes #4018
+  Closes #4024
 
-- CURLINFO_COOKIELIST.3: made the example not leak memory
+- unit1654: cleanup on memory failure
+  
+  ... to make it handle torture tests properly.
   
-  Reported-by: Muz Dima
+  Reported-by: Marcel Raad
+  Fixes #4021
+  Closes #4022
 
-- vauth/cleartext: fix integer overflow check
+Marcel Raad (13 Jun 2019)
+- krb5: fix compiler warning
   
-  Make the integer overflow check not rely on the undefined behavior that
-  a size_t wraps around on overflow.
+  Even though the variable was used in a DEBUGASSERT, GCC 8 warned in
+  debug mode:
+  krb5.c:324:17: error: unused variable 'maj' [-Werror=unused-variable]
   
-  Detected by lgtm.com
-  Closes #2408
-
-- lib/curl_path.h: add #ifdef header guard
+  Just suppress the warning and declare the variable unconditionally
+  instead of only for DEBUGBUILD (which also missed the check for
+  HAVE_ASSERT_H).
   
-  Detected by lgtm.com
+  Closes https://github.com/curl/curl/pull/4020
 
-- vauth/ntlm.h: fix the #ifdef header guard
+Daniel Stenberg (13 Jun 2019)
+- quote.d: asterisk prefix works for SFTP as well
   
-  Detected by lgtm.com
+  Reported-by: Ben Voris
+  Fixes #4017
+  Closes #4019
 
-Jay Satiro (20 Mar 2018)
-- examples/hiperfifo: checksrc compliance
-
-Daniel Stenberg (19 Mar 2018)
-- [Nikos Tsipinakis brought this change]
-
-  parsedate: support UT timezone
+- multi: fix the transfer hashes in the socket hash entries
   
-  RFC822 section 5.2 mentions Universal Time, 'UT', to be synonymous with
-  GMT.
+  - The transfer hashes weren't using the correct keys so removing entries
+    failed.
   
-  Closes #2401
-
-- RELEASE-NOTES: synced
+  - Simplified the iteration logic over transfers sharing the same socket and
+    they now simply are set to expire and thus get handled in the "regular"
+    timer loop instead.
+  
+  Reported-by: Tom van der Woerdt
+  Fixes #4012
+  Closes #4014
 
-- [Don brought this change]
+Jay Satiro (12 Jun 2019)
+- [Cliff Crosland brought this change]
 
-  cmake: add support for brotli
+  url: Fix CURLOPT_MAXAGE_CONN time comparison
   
-  Currently CMake cannot detect Brotli support. This adds detection of the
-  libraries and associated header files. It also adds this to the
-  generated config.
+  Old connections are meant to expire from the connection cache after
+  CURLOPT_MAXAGE_CONN seconds. However, they actually expire after 1000x
+  that value. This occurs because a time value measured in milliseconds is
+  accidentally divided by 1M instead of by 1,000.
   
-  Closes #2392
-
-- [Chris Araman brought this change]
-
-  darwinssl: fix iOS build
-
-Patrick Monnerat (18 Mar 2018)
-- ILE/RPG binding: Add CURLOPT_HAPROXYPROTOCOL/Fix CURLOPT_DNS_SHUFFLE_ADDRESSES
+  Closes https://github.com/curl/curl/pull/4013
 
-Daniel Stenberg (17 Mar 2018)
-- [Rick Deist brought this change]
+Daniel Stenberg (11 Jun 2019)
+- test1165: verify that CURL_DISABLE_ symbols are in sync
+  
+  between configure.ac and source code. They should be possible to switch
+  on/off in configure AND be used in source code.
 
-  resolve: add CURLOPT_DNS_SHUFFLE_ADDRESSES
+- configure: remove CURL_DISABLE_TLS_SRP
   
-  This patch adds CURLOPT_DNS_SHUFFLE_ADDRESSES to explicitly request
-  shuffling of IP addresses returned for a hostname when there is more
-  than one. This is useful when the application knows that a round robin
-  approach is appropriate and is willing to accept the consequences of
-  potentially discarding some preference order returned by the system's
-  implementation.
+  It isn't used by code so stop providing the define.
   
-  Closes #1694
+  Closes #4010
 
-- add_handle/easy_perform: clear errorbuffer on start if set
-  
-  To offer applications a more defined behavior, we clear the buffer as
-  early as possible.
+- Revert "cmake: add SMB to list of disabled protocols if HTTP_ONLY is specified"
   
-  Assisted-by: Jay Satiro
+  This reverts commit 36738caeb78603ce24e3ea089a167b8c216fb938.
   
-  Fixes #2190
-  Closes #2377
+  Apparently several of the appveyor windows builds broke.
 
-- [Lawrence Matthews brought this change]
+- [sergey-raevskiy brought this change]
 
-  CURLOPT_HAPROXYPROTOCOL: support the HAProxy PROXY protocol
-  
-  Add --haproxy-protocol for the command line tool
+  cmake: add SMB to list of disabled protocols if HTTP_ONLY is specified
   
-  Closes #2162
+  Reviewed-by: Jakub Zakrzewski
+  Closes #3770
 
-- curl_version_info.3: fix ssl_version description
-  
-  Reported-by: Vincas Razma
-  Fixes #2364
+- RELEASE-NOTES: synced
 
-- multi: improved pending transfers handling => improved performance
+- http2: remove CURL_DISABLE_TYPECHECK define
   
-  When a transfer is requested to get done and it is put in the pending
-  queue when limited by number of connections, total or per-host, libcurl
-  would previously very aggressively retry *ALL* pending transfers to get
-  them transferring. That was very time consuming.
+  ... in http2-less builds as it served no use.
+
+- configure: more --disable switches to toggle off individual features
   
-  By reducing the aggressiveness in how pending are being retried, we
-  waste MUCH less time on putting transfers back into pending again.
+  ... actual support in the code for disabling these has already landed.
   
-  Some test cases got a factor 30(!) speed improvement with this change.
+  Closes #4009
+
+- wolfssl: fix key pinning build error
   
-  Reported-by: Cyril B
-  Fixes #2369
-  Closes #2383
+  follow-up from deb9462ff2de8
 
-- pause: when changing pause state, update socket state
+- CURLMOPT_SOCKETFUNCTION.3: clarified
   
-  Especially unpausing a transfer might have to move the socket back to the
-  "currently used sockets" hash to get monitored. Otherwise it would never get
-  any more data and get stuck. Easily triggered with pausing using the
-  multi_socket API.
+  Moved away the callback explanation from curl_multi_socket_action.3 and
+  expanded it somewhat.
   
-  Reported-by: Philip Prindeville
-  Bug: https://curl.haxx.se/mail/lib-2018-03/0048.html
-  Fixes #2393
-  Closes #2391
-
-- [Philip Prindeville brought this change]
+  Closes #4006
 
-  examples/hiperfifo.c: improved
+- wolfssl: fixup for SNI use
   
-   * use member struct event’s instead of pointers to alloc’d struct
-     events
+  follow-up from deb9462ff2de8
   
-   * simplify the cases for the mcode_or_die() function via macros;
-  
-   * make multi_timer_cb() actually do what the block comment says it
-     should;
+  Closes #4007
+
+- CURLOPT_CAINFO.3: polished wording
   
-   * accept a “stop” command on the FIFO to shut down the service;
+  Clarify the functionality when built to use Schannel and Secure
+  Transport and stop calling it the "recommended" or "preferred" way and
+  instead rather call it the default.
   
-   * use cleaner notation for unused variables than the (void) hack;
+  Removed the reference to the ssl comparison table as it isn't necessary.
   
-   * allow following redirections (304’s);
+  Reported-by: Richard Alcock
+  Bug: https://curl.haxx.se/mail/lib-2019-06/0019.html
+  Closes #4005
 
-- rate-limit: use three second window to better handle high speeds
+GitHub (10 Jun 2019)
+- [Daniel Stenberg brought this change]
+
+  SECURITY.md: created
   
-  Due to very frequent updates of the rate limit "window", it could
-  attempt to rate limit within the same milliseconds and that then made
-  the calculations wrong, leading to it not behaving correctly on very
-  fast transfers.
+  Brief security policy description for use/display on github.
+
+Daniel Gustafsson (10 Jun 2019)
+- tool_cb_prg: Fix integer overflow in progress bar
   
-  This new logic updates the rate limit "window" to be no shorter than the
-  last three seconds and only updating the timestamps for this when
-  switching between the states TOOFAST/PERFORM.
+  Commit 61faa0b420c236480bc9ef6fd52b4ecc1e0f8d17 fixed the progress bar
+  width calculation to avoid integer overflow, but failed to account for
+  the fact that initial_size is initialized to -1 when the file size is
+  retrieved from the remote on an upload, causing another signed integer
+  overflow.  Fix by separately checking for this case before the width
+  calculation.
   
-  Reported-by: 刘佩东
-  Fixes #2386
-  Closes #2388
-
-- [luz.paz brought this change]
+  Closes #3984
+  Reported-by: Brian Carpenter (Geeknik Labs)
+  Reviewed-by: Daniel Stenberg <daniel@haxx.se>
 
-  cleanup: misc typos in strings and comments
+Daniel Stenberg (10 Jun 2019)
+- wolfssl: refer to it as wolfSSL only
   
-  Found via `codespell`
+  Remove support for, references to and use of "cyaSSL" from the source
+  and docs. wolfSSL is the current name and there's no point in keeping
+  references to ancient history.
   
-  Closes #2389
-
-- RELEASE-NOTES: toward 7.60.0
-
-- [Kobi Gurkan brought this change]
-
-  http2: fixes typo
+  Assisted-by: Daniel Gustafsson
   
-  Closes #2387
+  Closes #3903
+
+- RELEASE-NOTES: synced
 
-- user-agent.d:: mention --proxy-header as well
+- bindlocal: detect and avoid IP version mismatches in bind()
   
-  Bug: https://github.com/curl/curl/issues/2381
+  Reported-by: Alex Grebenschikov
+  Fixes #3993
+  Closes #4002
 
-- transfer: make HTTP without headers count correct body size
+- multi: make sure 'data' can present in several sockhash entries
   
-  This is what "HTTP/0.9" basically looks like.
+  Since more than one socket can be used by each transfer at a given time,
+  each sockhash entry how has its own hash table with transfers using that
+  socket.
   
-  Reported on IRC
+  In addition, the sockhash entry can now be marked 'blocked = TRUE'"
+  which then makes the delete function just set 'removed = TRUE' instead
+  of removing it "for real", as a way to not rip out the carpet under the
+  feet of a parent function that iterates over the transfers of that same
+  sockhash entry.
   
-  Closes #2382
+  Reported-by: Tom van der Woerdt
+  Fixes #3961
+  Fixes #3986
+  Fixes #3995
+  Fixes #4004
+  Closes #3997
 
-- test1208: marked flaky
-  
-  It fails somewhere between every 3rd to 10th travis-CI run
+- [Sorcus brought this change]
 
-- SECURITY-PROCESS: mention how we write/add advisories
+  libcurl-tutorial.3: Fix small typo (mutipart -> multipart)
+  
+  Fixed-by: MrSorcus on github
+  Closes #4000
 
-- [dasimx brought this change]
+- unpause: trigger a timeout for event-based transfers
+  
+  ... so that timeouts or other state machine actions get going again
+  after a changing pause state. For example, if the last delivery was
+  paused there's no pending socket activity.
+  
+  Reported-by: sstruchtrup on github
+  Fixes #3994
+  Closes #4001
 
-  FTP: fix typo in recursive callback detection for seeking
+Marcel Raad (9 Jun 2019)
+- travis: use xenial LLVM package for scan-build
   
-  Fixes #2380
+  I missed that in commit 99a49d6.
 
-Version 7.59.0 (13 Mar 2018)
+- travis: update scan-build job to xenial
+  
+  Closes https://github.com/curl/curl/pull/3999
 
-Daniel Stenberg (13 Mar 2018)
-- release: 7.59.0
+Daniel Stenberg (8 Jun 2019)
+- bump: start working on 7.65.2
 
-Kamil Dudka (13 Mar 2018)
-- tests/.../spnego.py: fix identifier typo
+Marcel Raad (5 Jun 2019)
+- examples/htmltitle: use C++ casts between pointer types
   
-  Detected by Coverity Analysis:
+  Compilers and static analyzers warn about using C-style casts here.
   
-  Error: IDENTIFIER_TYPO:
-  curl-7.58.0/tests/python_dependencies/impacket/spnego.py:229: identifier_typo: Using "SuportedMech" appears to be a typo:
-  * Identifier "SuportedMech" is only known to be referenced here, or in copies of this code.
-  * Identifier "SupportedMech" is referenced elsewhere at least 4 times.
-  curl-7.58.0/tests/python_dependencies/impacket/smbserver.py:2651: identifier_use: Example 1: Using identifier "SupportedMech".
-  curl-7.58.0/tests/python_dependencies/impacket/smbserver.py:2308: identifier_use: Example 2: Using identifier "SupportedMech".
-  curl-7.58.0/tests/python_dependencies/impacket/spnego.py:252: identifier_use: Example 3: Using identifier "SupportedMech" (2 total uses in this function).
-  curl-7.58.0/tests/python_dependencies/impacket/spnego.py:229: remediation: Should identifier "SuportedMech" be replaced by "SupportedMech"?
-  
-  Closes #2379
+  Closes https://github.com/curl/curl/pull/3975
 
-Daniel Stenberg (13 Mar 2018)
-- CURLOPT_COOKIEFILE.3: "-" as file name means stdin
+- examples/fopen: fix comparison
   
-  Reported-by: Aron Bergman
-  Bug: https://curl.haxx.se/mail/lib-2018-03/0049.html
+  As want is size_t, (file->buffer_pos - want) is unsigned, so checking
+  if it's less than zero makes no sense.
+  Check if file->buffer_pos is less than want instead to avoid the
+  unsigned integer wraparound.
   
-  [ci skip]
+  Closes https://github.com/curl/curl/pull/3975
 
-- Revert "hostip: fix compiler warning: 'variable set but not used'"
+- build: fix Codacy warnings
   
-  This reverts commit a577059f92fc65bd6b81717f0737f897a5b34248.
+  Reduce variable scopes and remove redundant variable stores.
   
-  The assignment really needs to be there or we risk working with an
-  uninitialized pointer.
+  Closes https://github.com/curl/curl/pull/3975
 
-Michael Kaufmann (12 Mar 2018)
-- limit-rate: fix compiler warning
+- sws: remove unused variables
   
-  follow-up to 72a0f62
-
-Viktor Szakats (12 Mar 2018)
-- checksrc.pl: add -i and -m options
+  Unused since commit 2f44e94.
   
-  To sync it with changes made for the libssh2 project.
-  Also cleanup some whitespace.
+  Closes https://github.com/curl/curl/pull/3975
 
-- curl-openssl.m4: fix spelling [ci skip]
+Version 7.65.1 (4 Jun 2019)
 
-- FAQ: fix a broken URL [ci skip]
-
-Daniel Stenberg (12 Mar 2018)
-- http2: mark the connection for close on GOAWAY
-  
-  ... don't consider it an error!
-  
-  Assisted-by: Jay Satiro
-  Reported-by: Łukasz Domeradzki
-  Fixes #2365
-  Closes #2375
+Daniel Stenberg (4 Jun 2019)
+- RELEASE-NOTES: 7.65.1
 
-- credits: Viktor prefers without accent
+- THANKS: new contributors from 7.65.1
 
-- openldap: white space changes, fixed up the copyright years
+Steve Holme (4 Jun 2019)
+- [Frank Gevaerts brought this change]
 
-- openldap: check ldap_get_attribute_ber() results for NULL before using
+  ssl: Update outdated "openssl-only" comments for supported backends
+  
+  These are for features that used to be openssl-only but were expanded
+  over time to support other SSL backends.
   
-  CVE-2018-1000121
-  Reported-by: Dario Weisser
-  Bug: https://curl.haxx.se/docs/adv_2018-97a2.html
+  Closes #3985
 
-- FTP: reject path components with control codes
+Daniel Stenberg (4 Jun 2019)
+- curl_share_setopt.3: improve wording [ci ship]
   
-  Refuse to operate when given path components featuring byte values lower
-  than 32.
+  Reported-by: Carlos ORyan
+
+Steve Holme (4 Jun 2019)
+- tool_parsecfg: Use correct return type for GetModuleFileName()
   
-  Previously, inserting a %00 sequence early in the directory part when
-  using the 'singlecwd' ftp method could make curl write a zero byte
-  outside of the allocated buffer.
+  GetModuleFileName() returns a DWORD which is a typedef of an unsigned
+  long and not an int.
   
-  Test case 340 verifies.
+  Closes #3980
+
+Daniel Stenberg (3 Jun 2019)
+- TODO: "at least N milliseconds between requests" [ci skip]
   
-  CVE-2018-1000120
-  Reported-by: Duy Phan Thanh
-  Bug: https://curl.haxx.se/docs/adv_2018-9cd6.html
+  Suggested-by: dkwolfe4 on github
+  Closes #3920
 
-- readwrite: make sure excess reads don't go beyond buffer end
+Steve Holme (2 Jun 2019)
+- tests/server/.gitignore: Add socksd to the ignore list
   
-  CVE-2018-1000122
-  Bug: https://curl.haxx.se/docs/adv_2018-b047.html
+  Missed in 04fd6755.
   
-  Detected by OSS-fuzz
+  Closes #3978
 
-- BUGS: updated link to security process
-
-- limit-rate: kick in even before "limit" data has been received
+- tool_parsecfg: Fix control flow issue (DEADCODE)
   
-  ... and make sure to avoid integer overflows with really large values.
+  Follow-up to 8144ba38.
   
-  Reported-by: 刘佩东
-  Fixes #2371
-  Closes #2373
+  Detected by Coverity CID 1445663
+  Closes #3976
 
-- docs/SECURITY.md -> docs/SECURITY-PROCESS.md
+Daniel Stenberg (2 Jun 2019)
+- [Sergey Ogryzkov brought this change]
 
-- SECURITY.md: call it the security process
+  NTLM: reset proxy "multipass" state when CONNECT request is done
+  
+  Closes #3972
 
-Michael Kaufmann (11 Mar 2018)
-- Curl_range: fix FTP-only and FILE-only builds
+- test334: verify HTTP 204 response with chunked coding header
   
-  follow-up to e04417d
+  Verifies that a bodyless response don't parse this content-related
+  header.
 
-- hostip: fix compiler warning: 'variable set but not used'
+- [Michael Kaufmann brought this change]
 
-Daniel Stenberg (11 Mar 2018)
-- HTTP: allow "header;" to replace an internal header with a blank one
+  http: don't parse body-related headers bodyless responses
   
-  Reported-by: Michael Kaufmann
-  Fixes #2357
-  Closes #2362
-
-- http2: verbose output new MAX_CONCURRENT_STREAMS values
+  Responses with status codes 1xx, 204 or 304 don't have a response body. For
+  these, don't parse these headers:
   
-  ... as it is interesting for many users.
-
-- SECURITY: distros' max embargo time is 14 days now
-
-Patrick Monnerat (8 Mar 2018)
-- curl tool: accept --compressed also if Brotli is enabled and zlib is not.
+  - Content-Encoding
+  - Content-Length
+  - Content-Range
+  - Last-Modified
+  - Transfer-Encoding
+  
+  This change ensures that HTTP/2 upgrades work even if a
+  "Content-Length: 0" or a "Transfer-Encoding: chunked" header is present.
+  
+  Co-authored-by: Daniel Stenberg
+  Closes #3702
+  Fixes #3968
+  Closes #3977
 
-Daniel Stenberg (5 Mar 2018)
-- THANKS + mailmap: remove duplicates, fixup full names
+- tls13-docs: mention it is only for OpenSSL >= 1.1.1
+  
+  Reported-by: Jay Satiro
+  Co-authored-by: Jay Satiro
+  Fixes #3938
+  Closes #3946
 
-- [sergii.kavunenko brought this change]
+- dump-header.d: spell out that no headers == empty file [ci skip]
+  
+  Reported-by: wesinator at github
+  Fixes #3964
+  Closes #3974
 
-  WolfSSL: adding TLSv1.3
+- singlesocket: use separate variable for inner loop
+  
+  An inner loop within the singlesocket() function wrongly re-used the
+  variable for the outer loop which then could cause an infinite
+  loop. Change to using a separate variable!
   
-  Closes #2349
+  Reported-by: Eric Wu
+  Fixes #3970
+  Closes #3973
 
-- RELEASE-NOTES/THANKS: synced with cc1d4c505
+- RELEASE-NOTES: synced
 
-- [Richard Alcock brought this change]
+- [Josie Huddleston brought this change]
 
-  winbuild: prefer documented zlib library names
+  http2: Stop drain from being permanently set on
   
-  Check for existence of import and static libraries with documented names
-  and use them if they do. Fallback to previous names.
+  Various functions called within Curl_http2_done() can have the
+  side-effect of setting the Easy connection into drain mode (by calling
+  drain_this()).  However, the last time we unset this for a transfer (by
+  calling drained_transfer()) is at the beginning of Curl_http2_done().
+  If the Curl_easy is reused for another transfer, it is then stuck in
+  drain mode permanently, which in practice makes it unable to write any
+  data in the new transfer.
   
-  According to
-  https://github.com/madler/zlib/blob/master/win32/README-WIN32.txt on
-  Windows, the names of the import library is "zdll.lib" and static
-  library is "zlib.lib".
+  This fix moves the last call to drained_transfer() to later in
+  Curl_http2_done(), after the functions that could potentially call for a
+  drain.
   
-  closes #2354
+  Fixes #3966
+  Closes #3967
+  Reported-by: Josie-H
 
-Marcel Raad (4 Mar 2018)
-- krb5: use nondeprecated functions
-  
-  gss_seal/gss_unseal have been deprecated in favor of
-  gss_wrap/gss_unwrap with GSS-API v2 from January 1997 [1]. The first
-  version of "The Kerberos Version 5 GSS-API Mechanism" [2] from June
-  1996 already says "GSS_Wrap() (formerly GSS_Seal())" and
-  "GSS_Unwrap() (formerly GSS_Unseal())".
+Steve Holme (29 May 2019)
+- conncache: Remove the DEBUGASSERT on length check
   
-  Use the nondeprecated functions to avoid deprecation warnings.
+  We trust the calling code as this is an internal function.
   
-  [1] https://tools.ietf.org/html/rfc2078
-  [2] https://tools.ietf.org/html/rfc1964
-  
-  Closes https://github.com/curl/curl/pull/2356
-
-Daniel Stenberg (4 Mar 2018)
-- curl.1: mention how to add numerical IP addresses in NO_PROXY
+  Closes #3962
 
-- CURLOPT_NOPROXY.3: mention how to list numerical IPv6 addresses
+Jay Satiro (29 May 2019)
+- [Gisle Vanem brought this change]
 
-- NO_PROXY: fix for IPv6 numericals in the URL
+  system_win32: fix function prototype
   
-  Added test 1265 that verifies.
+  - Change if_nametoindex parameter type from char * to const char *.
   
-  Reported-by: steelman on github
-  Fixes #2353
-  Closes #2355
-
-- build: get CFLAGS (including -werror) used for examples and tests
+  Follow-up to 09eef8af from this morning.
   
-  ... so that the CI and more detects compiler warnings/errors properly!
+  Bug: https://github.com/curl/curl/commit/09eef8af#r33716067
+
+Marcel Raad (29 May 2019)
+- appveyor: add Visual Studio solution build
   
-  Closes #2337
+  Closes https://github.com/curl/curl/pull/3941
 
-Marcel Raad (3 Mar 2018)
-- curl_ctype: fix macro redefinition warnings
+- appveyor: add support for other build systems
   
-  On MinGW and Cygwin, GCC and clang have been complaining about macro
-  redefinitions since 4272a0b0fc49a1ac0ceab5c4a365c9f6ab8bf8e2. Fix this
-  by undefining the macros before redefining them as suggested in
-  https://github.com/curl/curl/pull/2269.
+  Introduce BUILD_SYSTEM variable, which is currently always CMake.
   
-  Suggested-by: Daniel Stenberg
-
-Dan Fandrich (2 Mar 2018)
-- unit1307: proper cleanup on OOM to fix torture tests
+  Closes https://github.com/curl/curl/pull/3941
 
-Marcel Raad (28 Feb 2018)
-- unit1309: fix warning on Windows x64
+Steve Holme (29 May 2019)
+- url: Load if_nametoindex() dynamically from iphlpapi.dll on Windows
   
-  When targeting x64, MinGW-w64 complains about conversions between
-  32-bit long and 64-bit pointers. Fix this by reusing the
-  GNUTLS_POINTER_TO_SOCKET_CAST / GNUTLS_SOCKET_TO_POINTER_CAST logic
-  from gtls.c, moving it to warnless.h as CURLX_POINTER_TO_INTEGER_CAST /
-  CURLX_INTEGER_TO_POINTER_CAST.
+  This fixes the static dependency on iphlpapi.lib and allows curl to
+  build for targets prior to Windows Vista.
   
-  Closes https://github.com/curl/curl/pull/2341
+  This partially reverts 170bd047.
+  
+  Fixes #3960
+  Closes #3958
+
+Daniel Stenberg (29 May 2019)
+- http: fix "error: equality comparison with extraneous parentheses"
 
-- travis: update compiler versions
+- parse_proxy: make sure portptr is initialized
   
-  Update clang to version 3.9 and GCC to version 6.
+  Reported-by: Benbuck Nason
   
-  Closes https://github.com/curl/curl/pull/2345
+  fixes #3959
 
-Daniel Stenberg (26 Feb 2018)
-- docs/MANUAL: formfind.pl is not accessible on the site anymore
+- url: default conn->port to the same as conn->remote_port
   
-  Fixes #2342
-
-Jay Satiro (24 Feb 2018)
-- curl-openssl.m4: Fix version check for OpenSSL 1.1.1
+  ... so that it has a sensible value when ConnectionExists() is called which
+  needs it set to differentiate host "bundles" correctly on port number!
   
-  - Add OpenSSL 1.1.1 to the header/library version lists.
+  Also, make conncache:hashkey() use correct port for bundles that are proxy vs
+  host connections.
   
-  - Detect OpenSSL 1.1.1 library using its function ERR_clear_last_mark,
-    which was added in that version.
+  Probably a regression from 7.62.0
   
-  Prior to this change an erroneous header/library mismatch was caused by
-  lack of OpenSSL 1.1.1 detection. I tested using openssl-1.1.1-pre1.
+  Reported-by: Tom van der Woerdt
+  Fixes #3956
+  Closes #3957
 
-Viktor Szakats (23 Feb 2018)
-- lib655: silence compiler warning
+- conncache: make "bundles" per host name when doing proxy tunnels
+  
+  Only HTTP proxy use where multiple host names can be used over the same
+  connection should use the proxy host name for bundles.
   
-  Closes https://github.com/curl/curl/pull/2335
+  Reported-by: Tom van der Woerdt
+  Fixes #3951
+  Closes #3955
 
-- spelling fixes
+- multi: track users of a socket better
   
-  Detected using the `codespell` tool.
+  They need to be removed from the socket hash linked list with more care.
   
-  Also contains one URL protocol upgrade.
+  When sh_delentry() is called to remove a sockethash entry, remove all
+  individual transfers from the list first. To enable this, each Curl_easy struct
+  now stores a pointer to the sockethash entry to know how to remove itself.
   
-  Closes https://github.com/curl/curl/pull/2334
+  Reported-by: Tom van der Woerdt and Kunal Ekawde
+  
+  Fixes #3952
+  Fixes #3904
+  Closes #3953
 
-Daniel Stenberg (24 Feb 2018)
-- projects/README: remove reference to dead IDN link/package
+Steve Holme (28 May 2019)
+- curl-win32.h: Enable Unix Domain Sockets based on the Windows SDK version
   
-  Reported-by: Stefan Kanthak and Rod Widdowson
+  Microsoft added support for Unix Domain Sockets in Windows 10 1803
+  (RS4). Rather than expect the user to enable Unix Domain Sockets by
+  uncommenting the #define that was added in 0fd6221f we use the RS4
+  pre-processor variable that is present in newer versions of the
+  Windows SDK.
   
-  Fixes #2325
+  Closes #3939
 
-Jay Satiro (23 Feb 2018)
-- [Rod Widdowson brought this change]
+Daniel Stenberg (28 May 2019)
+- [Jonas Vautherin brought this change]
 
-  winbuild: Use macros for the names of some build utilities
+  cmake: support CMAKE_OSX_ARCHITECTURES when detecting SIZEOF variables
   
-  - Add macros to the top of the makefile for rc and mt utilities so that
-    it is easier to change their locations.
+  Closes #3945
+
+Marcel Raad (27 May 2019)
+- HAProxy tests: add keywords
   
-  Bug: https://curl.haxx.se/mail/lib-2018-02/0075.html
-  Reported-by: Stefan Kanthak
+  Add the proxy and haproxy keywords in order to be able to exclude or
+  run these specific tests.
   
-  Closes https://github.com/curl/curl/issues/2329
+  Closes https://github.com/curl/curl/pull/3949
 
-Daniel Stenberg (23 Feb 2018)
-- TODO: remove "sha-256 digest", added in 2b5b37cb9109e7c2
+Daniel Stenberg (27 May 2019)
+- [Maksim Stsepanenka brought this change]
 
-- curl_share_setopt.3: connection cache is shared within multi handles
+  tests: make test 1420 and 1406 work with rtsp-disabled libcurl
+  
+  Closes #3948
 
-Jay Satiro (22 Feb 2018)
-- [Rod Widdowson brought this change]
+Kamil Dudka (27 May 2019)
+- [Hubert Kario brought this change]
 
-  winbuild: Use CALL to run batch scripts
-  
-  Co-authored-by: Stefan Kanthak
+  nss: allow to specify TLS 1.3 ciphers if supported by NSS
   
-  Closes https://github.com/curl/curl/issues/2330
-  Closes https://github.com/curl/curl/pull/2331
+  Closes #3916
 
-Patrick Monnerat (22 Feb 2018)
-- os400: add curl_resolver_start_callback type to ILE/RPG binding
-
-Daniel Stenberg (22 Feb 2018)
-- form.d: rephrased somewhat, added two example command lines
+Daniel Stenberg (26 May 2019)
+- RELEASE-NOTES: synced
 
-Jay Satiro (21 Feb 2018)
-- [Francisco Sedano brought this change]
+- [Jay Satiro brought this change]
 
-  url: Add option CURLOPT_RESOLVER_START_FUNCTION
+  Revert all SASL authzid (new feature) commits
   
-  - Add new option CURLOPT_RESOLVER_START_FUNCTION to set a callback that
-    will be called every time before a new resolve request is started
-    (ie before a host is resolved) with a pointer to backend-specific
-    resolver data. Currently this is only useful for ares.
+  - Revert all commits related to the SASL authzid feature since the next
+    release will be a patch release, 7.65.1.
   
-  - Add new option CURLOPT_RESOLVER_START_DATA to set a user pointer to
-    pass to the resolver start callback.
+  Prior to this change CURLOPT_SASL_AUTHZID  / --sasl-authzid was destined
+  for the next release, assuming it would be a feature release 7.66.0.
+  However instead the next release will be a patch release, 7.65.1 and
+  will not contain any new features.
   
-  Closes https://github.com/curl/curl/pull/2311
-
-- lib: CURLOPT_HAPPY_EYEBALLS_TIMEOUT => CURLOPT_HAPPY_EYEBALLS_TIMEOUT_MS
+  After the patch release after the reverted commits can be restored by
+  using cherry-pick:
+  
+  git cherry-pick a14d72c a9499ff 8c1cc36 c2a8d52 0edf690
+  
+  Details for all reverted commits:
   
-  - In keeping with the naming of our other connect timeout options rename
-    CURLOPT_HAPPY_EYEBALLS_TIMEOUT to CURLOPT_HAPPY_EYEBALLS_TIMEOUT_MS.
+  Revert "os400: take care of CURLOPT_SASL_AUTHZID in curl_easy_setopt_ccsid()."
   
-  This change adds the _MS suffix since the option expects milliseconds.
-  This is more intuitive for our users since other connect timeout options
-  that expect milliseconds use _MS such as CURLOPT_TIMEOUT_MS,
-  CURLOPT_CONNECTTIMEOUT_MS, CURLOPT_ACCEPTTIMEOUT_MS.
+  This reverts commit 0edf6907ae37e2020722e6f61229d8ec64095b0a.
   
-  The tool option already uses an -ms suffix, --happy-eyeballs-timeout-ms.
+  Revert "tests: Fix the line endings for the SASL alt-auth tests"
+  
+  This reverts commit c2a8d52a1356a722ff9f4aeb983cd4eaf80ef221.
+  
+  Revert "examples: Added SASL PLAIN authorisation identity (authzid) examples"
+  
+  This reverts commit 8c1cc369d0c7163c6dcc91fd38edfea1f509ae75.
+  
+  Revert "curl: --sasl-authzid added to support CURLOPT_SASL_AUTHZID from the tool"
+  
+  This reverts commit a9499ff136d89987af885e2d7dff0a066a3e5817.
+  
+  Revert "sasl: Implement SASL authorisation identity via CURLOPT_SASL_AUTHZID"
+  
+  This reverts commit a14d72ca2fec5d4eb5a043936e4f7ce08015c177.
+
+- [dbrowndan brought this change]
+
+  FAQ: more minor updates and spelling fixes
   
-  Follow-up to 2427d94 which added the lib and tool option yesterday.
+  Closes #3937
+
+- RELEASE-NOTES: synced
+
+- sectransp: handle errSSLPeerAuthCompleted from SSLRead()
   
-  Ref: https://github.com/curl/curl/pull/2260
+  Reported-by: smuellerDD on github
+  Fixes #3932
+  Closes #3933
 
-Patrick Monnerat (21 Feb 2018)
-- sasl: prefer PLAIN mechanism over LOGIN
+GitHub (24 May 2019)
+- [Gisle Vanem brought this change]
+
+  Fix typo.
+
+Daniel Stenberg (23 May 2019)
+- tool_setopt: for builds with disabled-proxy, skip all proxy setopts()
   
-  SASL PLAIN is a standard, LOGIN only a draft. The LOGIN draft says
-  PLAIN should be used instead if available.
+  Reported-by: Marcel Raad
+  Fixes #3926
+  Closes #3929
 
-Daniel Stenberg (21 Feb 2018)
-- RELEASE-NOTES: synced with 2427d94c6
+Steve Holme (23 May 2019)
+- winbuild: Use two space indentation
+  
+  Closes #3930
 
-Jay Satiro (20 Feb 2018)
-- [Anders Bakken brought this change]
+GitHub (23 May 2019)
+- [Gisle Vanem brought this change]
 
-  url: Add option CURLOPT_HAPPY_EYEBALLS_TIMEOUT
+  tool_parse_cfg: Avoid 2 fopen() for WIN32
   
-  - Add new option CURLOPT_HAPPY_EYEBALLS_TIMEOUT to set libcurl's happy
-    eyeball timeout value.
+  Using the memdebug.h mem-leak feature, I noticed 2 calls like:
+    FILE tool_parsecfg.c:70 fopen("c:\Users\Gisle\AppData\Roaming\_curlrc","rt")
+    FILE tool_parsecfg.c:114 fopen("c:\Users\Gisle\AppData\Roaming\_curlrc","rt")
   
-  - Add new optval macro CURL_HET_DEFAULT to represent the default happy
-    eyeballs timeout value (currently 200 ms).
+  No need for 'fopen(), 'fclose()' and a 'fopen()' yet again.
+
+Daniel Stenberg (23 May 2019)
+- md4: include the mbedtls config.h to get the MD4 info
+
+- md4: build correctly with openssl without MD4
   
-  - Add new tool option --happy-eyeballs-timeout-ms to expose
-    CURLOPT_HAPPY_EYEBALLS_TIMEOUT. The -ms suffix is used because the
-    other -timeout options in the tool expect seconds not milliseconds.
+  Reported-by: elsamuko at github
+  Fixes #3921
+  Closes #3922
+
+Patrick Monnerat (23 May 2019)
+- os400: take care of CURLOPT_SASL_AUTHZID in curl_easy_setopt_ccsid().
+
+Daniel Stenberg (23 May 2019)
+- .github/FUNDING: mention our opencollective "home" [ci skip]
+
+Marcel Raad (23 May 2019)
+- [Zenju brought this change]
+
+  config-win32: add support for if_nametoindex and getsockname
   
-  Closes https://github.com/curl/curl/pull/2260
+  Closes https://github.com/curl/curl/pull/3923
 
-- hostip: fix 'potentially uninitialized variable' warning
+Jay Satiro (23 May 2019)
+- tests: Fix the line endings for the SASL alt-auth tests
   
-  Follow-up to 50d1b33.
+  - Change data and protocol sections to CRLF line endings.
   
-  Caught by AppVeyor.
-
-Daniel Stenberg (20 Feb 2018)
-- TODO: warning if curl version is not in sync with libcurl version
-
-Jay Satiro (20 Feb 2018)
-- [Anders Bakken brought this change]
-
-  CURLOPT_RESOLVE: Add support for multiple IP addresses per entry
+  Prior to this change the tests would fail or hang, which is because
+  certain sections such as protocol require CRLF line endings.
   
-  This enables users to preresolve but still take advantage of happy
-  eyeballs and trying multiple addresses if some are not connecting.
+  Follow-up to a9499ff from today which added the tests.
   
-  Ref: https://github.com/curl/curl/pull/2260
-
-Daniel Stenberg (20 Feb 2018)
-- [Sergio Borghese brought this change]
+  Ref: https://github.com/curl/curl/pull/3790
 
-  examples/sftpuploadresume: resume upload via CURLOPT_APPEND
+Daniel Stenberg (23 May 2019)
+- url: fix bad #ifdef
   
-  URL: https://curl.haxx.se/mail/lib-2018-02/0072.html
-
-- curl --version: show PSL if the run-time lib has it enabled
+  Regression since e91e48161235272ff485.
   
-  ... not of the #define was set at build-time!
+  Reported-by: Tom Greenslade
+  Fixes #3924
+  Closes #3925
 
-- TODO: "Support in-memory certs/ca certs/keys"
+- Revert "progress: CURL_DISABLE_PROGRESS_METER"
+  
+  This reverts commit 3b06e68b7734cb10a555f9d7e804dd5d808236a4.
   
-  removed SSLKEYLOGFILE support (fixed)
+  Clearly this change wasn't good enough as it broke CURLOPT_LOW_SPEED_LIMIT +
+  CURLOPT_LOW_SPEED_TIME
   
-  removed "consider SSL patches" (outdated)
+  Reported-by: Dave Reisner
   
-  Closes #2310
+  Fixes #3927
+  Closes #3928
 
-- CURLOPT_HEADER.3: clarify problems with different data sizes
+Steve Holme (22 May 2019)
+- examples: Added SASL PLAIN authorisation identity (authzid) examples
 
-- test1556: verify >16KB headers to the header callback
+- curl: --sasl-authzid added to support CURLOPT_SASL_AUTHZID from the tool
 
-- header callback: don't chop headers into smaller pieces
+- sasl: Implement SASL authorisation identity via CURLOPT_SASL_AUTHZID
   
-  Reported-by: Guido Berhoerster
-  Fixes #2314
-  Closes #2316
-
-- test1154: verify that long HTTP headers get rejected
-
-- http: fix the max header length detection logic
+  Added the ability for the calling program to specify the authorisation
+  identity (authzid), the identity to act as, in addition to the
+  authentication identity (authcid) and password when using SASL PLAIN
+  authentication.
   
-  Previously, it would only check for max length if the existing alloc
-  buffer was to small to fit it, which often would make the header still
-  get used.
+  Fixed #3653
+  Closes #3790
+
+Marc Hoersken (22 May 2019)
+- tests: add support to test against OpenSSH for Windows
   
-  Reported-by: Guido Berhoerster
-  Bug: https://curl.haxx.se/mail/lib-2018-02/0056.html
+  Testing against OpenSSH for Windows requires v7.7.0.0 or newer
+  due to the use of AllowUsers and DenyUsers. For more info see:
+  https://github.com/PowerShell/Win32-OpenSSH/wiki/sshd_config
+
+Daniel Stenberg (22 May 2019)
+- bump: start on the next release
+
+Marcel Raad (22 May 2019)
+- examples: fix "clarify calculation precedence" warnings
   
-  Closes #2315
+  Closes https://github.com/curl/curl/pull/3919
 
-- CURLOPT_HEADERFUNCTION.3: fix typo from d939226813
+- hiperfifo: remove unused variable
   
-  Reported-by: Erik Johansson
-  Bug: https://github.com/curl/curl/commit/d9392268131c1b8d18dec3fa30e0bded833a5db7#commitcomment-27607495
+  Closes https://github.com/curl/curl/pull/3919
 
-- CURLOPT_HEADERFUNCTION.3: mention folded headers
+- examples: remove dead variable stores
+  
+  Closes https://github.com/curl/curl/pull/3919
 
-- TODO: 1.1 Option to refuse usernames in URLs
+- examples: reduce variable scopes
   
-  Also expanded the CURL_REFUSE_CLEARTEXT section with more ideas.
+  Closes https://github.com/curl/curl/pull/3919
 
-- TODO: 1.7 Support HTTP/2 for HTTP(S) proxies
+- http2-download: fix format specifier
+  
+  Closes https://github.com/curl/curl/pull/3919
 
-- ssh: add two missing state names
+Daniel Stenberg (22 May 2019)
+- PolarSSL: deprecate support step 1. Removed from configure.
   
-  The list of state names (used in debug builds) was out of sync in
-  relation to the list of states (used in all builds).
+  Also removed mentions from most docs.
   
-  I now added an assert to make sure the sizes of the two lists match, to
-  aid in detecting this mistake better in the future.
+  Discussed: https://curl.haxx.se/mail/lib-2019-05/0045.html
+  
+  Closes #3888
+
+- configure/cmake: check for if_nametoindex()
   
-  Regression since c92d2e14cf, shipped in 7.58.0.
+  - adds the check to cmake
   
-  Reported-by: Somnath Kundu
+  - fixes the configure check to work for cross-compiled windows builds
   
-  Fixes #2312
-  Closes #2313
+  Closes #3917
 
-- Revert "KNOWN_BUGS: 2.5 curl should not offer "ALPN: h2" when using https-proxy"
+- parse_proxy: use the IPv6 zone id if given
   
-  This reverts commit de9fac00c40db321d44fa6fbab6eb62ec4c83998.
+  If the proxy string is given as an IPv6 numerical address with a zone
+  id, make sure to use that for the connect to the proxy.
   
-  Reported-by: Jay Satiro
-
-Jay Satiro (15 Feb 2018)
-- non-ascii: fix implicit declaration warning
+  Reported-by: Edmond Yu
   
-  Follow-up to b46cfbc.
+  Fixes #3482
+  Closes #3918
+
+Version 7.65.0 (22 May 2019)
+
+Daniel Stenberg (22 May 2019)
+- RELEASE-NOTES: 7.65.0 release
+
+- THANKS: from the 7.65.0 release-notes
+
+- url: convert the zone id from a IPv6 URL to correct scope id
   
-  Caught by Travis CI.
+  Reported-by: GitYuanQu on github
+  Fixes #3902
+  Closes #3914
 
-Daniel Stenberg (15 Feb 2018)
-- travis: add build with iconv enabled
+- configure: detect getsockname and getpeername on windows too
   
-  ... to verify it builds and works fine.
+  Made detection macros for these two functions in the same style as other
+  functions possibly in winsock in the hope this will work better to
+  detect these functions when cross-compiling for Windows.
   
-  Ref: https://curl.haxx.se/mail/lib-2017-09/0031.html
+  Follow-up to e91e4816123
   
-  Closes #1872
+  Fixes #3913
+  Closes #3915
 
-- TODO: 18.18 retry on network is unreachable
+Marcel Raad (21 May 2019)
+- examples: remove unused variables
   
-  Closes #1603
-
-- KNOWN_BUGS: 2.5 curl should not offer "ALPN: h2" when using https-proxy
+  Fixes Codacy/CppCheck warnings.
   
-  Closes #1254
+  Closes
 
-Kamil Dudka (15 Feb 2018)
-- nss: use PK11_CreateManagedGenericObject() if available
-  
-  ... so that the memory allocated by applications using libcurl does not
-  grow per each TLS connection.
+Daniel Gustafsson (21 May 2019)
+- udpateconninfo: mark variable unused
   
-  Bug: https://bugzilla.redhat.com/1510247
+  When compiling without getpeername() or getsockname(), the sockfd
+  paramter to Curl_udpateconninfo() became unused after commit e91e481612
+  added ifdef guards.
   
-  Closes #2297
+  Closes #3910
+  Fixes https://curl.haxx.se/dev/log.cgi?id=20190520172441-32196
+  Reviewed-by: Marcel Raad, Daniel Stenberg
 
-Daniel Stenberg (15 Feb 2018)
-- [Björn Stenberg brought this change]
-
-  TODO fixed: Detect when called from within callbacks
+- ftp: move ftp_ccc in under featureflag
+  
+  Commit e91e48161235272ff485ff32bd048c53af731f43 moved ftp_ccc in under
+  the FTP featureflag in the UserDefined struct, but vtls callsites were
+  still using it unprotected.
   
-  Closes #2302
+  Closes #3912
+  Fixes: https://curl.haxx.se/dev/log.cgi?id=20190520044705-29865
+  Reviewed-by: Daniel Stenberg, Marcel Raad
 
-- BINDINGS: fix curb link (and remove ruby-curl-multi)
+Daniel Stenberg (20 May 2019)
+- curl: report error for "--no-" on non-boolean options
   
-  Reported-by: Klaus Stein
+  Reported-by: Olen Andoni
+  Fixes #3906
+  Closes #3907
 
-- curl_gssapi: make sure this file too uses our *printf()
+- [Guy Poizat brought this change]
 
-- libcurl-security.3: separate file:// section
+  mbedtls: enable use of EC keys
   
-  ... just to make it more apparent. Even if it repeats
-  some pieces of information.
+  Closes #3892
 
-- libcurl-security.3: the http://192.168.0.1/my_router_config case
+- lib1560: add tests for parsing URL with too long scheme
   
-  Mentioned-By: Rich Moore
+  Ref: #3905
 
-- libcurl-security.3: mention the URL standards problems too
+- [Omar Ramadan brought this change]
 
-- libcurl-security.3: split out from libcurl-tutorial.3
+  urlapi: increase supported scheme length to 40 bytes
   
-  To make more accessible.
+  The longest currently registered URI scheme at IANA is 36 bytes long.
   
-  Merged in some new language from "URLs are dangerous things" as discussed on
-  the mailing list a few days ago:
-  
-  Bug: https://curl.haxx.se/mail/lib-2018-02/0013.html
-
-- RELEASE-NOTES: synced with e551910f8
+  Closes #3905
+  Closes #3900
 
-Patrick Monnerat (13 Feb 2018)
-- tests: new tests for http raw mode
+Marcel Raad (20 May 2019)
+- lib: reduce variable scopes
   
-  Test 319 checks proper raw mode data with non-chunked gzip
-  transfer-encoded server data.
-  Test 326 checks raw mode with chunked server data.
+  Fixes Codacy/CppCheck warnings.
   
-  Bug: #2303
-  Closes #2308
+  Closes https://github.com/curl/curl/pull/3872
 
-Kamil Dudka (12 Feb 2018)
-- tlsauthtype.d: works only if libcurl is built with TLS-SRP support
+- tool_formparse: remove redundant assignment
   
-  Bug: https://bugzilla.redhat.com/1542256
+  Just initialize word_begin with the correct value.
   
-  Closes #2306
+  Closes https://github.com/curl/curl/pull/3873
 
-Patrick Monnerat (12 Feb 2018)
-- smtp: fix processing of initial dot in data
+- ssh: move variable declaration to where it's used
   
-  RFC 5321 4.1.1.4 specifies the CRLF terminating the DATA command
-  should be taken into account when chasing the <CRLF>.<CRLF> end marker.
-  Thus a leading dot character in data is also subject to escaping.
+  This way, we need only one call to free.
   
-  Tests 911 and test server are adapted to this situation.
-  New tests 951 and 952 check proper handling of initial dot in data.
-  
-  Closes #2304
-
-Daniel Stenberg (12 Feb 2018)
-- sha256: avoid redefine
+  Closes https://github.com/curl/curl/pull/3873
 
-- [Douglas Mencken brought this change]
-
-  sha256: build with OpenSSL < 0.9.8 too
+- ssh-libssh: remove unused variable
   
-  support for SHA-2 was introduced in OpenSSL 0.9.8
+  sock was only used to be assigned to fd_read.
   
-  Closes #2305
+  Closes https://github.com/curl/curl/pull/3873
 
-- [Bruno Grasselli brought this change]
+Daniel Stenberg (20 May 2019)
+- test332: verify the blksize fix
 
-  README: language fix
-  
-  s/off/from
+- tftp: use the current blksize for recvfrom()
   
-  Closes #2300
+  bug: https://curl.haxx.se/docs/CVE-2019-5436.html
+  Reported-by: l00p3r on hackerone
+  CVE-2019-5436
 
-Patrick Monnerat (12 Feb 2018)
-- http_chunks: don't write chunks twice with CURLOPT_HTTP_TRANSFER_DECODING on
+Daniel Gustafsson (19 May 2019)
+- version: make ssl_version buffer match for multi_ssl
   
-  Bug: #2303
-  Reported-By: Henry Roeland
-
-Daniel Stenberg (9 Feb 2018)
-- get_posix_time: only check for overflows if they can happen!
-
-Michael Kaufmann (9 Feb 2018)
-- schannel: fix "no previous prototype" compiler warning
-
-Jay Satiro (9 Feb 2018)
-- [Mohammad AlSaleh brought this change]
-
-  content_encoding: Add "none" alias to "identity"
+  When running a multi TLS backend build the version string needs more
+  buffer space. Make the internal ssl_buffer stack buffer match the one
+  in Curl_multissl_version() to allow for the longer string. For single
+  TLS backend builds there is no use in extended to buffer. This is a
+  fallout from #3863 which fixes up the multi_ssl string generation to
+  avoid a buffer overflow when the buffer is too small.
   
-  Some servers return a "content-encoding" header with a non-standard
-  "none" value.
+  Closes #3875
+  Reviewed-by: Daniel Stenberg <daniel@haxx.se>
+
+Steve Holme (18 May 2019)
+- http_ntlm_wb: Handle auth for only a single request
   
-  Add "none" as an alias to "identity" as a work-around, to avoid
-  unrecognised content encoding type errors.
+  Currently when the server responds with 401 on NTLM authenticated
+  connection (re-used) we consider it to have failed.  However this is
+  legitimate and may happen when for example IIS is set configured to
+  'authPersistSingleRequest' or when the request goes thru a proxy (with
+  'via' header).
   
-  Signed-off-by: Mohammad AlSaleh <CE.Mohammad.AlSaleh@gmail.com>
+  Implemented by imploying an additional state once a connection is
+  re-used to indicate that if we receive 401 we need to restart
+  authentication.
   
-  Closes https://github.com/curl/curl/pull/2298
-
-Steve Holme (8 Feb 2018)
-- build-openssl.bat: Follow up to 648679ab8e to suppress copy/move output
+  Missed in fe6049f0.
 
-- build-openssl.bat: Fixed incorrect move if destination build folder exists
-
-Michael Kaufmann (8 Feb 2018)
-- schannel: fix compiler warnings
+- http_ntlm_wb: Cleanup handshake after clean NTLM failure
   
-  Closes #2296
+  Missed in 50b87c4e.
 
-Steve Holme (7 Feb 2018)
-- curl_addrinfo.c: Allow Unix Domain Sockets to compile under Windows
+- http_ntlm_wb: Return the correct error on receiving an empty auth message
   
-  Windows 10.0.17061 SDK introduces support for Unix Domain Sockets.
-  Added the necessary include file to curl_addrinfo.c.
+  Missed in fe20826b as it wasn't implemented in http.c in b4d6db83.
   
-  Note: The SDK (which is considered beta) has to be installed, VS 2017
-  project file has to be re-targeted for Windows 10.0.17061 and #define
-  enabled in config-win32.h.
+  Closes #3894
 
-Patrick Monnerat (7 Feb 2018)
-- fnmatch: optimize processing of consecutive *s and ?s pattern characters
+Daniel Stenberg (18 May 2019)
+- curl: make code work with protocol-disabled libcurl
   
-  Reported-By: Daniel Stenberg
-  Fixes #2291
-  Closes #2293
+  Closes #3844
 
-Steve Holme (6 Feb 2018)
-- build-openssl.bat/build-wolfssl.bat: Build platform is optional
-  
-  Whilst the compiler parameter is mandatory, platform is optional as it
-  is automatically calculated by the :configure section.
-  
-  This partially reverts commit 6d62d2c55d.
+- libcurl: #ifdef away more code for disabled features/protocols
 
-Daniel Stenberg (6 Feb 2018)
-- [Patrick Schlangen brought this change]
+- progress: CURL_DISABLE_PROGRESS_METER
 
-  openssl: Don't add verify locations when verifypeer==0
-  
-  When peer verification is disabled, calling
-  SSL_CTX_load_verify_locations is not necessary. Only call it when
-  verification is enabled to save resources and increase performance.
+- hostip: CURL_DISABLE_SHUFFLE_DNS
+
+- netrc: CURL_DISABLE_NETRC
+
+Viktor Szakats (16 May 2019)
+- docs: Markdown and misc improvements [ci skip]
   
-  Closes #2290
+  Approved-by: Daniel Stenberg
+  Closes #3896
 
-Steve Holme (5 Feb 2018)
-- build-wolfssl.bat: Extend VC15 support to include Enterprise and Professional
+- docs/RELEASE-PROCEDURE: link to live iCalendar [ci skip]
   
-  ...and not just the Community Edition.
+  Ref: https://github.com/curl/curl/commit/0af41b40b2c7bd379b2251cbe7cd618e21fa0ea1#commitcomment-33563135
+  Approved-by: Daniel Stenberg
+  Closes #3895
 
-- build-openssl.bat: Extend VC15 support to include Enterprise and Professional
+Daniel Stenberg (16 May 2019)
+- travis: add an osx http-only build
   
-  ...and not just the Community Edition.
+  Closes #3887
 
-Michael Kaufmann (5 Feb 2018)
-- time-cond: fix reading the file modification time on Windows
+- cleanup: remove FIXME and TODO comments
   
-  On Windows, stat() may adjust the unix file time by a daylight saving time
-  offset. Avoid this by calling GetFileTime() instead.
+  They serve very little purpose and mostly just add noise. Most of them
+  have been around for a very long time. I read them all before removing
+  or rephrasing them.
   
-  Fixes #2164
-  Closes #2204
+  Ref: #3876
+  Closes #3883
 
-Daniel Stenberg (5 Feb 2018)
-- formdata: use the mime-content type function
+- curl: don't set FTP options for FTP-disabled builds
   
-  Reduce code duplication by making Curl_mime_contenttype available and
-  used by the formdata function. This also makes the formdata function
-  recognize a set of more file extensions by default.
+  ... since libcurl has started to be totally unaware of options for
+  disabled protocols they now return error.
   
-  PR #2280 brought this to my attention.
+  Bug: https://github.com/curl/curl/commit/c9c5304dd4747cbe75d2f24be85920d572fcb5b8#commitcomment-33533937
   
-  Closes #2282
+  Reported-by: Marcel Raad
+  Closes #3886
 
-- getdate: return -1 for out of range
-  
-  ...as that's how the function is documented to work.
+Steve Holme (16 May 2019)
+- http_ntlm_wb: Move the type-2 message processing into a dedicated function
   
-  Reported-by: Michael Kaufmann
-  Bug found in an autobuild with 32 bit time_t
+  This brings the code inline with the other HTTP authentication mechanisms.
   
-  Closes #2278
+  Closes #3890
 
-- [Ben Greear brought this change]
+Daniel Stenberg (15 May 2019)
+- RELEASE-NOTES: synced
 
-  build: fix termios issue on android cross-compile
-  
-  Bug: https://curl.haxx.se/mail/lib-2018-01/0122.html
-  Signed-off-by: Ben Greear <greearb@candelatech.com>
+- docs/RELEASE-PROCEDURE: updated coming releases dates [ci skip]
 
-- time_t-fixes: remove typecasts to 'long' for info.filetime
+- CURLOPT_READFUNCTION.3: see also CURLOPT_UPLOAD_BUFFERSIZE [ci skip]
   
-  They're now wrong.
+  Reported-by: Roy Bellingan
+  Bug: #3885
+
+- parse_proxy: use the URL parser API
   
-  Reported-by: Michael Kaufmann
+  As we treat a given proxy as a URL we should use the unified URL parser
+  to extract the parts out of it.
   
-  Closes #2277
+  Closes #3878
 
-- curl_setup: move the precautionary define of SIZEOF_TIME_T
+Steve Holme (15 May 2019)
+- http_negotiate: Move the Negotiate state out of the negotiatedata structure
   
-  ... up to before it may be used for the TIME_T_MAX/MIN logic.
+  Given that this member variable is not used by the SASL based protocols
+  there is no need to have it here.
   
-  Reported-by: Michael Kaufmann
+  Closes #3882
 
-- parsedate: s/#if/#ifdef
+- http_ntlm: Move the NTLM state out of the ntlmdata structure
   
-  Reported-by: Michael Kaufmann
-  Bug: https://github.com/curl/curl/commit/1c39128d974666107fc6d9ea15f294036851f224#commitcomment-27246479
+  Given that this member variable is not used by the SASL based protocols
+  there is no need to have it here.
+
+- url: Move the negotiate state type into a dedicated enum
 
-Patrick Monnerat (31 Jan 2018)
-- fnmatch: pattern syntax can no longer fail
+- url: Remove duplicate clean up of the winbind variables in conn_shutdown()
   
-  Whenever an expected pattern syntax rule cannot be matched, the
-  character starting the rule loses its special meaning and the parsing
-  is resumed:
-  - backslash at the end of pattern string matches itself.
-  - Error in [:keyword:] results in set containing :\[dekorwy.
+  Given that Curl_disconnect() calls Curl_http_auth_cleanup_ntlm() prior
+  to calling conn_shutdown() and it in turn performs this, there is no
+  need to perform the same action in conn_shutdown().
   
-  Unit test 1307 updated for this new situation.
+  Closes #3881
+
+Daniel Stenberg (14 May 2019)
+- urlapi: require a non-zero host name length when parsing URL
+  
+  Updated test 1560 to verify.
   
-  Closes #2273
+  Closes #3880
 
-- fnmatch: accept an alphanum to be followed by a non-alphanum in char set
+- configure: error out if OpenSSL wasn't detected when asked for
   
-  Also be more tolerant about set pattern syntax.
-  Update unit test 1307 accordingly.
+  If --with-ssl is used and configure still couldn't enable SSL this
+  creates an error instead of just silently ignoring the fact.
   
-  Bug: https://curl.haxx.se/mail/lib-2018-01/0114.html
+  Suggested-by: Isaiah Norton
+  Fixes #3824
+  Closes #3830
 
-- fnmatch: do not match the empty string with a character set
+Daniel Gustafsson (14 May 2019)
+- imap: Fix typo in comment
 
-Jay Satiro (30 Jan 2018)
-- build: fix windows build methods for curl_ctype.c
+Steve Holme (14 May 2019)
+- url: Remove unnecessary initialisation from allocate_conn()
   
-  - Fix winbuild and the VS project generator to treat curl_ctype.{c,h} as
-    curlx files since they are required by both src and lib.
+  No need to set variables to zero as calloc() does this for us.
   
-  Follow-up to 4272a0b which added curl_ctype.
+  Closes #3879
 
-Daniel Stenberg (30 Jan 2018)
-- progress-bar.d: update to match implementation
+Daniel Stenberg (14 May 2019)
+- CURLOPT_CAINFO.3: with Schannel, you want Windows 8 or later [ci skip]
   
-  ... since commit 993dd5651a6
+  Clues-provided-by: Jay Satiro
+  Clues-provided-by: Jeroen Ooms
+  Fixes #3711
+  Closes #3874
+
+Daniel Gustafsson (13 May 2019)
+- vtls: fix potential ssl_buffer stack overflow
   
-  Reported-by: Martin Dreher
-  Bug: https://github.com/curl/curl/pull/2242#issuecomment-361059228
+  In Curl_multissl_version() it was possible to overflow the passed in
+  buffer if the generated version string exceeded the size of the buffer.
+  Fix by inverting the logic, and also make sure to not exceed the local
+  buffer during the string generation.
   
-  Closes #2271
+  Closes #3863
+  Reported-by: nevv on HackerOne/curl
+  Reviewed-by: Jay Satiro
+  Reviewed-by: Daniel Stenberg
 
-- http2: set DEBUG_HTTP2 to enable more HTTP/2 logging
-  
-  ... instead of doing it unconditionally in debug builds. It cluttered up
-  the output a little too much.
+Daniel Stenberg (13 May 2019)
+- RELEASE-NOTES: synced
 
-- [Max Dymond brought this change]
+- appveyor: also build "/ci" branches like travis
 
-  file: Check the return code from Curl_range and bail out on error
+- pingpong: disable more when no pingpong enabled
 
-- [Max Dymond brought this change]
+- proxy: acknowledge DISABLE_PROXY more
 
-  Curl_range: add check to ensure "from <= to"
+- parsedate: CURL_DISABLE_PARSEDATE
 
-- [Max Dymond brought this change]
+- sasl: only enable if there's a protocol enabled using it
 
-  Curl_range: commonize FTP and FILE range handling
-  
-  Closes #2205
+- mime: acknowledge CURL_DISABLE_MIME
 
-- RELEASE-NOTES: synced with 811beab9f
+- wildcard: disable from build when FTP isn't present
 
-- curlver: next release will be 7.59.0
+- http: CURL_DISABLE_HTTP_AUTH
 
-- [Michał Janiszewski brought this change]
+- base64: build conditionally if there are users
 
-  curl/curl.h: fix comment typo for CURLOPT_DNS_LOCAL_IP6
-  
-  Closes #2275
+- doh: CURL_DISABLE_DOH
 
-- time: support > year 2038 time stamps for system with 32bit long
-  
-  ... with the introduction of CURLOPT_TIMEVALUE_LARGE and
-  CURLINFO_FILETIME_T.
+Steve Holme (12 May 2019)
+- auth: Rename the various authentication clean up functions
   
-  Fixes #2238
-  Closes #2264
-
-- curl_easy_reset: clear digest auth state
+  For consistency and to a avoid confusion.
   
-  Bug: https://curl.haxx.se/mail/lib-2018-01/0074.html
-  Reported-by: Ruurd Beerstra
-  Fixes #2255
-  Closes #2272
+  Closes #3869
 
-- [Adam Marcionek brought this change]
+Daniel Stenberg (12 May 2019)
+- [Jay Satiro brought this change]
 
-  winbuild: make linker generate proper PDB
+  docs/INSTALL: fix broken link [ci skip]
   
-  Link.exe requires /DEBUG to properly generate a full pdb file on release
-  builds.
-  
-  Closes #2274
+  Reported-by: Joombalaya on github
+  Fixes #3818
 
-- curl: add --proxy-pinnedpubkey
-  
-  To verify a proxy's public key. For when using HTTPS proxies.
+Marcel Raad (12 May 2019)
+- easy: fix another "clarify calculation precedence" warning
   
-  Fixes #2192
-  Closes #2268
+  I missed this one in commit 6b3dde7fe62ea5a557fd1fd323fac2bcd0c2e9be.
 
-- configure: set PATH_SEPARATOR to colon for PATH w/o separator
-  
-  The logic tries to figure out what the path separator in the $PATH
-  variable is, but if there's only one directory in the $PATH it
-  fails. This change make configure *guess* on colon instead of erroring
-  out, simply because that is probably the more common character.
-  
-  PATH_SEPARATOR can always be set by the user to override the guessing.
+- build: fix "clarify calculation precedence" warnings
   
-  (tricky bug to reproduce, as in my case for example the configure script
-  requires binaries in more than one directory so passing in a PATH with a
-  single dir fails.)
+  Codacy/CppCheck warns about this. Consistently use parentheses as we
+  already do in some places to silence the warning.
   
-  Reported-by: Earnestly on github
-  Fixes #2202
-  Closes #2265
+  Closes https://github.com/curl/curl/pull/3866
 
-- curl_ctype: private is*() type macros and functions
+- cmake: restore C89 compatibility of CurlTests.c
   
-  ... since the libc provided one are locale dependent in a way we don't
-  want. Also, the "native" isalnum() (for example) works differently on
-  different platforms which caused test 1307 failures on macos only.
+  I broke it in d1b5cf830bfe169745721b21245d2217d2c2453e and
+  97de97daefc2ed084c91eff34af2426f2e55e134.
   
-  Closes #2269
+  Reported-by: Viktor Szakats
+  Ref: https://github.com/curl/curl/commit/97de97daefc2ed084c91eff34af2426f2e55e134#commitcomment-33499044
+  Closes https://github.com/curl/curl/pull/3868
 
-Marcel Raad (29 Jan 2018)
-- build: open VC15 projects with VS 2017
+Steve Holme (11 May 2019)
+- http_ntlm: Corrected the name of the include guard
   
-  Previously, they were opened with Visual Studio 2015 by default, which
-  cannot build them.
-
-Daniel Stenberg (29 Jan 2018)
-- RELEASE-NOTES: synced with 094647fca
-
-- TODO: UTF-8 filenames in Content-Disposition
+  Missed in f0bdd72c.
   
-  Closes #1888
+  Closes #3867
 
-- KNOWN_BUGS: DICT responses show the underlying protocol
+- http_digest: Don't expose functions when HTTP and Crypto Auth are disabled
   
-  Closes #1809
+  Closes #3861
 
-Jay Satiro (27 Jan 2018)
-- [Alessandro Ghedini brought this change]
+- http_negotiate: Don't expose functions when HTTP is disabled
 
-  docs: fix typos in man pages
-  
-  Closes https://github.com/curl/curl/pull/2266
+Daniel Stenberg (11 May 2019)
+- SECURITY-PROCESS: fix links [ci skip]
 
-Patrick Monnerat (26 Jan 2018)
-- lib555: drop text conversion and encode data as ascii codes
-  
-  If CURL_DOES_CONVERSION is enabled, uploaded LFs are mapped to CRLFs,
-  giving a result that is different from what is expected.
-  This commit avoids using CURLOPT_TRANSFERTEXT and directly encodes data
-  to upload in ascii.
+Marcel Raad (11 May 2019)
+- CMake: suppress unused variable warnings
   
-  Bug: https://github.com/curl/curl/pull/1872
+  I missed these in commit d1b5cf830bfe169745721b21245d2217d2c2453e.
 
-Daniel Stenberg (26 Jan 2018)
-- lib517: make variable static to avoid compiler warning
+Daniel Stenberg (11 May 2019)
+- doh: disable DOH for the cases it doesn't work
   
-  ... with clang on macos
-
-Patrick Monnerat (26 Jan 2018)
-- lib544: sync ascii code data with textual data
+  Due to limitations in Curl_resolver_wait_resolv(), it doesn't work for
+  DOH resolves. This fix disables DOH for those.
   
-  Data mismatch caused test 545 to fail when character encoding
-  conversion is enabled.
+  Limitation added to KNOWN_BUGS.
   
-  Bug: https://github.com/curl/curl/pull/1872
-
-Daniel Stenberg (25 Jan 2018)
-- [Travis Burtrum brought this change]
+  Fixes #3850
+  Closes #3857
 
-  GSKit: restore pinnedpubkey functionality
+Jay Satiro (11 May 2019)
+- checksrc.bat: Ignore snprintf warnings in docs/examples
   
-  inadvertently removed in 283babfaf8d8f3bab9d3c63cea94eb0b84e79c37
+  .. because we allow snprintf use in docs/examples.
   
-  Closes #2263
+  Closes https://github.com/curl/curl/pull/3862
 
-- [Dair Grant brought this change]
-
-  darwinssl: Don't import client certificates into Keychain on macOS
+Steve Holme (10 May 2019)
+- vauth: Fix incorrect function description for Curl_auth_user_contains_domain()
   
-  Closes #2085
-
-- configure: fix the check for unsigned time_t
+  ...and misalignment of these comments. From a78c61a4.
   
-  Assign the time_t variable negative value and then check if it is
-  greater than zero, which will evaluate true for unsigned time_t but
-  false for signed time_t.
+  Closes #3860
 
-- parsedate: fix date parsing for systems with 32 bit long
+Jay Satiro (10 May 2019)
+- Revert "multi: support verbose conncache closure handle"
   
-  Make curl_getdate() handle dates before 1970 as well (returning negative
-  values).
+  This reverts commit b0972bc.
   
-  Make test 517 test dates for 64 bit time_t.
+  - No longer show verbose output for the conncache closure handle.
   
-  This fixes bug (3) mentioned in #2238
+  The offending commit was added so that the conncache closure handle
+  would inherit verbose mode from the user's easy handle. (Note there is
+  no way for the user to set options for the closure handle which is why
+  that was necessary.) Other debug settings such as the debug function
+  were not also inherited since we determined that could lead to crashes
+  if the user's per-handle private data was used on an unexpected handle.
   
-  Closes #2250
-
-- [McDonough, Tim brought this change]
-
-  openssl: fix pinned public key build error in FIPS mode
+  The reporter here says he has a debug function to capture the verbose
+  output, and does not expect or want any output to stderr; however
+  because the conncache closure handle does not inherit the debug function
+  the verbose output for that handle does go to stderr.
   
-  Here is a version that should work with all versions of openssl 0.9.7
-  through 1.1.0.
+  There are other plausible scenarios as well such as the user redirects
+  stderr on their handle, which is also not inherited since it could lead
+  to crashes when used on an unexpected handle.
   
-  Links to the docs:
-  https://www.openssl.org/docs/man1.0.2/crypto/EVP_DigestInit.html
-  https://www.openssl.org/docs/man1.1.0/crypto/EVP_DigestInit.html
+  Short of allowing the user to set options for the conncache closure
+  handle I don't think there's much we can safely do except no longer
+  inherit the verbose setting.
   
-  At the very bottom of the 1.1.0 documentation there is a history section
-  that states, " stack allocated EVP_MD_CTXs are no longer supported."
+  Bug: https://curl.haxx.se/mail/lib-2019-05/0021.html
+  Reported-by: Kristoffer Gleditsch
   
-  If EVP_MD_CTX_create and EVP_MD_CTX_destroy are not defined, then a
-  simple mapping can be used as described here:
-  https://wiki.openssl.org/index.php/Talk:OpenSSL_1.1.0_Changes
+  Ref: https://github.com/curl/curl/pull/3598
+  Ref: https://github.com/curl/curl/pull/3618
   
-  Closes #2258
+  Closes https://github.com/curl/curl/pull/3856
 
-- [Travis Burtrum brought this change]
+Steve Holme (10 May 2019)
+- ntlm: Fix misaligned function comments for Curl_auth_ntlm_cleanup()
+  
+  From 6012fa5a.
+  
+  Closes #3858
 
-  SChannel/WinSSL: Replace Curl_none_md5sum with Curl_schannel_md5sum
+Daniel Stenberg (9 May 2019)
+- BUG-BOUNTY: minor formatting fixes [ci skip]
 
-- [Travis Burtrum brought this change]
+- RELEASE-NOTES: synced
 
-  SChannel/WinSSL: Implement public key pinning
+- BUG-BOUNTY.md: add the Dropbox "bonus" extra payout ability [ci skip]
   
-  Closes #1429
-
-- bump: towards 7.58.1
+  Closes #3839
 
-- cookies: remove verbose "cookie size:" output
+Kamil Dudka (9 May 2019)
+- http_negotiate: do not treat failure of gss_init_sec_context() as fatal
   
-  It was once used for some debugging/verifying logic but should never have
-  ended up in git!
+  Fixes #3726
+  Closes #3849
 
-- TODO: hardcode the "localhost" addresses
-
-- TODO: CURL_REFUSE_CLEARTEXT
+- spnego_gssapi: fix return code on gss_init_sec_context() failure
   
-  An idea that popped up in discussions on twitter.
+  Fixes #3726
+  Closes #3849
 
-- progress-bar: don't use stderr explicitly, use bar->out
+Steve Holme (9 May 2019)
+- gen_resp_file.bat: Removed unnecessary @ from all but the first command
   
-  Reported-By: Gisle Vanem
-  Bug: https://github.com/curl/curl/commit/993dd5651a6c853bfe3870f6a69c7b329fa4e8ce#commitcomment-27070080
-
-GitHub (24 Jan 2018)
-- [Gisle Vanem brought this change]
+  There is need to use @ on every command once echo has been turned off.
+  
+  Closes #3854
 
-  Fixes for MSDOS etc.
+Jay Satiro (8 May 2019)
+- http: Ignore HTTP/2 prior knowledge setting for HTTP proxies
   
-  djgpp do have 'mkdir(dir, mode)'. Other DOS-compilers does not
-  But djgpp seems the only choice for MSDOS anyway.
+  - Do not switch to HTTP/2 for an HTTP proxy that is not tunnelling to
+    the destination host.
   
-  PellesC do have a 'F_OK' defined in it's <unistd.h>.
+  We already do something similar for HTTPS proxies by not sending h2. [1]
   
-  Update year in Copyright.
-
-- [Gisle Vanem brought this change]
-
-  Fix small typo.
-
-Version 7.58.0 (23 Jan 2018)
-
-Daniel Stenberg (23 Jan 2018)
-- RELEASE: 7.58.0
-
-- [Gisle Vanem brought this change]
+  Prior to this change setting CURL_HTTP_VERSION_2_PRIOR_KNOWLEDGE would
+  incorrectly use HTTP/2 to talk to the proxy, which is not something we
+  support (yet?). Also it's debatable whether or not that setting should
+  apply to HTTP/2 proxies.
+  
+  [1]: https://github.com/curl/curl/commit/17c5d05
+  
+  Bug: https://github.com/curl/curl/issues/3570
+  Bug: https://github.com/curl/curl/issues/3832
+  
+  Closes https://github.com/curl/curl/pull/3853
 
-  progress-bar: get screen width on windows
+Marcel Raad (8 May 2019)
+- travis: update mesalink build to xenial
+  
+  Closes https://github.com/curl/curl/pull/3842
 
-- test1454: --connect-to with IPv6 address w/o IPv6 support!
+Daniel Stenberg (8 May 2019)
+- [Ricky Leverence brought this change]
 
-- CONNECT_TO: fail attempt to set an IPv6 numerical without IPv6 support
+  OpenSSL: Report -fips in version if OpenSSL is built with FIPS
   
-  Bug: https://curl.haxx.se/mail/lib-2018-01/0087.html
-  Reported-by: John Hascall
+  Older versions of OpenSSL report FIPS availabilty via an OPENSSL_FIPS
+  define. It uses this define to determine whether to publish -fips at
+  the end of the version displayed. Applications that utilize the version
+  reported by OpenSSL will see a mismatch if they compare it to what curl
+  reports, as curl is not modifying the version in the same way. This
+  change simply adds a check to see if OPENSSL_FIPS is defined, and will
+  alter the reported version to match what OpenSSL itself provides. This
+  only appears to be applicable in versions of OpenSSL <1.1.1
   
-  Closes #2257
+  Closes #3771
 
-- docs: fix man page syntax to make test 1140 OK again
+Kamil Dudka (7 May 2019)
+- [Frank Gevaerts brought this change]
 
-- http: prevent custom Authorization headers in redirects
+  nss: allow fifos and character devices for certificates.
   
-  ... unless CURLOPT_UNRESTRICTED_AUTH is set to allow them. This matches how
-  curl already handles Authorization headers created internally.
+  Currently you can do things like --cert <(cat ./cert.crt) with (at least) the
+  openssl backend, but that doesn't work for nss because is_file rejects fifos.
   
-  Note: this changes behavior slightly, for the sake of reducing mistakes.
+  I don't actually know if this is sufficient, nss might do things internally
+  (like seeking back) that make this not work, so actual testing is needed.
   
-  Added test 317 and 318 to verify.
+  Closes #3807
+
+Daniel Gustafsson (6 May 2019)
+- test2100: Fix typos in test description
+
+Daniel Stenberg (6 May 2019)
+- ssh: define USE_SSH if SSH is enabled (any backend)
   
-  Reported-by: Craig de Stigter
-  Bug: https://curl.haxx.se/docs/adv_2018-b3bf.html
+  Closes #3846
 
-- curl: progress bar refresh, get width using ioctl()
+Steve Holme (5 May 2019)
+- winbuild: Add our standard copyright header to the winbuild batch files
+
+- makedebug: Fix ERRORLEVEL detection after running where.exe
   
-  Get screen width from the environment variable COLUMNS first, if set. If
-  not, use ioctl(). If nether works, assume 79.
+  Closes #3838
+
+Daniel Stenberg (5 May 2019)
+- urlapi: add CURLUPART_ZONEID to set and get
   
-  Closes #2242
+  The zoneid can be used with IPv6 numerical addresses.
   
-  The "refresh" is for the -# output when no total transfer size is
-  known. It will now only use a single updated line even for this case:
+  Updated test 1560 to verify.
   
-  The "-=O=-" ship moves when data is transferred. The four flying
-  "hashes" move (on a sine wave) on each refresh, independent of data.
+  Closes #3834
 
-- RELEASE-NOTES: synced with bb0ffcc36
+- [Taiyu Len brought this change]
 
-- libcurl-env.3: first take
-
-- TODO: two possible name resolver improvements
+  WRITEFUNCTION: add missing set_in_callback around callback
+  
+  Closes #3837
 
-- [Kartik Mahajan brought this change]
+- RELEASE-NOTES: synced
 
-  http2: don't close connection when single transfer is stopped
+- CURLMOPT_TIMERFUNCTION.3: warn about the recursive risk [ci skip]
   
-  Fixes #2237
-  Closes #2249
-
-- test558: fix for multissl builds
+  Reported-by: Ricardo Gomes
   
-  vtls.c:multissl_init() might do a curl_free() call so strip that out to
-  make this work with more builds. We just want to verify that
-  memorytracking works so skipping one line is no harm.
+  Bug: #3537
+  Closes #3836
 
-- examples/url2file.c: add missing curl_global_cleanup() call
+- CURLOPT_CHUNK_BGN_FUNCTION.3: document the struct and time value
   
-  Reported-by: XhstormR on github
-  Fixes #2245
+  The time field in the curl_fileinfo struct will always be zero. No code
+  was ever implemented to actually convert the date string to a time_t.
+  
+  Fixes #3829
+  Closes #3835
 
-- [Michael Gmelin brought this change]
+- OS400/ccsidcurl.c: code style fixes
 
-  SSH: Fix state machine for ssh-agent authentication
+- OS400/ccsidcurl: replace use of Curl_vsetopt
+  
+  (and make the code style comply)
   
-  In case an identity didn't match[0], the state machine would fail in
-  state SSH_AUTH_AGENT instead of progressing to the next identity in
-  ssh-agent. As a result, ssh-agent authentication only worked if the
-  identity required happened to be the first added to ssh-agent.
+  Fixes #3833
+
+- urlapi: strip off scope id from numerical IPv6 addresses
   
-  This was introduced as part of commit c4eb10e2f06fbd6cc904f1d78e4, which
-  stated that the "else" statement was required to prevent getting stuck
-  in state SSH_AUTH_AGENT. Given the state machine's logic and libssh2's
-  interface I couldn't see how this could happen or reproduce it and I
-  also couldn't find a more detailed description of the problem which
-  would explain a test case to reproduce the problem this was supposed to
-  fix.
+  ... to make the host name "usable". Store the scope id and put it back
+  when extracting a URL out of it.
   
-  [0] libssh2_agent_userauth returning LIBSSH2_ERROR_AUTHENTICATION_FAILED
+  Also makes curl_url_set() syntax check CURLUPART_HOST.
   
-  Closes #2248
+  Fixes #3817
+  Closes #3822
 
-- openssl: fix potential memory leak in SSLKEYLOGFILE logic
-  
-  Coverity CID 1427646.
+- RELEASE-NOTES: synced
 
-- openssl: fix the libressl build again
+- multiif.h: remove unused protos
   
-  Follow-up to 84fcaa2e7. libressl does not have the API even if it says it is
-  late OpenSSL version...
+  ... for functions related to pipelining. Those functions were removed in
+  2f44e94efb3df.
   
-  Fixes #2246
-  Closes #2247
+  Closes #3828
+
+- [Yiming Jing brought this change]
+
+  travis: mesalink: temporarily disable test 3001
   
-  Reported-by: jungle-boogie on github
+  ... due to SHA-1 signatures in test certs
 
-- unit1307: test many wildcards too
+- [Yiming Jing brought this change]
 
-- curl_fnmatch: only allow 5 '*' sections in a single pattern
+  travis: upgrade the MesaLink TLS backend to v1.0.0
   
-  ... to avoid excessive recursive calls. The number 5 is totally
-  arbitrary and could be modified if someone has a good motivation.
+  Closes #3823
+  Closes #3776
 
-- ftp-wildcard: fix matching an empty string with "*[^a]"
+- ConnectionExists: improve non-multiplexing use case
   
-  .... and avoid advancing the pointer to trigger an out of buffer read.
+  - better log output
   
-  Detected by OSS-fuzz
-  Bug: https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=5251
-  Assisted-by: Max Dymond
+  - make sure multiplex is enabled for it to be used
 
-- SMB: fix numeric constant suffix and variable types
+- multi: provide Curl_multiuse_state to update information
   
-  1. don't use "ULL" suffix since unsupported in older MSVC
-  2. use curl_off_t instead of custom long long ifdefs
-  3. make get_posix_time() not do unaligned data access
-  
-  Fixes #2211
-  Closes #2240
-  Reported-by: Chester Liu
+  As soon as a TLS backend gets ALPN conformation about the specific HTTP
+  version it can now set the multiplex situation for the "bundle" and
+  trigger moving potentially queued up transfers to the CONNECT state.
 
-- [rouzier brought this change]
+- process_pending_handles: mark queued transfers as previously pending
+  
+  With transfers being queued up, we only move one at a a time back to the
+  CONNECT state but now we mark moved transfers so that when a moved
+  transfer is confirmed "successful" (it connected) it will trigger the
+  move of another pending transfer. Previously, it would otherwise wait
+  until the transfer was done before doing this. This makes queued up
+  pending transfers get processed (much) faster.
 
-  CURLOPT_TCP_NODELAY.3: fix typo
+- http: mark bundle as not for multiuse on < HTTP/2 response
   
-  Closes #2239
+  Fixes #3813
+  Closes #3815
 
-- smtp/pop3/imap_get_message: decrease the data length too...
+Daniel Gustafsson (1 May 2019)
+- cookie: Guard against possible NULL ptr deref
   
-  Follow-up commit to 615edc1f73 which was incomplete.
+  In case the name pointer isn't set (due to memory pressure most likely)
+  we need to skip the prefix matching and reject with a badcookie to avoid
+  a possible NULL pointer dereference.
   
-  Assisted-by: Max Dymond
-  Detected by OSS-fuzz
-  Bug: https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=5206
+  Closes #3820 #3821
+  Reported-by: Jonathan Moerman
+  Reviewed-by: Daniel Stenberg <daniel@haxx.se>
 
-- openssl: enable SSLKEYLOGFILE support by default
+Patrick Monnerat (30 Apr 2019)
+- os400: Add CURLOPT_MAXAGE_CONN to ILE/RPG bindings
+
+Kamil Dudka (29 Apr 2019)
+- nss: provide more specific error messages on failed init
   
-  Fixes #2210
-  Closes #2236
+  Closes #3808
+
+Daniel Stenberg (29 Apr 2019)
+- [Reed Loden brought this change]
 
-Patrick Monnerat (14 Jan 2018)
-- mime: clone mime tree upon easy handle duplication.
+  docs: minor polish to the bug bounty / security docs
   
-  A mime tree attached to an easy handle using CURLOPT_MIMEPOST is
-  strongly bound to the handle: there is a pointer to the easy handle in
-  each item of the mime tree and following the parent pointer list
-  of mime items ends in a dummy part stored within the handle.
+  Closes #3811
+
+- CURL_MAX_INPUT_LENGTH: largest acceptable string input size
   
-  Because of this binding, a mime tree cannot be shared between different
-  easy handles, thus it needs to be cloned upon easy handle duplication.
+  This limits all accepted input strings passed to libcurl to be less than
+  CURL_MAX_INPUT_LENGTH (8000000) bytes, for these API calls:
+  curl_easy_setopt() and curl_url_set().
   
-  There is no way for the caller to get the duplicated mime tree
-  handle: it is then set to be automatically destroyed upon freeing the
-  new easy handle.
+  The 8000000 number is arbitrary picked and is meant to detect mistakes
+  or abuse, not to limit actual practical use cases. By limiting the
+  acceptable string lengths we also reduce the risk of integer overflows
+  all over.
   
-  New test 654 checks proper mime structure duplication/release.
+  NOTE: This does not apply to `CURLOPT_POSTFIELDS`.
   
-  Add a warning note in curl_mime_data_cb() documentation about sharing
-  user data between duplicated handles.
+  Test 1559 verifies.
   
-  Closes #2235
-
-- docs: comment about CURLE_READ_ERROR returned by curl_mime_filedata
+  Closes #3805
 
-Daniel Stenberg (13 Jan 2018)
-- test395: HTTP with overflow Content-Length value
+- [Tseng Jun brought this change]
 
-- test394: verify abort of rubbish in Content-Length: value
+  curlver.h: use parenthesis in CURL_VERSION_BITS macro
+  
+  Closes #3809
 
-- test393: verify --max-filesize with excessive Content-Length
+Marcel Raad (27 Apr 2019)
+- [Simon Warta brought this change]
 
-- HTTP: bail out on negative Content-Length: values
-  
-  ... and make the max filesize check trigger if the value is too big.
+  cmake: rename CMAKE_USE_DARWINSSL to CMAKE_USE_SECTRANSP
   
-  Updates test 178.
-  
-  Reported-by: Brad Spencer
-  Fixes #2212
-  Closes #2223
+  Closes https://github.com/curl/curl/pull/3769
 
-Marcel Raad (13 Jan 2018)
-- [Dan Johnson brought this change]
+Steve Holme (23 Apr 2019)
+- ntlm: Missed pre-processor || (or) during rebase for cd15acd0
 
-  configure.ac: append extra linker flags instead of prepending them.
+- ntlm: Support the NT response in the type-3 when OpenSSL doesn't include MD4
   
-  Link order should list libraries after the libraries that use them,
-  so when we're guessing that we might also need to add -ldl in order
-  to use -lssl, we should add -ldl after -lssl.
+  Just like we do for mbed TLS, use our local implementation of MD4 when
+  OpenSSL doesn't support it. This allows a type-3 message to include the
+  NT response.
+
+Daniel Gustafsson (23 Apr 2019)
+- INTERNALS: fix misindentation of ToC item
   
-  Closes https://github.com/curl/curl/pull/2234
+  Kerberos was incorrectly indented as a subsection under FTP, which is
+  incorrect as they are both top level sections. A fix for this was first
+  attempted in commit fef38a0898322f285401c5ff2f5e7c90dbf3be63 but that
+  was a few paddles short of being complete.
 
-Daniel Stenberg (13 Jan 2018)
-- RELEASE-NOTES: synced with 6fa10c8fa
+- [Aron Bergman brought this change]
 
-Jay Satiro (13 Jan 2018)
-- setopt: fix SSLVERSION to allow CURL_SSLVERSION_MAX_ values
+  INTERNALS: Add structs to ToC
   
-  Broken since f121575 (precedes 7.56.1).
+  Add the subsections under "Structs in libcurl" to the table of contents.
   
-  Bug: https://github.com/curl/curl/issues/2225
-  Reported-by: cmfrolick@users.noreply.github.com
-  
-  Closes https://github.com/curl/curl/pull/2227
+  Reviewed-by: Daniel Stenberg <daniel@haxx.se>
+  Reviewed-by: Daniel Gustafsson <daniel@yesql.se>
 
-Patrick Monnerat (13 Jan 2018)
-- setopt: reintroduce non-static Curl_vsetopt() for OS400 support
+- [Aron Bergman brought this change]
+
+  INTERNALS: Add code highlighting
   
-  This also upgrades ILE/RPG bindings with latest setopt options.
+  Make all struct members under the Curl_handler section
+  print in monospace font.
   
-  Reported-By: jonrumsey on github
-  Fixes #2230
-  Closes #2233
-
-Jay Satiro (11 Jan 2018)
-- [Zhouyihai Ding brought this change]
+  Closes #3801
+  Reviewed-by: Daniel Stenberg <daniel@haxx.se>
+  Reviewed-by: Daniel Gustafsson <daniel@yesql.se>
 
-  http2: fix incorrect trailer buffer size
+Daniel Stenberg (22 Apr 2019)
+- docs/BUG-BOUNTY: bug bounty time [skip ci]
+  
+  Introducing the curl bug bounty program on hackerone. We now recommend
+  filing security issues directly in the hackerone ticket system which
+  only is readable to curl security team members.
   
-  Prior to this change the stored byte count of each trailer was
-  miscalculated and 1 less than required. It appears any trailer
-  after the first that was passed to Curl_client_write would be truncated
-  or corrupted as well as the size. Potentially the size of some
-  subsequent trailer could be erroneously extracted from the contents of
-  that trailer, and since that size is used by client write an
-  out-of-bounds read could occur and cause a crash or be otherwise
-  processed by client write.
+  Assisted-by: Daniel Gustafsson
   
-  The bug appears to have been born in 0761a51 (precedes 7.49.0).
+  Closes #3488
+
+Steve Holme (22 Apr 2019)
+- sasl: Don't send authcid as authzid for the PLAIN mechanism as per RFC 4616
   
-  Closes https://github.com/curl/curl/pull/2231
+  RFC 4616 specifies the authzid is optional in the client authentication
+  message and that the server will derive the authorisation identity
+  (authzid) from the authentication identity (authcid) when not specified
+  by the client.
 
-- [Basuke Suzuki brought this change]
+Jay Satiro (22 Apr 2019)
+- [Gisle Vanem brought this change]
 
-  easy: fix connection ownership in curl_easy_pause
+  memdebug: fix variable name
   
-  Before calling Curl_client_chop_write(), change the owner of connection
-  to the current Curl_easy handle. This will fix the issue #2217.
+  Follow-up to 76b6348 which renamed logfile as curl_dbg_logfile.
   
-  Fixes https://github.com/curl/curl/issues/2217
-  Closes https://github.com/curl/curl/pull/2221
-
-Daniel Stenberg (9 Jan 2018)
-- [Dimitrios Apostolou brought this change]
+  Ref: https://github.com/curl/curl/commit/76b6348#r33259088
 
-  system.h: Additionally check __LONG_MAX__ for defining curl_off_t
+Steve Holme (21 Apr 2019)
+- vauth/cleartext: Don't send the authzid if it is empty
   
-  __SIZEOF_LONG__ was introduced in GCC 4.4, __LONG_MAX__ was introduced
-  in GCC 3.3.
-  
-  Closes #2216
+  Follow up to 762a292f.
 
-- COPYING: it's 2018!
+Daniel Stenberg (21 Apr 2019)
+- test 196,197,198: add 'retry' keyword [skip ci]
 
-- progress: calculate transfer speed on milliseconds if possible
-  
-  to increase accuracy for quick transfers
-  
-  Fixes #2200
-  Closes #2206
+- RELEASE-NOTES: synced
 
-Jay Satiro (7 Jan 2018)
-- scripts: allow all perl scripts to be run directly
+- CURLOPT_MAXAGE_CONN: set the maximum allowed age for conn reuse
   
-  - Enable execute permission (chmod +x)
+  ... and disconnect too old ones instead of trying to reuse.
   
-  - Change interpreter to /usr/bin/env perl
+  Default max age is set to 118 seconds.
   
-  Closes https://github.com/curl/curl/pull/2222
+  Ref: #3722
+  Closes #3782
 
-- mail-rcpt.d: fix short-text description
+Daniel Gustafsson (20 Apr 2019)
+- [Po-Chuan Hsieh brought this change]
 
-- build: remove HAVE_LIMITS_H check
+  altsvc: Fix building with cookies disables
   
-  .. because limits.h presence isn't optional, it's required by C89.
+  ALTSVC requires Curl_get_line which is defined in lib/cookie.c inside a #if
+  check of HTTP and COOKIES. That makes Curl_get_line undefined if COOKIES is
+  disabled. Fix by splitting out the function into a separate file which can
+  be included where needed.
   
-  Ref: http://port70.net/~nsz/c/c89/c89-draft.html#2.2.4.2
-  
-  Closes https://github.com/curl/curl/pull/2215
+  Closes #3717
+  Reviewed-by: Daniel Gustafsson <daniel@yesql.se>
+  Reviewed-by: Marcel Raad <Marcel.Raad@teamviewer.com>
 
-- openssl: fix memory leak of SSLKEYLOGFILE filename
-  
-  - Free the copy of SSLKEYLOGFILE env returned by curl_getenv during ossl
-    initialization.
+Daniel Stenberg (20 Apr 2019)
+- test1002: correct the name [skip ci]
+
+- test660: verify CONNECT_ONLY with IMAP
   
-  Caught by ASAN.
+  which basically just makes sure LOGOUT is *not* issued on disconnect
 
-- Revert "curl/system.h: fix compilation with gcc on AIX PPC and IA64 HP-UX"
+- Curl_disconnect: treat all CONNECT_ONLY connections as "dead"
   
-  This reverts commit c97648b55080343bb371522bf4233e94a2a13a99.
+  Since the connection has been used by the "outside" we don't know the
+  state of it anymore and curl should not use it anymore.
   
-  SIZEOF_LONG should not be checked in system.h since that macro is only
-  defined when building libcurl.
+  Bug: https://curl.haxx.se/mail/lib-2019-04/0052.html
   
-  Ref: https://github.com/curl/curl/pull/2186#issuecomment-354767080
-  Ref: https://gcc.gnu.org/onlinedocs/cpp/Common-Predefined-Macros.html
+  Closes #3795
 
-Michael Kaufmann (30 Dec 2017)
-- test1554: improve the error handling
-
-- test1554: add global initialization and cleanup
-
-Daniel Stenberg (29 Dec 2017)
-- curl_version_info.3: call the argument 'age'
+- multi: fix the statenames (follow-up fix from 2f44e94efb3df8e)
   
-  Reported-by: Pete Lomax
-  Bug: https://curl.haxx.se/mail/lib-2017-12/0074.html
+  The list of names must be in sync with the defined states in the header
+  file!
 
-Patrick Monnerat (27 Dec 2017)
-- [Mikalai Ananenka brought this change]
+Steve Holme (16 Apr 2019)
+- openvms: Remove pre-processors for Windows as VMS cannot support them
 
-  brotli: data at the end of content can be lost
+- openvms: Remove pre-processor for SecureTransport as VMS cannot support it
   
-  Decoding loop implementation did not concern the case when all
-  received data is consumed by Brotli decoder and the size of decoded
-  data internally hold by Brotli decoder is greater than CURL_MAX_WRITE_SIZE.
-  For content with unencoded length greater than CURL_MAX_WRITE_SIZE this
-  can result in the loss of data at the end of content.
-  
-  Closes #2194
+  Fixes #3768
+  Closes #3785
 
-Jay Satiro (26 Dec 2017)
-- examples/cacertinmem: ignore cert-already-exists error
-  
-  - Ignore X509_R_CERT_ALREADY_IN_HASH_TABLE errors in the CTX callback
-    since it's possible the cert may have already been loaded by libcurl.
-  
-  - Remove the EXAMPLE code in the CURLOPT_SSL_CTX_FUNCTION.3 doc.
-    Instead have it direct the reader to this cacertinmem.c example.
-  
-  - Fix the CA certificate to use the right CA for example.com, Digicert.
-  
-  Bug: https://curl.haxx.se/mail/lib-2017-12/0057.html
-  Reported-by: Thomas van Hesteren
-  
-  Closes https://github.com/curl/curl/pull/2182
+Jay Satiro (16 Apr 2019)
+- TODO: Add issue link to an existing entry
 
-- [Gisle Vanem brought this change]
+Daniel Stenberg (16 Apr 2019)
+- RELEASE-NOTES: synced
 
-  tool_getparam: Support size modifiers for --max-filesize
+Jay Satiro (16 Apr 2019)
+- tool_help: Warn if curl and libcurl versions do not match
   
-  - Move the size modifier detection code from limit-rate to its own
-    function so that it can also be used with max-filesize.
+  .. because functionality may be affected if the versions differ.
   
-  Size modifiers are the suffixes such as G (gigabyte), M (megabyte) etc.
+  This commit implements TODO 18.7 "warning if curl version is not in sync
+  with libcurl version".
   
-  For example --max-filesize 1G
+  Ref: https://github.com/curl/curl/blob/curl-7_64_1/docs/TODO#L1028-L1033
   
-  Ref: https://curl.haxx.se/mail/archive-2017-12/0000.html
-  
-  Closes https://github.com/curl/curl/pull/2179
-
-Steve Holme (22 Dec 2017)
-- build: Fixed incorrect script termination from commit ad1dc10e61
+  Closes https://github.com/curl/curl/pull/3774
 
-- Makefile.vc: Added our standard copyright header
+Steve Holme (16 Apr 2019)
+- md5: Update the function signature following d84da52d
 
-- winbuild: Added support for VC15
+- md5: Forgot to update the code alignment in d84da52d
 
-- build: Added Visual Studio 2017 project files
-
-- build-wolfssl.bat: Added support for VC15
-
-- build-openssl.bat: Added support for VC15
-
-Jay Satiro (22 Dec 2017)
-- [Dimitrios Apostolou brought this change]
-
-  curl/system.h: fix compilation with gcc on AIX PPC and IA64 HP-UX
+- md5: Return CURLcode from the internally accessible functions
   
-  Closes https://github.com/curl/curl/pull/2186
+  Following 28f826b3 to return CURLE_OK instead of numeric 0.
 
-- [Mattias Fornander brought this change]
-
-  examples/rtsp: fix error handling macros
+Daniel Gustafsson (15 Apr 2019)
+- tests: Run global cleanup at end of tests
   
-  Closes https://github.com/curl/curl/pull/2185
-
-Patrick Monnerat (20 Dec 2017)
-- curl_easy_reset: release mime-related data.
+  Make sure to run curl_global_cleanup() when shutting down the test
+  suite to release any resources allocated in the SSL setup. This is
+  clearly visible when running tests with PolarSSL where the thread
+  lock calloc() memory which isn't released when not running cleanup.
+  Below is an excerpt from the autobuild logs:
   
-  Move curl_mime_initpart() and curl_mime_cleanpart() calls to lower-level
-  functions dealing with UserDefined structure contents.
-  This avoids memory leakages on curl-generated part mime headers.
-  New test 2073 checks this using the cli tool --next option: it
-  triggers a valgrind error if bug is present.
+    ==12368== 96 bytes in 1 blocks are possibly lost in loss record 1 of 2
+    ==12368== at 0x4837B65: calloc (vg_replace_malloc.c:752)
+    ==12368== by 0x11A76E: curl_dbg_calloc (memdebug.c:205)
+    ==12368== by 0x145CDF: Curl_polarsslthreadlock_thread_setup
+                           (polarssl_threadlock.c:54)
+    ==12368== by 0x145B37: Curl_polarssl_init (polarssl.c:865)
+    ==12368== by 0x14129D: Curl_ssl_init (vtls.c:171)
+    ==12368== by 0x118B4C: global_init (easy.c:158)
+    ==12368== by 0x118BF5: curl_global_init (easy.c:221)
+    ==12368== by 0x118D0B: curl_easy_init (easy.c:299)
+    ==12368== by 0x114E96: test (lib1906.c:32)
+    ==12368== by 0x115495: main (first.c:174)
   
-  Bug: https://curl.haxx.se/mail/lib-2017-12/0060.html
-  Reported-by: Martin Galvan
+  Closes #3783
+  Reviewed-by: Marcel Raad <Marcel.Raad@teamviewer.com>
+  Reviewed-by: Daniel Stenberg <daniel@haxx.se>
 
-- content_encoding: rework zlib_inflate
+Marcel Raad (15 Apr 2019)
+- travis: use mbedtls from Xenial
   
-  - When zlib version is < 1.2.0.4, process gzip trailer before considering
-  extra data as an error.
-  - Inflate with Z_BLOCK instead of Z_SYNC_FLUSH to maximize correct data
-  and minimize corrupt data output.
-  - Do not try to restart deflate decompression in raw mode if output has
-  started or if the leading data is not available anymore.
-  - New test 232 checks inflating raw-deflated content.
+  No need to build it from source anymore.
   
-  Closes #2068
+  Closes https://github.com/curl/curl/pull/3779
 
-- brotli: allow compiling with version 0.6.0.
+- travis: use libpsl from Xenial
   
-  Some error codes were not yet defined in brotli 0.6.0: do not issue code
-  for them in this case.
+  This makes building libpsl and libidn2 from source unnecessary and
+  removes the need for the autopoint and libunistring-dev packages.
+  
+  Closes https://github.com/curl/curl/pull/3779
 
-Daniel Stenberg (13 Dec 2017)
-- CURLOPT_READFUNCTION.3: refer to argument with correct name
+Daniel Stenberg (15 Apr 2019)
+- runtests: start socksd like other servers
   
-  Bug: #2175
+  ... without a $srcdir prefix. Triggered by the failures in several
+  autobuilds.
   
-  [ci skip]
+  Closes #3781
 
-- rand: add a clang-analyzer work-around
+Daniel Gustafsson (14 Apr 2019)
+- socksd: Fix typos
   
-  scan-build would warn on a potential access of an uninitialized
-  buffer. I deem it a false positive and had to add this somewhat ugly
-  work-around to silence it.
+  Reviewed-by: Daniel Stenberg <daniel@haxx.se>
 
-- krb5: fix a potential access of uninitialized memory
+- socksd: Properly decorate static variables
   
-  A scan-build warning.
-
-- conncache: fix a return code [regression]
+  Mark global variables static to avoid compiler warning in Clang when
+  using -Wmissing-variable-declarations.
   
-  This broke in 07cb27c98e. Make sure to return 'result' properly. Pointed
-  out by scan-build!
+  Closes #3778
+  Reviewed-by: Daniel Stenberg <daniel@haxx.se>
 
-- curl: support >256 bytes warning messsages
+Steve Holme (14 Apr 2019)
+- md(4|5): Fixed indentation oddities with the importation of replacement code
   
-  Bug: #2174
+  The indentation from 211d5329 and 57d6d253 was a little strange as
+  parts didn't align correctly, uses 4 spaces rather than 2. Checked
+  the indentation of the original source so it aligns, albeit, using
+  curl style.
 
-Michael Kaufmann (12 Dec 2017)
-- libssh: fix a syntax error in configure.ac
+- md5: Code style to return CURLE_OK rather than numeric 0
+
+- md5: Corrected code style for some pointer arguments
+
+Marcel Raad (13 Apr 2019)
+- travis: update some builds to xenial
   
-  Follow-up to c92d2e1
+  Xenial comes with more up-to-date software versions and more available
+  packages, some of which we currently build from source. Unfortunately,
+  some builds would fail with Xenial because of assertion failures in
+  Valgrind when using OpenSSL, so leave these at Trusty.
   
-  Closes #2172
+  Closes https://github.com/curl/curl/pull/3777
 
-Daniel Stenberg (12 Dec 2017)
-- examples/smtp-mail.c: use separate defines for options and mail
+Daniel Stenberg (13 Apr 2019)
+- test: make tests and test scripts use socksd for SOCKS
   
-  ... to make it clearer that the options want address-only, while the
-  headers in an email can also have the real name.
+  Make all SOCKS tests use socksd instead of ssh.
+
+- socksd: new SOCKS 4+5 server for tests
   
-  Assisted-by: Sean MacLennan
+  Closes #3752
 
-- THANKS: added missing names
+- singleipconnect: show port in the verbose "Trying ..." message
   
-  ... as I reran the contrithanks script after the mailmap name fixups.
+  To aid debugging better.
 
-- mailmap: added/clarified several names
+- [tmilburn brought this change]
 
-- setopt: less *or equal* than INT_MAX/1000 should be fine
+  CURLOPT_ADDRESS_SCOPE: fix range check and more
   
-  ... for the CURLOPT_TIMEOUT, CURLOPT_CONNECTTIMEOUT and
-  CURLOPT_SERVER_RESPONSE_TIMEOUT range checks.
+  Commit 9081014 fixed most of the confusing issues between scope id and
+  scope however 844896d added bad limits checking assuming that the scope
+  is being set and not the scope id.
   
-  Reported-by: Dominik Hölzl
-  Bug: https://curl.haxx.se/mail/lib-2017-12/0037.html
+  I have fixed the documentation so it all refers to scope ids.
   
-  Closes #2173
-
-- [Dmitry Kostjuchenko brought this change]
-
-  vtls: replaced getenv() with curl_getenv()
+  In addition Curl_if2ip refered to the scope id as remote_scope_id which
+  is incorrect, so I renamed it to local_scope_id.
   
-  Fixed undefined symbol of getenv() which does not exist when compiling
-  for Windows 10 App (CURL_WINDOWS_APP). Replaced getenv() with
-  curl_getenv() which is aware of getenv() absence when CURL_WINDOWS_APP
-  is defined.
+  Adjusted-by: Daniel Stenberg
   
-  Closes #2171
-
-- RELEASE-NOTES: synced with 3b9ea70ee
+  Closes #3655
+  Closes #3765
+  Fixes #3713
 
-- TODO: Expose tried IP addresses that failed
+- urlapi: stricter CURLUPART_PORT parsing
   
-  Suggested-by: Rainer Canavan
+  Only allow well formed decimal numbers in the input.
   
-  Closes #2126
-
-- curl.1: mention http:// and https:// as valid proxy prefixes
-
-- curl.1: documented two missing valid exit codes
-
-- CURLOPT_DNS_LOCAL_IP4.3: fixed the seel also to not self-reference
-
-- Revert "curl: don't set CURLOPT_INTERLEAVEDATA"
+  Document that the number MUST be between 1 and 65535.
   
-  This reverts commit 9ffad8eb1329bb35c8988115ac7ed85cf91ef955.
+  Add tests to test 1560 to verify the above.
   
-  It was actually added rather recently in 8e8afa82cbb629 due to a crash
-  that would otherwise happen in the RTSP code. As I don't think we've
-  fixed that behavior yet, we better keep this work-around until we have
-  fixed it better.
+  Ref: https://github.com/curl/curl/issues/3753
+  Closes #3762
 
-Michael Kaufmann (10 Dec 2017)
-- tests: mark data files as non-executable in git
-
-- tests: update .gitignore for libtests
+Jay Satiro (13 Apr 2019)
+- [Jan Ehrhardt brought this change]
 
-Daniel Stenberg (10 Dec 2017)
-- multi_done: prune DNS cache
+  winbuild: Support MultiSSL builds
   
-  Prune the DNS cache immediately after the dns entry is unlocked in
-  multi_done. Timed out entries will then get discarded in a more orderly
-  fashion.
+  - Remove the lines in winbuild/Makefile.vc that generate an error with
+    multiple SSL backends.
   
-  Test506 is updated
+  - Add /DCURL_WITH_MULTI_SSL in winbuild/MakefileBuild.vc if multiple SSL
+    backends are set.
   
-  Reported-by: Oleg Pudeyev
-  
-  Fixes #2169
-  Closes #2170
-
-- mailmap: fixup two old git Author "aliases"
+  Closes https://github.com/curl/curl/pull/3772
 
-Jay Satiro (10 Dec 2017)
-- openssl: Disable file buffering for Win32 SSLKEYLOGFILE
+Daniel Stenberg (12 Apr 2019)
+- travis: remove mesalink builds (temporarily?)
   
-  Prior to this change SSLKEYLOGFILE used line buffering on WIN32 just
-  like it does for other platforms. However, the Windows CRT does not
-  actually support line buffering (_IOLBF) and will use full buffering
-  (_IOFBF) instead. We can't use full buffering because multiple processes
-  may be writing to the file and that could lead to corruption, and since
-  full buffering is the only buffering available this commit disables
-  buffering for Windows SSLKEYLOGFILE entirely (_IONBF).
+  Since the mesalink build started to fail on travis, even though we build
+  a fixed release version, we disable it to prevent it from blocking
+  progress.
   
-  Ref: https://github.com/curl/curl/pull/1346#issuecomment-350530901
+  Closes #3767
 
-Daniel Stenberg (10 Dec 2017)
-- RESOLVE: output verbose text when trying to set a duplicate name
+- openssl: mark connection for close on TLS close_notify
   
-  ... to help users understand what is or isn't done!
-
-- CURLOPT_DNS_CACHE_TIMEOUT.3: see also CURLOPT_RESOLVE
-
-- [John DeHelian brought this change]
-
-  sftp: allow quoted commands to use relative paths
+  Without this, detecting and avoid reusing a closed TLS connection
+  (without a previous GOAWAY) when doing HTTP/2 is tricky.
   
-  Closes #1900
+  Reported-by: Tom van der Woerdt
+  Fixes #3750
+  Closes #3763
 
-Jay Satiro (8 Dec 2017)
-- [Richard Alcock brought this change]
+- RELEASE-NOTES: synced
 
-  CURLOPT_PRIVATE.3: fix grammar
+Steve Holme (11 Apr 2019)
+- vauth/cleartext: Update the PLAIN login function signature to match RFC 4616
   
-  - Change "never does nothing" double-negative to "never does anything".
+  Functionally this doesn't change anything as we still use the username
+  for both the authorisation identity and the authentication identity.
   
-  Closes https://github.com/curl/curl/pull/2168
+  Closes #3757
 
-Daniel Stenberg (8 Dec 2017)
-- curl: remove __EMX__ #ifdefs
+Daniel Stenberg (11 Apr 2019)
+- test1906: verify CURLOPT_CURLU + CURLOPT_PORT usage
   
-  These are OS/2-specific things added to the code in the year 2000. They
-  were always ugly. If there's any user left, they still don't need it
-  done this way.
-  
-  Closes #2166
+  Based-on-code-by: Poul T Lomholt
 
-Jay Satiro (8 Dec 2017)
-- openssl: improve data-pending check for https proxy
+- url: always clone the CUROPT_CURLU handle
   
-  - Allow proxy_ssl to be checked for pending data even when connssl does
-    not yet have an SSL handle.
+  Since a few code paths actually update that data.
   
-  This change is for posterity. Currently there doesn't seem to be a code
-  path that will cause a pending data check when proxyssl could have
-  pending data and the connssl handle doesn't yet exist [1].
+  Fixes #3753
+  Closes #3761
   
-  [1]: Recall that an https proxy connection starts out in connssl but if
-  the destination is also https then the proxy SSL backend data is moved
-  from connssl to proxyssl, which means connssl handle is temporarily
-  empty until an SSL handle for the destination can be created.
+  Reported-by: Poul T Lomholt
+
+- CURLOPT_DNS_USE_GLOBAL_CACHE: remove
   
-  Ref: https://github.com/curl/curl/commit/f4a6238#commitcomment-24396542
+  Remove the code too. The functionality has been disabled in code since
+  7.62.0. Setting this option will from now on simply be ignored and have
+  no function.
   
-  Closes https://github.com/curl/curl/pull/1916
+  Closes #3654
 
-Daniel Stenberg (8 Dec 2017)
-- curl: don't set CURLOPT_INTERLEAVEDATA
+Marcel Raad (11 Apr 2019)
+- travis: install libgnutls28-dev only for --with-gnutls build
   
-  That data is only ever used by the CURLOPT_INTERLEAVEFUNCTION callback
-  and that option isn't set or used by the curl tool!
+  Reduces the time needed for the other jobs a little.
   
-  Updates the 9 tests that verify --libcurl
-  
-  Closes #2167
+  Closes https://github.com/curl/curl/pull/3721
 
-- curl.h: remove incorrect comment about ERRORBUFFER
+- travis: install libnss3-dev only for --with-nss build
   
-  ... error messages are _not_ sent to stderr if this is not set.
-
-- [Michael Felt brought this change]
-
-  configure: add AX_CODE_COVERAGE only if using gcc
+  Reduces the time needed for the other jobs a little.
   
-  Fixes #2076
-  Closes #2125
+  Closes https://github.com/curl/curl/pull/3721
 
-- curl: limit -# update frequency for unknown total size
-  
-  Make it use a max 10Hz update frequency for this case as well. Return
-  early if the "point" hasn't moved since last invoke.
+- travis: install libssh2-dev only for --with-libssh2 build
   
-  Reported-by: Elliot Saba
+  Reduces the time needed for the other jobs a little.
   
-  Fixes #2158
-  Closes #2163
+  Closes https://github.com/curl/curl/pull/3721
 
-- BINDINGS: another PostgreSQL client
+- travis: install libssh-dev only for --with-libssh build
   
-  ...the former link is dead.
+  Reduces the time needed for the other jobs a little.
   
-  Reported-by: Frank Gevaerts
-
-- [Zachary Seguin brought this change]
+  Closes https://github.com/curl/curl/pull/3721
 
-  CONNECT: keep close connection flag in http_connect_state struct
+- travis: install krb5-user only for --with-gssapi build
   
-  Fixes #2088
-  Closes #2157
-
-- [Per Malmberg brought this change]
+  Reduces the time needed for the other jobs a little.
+  
+  Closes https://github.com/curl/curl/pull/3721
 
-  include: get netinet/in.h before linux/tcp.h
+- travis: install lcov only for the coverage job
   
-  ... to allow build on older Linux dists (specifically CentOS 4.8 on gcc
-  4.8.5)
+  Reduces the time needed for the other jobs a little.
   
-  Closes #2160
+  Closes https://github.com/curl/curl/pull/3721
 
-- openldap: fix checksrc nits
-
-- [Stepan Broz brought this change]
-
-  openldap: add commented out debug possibilities
+- travis: install clang only when needed
   
-  ... to aid debugging openldap library using its built-in debug messages.
+  This reduces the GCC job runtimes a little and it's needed to
+  selectively update clang builds to xenial.
   
-  Closes #2159
+  Closes https://github.com/curl/curl/pull/3721
 
-- examples: move threaded-shared-conn.c to the "complicated" ones
+- AppVeyor: enable testing for WinSSL build
   
-  ... due it relying on pthreads to link.
+  Closes https://github.com/curl/curl/pull/3725
 
-- RELEASE-NOTES: synced with b261c44e8
+- build: fix Codacy/CppCheck warnings
   
-  ... and bump next release version to 7.58.0
-
-- [Jan Ehrhardt brought this change]
+  - remove unused variables
+  - declare conditionally used variables conditionally
+  - suppress unused variable warnings in the CMake tests
+  - remove dead variable stores
+  - consistently use WIN32 macro to detect Windows
+  
+  Closes https://github.com/curl/curl/pull/3739
 
-  URL: tolerate backslash after drive letter for FILE:
+- polarssl_threadlock: remove conditionally unused code
   
-  ... as in "file://c:\some\path\curl.out"
+  Make functions no-ops if neither both USE_THREADS_POSIX and
+  HAVE_PTHREAD_H nor both USE_THREADS_WIN32 and HAVE_PROCESS_H are
+  defined. Previously, if only one of them was defined, there was either
+  code compiled that did nothing useful or the wrong header included for
+  the functions used.
   
-  Reviewed-by: Matthew Kerwin
-  Closes #2154
-
-- [Randall S. Becker brought this change]
+  Also, move POLARSSL_MUTEX_T define to implementation file as it's not
+  used externally.
+  
+  Closes https://github.com/curl/curl/pull/3739
 
-  tests: added netinet/in6.h includes in test servers
+- lib557: initialize variables
+  
+  These variables are only conditionally initialized.
+  
+  Closes https://github.com/curl/curl/pull/3739
 
-- [Randall S. Becker brought this change]
+- lib509: add missing include for strdup
+  
+  Closes https://github.com/curl/curl/pull/3739
 
-  configure: check for netinet/in6.h
+- README.md: fix no-consecutive-blank-lines Codacy warning
   
-  Needed by HPE NonStop NSE and NSX systems
+  Consistently use one blank line between blocks.
   
-  Fixes #2146
-  Closes #2155
+  Closes https://github.com/curl/curl/pull/3739
 
-- curl-config: add --ssl-backends
+- tests/server/util: fix Windows Unicode build
   
-  Lists all SSL backends that were enabled at build-time.
+  Always use the ANSI version of FormatMessage as we don't have the
+  curl_multibyte gear available here.
   
-  Suggested-by: Oleg Pudeyev
-  Fixes #2128
+  Closes https://github.com/curl/curl/pull/3758
 
-- conncache: only allow multiplexing within same multi handle
+Daniel Stenberg (11 Apr 2019)
+- curl_easy_getinfo.3: fix minor formatting mistake
+
+Daniel Gustafsson (11 Apr 2019)
+- xattr: skip unittest on unsupported platforms
   
-  Connections that are used for HTTP/1.1 Pipelining or HTTP/2 multiplexing
-  only get additional transfers added to them if the existing connection
-  is held by the same multi or easy handle. libcurl does not support doing
-  HTTP/2 streams in different threads using a shared connection.
+  The stripcredentials unittest fails to compile on platforms without
+  xattr support, for example the Solaris member in the buildfarm which
+  fails with the following:
   
-  Closes #2152
-
-- threaded-shared-conn.c: fixed typo in commenta
+    CC unit1621-unit1621.o
+    CC ../libtest/unit1621-first.o
+    CCLD unit1621
+    Undefined first referenced
+    symbol in file
+    stripcredentials unit1621-unit1621.o
+    goto problem 2
+    ld: fatal: symbol referencing errors. No output written to .libs/unit1621
+    collect2: error: ld returned 1 exit status
+    gmake[2]: *** [Makefile:996: unit1621] Error 1
+  
+  Fix by excluding the test on such platforms by using the reverse
+  logic from where stripcredentials() is defined.
+  
+  Closes #3759
+  Reviewed-by: Daniel Stenberg <daniel@haxx.se>
 
-- threaded-shared-conn.c: new example
+Steve Holme (11 Apr 2019)
+- emailL Added reference to RFC8314 for implicit TLS
 
-- conncache: fix several lock issues
-  
-  If the lock is released before the dealings with the bundle is over, it may
-  have changed by another thread in the mean time.
+- README: Schannel, stop calling it "winssl"
   
-  Fixes #2132
-  Fixes #2151
-  Closes #2139
+  Stick to "Schannel" everywhere - follow up to 180501cb.
 
-- libssh: remove dead code in sftp_qoute
+Jakub Zakrzewski (10 Apr 2019)
+- cmake: clear CMAKE_REQUIRED_LIBRARIES after each use
   
-  ... by removing a superfluous NULL pointer check that also confuses
-  Coverity.
+  This fixes GSSAPI builds with the libraries in a non-standard location.
+  The testing for recv() were failing because it failed to link
+  the Kerberos libraries, which are not needed for this or subsequent
+  tests.
   
-  Fixes #2143
-  Closes #2153
+  fixes #3743
+  closes #3744
 
-- sasl_getmesssage: make sure we have a long enough string to pass
+- cmake: avoid linking executable for some tests with cmake 3.6+
   
-  For pop3/imap/smtp, added test 891 to somewhat verify the pop3
-  case.
+  With CMAKE_TRY_COMPILE_TARGET_TYPE set to STATIC_LIBRARY, the try_compile()
+  (which is used by check_c_source_compiles()) will build static library
+  instead of executable. This avoids linking additional libraries in and thus
+  speeds up those checks a little.
   
-  For this, I enhanced the pingpong test server to be able to send back
-  responses with LF-only instead of always using CRLF.
+  This commit also avoids #3743 (GSSAPI build errors) on itself with cmake
+  3.6 or above. That issue was fixed separately for all versions.
   
-  Closes #2150
+  Ref: #3744
 
-- libssh2: remove dead code from SSH_SFTP_QUOTE
+- cmake: minor cleanup
   
-  Figured out while reviewing code in the libssh backend. The pointer was
-  checked for NULL after having been dereferenced, so we know it would
-  always equal true or it would've crashed.
+  - Remove nneeded include_regular_expression.
+    It was setting what is already a default.
   
-  Pointed-out-by: Nikos Mavrogiannopoulos
+  - Remove duplicated include.
   
-  Bug #2143
-  Closes #2148
+  - Don't check for pre-3.0.0 CMake version.
+    We already require at least 3.0.0, so it's just clutter.
+  
+  Ref: #3744
 
-- ssh-libssh.c: please checksrc
+Steve Holme (8 Apr 2019)
+- build-openssl.bat: Fixed support for OpenSSL v1.1.0+
 
-Nikos Mavrogiannopoulos (4 Dec 2017)
-- libssh: fixed dereference in statvfs access
-  
-  The behavior is now equivalent to ssh.c when SSH_SFTP_QUOTE_STATVFS
-  handling fails.
-  
-  Fixes #2142
+- build-openssl.bat: Perfer the use of if statements rather than goto (where possible)
 
-Daniel Stenberg (4 Dec 2017)
-- [Guitared brought this change]
+- build-openssl.bat: Perform the install for each build type directly after the build
 
-  RESOURCES: update spec names
-  
-  Closes #2145
+- build-openssl.bat: Split the install of static and shared build types
 
-Nikos Mavrogiannopoulos (3 Dec 2017)
-- libssh: corrected use of sftp_statvfs() in SSH_SFTP_QUOTE_STATVFS
-  
-  The previous code was incorrectly following the libssh2 error detection
-  for libssh2_sftp_statvfs, which is not correct for libssh's sftp_statvfs.
-  
-  Fixes #2142
-  
-  Signed-off-by: Nikos Mavrogiannopoulos <nmav@gnutls.org>
+- build-openssl.bat: Split the building of static and shared build types
 
-- libssh: no need to call sftp_get_error as ssh_get_error is sufficient
-  
-  Fixes #2141
-  
-  Signed-off-by: Nikos Mavrogiannopoulos <nmav@gnutls.org>
+- build-openssl.bat: Move the installation into a separate function
 
-Daniel Stenberg (2 Dec 2017)
-- libssh: fix minor static code analyzer nits
-  
-  - remove superfluous NULL check which otherwise tricks the static code
-  analyzers to assume NULL pointer dereferences.
+- build-openssl.bat: Move the build step into a separate function
+
+- build-openssl.bat: Move the OpenSSL configuration into a separate function
+
+- build-openssl.bat: Fixed the BUILD_CONFIG variable not being initialised
   
-  - fix fallthrough in switch()
+  Should the parent environment set this variable then the build might
+  not be performed as the user intended.
+
+Daniel Stenberg (8 Apr 2019)
+- socks: fix error message
+
+- config.d: clarify that initial : and = might need quoting [skip ci]
   
-  - indent mistake
+  Fixes #3738
+  Closes #3749
 
-- openssl: pkcs12 is supported by boringssl
+- RELEASE-NOTES: synced
   
-  Removes another #ifdef for BoringSSL
+  bumped to 7.65.0 for next release
+
+- socks5: user name and passwords must be shorter than 256
   
-  Pointed-out-by: David Benjamin
+  bytes... since the protocol needs to store the length in a single byte field.
   
-  Closes #2134
+  Reported-by: XmiliaH on github
+  Fixes #3737
+  Closes #3740
 
-- [Jay Satiro brought this change]
+- [Jakub Zakrzewski brought this change]
+
+  test: urlapi: urlencode characters above 0x7f correctly
 
-  travis: use pip2 instead of pip
+- [Jakub Zakrzewski brought this change]
+
+  urlapi: urlencode characters above 0x7f correctly
   
-  .. since now mac osx image expects pip2 or pip3, and doesn't know pip:
+  fixes #3741
+  Closes #3742
+
+- [Even Rouault brought this change]
+
+  multi_runsingle(): fix use-after-free
   
-  0.01s$ pip install --user cpp-coveralls
-  /Users/travis/.travis/job_stages: line 57: pip: command not found
+  Fixes #3745
+  Closes #3746
   
-  Ref: https://github.com/travis-ci/travis-ci/issues/8829
+  The following snippet
+  ```
   
-  Closes https://github.com/curl/curl/pull/2133
-
-- [Nikos Mavrogiannopoulos brought this change]
-
-  lib582: do not verify host for SFTP
+  int main()
+  {
+      CURL* hCurlHandle = curl_easy_init();
+      curl_easy_setopt(hCurlHandle, CURLOPT_URL, "http://example.com");
+      curl_easy_setopt(hCurlHandle, CURLOPT_PROXY, "1");
+      curl_easy_perform(hCurlHandle);
+      curl_easy_cleanup(hCurlHandle);
+      return 0;
+  }
+  ```
+  triggers the following Valgrind warning
   
-  This SFTP test fails with libssh back-end due to failure to verify
-  the peer. Disable peer verification in the test as there seems to
-  be the intention of the test.
+  ```
+  ==4125== Invalid read of size 8
+  ==4125==    at 0x4E7D1EE: Curl_llist_remove (llist.c:97)
+  ==4125==    by 0x4E7EF5C: detach_connnection (multi.c:798)
+  ==4125==    by 0x4E80545: multi_runsingle (multi.c:1451)
+  ==4125==    by 0x4E8197C: curl_multi_perform (multi.c:2072)
+  ==4125==    by 0x4E766A0: easy_transfer (easy.c:625)
+  ==4125==    by 0x4E76915: easy_perform (easy.c:719)
+  ==4125==    by 0x4E7697C: curl_easy_perform (easy.c:738)
+  ==4125==    by 0x4008BE: main (in /home/even/curl/test)
+  ==4125==  Address 0x9b3d1d0 is 1,120 bytes inside a block of size 1,600 free'd
+  ==4125==    at 0x4C2ECF0: free (vg_replace_malloc.c:530)
+  ==4125==    by 0x4E62C36: conn_free (url.c:756)
+  ==4125==    by 0x4E62D34: Curl_disconnect (url.c:818)
+  ==4125==    by 0x4E48DF9: Curl_once_resolved (hostip.c:1097)
+  ==4125==    by 0x4E8052D: multi_runsingle (multi.c:1446)
+  ==4125==    by 0x4E8197C: curl_multi_perform (multi.c:2072)
+  ==4125==    by 0x4E766A0: easy_transfer (easy.c:625)
+  ==4125==    by 0x4E76915: easy_perform (easy.c:719)
+  ==4125==    by 0x4E7697C: curl_easy_perform (easy.c:738)
+  ==4125==    by 0x4008BE: main (in /home/even/curl/test)
+  ==4125==  Block was alloc'd at
+  ==4125==    at 0x4C2F988: calloc (vg_replace_malloc.c:711)
+  ==4125==    by 0x4E6438E: allocate_conn (url.c:1654)
+  ==4125==    by 0x4E685B4: create_conn (url.c:3496)
+  ==4125==    by 0x4E6968F: Curl_connect (url.c:4023)
+  ==4125==    by 0x4E802E7: multi_runsingle (multi.c:1368)
+  ==4125==    by 0x4E8197C: curl_multi_perform (multi.c:2072)
+  ==4125==    by 0x4E766A0: easy_transfer (easy.c:625)
+  ==4125==    by 0x4E76915: easy_perform (easy.c:719)
+  ==4125==    by 0x4E7697C: curl_easy_perform (easy.c:738)
+  ==4125==    by 0x4008BE: main (in /home/even/curl/test)
+  ```
   
-  Note that the libssh back-end automatically verifies the peer's
-  host using the default known_hosts file.
+  This has been bisected to commit 2f44e94
   
-  Signed-off-by: Nikos Mavrogiannopoulos <nmav@gnutls.org>
+  Fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=14109
+  Credit to OSS Fuzz
 
-- [Nikos Mavrogiannopoulos brought this change]
-
-  libssh: added SFTP support
-  
-  The SFTP back-end supports asynchronous reading only, limited
-  to 32-bit file length. Writing is synchronous with no other
-  limitations.
+- pipelining: removed
   
-  This also brings keyboard-interactive authentication.
+  As previously planned and documented in DEPRECATE.md, all pipelining
+  code is removed.
   
-  Signed-off-by: Nikos Mavrogiannopoulos <nmav@gnutls.org>
+  Closes #3651
 
-- [Nikos Mavrogiannopoulos brought this change]
+- [cclauss brought this change]
 
-  symbols-in-versions: added new symbols with 7.56.3 version
+  tests: make Impacket (SMB server) Python 3 compatible
   
-  Signed-off-by: Nikos Mavrogiannopoulos <nmav@gnutls.org>
+  Closes #3731
+  Fixes #3289
 
-- [Nikos Mavrogiannopoulos brought this change]
+Marcel Raad (6 Apr 2019)
+- [Simon Warta brought this change]
 
-  .travis.yml: added build --with-libssh
+  cmake: set SSL_BACKENDS
   
-  Signed-off-by: Nikos Mavrogiannopoulos <nmav@redhat.com>
+  This groups all SSL backends into the feature "SSL" and sets the
+  SSL_BACKENDS analogue to configure.ac
+  
+  Closes https://github.com/curl/curl/pull/3736
 
-- [Nikos Mavrogiannopoulos brought this change]
+- [Simon Warta brought this change]
 
-  libssh2: return CURLE_UPLOAD_FAILED on failure to upload
+  cmake: don't run SORT on empty list
   
-  This brings its in sync with the error code returned by the
-  libssh backend.
+  In case of an empty list, SORTing leads to the cmake error "list
+  sub-command SORT requires list to be present."
   
-  Signed-off-by: Nikos Mavrogiannopoulos <nmav@gnutls.org>
+  Closes https://github.com/curl/curl/pull/3736
 
-- [Nikos Mavrogiannopoulos brought this change]
+Daniel Gustafsson (5 Apr 2019)
+- [Eli Schwartz brought this change]
 
-  libssh2: send the correct CURLE error code on scp file not found
+  configure: fix default location for fish completions
   
-  That also updates tests to expect the right error code
+  Fish defines a vendor completions directory for completions that are not
+  installed as part of the fish project itself, and the vendor completions
+  are preferred if they exist. This prevents trying to overwrite the
+  builtin curl.fish completion (or creating file conflicts in distro
+  packaging).
   
-  libssh2 back-end returns CURLE_SSH error if the remote file
-  is not found. Expect instead CURLE_REMOTE_FILE_NOT_FOUND
-  which is sent by the libssh backend.
+  Prefer the pkg-config defined location exported by fish, if it can be
+  found, and fall back to the correct directory defined by most systems.
   
-  Signed-off-by: Nikos Mavrogiannopoulos <nmav@redhat.com>
-
-- [Nikos Mavrogiannopoulos brought this change]
+  Closes #3723
+  Reviewed-by: Daniel Gustafsson
 
-  Added support for libssh SSH SCP back-end
+Marcel Raad (5 Apr 2019)
+- ftplistparser: fix LGTM alert "Empty block without comment"
   
-  libssh is an alternative library to libssh2.
-  https://www.libssh.org/
+  Removing the block is consistent with line 954/957.
   
-  That patch set also introduces support for ECDSA
-  ed25519 keys, as well as gssapi authentication.
+  Closes https://github.com/curl/curl/pull/3732
+
+- transfer: fix LGTM alert "Comparison is always true"
+  
+  Just remove the redundant condition, which also makes it clear that
+  k->buf is always 0-terminated if this break is not hit.
   
-  Signed-off-by: Nikos Mavrogiannopoulos <nmav@redhat.com>
+  Closes https://github.com/curl/curl/pull/3732
 
-- RELEASE-NOTES: synced with af8cc7a69
+Jay Satiro (4 Apr 2019)
+- [Rikard Falkeborn brought this change]
 
-- curlver: towards 7.57.1
+  smtp: fix compiler warning
+  
+  - Fix clang string-plus-int warning.
+  
+  Clang 8 warns about adding a string to an int does not append to the
+  string. Indeed it doesn't, but that was not the intention either. Use
+  array indexing as suggested to silence the warning. There should be no
+  functional changes.
+  
+  (In other words clang warns about "foo"+2 but not &"foo"[2] so use the
+  latter.)
+  
+  smtp.c:1221:29: warning: adding 'int' to a string does not append to the
+  string [-Wstring-plus-int]
+        eob = strdup(SMTP_EOB + 2);
+              ~~~~~~~~~~~~~~~~^~~~
+  
+  Closes https://github.com/curl/curl/pull/3729
index 15ba46e..224755a 100644 (file)
@@ -29,7 +29,7 @@ if(CURL_HIDDEN_SYMBOLS)
     set(_CFLAG_SYMBOLS_HIDE "-xldscope=hidden")
   elseif(CMAKE_C_COMPILER_ID MATCHES "Intel" AND NOT CMAKE_C_COMPILER_VERSION VERSION_LESS 9.0)
     # note: this should probably just check for version 9.1.045 but I'm not 100% sure
-    #       so let's to it the same way autotools do.
+    #       so let's do it the same way autotools do.
     set(SUPPORTS_SYMBOL_HIDING TRUE)
     set(_SYMBOL_EXTERN "__attribute__ ((__visibility__ (\"default\")))")
     set(_CFLAG_SYMBOLS_HIDE "-fvisibility=hidden")
@@ -53,7 +53,7 @@ elseif(MSVC)
     message(WARNING "Hiding private symbols regardless CURL_HIDDEN_SYMBOLS being disabled.")
     set(HIDES_CURL_PRIVATE_SYMBOLS TRUE)
   endif()
-elseif()
+else()
   set(HIDES_CURL_PRIVATE_SYMBOLS FALSE)
 endif()
 
index 9388c83..3ef35f0 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -125,6 +125,7 @@ int main(void)
 #if   defined(HAVE_GETHOSTBYADDR_R_5) || \
       defined(HAVE_GETHOSTBYADDR_R_5_REENTRANT)
   rc = gethostbyaddr_r(address, length, type, &h, &hdata);
+  (void)rc;
 #elif defined(HAVE_GETHOSTBYADDR_R_7) || \
       defined(HAVE_GETHOSTBYADDR_R_7_REENTRANT)
   hp = gethostbyaddr_r(address, length, type, &h, buffer, 8192, &h_errnop);
@@ -132,6 +133,7 @@ int main(void)
 #elif defined(HAVE_GETHOSTBYADDR_R_8) || \
       defined(HAVE_GETHOSTBYADDR_R_8_REENTRANT)
   rc = gethostbyaddr_r(address, length, type, &h, buffer, 8192, &hp, &h_errnop);
+  (void)rc;
 #endif
 
 #if   defined(HAVE_GETHOSTBYNAME_R_3) || \
@@ -240,6 +242,7 @@ int main()
 #ifndef inet_ntoa_r
   func_type func;
   func = (func_type)inet_ntoa_r;
+  (void)func;
 #endif
   return 0;
 }
@@ -255,6 +258,7 @@ int main()
 #ifndef inet_ntoa_r
   func_type func;
   func = (func_type)&inet_ntoa_r;
+  (void)func;
 #endif
   return 0;
 }
@@ -553,8 +557,8 @@ main() {
 #include <time.h>
 int
 main() {
-  struct timespec ts = {0, 0}; 
-  clock_gettime(CLOCK_MONOTONIC, &ts); 
+  struct timespec ts = {0, 0};
+  clock_gettime(CLOCK_MONOTONIC, &ts);
   return 0;
 }
 #endif
@@ -565,3 +569,49 @@ main() {
   return 0;
 }
 #endif
+#ifdef HAVE_VARIADIC_MACROS_C99
+#define c99_vmacro3(first, ...) fun3(first, __VA_ARGS__)
+#define c99_vmacro2(first, ...) fun2(first, __VA_ARGS__)
+
+int fun3(int arg1, int arg2, int arg3);
+int fun2(int arg1, int arg2);
+
+int fun3(int arg1, int arg2, int arg3) {
+  return arg1 + arg2 + arg3;
+}
+int fun2(int arg1, int arg2) {
+  return arg1 + arg2;
+}
+
+int
+main() {
+  int res3 = c99_vmacro3(1, 2, 3);
+  int res2 = c99_vmacro2(1, 2);
+  (void)res3;
+  (void)res2;
+  return 0;
+}
+#endif
+#ifdef HAVE_VARIADIC_MACROS_GCC
+#define gcc_vmacro3(first, args...) fun3(first, args)
+#define gcc_vmacro2(first, args...) fun2(first, args)
+
+int fun3(int arg1, int arg2, int arg3);
+int fun2(int arg1, int arg2);
+
+int fun3(int arg1, int arg2, int arg3) {
+  return arg1 + arg2 + arg3;
+}
+int fun2(int arg1, int arg2) {
+  return arg1 + arg2;
+}
+
+int
+main() {
+  int res3 = gcc_vmacro3(1, 2, 3);
+  int res2 = gcc_vmacro2(1, 2);
+  (void)res3;
+  (void)res2;
+  return 0;
+}
+#endif
diff --git a/CMake/FindBearSSL.cmake b/CMake/FindBearSSL.cmake
new file mode 100644 (file)
index 0000000..20d239a
--- /dev/null
@@ -0,0 +1,9 @@
+find_path(BEARSSL_INCLUDE_DIRS bearssl.h)
+
+find_library(BEARSSL_LIBRARY bearssl)
+
+include(FindPackageHandleStandardArgs)
+find_package_handle_standard_args(BEARSSL DEFAULT_MSG
+    BEARSSL_INCLUDE_DIRS BEARSSL_LIBRARY)
+
+mark_as_advanced(BEARSSL_INCLUDE_DIRS BEARSSL_LIBRARY)
index 7a637fc..a2f150c 100644 (file)
@@ -62,13 +62,14 @@ if(NOT _GSS_FOUND) #not found by pkg-config. Let's take more traditional approac
           COMMAND ${_GSS_CONFIGURE_SCRIPT} "--cflags" "gssapi"
           OUTPUT_VARIABLE _GSS_CFLAGS
           RESULT_VARIABLE _GSS_CONFIGURE_FAILED
+          OUTPUT_STRIP_TRAILING_WHITESPACE
       )
     message(STATUS "CFLAGS: ${_GSS_CFLAGS}")
     if(NOT _GSS_CONFIGURE_FAILED) # 0 means success
       # should also work in an odd case when multiple directories are given
       string(STRIP "${_GSS_CFLAGS}" _GSS_CFLAGS)
       string(REGEX REPLACE " +-I" ";" _GSS_CFLAGS "${_GSS_CFLAGS}")
-      string(REGEX REPLACE " +-([^I][^ \\t;]*)" ";-\\1"_GSS_CFLAGS "${_GSS_CFLAGS}")
+      string(REGEX REPLACE " +-([^I][^ \\t;]*)" ";-\\1" _GSS_CFLAGS "${_GSS_CFLAGS}")
 
       foreach(_flag ${_GSS_CFLAGS})
         if(_flag MATCHES "^-I.*")
@@ -84,6 +85,7 @@ if(NOT _GSS_FOUND) #not found by pkg-config. Let's take more traditional approac
         COMMAND ${_GSS_CONFIGURE_SCRIPT} "--libs" "gssapi"
         OUTPUT_VARIABLE _GSS_LIB_FLAGS
         RESULT_VARIABLE _GSS_CONFIGURE_FAILED
+        OUTPUT_STRIP_TRAILING_WHITESPACE
     )
     message(STATUS "LDFLAGS: ${_GSS_LIB_FLAGS}")
 
@@ -91,7 +93,7 @@ if(NOT _GSS_FOUND) #not found by pkg-config. Let's take more traditional approac
       # this script gives us libraries and link directories. Blah. We have to deal with it.
       string(STRIP "${_GSS_LIB_FLAGS}" _GSS_LIB_FLAGS)
       string(REGEX REPLACE " +-(L|l)" ";-\\1" _GSS_LIB_FLAGS "${_GSS_LIB_FLAGS}")
-      string(REGEX REPLACE " +-([^Ll][^ \\t;]*)" ";-\\1"_GSS_LIB_FLAGS "${_GSS_LIB_FLAGS}")
+      string(REGEX REPLACE " +-([^Ll][^ \\t;]*)" ";-\\1" _GSS_LIB_FLAGS "${_GSS_LIB_FLAGS}")
 
       foreach(_flag ${_GSS_LIB_FLAGS})
         if(_flag MATCHES "^-l.*")
@@ -110,6 +112,7 @@ if(NOT _GSS_FOUND) #not found by pkg-config. Let's take more traditional approac
         COMMAND ${_GSS_CONFIGURE_SCRIPT} "--version"
         OUTPUT_VARIABLE _GSS_VERSION
         RESULT_VARIABLE _GSS_CONFIGURE_FAILED
+        OUTPUT_STRIP_TRAILING_WHITESPACE
     )
 
     # older versions may not have the "--version" parameter. In this case we just don't care.
@@ -121,6 +124,7 @@ if(NOT _GSS_FOUND) #not found by pkg-config. Let's take more traditional approac
         COMMAND ${_GSS_CONFIGURE_SCRIPT} "--vendor"
         OUTPUT_VARIABLE _GSS_VENDOR
         RESULT_VARIABLE _GSS_CONFIGURE_FAILED
+        OUTPUT_STRIP_TRAILING_WHITESPACE
     )
 
     # older versions may not have the "--vendor" parameter. In this case we just don't care.
@@ -134,7 +138,7 @@ if(NOT _GSS_FOUND) #not found by pkg-config. Let's take more traditional approac
       endif()
     endif()
 
-  else() # either there is no config script or we are on platform that doesn't provide one (Windows?)
+  else() # either there is no config script or we are on platform that doesn't provide one (Windows?)
 
     find_path(_GSS_INCLUDE_DIR
         NAMES
@@ -164,7 +168,7 @@ if(NOT _GSS_FOUND) #not found by pkg-config. Let's take more traditional approac
         set(CMAKE_REQUIRED_DEFINITIONS "")
       endif()
     else()
-      # I'm not convienced if this is the right way but this is what autotools do at the moment
+      # I'm not convinced if this is the right way but this is what autotools do at the moment
       find_path(_GSS_INCLUDE_DIR
           NAMES
               "gssapi.h"
index ce6d3e1..c1c9aa3 100644 (file)
@@ -24,6 +24,8 @@ else()
   add_header_include(HAVE_SYS_SOCKET_H "sys/socket.h")
 endif()
 
+set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY)
+
 check_c_source_compiles("${_source_epilogue}
 int main(void) {
     recv(0, 0, 0, 0);
@@ -177,23 +179,6 @@ int main(void) {
   return 0;
 }" HAVE_STRUCT_TIMEVAL)
 
-
-include(CheckCSourceRuns)
-# See HAVE_POLL in CMakeLists.txt for why poll is disabled on macOS
-if(NOT APPLE)
-  set(CMAKE_REQUIRED_FLAGS)
-  if(HAVE_SYS_POLL_H)
-    set(CMAKE_REQUIRED_FLAGS "-DHAVE_SYS_POLL_H")
-  endif()
-  check_c_source_runs("
-    #ifdef HAVE_SYS_POLL_H
-    #  include <sys/poll.h>
-    #endif
-    int main(void) {
-      return poll((void *)0, 0, 10 /*ms*/);
-    }" HAVE_POLL_FINE)
-endif()
-
 set(HAVE_SIG_ATOMIC_T 1)
 set(CMAKE_REQUIRED_FLAGS)
 if(HAVE_SIGNAL_H)
@@ -229,3 +214,51 @@ check_type_size("struct sockaddr_storage" SIZEOF_STRUCT_SOCKADDR_STORAGE)
 if(HAVE_SIZEOF_STRUCT_SOCKADDR_STORAGE)
   set(HAVE_STRUCT_SOCKADDR_STORAGE 1)
 endif()
+
+unset(CMAKE_TRY_COMPILE_TARGET_TYPE)
+
+if(NOT DEFINED CMAKE_TOOLCHAIN_FILE)
+  # if not cross-compilation...
+  include(CheckCSourceRuns)
+  set(CMAKE_REQUIRED_FLAGS "")
+  if(HAVE_SYS_POLL_H)
+    set(CMAKE_REQUIRED_FLAGS "-DHAVE_SYS_POLL_H")
+  elseif(HAVE_POLL_H)
+    set(CMAKE_REQUIRED_FLAGS "-DHAVE_POLL_H")
+  endif()
+  check_c_source_runs("
+    #include <stdlib.h>
+    #include <sys/time.h>
+
+    #ifdef HAVE_SYS_POLL_H
+    #  include <sys/poll.h>
+    #elif  HAVE_POLL_H
+    #  include <poll.h>
+    #endif
+
+    int main(void)
+    {
+        if(0 != poll(0, 0, 10)) {
+          return 1; /* fail */
+        }
+        else {
+          /* detect the 10.12 poll() breakage */
+          struct timeval before, after;
+          int rc;
+          size_t us;
+
+          gettimeofday(&before, NULL);
+          rc = poll(NULL, 0, 500);
+          gettimeofday(&after, NULL);
+
+          us = (after.tv_sec - before.tv_sec) * 1000000 +
+            (after.tv_usec - before.tv_usec);
+
+          if(us < 400000) {
+            return 1;
+          }
+        }
+        return 0;
+    }" HAVE_POLL_FINE)
+endif()
+
index cafaec2..ead4115 100644 (file)
@@ -7,7 +7,6 @@ if(NOT UNIX)
     set(HAVE_LIBNSL 0)
     set(HAVE_GETHOSTNAME 1)
     set(HAVE_LIBZ 0)
-    set(HAVE_LIBCRYPTO 0)
 
     set(HAVE_DLOPEN 0)
 
index a3c17c4..cb78921 100644 (file)
@@ -5,7 +5,7 @@
 #                            | (__| |_| |  _ <| |___
 #                             \___|\___/|_| \_\_____|
 #
-# Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 #
 # This software is licensed as described in the file COPYING, which
 # you should have received as part of this distribution. The terms
@@ -57,7 +57,6 @@ string(REGEX MATCH "#define LIBCURL_VERSION_NUM 0x[0-9a-fA-F]+"
   CURL_VERSION_NUM ${CURL_VERSION_H_CONTENTS})
 string(REGEX REPLACE "[^0]+0x" "" CURL_VERSION_NUM ${CURL_VERSION_NUM})
 
-include_regular_expression("^.*$")    # Sukender: Is it necessary?
 
 # Setup package meta-data
 # SET(PACKAGE "curl")
@@ -70,7 +69,6 @@ message(STATUS "curl version=[${CURL_VERSION}]")
 set(OPERATING_SYSTEM "${CMAKE_SYSTEM_NAME}")
 set(OS "\"${CMAKE_SYSTEM_NAME}\"")
 
-include_directories(${PROJECT_BINARY_DIR}/include/curl)
 include_directories(${CURL_SOURCE_DIR}/include)
 
 option(CURL_WERROR "Turn compiler warnings into errors" OFF)
@@ -105,11 +103,7 @@ endif()
 
 if(ENABLE_DEBUG)
   # DEBUGBUILD will be defined only for Debug builds
-  if(NOT CMAKE_VERSION VERSION_LESS 3.0)
-    set_property(DIRECTORY APPEND PROPERTY COMPILE_DEFINITIONS $<$<CONFIG:Debug>:DEBUGBUILD>)
-  else()
-    set_property(DIRECTORY APPEND PROPERTY COMPILE_DEFINITIONS_DEBUG DEBUGBUILD)
-  endif()
+  set_property(DIRECTORY APPEND PROPERTY COMPILE_DEFINITIONS $<$<CONFIG:Debug>:DEBUGBUILD>)
   set(ENABLE_CURLDEBUG ON)
 endif()
 
@@ -240,6 +234,7 @@ if(${CMAKE_SYSTEM_NAME} MATCHES AIX)
 endif()
 
 # Include all the necessary files for macros
+include(CMakePushCheckState)
 include(CheckFunctionExists)
 include(CheckIncludeFile)
 include(CheckIncludeFiles)
@@ -247,7 +242,6 @@ include(CheckLibraryExists)
 include(CheckSymbolExists)
 include(CheckTypeSize)
 include(CheckCSourceCompiles)
-include(CMakeDependentOption)
 
 # On windows preload settings
 if(WIN32)
@@ -267,7 +261,7 @@ if(ENABLE_THREADED_RESOLVER)
 endif()
 
 # Check for all needed libraries
-check_library_exists_concat("dl"     dlopen       HAVE_LIBDL)
+check_library_exists_concat("${CMAKE_DL_LIBS}" dlopen HAVE_LIBDL)
 check_library_exists_concat("socket" connect      HAVE_LIBSOCKET)
 check_library_exists("c" gethostbyname "" NOT_NEED_LIBNSL)
 
@@ -291,10 +285,10 @@ if(WIN32)
 endif()
 
 # check SSL libraries
-# TODO support GNUTLS, NSS, POLARSSL, AXTLS, CYASSL
+# TODO support GNUTLS, POLARSSL, CYASSL
 
 if(APPLE)
-  option(CMAKE_USE_DARWINSSL "enable Apple OS native SSL/TLS" OFF)
+  option(CMAKE_USE_SECTRANSP "enable Apple OS native SSL/TLS" OFF)
 endif()
 if(WIN32)
   option(CMAKE_USE_WINSSL "enable Windows native SSL/TLS" OFF)
@@ -302,18 +296,22 @@ if(WIN32)
     CMAKE_USE_WINSSL OFF)
 endif()
 option(CMAKE_USE_MBEDTLS "Enable mbedTLS for SSL/TLS" OFF)
+option(CMAKE_USE_BEARSSL "Enable BearSSL for SSL/TLS" OFF)
+option(CMAKE_USE_NSS "Enable NSS for SSL/TLS" OFF)
 
 set(openssl_default ON)
-if(WIN32 OR CMAKE_USE_DARWINSSL OR CMAKE_USE_WINSSL OR CMAKE_USE_MBEDTLS)
+if(WIN32 OR CMAKE_USE_SECTRANSP OR CMAKE_USE_WINSSL OR CMAKE_USE_MBEDTLS OR CMAKE_USE_NSS)
   set(openssl_default OFF)
 endif()
 option(CMAKE_USE_OPENSSL "Use OpenSSL code. Experimental" ${openssl_default})
 
 count_true(enabled_ssl_options_count
   CMAKE_USE_WINSSL
-  CMAKE_USE_DARWINSSL
+  CMAKE_USE_SECTRANSP
   CMAKE_USE_OPENSSL
   CMAKE_USE_MBEDTLS
+  CMAKE_USE_BEARSSL
+  CMAKE_USE_NSS
 )
 if(enabled_ssl_options_count GREATER "1")
   set(CURL_WITH_MULTI_SSL ON)
@@ -331,6 +329,10 @@ if(CURL_WINDOWS_SSPI)
 endif()
 
 if(CMAKE_USE_DARWINSSL)
+  message(FATAL_ERROR "The cmake option CMAKE_USE_DARWINSSL was renamed to CMAKE_USE_SECTRANSP.")
+endif()
+
+if(CMAKE_USE_SECTRANSP)
   find_library(COREFOUNDATION_FRAMEWORK "CoreFoundation")
   if(NOT COREFOUNDATION_FRAMEWORK)
       message(FATAL_ERROR "CoreFoundation framework not found")
@@ -342,7 +344,7 @@ if(CMAKE_USE_DARWINSSL)
   endif()
 
   set(SSL_ENABLED ON)
-  set(USE_DARWINSSL ON)
+  set(USE_SECTRANSP ON)
   list(APPEND CURL_LIBS "${COREFOUNDATION_FRAMEWORK}" "${SECURITY_FRAMEWORK}")
 endif()
 
@@ -350,8 +352,6 @@ if(CMAKE_USE_OPENSSL)
   find_package(OpenSSL REQUIRED)
   set(SSL_ENABLED ON)
   set(USE_OPENSSL ON)
-  set(HAVE_LIBCRYPTO ON)
-  set(HAVE_LIBSSL ON)
 
   # Depend on OpenSSL via imported targets if supported by the running
   # version of CMake.  This allows our dependents to get our dependencies
@@ -384,6 +384,27 @@ if(CMAKE_USE_MBEDTLS)
   include_directories(${MBEDTLS_INCLUDE_DIRS})
 endif()
 
+if(CMAKE_USE_BEARSSL)
+  find_package(BearSSL REQUIRED)
+  set(SSL_ENABLED ON)
+  set(USE_BEARSSL ON)
+  list(APPEND CURL_LIBS ${BEARSSL_LIBRARY})
+  include_directories(${BEARSSL_INCLUDE_DIRS})
+endif()
+
+if(CMAKE_USE_NSS)
+  find_package(NSS REQUIRED)
+  include_directories(${NSS_INCLUDE_DIRS})
+  list(APPEND CURL_LIBS ${NSS_LIBRARIES})
+  set(SSL_ENABLED ON)
+  set(USE_NSS ON)
+  cmake_push_check_state()
+  set(CMAKE_REQUIRED_INCLUDES ${NSS_INCLUDE_DIRS})
+  set(CMAKE_REQUIRED_LIBRARIES ${NSS_LIBRARIES})
+  check_symbol_exists(PK11_CreateManagedGenericObject "pk11pub.h" HAVE_PK11_CREATEMANAGEDGENERICOBJECT)
+  cmake_pop_check_state()
+endif()
+
 option(USE_NGHTTP2 "Use Nghttp2 library" OFF)
 if(USE_NGHTTP2)
   find_package(NGHTTP2 REQUIRED)
@@ -476,6 +497,7 @@ if(NOT CURL_DISABLE_LDAP)
         list(APPEND CMAKE_REQUIRED_LIBRARIES ${CMAKE_LBER_LIB})
       endif()
       check_c_source_compiles("${_SRC_STRING}" NOT_NEED_LBER_H)
+      unset(CMAKE_REQUIRED_LIBRARIES)
 
       if(NOT_NEED_LBER_H)
         set(NEED_LBER_H OFF)
@@ -532,7 +554,7 @@ endif()
 option(CURL_BROTLI "Set to ON to enable building curl with brotli support." OFF)
 set(HAVE_BROTLI OFF)
 if(CURL_BROTLI)
-  find_package(BROTLI QUIET)
+  find_package(Brotli QUIET)
   if(BROTLI_FOUND)
     set(HAVE_BROTLI ON)
     list(APPEND CURL_LIBS ${BROTLI_LIBRARIES})
@@ -571,6 +593,7 @@ if(CMAKE_USE_LIBSSH2)
     check_function_exists(libssh2_scp_send64        HAVE_LIBSSH2_SCP_SEND64)
     check_function_exists(libssh2_session_handshake HAVE_LIBSSH2_SESSION_HANDSHAKE)
     set(CMAKE_EXTRA_INCLUDE_FILES "")
+    unset(CMAKE_REQUIRED_LIBRARIES)
   endif()
 endif()
 
@@ -585,7 +608,7 @@ if(CMAKE_USE_GSSAPI)
 
     message(STATUS "Found ${GSS_FLAVOUR} GSSAPI version: \"${GSS_VERSION}\"")
 
-    list(APPEND CMAKE_REQUIRED_INCLUDES ${GSS_INCLUDE_DIRECTORIES})
+    list(APPEND CMAKE_REQUIRED_INCLUDES ${GSS_INCLUDE_DIR})
     check_include_file_concat("gssapi/gssapi.h"  HAVE_GSSAPI_GSSAPI_H)
     check_include_file_concat("gssapi/gssapi_generic.h" HAVE_GSSAPI_GSSAPI_GENERIC_H)
     check_include_file_concat("gssapi/gssapi_krb5.h" HAVE_GSSAPI_GSSAPI_KRB5_H)
@@ -618,10 +641,11 @@ if(CMAKE_USE_GSSAPI)
       if(NOT HAVE_GSS_C_NT_HOSTBASED_SERVICE)
         set(HAVE_OLD_GSSMIT ON)
       endif()
+      unset(CMAKE_REQUIRED_LIBRARIES)
 
     endif()
 
-    include_directories(${GSS_INCLUDE_DIRECTORIES})
+    include_directories(${GSS_INCLUDE_DIR})
     link_directories(${GSS_LINK_DIRECTORIES})
     set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${GSS_COMPILER_FLAGS}")
     set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${GSS_LINKER_FLAGS}")
@@ -668,7 +692,9 @@ elseif("${CURL_CA_PATH}" STREQUAL "none")
   unset(CURL_CA_PATH CACHE)
 elseif("${CURL_CA_PATH}" STREQUAL "auto")
   unset(CURL_CA_PATH CACHE)
-  set(CURL_CA_PATH_AUTODETECT TRUE)
+  if(NOT USE_NSS)
+    set(CURL_CA_PATH_AUTODETECT TRUE)
+  endif()
 else()
   set(CURL_CA_PATH_SET TRUE)
 endif()
@@ -828,12 +854,8 @@ endif()
 
 check_symbol_exists(basename      "${CURL_INCLUDES}" HAVE_BASENAME)
 check_symbol_exists(socket        "${CURL_INCLUDES}" HAVE_SOCKET)
-# poll on macOS is unreliable, it first did not exist, then was broken until
-# fixed in 10.9 only to break again in 10.12.
-if(NOT APPLE)
-  check_symbol_exists(poll        "${CURL_INCLUDES}" HAVE_POLL)
-endif()
 check_symbol_exists(select        "${CURL_INCLUDES}" HAVE_SELECT)
+check_symbol_exists(poll          "${CURL_INCLUDES}" HAVE_POLL)
 check_symbol_exists(strdup        "${CURL_INCLUDES}" HAVE_STRDUP)
 check_symbol_exists(strstr        "${CURL_INCLUDES}" HAVE_STRSTR)
 check_symbol_exists(strtok_r      "${CURL_INCLUDES}" HAVE_STRTOK_R)
@@ -864,6 +886,7 @@ check_symbol_exists(strlcat       "${CURL_INCLUDES}" HAVE_STRLCAT)
 check_symbol_exists(getpwuid      "${CURL_INCLUDES}" HAVE_GETPWUID)
 check_symbol_exists(getpwuid_r    "${CURL_INCLUDES}" HAVE_GETPWUID_R)
 check_symbol_exists(geteuid       "${CURL_INCLUDES}" HAVE_GETEUID)
+check_symbol_exists(usleep        "${CURL_INCLUDES}" HAVE_USLEEP)
 check_symbol_exists(utime         "${CURL_INCLUDES}" HAVE_UTIME)
 check_symbol_exists(gmtime_r      "${CURL_INCLUDES}" HAVE_GMTIME_R)
 check_symbol_exists(localtime_r   "${CURL_INCLUDES}" HAVE_LOCALTIME_R)
@@ -889,6 +912,9 @@ check_symbol_exists(freeifaddrs    "${CURL_INCLUDES}" HAVE_FREEIFADDRS)
 check_symbol_exists(pipe           "${CURL_INCLUDES}" HAVE_PIPE)
 check_symbol_exists(ftruncate      "${CURL_INCLUDES}" HAVE_FTRUNCATE)
 check_symbol_exists(getprotobyname "${CURL_INCLUDES}" HAVE_GETPROTOBYNAME)
+check_symbol_exists(getpeername    "${CURL_INCLUDES}" HAVE_GETPEERNAME)
+check_symbol_exists(getsockname    "${CURL_INCLUDES}" HAVE_GETSOCKNAME)
+check_symbol_exists(if_nametoindex "${CURL_INCLUDES}" HAVE_IF_NAMETOINDEX)
 check_symbol_exists(getrlimit      "${CURL_INCLUDES}" HAVE_GETRLIMIT)
 check_symbol_exists(setlocale      "${CURL_INCLUDES}" HAVE_SETLOCALE)
 check_symbol_exists(setmode        "${CURL_INCLUDES}" HAVE_SETMODE)
@@ -972,6 +998,8 @@ foreach(CURL_TEST
     HAVE_INET_NTOA_R_DECL_REENTRANT
     HAVE_GETADDRINFO
     HAVE_FILE_OFFSET_BITS
+    HAVE_VARIADIC_MACROS_C99
+    HAVE_VARIADIC_MACROS_GCC
     )
   curl_internal_test(${CURL_TEST})
 endforeach()
@@ -1133,7 +1161,7 @@ if(CURL_WERROR)
 endif()
 
 # Ugly (but functional) way to include "Makefile.inc" by transforming it (= regenerate it).
-function(TRANSFORM_MAKEFILE_INC INPUT_FILE OUTPUT_FILE)
+function(transform_makefile_inc INPUT_FILE OUTPUT_FILE)
   file(READ ${INPUT_FILE} MAKEFILE_INC_TEXT)
   string(REPLACE "$(top_srcdir)"   "\${CURL_SOURCE_DIR}" MAKEFILE_INC_TEXT ${MAKEFILE_INC_TEXT})
   string(REPLACE "$(top_builddir)" "\${CURL_BINARY_DIR}" MAKEFILE_INC_TEXT ${MAKEFILE_INC_TEXT})
@@ -1182,10 +1210,7 @@ endfunction()
 
 # Clear list and try to detect available features
 set(_items)
-_add_if("WinSSL"        SSL_ENABLED AND USE_WINDOWS_SSPI)
-_add_if("OpenSSL"       SSL_ENABLED AND USE_OPENSSL)
-_add_if("DarwinSSL"     SSL_ENABLED AND USE_DARWINSSL)
-_add_if("mbedTLS"       SSL_ENABLED AND USE_MBEDTLS)
+_add_if("SSL"           SSL_ENABLED)
 _add_if("IPv6"          ENABLE_IPV6)
 _add_if("unix-sockets"  USE_UNIX_SOCKETS)
 _add_if("libz"          HAVE_LIBZ)
@@ -1203,7 +1228,7 @@ _add_if("Kerberos"      NOT CURL_DISABLE_CRYPTO_AUTH AND
                         (HAVE_GSSAPI OR USE_WINDOWS_SSPI))
 # NTLM support requires crypto function adaptions from various SSL libs
 # TODO alternative SSL libs tests for SSP1, GNUTLS, NSS
-if(NOT CURL_DISABLE_CRYPTO_AUTH AND (USE_OPENSSL OR USE_WINDOWS_SSPI OR USE_DARWINSSL OR USE_MBEDTLS))
+if(NOT CURL_DISABLE_CRYPTO_AUTH AND (USE_OPENSSL OR USE_WINDOWS_SSPI OR USE_SECTRANSP OR USE_MBEDTLS OR USE_NSS))
   _add_if("NTLM"        1)
   # TODO missing option (autoconf: --enable-ntlm-wb)
   _add_if("NTLM_WB"     NOT CURL_DISABLE_HTTP AND NTLM_WB_ENABLED)
@@ -1242,10 +1267,26 @@ _add_if("SCP"           USE_LIBSSH2)
 _add_if("SFTP"          USE_LIBSSH2)
 _add_if("RTSP"          NOT CURL_DISABLE_RTSP)
 _add_if("RTMP"          USE_LIBRTMP)
-list(SORT _items)
+if(_items)
+  list(SORT _items)
+endif()
 string(REPLACE ";" " " SUPPORT_PROTOCOLS "${_items}")
 message(STATUS "Enabled protocols: ${SUPPORT_PROTOCOLS}")
 
+# Clear list and collect SSL backends
+set(_items)
+_add_if("WinSSL"           SSL_ENABLED AND USE_WINDOWS_SSPI)
+_add_if("OpenSSL"          SSL_ENABLED AND USE_OPENSSL)
+_add_if("Secure Transport" SSL_ENABLED AND USE_SECTRANSP)
+_add_if("mbedTLS"          SSL_ENABLED AND USE_MBEDTLS)
+_add_if("BearSSL"          SSL_ENABLED AND USE_BEARSSL)
+_add_if("NSS"              SSL_ENABLED AND USE_NSS)
+if(_items)
+  list(SORT _items)
+endif()
+string(REPLACE ";" " " SSL_BACKENDS "${_items}")
+message(STATUS "Enabled SSL backends: ${SSL_BACKENDS}")
+
 # curl-config needs the following options to be set.
 set(CC                      "${CMAKE_C_COMPILER}")
 # TODO probably put a -D... options here?
diff --git a/COPYING b/COPYING
index 560a49d..9d9e4af 100644 (file)
--- a/COPYING
+++ b/COPYING
@@ -1,6 +1,6 @@
 COPYRIGHT AND PERMISSION NOTICE
 
-Copyright (c) 1996 - 2018, Daniel Stenberg, <daniel@haxx.se>, and many
+Copyright (c) 1996 - 2020, Daniel Stenberg, <daniel@haxx.se>, and many
 contributors, see the THANKS file.
 
 All rights reserved.
index debec9a..1e9ecd8 100644 (file)
@@ -30,8 +30,8 @@ CMAKE_DIST = CMakeLists.txt CMake/CMakeConfigurableFile.in      \
  CMake/Macros.cmake              \
  CMake/CurlSymbolHiding.cmake CMake/FindCARES.cmake             \
  CMake/FindLibSSH2.cmake CMake/FindNGHTTP2.cmake                \
- CMake/FindMbedTLS.cmake CMake/cmake_uninstall.cmake.in         \
- CMake/curl-config.cmake.in
+ CMake/FindMbedTLS.cmake CMake/FindBearSSL.cmake                \
+ CMake/cmake_uninstall.cmake.in CMake/curl-config.cmake.in
 
 VC6_LIBTMPL = projects/Windows/VC6/lib/libcurl.tmpl
 VC6_LIBDSP = projects/Windows/VC6/lib/libcurl.dsp.dist
@@ -154,10 +154,21 @@ VC_DIST = projects/README                           \
 WINBUILD_DIST = winbuild/BUILD.WINDOWS.txt winbuild/gen_resp_file.bat \
  winbuild/MakefileBuild.vc winbuild/Makefile.vc
 
+PLAN9_DIST = plan9/include/mkfile \
+ plan9/include/mkfile             \
+ plan9/mkfile.proto               \
+ plan9/mkfile                     \
+ plan9/BUILD.PLAN9.txt            \
+ plan9/lib/mkfile.inc             \
+ plan9/lib/mkfile                 \
+ plan9/src/mkfile.inc             \
+ plan9/src/mkfile
+
 EXTRA_DIST = CHANGES COPYING maketgz Makefile.dist curl-config.in \
- RELEASE-NOTES buildconf libcurl.pc.in MacOSX-Framework scripts/zsh.pl \
- scripts/updatemanpages.pl $(CMAKE_DIST) $(VC_DIST) $(WINBUILD_DIST) \
- lib/libcurl.vers.in buildconf.bat scripts/coverage.sh
+ RELEASE-NOTES buildconf libcurl.pc.in MacOSX-Framework \
+ scripts/updatemanpages.pl $(CMAKE_DIST) \
+ $(VC_DIST) $(WINBUILD_DIST) $(PLAN9_DIST) \
+ lib/libcurl.vers.in buildconf.bat scripts/coverage.sh scripts/completion.pl
 
 CLEANFILES = $(VC6_LIBDSP) $(VC6_SRCDSP) $(VC7_LIBVCPROJ) $(VC7_SRCVCPROJ) \
  $(VC71_LIBVCPROJ) $(VC71_SRCVCPROJ) $(VC8_LIBVCPROJ) $(VC8_SRCVCPROJ) \
@@ -317,6 +328,10 @@ vc-ide: $(VC6_LIBDSP_DEPS) $(VC6_SRCDSP_DEPS) $(VC7_LIBVCPROJ_DEPS) \
        win32_lib_rc='$(LIB_RCFILES)'; \
        win32_lib_vauth_srcs='$(LIB_VAUTH_CFILES)'; \
        win32_lib_vauth_hdrs='$(LIB_VAUTH_HFILES)'; \
+       win32_lib_vquic_srcs='$(LIB_VQUIC_CFILES)'; \
+       win32_lib_vquic_hdrs='$(LIB_VQUIC_HFILES)'; \
+       win32_lib_vssh_srcs='$(LIB_VSSH_CFILES)'; \
+       win32_lib_vssh_hdrs='$(LIB_VSSH_HFILES)'; \
        win32_lib_vtls_srcs='$(LIB_VTLS_CFILES)'; \
        win32_lib_vtls_hdrs='$(LIB_VTLS_HFILES)'; \
        win32_src_srcs='$(CURL_CFILES)'; \
@@ -329,6 +344,10 @@ vc-ide: $(VC6_LIBDSP_DEPS) $(VC6_SRCDSP_DEPS) $(VC7_LIBVCPROJ_DEPS) \
        sorted_lib_hdrs=`for file in $$win32_lib_hdrs; do echo $$file; done | sort`; \
        sorted_lib_vauth_srcs=`for file in $$win32_lib_vauth_srcs; do echo $$file; done | sort`; \
        sorted_lib_vauth_hdrs=`for file in $$win32_lib_vauth_hdrs; do echo $$file; done | sort`; \
+       sorted_lib_vquic_srcs=`for file in $$win32_lib_vquic_srcs; do echo $$file; done | sort`; \
+       sorted_lib_vquic_hdrs=`for file in $$win32_lib_vquic_hdrs; do echo $$file; done | sort`; \
+       sorted_lib_vssh_srcs=`for file in $$win32_lib_vssh_srcs; do echo $$file; done | sort`; \
+       sorted_lib_vssh_hdrs=`for file in $$win32_lib_vssh_hdrs; do echo $$file; done | sort`; \
        sorted_lib_vtls_srcs=`for file in $$win32_lib_vtls_srcs; do echo $$file; done | sort`; \
        sorted_lib_vtls_hdrs=`for file in $$win32_lib_vtls_hdrs; do echo $$file; done | sort`; \
        sorted_src_srcs=`for file in $$win32_src_srcs; do echo $$file; done | sort`; \
@@ -340,10 +359,15 @@ vc-ide: $(VC6_LIBDSP_DEPS) $(VC6_SRCDSP_DEPS) $(VC7_LIBVCPROJ_DEPS) \
 function gen_element(type, dir, file)\
 {\
   sub(/vauth\//, "", file);\
+  sub(/vquic\//, "", file);\
+  sub(/vssh\//, "", file);\
   sub(/vtls\//, "", file);\
 \
   spaces="    ";\
-  if(dir == "lib\\vauth" || dir == "lib\\vtls")\
+  if(dir == "lib\\vauth" ||\
+     dir == "lib\\vquic" ||\
+     dir == "lib\\vssh"  ||\
+     dir == "lib\\vtls")\
     tabs="                             ";\
   else\
     tabs="                     ";\
@@ -405,6 +429,22 @@ function gen_element(type, dir, file)\
     split(lib_vauth_hdrs, arr);\
     for(val in arr) gen_element(proj_type, "lib\\vauth", arr[val]);\
   }\
+  else if($$0 == "CURL_LIB_VQUIC_C_FILES") {\
+    split(lib_vquic_srcs, arr);\
+    for(val in arr) gen_element(proj_type, "lib\\vquic", arr[val]);\
+  }\
+  else if($$0 == "CURL_LIB_VQUIC_H_FILES") {\
+    split(lib_vquic_hdrs, arr);\
+    for(val in arr) gen_element(proj_type, "lib\\vquic", arr[val]);\
+  }\
+  else if($$0 == "CURL_LIB_VSSH_C_FILES") {\
+    split(lib_vssh_srcs, arr);\
+    for(val in arr) gen_element(proj_type, "lib\\vssh", arr[val]);\
+  }\
+  else if($$0 == "CURL_LIB_VSSH_H_FILES") {\
+    split(lib_vssh_hdrs, arr);\
+    for(val in arr) gen_element(proj_type, "lib\\vssh", arr[val]);\
+  }\
   else if($$0 == "CURL_LIB_VTLS_C_FILES") {\
     split(lib_vtls_srcs, arr);\
     for(val in arr) gen_element(proj_type, "lib\\vtls", arr[val]);\
@@ -450,6 +490,10 @@ function gen_element(type, dir, file)\
                -v lib_rc="$$win32_lib_rc" \
                -v lib_vauth_srcs="$$sorted_lib_vauth_srcs" \
                -v lib_vauth_hdrs="$$sorted_lib_vauth_hdrs" \
+               -v lib_vquic_srcs="$$sorted_lib_vquic_srcs" \
+               -v lib_vquic_hdrs="$$sorted_lib_vquic_hdrs" \
+               -v lib_vssh_srcs="$$sorted_lib_vssh_srcs" \
+               -v lib_vssh_hdrs="$$sorted_lib_vssh_hdrs" \
                -v lib_vtls_srcs="$$sorted_lib_vtls_srcs" \
                -v lib_vtls_hdrs="$$sorted_lib_vtls_hdrs" \
                "$$awk_code" $(srcdir)/$(VC6_LIBTMPL) > $(VC6_LIBDSP) || { exit 1; }; \
@@ -470,6 +514,10 @@ function gen_element(type, dir, file)\
                -v lib_rc="$$win32_lib_rc" \
                -v lib_vauth_srcs="$$sorted_lib_vauth_srcs" \
                -v lib_vauth_hdrs="$$sorted_lib_vauth_hdrs" \
+               -v lib_vquic_srcs="$$sorted_lib_vquic_srcs" \
+               -v lib_vquic_hdrs="$$sorted_lib_vquic_hdrs" \
+               -v lib_vssh_srcs="$$sorted_lib_vssh_srcs" \
+               -v lib_vssh_hdrs="$$sorted_lib_vssh_hdrs" \
                -v lib_vtls_srcs="$$sorted_lib_vtls_srcs" \
                -v lib_vtls_hdrs="$$sorted_lib_vtls_hdrs" \
                "$$awk_code" $(srcdir)/$(VC7_LIBTMPL) > $(VC7_LIBVCPROJ) || { exit 1; }; \
@@ -490,6 +538,10 @@ function gen_element(type, dir, file)\
                -v lib_rc="$$win32_lib_rc" \
                -v lib_vauth_srcs="$$sorted_lib_vauth_srcs" \
                -v lib_vauth_hdrs="$$sorted_lib_vauth_hdrs" \
+               -v lib_vquic_srcs="$$sorted_lib_vquic_srcs" \
+               -v lib_vquic_hdrs="$$sorted_lib_vquic_hdrs" \
+               -v lib_vssh_srcs="$$sorted_lib_vssh_srcs" \
+               -v lib_vssh_hdrs="$$sorted_lib_vssh_hdrs" \
                -v lib_vtls_srcs="$$sorted_lib_vtls_srcs" \
                -v lib_vtls_hdrs="$$sorted_lib_vtls_hdrs" \
                "$$awk_code" $(srcdir)/$(VC71_LIBTMPL) > $(VC71_LIBVCPROJ) || { exit 1; }; \
@@ -510,6 +562,10 @@ function gen_element(type, dir, file)\
                -v lib_rc="$$win32_lib_rc" \
                -v lib_vauth_srcs="$$sorted_lib_vauth_srcs" \
                -v lib_vauth_hdrs="$$sorted_lib_vauth_hdrs" \
+               -v lib_vquic_srcs="$$sorted_lib_vquic_srcs" \
+               -v lib_vquic_hdrs="$$sorted_lib_vquic_hdrs" \
+               -v lib_vssh_srcs="$$sorted_lib_vssh_srcs" \
+               -v lib_vssh_hdrs="$$sorted_lib_vssh_hdrs" \
                -v lib_vtls_srcs="$$sorted_lib_vtls_srcs" \
                -v lib_vtls_hdrs="$$sorted_lib_vtls_hdrs" \
                "$$awk_code" $(srcdir)/$(VC8_LIBTMPL) > $(VC8_LIBVCPROJ) || { exit 1; }; \
@@ -530,6 +586,10 @@ function gen_element(type, dir, file)\
                -v lib_rc="$$win32_lib_rc" \
                -v lib_vauth_srcs="$$sorted_lib_vauth_srcs" \
                -v lib_vauth_hdrs="$$sorted_lib_vauth_hdrs" \
+               -v lib_vquic_srcs="$$sorted_lib_vquic_srcs" \
+               -v lib_vquic_hdrs="$$sorted_lib_vquic_hdrs" \
+               -v lib_vssh_srcs="$$sorted_lib_vssh_srcs" \
+               -v lib_vssh_hdrs="$$sorted_lib_vssh_hdrs" \
                -v lib_vtls_srcs="$$sorted_lib_vtls_srcs" \
                -v lib_vtls_hdrs="$$sorted_lib_vtls_hdrs" \
                "$$awk_code" $(srcdir)/$(VC9_LIBTMPL) > $(VC9_LIBVCPROJ) || { exit 1; }; \
@@ -550,6 +610,10 @@ function gen_element(type, dir, file)\
                -v lib_rc="$$win32_lib_rc" \
                -v lib_vauth_srcs="$$sorted_lib_vauth_srcs" \
                -v lib_vauth_hdrs="$$sorted_lib_vauth_hdrs" \
+               -v lib_vquic_srcs="$$sorted_lib_vquic_srcs" \
+               -v lib_vquic_hdrs="$$sorted_lib_vquic_hdrs" \
+               -v lib_vssh_srcs="$$sorted_lib_vssh_srcs" \
+               -v lib_vssh_hdrs="$$sorted_lib_vssh_hdrs" \
                -v lib_vtls_srcs="$$sorted_lib_vtls_srcs" \
                -v lib_vtls_hdrs="$$sorted_lib_vtls_hdrs" \
                "$$awk_code" $(srcdir)/$(VC10_LIBTMPL) > $(VC10_LIBVCXPROJ) || { exit 1; }; \
@@ -570,6 +634,10 @@ function gen_element(type, dir, file)\
                -v lib_rc="$$win32_lib_rc" \
                -v lib_vauth_srcs="$$sorted_lib_vauth_srcs" \
                -v lib_vauth_hdrs="$$sorted_lib_vauth_hdrs" \
+               -v lib_vquic_srcs="$$sorted_lib_vquic_srcs" \
+               -v lib_vquic_hdrs="$$sorted_lib_vquic_hdrs" \
+               -v lib_vssh_srcs="$$sorted_lib_vssh_srcs" \
+               -v lib_vssh_hdrs="$$sorted_lib_vssh_hdrs" \
                -v lib_vtls_srcs="$$sorted_lib_vtls_srcs" \
                -v lib_vtls_hdrs="$$sorted_lib_vtls_hdrs" \
                "$$awk_code" $(srcdir)/$(VC11_LIBTMPL) > $(VC11_LIBVCXPROJ) || { exit 1; }; \
@@ -590,6 +658,10 @@ function gen_element(type, dir, file)\
                -v lib_rc="$$win32_lib_rc" \
                -v lib_vauth_srcs="$$sorted_lib_vauth_srcs" \
                -v lib_vauth_hdrs="$$sorted_lib_vauth_hdrs" \
+               -v lib_vquic_srcs="$$sorted_lib_vquic_srcs" \
+               -v lib_vquic_hdrs="$$sorted_lib_vquic_hdrs" \
+               -v lib_vssh_srcs="$$sorted_lib_vssh_srcs" \
+               -v lib_vssh_hdrs="$$sorted_lib_vssh_hdrs" \
                -v lib_vtls_srcs="$$sorted_lib_vtls_srcs" \
                -v lib_vtls_hdrs="$$sorted_lib_vtls_hdrs" \
                "$$awk_code" $(srcdir)/$(VC12_LIBTMPL) > $(VC12_LIBVCXPROJ) || { exit 1; }; \
@@ -610,6 +682,10 @@ function gen_element(type, dir, file)\
                -v lib_rc="$$win32_lib_rc" \
                -v lib_vauth_srcs="$$sorted_lib_vauth_srcs" \
                -v lib_vauth_hdrs="$$sorted_lib_vauth_hdrs" \
+               -v lib_vquic_srcs="$$sorted_lib_vquic_srcs" \
+               -v lib_vquic_hdrs="$$sorted_lib_vquic_hdrs" \
+               -v lib_vssh_srcs="$$sorted_lib_vssh_srcs" \
+               -v lib_vssh_hdrs="$$sorted_lib_vssh_hdrs" \
                -v lib_vtls_srcs="$$sorted_lib_vtls_srcs" \
                -v lib_vtls_hdrs="$$sorted_lib_vtls_hdrs" \
                "$$awk_code" $(srcdir)/$(VC14_LIBTMPL) > $(VC14_LIBVCXPROJ) || { exit 1; }; \
@@ -630,6 +706,10 @@ function gen_element(type, dir, file)\
                -v lib_rc="$$win32_lib_rc" \
                -v lib_vauth_srcs="$$sorted_lib_vauth_srcs" \
                -v lib_vauth_hdrs="$$sorted_lib_vauth_hdrs" \
+               -v lib_vquic_srcs="$$sorted_lib_vquic_srcs" \
+               -v lib_vquic_hdrs="$$sorted_lib_vquic_hdrs" \
+               -v lib_vssh_srcs="$$sorted_lib_vssh_srcs" \
+               -v lib_vssh_hdrs="$$sorted_lib_vssh_hdrs" \
                -v lib_vtls_srcs="$$sorted_lib_vtls_srcs" \
                -v lib_vtls_hdrs="$$sorted_lib_vtls_hdrs" \
                "$$awk_code" $(srcdir)/$(VC15_LIBTMPL) > $(VC15_LIBVCXPROJ) || { exit 1; }; \
index 58aaba9..d49d700 100644 (file)
@@ -43,7 +43,7 @@
 #                            | (__| |_| |  _ <| |___
 #                             \___|\___/|_| \_\_____|
 #
-# Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 #
 # This software is licensed as described in the file COPYING, which
 # you should have received as part of this distribution. The terms
@@ -144,8 +144,7 @@ build_triplet = @build@
 host_triplet = @host@
 subdir = .
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/ax_code_coverage.m4 \
-       $(top_srcdir)/m4/ax_compile_check_sizeof.m4 \
+am__aclocal_m4_deps = $(top_srcdir)/m4/ax_compile_check_sizeof.m4 \
        $(top_srcdir)/m4/curl-compilers.m4 \
        $(top_srcdir)/m4/curl-confopts.m4 \
        $(top_srcdir)/m4/curl-functions.m4 \
@@ -319,12 +318,6 @@ CC = @CC@
 CCDEPMODE = @CCDEPMODE@
 CFLAGS = @CFLAGS@
 CFLAG_CURL_SYMBOL_HIDING = @CFLAG_CURL_SYMBOL_HIDING@
-CODE_COVERAGE_CFLAGS = @CODE_COVERAGE_CFLAGS@
-CODE_COVERAGE_CPPFLAGS = @CODE_COVERAGE_CPPFLAGS@
-CODE_COVERAGE_CXXFLAGS = @CODE_COVERAGE_CXXFLAGS@
-CODE_COVERAGE_ENABLED = @CODE_COVERAGE_ENABLED@
-CODE_COVERAGE_LDFLAGS = @CODE_COVERAGE_LDFLAGS@
-CODE_COVERAGE_LIBS = @CODE_COVERAGE_LIBS@
 CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
@@ -366,14 +359,15 @@ ENABLE_SHARED = @ENABLE_SHARED@
 ENABLE_STATIC = @ENABLE_STATIC@
 EXEEXT = @EXEEXT@
 FGREP = @FGREP@
+FISH_FUNCTIONS_DIR = @FISH_FUNCTIONS_DIR@
 GCOV = @GCOV@
-GENHTML = @GENHTML@
 GREP = @GREP@
 HAVE_BROTLI = @HAVE_BROTLI@
 HAVE_GNUTLS_SRP = @HAVE_GNUTLS_SRP@
 HAVE_LDAP_SSL = @HAVE_LDAP_SSL@
 HAVE_LIBZ = @HAVE_LIBZ@
 HAVE_OPENSSL_SRP = @HAVE_OPENSSL_SRP@
+HAVE_PROTO_BSDSOCKET_H = @HAVE_PROTO_BSDSOCKET_H@
 IDN_ENABLED = @IDN_ENABLED@
 INSTALL = @INSTALL@
 INSTALL_DATA = @INSTALL_DATA@
@@ -434,9 +428,7 @@ STRIP = @STRIP@
 SUPPORT_FEATURES = @SUPPORT_FEATURES@
 SUPPORT_PROTOCOLS = @SUPPORT_PROTOCOLS@
 USE_ARES = @USE_ARES@
-USE_AXTLS = @USE_AXTLS@
-USE_CYASSL = @USE_CYASSL@
-USE_DARWINSSL = @USE_DARWINSSL@
+USE_BEARSSL = @USE_BEARSSL@
 USE_GNUTLS = @USE_GNUTLS@
 USE_GNUTLS_NETTLE = @USE_GNUTLS_NETTLE@
 USE_LIBRTMP = @USE_LIBRTMP@
@@ -445,12 +437,17 @@ USE_LIBSSH2 = @USE_LIBSSH2@
 USE_MBEDTLS = @USE_MBEDTLS@
 USE_MESALINK = @USE_MESALINK@
 USE_NGHTTP2 = @USE_NGHTTP2@
+USE_NGHTTP3 = @USE_NGHTTP3@
+USE_NGTCP2 = @USE_NGTCP2@
+USE_NGTCP2_CRYPTO_OPENSSL = @USE_NGTCP2_CRYPTO_OPENSSL@
 USE_NSS = @USE_NSS@
 USE_OPENLDAP = @USE_OPENLDAP@
-USE_POLARSSL = @USE_POLARSSL@
+USE_QUICHE = @USE_QUICHE@
 USE_SCHANNEL = @USE_SCHANNEL@
+USE_SECTRANSP = @USE_SECTRANSP@
 USE_UNIX_SOCKETS = @USE_UNIX_SOCKETS@
 USE_WINDOWS_SSPI = @USE_WINDOWS_SSPI@
+USE_WOLFSSL = @USE_WOLFSSL@
 VERSION = @VERSION@
 VERSIONNUM = @VERSIONNUM@
 ZLIB_LIBS = @ZLIB_LIBS@
@@ -518,8 +515,8 @@ CMAKE_DIST = CMakeLists.txt CMake/CMakeConfigurableFile.in      \
  CMake/Macros.cmake              \
  CMake/CurlSymbolHiding.cmake CMake/FindCARES.cmake             \
  CMake/FindLibSSH2.cmake CMake/FindNGHTTP2.cmake                \
- CMake/FindMbedTLS.cmake CMake/cmake_uninstall.cmake.in         \
- CMake/curl-config.cmake.in
+ CMake/FindMbedTLS.cmake CMake/FindBearSSL.cmake                \
+ CMake/cmake_uninstall.cmake.in CMake/curl-config.cmake.in
 
 VC6_LIBTMPL = projects/Windows/VC6/lib/libcurl.tmpl
 VC6_LIBDSP = projects/Windows/VC6/lib/libcurl.dsp.dist
@@ -632,10 +629,21 @@ VC_DIST = projects/README                           \
 WINBUILD_DIST = winbuild/BUILD.WINDOWS.txt winbuild/gen_resp_file.bat \
  winbuild/MakefileBuild.vc winbuild/Makefile.vc
 
+PLAN9_DIST = plan9/include/mkfile \
+ plan9/include/mkfile             \
+ plan9/mkfile.proto               \
+ plan9/mkfile                     \
+ plan9/BUILD.PLAN9.txt            \
+ plan9/lib/mkfile.inc             \
+ plan9/lib/mkfile                 \
+ plan9/src/mkfile.inc             \
+ plan9/src/mkfile
+
 EXTRA_DIST = CHANGES COPYING maketgz Makefile.dist curl-config.in \
- RELEASE-NOTES buildconf libcurl.pc.in MacOSX-Framework scripts/zsh.pl \
- scripts/updatemanpages.pl $(CMAKE_DIST) $(VC_DIST) $(WINBUILD_DIST) \
- lib/libcurl.vers.in buildconf.bat scripts/coverage.sh
+ RELEASE-NOTES buildconf libcurl.pc.in MacOSX-Framework \
+ scripts/updatemanpages.pl $(CMAKE_DIST) \
+ $(VC_DIST) $(WINBUILD_DIST) $(PLAN9_DIST) \
+ lib/libcurl.vers.in buildconf.bat scripts/coverage.sh scripts/completion.pl
 
 CLEANFILES = $(VC6_LIBDSP) $(VC6_SRCDSP) $(VC7_LIBVCPROJ) $(VC7_SRCVCPROJ) \
  $(VC71_LIBVCPROJ) $(VC71_SRCVCPROJ) $(VC8_LIBVCPROJ) $(VC8_SRCVCPROJ) \
@@ -655,15 +663,20 @@ LIB_VAUTH_CFILES = vauth/vauth.c vauth/cleartext.c vauth/cram.c         \
 
 LIB_VAUTH_HFILES = vauth/vauth.h vauth/digest.h vauth/ntlm.h
 LIB_VTLS_CFILES = vtls/openssl.c vtls/gtls.c vtls/vtls.c vtls/nss.c     \
-  vtls/polarssl.c vtls/polarssl_threadlock.c vtls/axtls.c               \
-  vtls/cyassl.c vtls/schannel.c vtls/schannel_verify.c                  \
-  vtls/darwinssl.c vtls/gskit.c vtls/mbedtls.c vtls/mesalink.c
+  vtls/polarssl.c vtls/polarssl_threadlock.c                            \
+  vtls/wolfssl.c vtls/schannel.c vtls/schannel_verify.c                 \
+  vtls/sectransp.c vtls/gskit.c vtls/mbedtls.c vtls/mesalink.c          \
+  vtls/bearssl.c
 
 LIB_VTLS_HFILES = vtls/openssl.h vtls/vtls.h vtls/gtls.h                \
-  vtls/nssg.h vtls/polarssl.h vtls/polarssl_threadlock.h vtls/axtls.h   \
-  vtls/cyassl.h vtls/schannel.h vtls/darwinssl.h vtls/gskit.h           \
-  vtls/mbedtls.h vtls/mesalink.h
-
+  vtls/nssg.h vtls/polarssl.h vtls/polarssl_threadlock.h                \
+  vtls/wolfssl.h vtls/schannel.h vtls/sectransp.h vtls/gskit.h          \
+  vtls/mbedtls.h vtls/mesalink.h vtls/bearssl.h
+
+LIB_VQUIC_CFILES = vquic/ngtcp2.c vquic/quiche.c
+LIB_VQUIC_HFILES = vquic/ngtcp2.h vquic/quiche.h
+LIB_VSSH_CFILES = vssh/libssh2.c vssh/libssh.c
+LIB_VSSH_HFILES = vssh/ssh.h
 LIB_CFILES = file.c timeval.c base64.c hostip.c progress.c formdata.c   \
   cookie.c http.c sendf.c ftp.c url.c dict.c if2ip.c speedcheck.c       \
   ldap.c version.c getenv.c escape.c mprintf.c telnet.c netrc.c         \
@@ -673,16 +686,16 @@ LIB_CFILES = file.c timeval.c base64.c hostip.c progress.c formdata.c   \
   http_digest.c md4.c md5.c http_negotiate.c inet_pton.c strtoofft.c    \
   strerror.c amigaos.c hostasyn.c hostip4.c hostip6.c hostsyn.c         \
   inet_ntop.c parsedate.c select.c tftp.c splay.c strdup.c socks.c      \
-  ssh.c ssh-libssh.c curl_addrinfo.c socks_gssapi.c socks_sspi.c        \
+  curl_addrinfo.c socks_gssapi.c socks_sspi.c                           \
   curl_sspi.c slist.c nonblock.c curl_memrchr.c imap.c pop3.c smtp.c    \
   pingpong.c rtsp.c curl_threads.c warnless.c hmac.c curl_rtmp.c        \
   openldap.c curl_gethostname.c gopher.c idn_win32.c                    \
   http_proxy.c non-ascii.c asyn-ares.c asyn-thread.c curl_gssapi.c      \
   http_ntlm.c curl_ntlm_wb.c curl_ntlm_core.c curl_sasl.c rand.c        \
-  curl_multibyte.c hostcheck.c conncache.c pipeline.c dotdot.c          \
+  curl_multibyte.c hostcheck.c conncache.c dotdot.c                     \
   x509asn1.c http2.c smb.c curl_endian.c curl_des.c system_win32.c      \
   mime.c sha256.c setopt.c curl_path.c curl_ctype.c curl_range.c psl.c  \
-  doh.c urlapi.c
+  doh.c urlapi.c curl_get_line.c altsvc.c socketpair.c
 
 LIB_HFILES = arpa_telnet.h netrc.h file.h timeval.h hostip.h progress.h \
   formdata.h cookie.h http.h sendf.h ftp.h url.h dict.h if2ip.h         \
@@ -693,20 +706,25 @@ LIB_HFILES = arpa_telnet.h netrc.h file.h timeval.h hostip.h progress.h \
   http_negotiate.h inet_pton.h amigaos.h strtoofft.h strerror.h         \
   inet_ntop.h curlx.h curl_memory.h curl_setup.h transfer.h select.h    \
   easyif.h multiif.h parsedate.h tftp.h sockaddr.h splay.h strdup.h     \
-  socks.h ssh.h curl_base64.h curl_addrinfo.h curl_sspi.h      \
+  socks.h curl_base64.h curl_addrinfo.h curl_sspi.h                     \
   slist.h nonblock.h curl_memrchr.h imap.h pop3.h smtp.h pingpong.h     \
   rtsp.h curl_threads.h warnless.h curl_hmac.h curl_rtmp.h              \
   curl_gethostname.h gopher.h http_proxy.h non-ascii.h asyn.h           \
   http_ntlm.h curl_gssapi.h curl_ntlm_wb.h curl_ntlm_core.h             \
   curl_sasl.h curl_multibyte.h hostcheck.h conncache.h                  \
-  curl_setup_once.h multihandle.h setup-vms.h pipeline.h dotdot.h       \
+  curl_setup_once.h multihandle.h setup-vms.h dotdot.h                  \
   x509asn1.h http2.h sigpipe.h smb.h curl_endian.h curl_des.h           \
   curl_printf.h system_win32.h rand.h mime.h curl_sha256.h setopt.h     \
-  curl_path.h curl_ctype.h curl_range.h psl.h doh.h urlapi-int.h
+  curl_path.h curl_ctype.h curl_range.h psl.h doh.h urlapi-int.h        \
+  curl_get_line.h altsvc.h quic.h socketpair.h
 
 LIB_RCFILES = libcurl.rc
-CSOURCES = $(LIB_CFILES) $(LIB_VAUTH_CFILES) $(LIB_VTLS_CFILES)
-HHEADERS = $(LIB_HFILES) $(LIB_VAUTH_HFILES) $(LIB_VTLS_HFILES)
+CSOURCES = $(LIB_CFILES) $(LIB_VAUTH_CFILES) $(LIB_VTLS_CFILES) \
+  $(LIB_VQUIC_CFILES) $(LIB_VSSH_CFILES)
+
+HHEADERS = $(LIB_HFILES) $(LIB_VAUTH_HFILES) $(LIB_VTLS_HFILES) \
+  $(LIB_VQUIC_HFILES) $(LIB_VSSH_HFILES)
+
 
 # libcurl has sources that provide functions named curlx_* that aren't part of
 # the official API, but we re-use the code here to avoid duplication.
@@ -755,6 +773,7 @@ CURL_CFILES = \
   tool_panykey.c \
   tool_paramhlp.c \
   tool_parsecfg.c \
+  tool_progress.c \
   tool_strdup.c \
   tool_setopt.c \
   tool_sleep.c \
@@ -796,6 +815,7 @@ CURL_HFILES = \
   tool_panykey.h \
   tool_paramhlp.h \
   tool_parsecfg.h \
+  tool_progress.h \
   tool_sdecls.h \
   tool_setopt.h \
   tool_setup.h \
@@ -1488,6 +1508,10 @@ vc-ide: $(VC6_LIBDSP_DEPS) $(VC6_SRCDSP_DEPS) $(VC7_LIBVCPROJ_DEPS) \
        win32_lib_rc='$(LIB_RCFILES)'; \
        win32_lib_vauth_srcs='$(LIB_VAUTH_CFILES)'; \
        win32_lib_vauth_hdrs='$(LIB_VAUTH_HFILES)'; \
+       win32_lib_vquic_srcs='$(LIB_VQUIC_CFILES)'; \
+       win32_lib_vquic_hdrs='$(LIB_VQUIC_HFILES)'; \
+       win32_lib_vssh_srcs='$(LIB_VSSH_CFILES)'; \
+       win32_lib_vssh_hdrs='$(LIB_VSSH_HFILES)'; \
        win32_lib_vtls_srcs='$(LIB_VTLS_CFILES)'; \
        win32_lib_vtls_hdrs='$(LIB_VTLS_HFILES)'; \
        win32_src_srcs='$(CURL_CFILES)'; \
@@ -1500,6 +1524,10 @@ vc-ide: $(VC6_LIBDSP_DEPS) $(VC6_SRCDSP_DEPS) $(VC7_LIBVCPROJ_DEPS) \
        sorted_lib_hdrs=`for file in $$win32_lib_hdrs; do echo $$file; done | sort`; \
        sorted_lib_vauth_srcs=`for file in $$win32_lib_vauth_srcs; do echo $$file; done | sort`; \
        sorted_lib_vauth_hdrs=`for file in $$win32_lib_vauth_hdrs; do echo $$file; done | sort`; \
+       sorted_lib_vquic_srcs=`for file in $$win32_lib_vquic_srcs; do echo $$file; done | sort`; \
+       sorted_lib_vquic_hdrs=`for file in $$win32_lib_vquic_hdrs; do echo $$file; done | sort`; \
+       sorted_lib_vssh_srcs=`for file in $$win32_lib_vssh_srcs; do echo $$file; done | sort`; \
+       sorted_lib_vssh_hdrs=`for file in $$win32_lib_vssh_hdrs; do echo $$file; done | sort`; \
        sorted_lib_vtls_srcs=`for file in $$win32_lib_vtls_srcs; do echo $$file; done | sort`; \
        sorted_lib_vtls_hdrs=`for file in $$win32_lib_vtls_hdrs; do echo $$file; done | sort`; \
        sorted_src_srcs=`for file in $$win32_src_srcs; do echo $$file; done | sort`; \
@@ -1511,10 +1539,15 @@ vc-ide: $(VC6_LIBDSP_DEPS) $(VC6_SRCDSP_DEPS) $(VC7_LIBVCPROJ_DEPS) \
 function gen_element(type, dir, file)\
 {\
   sub(/vauth\//, "", file);\
+  sub(/vquic\//, "", file);\
+  sub(/vssh\//, "", file);\
   sub(/vtls\//, "", file);\
 \
   spaces="    ";\
-  if(dir == "lib\\vauth" || dir == "lib\\vtls")\
+  if(dir == "lib\\vauth" ||\
+     dir == "lib\\vquic" ||\
+     dir == "lib\\vssh"  ||\
+     dir == "lib\\vtls")\
     tabs="                             ";\
   else\
     tabs="                     ";\
@@ -1576,6 +1609,22 @@ function gen_element(type, dir, file)\
     split(lib_vauth_hdrs, arr);\
     for(val in arr) gen_element(proj_type, "lib\\vauth", arr[val]);\
   }\
+  else if($$0 == "CURL_LIB_VQUIC_C_FILES") {\
+    split(lib_vquic_srcs, arr);\
+    for(val in arr) gen_element(proj_type, "lib\\vquic", arr[val]);\
+  }\
+  else if($$0 == "CURL_LIB_VQUIC_H_FILES") {\
+    split(lib_vquic_hdrs, arr);\
+    for(val in arr) gen_element(proj_type, "lib\\vquic", arr[val]);\
+  }\
+  else if($$0 == "CURL_LIB_VSSH_C_FILES") {\
+    split(lib_vssh_srcs, arr);\
+    for(val in arr) gen_element(proj_type, "lib\\vssh", arr[val]);\
+  }\
+  else if($$0 == "CURL_LIB_VSSH_H_FILES") {\
+    split(lib_vssh_hdrs, arr);\
+    for(val in arr) gen_element(proj_type, "lib\\vssh", arr[val]);\
+  }\
   else if($$0 == "CURL_LIB_VTLS_C_FILES") {\
     split(lib_vtls_srcs, arr);\
     for(val in arr) gen_element(proj_type, "lib\\vtls", arr[val]);\
@@ -1621,6 +1670,10 @@ function gen_element(type, dir, file)\
                -v lib_rc="$$win32_lib_rc" \
                -v lib_vauth_srcs="$$sorted_lib_vauth_srcs" \
                -v lib_vauth_hdrs="$$sorted_lib_vauth_hdrs" \
+               -v lib_vquic_srcs="$$sorted_lib_vquic_srcs" \
+               -v lib_vquic_hdrs="$$sorted_lib_vquic_hdrs" \
+               -v lib_vssh_srcs="$$sorted_lib_vssh_srcs" \
+               -v lib_vssh_hdrs="$$sorted_lib_vssh_hdrs" \
                -v lib_vtls_srcs="$$sorted_lib_vtls_srcs" \
                -v lib_vtls_hdrs="$$sorted_lib_vtls_hdrs" \
                "$$awk_code" $(srcdir)/$(VC6_LIBTMPL) > $(VC6_LIBDSP) || { exit 1; }; \
@@ -1641,6 +1694,10 @@ function gen_element(type, dir, file)\
                -v lib_rc="$$win32_lib_rc" \
                -v lib_vauth_srcs="$$sorted_lib_vauth_srcs" \
                -v lib_vauth_hdrs="$$sorted_lib_vauth_hdrs" \
+               -v lib_vquic_srcs="$$sorted_lib_vquic_srcs" \
+               -v lib_vquic_hdrs="$$sorted_lib_vquic_hdrs" \
+               -v lib_vssh_srcs="$$sorted_lib_vssh_srcs" \
+               -v lib_vssh_hdrs="$$sorted_lib_vssh_hdrs" \
                -v lib_vtls_srcs="$$sorted_lib_vtls_srcs" \
                -v lib_vtls_hdrs="$$sorted_lib_vtls_hdrs" \
                "$$awk_code" $(srcdir)/$(VC7_LIBTMPL) > $(VC7_LIBVCPROJ) || { exit 1; }; \
@@ -1661,6 +1718,10 @@ function gen_element(type, dir, file)\
                -v lib_rc="$$win32_lib_rc" \
                -v lib_vauth_srcs="$$sorted_lib_vauth_srcs" \
                -v lib_vauth_hdrs="$$sorted_lib_vauth_hdrs" \
+               -v lib_vquic_srcs="$$sorted_lib_vquic_srcs" \
+               -v lib_vquic_hdrs="$$sorted_lib_vquic_hdrs" \
+               -v lib_vssh_srcs="$$sorted_lib_vssh_srcs" \
+               -v lib_vssh_hdrs="$$sorted_lib_vssh_hdrs" \
                -v lib_vtls_srcs="$$sorted_lib_vtls_srcs" \
                -v lib_vtls_hdrs="$$sorted_lib_vtls_hdrs" \
                "$$awk_code" $(srcdir)/$(VC71_LIBTMPL) > $(VC71_LIBVCPROJ) || { exit 1; }; \
@@ -1681,6 +1742,10 @@ function gen_element(type, dir, file)\
                -v lib_rc="$$win32_lib_rc" \
                -v lib_vauth_srcs="$$sorted_lib_vauth_srcs" \
                -v lib_vauth_hdrs="$$sorted_lib_vauth_hdrs" \
+               -v lib_vquic_srcs="$$sorted_lib_vquic_srcs" \
+               -v lib_vquic_hdrs="$$sorted_lib_vquic_hdrs" \
+               -v lib_vssh_srcs="$$sorted_lib_vssh_srcs" \
+               -v lib_vssh_hdrs="$$sorted_lib_vssh_hdrs" \
                -v lib_vtls_srcs="$$sorted_lib_vtls_srcs" \
                -v lib_vtls_hdrs="$$sorted_lib_vtls_hdrs" \
                "$$awk_code" $(srcdir)/$(VC8_LIBTMPL) > $(VC8_LIBVCPROJ) || { exit 1; }; \
@@ -1701,6 +1766,10 @@ function gen_element(type, dir, file)\
                -v lib_rc="$$win32_lib_rc" \
                -v lib_vauth_srcs="$$sorted_lib_vauth_srcs" \
                -v lib_vauth_hdrs="$$sorted_lib_vauth_hdrs" \
+               -v lib_vquic_srcs="$$sorted_lib_vquic_srcs" \
+               -v lib_vquic_hdrs="$$sorted_lib_vquic_hdrs" \
+               -v lib_vssh_srcs="$$sorted_lib_vssh_srcs" \
+               -v lib_vssh_hdrs="$$sorted_lib_vssh_hdrs" \
                -v lib_vtls_srcs="$$sorted_lib_vtls_srcs" \
                -v lib_vtls_hdrs="$$sorted_lib_vtls_hdrs" \
                "$$awk_code" $(srcdir)/$(VC9_LIBTMPL) > $(VC9_LIBVCPROJ) || { exit 1; }; \
@@ -1721,6 +1790,10 @@ function gen_element(type, dir, file)\
                -v lib_rc="$$win32_lib_rc" \
                -v lib_vauth_srcs="$$sorted_lib_vauth_srcs" \
                -v lib_vauth_hdrs="$$sorted_lib_vauth_hdrs" \
+               -v lib_vquic_srcs="$$sorted_lib_vquic_srcs" \
+               -v lib_vquic_hdrs="$$sorted_lib_vquic_hdrs" \
+               -v lib_vssh_srcs="$$sorted_lib_vssh_srcs" \
+               -v lib_vssh_hdrs="$$sorted_lib_vssh_hdrs" \
                -v lib_vtls_srcs="$$sorted_lib_vtls_srcs" \
                -v lib_vtls_hdrs="$$sorted_lib_vtls_hdrs" \
                "$$awk_code" $(srcdir)/$(VC10_LIBTMPL) > $(VC10_LIBVCXPROJ) || { exit 1; }; \
@@ -1741,6 +1814,10 @@ function gen_element(type, dir, file)\
                -v lib_rc="$$win32_lib_rc" \
                -v lib_vauth_srcs="$$sorted_lib_vauth_srcs" \
                -v lib_vauth_hdrs="$$sorted_lib_vauth_hdrs" \
+               -v lib_vquic_srcs="$$sorted_lib_vquic_srcs" \
+               -v lib_vquic_hdrs="$$sorted_lib_vquic_hdrs" \
+               -v lib_vssh_srcs="$$sorted_lib_vssh_srcs" \
+               -v lib_vssh_hdrs="$$sorted_lib_vssh_hdrs" \
                -v lib_vtls_srcs="$$sorted_lib_vtls_srcs" \
                -v lib_vtls_hdrs="$$sorted_lib_vtls_hdrs" \
                "$$awk_code" $(srcdir)/$(VC11_LIBTMPL) > $(VC11_LIBVCXPROJ) || { exit 1; }; \
@@ -1761,6 +1838,10 @@ function gen_element(type, dir, file)\
                -v lib_rc="$$win32_lib_rc" \
                -v lib_vauth_srcs="$$sorted_lib_vauth_srcs" \
                -v lib_vauth_hdrs="$$sorted_lib_vauth_hdrs" \
+               -v lib_vquic_srcs="$$sorted_lib_vquic_srcs" \
+               -v lib_vquic_hdrs="$$sorted_lib_vquic_hdrs" \
+               -v lib_vssh_srcs="$$sorted_lib_vssh_srcs" \
+               -v lib_vssh_hdrs="$$sorted_lib_vssh_hdrs" \
                -v lib_vtls_srcs="$$sorted_lib_vtls_srcs" \
                -v lib_vtls_hdrs="$$sorted_lib_vtls_hdrs" \
                "$$awk_code" $(srcdir)/$(VC12_LIBTMPL) > $(VC12_LIBVCXPROJ) || { exit 1; }; \
@@ -1781,6 +1862,10 @@ function gen_element(type, dir, file)\
                -v lib_rc="$$win32_lib_rc" \
                -v lib_vauth_srcs="$$sorted_lib_vauth_srcs" \
                -v lib_vauth_hdrs="$$sorted_lib_vauth_hdrs" \
+               -v lib_vquic_srcs="$$sorted_lib_vquic_srcs" \
+               -v lib_vquic_hdrs="$$sorted_lib_vquic_hdrs" \
+               -v lib_vssh_srcs="$$sorted_lib_vssh_srcs" \
+               -v lib_vssh_hdrs="$$sorted_lib_vssh_hdrs" \
                -v lib_vtls_srcs="$$sorted_lib_vtls_srcs" \
                -v lib_vtls_hdrs="$$sorted_lib_vtls_hdrs" \
                "$$awk_code" $(srcdir)/$(VC14_LIBTMPL) > $(VC14_LIBVCXPROJ) || { exit 1; }; \
@@ -1801,6 +1886,10 @@ function gen_element(type, dir, file)\
                -v lib_rc="$$win32_lib_rc" \
                -v lib_vauth_srcs="$$sorted_lib_vauth_srcs" \
                -v lib_vauth_hdrs="$$sorted_lib_vauth_hdrs" \
+               -v lib_vquic_srcs="$$sorted_lib_vquic_srcs" \
+               -v lib_vquic_hdrs="$$sorted_lib_vquic_hdrs" \
+               -v lib_vssh_srcs="$$sorted_lib_vssh_srcs" \
+               -v lib_vssh_hdrs="$$sorted_lib_vssh_hdrs" \
                -v lib_vtls_srcs="$$sorted_lib_vtls_srcs" \
                -v lib_vtls_hdrs="$$sorted_lib_vtls_hdrs" \
                "$$awk_code" $(srcdir)/$(VC15_LIBTMPL) > $(VC15_LIBVCXPROJ) || { exit 1; }; \
diff --git a/README b/README
index f0b3b93..c439dab 100644 (file)
--- a/README
+++ b/README
@@ -42,6 +42,12 @@ GIT
 
   (you'll get a directory named curl created, filled with the source code)
 
+SECURITY PROBLEMS
+
+  Report suspected security problems via our HackerOne page and not in public!
+
+    https://hackerone.com/curl
+
 NOTICE
 
   Curl contains pieces of source code that is Copyright (c) 1998, 1999
index 4cdab8d..7a12112 100644 (file)
-Curl and libcurl 7.62.0
+curl and libcurl 7.68.0
 
- Public curl releases:         177
- Command line options:         219
- curl_easy_setopt() options:   261
- Public functions in libcurl:  80
- Contributors:                 1808
+ Public curl releases:         188
+ Command line options:         229
+ curl_easy_setopt() options:   269
+ Public functions in libcurl:  82
+ Contributors:                 2088
 
 This release includes the following changes:
 
- o multiplex: enable by default [4]
- o url: default to CURL_HTTP_VERSION_2TLS if built h2-enabled [4]
- o setopt: add CURLOPT_DOH_URL [7]
- o curl: --doh-url added [7]
- o setopt: add CURLOPT_UPLOAD_BUFFERSIZE: set upload buffer size [8]
- o imap: change from "FETCH" to "UID FETCH" [9]
- o configure: add option to disable automatic OpenSSL config loading [10]
- o upkeep: add a connection upkeep API: curl_easy_upkeep() [11]
- o URL-API: added five new functions [12]
- o vtls: MesaLink is a new TLS backend [23]
+ o TLS: add BearSSL vtls implementation [37]
+ o XFERINFOFUNCTION: support CURL_PROGRESSFUNC_CONTINUE [36]
+ o curl: add --etag-compare and --etag-save [31]
+ o curl: add --parallel-immediate [29]
+ o multi: add curl_multi_wakeup() [38]
+ o openssl: CURLSSLOPT_NO_PARTIALCHAIN can disable partial cert chains [45]
 
 This release includes the following bugfixes:
 
- o CVE-2018-16839: SASL password overflow via integer overflow [107]
- o CVE-2018-16840: use-after-free in handle close [108]
- o CVE-2018-16842: warning message out-of-buffer read [114]
- o CURLOPT_DNS_USE_GLOBAL_CACHE: deprecated [5]
- o Curl_dedotdotify(): always nul terminate returned string [46]
- o Curl_follow: Always free the passed new URL [87]
- o Curl_http2_done: fix memleak in error path [51]
- o Curl_retry_request: fix memory leak [49]
- o Curl_saferealloc: Fixed typo in docblock [40]
- o FILE: fix CURLOPT_NOBODY and CURLOPT_HEADER output [78]
- o GnutTLS: TLS 1.3 support [39]
- o SECURITY-PROCESS: mention the bountygraph program [42]
- o VS projects: add USE_IPV6: [91]
- o Windows: fixes for MinGW targeting Windows Vista [82]
- o anyauthput: fix compiler warning on 64-bit Windows [21]
- o appveyor: add WinSSL builds [81]
- o appveyor: run test suite (on Windows!) [65]
- o certs: generate tests certs with sha256 digest algorithm [37]
- o checksrc: enable strict mode and warnings [63]
- o checksrc: handle zero scoped ignore commands [62]
- o cmake: Backport to work with CMake 3.0 again [55]
- o cmake: Improve config installation [60]
- o cmake: add support for transitive ZLIB target [113]
- o cmake: disable -Wpedantic-ms-format [84]
- o cmake: don't require OpenSSL if USE_OPENSSL=OFF [35]
- o cmake: fixed path used in generation of docs/tests [56]
- o cmake: remove unused *SOCKLEN_T variables [102]
- o cmake: suppress MSVC warning C4127 for libtest
- o cmake: test and set missed defines during configuration [64]
- o comment: Fix multiple typos in function parameters [69]
- o config: Remove unused SIZEOF_VOIDP [104]
- o config_win32: enable LDAPS [92]
- o configure: force-use -lpthreads on HPUX [41]
- o configure: remove CURL_CONFIGURE_CURL_SOCKLEN_T [101]
- o configure: s/AC_RUN_IFELSE/CURL_RUN_IFELSE [53]
- o cookies: Remove redundant expired check [14]
- o cookies: fix leak when writing cookies to file [15]
- o curl-config.in: remove dependency on bc [99]
- o curl.1: --ipv6 mutexes ipv4 (fixed typo) [98]
- o curl: enabled Windows VT Support and UTF-8 output [57]
- o curl: update the documentation of --tlsv1.0 [17]
- o curl_multi_wait: call getsock before figuring out timeout [34]
- o curl_ntlm_wb: check aprintf() return codes [75]
- o curl_threads: fix classic MinGW compile break [54]
- o darwinssl: Fix realloc memleak [32]
- o darwinssl: more specific and unified error codes [6]
- o data-binary.d: clarify default content-type is x-www-form-urlencoded [71]
- o docs/BUG-BOUNTY: explain the bounty program [76]
- o docs/CIPHERS: Mention the options used to set TLS 1.3 ciphers [89]
- o docs/CIPHERS: fix the TLS 1.3 cipher names [95]
- o docs/CIPHERS: mention the colon separation for OpenSSL [73]
- o docs/examples: URL updates [45]
- o docs: add "see also" links for SSL options [85]
- o example/asiohiper: insert warning comment about its status [18]
- o example/htmltidy: fix include paths of tidy libraries [52]
- o examples/Makefile.m32: sync with core [44]
- o examples/http2-pushinmemory: receive HTTP/2 pushed files in memory [33]
- o examples/parseurl.c: show off the URL API [43]
- o examples: Fix memory leaks from realloc errors [31]
- o examples: do not wait when no transfers are running [16]
- o ftp: include command in Curl_ftpsend sendbuffer [25]
- o gskit: make sure to terminate version string [79]
- o gtls: Values stored to but never read [97]
- o hostip: fix check on Curl_shuffle_addr return value [77]
- o http2: fix memory leaks on error-path [29]
- o http: fix memleak in rewind error path [50]
- o krb5: fix memory leak in krb_auth [25]
- o ldap: show precise LDAP call in error message on Windows [83]
- o lib: fix gcc8 warning on Windows [20]
- o memory: add missing curl_printf header [30]
- o memory: ensure to check allocation results [68]
- o multi: Fix error handling in the SENDPROTOCONNECT state [112]
- o multi: fix memory leak in content encoding related error path [59]
- o multi: make the closure handle "inherit" CURLOPT_NOSIGNAL [90]
- o netrc: free temporary strings if memory allocation fails [103]
- o nss: fix nssckbi module loading on Windows [70]
- o nss: try to connect even if libnssckbi.so fails to load [36]
- o ntlm_wb: Fix memory leaks in ntlm_wb_response [24]
- o ntlm_wb: bail out if the response gets overly large [13]
- o openssl: assume engine support in 0.9.8 or later [27]
- o openssl: enable TLS 1.3 post-handshake auth [47]
- o openssl: fix gcc8 warning [19]
- o openssl: load built-in engines too [48]
- o openssl: make 'done' a proper boolean [97]
- o openssl: output the correct cipher list on TLS 1.3 error [95]
- o openssl: return CURLE_PEER_FAILED_VERIFICATION on failure to parse issuer [6]
- o openssl: show "proper" version number for libressl builds [28]
- o pipelining: deprecated [1]
- o rand: add comment to skip a clang-tidy false positive
- o rtmp: fix for compiling with lwIP [100]
- o runtests: ignore disabled even when ranges are given [74]
- o runtests: skip ld_preload tests on macOS [80]
- o runtests: use Windows paths for Windows curl
- o schannel: unified error code handling [6]
- o sendf: Fix whitespace in infof/failf concatenation [26]
- o ssh: free the session on init failures [96]
- o ssl: deprecate CURLE_SSL_CACERT in favour of a unified error code [6]
- o system.h: use proper setting with Sun C++ as well [109]
- o test1299: use single quotes around asterisk [72]
- o test1452: mark as flaky [2]
- o test1651: unit test Curl_extract_certinfo() [110]
- o test320: strip out more HTML when comparing [66]
- o tests/negtelnetserver.py: fix Python2-ism in neg TELNET server [67]
- o tests: add unit tests for url.c [3]
- o timeval: fix use of weak symbol clock_gettime() on Apple platforms [61]
- o tool_cb_hdr: handle failure of rename() [94]
- o travis: add a "make tidy" build that runs clang-tidy [105]
- o travis: add build for "configure --disable-verbose" [93]
- o travis: bump the Secure Transport build to use xcode [58]
- o travis: make distcheck scan for BOM markers [86]
- o unit1300: fix stack-use-after-scope AddressSanitizer warning [106]
- o urldata: Fix "connecting" comment
- o urlglob: improve error message on bad globs [22]
- o vtls: fix ssl version "or later" behavior change for many backends [38]
- o x509asn1: Fix SAN IP address verification [88]
- o x509asn1: always check return code from getASN1Element() [110]
- o x509asn1: return CURLE_PEER_FAILED_VERIFICATION on failure to parse cert [6]
- o x509asn1: suppress left shift on signed value [111]
+ o CVE-2019-15601: file: on Windows, refuse paths that start with \\ [106]
+ o Azure Pipelines: add several builds
+ o CMake: add support for building with the NSS vtls backend [43]
+ o CURL-DISABLE: initial docs for the CURL_DISABLE_* defines [19]
+ o CURLOPT_HEADERFUNCTION.3: Document that size is always 1 [100]
+ o CURLOPT_QUOTE.3: fix typos [78]
+ o CURLOPT_READFUNCTION.3: fix the example [107]
+ o CURLOPT_URL.3: "curl supports SMB version 1 (only)"
+ o CURLOPT_VERBOSE.3: see also ERRORBUFFER
+ o HISTORY: added cmake, HTTP/3 and parallel downloads with curl
+ o HISTORY: the SMB(S) support landed in 2014
+ o INSTALL.md: provide Android build instructions [10]
+ o KNOWN_BUGS: Connection information when using TCP Fast Open [85]
+ o KNOWN_BUGS: LDAP on Windows doesn't work correctly [86]
+ o KNOWN_BUGS: TLS session cache doesn't work with TFO [56]
+ o OPENSOCKETFUNCTION.3: correct the purpose description [48]
+ o TrackMemory tests: always remove CR before LF [111]
+ o altsvc: bump to h3-24 [6]
+ o altsvc: make the save function ignore NULL filenames [67]
+ o build: Disable Visual Studio warning "conditional expression is constant" [49]
+ o build: fix for CURL_DISABLE_DOH [2]
+ o checksrc.bat: Add a check for vquic and vssh directories [40]
+ o checksrc: repair the copyrightyear check [25]
+ o cirrus-ci: enable clang sanitizers on freebsd 13 [60]
+ o cirrus: Drop the FreeBSD 10.4 build
+ o config-win32: cpu-machine-OS for Windows on ARM [13]
+ o configure: avoid unportable `==' test(1) operator [1]
+ o configure: enable IPv6 support without `getaddrinfo` [44]
+ o configure: fix typo in help text [4]
+ o conncache: CONNECT_ONLY connections assumed always in-use [71]
+ o conncache: fix multi-thread use of shared connection cache [61]
+ o copyrights: fix copyright year range [25]
+ o create_conn: prefer multiplexing to using new connections [76]
+ o curl -w: handle a blank input file correctly [105]
+ o curl.h: add two missing defines for "pre ISO C" compilers [75]
+ o curl/parseconfig: fix mem-leak [81]
+ o curl/parseconfig: use curl_free() to free memory allocated by libcurl [80]
+ o curl: cleanup multi handle on failure [103]
+ o curl: fix --upload-file . hangs if delay in STDIN [35]
+ o curl: fix -T globbing [16]
+ o curl: improved cleanup in upload error path [69]
+ o curl: make a few char pointers point to const char instead [95]
+ o curl: properly free mimepost data [104]
+ o curl: show better error message when no homedir is found [47]
+ o curl: show error for --http3 if libcurl lacks support [108]
+ o curl_setup_once: consistently use WHILE_FALSE in macros [54]
+ o define: remove HAVE_ENGINE_LOAD_BUILTIN_ENGINES, not used anymore [83]
+ o docs: Change 'experiemental' to 'experimental' [30]
+ o docs: TLS SRP doesn't work with TLS 1.3 [87]
+ o docs: fix several typos [62]
+ o docs: mention CURL_MAX_INPUT_LENGTH restrictions [109]
+ o doh: improved both encoding and decoding [11]
+ o doh: make it behave when built without proxy support [68]
+ o examples/postinmemory.c: Call curl_global_cleanup always [101]
+ o examples/url2file.c: corrected erroneous comment [102]
+ o examples: add multi-poll.c [14]
+ o global_init: undo the "intialized" bump in case of failure [52]
+ o hostip: suppress compiler warning [64]
+ o http_ntlm: Remove duplicate NSS initialisation [55]
+ o lib: Move lib/ssh.h -> lib/vssh/ssh.h [9]
+ o lib: fix compiler warnings with `CURL_DISABLE_VERBOSE_STRINGS` [93]
+ o lib: fix warnings found when porting to NuttX [99]
+ o lib: remove ASSIGNWITHINCONDITION exceptions, use our code style [84]
+ o lib: remove erroneous +x file permission on some c files [99]
+ o libssh2: add support for ECDSA and ed25519 knownhost keys [89]
+ o multi.h: remove INITIAL_MAX_CONCURRENT_STREAMS from public header [110]
+ o multi: free sockhash on OOM [63]
+ o multi_poll: avoid busy-loop when called without easy handles attached [15]
+ o ngtcp2: Support the latest update key callback type [92]
+ o ngtcp2: fix thread-safety bug in error-handling [33]
+ o ngtcp2: free used resources on disconnect [7]
+ o ngtcp2: handle key updates as ngtcp2 master branch tells us [8]
+ o ngtcp2: increase QUIC window size when data is consumed [12]
+ o ngtcp2: use overflow buffer for extra HTTP/3 data [5]
+ o ntlm: USE_WIN32_CRYPTO check removed to get USE_NTLM2SESSION set [3]
+ o ntlm_wb: fix double-free in OOM [65]
+ o openssl: Revert to less sensitivity for SYSCALL errors [26]
+ o openssl: improve error message for SYSCALL during connect [27]
+ o openssl: prevent recursive function calls from ctx callbacks [18]
+ o openssl: retrieve reported LibreSSL version at runtime [50]
+ o openssl: set X509_V_FLAG_PARTIAL_CHAIN by default [46]
+ o parsedate: offer a getdate_capped() alternative [53]
+ o pause: avoid updating socket if done was already called [22]
+ o projects: Fix Visual Studio projects SSH builds [41]
+ o projects: Fix Visual Studio wolfSSL configurations
+ o quiche: reject HTTP/3 headers in the wrong order [17]
+ o remove_handle: clear expire timers after multi_done() [20]
+ o runtests: --repeat=[num] to repeat tests [91]
+ o runtests: introduce --shallow to reduce huge torture tests [70]
+ o schannel: fix --tls-max for when min is --tlsv1 or default [39]
+ o setopt: Fix ALPN / NPN user option when built without HTTP2 [42]
+ o strerror: Add Curl_winapi_strerror for Win API specific errors [51]
+ o strerror: Fix an error looking up some Windows error strings
+ o strerror: Fix compiler warning "empty expression" [79]
+ o system.h: fix for MCST lcc compiler [23]
+ o test/sws: search for "Testno:" header unconditionally if no testno [73]
+ o test1175: verify symbols-in-versions and libcurl-errors.3 in sync [28]
+ o test1270: a basic -w redirect_url test [82]
+ o test1456: remove the use of a fixed local port number [77]
+ o test1558: use double slash after file: [21]
+ o test1560: require IPv6 for IPv6 aware URL parsing [24]
+ o tests/lib1557: fix mem-leak in OOM [66]
+ o tests/lib1559: fix mem-leak in OOM [66]
+ o tests/lib1591: free memory properly on OOM, in the trailers callback [90]
+ o tests/unit1607: fix mem-leak in OOM [66]
+ o tests/unit1609: fix mem-leak in OOM [66]
+ o tests/unit1620: fix bad free in OOM [66]
+ o tests: Change NTLM tests to require SSL [96]
+ o tests: Fix bounce requests with truncated writes [94]
+ o tests: fix build with `CURL_DISABLE_DOH` [64]
+ o tests: fix permissions of ssh keys in WSL [58]
+ o tests: make it possible to set executable extensions [58]
+ o tests: make sure checksrc runs on header files too
+ o tests: set LC_ALL=en_US.UTF-8 instead of blank in several tests [74]
+ o tests: use DoH feature for DoH tests [64]
+ o tests: use \r\n for log messages in WSL [58]
+ o tool_operate: fix mem leak when failed config parse [98]
+ o travis: Fix error detection [97]
+ o travis: abandon coveralls, it is not reliable [57]
+ o travis: build ngtcp2 with --enable-lib-only [32]
+ o travis: export the CC/CXX variables when set [34]
+ o vtls: make BearSSL possible to set with CURL_SSL_BACKEND [72]
+ o winbuild: Define CARES_STATICLIB when WITH_CARES=static [59]
+ o winbuild: Document CURL_STATICLIB requirement for static libcurl [88]
 
 This release includes the following known bugs:
 
@@ -147,134 +149,137 @@ This release includes the following known bugs:
 This release would not have looked like this without help, code, reports and
 advice from friends like these:
 
-  Alexey Eremikhin, Brad King, Brian Carpenter, Christian Heimes, Colin Hogben,
-  Daniel Gustafsson, Daniel Shahaf, Daniel Stenberg, Dario Weißer,
-  Dave Reisner, Dima Pasechnik, Dmitry Kostjuchenko, Doron Behar,
-  Eason-Yu on github, Erik Minekus, Even Rouault, Gisle Vanem, Han Han,
-  Harry Sintonen, jakirkham on github, Jean Fabrice, Jim Fuller, Kamil Dudka,
-  Loganaden Velvindron, Marcel Raad, Marc Hörsken, Martin Ankerl,
-  Matthew Whitehead, Max Dymond, Maxime Legros, Michael Kaufmann, Nate Prewitt,
-  Nicklas Avén, Nick Zitzmann, Patrick Monnerat, Philipp Waehnert, Rainer Jung,
-  Ray Satiro, Rich Turner, Rick Deist, Ricky-Tigg on github, Rikard Falkeborn,
-  Ruslan Baratov, Sergei Nikulov, Shaun Jackman, Thomas Glanzmann, Tuomo Rinne,
-  Viktor Szakats, Yiming Jing,
-  (49 contributors)
+  3dyd on github, Anderson Sasaki, Andreas Falkenhahn, Andrew Ishchuk,
+  bdry on github, Bjoern Franke, Brian Carpenter, bxac on github,
+  Bylon2 on github, Christian Schmitz, Christopher Head, Christopher Reid,
+  Christoph M. Becker, Cynthia Coan, Dan Fandrich, Daniel Gustafsson,
+  Daniel Stenberg, David Benjamin, Emil Engler, Fernando Muñoz, Frank Gevaerts,
+  Geeknik Labs, Gergely Nagy, Gisle Vanem, JanB on github, Javier Blazquez,
+  Jeff Mears, Jeffrey Walton, John Schroeder, Kamil Dudka,
+  kouzhudong on github, Kunal Ekawde, Leonardo Taccari, Marc Aldorasi,
+  Marcel Raad, marc-groundctl on github, Marc Hörsken, Maros Priputen,
+  Massimiliano Fantuzzi, Max Kellermann, Melissa Mears, Michael Forney,
+  Michael Vittiglio, Mohammad Hasbini, Niall O'Reilly, Paul Groke,
+  Paul Hoffman, Paul Joyce, Paulo Roberto Tomasi, Pavel Löbl, Pavel Pavlov,
+  Peter Wu, Ram Krushna Mishra, Ray Satiro, Richard Alcock, Richard Bowker,
+  Rickard Hallerbäck, Santino Keupp, sayrer on github, Shailesh Kapse,
+  Simon Warta, SLDiggie on github, Steve Holme, Tatsuhiro Tsujikawa,
+  Tom van der Woerdt, Victor Magierski, Vlastimil Ovčáčík, Wyatt O'Day,
+  Xiang Xiao, Xiaoyin Liu,
+  (70 contributors)
 
         Thanks! (and sorry if I forgot to mention someone)
 
 References to bug reports and discussions on issues:
 
- [1] = https://curl.haxx.se/bug/?i=2705
- [2] = https://curl.haxx.se/bug/?i=2941
- [3] = https://curl.haxx.se/bug/?i=2937
- [4] = https://curl.haxx.se/bug/?i=2709
- [5] = https://curl.haxx.se/bug/?i=2942
- [6] = https://curl.haxx.se/bug/?i=2901
- [7] = https://curl.haxx.se/bug/?i=2668
- [8] = https://curl.haxx.se/bug/?i=2896
- [9] = https://curl.haxx.se/bug/?i=2789
- [10] = https://curl.haxx.se/bug/?i=2724
- [11] = https://curl.haxx.se/bug/?i=1641
- [12] = https://curl.haxx.se/bug/?i=2842
- [13] = https://curl.haxx.se/bug/?i=2959
- [14] = https://curl.haxx.se/bug/?i=2962
- [15] = https://curl.haxx.se/bug/?i=2957
- [16] = https://curl.haxx.se/bug/?i=2948
- [17] = https://curl.haxx.se/bug/?i=2955
- [18] = https://curl.haxx.se/bug/?i=2407
- [19] = https://curl.haxx.se/bug/?i=2980
- [20] = https://curl.haxx.se/bug/?i=2979
- [21] = https://curl.haxx.se/bug/?i=2972
- [22] = https://curl.haxx.se/bug/?i=2763
- [23] = https://curl.haxx.se/bug/?i=2984
- [24] = https://curl.haxx.se/bug/?i=2966
- [25] = https://curl.haxx.se/bug/?i=2985
- [26] = https://curl.haxx.se/bug/?i=2986
- [27] = https://curl.haxx.se/bug/?i=2983
- [28] = https://curl.haxx.se/bug/?i=2989
- [29] = https://curl.haxx.se/bug/?i=2992
- [30] = https://curl.haxx.se/bug/?i=2999
- [31] = https://curl.haxx.se/bug/?i=2991
- [32] = https://curl.haxx.se/bug/?i=3005
- [33] = https://curl.haxx.se/bug/?i=3004
- [34] = https://curl.haxx.se/bug/?i=2996
- [35] = https://curl.haxx.se/bug/?i=3001
- [36] = https://curl.haxx.se/bug/?i=3016
- [37] = https://curl.haxx.se/bug/?i=3014
- [38] = https://curl.haxx.se/bug/?i=2969
- [39] = https://curl.haxx.se/bug/?i=2971
- [40] = https://curl.haxx.se/bug/?i=3029
- [41] = https://curl.haxx.se/bug/?i=2697
- [42] = https://curl.haxx.se/bug/?i=3032
- [43] = https://curl.haxx.se/bug/?i=3030
- [44] = https://curl.haxx.se/bug/?i=3033
- [45] = https://curl.haxx.se/bug/?i=3036
- [46] = https://curl.haxx.se/bug/?i=3039
- [47] = https://curl.haxx.se/bug/?i=3026
- [48] = https://curl.haxx.se/bug/?i=3023
- [49] = https://curl.haxx.se/bug/?i=3042
- [50] = https://curl.haxx.se/bug/?i=3044
- [51] = https://curl.haxx.se/bug/?i=3046
- [52] = https://curl.haxx.se/bug/?i=3050
- [53] = https://curl.haxx.se/bug/?i=3006
- [54] = https://github.com/curl/curl/issues/2924#issuecomment-424334807
- [55] = https://curl.haxx.se/bug/?i=3055
- [56] = https://curl.haxx.se/bug/?i=3056
- [57] = https://curl.haxx.se/bug/?i=3008
- [58] = https://curl.haxx.se/bug/?i=3062
- [59] = https://curl.haxx.se/bug/?i=3063
- [60] = https://curl.haxx.se/bug/?i=2849
- [61] = https://curl.haxx.se/bug/?i=3048
- [62] = https://curl.haxx.se/bug/?i=3096
- [63] = https://curl.haxx.se/bug/?i=3090
- [64] = https://curl.haxx.se/bug/?i=3097
- [65] = https://curl.haxx.se/bug/?i=3100
- [66] = https://curl.haxx.se/bug/?i=3093
- [67] = https://curl.haxx.se/bug/?i=2929
- [68] = https://curl.haxx.se/bug/?i=3084
- [69] = https://curl.haxx.se/bug/?i=3079
- [70] = https://curl.haxx.se/bug/?i=3086
- [71] = https://curl.haxx.se/bug/?i=3085
- [72] = https://github.com/curl/curl/issues/1751#issuecomment-321522580
- [73] = https://curl.haxx.se/bug/?i=3077
- [74] = https://curl.haxx.se/bug/?i=3075
- [75] = https://curl.haxx.se/bug/?i=3111
- [76] = https://curl.haxx.se/bug/?i=3067
- [77] = https://curl.haxx.se/bug/?i=3110
- [78] = https://curl.haxx.se/bug/?i=3083
- [79] = https://curl.haxx.se/bug/?i=3105
- [80] = https://curl.haxx.se/bug/?i=2394
- [81] = https://curl.haxx.se/bug/?i=3104
- [82] = https://curl.haxx.se/bug/?i=3113
- [83] = https://curl.haxx.se/bug/?i=3118
- [84] = https://curl.haxx.se/bug/?i=3120
- [85] = https://curl.haxx.se/bug/?i=3121
- [86] = https://curl.haxx.se/bug/?i=3126
- [87] = https://curl.haxx.se/bug/?i=3124
- [88] = https://curl.haxx.se/bug/?i=3102
- [89] = https://curl.haxx.se/bug/?i=3159
- [90] = https://curl.haxx.se/bug/?i=3138
- [91] = https://curl.haxx.se/bug/?i=3137
- [92] = https://curl.haxx.se/bug/?i=3137
- [93] = https://curl.haxx.se/bug/?i=3144
- [94] = https://curl.haxx.se/bug/?i=3140
- [95] = https://curl.haxx.se/bug/?i=3178
- [96] = https://curl.haxx.se/bug/?i=3179
- [97] = https://curl.haxx.se/bug/?i=3176
- [98] = https://curl.haxx.se/bug/?i=3171
- [99] = https://curl.haxx.se/bug/?i=3143
- [100] = https://curl.haxx.se/bug/?i=3155
- [101] = https://curl.haxx.se/bug/?i=3168
- [102] = https://curl.haxx.se/bug/?i=3166
- [103] = https://curl.haxx.se/bug/?i=3122
- [104] = https://curl.haxx.se/bug/?i=3162
- [105] = https://curl.haxx.se/bug/?i=3182
- [106] = https://curl.haxx.se/bug/?i=3182
- [107] = https://curl.haxx.se/docs/CVE-2018-16839.html
- [108] = https://curl.haxx.se/docs/CVE-2018-16840.html
- [109] = https://curl.haxx.se/bug/?i=3181
- [110] = https://curl.haxx.se/bug/?i=3163
- [111] = https://curl.haxx.se/bug/?i=3163
- [112] = https://curl.haxx.se/bug/?i=3170
- [113] = https://curl.haxx.se/bug/?i=3123
- [114] = https://curl.haxx.se/docs/CVE-2018-16842.html
+ [1] = https://curl.haxx.se/bug/?i=4567
+ [2] = https://curl.haxx.se/bug/?i=4565
+ [3] = https://curl.haxx.se/bug/?i=3704
+ [4] = https://curl.haxx.se/bug/?i=4570
+ [5] = https://curl.haxx.se/bug/?i=4525
+ [6] = https://curl.haxx.se/bug/?i=4604
+ [7] = https://curl.haxx.se/bug/?i=4614
+ [8] = https://curl.haxx.se/bug/?i=4612
+ [9] = https://curl.haxx.se/bug/?i=4609
+ [10] = https://curl.haxx.se/bug/?i=4606
+ [11] = https://curl.haxx.se/bug/?i=4598
+ [12] = https://curl.haxx.se/bug/?i=4600
+ [13] = https://curl.haxx.se/bug/?i=4590
+ [14] = https://curl.haxx.se/bug/?i=4596
+ [15] = https://curl.haxx.se/bug/?i=4594
+ [16] = https://curl.haxx.se/bug/?i=4588
+ [17] = https://curl.haxx.se/bug/?i=4571
+ [18] = https://curl.haxx.se/bug/?i=4585
+ [19] = https://curl.haxx.se/bug/?i=4545
+ [20] = https://curl.haxx.se/bug/?i=4575
+ [21] = https://curl.haxx.se/bug/?i=4554
+ [22] = https://curl.haxx.se/bug/?i=4563
+ [23] = https://curl.haxx.se/bug/?i=4576
+ [24] = https://curl.haxx.se/bug/?i=4556
+ [25] = https://curl.haxx.se/bug/?i=4549
+ [26] = https://curl.haxx.se/bug/?i=4624
+ [27] = https://curl.haxx.se/bug/?i=4593
+ [28] = https://curl.haxx.se/bug/?i=4628
+ [29] = https://curl.haxx.se/bug/?i=4500
+ [30] = https://curl.haxx.se/bug/?i=4618
+ [31] = https://curl.haxx.se/bug/?i=4543
+ [32] = https://curl.haxx.se/bug/?i=4646
+ [33] = https://curl.haxx.se/bug/?i=4645
+ [34] = https://curl.haxx.se/bug/?i=4637
+ [35] = https://curl.haxx.se/bug/?i=2051
+ [36] = https://curl.haxx.se/bug/?i=4599
+ [37] = https://curl.haxx.se/bug/?i=4597
+ [38] = https://curl.haxx.se/bug/?i=4418
+ [39] = https://curl.haxx.se/bug/?i=4633
+ [40] = https://curl.haxx.se/bug/?i=4607
+ [41] = https://curl.haxx.se/bug/?i=4492
+ [42] = https://curl.haxx.se/bug/?i=4668
+ [43] = https://curl.haxx.se/bug/?i=4663
+ [44] = https://curl.haxx.se/bug/?i=4662
+ [45] = https://curl.haxx.se/bug/?i=4665
+ [46] = https://curl.haxx.se/mail/lib-2019-11/0094.html
+ [47] = https://curl.haxx.se/bug/?i=4644
+ [48] = https://curl.haxx.se/mail/lib-2019-12/0007.html
+ [49] = https://curl.haxx.se/bug/?i=4658
+ [50] = https://curl.haxx.se/bug/?i=2425
+ [51] = https://curl.haxx.se/bug/?i=4550
+ [52] = https://curl.haxx.se/bug/?i=4636
+ [53] = https://curl.haxx.se/bug/?i=4152
+ [54] = https://curl.haxx.se/bug/?i=4649
+ [55] = https://curl.haxx.se/bug/?i=3935
+ [56] = https://curl.haxx.se/bug/?i=4301
+ [57] = https://curl.haxx.se/bug/?i=4694
+ [58] = https://curl.haxx.se/bug/?i=3899
+ [59] = https://curl.haxx.se/bug/?i=4688
+ [60] = https://curl.haxx.se/bug/?i=4557
+ [61] = https://curl.haxx.se/bug/?i=4544
+ [62] = https://curl.haxx.se/bug/?i=4680
+ [63] = https://curl.haxx.se/bug/?i=4713
+ [64] = https://curl.haxx.se/bug/?i=4692
+ [65] = https://curl.haxx.se/bug/?i=4710
+ [66] = https://curl.haxx.se/bug/?i=4709
+ [67] = https://curl.haxx.se/bug/?i=4707
+ [68] = https://curl.haxx.se/bug/?i=4704
+ [69] = https://curl.haxx.se/bug/?i=4705
+ [70] = https://curl.haxx.se/bug/?i=4699
+ [71] = https://curl.haxx.se/bug/?i=4369
+ [72] = https://curl.haxx.se/bug/?i=4698
+ [73] = https://curl.haxx.se/bug/?i=4744
+ [74] = https://curl.haxx.se/bug/?i=4738
+ [75] = https://curl.haxx.se/bug/?i=4739
+ [76] = https://curl.haxx.se/bug/?i=4732
+ [77] = https://curl.haxx.se/bug/?i=4733
+ [78] = https://curl.haxx.se/bug/?i=4736
+ [79] = https://github.com/curl/curl/commit/5b22e1a#r36458547
+ [80] = https://curl.haxx.se/bug/?i=4730
+ [81] = https://curl.haxx.se/bug/?i=4731
+ [82] = https://curl.haxx.se/bug/?i=4728
+ [83] = https://curl.haxx.se/bug/?i=4725
+ [84] = https://curl.haxx.se/bug/?i=4683
+ [85] = https://curl.haxx.se/bug/?i=4296
+ [86] = https://curl.haxx.se/bug/?i=4261
+ [87] = https://curl.haxx.se/bug/?i=4262
+ [88] = https://curl.haxx.se/bug/?i=4721
+ [89] = https://curl.haxx.se/bug/?i=4714
+ [90] = https://curl.haxx.se/bug/?i=4720
+ [91] = https://curl.haxx.se/bug/?i=4715
+ [92] = https://curl.haxx.se/bug/?i=4735
+ [93] = https://curl.haxx.se/bug/?i=4775
+ [94] = https://github.com/curl/curl/pull/4717#issuecomment-570240785
+ [95] = https://curl.haxx.se/bug/?i=4771
+ [96] = https://curl.haxx.se/bug/?i=4768
+ [97] = https://curl.haxx.se/bug/?i=3730
+ [98] = https://curl.haxx.se/bug/?i=4767
+ [99] = https://curl.haxx.se/bug/?i=4756
+ [100] = https://curl.haxx.se/bug/?i=4758
+ [101] = https://curl.haxx.se/bug/?i=4751
+ [102] = https://curl.haxx.se/bug/?i=4745
+ [103] = https://curl.haxx.se/bug/?i=4772
+ [104] = https://curl.haxx.se/bug/?i=4781
+ [105] = https://curl.haxx.se/bug/?i=4786
+ [106] = https://curl.haxx.se/docs/CVE-2019-15601.html
+ [107] = https://curl.haxx.se/bug/?i=4787
+ [108] = https://curl.haxx.se/bug/?i=4785
+ [109] = https://curl.haxx.se/bug/?i=4783
+ [110] = https://curl.haxx.se/bug/?i=4790
+ [111] = https://curl.haxx.se/bug/?i=4788
index c4c75f3..24dad39 100644 (file)
@@ -791,7 +791,9 @@ AC_DEFUN([CURL_CHECK_LIBS_LDAP], [
     '-lldap -llber' \
     '-llber -lldap' \
     '-lldapssl -lldapx -lldapsdk' \
-    '-lldapsdk -lldapx -lldapssl' ; do
+    '-lldapsdk -lldapx -lldapssl' \
+    '-lldap -llber -lssl -lcrypto' ; do
+
     if test "$curl_cv_ldap_LIBS" = "unknown"; then
       if test -z "$x_nlibs"; then
         LIBS="$curl_cv_save_LIBS"
@@ -1029,6 +1031,10 @@ AC_DEFUN([CURL_CHECK_FUNC_RECV], [
 #endif
 #endif
 #else
+#ifdef HAVE_PROTO_BSDSOCKET_H
+#include <proto/bsdsocket.h>
+struct Library *SocketBase = NULL;
+#endif
 #ifdef HAVE_SYS_TYPES_H
 #include <sys/types.h>
 #endif
@@ -1074,6 +1080,10 @@ AC_DEFUN([CURL_CHECK_FUNC_RECV], [
 #endif
 #define RECVCALLCONV PASCAL
 #else
+#ifdef HAVE_PROTO_BSDSOCKET_H
+#include <proto/bsdsocket.h>
+struct Library *SocketBase = NULL;
+#endif
 #ifdef HAVE_SYS_TYPES_H
 #include <sys/types.h>
 #endif
@@ -1082,11 +1092,10 @@ AC_DEFUN([CURL_CHECK_FUNC_RECV], [
 #endif
 #define RECVCALLCONV
 #endif
+#ifndef HAVE_PROTO_BSDSOCKET_H
                       extern $recv_retv RECVCALLCONV
-#ifdef __ANDROID__
-__attribute__((overloadable))
-#endif
                       recv($recv_arg1, $recv_arg2, $recv_arg3, $recv_arg4);
+#endif
                     ]],[[
                       $recv_arg1 s=0;
                       $recv_arg2 buf=0;
@@ -1166,6 +1175,10 @@ AC_DEFUN([CURL_CHECK_FUNC_SEND], [
 #endif
 #endif
 #else
+#ifdef HAVE_PROTO_BSDSOCKET_H
+#include <proto/bsdsocket.h>
+struct Library *SocketBase = NULL;
+#endif
 #ifdef HAVE_SYS_TYPES_H
 #include <sys/types.h>
 #endif
@@ -1211,6 +1224,10 @@ AC_DEFUN([CURL_CHECK_FUNC_SEND], [
 #endif
 #define SENDCALLCONV PASCAL
 #else
+#ifdef HAVE_PROTO_BSDSOCKET_H
+#include <proto/bsdsocket.h>
+struct Library *SocketBase = NULL;
+#endif
 #ifdef HAVE_SYS_TYPES_H
 #include <sys/types.h>
 #endif
@@ -1219,11 +1236,10 @@ AC_DEFUN([CURL_CHECK_FUNC_SEND], [
 #endif
 #define SENDCALLCONV
 #endif
+#ifndef HAVE_PROTO_BSDSOCKET_H
                       extern $send_retv SENDCALLCONV
-#ifdef __ANDROID__
-__attribute__((overloadable))
-#endif
                       send($send_arg1, $send_arg2, $send_arg3, $send_arg4);
+#endif
                     ]],[[
                       $send_arg1 s=0;
                       $send_arg3 len=0;
@@ -1325,6 +1341,10 @@ AC_DEFUN([CURL_CHECK_MSG_NOSIGNAL], [
 #endif
 #endif
 #else
+#ifdef HAVE_PROTO_BSDSOCKET_H
+#include <proto/bsdsocket.h>
+struct Library *SocketBase = NULL;
+#endif
 #ifdef HAVE_SYS_TYPES_H
 #include <sys/types.h>
 #endif
@@ -1718,6 +1738,7 @@ dnl using current libraries or if another one is required.
 
 AC_DEFUN([CURL_CHECK_LIBS_CONNECT], [
   AC_REQUIRE([CURL_INCLUDES_WINSOCK2])dnl
+  AC_REQUIRE([CURL_INCLUDES_BSDSOCKET])dnl
   AC_MSG_CHECKING([for connect in libraries])
   tst_connect_save_LIBS="$LIBS"
   tst_connect_need_LIBS="unknown"
@@ -1727,7 +1748,8 @@ AC_DEFUN([CURL_CHECK_LIBS_CONNECT], [
       AC_LINK_IFELSE([
         AC_LANG_PROGRAM([[
           $curl_includes_winsock2
-          #ifndef HAVE_WINDOWS_H
+          $curl_includes_bsdsocket
+          #if !defined(HAVE_WINDOWS_H) && !defined(HAVE_PROTO_BSDSOCKET_H)
             int connect(int, void*, int);
           #endif
         ]],[[
@@ -1858,6 +1880,11 @@ AC_DEFUN([CURL_CHECK_FUNC_SELECT], [
 #endif
 #endif
 #ifndef HAVE_WINDOWS_H
+#ifdef HAVE_PROTO_BSDSOCKET_H
+#include <proto/bsdsocket.h>
+struct Library *SocketBase = NULL;
+#define select(a,b,c,d,e) WaitSelect(a,b,c,d,e,0)
+#endif
 #ifdef HAVE_SYS_SELECT_H
 #include <sys/select.h>
 #endif
@@ -1916,6 +1943,11 @@ AC_DEFUN([CURL_CHECK_FUNC_SELECT], [
 #endif
 #endif
 #ifndef HAVE_WINDOWS_H
+#ifdef HAVE_PROTO_BSDSOCKET_H
+#include <proto/bsdsocket.h>
+struct Library *SocketBase = NULL;
+#define select(a,b,c,d,e) WaitSelect(a,b,c,d,e,0)
+#endif
 #ifdef HAVE_SYS_SELECT_H
 #include <sys/select.h>
 #endif
@@ -1930,15 +1962,14 @@ AC_DEFUN([CURL_CHECK_FUNC_SELECT], [
                       long tv_usec;
                     };
 #endif
+#ifndef HAVE_PROTO_BSDSOCKET_H
                     extern $sel_retv SELECTCALLCONV
-#ifdef __ANDROID__
-__attribute__((overloadable))
-#endif
-                       select($sel_arg1,
+                               select($sel_arg1,
                                        $sel_arg234,
                                        $sel_arg234,
                                        $sel_arg234,
                                        $sel_arg5);
+#endif
                   ]],[[
                     $sel_arg1   nfds=0;
                     $sel_arg234 rfds=0;
index 5ffc5b4..edb17e4 100644 (file)
@@ -1169,7 +1169,6 @@ AC_SUBST([am__tar])
 AC_SUBST([am__untar])
 ]) # _AM_PROG_TAR
 
-m4_include([m4/ax_code_coverage.m4])
 m4_include([m4/ax_compile_check_sizeof.m4])
 m4_include([m4/curl-compilers.m4])
 m4_include([m4/curl-confopts.m4])
index a6bded3..0435233 100644 (file)
@@ -6,7 +6,7 @@ rem *                             / __| | | | |_) | |
 rem *                            | (__| |_| |  _ <| |___
 rem *                             \___|\___/|_| \_\_____|
 rem *
-rem * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+rem * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 rem *
 rem * This software is licensed as described in the file COPYING, which
 rem * you should have received as part of this distribution. The terms
@@ -212,7 +212,7 @@ rem
       copy /Y src\tool_hugehelp.c.cvs src\tool_hugehelp.c 1>NUL 2>&1
     ) else (
       echo #include "tool_setup.h"> src\tool_hugehelp.c
-      echo #include "tool_hugehelp.hd">> src\tool_hugehelp.c
+      echo #include "tool_hugehelp.h">> src\tool_hugehelp.c
       echo.>> src\tool_hugehelp.c
       echo void hugehelp(void^)>> src\tool_hugehelp.c
       echo {>> src\tool_hugehelp.c
index cbf0802..34de962 100755 (executable)
--- a/configure
+++ b/configure
@@ -11,7 +11,7 @@
 # This configure script is free software; the Free Software Foundation
 # gives unlimited permission to copy, distribute and modify it.
 #
-# Copyright (c) 1998 - 2017 Daniel Stenberg, <daniel@haxx.se>
+# Copyright (c) 1998 - 2019 Daniel Stenberg, <daniel@haxx.se>
 # This configure script may be copied, distributed and modified under the
 # terms of the curl license; see COPYING for more details
 
@@ -902,8 +902,12 @@ USE_MANUAL_TRUE
 MANOPT
 NROFF
 PERL
-IPV6_ENABLED
+FISH_FUNCTIONS_DIR
 ZSH_FUNCTIONS_DIR
+USE_QUICHE
+USE_NGHTTP3
+USE_NGTCP2_CRYPTO_OPENSSL
+USE_NGTCP2
 USE_NGHTTP2
 IDN_ENABLED
 CURL_LT_SHLIB_USE_VERSIONED_SYMBOLS_FALSE
@@ -920,25 +924,25 @@ USE_LIBPSL_TRUE
 CURL_CA_BUNDLE
 CURL_WITH_MULTI_SSL
 SSL_ENABLED
-USE_AXTLS
 NSS_LIBS
 USE_NSS
+USE_BEARSSL
 USE_MESALINK
-USE_CYASSL
+USE_WOLFSSL
 USE_MBEDTLS
-USE_POLARSSL
 HAVE_GNUTLS_SRP
 USE_GNUTLS_NETTLE
 USE_GNUTLS
 HAVE_OPENSSL_SRP
 RANDOM_FILE
 SSL_LIBS
-USE_DARWINSSL
+USE_SECTRANSP
 USE_WINDOWS_SSPI
 USE_SCHANNEL
 DEFAULT_SSL_BACKEND
 BUILD_STUB_GSS_FALSE
 BUILD_STUB_GSS_TRUE
+IPV6_ENABLED
 USE_OPENLDAP
 HAVE_BROTLI
 ZLIB_LIBS
@@ -946,6 +950,7 @@ HAVE_LIBZ_FALSE
 HAVE_LIBZ_TRUE
 HAVE_LIBZ
 PKGCONFIG
+HAVE_PROTO_BSDSOCKET_H
 CURL_DISABLE_GOPHER
 CURL_DISABLE_SMTP
 CURL_DISABLE_SMB
@@ -1042,18 +1047,8 @@ VERSION
 PACKAGE
 CYGPATH_W
 am__isrc
-CODE_COVERAGE_RULES
-CODE_COVERAGE_LDFLAGS
-CODE_COVERAGE_LIBS
-CODE_COVERAGE_CXXFLAGS
-CODE_COVERAGE_CFLAGS
-CODE_COVERAGE_CPPFLAGS
-GENHTML
 LCOV
 GCOV
-CODE_COVERAGE_ENABLED
-CODE_COVERAGE_ENABLED_FALSE
-CODE_COVERAGE_ENABLED_TRUE
 CPP
 OBJEXT
 EXEEXT
@@ -1133,7 +1128,7 @@ enable_symbol_hiding
 enable_hidden_symbols
 enable_ares
 enable_rt
-with_gcov
+enable_esni
 enable_code_coverage
 enable_dependency_tracking
 enable_largefile
@@ -1173,19 +1168,20 @@ with_gssapi_libs
 with_gssapi
 with_default_ssl_backend
 with_winssl
+with_schannel
 with_darwinssl
+with_secure_transport
+with_amissl
 with_ssl
 with_egd_socket
 with_random
 enable_openssl_auto_load_config
 with_gnutls
-with_polarssl
 with_mbedtls
-with_cyassl
 with_wolfssl
 with_mesalink
+with_bearssl
 with_nss
-with_axtls
 with_ca_bundle
 with_ca_path
 with_ca_fallback
@@ -1198,7 +1194,11 @@ enable_versioned_symbols
 with_winidn
 with_libidn2
 with_nghttp2
+with_ngtcp2
+with_nghttp3
+with_quiche
 with_zsh_functions_dir
+with_fish_functions_dir
 enable_threaded_resolver
 enable_pthreads
 enable_verbose
@@ -1208,6 +1208,14 @@ enable_ntlm_wb
 enable_tls_srp
 enable_unix_sockets
 enable_cookies
+enable_http_auth
+enable_doh
+enable_mime
+enable_dateparse
+enable_netrc
+enable_progress_meter
+enable_dnsshuffle
+enable_alt_svc
 '
       ac_precious_vars='build_alias
 host_alias
@@ -1871,7 +1879,9 @@ Optional Features:
   --enable-ares[=PATH]    Enable c-ares for DNS lookups
   --disable-ares          Disable c-ares for DNS lookups
   --disable-rt            disable dependency on -lrt
-  --enable-code-coverage  Whether to enable code coverage support
+  --enable-esni           Enable ESNI support
+  --disable-esni          Disable ESNI support
+  --enable-code-coverage  Provide code coverage
   --enable-dependency-tracking
                           do not reject slow dependency extractors
   --disable-dependency-tracking
@@ -1951,11 +1961,27 @@ Optional Features:
   --disable-unix-sockets  Disable Unix domain sockets
   --enable-cookies        Enable cookies support
   --disable-cookies       Disable cookies support
+  --enable-http-auth      Enable HTTP authentication support
+  --disable-http-auth     Disable HTTP authentication support
+  --enable-doh            Enable DoH support
+  --disable-doh           Disable DoH support
+  --enable-mime           Enable mime API support
+  --disable-mime          Disable mime API support
+  --enable-dateparse      Enable date parsing
+  --disable-dateparse     Disable date parsing
+  --enable-netrc          Enable netrc parsing
+  --disable-netrc         Disable netrc parsing
+  --enable-progress-meter Enable progress-meter
+  --disable-progress-meter
+                          Disable progress-meter
+  --enable-dnsshuffle     Enable DNS shuffling
+  --disable-dnsshuffle    Disable DNS shuffling
+  --enable-alt-svc        Enable alt-svc support
+  --disable-alt-svc       Disable alt-svc support
 
 Optional Packages:
   --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
   --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)
-  --with-gcov=GCOV        use given GCOV for coverage (GCOV=gcov).
   --with-pic[=PKGS]       try to use only PIC/non-PIC objects [default=use
                           both]
   --with-aix-soname=aix|svr4|both
@@ -1982,8 +2008,15 @@ Optional Packages:
                           Use implicit default SSL backend
   --with-winssl           enable Windows native SSL/TLS
   --without-winssl        disable Windows native SSL/TLS
+  --with-schannel         enable Windows native SSL/TLS
+  --without-schannel      disable Windows native SSL/TLS
   --with-darwinssl        enable Apple OS native SSL/TLS
   --without-darwinssl     disable Apple OS native SSL/TLS
+  --with-secure-transport enable Apple OS native SSL/TLS
+  --without-secure-transport
+                          disable Apple OS native SSL/TLS
+  --with-amissl           enable Amiga native SSL/TLS (AmiSSL)
+  --without-amissl        disable Amiga native SSL/TLS (AmiSSL)
   --with-ssl=PATH         Where to look for OpenSSL, PATH points to the SSL
                           installation (default: /usr/local/ssl); when
                           possible, set the PKG_CONFIG_PATH environment
@@ -1994,28 +2027,21 @@ Optional Packages:
   --with-gnutls=PATH      where to look for GnuTLS, PATH points to the
                           installation root
   --without-gnutls        disable GnuTLS detection
-  --with-polarssl=PATH    where to look for PolarSSL, PATH points to the
-                          installation root
-  --without-polarssl      disable PolarSSL detection
   --with-mbedtls=PATH     where to look for mbedTLS, PATH points to the
                           installation root
   --without-mbedtls       disable mbedTLS detection
-  --with-cyassl=PATH      where to look for CyaSSL, PATH points to the
-                          installation root (default: system lib default)
-  --without-cyassl        disable CyaSSL detection
   --with-wolfssl=PATH     where to look for WolfSSL, PATH points to the
                           installation root (default: system lib default)
   --without-wolfssl       disable WolfSSL detection
   --with-mesalink=PATH    where to look for MesaLink, PATH points to the
                           installation root
   --without-mesalink      disable MesaLink detection
+  --with-bearssl=PATH     where to look for BearSSL, PATH points to the
+                          installation root
+  --without-bearssl       disable BearSSL detection
   --with-nss=PATH         where to look for NSS, PATH points to the
                           installation root
   --without-nss           disable NSS detection
-  --with-axtls=PATH       Where to look for axTLS, PATH points to the axTLS
-                          installation prefix (default: /usr/local). Ignored
-                          if another SSL engine is selected.
-  --without-axtls         disable axTLS
   --with-ca-bundle=FILE   Path to a file containing CA certificates (example:
                           /etc/ca-bundle.crt)
   --without-ca-bundle     Don't use a default CA bundle
@@ -2052,10 +2078,20 @@ Optional Packages:
   --without-libidn2       Disable libidn2 usage
   --with-nghttp2=PATH     Enable nghttp2 usage
   --without-nghttp2       Disable nghttp2 usage
+  --with-ngtcp2=PATH      Enable ngtcp2 usage
+  --without-ngtcp2        Disable ngtcp2 usage
+  --with-nghttp3=PATH     Enable nghttp3 usage
+  --without-nghttp3       Disable nghttp3 usage
+  --with-quiche=PATH      Enable quiche usage
+  --without-quiche        Disable quiche usage
   --with-zsh-functions-dir=PATH
                           Install zsh completions to PATH
   --without-zsh-functions-dir
                           Do not install zsh completions
+  --with-fish-functions-dir=PATH
+                          Install fish completions to PATH
+  --without-fish-functions-dir
+                          Do not install fish completions
 
 Some influential environment variables:
   CC          C compiler command
@@ -2142,7 +2178,7 @@ Copyright (C) 2012 Free Software Foundation, Inc.
 This configure script is free software; the Free Software Foundation
 gives unlimited permission to copy, distribute and modify it.
 
-Copyright (c) 1998 - 2017 Daniel Stenberg, <daniel@haxx.se>
+Copyright (c) 1998 - 2019 Daniel Stenberg, <daniel@haxx.se>
 This configure script may be copied, distributed and modified under the
 terms of the curl license; see COPYING for more details
 _ACEOF
@@ -3299,6 +3335,37 @@ $as_echo "no" >&6; }
   esac
 
 
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable ESNI support" >&5
+$as_echo_n "checking whether to enable ESNI support... " >&6; }
+  OPT_ESNI="default"
+  # Check whether --enable-esni was given.
+if test "${enable_esni+set}" = set; then :
+  enableval=$enable_esni; OPT_ESNI=$enableval
+fi
+
+  case "$OPT_ESNI" in
+    no)
+            want_esni="no"
+      curl_esni_msg="no      (--enable-esni)"
+      { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+      ;;
+    default)
+            want_esni="no"
+      curl_esni_msg="no      (--enable-esni)"
+      { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+      ;;
+    *)
+            want_esni="yes"
+      curl_esni_msg="enabled (--disable-esni)"
+      experimental="esni"
+      { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+      ;;
+  esac
+
+
 #
 # Check that 'XC_CONFIGURE_PREAMBLE' has already run.
 #
@@ -4969,49 +5036,32 @@ $as_echo "$ac_cv_path_SED" >&6; }
  SED="$ac_cv_path_SED"
   rm -f conftest.sed
 
-if  test "$GCC" = "yes" ; then :
 
 
 
-       # allow to override gcov location
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for code coverage support" >&5
+$as_echo_n "checking for code coverage support... " >&6; }
+  coverage="no"
+  curl_coverage_msg="disabled"
 
-# Check whether --with-gcov was given.
-if test "${with_gcov+set}" = set; then :
-  withval=$with_gcov; _AX_CODE_COVERAGE_GCOV_PROG_WITH=$with_gcov
-else
-  _AX_CODE_COVERAGE_GCOV_PROG_WITH=gcov
-fi
-
-
-       { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build with code coverage support" >&5
-$as_echo_n "checking whether to build with code coverage support... " >&6; }
-       # Check whether --enable-code-coverage was given.
+    # Check whether --enable-code-coverage was given.
 if test "${enable_code_coverage+set}" = set; then :
-  enableval=$enable_code_coverage;
-else
-  enable_code_coverage=no
+  enableval=$enable_code_coverage; coverage="$enableval"
 fi
 
 
-        if test x$enable_code_coverage = xyes; then
-  CODE_COVERAGE_ENABLED_TRUE=
-  CODE_COVERAGE_ENABLED_FALSE='#'
-else
-  CODE_COVERAGE_ENABLED_TRUE='#'
-  CODE_COVERAGE_ENABLED_FALSE=
+    if  test "$GCC" != "yes" ; then :
+  coverage="no"
 fi
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $coverage" >&5
+$as_echo "$coverage" >&6; }
 
-       CODE_COVERAGE_ENABLED=$enable_code_coverage
-
-       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_code_coverage" >&5
-$as_echo "$enable_code_coverage" >&6; }
-
-       if  test "$enable_code_coverage" = "yes" ; then :
+  if test "x$coverage" = "xyes"; then
+    curl_coverage_msg="enabled"
 
-               # check for gcov
-               if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}$_AX_CODE_COVERAGE_GCOV_PROG_WITH", so it can be a program name with args.
-set dummy ${ac_tool_prefix}$_AX_CODE_COVERAGE_GCOV_PROG_WITH; ac_word=$2
+    if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}gcov", so it can be a program name with args.
+set dummy ${ac_tool_prefix}gcov; ac_word=$2
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
 $as_echo_n "checking for $ac_word... " >&6; }
 if ${ac_cv_prog_GCOV+:} false; then :
@@ -5027,7 +5077,7 @@ do
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
   if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_GCOV="${ac_tool_prefix}$_AX_CODE_COVERAGE_GCOV_PROG_WITH"
+    ac_cv_prog_GCOV="${ac_tool_prefix}gcov"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
@@ -5050,8 +5100,8 @@ fi
 fi
 if test -z "$ac_cv_prog_GCOV"; then
   ac_ct_GCOV=$GCOV
-  # Extract the first word of "$_AX_CODE_COVERAGE_GCOV_PROG_WITH", so it can be a program name with args.
-set dummy $_AX_CODE_COVERAGE_GCOV_PROG_WITH; ac_word=$2
+  # Extract the first word of "gcov", so it can be a program name with args.
+set dummy gcov; ac_word=$2
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
 $as_echo_n "checking for $ac_word... " >&6; }
 if ${ac_cv_prog_ac_ct_GCOV+:} false; then :
@@ -5067,7 +5117,7 @@ do
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
   if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_ac_ct_GCOV="$_AX_CODE_COVERAGE_GCOV_PROG_WITH"
+    ac_cv_prog_ac_ct_GCOV="gcov"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
@@ -5087,7 +5137,7 @@ $as_echo "no" >&6; }
 fi
 
   if test "x$ac_ct_GCOV" = x; then
-    GCOV=":"
+    GCOV="gcov"
   else
     case $cross_compiling:$ac_tool_warned in
 yes:)
@@ -5101,18 +5151,10 @@ else
   GCOV="$ac_cv_prog_GCOV"
 fi
 
-               if test "X$GCOV" = "X:"; then :
-  as_fn_error $? "gcov is needed to do coverage" "$LINENO" 5
-fi
-
-
-                               if  test "$GCC" = "no" ; then :
-
-                       as_fn_error $? "not compiling with gcc, which is required for gcov code coverage" "$LINENO" 5
-
-fi
-
-               # Extract the first word of "lcov", so it can be a program name with args.
+    if test -z "$GCOV"; then
+      as_fn_error $? "needs gcov for code coverage" "$LINENO" 5
+    fi
+    # Extract the first word of "lcov", so it can be a program name with args.
 set dummy lcov; ac_word=$2
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
 $as_echo_n "checking for $ac_word... " >&6; }
@@ -5149,202 +5191,15 @@ $as_echo "no" >&6; }
 fi
 
 
-               # Extract the first word of "genhtml", so it can be a program name with args.
-set dummy genhtml; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_GENHTML+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$GENHTML"; then
-  ac_cv_prog_GENHTML="$GENHTML" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_GENHTML="genhtml"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-GENHTML=$ac_cv_prog_GENHTML
-if test -n "$GENHTML"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GENHTML" >&5
-$as_echo "$GENHTML" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-
-               if  test -z "$LCOV" ; then :
-
-                       as_fn_error $? "To enable code coverage reporting you must have lcov installed" "$LINENO" 5
-
-fi
-
-               if  test -z "$GENHTML" ; then :
-
-                       as_fn_error $? "Could not find genhtml from the lcov package" "$LINENO" 5
-
-fi
-
-                                               CODE_COVERAGE_CPPFLAGS="-DNDEBUG"
-               CODE_COVERAGE_CFLAGS="-O0 -g -fprofile-arcs -ftest-coverage"
-               CODE_COVERAGE_CXXFLAGS="-O0 -g -fprofile-arcs -ftest-coverage"
-               CODE_COVERAGE_LIBS="-lgcov"
-               CODE_COVERAGE_LDFLAGS="$CODE_COVERAGE_LIBS"
-
-
-
-
-
-
-
-               CODE_COVERAGE_RULES_CHECK='
-       -$(A''M_V_at)$(MAKE) $(AM_MAKEFLAGS) -k check
-       $(A''M_V_at)$(MAKE) $(AM_MAKEFLAGS) code-coverage-capture
-'
-               CODE_COVERAGE_RULES_CAPTURE='
-       $(code_coverage_v_lcov_cap)$(LCOV) $(code_coverage_quiet) $(addprefix --directory ,$(CODE_COVERAGE_DIRECTORY)) --capture --output-file "$(CODE_COVERAGE_OUTPUT_FILE).tmp" --test-name "$(call code_coverage_sanitize,$(PACKAGE_NAME)-$(PACKAGE_VERSION))" --no-checksum --compat-libtool $(CODE_COVERAGE_LCOV_SHOPTS) $(CODE_COVERAGE_LCOV_OPTIONS)
-       $(code_coverage_v_lcov_ign)$(LCOV) $(code_coverage_quiet) $(addprefix --directory ,$(CODE_COVERAGE_DIRECTORY)) --remove "$(CODE_COVERAGE_OUTPUT_FILE).tmp" "/tmp/*" $(CODE_COVERAGE_IGNORE_PATTERN) --output-file "$(CODE_COVERAGE_OUTPUT_FILE)" $(CODE_COVERAGE_LCOV_SHOPTS) $(CODE_COVERAGE_LCOV_RMOPTS)
-       -@rm -f $(CODE_COVERAGE_OUTPUT_FILE).tmp
-       $(code_coverage_v_genhtml)LANG=C $(GENHTML) $(code_coverage_quiet) $(addprefix --prefix ,$(CODE_COVERAGE_DIRECTORY)) --output-directory "$(CODE_COVERAGE_OUTPUT_DIRECTORY)" --title "$(PACKAGE_NAME)-$(PACKAGE_VERSION) Code Coverage" --legend --show-details "$(CODE_COVERAGE_OUTPUT_FILE)" $(CODE_COVERAGE_GENHTML_OPTIONS)
-       @echo "file://$(abs_builddir)/$(CODE_COVERAGE_OUTPUT_DIRECTORY)/index.html"
-'
-               CODE_COVERAGE_RULES_CLEAN='
-clean: code-coverage-clean
-distclean: code-coverage-clean
-code-coverage-clean:
-       -$(LCOV) --directory $(top_builddir) -z
-       -rm -rf $(CODE_COVERAGE_OUTPUT_FILE) $(CODE_COVERAGE_OUTPUT_FILE).tmp $(CODE_COVERAGE_OUTPUT_DIRECTORY)
-       -find . \( -name "*.gcda" -o -name "*.gcno" -o -name "*.gcov" \) -delete
-'
-
-else
-
-               CODE_COVERAGE_RULES_CHECK='
-       @echo "Need to reconfigure with --enable-code-coverage"
-'
-               CODE_COVERAGE_RULES_CAPTURE="$CODE_COVERAGE_RULES_CHECK"
-               CODE_COVERAGE_RULES_CLEAN=''
-
-fi
-
-CODE_COVERAGE_RULES='
-# Code coverage
-#
-# Optional:
-#  - CODE_COVERAGE_DIRECTORY: Top-level directory for code coverage reporting.
-#    Multiple directories may be specified, separated by whitespace.
-#    (Default: $(top_builddir))
-#  - CODE_COVERAGE_OUTPUT_FILE: Filename and path for the .info file generated
-#    by lcov for code coverage. (Default:
-#    $(PACKAGE_NAME)-$(PACKAGE_VERSION)-coverage.info)
-#  - CODE_COVERAGE_OUTPUT_DIRECTORY: Directory for generated code coverage
-#    reports to be created. (Default:
-#    $(PACKAGE_NAME)-$(PACKAGE_VERSION)-coverage)
-#  - CODE_COVERAGE_BRANCH_COVERAGE: Set to 1 to enforce branch coverage,
-#    set to 0 to disable it and leave empty to stay with the default.
-#    (Default: empty)
-#  - CODE_COVERAGE_LCOV_SHOPTS_DEFAULT: Extra options shared between both lcov
-#    instances. (Default: based on $CODE_COVERAGE_BRANCH_COVERAGE)
-#  - CODE_COVERAGE_LCOV_SHOPTS: Extra options to shared between both lcov
-#    instances. (Default: $CODE_COVERAGE_LCOV_SHOPTS_DEFAULT)
-#  - CODE_COVERAGE_LCOV_OPTIONS_GCOVPATH: --gcov-tool pathtogcov
-#  - CODE_COVERAGE_LCOV_OPTIONS_DEFAULT: Extra options to pass to the
-#    collecting lcov instance. (Default: $CODE_COVERAGE_LCOV_OPTIONS_GCOVPATH)
-#  - CODE_COVERAGE_LCOV_OPTIONS: Extra options to pass to the collecting lcov
-#    instance. (Default: $CODE_COVERAGE_LCOV_OPTIONS_DEFAULT)
-#  - CODE_COVERAGE_LCOV_RMOPTS_DEFAULT: Extra options to pass to the filtering
-#    lcov instance. (Default: empty)
-#  - CODE_COVERAGE_LCOV_RMOPTS: Extra options to pass to the filtering lcov
-#    instance. (Default: $CODE_COVERAGE_LCOV_RMOPTS_DEFAULT)
-#  - CODE_COVERAGE_GENHTML_OPTIONS_DEFAULT: Extra options to pass to the
-#    genhtml instance. (Default: based on $CODE_COVERAGE_BRANCH_COVERAGE)
-#  - CODE_COVERAGE_GENHTML_OPTIONS: Extra options to pass to the genhtml
-#    instance. (Default: $CODE_COVERAGE_GENHTML_OPTIONS_DEFAULT)
-#  - CODE_COVERAGE_IGNORE_PATTERN: Extra glob pattern of files to ignore
-#
-# The generated report will be titled using the $(PACKAGE_NAME) and
-# $(PACKAGE_VERSION). In order to add the current git hash to the title,
-# use the git-version-gen script, available online.
-
-# Optional variables
-CODE_COVERAGE_DIRECTORY ?= $(top_builddir)
-CODE_COVERAGE_OUTPUT_FILE ?= $(PACKAGE_NAME)-$(PACKAGE_VERSION)-coverage.info
-CODE_COVERAGE_OUTPUT_DIRECTORY ?= $(PACKAGE_NAME)-$(PACKAGE_VERSION)-coverage
-CODE_COVERAGE_BRANCH_COVERAGE ?=
-CODE_COVERAGE_LCOV_SHOPTS_DEFAULT ?= $(if $(CODE_COVERAGE_BRANCH_COVERAGE),\
---rc lcov_branch_coverage=$(CODE_COVERAGE_BRANCH_COVERAGE))
-CODE_COVERAGE_LCOV_SHOPTS ?= $(CODE_COVERAGE_LCOV_SHOPTS_DEFAULT)
-CODE_COVERAGE_LCOV_OPTIONS_GCOVPATH ?= --gcov-tool "$(GCOV)"
-CODE_COVERAGE_LCOV_OPTIONS_DEFAULT ?= $(CODE_COVERAGE_LCOV_OPTIONS_GCOVPATH)
-CODE_COVERAGE_LCOV_OPTIONS ?= $(CODE_COVERAGE_LCOV_OPTIONS_DEFAULT)
-CODE_COVERAGE_LCOV_RMOPTS_DEFAULT ?=
-CODE_COVERAGE_LCOV_RMOPTS ?= $(CODE_COVERAGE_LCOV_RMOPTS_DEFAULT)
-CODE_COVERAGE_GENHTML_OPTIONS_DEFAULT ?=\
-$(if $(CODE_COVERAGE_BRANCH_COVERAGE),\
---rc genhtml_branch_coverage=$(CODE_COVERAGE_BRANCH_COVERAGE))
-CODE_COVERAGE_GENHTML_OPTIONS ?= $(CODE_COVERAGE_GENHTML_OPTIONS_DEFAULT)
-CODE_COVERAGE_IGNORE_PATTERN ?=
-
-GITIGNOREFILES ?=
-GITIGNOREFILES += $(CODE_COVERAGE_OUTPUT_FILE) $(CODE_COVERAGE_OUTPUT_DIRECTORY)
-
-code_coverage_v_lcov_cap = $(code_coverage_v_lcov_cap_$(V))
-code_coverage_v_lcov_cap_ = $(code_coverage_v_lcov_cap_$(AM_DEFAULT_VERBOSITY))
-code_coverage_v_lcov_cap_0 = @echo "  LCOV   --capture"\
- $(CODE_COVERAGE_OUTPUT_FILE);
-code_coverage_v_lcov_ign = $(code_coverage_v_lcov_ign_$(V))
-code_coverage_v_lcov_ign_ = $(code_coverage_v_lcov_ign_$(AM_DEFAULT_VERBOSITY))
-code_coverage_v_lcov_ign_0 = @echo "  LCOV   --remove /tmp/*"\
- $(CODE_COVERAGE_IGNORE_PATTERN);
-code_coverage_v_genhtml = $(code_coverage_v_genhtml_$(V))
-code_coverage_v_genhtml_ = $(code_coverage_v_genhtml_$(AM_DEFAULT_VERBOSITY))
-code_coverage_v_genhtml_0 = @echo "  GEN   " $(CODE_COVERAGE_OUTPUT_DIRECTORY);
-code_coverage_quiet = $(code_coverage_quiet_$(V))
-code_coverage_quiet_ = $(code_coverage_quiet_$(AM_DEFAULT_VERBOSITY))
-code_coverage_quiet_0 = --quiet
-
-# sanitizes the test-name: replaces with underscores: dashes and dots
-code_coverage_sanitize = $(subst -,_,$(subst .,_,$(1)))
-
-# Use recursive makes in order to ignore errors during check
-check-code-coverage:'"$CODE_COVERAGE_RULES_CHECK"'
-
-# Capture code coverage data
-code-coverage-capture: code-coverage-capture-hook'"$CODE_COVERAGE_RULES_CAPTURE"'
-
-# Hook rule executed before code-coverage-capture, overridable by the user
-code-coverage-capture-hook:
-
-'"$CODE_COVERAGE_RULES_CLEAN"'
-
-A''M_DISTCHECK_CONFIGURE_FLAGS ?=
-A''M_DISTCHECK_CONFIGURE_FLAGS += --disable-code-coverage
-
-.PHONY: check-code-coverage code-coverage-capture code-coverage-capture-hook code-coverage-clean
-'
-
-
-
+    if test -z "$LCOV"; then
+      as_fn_error $? "needs lcov for code coverage" "$LINENO" 5
+    fi
 
-else
-  # not using GCC so pass a test below - CODE_COVERAGE_ENABLED_TRUE is not zero length
-  CODE_COVERAGE_ENABLED_TRUE='#'
+    CPPFLAGS="$CPPFLAGS -DNDEBUG"
+    CFLAGS="$CLAGS -O0 -g -fprofile-arcs -ftest-coverage"
+    LIBS="$LIBS -lgcov"
+  fi
 
-fi
 
 am__api_version='1.16'
 
@@ -6007,8 +5862,8 @@ PKGADD_VENDOR="curl.haxx.se"
 
 
 
-    curl_ssl_msg="no      (--with-{ssl,gnutls,nss,polarssl,mbedtls,cyassl,axtls,winssl,darwinssl,mesalink} )"
-    curl_ssh_msg="no      (--with-libssh2)"
+    curl_ssl_msg="no      (--with-{ssl,gnutls,nss,mbedtls,wolfssl,schannel,secure-transport,mesalink,amissl,bearssl} )"
+    curl_ssh_msg="no      (--with-{libssh,libssh2})"
    curl_zlib_msg="no      (--with-zlib)"
  curl_brotli_msg="no      (--with-brotli)"
     curl_gss_msg="no      (--with-gssapi)"
@@ -12028,6 +11883,12 @@ lt_prog_compiler_static=
        lt_prog_compiler_pic='-KPIC'
        lt_prog_compiler_static='-static'
         ;;
+      # flang / f18. f95 an alias for gfortran or flang on Debian
+      flang* | f18* | f95*)
+       lt_prog_compiler_wl='-Wl,'
+       lt_prog_compiler_pic='-fPIC'
+       lt_prog_compiler_static='-static'
+        ;;
       # icc used to be incompatible with GCC.
       # ICC 10 doesn't accept -KPIC any more.
       icc* | ifort*)
@@ -16334,40 +16195,8 @@ rm -f conftest.err conftest.i conftest.$ac_ext
   if test "$curl_cv_have_def___clang__" = "yes"; then
     { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
 $as_echo "yes" >&6; }
-    compiler_id="CLANG"
-    fullclangver=`$CC -v 2>&1 | grep version`
-    clangver=`echo $fullclangver | grep "based on LLVM " | "$SED" 's/.*(based on LLVM \([0-9]*\.[0-9]*\).*)/\1/'`
-    if test -z "$clangver"; then
-      if echo $fullclangver | grep "Apple LLVM version " >/dev/null; then
-                clangver="3.7"
-      else
-        clangver=`echo $fullclangver | "$SED" 's/.*version \([0-9]*\.[0-9]*\).*/\1/'`
-      fi
-    fi
-    clangvhi=`echo $clangver | cut -d . -f1`
-    clangvlo=`echo $clangver | cut -d . -f2`
-    compiler_num=`(expr $clangvhi "*" 100 + $clangvlo) 2>/dev/null`
-    flags_dbg_all="-g -g0 -g1 -g2 -g3"
-    flags_dbg_all="$flags_dbg_all -ggdb"
-    flags_dbg_all="$flags_dbg_all -gstabs"
-    flags_dbg_all="$flags_dbg_all -gstabs+"
-    flags_dbg_all="$flags_dbg_all -gcoff"
-    flags_dbg_all="$flags_dbg_all -gxcoff"
-    flags_dbg_all="$flags_dbg_all -gdwarf-2"
-    flags_dbg_all="$flags_dbg_all -gvms"
-    flags_dbg_yes="-g"
-    flags_dbg_off=""
-    flags_opt_all="-O -O0 -O1 -O2 -Os -O3 -O4"
-    flags_opt_yes="-Os"
-    flags_opt_off="-O0"
-  else
-    { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-  fi
-
-
-      { $as_echo "$as_me:${as_lineno-$LINENO}: checking if compiler is GNU C" >&5
-$as_echo_n "checking if compiler is GNU C... " >&6; }
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking if compiler is xlclang" >&5
+$as_echo_n "checking if compiler is xlclang... " >&6; }
 
     OLDCPPFLAGS=$CPPFLAGS
   # CPPPFLAG comes from CURL_CPP_P
@@ -16384,8 +16213,8 @@ $as_echo_n "checking if compiler is GNU C... " >&6; }
 /* end confdefs.h.  */
 
 
-#ifdef __GNUC__
-CURL_DEF_TOKEN __GNUC__
+#ifdef __ibmxl__
+CURL_DEF_TOKEN __ibmxl__
 #endif
 
 
@@ -16396,31 +16225,43 @@ if ac_fn_c_try_cpp "$LINENO"; then :
       "$GREP" CURL_DEF_TOKEN 2>/dev/null | \
       "$SED" 's/.*CURL_DEF_TOKEN[ ][ ]*//' 2>/dev/null | \
       "$SED" 's/["][ ]*["]//g' 2>/dev/null`
-    if test -z "$tmp_exp" || test "$tmp_exp" = "__GNUC__"; then
+    if test -z "$tmp_exp" || test "$tmp_exp" = "__ibmxl__"; then
       tmp_exp=""
     fi
 
 fi
 rm -f conftest.err conftest.i conftest.$ac_ext
   if test -z "$tmp_exp"; then
-    curl_cv_have_def___GNUC__=no
+    curl_cv_have_def___ibmxl__=no
 
   else
-    curl_cv_have_def___GNUC__=yes
-    curl_cv_def___GNUC__=$tmp_exp
+    curl_cv_have_def___ibmxl__=yes
+    curl_cv_def___ibmxl__=$tmp_exp
 
   fi
       CPPFLAGS=$OLDCPPFLAGS
 
-  if test "$curl_cv_have_def___GNUC__" = "yes" &&
-    test "$compiler_id" = "unknown"; then
-    { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+    if test "$curl_cv_have_def___ibmxl__" = "yes" ; then
+            { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
 $as_echo "yes" >&6; }
-    compiler_id="GNU_C"
-    gccver=`$CC -dumpversion`
-    gccvhi=`echo $gccver | cut -d . -f1`
-    gccvlo=`echo $gccver | cut -d . -f2`
-    compiler_num=`(expr $gccvhi "*" 100 + $gccvlo) 2>/dev/null`
+      compiler_id="XLCLANG"
+    else
+      { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+      compiler_id="CLANG"
+    fi
+    fullclangver=`$CC -v 2>&1 | grep version`
+    clangver=`echo $fullclangver | grep "based on LLVM " | "$SED" 's/.*(based on LLVM \([0-9]*\.[0-9]*\).*)/\1/'`
+    if test -z "$clangver"; then
+      if echo $fullclangver | grep "Apple LLVM version " >/dev/null; then
+                clangver="3.7"
+      else
+        clangver=`echo $fullclangver | "$SED" 's/.*version \([0-9]*\.[0-9]*\).*/\1/'`
+      fi
+    fi
+    clangvhi=`echo $clangver | cut -d . -f1`
+    clangvlo=`echo $clangver | cut -d . -f2`
+    compiler_num=`(expr $clangvhi "*" 100 + $clangvlo) 2>/dev/null`
     flags_dbg_all="-g -g0 -g1 -g2 -g3"
     flags_dbg_all="$flags_dbg_all -ggdb"
     flags_dbg_all="$flags_dbg_all -gstabs"
@@ -16431,123 +16272,197 @@ $as_echo "yes" >&6; }
     flags_dbg_all="$flags_dbg_all -gvms"
     flags_dbg_yes="-g"
     flags_dbg_off=""
-    flags_opt_all="-O -O0 -O1 -O2 -O3 -Os -Og -Ofast"
-    flags_opt_yes="-O2"
+    flags_opt_all="-O -O0 -O1 -O2 -Os -O3 -O4"
+    flags_opt_yes="-Os"
     flags_opt_off="-O0"
-
-    OLDCPPFLAGS=$CPPFLAGS
-  # CPPPFLAG comes from CURL_CPP_P
-  CPPFLAGS="$CPPFLAGS $CPPPFLAG"
-      if test -z "$SED"; then
-    as_fn_error $? "SED not set. Cannot continue without SED being set." "$LINENO" 5
-  fi
-  if test -z "$GREP"; then
-    as_fn_error $? "GREP not set. Cannot continue without GREP being set." "$LINENO" 5
-  fi
-
-  tmp_exp=""
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-
-#ifdef _WIN32
-CURL_DEF_TOKEN _WIN32
-#endif
-
-
-_ACEOF
-if ac_fn_c_try_cpp "$LINENO"; then :
-
-    tmp_exp=`eval "$ac_cpp conftest.$ac_ext" 2>/dev/null | \
-      "$GREP" CURL_DEF_TOKEN 2>/dev/null | \
-      "$SED" 's/.*CURL_DEF_TOKEN[ ][ ]*//' 2>/dev/null | \
-      "$SED" 's/["][ ]*["]//g' 2>/dev/null`
-    if test -z "$tmp_exp" || test "$tmp_exp" = "_WIN32"; then
-      tmp_exp=""
-    fi
-
-fi
-rm -f conftest.err conftest.i conftest.$ac_ext
-  if test -z "$tmp_exp"; then
-    curl_cv_have_def__WIN32=no
-
-  else
-    curl_cv_have_def__WIN32=yes
-    curl_cv_def__WIN32=$tmp_exp
-
-  fi
-      CPPFLAGS=$OLDCPPFLAGS
-
   else
     { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
 $as_echo "no" >&6; }
   fi
 
 
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if compiler is LCC" >&5
-$as_echo_n "checking if compiler is LCC... " >&6; }
-
-    OLDCPPFLAGS=$CPPFLAGS
-  # CPPPFLAG comes from CURL_CPP_P
-  CPPFLAGS="$CPPFLAGS $CPPPFLAG"
-      if test -z "$SED"; then
-    as_fn_error $? "SED not set. Cannot continue without SED being set." "$LINENO" 5
-  fi
-  if test -z "$GREP"; then
-    as_fn_error $? "GREP not set. Cannot continue without GREP being set." "$LINENO" 5
-  fi
-
-  tmp_exp=""
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-
-#ifdef __LCC__
-CURL_DEF_TOKEN __LCC__
-#endif
-
-
-_ACEOF
-if ac_fn_c_try_cpp "$LINENO"; then :
-
-    tmp_exp=`eval "$ac_cpp conftest.$ac_ext" 2>/dev/null | \
-      "$GREP" CURL_DEF_TOKEN 2>/dev/null | \
-      "$SED" 's/.*CURL_DEF_TOKEN[ ][ ]*//' 2>/dev/null | \
-      "$SED" 's/["][ ]*["]//g' 2>/dev/null`
-    if test -z "$tmp_exp" || test "$tmp_exp" = "__LCC__"; then
-      tmp_exp=""
-    fi
-
-fi
-rm -f conftest.err conftest.i conftest.$ac_ext
-  if test -z "$tmp_exp"; then
-    curl_cv_have_def___LCC__=no
-
-  else
-    curl_cv_have_def___LCC__=yes
-    curl_cv_def___LCC__=$tmp_exp
-
-  fi
-      CPPFLAGS=$OLDCPPFLAGS
-
-  if test "$curl_cv_have_def___LCC__" = "yes"; then
-    { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-    compiler_id="LCC"
-    flags_dbg_all="-g"
-    flags_dbg_yes="-g"
-    flags_dbg_off=""
-    flags_opt_all=""
-    flags_opt_yes=""
-    flags_opt_off=""
-  else
-    { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-  fi
-
-
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking if compiler is SGI MIPSpro C" >&5
-$as_echo_n "checking if compiler is SGI MIPSpro C... " >&6; }
+      { $as_echo "$as_me:${as_lineno-$LINENO}: checking if compiler is GNU C" >&5
+$as_echo_n "checking if compiler is GNU C... " >&6; }
+
+    OLDCPPFLAGS=$CPPFLAGS
+  # CPPPFLAG comes from CURL_CPP_P
+  CPPFLAGS="$CPPFLAGS $CPPPFLAG"
+      if test -z "$SED"; then
+    as_fn_error $? "SED not set. Cannot continue without SED being set." "$LINENO" 5
+  fi
+  if test -z "$GREP"; then
+    as_fn_error $? "GREP not set. Cannot continue without GREP being set." "$LINENO" 5
+  fi
+
+  tmp_exp=""
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+
+#ifdef __GNUC__
+CURL_DEF_TOKEN __GNUC__
+#endif
+
+
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+
+    tmp_exp=`eval "$ac_cpp conftest.$ac_ext" 2>/dev/null | \
+      "$GREP" CURL_DEF_TOKEN 2>/dev/null | \
+      "$SED" 's/.*CURL_DEF_TOKEN[ ][ ]*//' 2>/dev/null | \
+      "$SED" 's/["][ ]*["]//g' 2>/dev/null`
+    if test -z "$tmp_exp" || test "$tmp_exp" = "__GNUC__"; then
+      tmp_exp=""
+    fi
+
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+  if test -z "$tmp_exp"; then
+    curl_cv_have_def___GNUC__=no
+
+  else
+    curl_cv_have_def___GNUC__=yes
+    curl_cv_def___GNUC__=$tmp_exp
+
+  fi
+      CPPFLAGS=$OLDCPPFLAGS
+
+  if test "$curl_cv_have_def___GNUC__" = "yes" &&
+    test "$compiler_id" = "unknown"; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+    compiler_id="GNU_C"
+    gccver=`$CC -dumpversion`
+    gccvhi=`echo $gccver | cut -d . -f1`
+    gccvlo=`echo $gccver | cut -d . -f2`
+    compiler_num=`(expr $gccvhi "*" 100 + $gccvlo) 2>/dev/null`
+    flags_dbg_all="-g -g0 -g1 -g2 -g3"
+    flags_dbg_all="$flags_dbg_all -ggdb"
+    flags_dbg_all="$flags_dbg_all -gstabs"
+    flags_dbg_all="$flags_dbg_all -gstabs+"
+    flags_dbg_all="$flags_dbg_all -gcoff"
+    flags_dbg_all="$flags_dbg_all -gxcoff"
+    flags_dbg_all="$flags_dbg_all -gdwarf-2"
+    flags_dbg_all="$flags_dbg_all -gvms"
+    flags_dbg_yes="-g"
+    flags_dbg_off=""
+    flags_opt_all="-O -O0 -O1 -O2 -O3 -Os -Og -Ofast"
+    flags_opt_yes="-O2"
+    flags_opt_off="-O0"
+
+    OLDCPPFLAGS=$CPPFLAGS
+  # CPPPFLAG comes from CURL_CPP_P
+  CPPFLAGS="$CPPFLAGS $CPPPFLAG"
+      if test -z "$SED"; then
+    as_fn_error $? "SED not set. Cannot continue without SED being set." "$LINENO" 5
+  fi
+  if test -z "$GREP"; then
+    as_fn_error $? "GREP not set. Cannot continue without GREP being set." "$LINENO" 5
+  fi
+
+  tmp_exp=""
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+
+#ifdef _WIN32
+CURL_DEF_TOKEN _WIN32
+#endif
+
+
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+
+    tmp_exp=`eval "$ac_cpp conftest.$ac_ext" 2>/dev/null | \
+      "$GREP" CURL_DEF_TOKEN 2>/dev/null | \
+      "$SED" 's/.*CURL_DEF_TOKEN[ ][ ]*//' 2>/dev/null | \
+      "$SED" 's/["][ ]*["]//g' 2>/dev/null`
+    if test -z "$tmp_exp" || test "$tmp_exp" = "_WIN32"; then
+      tmp_exp=""
+    fi
+
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+  if test -z "$tmp_exp"; then
+    curl_cv_have_def__WIN32=no
+
+  else
+    curl_cv_have_def__WIN32=yes
+    curl_cv_def__WIN32=$tmp_exp
+
+  fi
+      CPPFLAGS=$OLDCPPFLAGS
+
+  else
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+  fi
+
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if compiler is LCC" >&5
+$as_echo_n "checking if compiler is LCC... " >&6; }
+
+    OLDCPPFLAGS=$CPPFLAGS
+  # CPPPFLAG comes from CURL_CPP_P
+  CPPFLAGS="$CPPFLAGS $CPPPFLAG"
+      if test -z "$SED"; then
+    as_fn_error $? "SED not set. Cannot continue without SED being set." "$LINENO" 5
+  fi
+  if test -z "$GREP"; then
+    as_fn_error $? "GREP not set. Cannot continue without GREP being set." "$LINENO" 5
+  fi
+
+  tmp_exp=""
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+
+#ifdef __LCC__
+CURL_DEF_TOKEN __LCC__
+#endif
+
+
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+
+    tmp_exp=`eval "$ac_cpp conftest.$ac_ext" 2>/dev/null | \
+      "$GREP" CURL_DEF_TOKEN 2>/dev/null | \
+      "$SED" 's/.*CURL_DEF_TOKEN[ ][ ]*//' 2>/dev/null | \
+      "$SED" 's/["][ ]*["]//g' 2>/dev/null`
+    if test -z "$tmp_exp" || test "$tmp_exp" = "__LCC__"; then
+      tmp_exp=""
+    fi
+
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+  if test -z "$tmp_exp"; then
+    curl_cv_have_def___LCC__=no
+
+  else
+    curl_cv_have_def___LCC__=yes
+    curl_cv_def___LCC__=$tmp_exp
+
+  fi
+      CPPFLAGS=$OLDCPPFLAGS
+
+  if test "$curl_cv_have_def___LCC__" = "yes"; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+    compiler_id="LCC"
+    flags_dbg_all="-g"
+    flags_dbg_yes="-g"
+    flags_dbg_off=""
+    flags_opt_all=""
+    flags_opt_yes=""
+    flags_opt_off=""
+  else
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+  fi
+
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking if compiler is SGI MIPSpro C" >&5
+$as_echo_n "checking if compiler is SGI MIPSpro C... " >&6; }
 
     OLDCPPFLAGS=$CPPFLAGS
   # CPPPFLAG comes from CURL_CPP_P
@@ -19170,6 +19085,7 @@ fi
 rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 
 
+
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to support http" >&5
 $as_echo_n "checking whether to support http... " >&6; }
 # Check whether --enable-http was given.
 
 if test "$HAVE_GETHOSTBYNAME" != "1"
 then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gethostbyname for AmigaOS bsdsocket.library" >&5
+$as_echo_n "checking for gethostbyname for AmigaOS bsdsocket.library... " >&6; }
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+
+#include <proto/bsdsocket.h>
+struct Library *SocketBase = NULL;
+
+int main (void)
+{
+
+      gethostbyname("www.dummysite.com");
+
+ ;
+ return 0;
+}
+
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+    HAVE_GETHOSTBYNAME="1"
+    HAVE_PROTO_BSDSOCKET_H="1"
+
+$as_echo "#define HAVE_PROTO_BSDSOCKET_H 1" >>confdefs.h
+
+    HAVE_PROTO_BSDSOCKET_H=1
+
+
+else
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+fi
+
+if test "$HAVE_GETHOSTBYNAME" != "1"
+then
     { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gethostbyname in -lnetwork" >&5
 $as_echo_n "checking for gethostbyname in -lnetwork... " >&6; }
 if ${ac_cv_lib_network_gethostbyname+:} false; then :
@@ -20289,7 +20248,29 @@ _ACEOF
 
 
 
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for connect in libraries" >&5
+curl_includes_bsdsocket="\
+/* includes start */
+#ifdef HAVE_PROTO_BSDSOCKET_H
+#  include <proto/bsdsocket.h>
+  struct Library *SocketBase = NULL;
+#endif
+/* includes end */"
+  for ac_header in proto/bsdsocket.h
+do :
+  ac_fn_c_check_header_compile "$LINENO" "proto/bsdsocket.h" "ac_cv_header_proto_bsdsocket_h" "      $curl_includes_bsdsocket
+"
+if test "x$ac_cv_header_proto_bsdsocket_h" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_PROTO_BSDSOCKET_H 1
+_ACEOF
+
+fi
+
+done
+
+
+
+      { $as_echo "$as_me:${as_lineno-$LINENO}: checking for connect in libraries" >&5
 $as_echo_n "checking for connect in libraries... " >&6; }
   tst_connect_save_LIBS="$LIBS"
   tst_connect_need_LIBS="unknown"
@@ -20301,7 +20282,8 @@ $as_echo_n "checking for connect in libraries... " >&6; }
 
 
           $curl_includes_winsock2
-          #ifndef HAVE_WINDOWS_H
+          $curl_includes_bsdsocket
+          #if !defined(HAVE_WINDOWS_H) && !defined(HAVE_PROTO_BSDSOCKET_H)
             int connect(int, void*, int);
           #endif
 
@@ -21606,7 +21588,9 @@ $as_echo_n "checking for LDAP libraries... " >&6; }
     '-lldap -llber' \
     '-llber -lldap' \
     '-lldapssl -lldapx -lldapsdk' \
-    '-lldapsdk -lldapx -lldapssl' ; do
+    '-lldapsdk -lldapx -lldapssl' \
+    '-lldap -llber -lssl -lcrypto' ; do
+
     if test "$curl_cv_ldap_LIBS" = "unknown"; then
       if test -z "$x_nlibs"; then
         LIBS="$curl_cv_save_LIBS"
@@ -21833,16 +21817,23 @@ $as_echo "yes" >&6; }
 else
   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
- /* is AF_INET6 available? */
+ /* are AF_INET6 and sockaddr_in6 available? */
 #include <sys/types.h>
 #ifdef HAVE_WINSOCK2_H
 #include <winsock2.h>
+#include <ws2tcpip.h>
 #else
 #include <sys/socket.h>
+#include <netinet/in.h>
+#if defined (__TANDEM)
+# include <netinet/in6.h>
+#endif
 #endif
 #include <stdlib.h> /* for exit() */
 main()
 {
+ struct sockaddr_in6 s;
+ (void)s;
  if (socket(AF_INET6, SOCK_STREAM, 0) < 0)
    exit(1);
  else
 fi
 
 
-if test "$ipv6" = "yes"; then
+if test "$ipv6" = yes; then
   curl_ipv6_msg="enabled"
-fi
 
-# Check if struct sockaddr_in6 have sin6_scope_id member
-if test "$ipv6" = yes; then
+$as_echo "#define ENABLE_IPV6 1" >>confdefs.h
+
+  IPV6_ENABLED=1
+
+
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking if struct sockaddr_in6 has sin6_scope_id member" >&5
 $as_echo_n "checking if struct sockaddr_in6 has sin6_scope_id member... " >&6; }
   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
@@ -22239,6 +22232,13 @@ if test "${with_winssl+set}" = set; then :
 fi
 
 
+
+# Check whether --with-schannel was given.
+if test "${with_schannel+set}" = set; then :
+  withval=$with_schannel; OPT_WINSSL=$withval
+fi
+
+
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable Windows native SSL/TLS (Windows native builds only)" >&5
 $as_echo_n "checking whether to enable Windows native SSL/TLS (Windows native builds only)... " >&6; }
 if test -z "$ssl_backends" -o "x$OPT_WINSSL" != xno; then
@@ -22273,29 +22273,36 @@ else
 $as_echo "no" >&6; }
 fi
 
-OPT_DARWINSSL=no
+OPT_SECURETRANSPORT=no
 
 # Check whether --with-darwinssl was given.
 if test "${with_darwinssl+set}" = set; then :
-  withval=$with_darwinssl; OPT_DARWINSSL=$withval
+  withval=$with_darwinssl; OPT_SECURETRANSPORT=$withval
 fi
 
 
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable Apple OS native SSL/TLS" >&5
-$as_echo_n "checking whether to enable Apple OS native SSL/TLS... " >&6; }
-if test -z "$ssl_backends" -o "x$OPT_DARWINSSL" != xno; then
-  if test "x$OPT_DARWINSSL" != "xno" &&
+
+# Check whether --with-secure-transport was given.
+if test "${with_secure_transport+set}" = set; then :
+  withval=$with_secure_transport; OPT_SECURETRANSPORT=$withval
+fi
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable Secure Transport" >&5
+$as_echo_n "checking whether to enable Secure Transport... " >&6; }
+if test -z "$ssl_backends" -o "x$OPT_SECURETRANSPORT" != xno; then
+  if test "x$OPT_SECURETRANSPORT" != "xno" &&
      test -d "/System/Library/Frameworks/Security.framework"; then
     { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
 $as_echo "yes" >&6; }
 
-$as_echo "#define USE_DARWINSSL 1" >>confdefs.h
+$as_echo "#define USE_SECTRANSP 1" >>confdefs.h
 
-    USE_DARWINSSL=1
+    USE_SECTRANSP=1
 
-    ssl_msg="Apple OS-native"
-    test darwinssl != "$DEFAULT_SSL_BACKEND" || VALID_DEFAULT_SSL_BACKEND=yes
-    DARWINSSL_ENABLED=1
+    ssl_msg="Secure Transport"
+    test secure-transport != "$DEFAULT_SSL_BACKEND" || VALID_DEFAULT_SSL_BACKEND=yes
+    SECURETRANSPORT_ENABLED=1
     LDFLAGS="$LDFLAGS -framework CoreFoundation -framework Security"
   else
     { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
@@ -22307,6 +22314,46 @@ else
 $as_echo "no" >&6; }
 fi
 
+OPT_AMISSL=no
+
+# Check whether --with-amissl was given.
+if test "${with_amissl+set}" = set; then :
+  withval=$with_amissl; OPT_AMISSL=$withval
+fi
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable Amiga native SSL/TLS (AmiSSL)" >&5
+$as_echo_n "checking whether to enable Amiga native SSL/TLS (AmiSSL)... " >&6; }
+if test "$HAVE_PROTO_BSDSOCKET_H" = "1"; then
+  if test -z "$ssl_backends" -o "x$OPT_AMISSL" != xno; then
+    ssl_msg=
+    if test "x$OPT_AMISSL" != "xno"; then
+      { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+      ssl_msg="AmiSSL"
+      test amissl != "$DEFAULT_SSL_BACKEND" || VALID_DEFAULT_SSL_BACKEND=yes
+      AMISSL_ENABLED=1
+      LIBS="-lamisslauto $LIBS"
+
+$as_echo "#define USE_AMISSL 1" >>confdefs.h
+
+
+$as_echo "#define USE_OPENSSL 1" >>confdefs.h
+
+    else
+      { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+    fi
+    test -z "$ssl_msg" || ssl_backends="${ssl_backends:+$ssl_backends, }$ssl_msg"
+  else
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+  fi
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
 
 OPT_SSL=off
 ca="no"
@@ -22527,7 +22574,7 @@ $as_echo "found" >&6; }
       PKG_CONFIG_LIBDIR="$OPENSSL_PCDIR"
       export PKG_CONFIG_LIBDIR
     fi
-         $PKGCONFIG --libs-only-l openssl 2>/dev/null`
+         $PKGCONFIG --libs-only-l --libs-only-other openssl 2>/dev/null`
 
       SSL_LDFLAGS=`
     if test -n "$OPENSSL_PCDIR"; then
@@ -22881,9 +22928,8 @@ done
   if test X"$OPENSSL_ENABLED" = X"1"; then
 
     for ac_func in RAND_egd \
-                    ENGINE_cleanup \
-                    SSL_get_shutdown \
-                    SSLv2_client_method
+                    SSLv2_client_method \
+                    OpenSSL_version
 do :
   as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
 ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
@@ -23647,6 +23693,16 @@ $as_echo "$as_me: WARNING: $tst_warns" >&2;}
   test -z "$ssl_msg" || ssl_backends="${ssl_backends:+$ssl_backends, }$ssl_msg"
 fi
 
+if test X"$OPT_SSL" != Xoff &&
+  test X"$OPT_SSL" != Xno &&
+  test "$OPENSSL_ENABLED" != "1"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: OPT_SSL: $OPT_SSL" >&5
+$as_echo "$as_me: OPT_SSL: $OPT_SSL" >&6;}
+  { $as_echo "$as_me:${as_lineno-$LINENO}: OPENSSL_ENABLED: $OPENSSL_ENABLED" >&5
+$as_echo "$as_me: OPENSSL_ENABLED: $OPENSSL_ENABLED" >&6;}
+  as_fn_error $? "--with-ssl was given but OpenSSL could not be detected" "$LINENO" 5
+fi
+
 
 if test X"$OPENSSL_ENABLED" = X"1"; then
 
 fi
 
 
-OPT_POLARSSL=no
+OPT_MBEDTLS=no
 
 _cppflags=$CPPFLAGS
 _ldflags=$LDFLAGS
 
-# Check whether --with-polarssl was given.
-if test "${with_polarssl+set}" = set; then :
-  withval=$with_polarssl; OPT_POLARSSL=$withval
+# Check whether --with-mbedtls was given.
+if test "${with_mbedtls+set}" = set; then :
+  withval=$with_mbedtls; OPT_MBEDTLS=$withval
 fi
 
 
-if test -z "$ssl_backends" -o "x$OPT_POLARSSL" != xno; then
+if test -z "$ssl_backends" -o "x$OPT_MBEDTLS" != xno; then
   ssl_msg=
 
-  if test X"$OPT_POLARSSL" != Xno; then
+  if test X"$OPT_MBEDTLS" != Xno; then
 
-    if test "$OPT_POLARSSL" = "yes"; then
-      OPT_POLARSSL=""
+    if test "$OPT_MBEDTLS" = "yes"; then
+      OPT_MBEDTLS=""
     fi
 
-    if test -z "$OPT_POLARSSL" ; then
+    if test -z "$OPT_MBEDTLS" ; then
 
-      { $as_echo "$as_me:${as_lineno-$LINENO}: checking for havege_init in -lpolarssl" >&5
-$as_echo_n "checking for havege_init in -lpolarssl... " >&6; }
-if ${ac_cv_lib_polarssl_havege_init+:} false; then :
+      { $as_echo "$as_me:${as_lineno-$LINENO}: checking for mbedtls_havege_init in -lmbedtls" >&5
+$as_echo_n "checking for mbedtls_havege_init in -lmbedtls... " >&6; }
+if ${ac_cv_lib_mbedtls_mbedtls_havege_init+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   ac_check_lib_save_LIBS=$LIBS
-LIBS="-lpolarssl  $LIBS"
+LIBS="-lmbedtls -lmbedx509 -lmbedcrypto $LIBS"
 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 
@@ -24310,36 +24366,36 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 #ifdef __cplusplus
 extern "C"
 #endif
-char havege_init ();
+char mbedtls_havege_init ();
 int main (void)
 {
-return havege_init ();
+return mbedtls_havege_init ();
  ;
  return 0;
 }
 _ACEOF
 if ac_fn_c_try_link "$LINENO"; then :
-  ac_cv_lib_polarssl_havege_init=yes
+  ac_cv_lib_mbedtls_mbedtls_havege_init=yes
 else
-  ac_cv_lib_polarssl_havege_init=no
+  ac_cv_lib_mbedtls_mbedtls_havege_init=no
 fi
 rm -f core conftest.err conftest.$ac_objext \
     conftest$ac_exeext conftest.$ac_ext
 LIBS=$ac_check_lib_save_LIBS
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_polarssl_havege_init" >&5
-$as_echo "$ac_cv_lib_polarssl_havege_init" >&6; }
-if test "x$ac_cv_lib_polarssl_havege_init" = xyes; then :
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_mbedtls_mbedtls_havege_init" >&5
+$as_echo "$ac_cv_lib_mbedtls_mbedtls_havege_init" >&6; }
+if test "x$ac_cv_lib_mbedtls_mbedtls_havege_init" = xyes; then :
 
 
-$as_echo "#define USE_POLARSSL 1" >>confdefs.h
+$as_echo "#define USE_MBEDTLS 1" >>confdefs.h
 
-         USE_POLARSSL=1
+         USE_MBEDTLS=1
 
-         POLARSSL_ENABLED=1
-         USE_POLARSSL="yes"
-         ssl_msg="PolarSSL"
-        test polarssl != "$DEFAULT_SSL_BACKEND" || VALID_DEFAULT_SSL_BACKEND=yes
+         MBEDTLS_ENABLED=1
+         USE_MBEDTLS="yes"
+         ssl_msg="mbedTLS"
+        test mbedtls != "$DEFAULT_SSL_BACKEND" || VALID_DEFAULT_SSL_BACKEND=yes
 
 fi
 
     addld=""
     addlib=""
     addcflags=""
-    polarssllib=""
+    mbedtlslib=""
 
-    if test "x$USE_POLARSSL" != "xyes"; then
-            addld=-L$OPT_POLARSSL/lib$libsuff
-      addcflags=-I$OPT_POLARSSL/include
-      polarssllib=$OPT_POLARSSL/lib$libsuff
+    if test "x$USE_MBEDTLS" != "xyes"; then
+            addld=-L$OPT_MBEDTLS/lib$libsuff
+      addcflags=-I$OPT_MBEDTLS/include
+      mbedtlslib=$OPT_MBEDTLS/lib$libsuff
 
       LDFLAGS="$LDFLAGS $addld"
       if test "$addcflags" != "-I/usr/include"; then
          CPPFLAGS="$CPPFLAGS $addcflags"
       fi
 
-      { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ssl_init in -lpolarssl" >&5
-$as_echo_n "checking for ssl_init in -lpolarssl... " >&6; }
-if ${ac_cv_lib_polarssl_ssl_init+:} false; then :
+      { $as_echo "$as_me:${as_lineno-$LINENO}: checking for mbedtls_ssl_init in -lmbedtls" >&5
+$as_echo_n "checking for mbedtls_ssl_init in -lmbedtls... " >&6; }
+if ${ac_cv_lib_mbedtls_mbedtls_ssl_init+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   ac_check_lib_save_LIBS=$LIBS
-LIBS="-lpolarssl  $LIBS"
+LIBS="-lmbedtls -lmbedx509 -lmbedcrypto $LIBS"
 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 
@@ -24374,36 +24430,36 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 #ifdef __cplusplus
 extern "C"
 #endif
-char ssl_init ();
+char mbedtls_ssl_init ();
 int main (void)
 {
-return ssl_init ();
+return mbedtls_ssl_init ();
  ;
  return 0;
 }
 _ACEOF
 if ac_fn_c_try_link "$LINENO"; then :
-  ac_cv_lib_polarssl_ssl_init=yes
+  ac_cv_lib_mbedtls_mbedtls_ssl_init=yes
 else
-  ac_cv_lib_polarssl_ssl_init=no
+  ac_cv_lib_mbedtls_mbedtls_ssl_init=no
 fi
 rm -f core conftest.err conftest.$ac_objext \
     conftest$ac_exeext conftest.$ac_ext
 LIBS=$ac_check_lib_save_LIBS
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_polarssl_ssl_init" >&5
-$as_echo "$ac_cv_lib_polarssl_ssl_init" >&6; }
-if test "x$ac_cv_lib_polarssl_ssl_init" = xyes; then :
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_mbedtls_mbedtls_ssl_init" >&5
+$as_echo "$ac_cv_lib_mbedtls_mbedtls_ssl_init" >&6; }
+if test "x$ac_cv_lib_mbedtls_mbedtls_ssl_init" = xyes; then :
 
 
-$as_echo "#define USE_POLARSSL 1" >>confdefs.h
+$as_echo "#define USE_MBEDTLS 1" >>confdefs.h
 
-       USE_POLARSSL=1
+       USE_MBEDTLS=1
 
-       POLARSSL_ENABLED=1
-       USE_POLARSSL="yes"
-       ssl_msg="PolarSSL"
-       test polarssl != "$DEFAULT_SSL_BACKEND" || VALID_DEFAULT_SSL_BACKEND=yes
+       MBEDTLS_ENABLED=1
+       USE_MBEDTLS="yes"
+       ssl_msg="mbedTLS"
+       test mbedtls != "$DEFAULT_SSL_BACKEND" || VALID_DEFAULT_SSL_BACKEND=yes
 
 else
 
 
     fi
 
-    if test "x$USE_POLARSSL" = "xyes"; then
-      { $as_echo "$as_me:${as_lineno-$LINENO}: detected PolarSSL" >&5
-$as_echo "$as_me: detected PolarSSL" >&6;}
+    if test "x$USE_MBEDTLS" = "xyes"; then
+      { $as_echo "$as_me:${as_lineno-$LINENO}: detected mbedTLS" >&5
+$as_echo "$as_me: detected mbedTLS" >&6;}
       check_for_ca_bundle=1
-      LIBS="-lpolarssl $LIBS"
 
-      if test -n "$polarssllib"; then
+      LIBS="-lmbedtls -lmbedx509 -lmbedcrypto $LIBS"
+
+      if test -n "$mbedtlslib"; then
                                         if test "x$cross_compiling" != "xyes"; then
-          CURL_LIBRARY_PATH="$CURL_LIBRARY_PATH:$polarssllib"
+          CURL_LIBRARY_PATH="$CURL_LIBRARY_PATH:$mbedtlslib"
           export CURL_LIBRARY_PATH
-          { $as_echo "$as_me:${as_lineno-$LINENO}: Added $polarssllib to CURL_LIBRARY_PATH" >&5
-$as_echo "$as_me: Added $polarssllib to CURL_LIBRARY_PATH" >&6;}
+          { $as_echo "$as_me:${as_lineno-$LINENO}: Added $mbedtlslib to CURL_LIBRARY_PATH" >&5
+$as_echo "$as_me: Added $mbedtlslib to CURL_LIBRARY_PATH" >&6;}
         fi
       fi
     fi
@@ -24435,35 +24492,201 @@ $as_echo "$as_me: Added $polarssllib to CURL_LIBRARY_PATH" >&6;}
 fi
 
 
-OPT_MBEDTLS=no
+OPT_WOLFSSL=no
 
 _cppflags=$CPPFLAGS
 _ldflags=$LDFLAGS
 
-# Check whether --with-mbedtls was given.
-if test "${with_mbedtls+set}" = set; then :
-  withval=$with_mbedtls; OPT_MBEDTLS=$withval
+
+# Check whether --with-wolfssl was given.
+if test "${with_wolfssl+set}" = set; then :
+  withval=$with_wolfssl; OPT_WOLFSSL=$withval
 fi
 
 
-if test -z "$ssl_backends" -o "x$OPT_MBEDTLS" != xno; then
+if test -z "$ssl_backends" -o "x$OPT_WOLFSSL" != xno; then
   ssl_msg=
 
-  if test X"$OPT_MBEDTLS" != Xno; then
+  if test X"$OPT_WOLFSSL" != Xno; then
 
-    if test "$OPT_MBEDTLS" = "yes"; then
-      OPT_MBEDTLS=""
+    if test "$OPT_WOLFSSL" = "yes"; then
+      OPT_WOLFSSL=""
     fi
 
-    if test -z "$OPT_MBEDTLS" ; then
+    addld=""
+    addlib=""
+    addcflags=""
 
-      { $as_echo "$as_me:${as_lineno-$LINENO}: checking for mbedtls_havege_init in -lmbedtls" >&5
-$as_echo_n "checking for mbedtls_havege_init in -lmbedtls... " >&6; }
-if ${ac_cv_lib_mbedtls_mbedtls_havege_init+:} false; then :
+    if test "x$USE_WOLFSSL" != "xyes"; then
+      addld=-L$OPT_WOLFSSL/lib$libsuff
+      addcflags=-I$OPT_WOLFSSL/include
+      wolfssllibpath=$OPT_WOLFSSL/lib$libsuff
+
+      LDFLAGS="$LDFLAGS $addld"
+      if test "$addcflags" != "-I/usr/include"; then
+         CPPFLAGS="$CPPFLAGS $addcflags"
+      fi
+
+      my_ac_save_LIBS="$LIBS"
+      LIBS="-lwolfssl -lm $LIBS"
+
+      { $as_echo "$as_me:${as_lineno-$LINENO}: checking for wolfSSL_Init in -lwolfssl" >&5
+$as_echo_n "checking for wolfSSL_Init in -lwolfssl... " >&6; }
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+
+/* These aren't needed for detection and confuse WolfSSL.
+   They are set up properly later if it is detected.  */
+#undef SIZEOF_LONG
+#undef SIZEOF_LONG_LONG
+#include <wolfssl/ssl.h>
+
+int main (void)
+{
+
+         return wolfSSL_Init();
+
+ ;
+ return 0;
+}
+
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+
+         { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+
+$as_echo "#define USE_WOLFSSL 1" >>confdefs.h
+
+         USE_WOLFSSL=1
+
+         WOLFSSL_ENABLED=1
+         USE_WOLFSSL="yes"
+         ssl_msg="WolfSSL"
+        test wolfssl != "$DEFAULT_SSL_BACKEND" || VALID_DEFAULT_SSL_BACKEND=yes
+
+else
+
+         { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+         CPPFLAGS=$_cppflags
+         LDFLAGS=$_ldflags
+         wolfssllibpath=""
+
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+      LIBS="$my_ac_save_LIBS"
+    fi
+
+    if test "x$USE_WOLFSSL" = "xyes"; then
+      { $as_echo "$as_me:${as_lineno-$LINENO}: detected wolfSSL" >&5
+$as_echo "$as_me: detected wolfSSL" >&6;}
+      check_for_ca_bundle=1
+
+            { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of long long" >&5
+$as_echo_n "checking size of long long... " >&6; }
+if ${ac_cv_sizeof_long_long+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  for ac_size in 4 8 1 2 16  ; do # List sizes in rough order of prevalence.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <sys/types.h>
+
+
+int main (void)
+{
+switch (0) case 0: case (sizeof (long long) == $ac_size):;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_sizeof_long_long=$ac_size
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  if test x$ac_cv_sizeof_long_long != x ; then break; fi
+done
+
+fi
+
+if test x$ac_cv_sizeof_long_long = x ; then
+  as_fn_error $? "cannot determine a size for long long" "$LINENO" 5
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_long_long" >&5
+$as_echo "$ac_cv_sizeof_long_long" >&6; }
+
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_LONG_LONG $ac_cv_sizeof_long_long
+_ACEOF
+
+
+
+      LIBS="-lwolfssl -lm $LIBS"
+
+                  for ac_func in wolfSSLv3_client_method \
+                     wolfSSL_get_peer_certificate \
+                     wolfSSL_UseALPN
+do :
+  as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
+ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
+if eval test \"x\$"$as_ac_var"\" = x"yes"; then :
+  cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+done
+
+
+      if test -n "$wolfssllibpath"; then
+                                        if test "x$cross_compiling" != "xyes"; then
+          CURL_LIBRARY_PATH="$CURL_LIBRARY_PATH:$wolfssllibpath"
+          export CURL_LIBRARY_PATH
+          { $as_echo "$as_me:${as_lineno-$LINENO}: Added $wolfssllibpath to CURL_LIBRARY_PATH" >&5
+$as_echo "$as_me: Added $wolfssllibpath to CURL_LIBRARY_PATH" >&6;}
+        fi
+      fi
+
+    fi
+
+  fi
+  test -z "$ssl_msg" || ssl_backends="${ssl_backends:+$ssl_backends, }$ssl_msg"
+fi
+
+
+OPT_MESALINK=no
+
+_cppflags=$CPPFLAGS
+_ldflags=$LDFLAGS
+
+# Check whether --with-mesalink was given.
+if test "${with_mesalink+set}" = set; then :
+  withval=$with_mesalink; OPT_MESALINK=$withval
+fi
+
+
+if test -z "$ssl_backends" -o "x$OPT_MESALINK" != xno; then
+  ssl_msg=
+
+  if test X"$OPT_MESALINK" != Xno; then
+
+    if test "$OPT_MESALINK" = "yes"; then
+      OPT_MESALINK=""
+    fi
+
+    if test -z "$OPT_MESALINK" ; then
+
+      { $as_echo "$as_me:${as_lineno-$LINENO}: checking for mesalink_library_init in -lmesalink" >&5
+$as_echo_n "checking for mesalink_library_init in -lmesalink... " >&6; }
+if ${ac_cv_lib_mesalink_mesalink_library_init+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   ac_check_lib_save_LIBS=$LIBS
-LIBS="-lmbedtls -lmbedx509 -lmbedcrypto $LIBS"
+LIBS="-lmesalink  $LIBS"
 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 
@@ -24471,36 +24694,36 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 #ifdef __cplusplus
 extern "C"
 #endif
-char mbedtls_havege_init ();
+char mesalink_library_init ();
 int main (void)
 {
-return mbedtls_havege_init ();
+return mesalink_library_init ();
  ;
  return 0;
 }
 _ACEOF
 if ac_fn_c_try_link "$LINENO"; then :
-  ac_cv_lib_mbedtls_mbedtls_havege_init=yes
+  ac_cv_lib_mesalink_mesalink_library_init=yes
 else
-  ac_cv_lib_mbedtls_mbedtls_havege_init=no
+  ac_cv_lib_mesalink_mesalink_library_init=no
 fi
 rm -f core conftest.err conftest.$ac_objext \
     conftest$ac_exeext conftest.$ac_ext
 LIBS=$ac_check_lib_save_LIBS
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_mbedtls_mbedtls_havege_init" >&5
-$as_echo "$ac_cv_lib_mbedtls_mbedtls_havege_init" >&6; }
-if test "x$ac_cv_lib_mbedtls_mbedtls_havege_init" = xyes; then :
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_mesalink_mesalink_library_init" >&5
+$as_echo "$ac_cv_lib_mesalink_mesalink_library_init" >&6; }
+if test "x$ac_cv_lib_mesalink_mesalink_library_init" = xyes; then :
 
 
-$as_echo "#define USE_MBEDTLS 1" >>confdefs.h
+$as_echo "#define USE_MESALINK 1" >>confdefs.h
 
-         USE_MBEDTLS=1
+         USE_MESALINK=1
 
-         MBEDTLS_ENABLED=1
-         USE_MBEDTLS="yes"
-         ssl_msg="mbedTLS"
-        test mbedtls != "$DEFAULT_SSL_BACKEND" || VALID_DEFAULT_SSL_BACKEND=yes
+         MESALINK_ENABLED=1
+         USE_MESALINK="yes"
+         ssl_msg="MesaLink"
+        test mesalink != "$DEFAULT_SSL_BACKEND" || VALID_DEFAULT_SSL_BACKEND=yes
 
 fi
 
     addld=""
     addlib=""
     addcflags=""
-    mbedtlslib=""
+    mesalinklib=""
 
-    if test "x$USE_MBEDTLS" != "xyes"; then
-            addld=-L$OPT_MBEDTLS/lib$libsuff
-      addcflags=-I$OPT_MBEDTLS/include
-      mbedtlslib=$OPT_MBEDTLS/lib$libsuff
+    if test "x$USE_MESALINK" != "xyes"; then
+            addld=-L$OPT_MESALINK/lib$libsuff
+      addcflags=-I$OPT_MESALINK/include
+      mesalinklib=$OPT_MESALINK/lib$libsuff
 
       LDFLAGS="$LDFLAGS $addld"
       if test "$addcflags" != "-I/usr/include"; then
          CPPFLAGS="$CPPFLAGS $addcflags"
       fi
 
-      { $as_echo "$as_me:${as_lineno-$LINENO}: checking for mbedtls_ssl_init in -lmbedtls" >&5
-$as_echo_n "checking for mbedtls_ssl_init in -lmbedtls... " >&6; }
-if ${ac_cv_lib_mbedtls_mbedtls_ssl_init+:} false; then :
+      { $as_echo "$as_me:${as_lineno-$LINENO}: checking for mesalink_library_init in -lmesalink" >&5
+$as_echo_n "checking for mesalink_library_init in -lmesalink... " >&6; }
+if ${ac_cv_lib_mesalink_mesalink_library_init+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   ac_check_lib_save_LIBS=$LIBS
-LIBS="-lmbedtls -lmbedx509 -lmbedcrypto $LIBS"
+LIBS="-lmesalink  $LIBS"
 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 
@@ -24535,36 +24758,36 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 #ifdef __cplusplus
 extern "C"
 #endif
-char mbedtls_ssl_init ();
+char mesalink_library_init ();
 int main (void)
 {
-return mbedtls_ssl_init ();
+return mesalink_library_init ();
  ;
  return 0;
 }
 _ACEOF
 if ac_fn_c_try_link "$LINENO"; then :
-  ac_cv_lib_mbedtls_mbedtls_ssl_init=yes
+  ac_cv_lib_mesalink_mesalink_library_init=yes
 else
-  ac_cv_lib_mbedtls_mbedtls_ssl_init=no
+  ac_cv_lib_mesalink_mesalink_library_init=no
 fi
 rm -f core conftest.err conftest.$ac_objext \
     conftest$ac_exeext conftest.$ac_ext
 LIBS=$ac_check_lib_save_LIBS
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_mbedtls_mbedtls_ssl_init" >&5
-$as_echo "$ac_cv_lib_mbedtls_mbedtls_ssl_init" >&6; }
-if test "x$ac_cv_lib_mbedtls_mbedtls_ssl_init" = xyes; then :
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_mesalink_mesalink_library_init" >&5
+$as_echo "$ac_cv_lib_mesalink_mesalink_library_init" >&6; }
+if test "x$ac_cv_lib_mesalink_mesalink_library_init" = xyes; then :
 
 
-$as_echo "#define USE_MBEDTLS 1" >>confdefs.h
+$as_echo "#define USE_MESALINK 1" >>confdefs.h
 
-       USE_MBEDTLS=1
+       USE_MESALINK=1
 
-       MBEDTLS_ENABLED=1
-       USE_MBEDTLS="yes"
-       ssl_msg="mbedTLS"
-       test mbedtls != "$DEFAULT_SSL_BACKEND" || VALID_DEFAULT_SSL_BACKEND=yes
+       MESALINK_ENABLED=1
+       USE_MESALINK="yes"
+       ssl_msg="MesaLink"
+       test mesalink != "$DEFAULT_SSL_BACKEND" || VALID_DEFAULT_SSL_BACKEND=yes
 
 else
 
 
     fi
 
-    if test "x$USE_MBEDTLS" = "xyes"; then
-      { $as_echo "$as_me:${as_lineno-$LINENO}: detected mbedTLS" >&5
-$as_echo "$as_me: detected mbedTLS" >&6;}
-      check_for_ca_bundle=1
+    if test "x$USE_MESALINK" = "xyes"; then
+      { $as_echo "$as_me:${as_lineno-$LINENO}: detected MesaLink" >&5
+$as_echo "$as_me: detected MesaLink" >&6;}
 
-      LIBS="-lmbedtls -lmbedx509 -lmbedcrypto $LIBS"
+      LIBS="-lmesalink $LIBS"
 
-      if test -n "$mbedtlslib"; then
+      if test -n "$mesalinklib"; then
                                         if test "x$cross_compiling" != "xyes"; then
-          CURL_LIBRARY_PATH="$CURL_LIBRARY_PATH:$mbedtlslib"
-          export CURL_LIBRARY_PATH
-          { $as_echo "$as_me:${as_lineno-$LINENO}: Added $mbedtlslib to CURL_LIBRARY_PATH" >&5
-$as_echo "$as_me: Added $mbedtlslib to CURL_LIBRARY_PATH" >&6;}
+          LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$mesalinklib"
+          export LD_LIBRARY_PATH
+          { $as_echo "$as_me:${as_lineno-$LINENO}: Added $mesalinklib to LD_LIBRARY_PATH" >&5
+$as_echo "$as_me: Added $mesalinklib to LD_LIBRARY_PATH" >&6;}
         fi
       fi
     fi
@@ -24597,45 +24819,35 @@ $as_echo "$as_me: Added $mbedtlslib to CURL_LIBRARY_PATH" >&6;}
 fi
 
 
-OPT_CYASSL=no
+OPT_BEARSSL=no
 
 _cppflags=$CPPFLAGS
 _ldflags=$LDFLAGS
 
-# Check whether --with-cyassl was given.
-if test "${with_cyassl+set}" = set; then :
-  withval=$with_cyassl; OPT_CYASSL=$withval
+# Check whether --with-bearssl was given.
+if test "${with_bearssl+set}" = set; then :
+  withval=$with_bearssl; OPT_BEARSSL=$withval
 fi
 
 
-
-# Check whether --with-wolfssl was given.
-if test "${with_wolfssl+set}" = set; then :
-  withval=$with_wolfssl; OPT_CYASSL=$withval
-fi
-
-
-if test -z "$ssl_backends" -o "x$OPT_CYASSL" != xno; then
+if test -z "$ssl_backends" -o "x$OPT_BEARSSL" != xno; then
   ssl_msg=
 
-  if test X"$OPT_CYASSL" != Xno; then
+  if test X"$OPT_BEARSSL" != Xno; then
 
-    if test "$OPT_CYASSL" = "yes"; then
-      OPT_CYASSL=""
+    if test "$OPT_BEARSSL" = "yes"; then
+      OPT_BEARSSL=""
     fi
 
+    if test -z "$OPT_BEARSSL" ; then
 
-    cyassllibname=cyassl
-
-    if test -z "$OPT_CYASSL" ; then
-
-      { $as_echo "$as_me:${as_lineno-$LINENO}: checking for CyaSSL_Init in -lcyassl" >&5
-$as_echo_n "checking for CyaSSL_Init in -lcyassl... " >&6; }
-if ${ac_cv_lib_cyassl_CyaSSL_Init+:} false; then :
+      { $as_echo "$as_me:${as_lineno-$LINENO}: checking for br_ssl_client_init_full in -lbearssl" >&5
+$as_echo_n "checking for br_ssl_client_init_full in -lbearssl... " >&6; }
+if ${ac_cv_lib_bearssl_br_ssl_client_init_full+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   ac_check_lib_save_LIBS=$LIBS
-LIBS="-lcyassl  $LIBS"
+LIBS="-lbearssl -lbearssl $LIBS"
 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 
@@ -24643,36 +24855,36 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 #ifdef __cplusplus
 extern "C"
 #endif
-char CyaSSL_Init ();
+char br_ssl_client_init_full ();
 int main (void)
 {
-return CyaSSL_Init ();
+return br_ssl_client_init_full ();
  ;
  return 0;
 }
 _ACEOF
 if ac_fn_c_try_link "$LINENO"; then :
-  ac_cv_lib_cyassl_CyaSSL_Init=yes
+  ac_cv_lib_bearssl_br_ssl_client_init_full=yes
 else
-  ac_cv_lib_cyassl_CyaSSL_Init=no
+  ac_cv_lib_bearssl_br_ssl_client_init_full=no
 fi
 rm -f core conftest.err conftest.$ac_objext \
     conftest$ac_exeext conftest.$ac_ext
 LIBS=$ac_check_lib_save_LIBS
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_cyassl_CyaSSL_Init" >&5
-$as_echo "$ac_cv_lib_cyassl_CyaSSL_Init" >&6; }
-if test "x$ac_cv_lib_cyassl_CyaSSL_Init" = xyes; then :
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_bearssl_br_ssl_client_init_full" >&5
+$as_echo "$ac_cv_lib_bearssl_br_ssl_client_init_full" >&6; }
+if test "x$ac_cv_lib_bearssl_br_ssl_client_init_full" = xyes; then :
 
 
-$as_echo "#define USE_CYASSL 1" >>confdefs.h
+$as_echo "#define USE_BEARSSL 1" >>confdefs.h
 
-         USE_CYASSL=1
+         USE_BEARSSL=1
 
-         CYASSL_ENABLED=1
-         USE_CYASSL="yes"
-         ssl_msg="CyaSSL"
-        test cyassl != "$DEFAULT_SSL_BACKEND" || VALID_DEFAULT_SSL_BACKEND=yes
+         BEARSSL_ENABLED=1
+         USE_BEARSSL="yes"
+         ssl_msg="BearSSL"
+        test bearssl != "$DEFAULT_SSL_BACKEND" || VALID_DEFAULT_SSL_BACKEND=yes
 
 fi
 
     addld=""
     addlib=""
     addcflags=""
-    cyassllib=""
+    bearssllib=""
 
-    if test "x$USE_CYASSL" != "xyes"; then
-            addld=-L$OPT_CYASSL/lib$libsuff
-      addcflags=-I$OPT_CYASSL/include
-      cyassllib=$OPT_CYASSL/lib$libsuff
+    if test "x$USE_BEARSSL" != "xyes"; then
+            addld=-L$OPT_BEARSSL/lib$libsuff
+      addcflags=-I$OPT_BEARSSL/include
+      bearssllib=$OPT_BEARSSL/lib$libsuff
 
       LDFLAGS="$LDFLAGS $addld"
       if test "$addcflags" != "-I/usr/include"; then
          CPPFLAGS="$CPPFLAGS $addcflags"
       fi
 
-      { $as_echo "$as_me:${as_lineno-$LINENO}: checking for CyaSSL_Init in -lcyassl" >&5
-$as_echo_n "checking for CyaSSL_Init in -lcyassl... " >&6; }
-if ${ac_cv_lib_cyassl_CyaSSL_Init+:} false; then :
+      { $as_echo "$as_me:${as_lineno-$LINENO}: checking for br_ssl_client_init_full in -lbearssl" >&5
+$as_echo_n "checking for br_ssl_client_init_full in -lbearssl... " >&6; }
+if ${ac_cv_lib_bearssl_br_ssl_client_init_full+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   ac_check_lib_save_LIBS=$LIBS
-LIBS="-lcyassl  $LIBS"
+LIBS="-lbearssl -lbearssl $LIBS"
 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 
@@ -24707,388 +24919,59 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 #ifdef __cplusplus
 extern "C"
 #endif
-char CyaSSL_Init ();
+char br_ssl_client_init_full ();
 int main (void)
 {
-return CyaSSL_Init ();
+return br_ssl_client_init_full ();
  ;
  return 0;
 }
 _ACEOF
 if ac_fn_c_try_link "$LINENO"; then :
-  ac_cv_lib_cyassl_CyaSSL_Init=yes
+  ac_cv_lib_bearssl_br_ssl_client_init_full=yes
 else
-  ac_cv_lib_cyassl_CyaSSL_Init=no
+  ac_cv_lib_bearssl_br_ssl_client_init_full=no
 fi
 rm -f core conftest.err conftest.$ac_objext \
     conftest$ac_exeext conftest.$ac_ext
 LIBS=$ac_check_lib_save_LIBS
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_cyassl_CyaSSL_Init" >&5
-$as_echo "$ac_cv_lib_cyassl_CyaSSL_Init" >&6; }
-if test "x$ac_cv_lib_cyassl_CyaSSL_Init" = xyes; then :
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_bearssl_br_ssl_client_init_full" >&5
+$as_echo "$ac_cv_lib_bearssl_br_ssl_client_init_full" >&6; }
+if test "x$ac_cv_lib_bearssl_br_ssl_client_init_full" = xyes; then :
 
 
-$as_echo "#define USE_CYASSL 1" >>confdefs.h
+$as_echo "#define USE_BEARSSL 1" >>confdefs.h
 
-       USE_CYASSL=1
+       USE_BEARSSL=1
 
-       CYASSL_ENABLED=1
-       USE_CYASSL="yes"
-       ssl_msg="CyaSSL"
-       test cyassl != "$DEFAULT_SSL_BACKEND" || VALID_DEFAULT_SSL_BACKEND=yes
+       BEARSSL_ENABLED=1
+       USE_BEARSSL="yes"
+       ssl_msg="BearSSL"
+       test bearssl != "$DEFAULT_SSL_BACKEND" || VALID_DEFAULT_SSL_BACKEND=yes
 
 else
 
          CPPFLAGS=$_cppflags
          LDFLAGS=$_ldflags
-         cyassllib=""
 
 fi
 
     fi
 
-    addld=""
-    addlib=""
-    addcflags=""
-
-    if test "x$USE_CYASSL" != "xyes"; then
-            addld=-L$OPT_CYASSL/lib$libsuff
-      addcflags=-I$OPT_CYASSL/include
-      cyassllib=$OPT_CYASSL/lib$libsuff
-
-      LDFLAGS="$LDFLAGS $addld"
-      if test "$addcflags" != "-I/usr/include"; then
-         CPPFLAGS="$CPPFLAGS $addcflags"
-      fi
-
-      cyassllibname=wolfssl
-      my_ac_save_LIBS="$LIBS"
-      LIBS="-l$cyassllibname -lm $LIBS"
-
-      { $as_echo "$as_me:${as_lineno-$LINENO}: checking for CyaSSL_Init in -lwolfssl" >&5
-$as_echo_n "checking for CyaSSL_Init in -lwolfssl... " >&6; }
-      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-
-/* These aren't needed for detection and confuse WolfSSL.
-   They are set up properly later if it is detected.  */
-#undef SIZEOF_LONG
-#undef SIZEOF_LONG_LONG
-#include <cyassl/ssl.h>
-
-int main (void)
-{
-
-         return CyaSSL_Init();
-
- ;
- return 0;
-}
-
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-
-         { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-
-$as_echo "#define USE_CYASSL 1" >>confdefs.h
-
-         USE_CYASSL=1
-
-         CYASSL_ENABLED=1
-         USE_CYASSL="yes"
-         ssl_msg="WolfSSL"
-        test cyassl != "$DEFAULT_SSL_BACKEND" || VALID_DEFAULT_SSL_BACKEND=yes
-
-else
-
-         { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-         CPPFLAGS=$_cppflags
-         LDFLAGS=$_ldflags
-         cyassllib=""
-
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-      LIBS="$my_ac_save_LIBS"
-    fi
-
-    if test "x$USE_CYASSL" = "xyes"; then
-      { $as_echo "$as_me:${as_lineno-$LINENO}: detected $cyassllibname" >&5
-$as_echo "$as_me: detected $cyassllibname" >&6;}
+    if test "x$USE_BEARSSL" = "xyes"; then
+      { $as_echo "$as_me:${as_lineno-$LINENO}: detected BearSSL" >&5
+$as_echo "$as_me: detected BearSSL" >&6;}
       check_for_ca_bundle=1
 
-            { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of long long" >&5
-$as_echo_n "checking size of long long... " >&6; }
-if ${ac_cv_sizeof_long_long+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  for ac_size in 4 8 1 2 16  ; do # List sizes in rough order of prevalence.
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-#include <sys/types.h>
-
-
-int main (void)
-{
-switch (0) case 0: case (sizeof (long long) == $ac_size):;
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ac_cv_sizeof_long_long=$ac_size
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-  if test x$ac_cv_sizeof_long_long != x ; then break; fi
-done
-
-fi
-
-if test x$ac_cv_sizeof_long_long = x ; then
-  as_fn_error $? "cannot determine a size for long long" "$LINENO" 5
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_long_long" >&5
-$as_echo "$ac_cv_sizeof_long_long" >&6; }
-
-cat >>confdefs.h <<_ACEOF
-#define SIZEOF_LONG_LONG $ac_cv_sizeof_long_long
-_ACEOF
+      LIBS="-lbearssl $LIBS"
 
-
-
-            for ac_header in cyassl/options.h
-do :
-  ac_fn_c_check_header_mongrel "$LINENO" "cyassl/options.h" "ac_cv_header_cyassl_options_h" "$ac_includes_default"
-if test "x$ac_cv_header_cyassl_options_h" = xyes; then :
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_CYASSL_OPTIONS_H 1
-_ACEOF
-
-fi
-
-done
-
-
-            for ac_header in cyassl/error-ssl.h
-do :
-  ac_fn_c_check_header_mongrel "$LINENO" "cyassl/error-ssl.h" "ac_cv_header_cyassl_error_ssl_h" "$ac_includes_default"
-if test "x$ac_cv_header_cyassl_error_ssl_h" = xyes; then :
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_CYASSL_ERROR_SSL_H 1
-_ACEOF
-
-fi
-
-done
-
-
-      LIBS="-l$cyassllibname -lm $LIBS"
-
-      if test "x$cyassllibname" = "xwolfssl"; then
-                        for ac_func in wolfSSLv3_client_method \
-                       wolfSSL_CTX_UseSupportedCurve \
-                       wolfSSL_get_peer_certificate \
-                       wolfSSL_UseALPN
-do :
-  as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
-ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
-if eval test \"x\$"$as_ac_var"\" = x"yes"; then :
-  cat >>confdefs.h <<_ACEOF
-#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
-_ACEOF
-
-fi
-done
-
-      else
-                for ac_func in CyaSSL_CTX_UseSupportedCurve \
-                       CyaSSL_get_peer_certificate
-do :
-  as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
-ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
-if eval test \"x\$"$as_ac_var"\" = x"yes"; then :
-  cat >>confdefs.h <<_ACEOF
-#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
-_ACEOF
-
-fi
-done
-
-      fi
-
-      if test -n "$cyassllib"; then
+      if test -n "$bearssllib"; then
                                         if test "x$cross_compiling" != "xyes"; then
-          CURL_LIBRARY_PATH="$CURL_LIBRARY_PATH:$cyassllib"
+          CURL_LIBRARY_PATH="$CURL_LIBRARY_PATH:$bearssllib"
           export CURL_LIBRARY_PATH
-          { $as_echo "$as_me:${as_lineno-$LINENO}: Added $cyassllib to CURL_LIBRARY_PATH" >&5
-$as_echo "$as_me: Added $cyassllib to CURL_LIBRARY_PATH" >&6;}
-        fi
-      fi
-
-    fi
-
-  fi
-  test -z "$ssl_msg" || ssl_backends="${ssl_backends:+$ssl_backends, }$ssl_msg"
-fi
-
-
-OPT_MESALINK=no
-
-_cppflags=$CPPFLAGS
-_ldflags=$LDFLAGS
-
-# Check whether --with-mesalink was given.
-if test "${with_mesalink+set}" = set; then :
-  withval=$with_mesalink; OPT_MESALINK=$withval
-fi
-
-
-if test -z "$ssl_backends" -o "x$OPT_MESALINK" != xno; then
-  ssl_msg=
-
-  if test X"$OPT_MESALINK" != Xno; then
-
-    if test "$OPT_MESALINK" = "yes"; then
-      OPT_MESALINK=""
-    fi
-
-    if test -z "$OPT_MESALINK" ; then
-
-      { $as_echo "$as_me:${as_lineno-$LINENO}: checking for mesalink_library_init in -lmesalink" >&5
-$as_echo_n "checking for mesalink_library_init in -lmesalink... " >&6; }
-if ${ac_cv_lib_mesalink_mesalink_library_init+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_check_lib_save_LIBS=$LIBS
-LIBS="-lmesalink  $LIBS"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-
-#ifdef __cplusplus
-extern "C"
-#endif
-char mesalink_library_init ();
-int main (void)
-{
-return mesalink_library_init ();
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  ac_cv_lib_mesalink_mesalink_library_init=yes
-else
-  ac_cv_lib_mesalink_mesalink_library_init=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_mesalink_mesalink_library_init" >&5
-$as_echo "$ac_cv_lib_mesalink_mesalink_library_init" >&6; }
-if test "x$ac_cv_lib_mesalink_mesalink_library_init" = xyes; then :
-
-
-$as_echo "#define USE_MESALINK 1" >>confdefs.h
-
-         USE_MESALINK=1
-
-         MESALINK_ENABLED=1
-         USE_MESALINK="yes"
-         ssl_msg="MesaLink"
-        test mesalink != "$DEFAULT_SSL_BACKEND" || VALID_DEFAULT_SSL_BACKEND=yes
-
-fi
-
-    fi
-
-    addld=""
-    addlib=""
-    addcflags=""
-    mesalinklib=""
-
-    if test "x$USE_MESALINK" != "xyes"; then
-            addld=-L$OPT_MESALINK/lib$libsuff
-      addcflags=-I$OPT_MESALINK/include
-      mesalinklib=$OPT_MESALINK/lib$libsuff
-
-      LDFLAGS="$LDFLAGS $addld"
-      if test "$addcflags" != "-I/usr/include"; then
-         CPPFLAGS="$CPPFLAGS $addcflags"
-      fi
-
-      { $as_echo "$as_me:${as_lineno-$LINENO}: checking for mesalink_library_init in -lmesalink" >&5
-$as_echo_n "checking for mesalink_library_init in -lmesalink... " >&6; }
-if ${ac_cv_lib_mesalink_mesalink_library_init+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_check_lib_save_LIBS=$LIBS
-LIBS="-lmesalink  $LIBS"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-
-#ifdef __cplusplus
-extern "C"
-#endif
-char mesalink_library_init ();
-int main (void)
-{
-return mesalink_library_init ();
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  ac_cv_lib_mesalink_mesalink_library_init=yes
-else
-  ac_cv_lib_mesalink_mesalink_library_init=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_mesalink_mesalink_library_init" >&5
-$as_echo "$ac_cv_lib_mesalink_mesalink_library_init" >&6; }
-if test "x$ac_cv_lib_mesalink_mesalink_library_init" = xyes; then :
-
-
-$as_echo "#define USE_MESALINK 1" >>confdefs.h
-
-       USE_MESALINK=1
-
-       MESALINK_ENABLED=1
-       USE_MESALINK="yes"
-       ssl_msg="MesaLink"
-       test mesalink != "$DEFAULT_SSL_BACKEND" || VALID_DEFAULT_SSL_BACKEND=yes
-
-else
-
-         CPPFLAGS=$_cppflags
-         LDFLAGS=$_ldflags
-
-fi
-
-    fi
-
-    if test "x$USE_MESALINK" = "xyes"; then
-      { $as_echo "$as_me:${as_lineno-$LINENO}: detected MesaLink" >&5
-$as_echo "$as_me: detected MesaLink" >&6;}
-
-      LIBS="-lmesalink $LIBS"
-
-      if test -n "$mesalinklib"; then
-                                        if test "x$cross_compiling" != "xyes"; then
-          LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$mesalinklib"
-          export LD_LIBRARY_PATH
-          { $as_echo "$as_me:${as_lineno-$LINENO}: Added $mesalinklib to LD_LIBRARY_PATH" >&5
-$as_echo "$as_me: Added $mesalinklib to LD_LIBRARY_PATH" >&6;}
+          { $as_echo "$as_me:${as_lineno-$LINENO}: Added $bearssllib to CURL_LIBRARY_PATH" >&5
+$as_echo "$as_me: Added $bearssllib to CURL_LIBRARY_PATH" >&6;}
         fi
       fi
     fi
@@ -25534,112 +25417,12 @@ $as_echo "$as_me: Added $nssprefix/lib$libsuff to CURL_LIBRARY_PATH" >&6;}
   test -z "$ssl_msg" || ssl_backends="${ssl_backends:+$ssl_backends, }$ssl_msg"
 fi
 
-OPT_AXTLS=off
-
-
-# Check whether --with-axtls was given.
-if test "${with_axtls+set}" = set; then :
-  withval=$with_axtls; OPT_AXTLS=$withval
-fi
-
-
-if test -z "$ssl_backends" -o "x$OPT_AXTLS" != xno; then
-  ssl_msg=
-  if test X"$OPT_AXTLS" != Xno; then
-        CLEANLDFLAGS="$LDFLAGS"
-    CLEANCPPFLAGS="$CPPFLAGS"
-    CLEANLIBS="$LIBS"
-
-    case "$OPT_AXTLS" in
-    yes)
-            PREFIX_AXTLS=/usr/local
-      LIB_AXTLS="$PREFIX_AXTLS/lib"
-      LDFLAGS="$LDFLAGS -L$LIB_AXTLS"
-      CPPFLAGS="$CPPFLAGS -I$PREFIX_AXTLS/include"
-      ;;
-    off)
-            PREFIX_AXTLS=
-      ;;
-    *)
-            PREFIX_AXTLS=$OPT_AXTLS
-      LIB_AXTLS="$PREFIX_AXTLS/lib"
-      LDFLAGS="$LDFLAGS -L$LIB_AXTLS"
-      CPPFLAGS="$CPPFLAGS -I$PREFIX_AXTLS/include"
-      ;;
-    esac
-
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ssl_version in -laxtls" >&5
-$as_echo_n "checking for ssl_version in -laxtls... " >&6; }
-if ${ac_cv_lib_axtls_ssl_version+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_check_lib_save_LIBS=$LIBS
-LIBS="-laxtls  $LIBS"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-
-#ifdef __cplusplus
-extern "C"
-#endif
-char ssl_version ();
-int main (void)
-{
-return ssl_version ();
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  ac_cv_lib_axtls_ssl_version=yes
-else
-  ac_cv_lib_axtls_ssl_version=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_axtls_ssl_version" >&5
-$as_echo "$ac_cv_lib_axtls_ssl_version" >&6; }
-if test "x$ac_cv_lib_axtls_ssl_version" = xyes; then :
-
-      LIBS="-laxtls $LIBS"
-
-$as_echo "#define USE_AXTLS 1" >>confdefs.h
-
-      USE_AXTLS=1
-
-      AXTLS_ENABLED=1
-      check_for_ca_bundle=1
-      USE_AXTLS="yes"
-      ssl_msg="axTLS"
-      test axtls != "$DEFAULT_SSL_BACKEND" || VALID_DEFAULT_SSL_BACKEND=yes
-
-      if test "x$cross_compiling" != "xyes"; then
-        CURL_LIBRARY_PATH="$CURL_LIBRARY_PATH:$LIB_AXTLS"
-        export CURL_LIBRARY_PATH
-        { $as_echo "$as_me:${as_lineno-$LINENO}: Added $LIB_AXTLS to CURL_LIBRARY_PATH" >&5
-$as_echo "$as_me: Added $LIB_AXTLS to CURL_LIBRARY_PATH" >&6;}
-      fi
-
-else
-
-      LDFLAGS="$CLEANLDFLAGS"
-      CPPFLAGS="$CLEANCPPFLAGS"
-      LIBS="$CLEANLIBS"
-
-fi
-
-  fi
-  test -z "$ssl_msg" || ssl_backends="${ssl_backends:+$ssl_backends, }$ssl_msg"
-fi
-
-case "x$OPENSSL_ENABLED$GNUTLS_ENABLED$NSS_ENABLED$POLARSSL_ENABLED$MBEDTLS_ENABLED$AXTLS_ENABLED$CYASSL_ENABLED$WINSSL_ENABLED$DARWINSSL_ENABLED$MESALINK_ENABLED" in
+case "x$OPENSSL_ENABLED$GNUTLS_ENABLED$NSS_ENABLED$MBEDTLS_ENABLED$WOLFSSL_ENABLED$WINSSL_ENABLED$SECURETRANSPORT_ENABLED$MESALINK_ENABLED$BEARSSL_ENABLED$AMISSL_ENABLED" in
 x)
   { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: SSL disabled, you will not be able to use HTTPS, FTPS, NTLM and more." >&5
 $as_echo "$as_me: WARNING: SSL disabled, you will not be able to use HTTPS, FTPS, NTLM and more." >&2;}
-  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Use --with-ssl, --with-gnutls, --with-polarssl, --with-cyassl, --with-nss, --with-axtls, --with-winssl, --with-darwinssl, or --with-mesalink to address this." >&5
-$as_echo "$as_me: WARNING: Use --with-ssl, --with-gnutls, --with-polarssl, --with-cyassl, --with-nss, --with-axtls, --with-winssl, --with-darwinssl, or --with-mesalink to address this." >&2;}
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Use --with-ssl, --with-gnutls, --with-wolfssl, --with-mbedtls, --with-nss, --with-schannel, --with-secure-transport, --with-mesalink, --with-amissl or --with-bearssl to address this." >&5
+$as_echo "$as_me: WARNING: Use --with-ssl, --with-gnutls, --with-wolfssl, --with-mbedtls, --with-nss, --with-schannel, --with-secure-transport, --with-mesalink, --with-amissl or --with-bearssl to address this." >&2;}
   ;;
 x1)
   # one SSL backend is enabled
@@ -25684,7 +25467,7 @@ _ACEOF
 fi
 
 
-if test "$check_for_ca_bundle" -gt 0; then
+if test -n "$check_for_ca_bundle"; then
 
 
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking default CA cert bundle/path" >&5
@@ -25906,7 +25689,7 @@ $as_echo "$ac_cv_search_psl_builtin" >&6; }
 ac_res=$ac_cv_search_psl_builtin
 if test "$ac_res" != no; then :
   test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
-  curl_psl_msg="yes";
+  curl_psl_msg="enabled";
 
 $as_echo "#define USE_LIBPSL 1" >>confdefs.h
 
@@ -25920,7 +25703,7 @@ $as_echo "$as_me: WARNING: libpsl was not found" >&2;}
 fi
 
 fi
- if test "$curl_psl_msg" = "yes"; then
+ if test "$curl_psl_msg" = "enabled"; then
   USE_LIBPSL_TRUE=
   USE_LIBPSL_FALSE='#'
 else
@@ -27085,16 +26868,12 @@ $as_echo "yes" >&6; }
           versioned_symbols_flavour="GNUTLS_"
         elif test "x$NSS_ENABLED" = "x1"; then
           versioned_symbols_flavour="NSS_"
-        elif test "x$POLARSSL_ENABLED" = "x1"; then
-          versioned_symbols_flavour="POLARSSL_"
-        elif test "x$CYASSL_ENABLED" = "x1"; then
-          versioned_symbols_flavour="CYASSL_"
-        elif test "x$AXTLS_ENABLED" = "x1"; then
-          versioned_symbols_flavour="AXTLS_"
+        elif test "x$WOLFSSL_ENABLED" = "x1"; then
+          versioned_symbols_flavour="WOLFSSL_"
         elif test "x$WINSSL_ENABLED" = "x1"; then
-          versioned_symbols_flavour="WINSSL_"
-        elif test "x$DARWINSSL_ENABLED" = "x1"; then
-          versioned_symbols_flavour="DARWINSSL_"
+          versioned_symbols_flavour="SCHANNEL_"
+        elif test "x$SECURETRANSPORT_ENABLED" = "x1"; then
+          versioned_symbols_flavour="SECURE_TRANSPORT_"
         else
           versioned_symbols_flavour=""
         fi
 fi
 
 
+OPT_TCP2="yes"
+curl_h3_msg="disabled (--with-ngtcp2, --with-quiche)"
+
+if test "x$disable_http" = "xyes"; then
+  # without HTTP, ngtcp2 is no use
+  OPT_TCP2="no"
+fi
+
+
+# Check whether --with-ngtcp2 was given.
+if test "${with_ngtcp2+set}" = set; then :
+  withval=$with_ngtcp2; OPT_TCP2=$withval
+fi
+
+case "$OPT_TCP2" in
+  no)
+        want_tcp2="no"
+    ;;
+  yes)
+        want_tcp2="default"
+    want_tcp2_path=""
+    ;;
+  *)
+        want_tcp2="yes"
+    want_tcp2_path="$withval/lib/pkgconfig"
+    ;;
+esac
+
+curl_tcp2_msg="disabled (--with-ngtcp2)"
+if test X"$want_tcp2" != Xno; then
+    CLEANLDFLAGS="$LDFLAGS"
+  CLEANCPPFLAGS="$CPPFLAGS"
+  CLEANLIBS="$LIBS"
+
+
+    if test -n "$PKG_CONFIG"; then
+      PKGCONFIG="$PKG_CONFIG"
+    else
+      if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args.
+set dummy ${ac_tool_prefix}pkg-config; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_PKGCONFIG+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $PKGCONFIG in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_PKGCONFIG="$PKGCONFIG" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+as_dummy="$PATH:/usr/bin:/usr/local/bin"
+for as_dir in $as_dummy
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_path_PKGCONFIG="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+  ;;
+esac
+fi
+PKGCONFIG=$ac_cv_path_PKGCONFIG
+if test -n "$PKGCONFIG"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKGCONFIG" >&5
+$as_echo "$PKGCONFIG" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_path_PKGCONFIG"; then
+  ac_pt_PKGCONFIG=$PKGCONFIG
+  # Extract the first word of "pkg-config", so it can be a program name with args.
+set dummy pkg-config; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_ac_pt_PKGCONFIG+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $ac_pt_PKGCONFIG in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_ac_pt_PKGCONFIG="$ac_pt_PKGCONFIG" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+as_dummy="$PATH:/usr/bin:/usr/local/bin"
+for as_dir in $as_dummy
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_path_ac_pt_PKGCONFIG="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+  ;;
+esac
+fi
+ac_pt_PKGCONFIG=$ac_cv_path_ac_pt_PKGCONFIG
+if test -n "$ac_pt_PKGCONFIG"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKGCONFIG" >&5
+$as_echo "$ac_pt_PKGCONFIG" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_pt_PKGCONFIG" = x; then
+    PKGCONFIG="no"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    PKGCONFIG=$ac_pt_PKGCONFIG
+  fi
+else
+  PKGCONFIG="$ac_cv_path_PKGCONFIG"
+fi
+
+    fi
+
+    if test "x$PKGCONFIG" != "xno"; then
+      { $as_echo "$as_me:${as_lineno-$LINENO}: checking for libngtcp2 options with pkg-config" >&5
+$as_echo_n "checking for libngtcp2 options with pkg-config... " >&6; }
+            itexists=`
+    if test -n "$want_tcp2_path"; then
+      PKG_CONFIG_LIBDIR="$want_tcp2_path"
+      export PKG_CONFIG_LIBDIR
+    fi
+         $PKGCONFIG --exists libngtcp2 >/dev/null 2>&1 && echo 1`
+
+      if test -z "$itexists"; then
+                        PKGCONFIG="no"
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+      else
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: found" >&5
+$as_echo "found" >&6; }
+      fi
+    fi
+
+
+  if test "$PKGCONFIG" != "no" ; then
+    LIB_TCP2=`
+    if test -n "$want_tcp2_path"; then
+      PKG_CONFIG_LIBDIR="$want_tcp2_path"
+      export PKG_CONFIG_LIBDIR
+    fi
+
+      $PKGCONFIG --libs-only-l libngtcp2`
+    { $as_echo "$as_me:${as_lineno-$LINENO}: -l is $LIB_TCP2" >&5
+$as_echo "$as_me: -l is $LIB_TCP2" >&6;}
+
+    CPP_TCP2=`
+    if test -n "$want_tcp2_path"; then
+      PKG_CONFIG_LIBDIR="$want_tcp2_path"
+      export PKG_CONFIG_LIBDIR
+    fi
+       $PKGCONFIG --cflags-only-I libngtcp2`
+    { $as_echo "$as_me:${as_lineno-$LINENO}: -I is $CPP_TCP2" >&5
+$as_echo "$as_me: -I is $CPP_TCP2" >&6;}
+
+    LD_TCP2=`
+    if test -n "$want_tcp2_path"; then
+      PKG_CONFIG_LIBDIR="$want_tcp2_path"
+      export PKG_CONFIG_LIBDIR
+    fi
+
+      $PKGCONFIG --libs-only-L libngtcp2`
+    { $as_echo "$as_me:${as_lineno-$LINENO}: -L is $LD_TCP2" >&5
+$as_echo "$as_me: -L is $LD_TCP2" >&6;}
+
+    LDFLAGS="$LDFLAGS $LD_TCP2"
+    CPPFLAGS="$CPPFLAGS $CPP_TCP2"
+    LIBS="$LIB_TCP2 $LIBS"
+
+    if test "x$cross_compiling" != "xyes"; then
+      DIR_TCP2=`echo $LD_TCP2 | $SED -e 's/-L//'`
+    fi
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ngtcp2_conn_client_new in -lngtcp2" >&5
+$as_echo_n "checking for ngtcp2_conn_client_new in -lngtcp2... " >&6; }
+if ${ac_cv_lib_ngtcp2_ngtcp2_conn_client_new+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lngtcp2  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+
+#ifdef __cplusplus
+extern "C"
+#endif
+char ngtcp2_conn_client_new ();
+int main (void)
+{
+return ngtcp2_conn_client_new ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_ngtcp2_ngtcp2_conn_client_new=yes
+else
+  ac_cv_lib_ngtcp2_ngtcp2_conn_client_new=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ngtcp2_ngtcp2_conn_client_new" >&5
+$as_echo "$ac_cv_lib_ngtcp2_ngtcp2_conn_client_new" >&6; }
+if test "x$ac_cv_lib_ngtcp2_ngtcp2_conn_client_new" = xyes; then :
+
+       for ac_header in ngtcp2/ngtcp2.h
+do :
+  ac_fn_c_check_header_mongrel "$LINENO" "ngtcp2/ngtcp2.h" "ac_cv_header_ngtcp2_ngtcp2_h" "$ac_includes_default"
+if test "x$ac_cv_header_ngtcp2_ngtcp2_h" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_NGTCP2_NGTCP2_H 1
+_ACEOF
+ NGTCP2_ENABLED=1
+
+$as_echo "#define USE_NGTCP2 1" >>confdefs.h
+
+          USE_NGTCP2=1
+
+          CURL_LIBRARY_PATH="$CURL_LIBRARY_PATH:$DIR_TCP2"
+          export CURL_LIBRARY_PATH
+          { $as_echo "$as_me:${as_lineno-$LINENO}: Added $DIR_TCP2 to CURL_LIBRARY_PATH" >&5
+$as_echo "$as_me: Added $DIR_TCP2 to CURL_LIBRARY_PATH" >&6;}
+
+fi
+
+done
+
+
+else
+          LDFLAGS=$CLEANLDFLAGS
+        CPPFLAGS=$CLEANCPPFLAGS
+        LIBS=$CLEANLIBS
+
+fi
+
+
+  else
+        if test X"$want_tcp2" != Xdefault; then
+                  as_fn_error $? "--with-ngtcp2 was specified but could not find ngtcp2 pkg-config file." "$LINENO" 5
+    fi
+  fi
+
+fi
+
+if test "x$NGTCP2_ENABLED" = "x1"; then
+    CLEANLDFLAGS="$LDFLAGS"
+  CLEANCPPFLAGS="$CPPFLAGS"
+  CLEANLIBS="$LIBS"
+
+
+    if test -n "$PKG_CONFIG"; then
+      PKGCONFIG="$PKG_CONFIG"
+    else
+      if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args.
+set dummy ${ac_tool_prefix}pkg-config; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_PKGCONFIG+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $PKGCONFIG in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_PKGCONFIG="$PKGCONFIG" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+as_dummy="$PATH:/usr/bin:/usr/local/bin"
+for as_dir in $as_dummy
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_path_PKGCONFIG="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+  ;;
+esac
+fi
+PKGCONFIG=$ac_cv_path_PKGCONFIG
+if test -n "$PKGCONFIG"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKGCONFIG" >&5
+$as_echo "$PKGCONFIG" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_path_PKGCONFIG"; then
+  ac_pt_PKGCONFIG=$PKGCONFIG
+  # Extract the first word of "pkg-config", so it can be a program name with args.
+set dummy pkg-config; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_ac_pt_PKGCONFIG+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $ac_pt_PKGCONFIG in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_ac_pt_PKGCONFIG="$ac_pt_PKGCONFIG" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+as_dummy="$PATH:/usr/bin:/usr/local/bin"
+for as_dir in $as_dummy
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_path_ac_pt_PKGCONFIG="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+  ;;
+esac
+fi
+ac_pt_PKGCONFIG=$ac_cv_path_ac_pt_PKGCONFIG
+if test -n "$ac_pt_PKGCONFIG"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKGCONFIG" >&5
+$as_echo "$ac_pt_PKGCONFIG" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_pt_PKGCONFIG" = x; then
+    PKGCONFIG="no"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    PKGCONFIG=$ac_pt_PKGCONFIG
+  fi
+else
+  PKGCONFIG="$ac_cv_path_PKGCONFIG"
+fi
+
+    fi
+
+    if test "x$PKGCONFIG" != "xno"; then
+      { $as_echo "$as_me:${as_lineno-$LINENO}: checking for libngtcp2_crypto_openssl options with pkg-config" >&5
+$as_echo_n "checking for libngtcp2_crypto_openssl options with pkg-config... " >&6; }
+            itexists=`
+    if test -n "$want_tcp2_path"; then
+      PKG_CONFIG_LIBDIR="$want_tcp2_path"
+      export PKG_CONFIG_LIBDIR
+    fi
+         $PKGCONFIG --exists libngtcp2_crypto_openssl >/dev/null 2>&1 && echo 1`
+
+      if test -z "$itexists"; then
+                        PKGCONFIG="no"
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+      else
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: found" >&5
+$as_echo "found" >&6; }
+      fi
+    fi
+
+
+  if test "$PKGCONFIG" != "no" ; then
+    LIB_NGTCP2_CRYPTO_OPENSSL=`
+    if test -n "$want_tcp2_path"; then
+      PKG_CONFIG_LIBDIR="$want_tcp2_path"
+      export PKG_CONFIG_LIBDIR
+    fi
+
+      $PKGCONFIG --libs-only-l libngtcp2_crypto_openssl`
+    { $as_echo "$as_me:${as_lineno-$LINENO}: -l is $LIB_NGTCP2_CRYPTO_OPENSSL" >&5
+$as_echo "$as_me: -l is $LIB_NGTCP2_CRYPTO_OPENSSL" >&6;}
+
+    CPP_NGTCP2_CRYPTO_OPENSSL=`
+    if test -n "$want_tcp2_path"; then
+      PKG_CONFIG_LIBDIR="$want_tcp2_path"
+      export PKG_CONFIG_LIBDIR
+    fi
+       $PKGCONFIG --cflags-only-I libngtcp2_crypto_openssl`
+    { $as_echo "$as_me:${as_lineno-$LINENO}: -I is $CPP_NGTCP2_CRYPTO_OPENSSL" >&5
+$as_echo "$as_me: -I is $CPP_NGTCP2_CRYPTO_OPENSSL" >&6;}
+
+    LD_NGTCP2_CRYPTO_OPENSSL=`
+    if test -n "$want_tcp2_path"; then
+      PKG_CONFIG_LIBDIR="$want_tcp2_path"
+      export PKG_CONFIG_LIBDIR
+    fi
+
+      $PKGCONFIG --libs-only-L libngtcp2_crypto_openssl`
+    { $as_echo "$as_me:${as_lineno-$LINENO}: -L is $LD_NGTCP2_CRYPTO_OPENSSL" >&5
+$as_echo "$as_me: -L is $LD_NGTCP2_CRYPTO_OPENSSL" >&6;}
+
+    LDFLAGS="$LDFLAGS $LD_NGTCP2_CRYPTO_OPENSSL"
+    CPPFLAGS="$CPPFLAGS $CPP_NGTCP2_CRYPTO_OPENSSL"
+    LIBS="$LIB_NGTCP2_CRYPTO_OPENSSL $LIBS"
+
+    if test "x$cross_compiling" != "xyes"; then
+      DIR_NGTCP2_CRYPTO_OPENSSL=`echo $LD_NGTCP2_CRYPTO_OPENSSL | $SED -e 's/-L//'`
+    fi
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ngtcp2_crypto_ctx_initial in -lngtcp2_crypto_openssl" >&5
+$as_echo_n "checking for ngtcp2_crypto_ctx_initial in -lngtcp2_crypto_openssl... " >&6; }
+if ${ac_cv_lib_ngtcp2_crypto_openssl_ngtcp2_crypto_ctx_initial+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lngtcp2_crypto_openssl  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+
+#ifdef __cplusplus
+extern "C"
+#endif
+char ngtcp2_crypto_ctx_initial ();
+int main (void)
+{
+return ngtcp2_crypto_ctx_initial ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_ngtcp2_crypto_openssl_ngtcp2_crypto_ctx_initial=yes
+else
+  ac_cv_lib_ngtcp2_crypto_openssl_ngtcp2_crypto_ctx_initial=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ngtcp2_crypto_openssl_ngtcp2_crypto_ctx_initial" >&5
+$as_echo "$ac_cv_lib_ngtcp2_crypto_openssl_ngtcp2_crypto_ctx_initial" >&6; }
+if test "x$ac_cv_lib_ngtcp2_crypto_openssl_ngtcp2_crypto_ctx_initial" = xyes; then :
+
+       for ac_header in ngtcp2/ngtcp2_crypto.h
+do :
+  ac_fn_c_check_header_mongrel "$LINENO" "ngtcp2/ngtcp2_crypto.h" "ac_cv_header_ngtcp2_ngtcp2_crypto_h" "$ac_includes_default"
+if test "x$ac_cv_header_ngtcp2_ngtcp2_crypto_h" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_NGTCP2_NGTCP2_CRYPTO_H 1
+_ACEOF
+ NGTCP2_ENABLED=1
+
+$as_echo "#define USE_NGTCP2_CRYPTO_OPENSSL 1" >>confdefs.h
+
+          USE_NGTCP2_CRYPTO_OPENSSL=1
+
+          CURL_LIBRARY_PATH="$CURL_LIBRARY_PATH:$DIR_NGTCP2_CRYPTO_OPENSSL"
+          export CURL_LIBRARY_PATH
+          { $as_echo "$as_me:${as_lineno-$LINENO}: Added $DIR_NGTCP2_CRYPTO_OPENSSL to CURL_LIBRARY_PATH" >&5
+$as_echo "$as_me: Added $DIR_NGTCP2_CRYPTO_OPENSSL to CURL_LIBRARY_PATH" >&6;}
+
+fi
+
+done
+
+
+else
+          LDFLAGS=$CLEANLDFLAGS
+        CPPFLAGS=$CLEANCPPFLAGS
+        LIBS=$CLEANLIBS
+
+fi
+
+
+  else
+        if test X"$want_tcp2" != Xdefault; then
+                  as_fn_error $? "--with-ngtcp2 was specified but could not find ngtcp2_crypto_openssl pkg-config file." "$LINENO" 5
+    fi
+  fi
+fi
+
+
+OPT_NGHTTP3="yes"
+
+if test "x$NGTCP2_ENABLED" = "x"; then
+  # without ngtcp2, nghttp3 is of no use for us
+  OPT_NGHTTP3="no"
+fi
+
+
+# Check whether --with-nghttp3 was given.
+if test "${with_nghttp3+set}" = set; then :
+  withval=$with_nghttp3; OPT_NGHTTP3=$withval
+fi
+
+case "$OPT_NGHTTP3" in
+  no)
+        want_nghttp3="no"
+    ;;
+  yes)
+        want_nghttp3="default"
+    want_nghttp3_path=""
+    ;;
+  *)
+        want_nghttp3="yes"
+    want_nghttp3_path="$withval/lib/pkgconfig"
+    ;;
+esac
+
+curl_http3_msg="disabled (--with-nghttp3)"
+if test X"$want_nghttp3" != Xno; then
+    CLEANLDFLAGS="$LDFLAGS"
+  CLEANCPPFLAGS="$CPPFLAGS"
+  CLEANLIBS="$LIBS"
+
+
+    if test -n "$PKG_CONFIG"; then
+      PKGCONFIG="$PKG_CONFIG"
+    else
+      if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args.
+set dummy ${ac_tool_prefix}pkg-config; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_PKGCONFIG+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $PKGCONFIG in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_PKGCONFIG="$PKGCONFIG" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+as_dummy="$PATH:/usr/bin:/usr/local/bin"
+for as_dir in $as_dummy
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_path_PKGCONFIG="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+  ;;
+esac
+fi
+PKGCONFIG=$ac_cv_path_PKGCONFIG
+if test -n "$PKGCONFIG"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKGCONFIG" >&5
+$as_echo "$PKGCONFIG" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_path_PKGCONFIG"; then
+  ac_pt_PKGCONFIG=$PKGCONFIG
+  # Extract the first word of "pkg-config", so it can be a program name with args.
+set dummy pkg-config; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_ac_pt_PKGCONFIG+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $ac_pt_PKGCONFIG in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_ac_pt_PKGCONFIG="$ac_pt_PKGCONFIG" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+as_dummy="$PATH:/usr/bin:/usr/local/bin"
+for as_dir in $as_dummy
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_path_ac_pt_PKGCONFIG="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+  ;;
+esac
+fi
+ac_pt_PKGCONFIG=$ac_cv_path_ac_pt_PKGCONFIG
+if test -n "$ac_pt_PKGCONFIG"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKGCONFIG" >&5
+$as_echo "$ac_pt_PKGCONFIG" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_pt_PKGCONFIG" = x; then
+    PKGCONFIG="no"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    PKGCONFIG=$ac_pt_PKGCONFIG
+  fi
+else
+  PKGCONFIG="$ac_cv_path_PKGCONFIG"
+fi
+
+    fi
+
+    if test "x$PKGCONFIG" != "xno"; then
+      { $as_echo "$as_me:${as_lineno-$LINENO}: checking for libnghttp3 options with pkg-config" >&5
+$as_echo_n "checking for libnghttp3 options with pkg-config... " >&6; }
+            itexists=`
+    if test -n "$want_nghttp3_path"; then
+      PKG_CONFIG_LIBDIR="$want_nghttp3_path"
+      export PKG_CONFIG_LIBDIR
+    fi
+         $PKGCONFIG --exists libnghttp3 >/dev/null 2>&1 && echo 1`
+
+      if test -z "$itexists"; then
+                        PKGCONFIG="no"
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+      else
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: found" >&5
+$as_echo "found" >&6; }
+      fi
+    fi
+
+
+  if test "$PKGCONFIG" != "no" ; then
+    LIB_NGHTTP3=`
+    if test -n "$want_nghttp3_path"; then
+      PKG_CONFIG_LIBDIR="$want_nghttp3_path"
+      export PKG_CONFIG_LIBDIR
+    fi
+
+      $PKGCONFIG --libs-only-l libnghttp3`
+    { $as_echo "$as_me:${as_lineno-$LINENO}: -l is $LIB_NGHTTP3" >&5
+$as_echo "$as_me: -l is $LIB_NGHTTP3" >&6;}
+
+    CPP_NGHTTP3=`
+    if test -n "$want_nghttp3_path"; then
+      PKG_CONFIG_LIBDIR="$want_nghttp3_path"
+      export PKG_CONFIG_LIBDIR
+    fi
+       $PKGCONFIG --cflags-only-I libnghttp3`
+    { $as_echo "$as_me:${as_lineno-$LINENO}: -I is $CPP_NGHTTP3" >&5
+$as_echo "$as_me: -I is $CPP_NGHTTP3" >&6;}
+
+    LD_NGHTTP3=`
+    if test -n "$want_nghttp3_path"; then
+      PKG_CONFIG_LIBDIR="$want_nghttp3_path"
+      export PKG_CONFIG_LIBDIR
+    fi
+
+      $PKGCONFIG --libs-only-L libnghttp3`
+    { $as_echo "$as_me:${as_lineno-$LINENO}: -L is $LD_NGHTTP3" >&5
+$as_echo "$as_me: -L is $LD_NGHTTP3" >&6;}
+
+    LDFLAGS="$LDFLAGS $LD_NGHTTP3"
+    CPPFLAGS="$CPPFLAGS $CPP_NGHTTP3"
+    LIBS="$LIB_NGHTTP3 $LIBS"
+
+    if test "x$cross_compiling" != "xyes"; then
+      DIR_NGHTTP3=`echo $LD_NGHTTP3 | $SED -e 's/-L//'`
+    fi
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for nghttp3_conn_client_new in -lnghttp3" >&5
+$as_echo_n "checking for nghttp3_conn_client_new in -lnghttp3... " >&6; }
+if ${ac_cv_lib_nghttp3_nghttp3_conn_client_new+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lnghttp3  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+
+#ifdef __cplusplus
+extern "C"
+#endif
+char nghttp3_conn_client_new ();
+int main (void)
+{
+return nghttp3_conn_client_new ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_nghttp3_nghttp3_conn_client_new=yes
+else
+  ac_cv_lib_nghttp3_nghttp3_conn_client_new=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_nghttp3_nghttp3_conn_client_new" >&5
+$as_echo "$ac_cv_lib_nghttp3_nghttp3_conn_client_new" >&6; }
+if test "x$ac_cv_lib_nghttp3_nghttp3_conn_client_new" = xyes; then :
+
+       for ac_header in nghttp3/nghttp3.h
+do :
+  ac_fn_c_check_header_mongrel "$LINENO" "nghttp3/nghttp3.h" "ac_cv_header_nghttp3_nghttp3_h" "$ac_includes_default"
+if test "x$ac_cv_header_nghttp3_nghttp3_h" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_NGHTTP3_NGHTTP3_H 1
+_ACEOF
+ curl_h3_msg="enabled (ngtcp2 + nghttp3)"
+          NGHTTP3_ENABLED=1
+
+$as_echo "#define USE_NGHTTP3 1" >>confdefs.h
+
+          USE_NGHTTP3=1
+
+          CURL_LIBRARY_PATH="$CURL_LIBRARY_PATH:$DIR_NGHTTP3"
+          export CURL_LIBRARY_PATH
+          { $as_echo "$as_me:${as_lineno-$LINENO}: Added $DIR_NGHTTP3 to CURL_LIBRARY_PATH" >&5
+$as_echo "$as_me: Added $DIR_NGHTTP3 to CURL_LIBRARY_PATH" >&6;}
+          experimental="$experimental HTTP3"
+
+fi
+
+done
+
+
+else
+          LDFLAGS=$CLEANLDFLAGS
+        CPPFLAGS=$CLEANCPPFLAGS
+        LIBS=$CLEANLIBS
+
+fi
+
+
+  else
+        if test X"$want_nghttp3" != Xdefault; then
+                  as_fn_error $? "--with-nghttp3 was specified but could not find nghttp3 pkg-config file." "$LINENO" 5
+    fi
+  fi
+
+fi
+
+
+OPT_QUICHE="yes"
+
+if test "x$disable_http" = "xyes" -o "x$USE_NGTCP" = "x1"; then
+  # without HTTP or with ngtcp2, quiche is no use
+  OPT_QUICHE="no"
+fi
+
+
+# Check whether --with-quiche was given.
+if test "${with_quiche+set}" = set; then :
+  withval=$with_quiche; OPT_QUICHE=$withval
+fi
+
+case "$OPT_QUICHE" in
+  no)
+        want_quiche="no"
+    ;;
+  yes)
+        want_quiche="default"
+    want_quiche_path=""
+    ;;
+  *)
+        want_quiche="yes"
+    want_quiche_path="$withval"
+    ;;
+esac
+
+if test X"$want_quiche" != Xno; then
+    CLEANLDFLAGS="$LDFLAGS"
+  CLEANCPPFLAGS="$CPPFLAGS"
+  CLEANLIBS="$LIBS"
+
+
+    if test -n "$PKG_CONFIG"; then
+      PKGCONFIG="$PKG_CONFIG"
+    else
+      if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args.
+set dummy ${ac_tool_prefix}pkg-config; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_PKGCONFIG+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $PKGCONFIG in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_PKGCONFIG="$PKGCONFIG" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+as_dummy="$PATH:/usr/bin:/usr/local/bin"
+for as_dir in $as_dummy
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_path_PKGCONFIG="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+  ;;
+esac
+fi
+PKGCONFIG=$ac_cv_path_PKGCONFIG
+if test -n "$PKGCONFIG"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKGCONFIG" >&5
+$as_echo "$PKGCONFIG" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_path_PKGCONFIG"; then
+  ac_pt_PKGCONFIG=$PKGCONFIG
+  # Extract the first word of "pkg-config", so it can be a program name with args.
+set dummy pkg-config; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_ac_pt_PKGCONFIG+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $ac_pt_PKGCONFIG in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_ac_pt_PKGCONFIG="$ac_pt_PKGCONFIG" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+as_dummy="$PATH:/usr/bin:/usr/local/bin"
+for as_dir in $as_dummy
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_path_ac_pt_PKGCONFIG="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+  ;;
+esac
+fi
+ac_pt_PKGCONFIG=$ac_cv_path_ac_pt_PKGCONFIG
+if test -n "$ac_pt_PKGCONFIG"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKGCONFIG" >&5
+$as_echo "$ac_pt_PKGCONFIG" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_pt_PKGCONFIG" = x; then
+    PKGCONFIG="no"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    PKGCONFIG=$ac_pt_PKGCONFIG
+  fi
+else
+  PKGCONFIG="$ac_cv_path_PKGCONFIG"
+fi
+
+    fi
+
+    if test "x$PKGCONFIG" != "xno"; then
+      { $as_echo "$as_me:${as_lineno-$LINENO}: checking for quiche options with pkg-config" >&5
+$as_echo_n "checking for quiche options with pkg-config... " >&6; }
+            itexists=`
+    if test -n "$want_quiche_path"; then
+      PKG_CONFIG_LIBDIR="$want_quiche_path"
+      export PKG_CONFIG_LIBDIR
+    fi
+         $PKGCONFIG --exists quiche >/dev/null 2>&1 && echo 1`
+
+      if test -z "$itexists"; then
+                        PKGCONFIG="no"
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+      else
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: found" >&5
+$as_echo "found" >&6; }
+      fi
+    fi
+
+
+  if test "$PKGCONFIG" != "no" ; then
+    LIB_QUICHE=`
+    if test -n "$want_quiche_path"; then
+      PKG_CONFIG_LIBDIR="$want_quiche_path"
+      export PKG_CONFIG_LIBDIR
+    fi
+
+      $PKGCONFIG --libs-only-l quiche`
+    { $as_echo "$as_me:${as_lineno-$LINENO}: -l is $LIB_QUICHE" >&5
+$as_echo "$as_me: -l is $LIB_QUICHE" >&6;}
+
+    CPP_QUICHE=`
+    if test -n "$want_quiche_path"; then
+      PKG_CONFIG_LIBDIR="$want_quiche_path"
+      export PKG_CONFIG_LIBDIR
+    fi
+       $PKGCONFIG --cflags-only-I quiche`
+    { $as_echo "$as_me:${as_lineno-$LINENO}: -I is $CPP_QUICHE" >&5
+$as_echo "$as_me: -I is $CPP_QUICHE" >&6;}
+
+    LD_QUICHE=`
+    if test -n "$want_quiche_path"; then
+      PKG_CONFIG_LIBDIR="$want_quiche_path"
+      export PKG_CONFIG_LIBDIR
+    fi
+
+      $PKGCONFIG --libs-only-L quiche`
+    { $as_echo "$as_me:${as_lineno-$LINENO}: -L is $LD_QUICHE" >&5
+$as_echo "$as_me: -L is $LD_QUICHE" >&6;}
+
+    LDFLAGS="$LDFLAGS $LD_QUICHE"
+    CPPFLAGS="$CPPFLAGS $CPP_QUICHE"
+    LIBS="$LIB_QUICHE $LIBS"
+
+    if test "x$cross_compiling" != "xyes"; then
+      DIR_QUICHE=`echo $LD_QUICHE | $SED -e 's/-L//'`
+    fi
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for quiche_connect in -lquiche" >&5
+$as_echo_n "checking for quiche_connect in -lquiche... " >&6; }
+if ${ac_cv_lib_quiche_quiche_connect+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lquiche  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+
+#ifdef __cplusplus
+extern "C"
+#endif
+char quiche_connect ();
+int main (void)
+{
+return quiche_connect ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_quiche_quiche_connect=yes
+else
+  ac_cv_lib_quiche_quiche_connect=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_quiche_quiche_connect" >&5
+$as_echo "$ac_cv_lib_quiche_quiche_connect" >&6; }
+if test "x$ac_cv_lib_quiche_quiche_connect" = xyes; then :
+
+       for ac_header in quiche.h
+do :
+  ac_fn_c_check_header_mongrel "$LINENO" "quiche.h" "ac_cv_header_quiche_h" "$ac_includes_default"
+if test "x$ac_cv_header_quiche_h" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_QUICHE_H 1
+_ACEOF
+ experimental="$experimental HTTP3"
+          { $as_echo "$as_me:${as_lineno-$LINENO}: HTTP3 support is experimental" >&5
+$as_echo "$as_me: HTTP3 support is experimental" >&6;}
+          curl_h3_msg="enabled (quiche)"
+          QUICHE_ENABLED=1
+
+$as_echo "#define USE_QUICHE 1" >>confdefs.h
+
+          USE_QUICHE=1
+
+          CURL_LIBRARY_PATH="$CURL_LIBRARY_PATH:$DIR_QUICHE"
+          export CURL_LIBRARY_PATH
+          { $as_echo "$as_me:${as_lineno-$LINENO}: Added $DIR_QUICHE to CURL_LIBRARY_PATH" >&5
+$as_echo "$as_me: Added $DIR_QUICHE to CURL_LIBRARY_PATH" >&6;}
+fi
+
+done
+
+
+else
+          LDFLAGS=$CLEANLDFLAGS
+        CPPFLAGS=$CLEANCPPFLAGS
+        LIBS=$CLEANLIBS
+
+fi
+
+  else
+        if test X"$want_quiche" != Xdefault; then
+                  as_fn_error $? "--with-quiche was specified but could not find quiche pkg-config file." "$LINENO" 5
+    fi
+  fi
+fi
+
+
 OPT_ZSH_FPATH=default
 
 # Check whether --with-zsh-functions-dir was given.
@@ -27959,6 +28799,157 @@ case "$OPT_ZSH_FPATH" in
 esac
 
 
+OPT_FISH_FPATH=default
+
+# Check whether --with-fish-functions-dir was given.
+if test "${with_fish_functions_dir+set}" = set; then :
+  withval=$with_fish_functions_dir; OPT_FISH_FPATH=$withval
+fi
+
+case "$OPT_FISH_FPATH" in
+  no)
+        ;;
+  default|yes)
+
+    if test -n "$PKG_CONFIG"; then
+      PKGCONFIG="$PKG_CONFIG"
+    else
+      if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args.
+set dummy ${ac_tool_prefix}pkg-config; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_PKGCONFIG+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $PKGCONFIG in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_PKGCONFIG="$PKGCONFIG" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+as_dummy="$PATH:/usr/bin:/usr/local/bin"
+for as_dir in $as_dummy
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_path_PKGCONFIG="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+  ;;
+esac
+fi
+PKGCONFIG=$ac_cv_path_PKGCONFIG
+if test -n "$PKGCONFIG"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKGCONFIG" >&5
+$as_echo "$PKGCONFIG" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_path_PKGCONFIG"; then
+  ac_pt_PKGCONFIG=$PKGCONFIG
+  # Extract the first word of "pkg-config", so it can be a program name with args.
+set dummy pkg-config; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_ac_pt_PKGCONFIG+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $ac_pt_PKGCONFIG in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_ac_pt_PKGCONFIG="$ac_pt_PKGCONFIG" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+as_dummy="$PATH:/usr/bin:/usr/local/bin"
+for as_dir in $as_dummy
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_path_ac_pt_PKGCONFIG="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+  ;;
+esac
+fi
+ac_pt_PKGCONFIG=$ac_cv_path_ac_pt_PKGCONFIG
+if test -n "$ac_pt_PKGCONFIG"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKGCONFIG" >&5
+$as_echo "$ac_pt_PKGCONFIG" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_pt_PKGCONFIG" = x; then
+    PKGCONFIG="no"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    PKGCONFIG=$ac_pt_PKGCONFIG
+  fi
+else
+  PKGCONFIG="$ac_cv_path_PKGCONFIG"
+fi
+
+    fi
+
+    if test "x$PKGCONFIG" != "xno"; then
+      { $as_echo "$as_me:${as_lineno-$LINENO}: checking for fish options with pkg-config" >&5
+$as_echo_n "checking for fish options with pkg-config... " >&6; }
+            itexists=`
+    if test -n ""; then
+      PKG_CONFIG_LIBDIR=""
+      export PKG_CONFIG_LIBDIR
+    fi
+         $PKGCONFIG --exists fish >/dev/null 2>&1 && echo 1`
+
+      if test -z "$itexists"; then
+                        PKGCONFIG="no"
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+      else
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: found" >&5
+$as_echo "found" >&6; }
+      fi
+    fi
+
+    if test "$PKGCONFIG" != "no" ; then
+      FISH_FUNCTIONS_DIR="$($PKGCONFIG --variable completionsdir fish)"
+    else
+      FISH_FUNCTIONS_DIR="$datarootdir/fish/vendor_completions.d"
+    fi
+
+    ;;
+  *)
+        FISH_FUNCTIONS_DIR="$withval"
+
+    ;;
+esac
+
+
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5
 $as_echo_n "checking for ANSI C header files... " >&6; }
 if ${ac_cv_header_stdc+:} false; then :
@@ -28327,6 +29318,7 @@ fi
 done
 
 
+
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming const" >&5
 $as_echo_n "checking for an ANSI C-conforming const... " >&6; }
 if ${ac_cv_c_const+:} false; then :
@@ -29509,6 +30501,11 @@ $as_echo_n "checking for select... " >&6; }
 #endif
 #endif
 #ifndef HAVE_WINDOWS_H
+#ifdef HAVE_PROTO_BSDSOCKET_H
+#include <proto/bsdsocket.h>
+struct Library *SocketBase = NULL;
+#define select(a,b,c,d,e) WaitSelect(a,b,c,d,e,0)
+#endif
 #ifdef HAVE_SYS_SELECT_H
 #include <sys/select.h>
 #endif
@@ -29589,6 +30586,11 @@ else
 #endif
 #endif
 #ifndef HAVE_WINDOWS_H
+#ifdef HAVE_PROTO_BSDSOCKET_H
+#include <proto/bsdsocket.h>
+struct Library *SocketBase = NULL;
+#define select(a,b,c,d,e) WaitSelect(a,b,c,d,e,0)
+#endif
 #ifdef HAVE_SYS_SELECT_H
 #include <sys/select.h>
 #endif
@@ -29603,15 +30605,14 @@ else
                       long tv_usec;
                     };
 #endif
+#ifndef HAVE_PROTO_BSDSOCKET_H
                     extern $sel_retv SELECTCALLCONV
-#ifdef __ANDROID__
-__attribute__((overloadable))
-#endif
-                       select($sel_arg1,
+                               select($sel_arg1,
                                        $sel_arg234,
                                        $sel_arg234,
                                        $sel_arg234,
                                        $sel_arg5);
+#endif
 
 int main (void)
 {
@@ -29756,6 +30757,10 @@ $as_echo_n "checking for recv... " >&6; }
 #endif
 #endif
 #else
+#ifdef HAVE_PROTO_BSDSOCKET_H
+#include <proto/bsdsocket.h>
+struct Library *SocketBase = NULL;
+#endif
 #ifdef HAVE_SYS_TYPES_H
 #include <sys/types.h>
 #endif
@@ -29823,6 +30828,10 @@ else
 #endif
 #define RECVCALLCONV PASCAL
 #else
+#ifdef HAVE_PROTO_BSDSOCKET_H
+#include <proto/bsdsocket.h>
+struct Library *SocketBase = NULL;
+#endif
 #ifdef HAVE_SYS_TYPES_H
 #include <sys/types.h>
 #endif
@@ -29831,11 +30840,10 @@ else
 #endif
 #define RECVCALLCONV
 #endif
+#ifndef HAVE_PROTO_BSDSOCKET_H
                       extern $recv_retv RECVCALLCONV
-#ifdef __ANDROID__
-__attribute__((overloadable))
-#endif
                       recv($recv_arg1, $recv_arg2, $recv_arg3, $recv_arg4);
+#endif
 
 int main (void)
 {
@@ -29947,6 +30955,10 @@ $as_echo_n "checking for send... " >&6; }
 #endif
 #endif
 #else
+#ifdef HAVE_PROTO_BSDSOCKET_H
+#include <proto/bsdsocket.h>
+struct Library *SocketBase = NULL;
+#endif
 #ifdef HAVE_SYS_TYPES_H
 #include <sys/types.h>
 #endif
@@ -30014,6 +31026,10 @@ else
 #endif
 #define SENDCALLCONV PASCAL
 #else
+#ifdef HAVE_PROTO_BSDSOCKET_H
+#include <proto/bsdsocket.h>
+struct Library *SocketBase = NULL;
+#endif
 #ifdef HAVE_SYS_TYPES_H
 #include <sys/types.h>
 #endif
@@ -30022,11 +31038,10 @@ else
 #endif
 #define SENDCALLCONV
 #endif
+#ifndef HAVE_PROTO_BSDSOCKET_H
                       extern $send_retv SENDCALLCONV
-#ifdef __ANDROID__
-__attribute__((overloadable))
-#endif
                       send($send_arg1, $send_arg2, $send_arg3, $send_arg4);
+#endif
 
 int main (void)
 {
@@ -30177,6 +31192,10 @@ else
 #endif
 #endif
 #else
+#ifdef HAVE_PROTO_BSDSOCKET_H
+#include <proto/bsdsocket.h>
+struct Library *SocketBase = NULL;
+#endif
 #ifdef HAVE_SYS_TYPES_H
 #include <sys/types.h>
 #endif
@@ -30639,6 +31658,7 @@ $as_echo_n "checking if closesocket can be linked... " >&6; }
 
 
       $curl_includes_winsock2
+      $curl_includes_bsdsocket
       $curl_includes_socket
 
 int main (void)
@@ -30675,6 +31695,7 @@ $as_echo_n "checking if closesocket is prototyped... " >&6; }
 /* end confdefs.h.  */
 
       $curl_includes_winsock2
+      $curl_includes_bsdsocket
       $curl_includes_socket
 
 _ACEOF
@@ -30704,6 +31725,7 @@ $as_echo_n "checking if closesocket is compilable... " >&6; }
 
 
         $curl_includes_winsock2
+      $curl_includes_bsdsocket
         $curl_includes_socket
 
 int main (void)
@@ -30945,6 +31967,7 @@ $as_echo_n "checking if connect can be linked... " >&6; }
 
 
       $curl_includes_winsock2
+      $curl_includes_bsdsocket
       $curl_includes_sys_socket
       $curl_includes_socket
 
@@ -30982,6 +32005,7 @@ $as_echo_n "checking if connect is prototyped... " >&6; }
 /* end confdefs.h.  */
 
       $curl_includes_winsock2
+      $curl_includes_bsdsocket
       $curl_includes_sys_socket
       $curl_includes_socket
 
@@ -31012,6 +32036,7 @@ $as_echo_n "checking if connect is compilable... " >&6; }
 
 
         $curl_includes_winsock2
+      $curl_includes_bsdsocket
         $curl_includes_sys_socket
         $curl_includes_socket
 
@@ -31334,180 +32359,6 @@ $as_echo "no" >&6; }
   fi
 
 
-curl_includes_stdio="\
-/* includes start */
-#ifdef HAVE_SYS_TYPES_H
-#  include <sys/types.h>
-#endif
-#ifdef HAVE_STDIO_H
-#  include <stdio.h>
-#endif
-/* includes end */"
-  for ac_header in sys/types.h stdio.h
-do :
-  as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
-ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$curl_includes_stdio
-"
-if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
-  cat >>confdefs.h <<_ACEOF
-#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
-_ACEOF
-
-fi
-
-done
-
-
-
-    #
-  tst_links_fdopen="unknown"
-  tst_proto_fdopen="unknown"
-  tst_compi_fdopen="unknown"
-  tst_allow_fdopen="unknown"
-  #
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if fdopen can be linked" >&5
-$as_echo_n "checking if fdopen can be linked... " >&6; }
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-
-#define fdopen innocuous_fdopen
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
-#undef fdopen
-#ifdef __cplusplus
-extern "C"
-#endif
-char fdopen ();
-#if defined __stub_fdopen || defined __stub___fdopen
-choke me
-#endif
-
-int main (void)
-{
-return fdopen ();
- ;
- return 0;
-}
-
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-
-    { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-    tst_links_fdopen="yes"
-
-else
-
-    { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-    tst_links_fdopen="no"
-
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-  #
-  if test "$tst_links_fdopen" = "yes"; then
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking if fdopen is prototyped" >&5
-$as_echo_n "checking if fdopen is prototyped... " >&6; }
-    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-      $curl_includes_stdio
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  $EGREP "fdopen" >/dev/null 2>&1; then :
-
-      { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-      tst_proto_fdopen="yes"
-
-else
-
-      { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-      tst_proto_fdopen="no"
-
-fi
-rm -f conftest*
-
-  fi
-  #
-  if test "$tst_proto_fdopen" = "yes"; then
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking if fdopen is compilable" >&5
-$as_echo_n "checking if fdopen is compilable... " >&6; }
-    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-
-        $curl_includes_stdio
-
-int main (void)
-{
-
-        if(0 != fdopen(0, 0))
-          return 1;
-
- ;
- return 0;
-}
-
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-
-      { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-      tst_compi_fdopen="yes"
-
-else
-
-      { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-      tst_compi_fdopen="no"
-
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-  fi
-  #
-  if test "$tst_compi_fdopen" = "yes"; then
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking if fdopen usage allowed" >&5
-$as_echo_n "checking if fdopen usage allowed... " >&6; }
-    if test "x$curl_disallow_fdopen" != "xyes"; then
-      { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-      tst_allow_fdopen="yes"
-    else
-      { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-      tst_allow_fdopen="no"
-    fi
-  fi
-  #
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if fdopen might be used" >&5
-$as_echo_n "checking if fdopen might be used... " >&6; }
-  if test "$tst_links_fdopen" = "yes" &&
-     test "$tst_proto_fdopen" = "yes" &&
-     test "$tst_compi_fdopen" = "yes" &&
-     test "$tst_allow_fdopen" = "yes"; then
-    { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-
-cat >>confdefs.h <<_ACEOF
-#define HAVE_FDOPEN 1
-_ACEOF
-
-    curl_cv_func_fdopen="yes"
-  else
-    { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-    curl_cv_func_fdopen="no"
-  fi
-
-
 curl_includes_ws2tcpip="\
 /* includes start */
 #ifdef HAVE_WINDOWS_H
@@ -32854,6 +33705,7 @@ $as_echo_n "checking if gai_strerror can be linked... " >&6; }
 
 
       $curl_includes_winsock2
+      $curl_includes_bsdsocket
       $curl_includes_netdb
 
 int main (void)
@@ -32890,6 +33742,7 @@ $as_echo_n "checking if gai_strerror is prototyped... " >&6; }
 /* end confdefs.h.  */
 
       $curl_includes_winsock2
+      $curl_includes_bsdsocket
       $curl_includes_netdb
 
 _ACEOF
@@ -32919,6 +33772,7 @@ $as_echo_n "checking if gai_strerror is compilable... " >&6; }
 
 
         $curl_includes_winsock2
+      $curl_includes_bsdsocket
         $curl_includes_netdb
 
 int main (void)
@@ -32996,6 +33850,7 @@ $as_echo_n "checking if gethostbyaddr can be linked... " >&6; }
 
 
       $curl_includes_winsock2
+      $curl_includes_bsdsocket
       $curl_includes_netdb
 
 int main (void)
@@ -33032,6 +33887,7 @@ $as_echo_n "checking if gethostbyaddr is prototyped... " >&6; }
 /* end confdefs.h.  */
 
       $curl_includes_winsock2
+      $curl_includes_bsdsocket
       $curl_includes_netdb
 
 _ACEOF
@@ -33061,6 +33917,7 @@ $as_echo_n "checking if gethostbyaddr is compilable... " >&6; }
 
 
         $curl_includes_winsock2
+      $curl_includes_bsdsocket
         $curl_includes_netdb
 
 int main (void)
@@ -33387,6 +34244,7 @@ $as_echo_n "checking if gethostbyname can be linked... " >&6; }
 
 
       $curl_includes_winsock2
+      $curl_includes_bsdsocket
       $curl_includes_netdb
 
 int main (void)
@@ -33423,6 +34281,7 @@ $as_echo_n "checking if gethostbyname is prototyped... " >&6; }
 /* end confdefs.h.  */
 
       $curl_includes_winsock2
+      $curl_includes_bsdsocket
       $curl_includes_netdb
 
 _ACEOF
@@ -33452,6 +34311,7 @@ $as_echo_n "checking if gethostbyname is compilable... " >&6; }
 
 
         $curl_includes_winsock2
+      $curl_includes_bsdsocket
         $curl_includes_netdb
 
 int main (void)
@@ -33775,7 +34635,7 @@ curl_preprocess_callconv="\
 /* preprocess end */"
 
 
-        #
+          #
   tst_links_gethostname="unknown"
   tst_proto_gethostname="unknown"
   tst_compi_gethostname="unknown"
@@ -33788,6 +34648,7 @@ $as_echo_n "checking if gethostname can be linked... " >&6; }
 
 
       $curl_includes_winsock2
+      $curl_includes_bsdsocket
       $curl_includes_unistd
 
 int main (void)
@@ -33824,6 +34685,7 @@ $as_echo_n "checking if gethostname is prototyped... " >&6; }
 /* end confdefs.h.  */
 
       $curl_includes_winsock2
+      $curl_includes_bsdsocket
       $curl_includes_unistd
 
 _ACEOF
@@ -33853,6 +34715,7 @@ $as_echo_n "checking if gethostname is compilable... " >&6; }
 
 
         $curl_includes_winsock2
+      $curl_includes_bsdsocket
         $curl_includes_unistd
 
 int main (void)
@@ -33894,6 +34757,7 @@ $as_echo_n "checking for gethostname arg 2 data type... " >&6; }
 
 
               $curl_includes_winsock2
+      $curl_includes_bsdsocket
               $curl_includes_unistd
               $curl_preprocess_callconv
               extern int FUNCALLCONV gethostname($tst_arg1, $tst_arg2);
@@ -33964,6 +34828,460 @@ $as_echo "no" >&6; }
   fi
 
 
+          #
+  tst_links_getpeername="unknown"
+  tst_proto_getpeername="unknown"
+  tst_compi_getpeername="unknown"
+  tst_allow_getpeername="unknown"
+  #
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if getpeername can be linked" >&5
+$as_echo_n "checking if getpeername can be linked... " >&6; }
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+
+      $curl_includes_winsock2
+      $curl_includes_bsdsocket
+      $curl_includes_sys_socket
+
+int main (void)
+{
+
+      if(0 != getpeername(0, (void *)0, (void *)0))
+        return 1;
+
+ ;
+ return 0;
+}
+
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+    tst_links_getpeername="yes"
+
+else
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+    tst_links_getpeername="no"
+
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+  #
+  if test "$tst_links_getpeername" = "yes"; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking if getpeername is prototyped" >&5
+$as_echo_n "checking if getpeername is prototyped... " >&6; }
+    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+      $curl_includes_winsock2
+      $curl_includes_bsdsocket
+      $curl_includes_sys_socket
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "getpeername" >/dev/null 2>&1; then :
+
+      { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+      tst_proto_getpeername="yes"
+
+else
+
+      { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+      tst_proto_getpeername="no"
+
+fi
+rm -f conftest*
+
+  fi
+  #
+  if test "$tst_proto_getpeername" = "yes"; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking if getpeername is compilable" >&5
+$as_echo_n "checking if getpeername is compilable... " >&6; }
+    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+
+        $curl_includes_winsock2
+        $curl_includes_bsdsocket
+        $curl_includes_sys_socket
+
+int main (void)
+{
+
+        if(0 != getpeername(0, (void *)0, (void *)0))
+          return 1;
+
+ ;
+ return 0;
+}
+
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+
+      { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+      tst_compi_getpeername="yes"
+
+else
+
+      { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+      tst_compi_getpeername="no"
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  fi
+  #
+  if test "$tst_compi_getpeername" = "yes"; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking if getpeername usage allowed" >&5
+$as_echo_n "checking if getpeername usage allowed... " >&6; }
+    if test "x$curl_disallow_getpeername" != "xyes"; then
+      { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+      tst_allow_getpeername="yes"
+    else
+      { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+      tst_allow_getpeername="no"
+    fi
+  fi
+  #
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if getpeername might be used" >&5
+$as_echo_n "checking if getpeername might be used... " >&6; }
+  if test "$tst_links_getpeername" = "yes" &&
+     test "$tst_proto_getpeername" = "yes" &&
+     test "$tst_compi_getpeername" = "yes" &&
+     test "$tst_allow_getpeername" = "yes"; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_GETPEERNAME 1
+_ACEOF
+
+    curl_cv_func_getpeername="yes"
+  else
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+    curl_cv_func_getpeername="no"
+  fi
+
+
+          #
+  tst_links_getsockname="unknown"
+  tst_proto_getsockname="unknown"
+  tst_compi_getsockname="unknown"
+  tst_allow_getsockname="unknown"
+  #
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if getsockname can be linked" >&5
+$as_echo_n "checking if getsockname can be linked... " >&6; }
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+
+      $curl_includes_winsock2
+      $curl_includes_bsdsocket
+      $curl_includes_sys_socket
+
+int main (void)
+{
+
+      if(0 != getsockname(0, (void *)0, (void *)0))
+        return 1;
+
+ ;
+ return 0;
+}
+
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+    tst_links_getsockname="yes"
+
+else
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+    tst_links_getsockname="no"
+
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+  #
+  if test "$tst_links_getsockname" = "yes"; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking if getsockname is prototyped" >&5
+$as_echo_n "checking if getsockname is prototyped... " >&6; }
+    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+      $curl_includes_winsock2
+      $curl_includes_bsdsocket
+      $curl_includes_sys_socket
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "getsockname" >/dev/null 2>&1; then :
+
+      { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+      tst_proto_getsockname="yes"
+
+else
+
+      { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+      tst_proto_getsockname="no"
+
+fi
+rm -f conftest*
+
+  fi
+  #
+  if test "$tst_proto_getsockname" = "yes"; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking if getsockname is compilable" >&5
+$as_echo_n "checking if getsockname is compilable... " >&6; }
+    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+
+        $curl_includes_winsock2
+        $curl_includes_bsdsocket
+        $curl_includes_sys_socket
+
+int main (void)
+{
+
+        if(0 != getsockname(0, (void *)0, (void *)0))
+          return 1;
+
+ ;
+ return 0;
+}
+
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+
+      { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+      tst_compi_getsockname="yes"
+
+else
+
+      { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+      tst_compi_getsockname="no"
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  fi
+  #
+  if test "$tst_compi_getsockname" = "yes"; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking if getsockname usage allowed" >&5
+$as_echo_n "checking if getsockname usage allowed... " >&6; }
+    if test "x$curl_disallow_getsockname" != "xyes"; then
+      { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+      tst_allow_getsockname="yes"
+    else
+      { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+      tst_allow_getsockname="no"
+    fi
+  fi
+  #
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if getsockname might be used" >&5
+$as_echo_n "checking if getsockname might be used... " >&6; }
+  if test "$tst_links_getsockname" = "yes" &&
+     test "$tst_proto_getsockname" = "yes" &&
+     test "$tst_compi_getsockname" = "yes" &&
+     test "$tst_allow_getsockname" = "yes"; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_GETSOCKNAME 1
+_ACEOF
+
+    curl_cv_func_getsockname="yes"
+  else
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+    curl_cv_func_getsockname="no"
+  fi
+
+
+curl_includes_netif="\
+/* includes start */
+#ifdef HAVE_NET_IF_H
+#  include <net/if.h>
+#endif
+/* includes end */"
+  for ac_header in net/if.h
+do :
+  ac_fn_c_check_header_compile "$LINENO" "net/if.h" "ac_cv_header_net_if_h" "$curl_includes_netif
+"
+if test "x$ac_cv_header_net_if_h" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_NET_IF_H 1
+_ACEOF
+
+fi
+
+done
+
+
+
+        #
+  tst_links_if_nametoindex="unknown"
+  tst_proto_if_nametoindex="unknown"
+  tst_compi_if_nametoindex="unknown"
+  tst_allow_if_nametoindex="unknown"
+  #
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if if_nametoindex can be linked" >&5
+$as_echo_n "checking if if_nametoindex can be linked... " >&6; }
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+
+      $curl_includes_winsock2
+      $curl_includes_bsdsocket
+      #include <net/if.h>
+
+int main (void)
+{
+
+      if(0 != if_nametoindex(""))
+        return 1;
+
+ ;
+ return 0;
+}
+
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+    tst_links_if_nametoindex="yes"
+
+else
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+    tst_links_if_nametoindex="no"
+
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+  #
+  if test "$tst_links_if_nametoindex" = "yes"; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking if if_nametoindex is prototyped" >&5
+$as_echo_n "checking if if_nametoindex is prototyped... " >&6; }
+    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+      $curl_includes_winsock2
+      $curl_includes_netif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "if_nametoindex" >/dev/null 2>&1; then :
+
+      { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+      tst_proto_if_nametoindex="yes"
+
+else
+
+      { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+      tst_proto_if_nametoindex="no"
+
+fi
+rm -f conftest*
+
+  fi
+  #
+  if test "$tst_proto_if_nametoindex" = "yes"; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking if if_nametoindex is compilable" >&5
+$as_echo_n "checking if if_nametoindex is compilable... " >&6; }
+    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+
+        $curl_includes_winsock2
+        $curl_includes_netif
+
+int main (void)
+{
+
+        if(0 != if_nametoindex(""))
+          return 1;
+
+ ;
+ return 0;
+}
+
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+
+      { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+      tst_compi_if_nametoindex="yes"
+
+else
+
+      { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+      tst_compi_if_nametoindex="no"
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  fi
+  #
+  if test "$tst_compi_if_nametoindex" = "yes"; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking if if_nametoindex usage allowed" >&5
+$as_echo_n "checking if if_nametoindex usage allowed... " >&6; }
+    if test "x$curl_disallow_if_nametoindex" != "xyes"; then
+      { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+      tst_allow_if_nametoindex="yes"
+    else
+      { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+      tst_allow_if_nametoindex="no"
+    fi
+  fi
+  #
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if if_nametoindex might be used" >&5
+$as_echo_n "checking if if_nametoindex might be used... " >&6; }
+  if test "$tst_links_if_nametoindex" = "yes" &&
+     test "$tst_proto_if_nametoindex" = "yes" &&
+     test "$tst_compi_if_nametoindex" = "yes" &&
+     test "$tst_allow_if_nametoindex" = "yes"; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_IF_NAMETOINDEX 1
+_ACEOF
+
+    curl_cv_func_if_nametoindex="yes"
+  else
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+    curl_cv_func_if_nametoindex="no"
+  fi
+
+
       #
   tst_links_getifaddrs="unknown"
   tst_proto_getifaddrs="unknown"
@@ -35752,6 +37070,7 @@ $as_echo_n "checking if ioctlsocket can be linked... " >&6; }
 
 
       $curl_includes_winsock2
+      $curl_includes_bsdsocket
 
 int main (void)
 {
@@ -35787,6 +37106,7 @@ $as_echo_n "checking if ioctlsocket is prototyped... " >&6; }
 /* end confdefs.h.  */
 
       $curl_includes_winsock2
+      $curl_includes_bsdsocket
 
 _ACEOF
 if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
@@ -35815,6 +37135,7 @@ $as_echo_n "checking if ioctlsocket is compilable... " >&6; }
 
 
         $curl_includes_winsock2
+      $curl_includes_bsdsocket
 
 int main (void)
 {
@@ -35884,6 +37205,7 @@ $as_echo_n "checking if ioctlsocket FIONBIO is compilable... " >&6; }
 
 
         $curl_includes_winsock2
+      $curl_includes_bsdsocket
 
 int main (void)
 {
@@ -36810,6 +38132,7 @@ $as_echo_n "checking if setsockopt can be linked... " >&6; }
 
 
       $curl_includes_winsock2
+      $curl_includes_bsdsocket
       $curl_includes_sys_socket
 
 int main (void)
@@ -36846,6 +38169,7 @@ $as_echo_n "checking if setsockopt is prototyped... " >&6; }
 /* end confdefs.h.  */
 
       $curl_includes_winsock2
+      $curl_includes_bsdsocket
       $curl_includes_sys_socket
 
 _ACEOF
@@ -36875,6 +38199,7 @@ $as_echo_n "checking if setsockopt is compilable... " >&6; }
 
 
         $curl_includes_winsock2
+      $curl_includes_bsdsocket
         $curl_includes_sys_socket
 
 int main (void)
@@ -36945,6 +38270,7 @@ $as_echo_n "checking if setsockopt SO_NONBLOCK is compilable... " >&6; }
 
 
         $curl_includes_winsock2
+      $curl_includes_bsdsocket
         $curl_includes_sys_socket
 
 int main (void)
@@ -37713,6 +39039,7 @@ $as_echo_n "checking if socket can be linked... " >&6; }
 
 
       $curl_includes_winsock2
+      $curl_includes_bsdsocket
       $curl_includes_sys_socket
       $curl_includes_socket
 
@@ -37750,6 +39077,7 @@ $as_echo_n "checking if socket is prototyped... " >&6; }
 /* end confdefs.h.  */
 
       $curl_includes_winsock2
+      $curl_includes_bsdsocket
       $curl_includes_sys_socket
       $curl_includes_socket
 
@@ -37780,6 +39108,7 @@ $as_echo_n "checking if socket is compilable... " >&6; }
 
 
         $curl_includes_winsock2
+      $curl_includes_bsdsocket
         $curl_includes_sys_socket
         $curl_includes_socket
 
@@ -40128,6 +41457,7 @@ for ac_func in fnmatch \
   setlocale \
   setmode \
   setrlimit \
+  usleep \
   utime \
   utimes
 
 done
 
 
-if test "$ipv6" = "yes"; then
-  if test "$curl_cv_func_getaddrinfo" = "yes"; then
-
-$as_echo "#define ENABLE_IPV6 1" >>confdefs.h
-
-    IPV6_ENABLED=1
-
-  fi
-fi
-
 
             #
   tst_method="unknown"
@@ -41082,9 +42402,6 @@ if test "${enable_tls_srp+set}" = set; then :
   no)
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
 $as_echo "no" >&6; }
-
-$as_echo "#define CURL_DISABLE_TLS_SRP 1" >>confdefs.h
-
        want_tls_srp=no
        ;;
   *)   { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
@@ -41155,8 +42472,8 @@ fi
 
 fi
 
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable support for cookies" >&5
-$as_echo_n "checking whether to enable support for cookies... " >&6; }
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to support cookies" >&5
+$as_echo_n "checking whether to support cookies... " >&6; }
 # Check whether --enable-cookies was given.
 if test "${enable_cookies+set}" = set; then :
   enableval=$enable_cookies;  case "$enableval" in
@@ -41178,6 +42495,232 @@ $as_echo "yes" >&6; }
 fi
 
 
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to support HTTP authentication" >&5
+$as_echo_n "checking whether to support HTTP authentication... " >&6; }
+# Check whether --enable-http-auth was given.
+if test "${enable_http_auth+set}" = set; then :
+  enableval=$enable_http_auth;  case "$enableval" in
+  no)
+       { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+$as_echo "#define CURL_DISABLE_HTTP_AUTH 1" >>confdefs.h
+
+       ;;
+  *)   { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+       ;;
+  esac
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+
+fi
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to support DoH" >&5
+$as_echo_n "checking whether to support DoH... " >&6; }
+# Check whether --enable-doh was given.
+if test "${enable_doh+set}" = set; then :
+  enableval=$enable_doh;  case "$enableval" in
+  no)
+       { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+$as_echo "#define CURL_DISABLE_DOH 1" >>confdefs.h
+
+       ;;
+  *)   { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+       ;;
+  esac
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+
+fi
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to support the MIME API" >&5
+$as_echo_n "checking whether to support the MIME API... " >&6; }
+# Check whether --enable-mime was given.
+if test "${enable_mime+set}" = set; then :
+  enableval=$enable_mime;  case "$enableval" in
+  no)
+       { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+$as_echo "#define CURL_DISABLE_MIME 1" >>confdefs.h
+
+       ;;
+  *)   { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+       ;;
+  esac
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+
+fi
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to support date parsing" >&5
+$as_echo_n "checking whether to support date parsing... " >&6; }
+# Check whether --enable-dateparse was given.
+if test "${enable_dateparse+set}" = set; then :
+  enableval=$enable_dateparse;  case "$enableval" in
+  no)
+       { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+$as_echo "#define CURL_DISABLE_PARSEDATE 1" >>confdefs.h
+
+       ;;
+  *)   { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+       ;;
+  esac
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+
+fi
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to support netrc parsing" >&5
+$as_echo_n "checking whether to support netrc parsing... " >&6; }
+# Check whether --enable-netrc was given.
+if test "${enable_netrc+set}" = set; then :
+  enableval=$enable_netrc;  case "$enableval" in
+  no)
+       { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+$as_echo "#define CURL_DISABLE_NETRC 1" >>confdefs.h
+
+       ;;
+  *)   { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+       ;;
+  esac
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+
+fi
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to support progress-meter" >&5
+$as_echo_n "checking whether to support progress-meter... " >&6; }
+# Check whether --enable-progress-meter was given.
+if test "${enable_progress_meter+set}" = set; then :
+  enableval=$enable_progress_meter;  case "$enableval" in
+  no)
+       { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+$as_echo "#define CURL_DISABLE_PROGRESS_METER 1" >>confdefs.h
+
+       ;;
+  *)   { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+       ;;
+  esac
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+
+fi
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to support DNS shuffling" >&5
+$as_echo_n "checking whether to support DNS shuffling... " >&6; }
+# Check whether --enable-dnsshuffle was given.
+if test "${enable_dnsshuffle+set}" = set; then :
+  enableval=$enable_dnsshuffle;  case "$enableval" in
+  no)
+       { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+$as_echo "#define CURL_DISABLE_SHUFFLE_DNS 1" >>confdefs.h
+
+       ;;
+  *)   { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+       ;;
+  esac
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+
+fi
+
+
+curl_altsvc_msg="no      (--enable-alt-svc)";
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to support alt-svc" >&5
+$as_echo_n "checking whether to support alt-svc... " >&6; }
+# Check whether --enable-alt-svc was given.
+if test "${enable_alt_svc+set}" = set; then :
+  enableval=$enable_alt_svc;  case "$enableval" in
+  no)
+       { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+       ;;
+  *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+       curl_altsvc_msg="enabled";
+       enable_altsvc="yes"
+       ;;
+  esac
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+fi
+
+
+if test "$enable_altsvc" = "yes"; then
+
+$as_echo "#define USE_ALTSVC 1" >>confdefs.h
+
+  experimental="$experimental alt-svc"
+fi
+
+if test "x$want_esni" != "xno"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ESNI support is available" >&5
+$as_echo_n "checking whether ESNI support is available... " >&6; }
+
+    ESNI_ENABLED=0
+  ESNI_SUPPORT=''
+
+      if test "x$OPENSSL_ENABLED" = "x1"; then
+    for ac_func in SSL_get_esni_status
+do :
+  ac_fn_c_check_func "$LINENO" "SSL_get_esni_status" "ac_cv_func_SSL_get_esni_status"
+if test "x$ac_cv_func_SSL_get_esni_status" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_SSL_GET_ESNI_STATUS 1
+_ACEOF
+ ESNI_SUPPORT="ESNI support available (OpenSSL with SSL_get_esni_status)"
+      ESNI_ENABLED=1
+fi
+done
+
+
+    fi
+
+    if test "x$ESNI_ENABLED" = "x1"; then
+
+$as_echo "#define USE_ESNI 1" >>confdefs.h
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ESNI_SUPPORT" >&5
+$as_echo "$ESNI_SUPPORT" >&6; }
+    experimental="$experimental ESNI"
+  else
+    as_fn_error $? "--enable-esni ignored: No ESNI support found" "$LINENO" 5
+  fi
+fi
+
 
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether hiding of library internal symbols will actually happen" >&5
 $as_echo_n "checking whether hiding of library internal symbols will actually happen... " >&6; }
@@ -41268,10 +42811,14 @@ if test "x$HAVE_GSSAPI" = "x1"; then
   SUPPORT_FEATURES="$SUPPORT_FEATURES GSS-API"
 fi
 
-if test "x$curl_psl_msg" = "xyes"; then
+if test "x$curl_psl_msg" = "xenabled"; then
   SUPPORT_FEATURES="$SUPPORT_FEATURES PSL"
 fi
 
+if test "x$enable_altsvc" = "xyes"; then
+  SUPPORT_FEATURES="$SUPPORT_FEATURES alt-svc"
+fi
+
 if test "x$CURL_DISABLE_CRYPTO_AUTH" != "x1" -a \
     \( "x$HAVE_GSSAPI" = "x1" -o "x$USE_WINDOWS_SSPI" = "x1" \); then
   SUPPORT_FEATURES="$SUPPORT_FEATURES SPNEGO"
@@ -41285,7 +42832,7 @@ fi
 if test "x$CURL_DISABLE_CRYPTO_AUTH" != "x1"; then
   if test "x$OPENSSL_ENABLED" = "x1" -o "x$USE_WINDOWS_SSPI" = "x1" \
       -o "x$GNUTLS_ENABLED" = "x1" -o "x$MBEDTLS_ENABLED" = "x1" \
-      -o "x$NSS_ENABLED" = "x1" -o "x$DARWINSSL_ENABLED" = "x1"; then
+      -o "x$NSS_ENABLED" = "x1" -o "x$SECURETRANSPORT_ENABLED" = "x1"; then
     SUPPORT_FEATURES="$SUPPORT_FEATURES NTLM"
 
     if test "x$CURL_DISABLE_HTTP" != "x1" -a \
@@ -41303,6 +42850,10 @@ if test "x$USE_NGHTTP2" = "x1"; then
   SUPPORT_FEATURES="$SUPPORT_FEATURES HTTP2"
 fi
 
+if test "x$USE_NGTCP2" = "x1" -o "x$USE_QUICHE" = "x1"; then
+  SUPPORT_FEATURES="$SUPPORT_FEATURES HTTP3"
+fi
+
 if test "x$CURL_WITH_MULTI_SSL" = "x1"; then
   SUPPORT_FEATURES="$SUPPORT_FEATURES MultiSSL"
 fi
@@ -41312,6 +42863,10 @@ if test "x$OPENSSL_ENABLED" = "x1" -o "x$GNUTLS_ENABLED" = "x1" \
   SUPPORT_FEATURES="$SUPPORT_FEATURES HTTPS-proxy"
 fi
 
+if test "x$ESNI_ENABLED" = "x1"; then
+  SUPPORT_FEATURES="$SUPPORT_FEATURES ESNI"
+fi
+
 
 
 if test "x$CURL_DISABLE_HTTP" != "x1"; then
@@ -41366,7 +42921,7 @@ if test "x$CURL_DISABLE_SMB" != "x1" \
     -a "x$CURL_DISABLE_CRYPTO_AUTH" != "x1" \
     -a \( "x$OPENSSL_ENABLED" = "x1" -o "x$USE_WINDOWS_SSPI" = "x1" \
       -o "x$GNUTLS_ENABLED" = "x1" -o "x$MBEDTLS_ENABLED" = "x1" \
-      -o "x$NSS_ENABLED" = "x1" -o "x$DARWINSSL_ENABLED" = "x1" \); then
+      -o "x$NSS_ENABLED" = "x1" -o "x$SECURETRANSPORT_ENABLED" = "x1" \); then
   SUPPORT_PROTOCOLS="$SUPPORT_PROTOCOLS SMB"
   if test "x$SSL_ENABLED" = "x1"; then
     SUPPORT_PROTOCOLS="$SUPPORT_PROTOCOLS SMBS"
@@ -41587,7 +43142,7 @@ if test "x$want_curldebug_assumed" = "xyes" &&
   ac_configure_args="$ac_configure_args --enable-curldebug"
 fi
 
-ac_config_files="$ac_config_files Makefile docs/Makefile docs/examples/Makefile docs/libcurl/Makefile docs/libcurl/opts/Makefile docs/cmdline-opts/Makefile include/Makefile include/curl/Makefile src/Makefile lib/Makefile scripts/Makefile lib/libcurl.vers tests/Makefile tests/certs/Makefile tests/certs/scripts/Makefile tests/data/Makefile tests/server/Makefile tests/libtest/Makefile tests/unit/Makefile packages/Makefile packages/Win32/Makefile packages/Win32/cygwin/Makefile packages/Linux/Makefile packages/Linux/RPM/Makefile packages/Linux/RPM/curl.spec packages/Linux/RPM/curl-ssl.spec packages/Solaris/Makefile packages/vms/Makefile packages/AIX/Makefile packages/AIX/RPM/Makefile packages/AIX/RPM/curl.spec curl-config libcurl.pc"
+ac_config_files="$ac_config_files Makefile docs/Makefile docs/examples/Makefile docs/libcurl/Makefile docs/libcurl/opts/Makefile docs/cmdline-opts/Makefile include/Makefile include/curl/Makefile src/Makefile lib/Makefile scripts/Makefile lib/libcurl.vers tests/Makefile tests/certs/Makefile tests/certs/scripts/Makefile tests/data/Makefile tests/server/Makefile tests/libtest/Makefile tests/unit/Makefile packages/Makefile packages/vms/Makefile curl-config libcurl.pc"
 
 cat >confcache <<\_ACEOF
 # This file is a shell script that caches the results of configure
@@ -41702,10 +43257,6 @@ if test -z "${MAINTAINER_MODE_TRUE}" && test -z "${MAINTAINER_MODE_FALSE}"; then
   as_fn_error $? "conditional \"MAINTAINER_MODE\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
 fi
-if test -z "${CODE_COVERAGE_ENABLED_TRUE}" && test -z "${CODE_COVERAGE_ENABLED_FALSE}"; then
-  as_fn_error $? "conditional \"CODE_COVERAGE_ENABLED\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5
 $as_echo_n "checking that generated files are newer than configure... " >&6; }
    if test -n "$am_sleep_pid"; then
     "tests/libtest/Makefile") CONFIG_FILES="$CONFIG_FILES tests/libtest/Makefile" ;;
     "tests/unit/Makefile") CONFIG_FILES="$CONFIG_FILES tests/unit/Makefile" ;;
     "packages/Makefile") CONFIG_FILES="$CONFIG_FILES packages/Makefile" ;;
-    "packages/Win32/Makefile") CONFIG_FILES="$CONFIG_FILES packages/Win32/Makefile" ;;
-    "packages/Win32/cygwin/Makefile") CONFIG_FILES="$CONFIG_FILES packages/Win32/cygwin/Makefile" ;;
-    "packages/Linux/Makefile") CONFIG_FILES="$CONFIG_FILES packages/Linux/Makefile" ;;
-    "packages/Linux/RPM/Makefile") CONFIG_FILES="$CONFIG_FILES packages/Linux/RPM/Makefile" ;;
-    "packages/Linux/RPM/curl.spec") CONFIG_FILES="$CONFIG_FILES packages/Linux/RPM/curl.spec" ;;
-    "packages/Linux/RPM/curl-ssl.spec") CONFIG_FILES="$CONFIG_FILES packages/Linux/RPM/curl-ssl.spec" ;;
-    "packages/Solaris/Makefile") CONFIG_FILES="$CONFIG_FILES packages/Solaris/Makefile" ;;
     "packages/vms/Makefile") CONFIG_FILES="$CONFIG_FILES packages/vms/Makefile" ;;
-    "packages/AIX/Makefile") CONFIG_FILES="$CONFIG_FILES packages/AIX/Makefile" ;;
-    "packages/AIX/RPM/Makefile") CONFIG_FILES="$CONFIG_FILES packages/AIX/RPM/Makefile" ;;
-    "packages/AIX/RPM/curl.spec") CONFIG_FILES="$CONFIG_FILES packages/AIX/RPM/curl.spec" ;;
     "curl-config") CONFIG_FILES="$CONFIG_FILES curl-config" ;;
     "libcurl.pc") CONFIG_FILES="$CONFIG_FILES libcurl.pc" ;;
 
@@ -44260,67 +45801,92 @@ done
 
 { $as_echo "$as_me:${as_lineno-$LINENO}: Configured to build curl/libcurl:
 
-  curl version:     ${CURLVERSION}
   Host setup:       ${host}
   Install prefix:   ${prefix}
   Compiler:         ${CC}
-  SSL support:      ${curl_ssl_msg}
-  SSH support:      ${curl_ssh_msg}
-  zlib support:     ${curl_zlib_msg}
-  brotli support:   ${curl_brotli_msg}
-  GSS-API support:  ${curl_gss_msg}
-  TLS-SRP support:  ${curl_tls_srp_msg}
+   CFLAGS:          ${CFLAGS}
+   CPPFLAGS:        ${CPPFLAGS}
+   LDFLAGS:         ${LDFLAGS}
+   LIBS:            ${LIBS}
+
+  curl version:     ${CURLVERSION}
+  SSL:              ${curl_ssl_msg}
+  SSH:              ${curl_ssh_msg}
+  zlib:             ${curl_zlib_msg}
+  brotli:           ${curl_brotli_msg}
+  GSS-API:          ${curl_gss_msg}
+  TLS-SRP:          ${curl_tls_srp_msg}
   resolver:         ${curl_res_msg}
-  IPv6 support:     ${curl_ipv6_msg}
-  Unix sockets support: ${curl_unix_sockets_msg}
-  IDN support:      ${curl_idn_msg}
+  IPv6:             ${curl_ipv6_msg}
+  Unix sockets:     ${curl_unix_sockets_msg}
+  IDN:              ${curl_idn_msg}
   Build libcurl:    Shared=${enable_shared}, Static=${enable_static}
   Built-in manual:  ${curl_manual_msg}
   --libcurl option: ${curl_libcurl_msg}
   Verbose errors:   ${curl_verbose_msg}
-  SSPI support:     ${curl_sspi_msg}
+  Code coverage:    ${curl_coverage_msg}
+  SSPI:             ${curl_sspi_msg}
   ca cert bundle:   ${ca}${ca_warning}
   ca cert path:     ${capath}${capath_warning}
   ca fallback:      ${with_ca_fallback}
-  LDAP support:     ${curl_ldap_msg}
-  LDAPS support:    ${curl_ldaps_msg}
-  RTSP support:     ${curl_rtsp_msg}
-  RTMP support:     ${curl_rtmp_msg}
-  metalink support: ${curl_mtlnk_msg}
-  PSL support:      ${curl_psl_msg}
-  HTTP2 support:    ${curl_h2_msg}
+  LDAP:             ${curl_ldap_msg}
+  LDAPS:            ${curl_ldaps_msg}
+  RTSP:             ${curl_rtsp_msg}
+  RTMP:             ${curl_rtmp_msg}
+  Metalink:         ${curl_mtlnk_msg}
+  PSL:              ${curl_psl_msg}
+  Alt-svc:          ${curl_altsvc_msg}
+  HTTP2:            ${curl_h2_msg}
+  HTTP3:            ${curl_h3_msg}
+  ESNI:             ${curl_esni_msg}
   Protocols:        ${SUPPORT_PROTOCOLS}
+  Features:         ${SUPPORT_FEATURES}
 " >&5
 $as_echo "$as_me: Configured to build curl/libcurl:
 
-  curl version:     ${CURLVERSION}
   Host setup:       ${host}
   Install prefix:   ${prefix}
   Compiler:         ${CC}
-  SSL support:      ${curl_ssl_msg}
-  SSH support:      ${curl_ssh_msg}
-  zlib support:     ${curl_zlib_msg}
-  brotli support:   ${curl_brotli_msg}
-  GSS-API support:  ${curl_gss_msg}
-  TLS-SRP support:  ${curl_tls_srp_msg}
+   CFLAGS:          ${CFLAGS}
+   CPPFLAGS:        ${CPPFLAGS}
+   LDFLAGS:         ${LDFLAGS}
+   LIBS:            ${LIBS}
+
+  curl version:     ${CURLVERSION}
+  SSL:              ${curl_ssl_msg}
+  SSH:              ${curl_ssh_msg}
+  zlib:             ${curl_zlib_msg}
+  brotli:           ${curl_brotli_msg}
+  GSS-API:          ${curl_gss_msg}
+  TLS-SRP:          ${curl_tls_srp_msg}
   resolver:         ${curl_res_msg}
-  IPv6 support:     ${curl_ipv6_msg}
-  Unix sockets support: ${curl_unix_sockets_msg}
-  IDN support:      ${curl_idn_msg}
+  IPv6:             ${curl_ipv6_msg}
+  Unix sockets:     ${curl_unix_sockets_msg}
+  IDN:              ${curl_idn_msg}
   Build libcurl:    Shared=${enable_shared}, Static=${enable_static}
   Built-in manual:  ${curl_manual_msg}
   --libcurl option: ${curl_libcurl_msg}
   Verbose errors:   ${curl_verbose_msg}
-  SSPI support:     ${curl_sspi_msg}
+  Code coverage:    ${curl_coverage_msg}
+  SSPI:             ${curl_sspi_msg}
   ca cert bundle:   ${ca}${ca_warning}
   ca cert path:     ${capath}${capath_warning}
   ca fallback:      ${with_ca_fallback}
-  LDAP support:     ${curl_ldap_msg}
-  LDAPS support:    ${curl_ldaps_msg}
-  RTSP support:     ${curl_rtsp_msg}
-  RTMP support:     ${curl_rtmp_msg}
-  metalink support: ${curl_mtlnk_msg}
-  PSL support:      ${curl_psl_msg}
-  HTTP2 support:    ${curl_h2_msg}
+  LDAP:             ${curl_ldap_msg}
+  LDAPS:            ${curl_ldaps_msg}
+  RTSP:             ${curl_rtsp_msg}
+  RTMP:             ${curl_rtmp_msg}
+  Metalink:         ${curl_mtlnk_msg}
+  PSL:              ${curl_psl_msg}
+  Alt-svc:          ${curl_altsvc_msg}
+  HTTP2:            ${curl_h2_msg}
+  HTTP3:            ${curl_h3_msg}
+  ESNI:             ${curl_esni_msg}
   Protocols:        ${SUPPORT_PROTOCOLS}
+  Features:         ${SUPPORT_FEATURES}
 " >&6;}
+if test -n "$experimental"; then
+ cat >&2 << _EOF
+  WARNING: $experimental enabled but marked EXPERIMENTAL. Use with caution!
+_EOF
+fi
index 8a7dd6a..dd149b7 100755 (executable)
@@ -5,7 +5,7 @@
 #                            | (__| |_| |  _ <| |___
 #                             \___|\___/|_| \_\_____|
 #
-# Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 #
 # This software is licensed as described in the file COPYING, which
 # you should have received as part of this distribution. The terms
@@ -31,7 +31,7 @@ XC_OVR_ZZ60
 CURL_OVERRIDE_AUTOCONF
 
 dnl configure script copyright
-AC_COPYRIGHT([Copyright (c) 1998 - 2017 Daniel Stenberg, <daniel@haxx.se>
+AC_COPYRIGHT([Copyright (c) 1998 - 2019 Daniel Stenberg, <daniel@haxx.se>
 This configure script may be copied, distributed and modified under the
 terms of the curl license; see COPYING for more details])
 
@@ -49,6 +49,7 @@ CURL_CHECK_OPTION_CURLDEBUG
 CURL_CHECK_OPTION_SYMBOL_HIDING
 CURL_CHECK_OPTION_ARES
 CURL_CHECK_OPTION_RT
+CURL_CHECK_OPTION_ESNI
 
 XC_CHECK_PATH_SEPARATOR
 
@@ -131,11 +132,8 @@ dnl figure out the libcurl version
 CURLVERSION=`$SED -ne 's/^#define LIBCURL_VERSION "\(.*\)".*/\1/p' ${srcdir}/include/curl/curlver.h`
 XC_CHECK_PROG_CC
 
-dnl Check if gcc is being used before adding AX_CODE_COVERAGE
-AS_IF([ test "$GCC" = "yes" ], [AX_CODE_COVERAGE],
-  # not using GCC so pass a test below - CODE_COVERAGE_ENABLED_TRUE is not zero length
-  CODE_COVERAGE_ENABLED_TRUE='#'
-)
+dnl for --enable-code-coverage
+CURL_COVERAGE
 
 XC_AUTOMAKE
 AC_MSG_CHECKING([curl version])
@@ -158,8 +156,8 @@ AC_SUBST(PKGADD_VENDOR)
 
 dnl
 dnl initialize all the info variables
-    curl_ssl_msg="no      (--with-{ssl,gnutls,nss,polarssl,mbedtls,cyassl,axtls,winssl,darwinssl,mesalink} )"
-    curl_ssh_msg="no      (--with-libssh2)"
+    curl_ssl_msg="no      (--with-{ssl,gnutls,nss,mbedtls,wolfssl,schannel,secure-transport,mesalink,amissl,bearssl} )"
+    curl_ssh_msg="no      (--with-{libssh,libssh2})"
    curl_zlib_msg="no      (--with-zlib)"
  curl_brotli_msg="no      (--with-brotli)"
     curl_gss_msg="no      (--with-gssapi)"
@@ -368,6 +366,7 @@ CURL_CHECK_WIN32_LARGEFILE
 CURL_MAC_CFLAGS
 CURL_SUPPORTS_BUILTIN_AVAILABLE
 
+
 dnl ************************************************************
 dnl switch off particular protocols
 dnl
@@ -842,6 +841,28 @@ fi
 
 if test "$HAVE_GETHOSTBYNAME" != "1"
 then
+  dnl This is for AmigaOS with bsdsocket.library - needs testing before -lnet
+  AC_MSG_CHECKING([for gethostbyname for AmigaOS bsdsocket.library])
+  AC_LINK_IFELSE([
+    AC_LANG_PROGRAM([[
+#include <proto/bsdsocket.h>
+struct Library *SocketBase = NULL;
+    ]],[[
+      gethostbyname("www.dummysite.com");
+    ]])
+  ],[
+    AC_MSG_RESULT([yes])
+    HAVE_GETHOSTBYNAME="1"
+    HAVE_PROTO_BSDSOCKET_H="1"
+    AC_DEFINE(HAVE_PROTO_BSDSOCKET_H, 1, [if Amiga bsdsocket.library is in use])
+    AC_SUBST(HAVE_PROTO_BSDSOCKET_H, [1])
+  ],[
+    AC_MSG_RESULT([no])
+  ])
+fi
+
+if test "$HAVE_GETHOSTBYNAME" != "1"
+then
   dnl gethostbyname in the network lib - for Haiku OS
   AC_CHECK_LIB(network, gethostbyname,
                [HAVE_GETHOSTBYNAME="1"
@@ -1182,16 +1203,23 @@ AC_HELP_STRING([--disable-ipv6],[Disable IPv6 support]),
        ;;
   esac ],
 
-  AC_TRY_RUN([ /* is AF_INET6 available? */
+  AC_TRY_RUN([ /* are AF_INET6 and sockaddr_in6 available? */
 #include <sys/types.h>
 #ifdef HAVE_WINSOCK2_H
 #include <winsock2.h>
+#include <ws2tcpip.h>
 #else
 #include <sys/socket.h>
+#include <netinet/in.h>
+#if defined (__TANDEM)
+# include <netinet/in6.h>
+#endif
 #endif
 #include <stdlib.h> /* for exit() */
 main()
 {
+ struct sockaddr_in6 s;
+ (void)s;
  if (socket(AF_INET6, SOCK_STREAM, 0) < 0)
    exit(1);
  else
@@ -1206,12 +1234,12 @@ main()
   ipv6=yes
 ))
 
-if test "$ipv6" = "yes"; then
+if test "$ipv6" = yes; then
   curl_ipv6_msg="enabled"
-fi
+  AC_DEFINE(ENABLE_IPV6, 1, [Define if you want to enable IPv6 support])
+  IPV6_ENABLED=1
+  AC_SUBST(IPV6_ENABLED)
 
-# Check if struct sockaddr_in6 have sin6_scope_id member
-if test "$ipv6" = yes; then
   AC_MSG_CHECKING([if struct sockaddr_in6 has sin6_scope_id member])
   AC_TRY_COMPILE([
 #include <sys/types.h>
@@ -1483,6 +1511,11 @@ AC_HELP_STRING([--with-winssl],[enable Windows native SSL/TLS])
 AC_HELP_STRING([--without-winssl], [disable Windows native SSL/TLS]),
   OPT_WINSSL=$withval)
 
+AC_ARG_WITH(schannel,dnl
+AC_HELP_STRING([--with-schannel],[enable Windows native SSL/TLS])
+AC_HELP_STRING([--without-schannel], [disable Windows native SSL/TLS]),
+  OPT_WINSSL=$withval)
+
 AC_MSG_CHECKING([whether to enable Windows native SSL/TLS (Windows native builds only)])
 if test -z "$ssl_backends" -o "x$OPT_WINSSL" != xno; then
   ssl_msg=
@@ -1507,22 +1540,27 @@ else
   AC_MSG_RESULT(no)
 fi
 
-OPT_DARWINSSL=no
+OPT_SECURETRANSPORT=no
 AC_ARG_WITH(darwinssl,dnl
 AC_HELP_STRING([--with-darwinssl],[enable Apple OS native SSL/TLS])
 AC_HELP_STRING([--without-darwinssl], [disable Apple OS native SSL/TLS]),
-  OPT_DARWINSSL=$withval)
+  OPT_SECURETRANSPORT=$withval)
+
+AC_ARG_WITH(secure-transport,dnl
+AC_HELP_STRING([--with-secure-transport],[enable Apple OS native SSL/TLS])
+AC_HELP_STRING([--without-secure-transport], [disable Apple OS native SSL/TLS]),
+  OPT_SECURETRANSPORT=$withval)
 
-AC_MSG_CHECKING([whether to enable Apple OS native SSL/TLS])
-if test -z "$ssl_backends" -o "x$OPT_DARWINSSL" != xno; then
-  if test "x$OPT_DARWINSSL" != "xno" &&
+AC_MSG_CHECKING([whether to enable Secure Transport])
+if test -z "$ssl_backends" -o "x$OPT_SECURETRANSPORT" != xno; then
+  if test "x$OPT_SECURETRANSPORT" != "xno" &&
      test -d "/System/Library/Frameworks/Security.framework"; then
     AC_MSG_RESULT(yes)
-    AC_DEFINE(USE_DARWINSSL, 1, [to enable Apple OS native SSL/TLS support])
-    AC_SUBST(USE_DARWINSSL, [1])
-    ssl_msg="Apple OS-native"
-    test darwinssl != "$DEFAULT_SSL_BACKEND" || VALID_DEFAULT_SSL_BACKEND=yes
-    DARWINSSL_ENABLED=1
+    AC_DEFINE(USE_SECTRANSP, 1, [enable Secure Transport])
+    AC_SUBST(USE_SECTRANSP, [1])
+    ssl_msg="Secure Transport"
+    test secure-transport != "$DEFAULT_SSL_BACKEND" || VALID_DEFAULT_SSL_BACKEND=yes
+    SECURETRANSPORT_ENABLED=1
     LDFLAGS="$LDFLAGS -framework CoreFoundation -framework Security"
   else
     AC_MSG_RESULT(no)
@@ -1532,6 +1570,35 @@ else
   AC_MSG_RESULT(no)
 fi
 
+OPT_AMISSL=no
+AC_ARG_WITH(amissl,dnl
+AC_HELP_STRING([--with-amissl],[enable Amiga native SSL/TLS (AmiSSL)])
+AC_HELP_STRING([--without-amissl], [disable Amiga native SSL/TLS (AmiSSL)]),
+  OPT_AMISSL=$withval)
+
+AC_MSG_CHECKING([whether to enable Amiga native SSL/TLS (AmiSSL)])
+if test "$HAVE_PROTO_BSDSOCKET_H" = "1"; then
+  if test -z "$ssl_backends" -o "x$OPT_AMISSL" != xno; then
+    ssl_msg=
+    if test "x$OPT_AMISSL" != "xno"; then
+      AC_MSG_RESULT(yes)
+      ssl_msg="AmiSSL"
+      test amissl != "$DEFAULT_SSL_BACKEND" || VALID_DEFAULT_SSL_BACKEND=yes
+      AMISSL_ENABLED=1
+      LIBS="-lamisslauto $LIBS"
+      AC_DEFINE(USE_AMISSL, 1, [if AmiSSL is in use])
+      AC_DEFINE(USE_OPENSSL, 1, [if OpenSSL is in use])
+    else
+      AC_MSG_RESULT(no)
+    fi
+    test -z "$ssl_msg" || ssl_backends="${ssl_backends:+$ssl_backends, }$ssl_msg"
+  else
+    AC_MSG_RESULT(no)
+  fi
+else
+  AC_MSG_RESULT(no)
+fi
+
 dnl **********************************************************************
 dnl Check for the presence of SSL libraries and headers
 dnl **********************************************************************
@@ -1623,7 +1690,7 @@ if test -z "$ssl_backends" -o "x$OPT_SSL" != xno &&
 
     if test "$PKGCONFIG" != "no" ; then
       SSL_LIBS=`CURL_EXPORT_PCDIR([$OPENSSL_PCDIR]) dnl
-        $PKGCONFIG --libs-only-l openssl 2>/dev/null`
+        $PKGCONFIG --libs-only-l --libs-only-other openssl 2>/dev/null`
 
       SSL_LDFLAGS=`CURL_EXPORT_PCDIR([$OPENSSL_PCDIR]) dnl
         $PKGCONFIG --libs-only-L openssl 2>/dev/null`
@@ -1767,14 +1834,11 @@ if test -z "$ssl_backends" -o "x$OPT_SSL" != xno &&
 
   if test X"$OPENSSL_ENABLED" = X"1"; then
     dnl These can only exist if OpenSSL exists
-    dnl Older versions of Cyassl (some time before 2.9.4) don't have
-    dnl SSL_get_shutdown (but this check won't actually detect it there
-    dnl as it's a macro that needs the header files be included)
+    dnl OpenSSL_version is introduced in 3.0.0
 
     AC_CHECK_FUNCS( RAND_egd \
-                    ENGINE_cleanup \
-                    SSL_get_shutdown \
-                    SSLv2_client_method )
+                    SSLv2_client_method \
+                    OpenSSL_version )
 
     AC_MSG_CHECKING([for BoringSSL])
     AC_COMPILE_IFELSE([
@@ -1829,6 +1893,14 @@ if test -z "$ssl_backends" -o "x$OPT_SSL" != xno &&
   test -z "$ssl_msg" || ssl_backends="${ssl_backends:+$ssl_backends, }$ssl_msg"
 fi
 
+if test X"$OPT_SSL" != Xoff &&
+  test X"$OPT_SSL" != Xno &&
+  test "$OPENSSL_ENABLED" != "1"; then
+  AC_MSG_NOTICE([OPT_SSL: $OPT_SSL])
+  AC_MSG_NOTICE([OPENSSL_ENABLED: $OPENSSL_ENABLED])
+  AC_MSG_ERROR([--with-ssl was given but OpenSSL could not be detected])
+fi
+
 dnl **********************************************************************
 dnl Check for the random seed preferences
 dnl **********************************************************************
@@ -2051,98 +2123,6 @@ if test "$GNUTLS_ENABLED" = "1"; then
 fi
 
 dnl ----------------------------------------------------
-dnl check for PolarSSL
-dnl ----------------------------------------------------
-
-dnl Default to compiler & linker defaults for PolarSSL files & libraries.
-OPT_POLARSSL=no
-
-_cppflags=$CPPFLAGS
-_ldflags=$LDFLAGS
-AC_ARG_WITH(polarssl,dnl
-AC_HELP_STRING([--with-polarssl=PATH],[where to look for PolarSSL, PATH points to the installation root])
-AC_HELP_STRING([--without-polarssl], [disable PolarSSL detection]),
-  OPT_POLARSSL=$withval)
-
-if test -z "$ssl_backends" -o "x$OPT_POLARSSL" != xno; then
-  ssl_msg=
-
-  if test X"$OPT_POLARSSL" != Xno; then
-
-    if test "$OPT_POLARSSL" = "yes"; then
-      OPT_POLARSSL=""
-    fi
-
-    if test -z "$OPT_POLARSSL" ; then
-      dnl check for lib first without setting any new path
-
-      AC_CHECK_LIB(polarssl, havege_init,
-      dnl libpolarssl found, set the variable
-       [
-         AC_DEFINE(USE_POLARSSL, 1, [if PolarSSL is enabled])
-         AC_SUBST(USE_POLARSSL, [1])
-         POLARSSL_ENABLED=1
-         USE_POLARSSL="yes"
-         ssl_msg="PolarSSL"
-        test polarssl != "$DEFAULT_SSL_BACKEND" || VALID_DEFAULT_SSL_BACKEND=yes
-        ])
-    fi
-
-    addld=""
-    addlib=""
-    addcflags=""
-    polarssllib=""
-
-    if test "x$USE_POLARSSL" != "xyes"; then
-      dnl add the path and test again
-      addld=-L$OPT_POLARSSL/lib$libsuff
-      addcflags=-I$OPT_POLARSSL/include
-      polarssllib=$OPT_POLARSSL/lib$libsuff
-
-      LDFLAGS="$LDFLAGS $addld"
-      if test "$addcflags" != "-I/usr/include"; then
-         CPPFLAGS="$CPPFLAGS $addcflags"
-      fi
-
-      AC_CHECK_LIB(polarssl, ssl_init,
-       [
-       AC_DEFINE(USE_POLARSSL, 1, [if PolarSSL is enabled])
-       AC_SUBST(USE_POLARSSL, [1])
-       POLARSSL_ENABLED=1
-       USE_POLARSSL="yes"
-       ssl_msg="PolarSSL"
-       test polarssl != "$DEFAULT_SSL_BACKEND" || VALID_DEFAULT_SSL_BACKEND=yes
-       ],
-       [
-         CPPFLAGS=$_cppflags
-         LDFLAGS=$_ldflags
-       ])
-    fi
-
-    if test "x$USE_POLARSSL" = "xyes"; then
-      AC_MSG_NOTICE([detected PolarSSL])
-      check_for_ca_bundle=1
-      LIBS="-lpolarssl $LIBS"
-
-      if test -n "$polarssllib"; then
-        dnl when shared libs were found in a path that the run-time
-        dnl linker doesn't search through, we need to add it to
-        dnl CURL_LIBRARY_PATH to prevent further configure tests to fail
-        dnl due to this
-        if test "x$cross_compiling" != "xyes"; then
-          CURL_LIBRARY_PATH="$CURL_LIBRARY_PATH:$polarssllib"
-          export CURL_LIBRARY_PATH
-          AC_MSG_NOTICE([Added $polarssllib to CURL_LIBRARY_PATH])
-        fi
-      fi
-    fi
-
-  fi dnl PolarSSL not disabled
-
-  test -z "$ssl_msg" || ssl_backends="${ssl_backends:+$ssl_backends, }$ssl_msg"
-fi
-
-dnl ----------------------------------------------------
 dnl check for mbedTLS
 dnl ----------------------------------------------------
 
@@ -2235,176 +2215,105 @@ if test -z "$ssl_backends" -o "x$OPT_MBEDTLS" != xno; then
 fi
 
 dnl ----------------------------------------------------
-dnl check for CyaSSL
+dnl check for wolfSSL
 dnl ----------------------------------------------------
 
-dnl Default to compiler & linker defaults for CyaSSL files & libraries.
-OPT_CYASSL=no
+dnl Default to compiler & linker defaults for wolfSSL files & libraries.
+OPT_WOLFSSL=no
 
 _cppflags=$CPPFLAGS
 _ldflags=$LDFLAGS
-AC_ARG_WITH(cyassl,dnl
-AC_HELP_STRING([--with-cyassl=PATH],[where to look for CyaSSL, PATH points to the installation root (default: system lib default)])
-AC_HELP_STRING([--without-cyassl], [disable CyaSSL detection]),
-  OPT_CYASSL=$withval)
 
-dnl provide --with-wolfssl as an alias for --with-cyassl
 AC_ARG_WITH(wolfssl,dnl
 AC_HELP_STRING([--with-wolfssl=PATH],[where to look for WolfSSL, PATH points to the installation root (default: system lib default)])
 AC_HELP_STRING([--without-wolfssl], [disable WolfSSL detection]),
-  OPT_CYASSL=$withval)
+  OPT_WOLFSSL=$withval)
 
-if test -z "$ssl_backends" -o "x$OPT_CYASSL" != xno; then
+if test -z "$ssl_backends" -o "x$OPT_WOLFSSL" != xno; then
   ssl_msg=
 
-  if test X"$OPT_CYASSL" != Xno; then
-
-    if test "$OPT_CYASSL" = "yes"; then
-      OPT_CYASSL=""
-    fi
-
-    dnl This should be reworked to use pkg-config instead
-
-    cyassllibname=cyassl
-
-    if test -z "$OPT_CYASSL" ; then
-      dnl check for lib in system default first
-
-      AC_CHECK_LIB(cyassl, CyaSSL_Init,
-      dnl libcyassl found, set the variable
-       [
-         AC_DEFINE(USE_CYASSL, 1, [if CyaSSL is enabled])
-         AC_SUBST(USE_CYASSL, [1])
-         CYASSL_ENABLED=1
-         USE_CYASSL="yes"
-         ssl_msg="CyaSSL"
-        test cyassl != "$DEFAULT_SSL_BACKEND" || VALID_DEFAULT_SSL_BACKEND=yes
-        ])
-    fi
-
-    addld=""
-    addlib=""
-    addcflags=""
-    cyassllib=""
-
-    if test "x$USE_CYASSL" != "xyes"; then
-      dnl add the path and test again
-      addld=-L$OPT_CYASSL/lib$libsuff
-      addcflags=-I$OPT_CYASSL/include
-      cyassllib=$OPT_CYASSL/lib$libsuff
-
-      LDFLAGS="$LDFLAGS $addld"
-      if test "$addcflags" != "-I/usr/include"; then
-         CPPFLAGS="$CPPFLAGS $addcflags"
-      fi
+  if test X"$OPT_WOLFSSL" != Xno; then
 
-      AC_CHECK_LIB(cyassl, CyaSSL_Init,
-       [
-       AC_DEFINE(USE_CYASSL, 1, [if CyaSSL is enabled])
-       AC_SUBST(USE_CYASSL, [1])
-       CYASSL_ENABLED=1
-       USE_CYASSL="yes"
-       ssl_msg="CyaSSL"
-       test cyassl != "$DEFAULT_SSL_BACKEND" || VALID_DEFAULT_SSL_BACKEND=yes
-       ],
-       [
-         CPPFLAGS=$_cppflags
-         LDFLAGS=$_ldflags
-         cyassllib=""
-       ])
+    if test "$OPT_WOLFSSL" = "yes"; then
+      OPT_WOLFSSL=""
     fi
 
     addld=""
     addlib=""
     addcflags=""
 
-    if test "x$USE_CYASSL" != "xyes"; then
-      dnl libcyassl renamed to libwolfssl as of 3.4.0
-      addld=-L$OPT_CYASSL/lib$libsuff
-      addcflags=-I$OPT_CYASSL/include
-      cyassllib=$OPT_CYASSL/lib$libsuff
+    if test "x$USE_WOLFSSL" != "xyes"; then
+      addld=-L$OPT_WOLFSSL/lib$libsuff
+      addcflags=-I$OPT_WOLFSSL/include
+      wolfssllibpath=$OPT_WOLFSSL/lib$libsuff
 
       LDFLAGS="$LDFLAGS $addld"
       if test "$addcflags" != "-I/usr/include"; then
          CPPFLAGS="$CPPFLAGS $addcflags"
       fi
 
-      cyassllibname=wolfssl
       my_ac_save_LIBS="$LIBS"
-      LIBS="-l$cyassllibname -lm $LIBS"
+      LIBS="-lwolfssl -lm $LIBS"
 
-      AC_MSG_CHECKING([for CyaSSL_Init in -lwolfssl])
+      AC_MSG_CHECKING([for wolfSSL_Init in -lwolfssl])
       AC_LINK_IFELSE([
        AC_LANG_PROGRAM([[
 /* These aren't needed for detection and confuse WolfSSL.
    They are set up properly later if it is detected.  */
 #undef SIZEOF_LONG
 #undef SIZEOF_LONG_LONG
-#include <cyassl/ssl.h>
+#include <wolfssl/ssl.h>
        ]],[[
-         return CyaSSL_Init();
+         return wolfSSL_Init();
        ]])
       ],[
          AC_MSG_RESULT(yes)
-         AC_DEFINE(USE_CYASSL, 1, [if CyaSSL/WolfSSL is enabled])
-         AC_SUBST(USE_CYASSL, [1])
-         CYASSL_ENABLED=1
-         USE_CYASSL="yes"
+         AC_DEFINE(USE_WOLFSSL, 1, [if wolfSSL is enabled])
+         AC_SUBST(USE_WOLFSSL, [1])
+         WOLFSSL_ENABLED=1
+         USE_WOLFSSL="yes"
          ssl_msg="WolfSSL"
-        test cyassl != "$DEFAULT_SSL_BACKEND" || VALID_DEFAULT_SSL_BACKEND=yes
+        test wolfssl != "$DEFAULT_SSL_BACKEND" || VALID_DEFAULT_SSL_BACKEND=yes
        ],
        [
          AC_MSG_RESULT(no)
          CPPFLAGS=$_cppflags
          LDFLAGS=$_ldflags
-         cyassllib=""
+         wolfssllibpath=""
        ])
       LIBS="$my_ac_save_LIBS"
     fi
 
-    if test "x$USE_CYASSL" = "xyes"; then
-      AC_MSG_NOTICE([detected $cyassllibname])
+    if test "x$USE_WOLFSSL" = "xyes"; then
+      AC_MSG_NOTICE([detected wolfSSL])
       check_for_ca_bundle=1
 
-      dnl cyassl/ctaocrypt/types.h needs SIZEOF_LONG_LONG defined!
+      dnl wolfssl/ctaocrypt/types.h needs SIZEOF_LONG_LONG defined!
       AX_COMPILE_CHECK_SIZEOF(long long)
 
-      dnl Versions since at least 2.6.0 may have options.h
-      AC_CHECK_HEADERS(cyassl/options.h)
+      LIBS="-lwolfssl -lm $LIBS"
 
-      dnl Versions since at least 2.9.4 renamed error.h to error-ssl.h
-      AC_CHECK_HEADERS(cyassl/error-ssl.h)
-
-      LIBS="-l$cyassllibname -lm $LIBS"
-
-      if test "x$cyassllibname" = "xwolfssl"; then
-        dnl Recent WolfSSL versions build without SSLv3 by default
-        dnl WolfSSL needs configure --enable-opensslextra to have *get_peer*
-        AC_CHECK_FUNCS(wolfSSLv3_client_method \
-                       wolfSSL_CTX_UseSupportedCurve \
-                       wolfSSL_get_peer_certificate \
-                       wolfSSL_UseALPN)
-      else
-        dnl Cyassl needs configure --enable-opensslextra to have *get_peer*
-        AC_CHECK_FUNCS(CyaSSL_CTX_UseSupportedCurve \
-                       CyaSSL_get_peer_certificate)
-      fi
+      dnl Recent WolfSSL versions build without SSLv3 by default
+      dnl WolfSSL needs configure --enable-opensslextra to have *get_peer*
+      AC_CHECK_FUNCS(wolfSSLv3_client_method \
+                     wolfSSL_get_peer_certificate \
+                     wolfSSL_UseALPN)
 
-      if test -n "$cyassllib"; then
+      if test -n "$wolfssllibpath"; then
         dnl when shared libs were found in a path that the run-time
         dnl linker doesn't search through, we need to add it to
         dnl CURL_LIBRARY_PATH to prevent further configure tests to fail
         dnl due to this
         if test "x$cross_compiling" != "xyes"; then
-          CURL_LIBRARY_PATH="$CURL_LIBRARY_PATH:$cyassllib"
+          CURL_LIBRARY_PATH="$CURL_LIBRARY_PATH:$wolfssllibpath"
           export CURL_LIBRARY_PATH
-          AC_MSG_NOTICE([Added $cyassllib to CURL_LIBRARY_PATH])
+          AC_MSG_NOTICE([Added $wolfssllibpath to CURL_LIBRARY_PATH])
         fi
       fi
 
     fi
 
-  fi dnl CyaSSL not disabled
+  fi dnl wolfSSL not disabled
 
   test -z "$ssl_msg" || ssl_backends="${ssl_backends:+$ssl_backends, }$ssl_msg"
 fi
@@ -2502,6 +2411,98 @@ if test -z "$ssl_backends" -o "x$OPT_MESALINK" != xno; then
 fi
 
 dnl ----------------------------------------------------
+dnl check for BearSSL
+dnl ----------------------------------------------------
+
+OPT_BEARSSL=no
+
+_cppflags=$CPPFLAGS
+_ldflags=$LDFLAGS
+AC_ARG_WITH(bearssl,dnl
+AC_HELP_STRING([--with-bearssl=PATH],[where to look for BearSSL, PATH points to the installation root])
+AC_HELP_STRING([--without-bearssl], [disable BearSSL detection]),
+  OPT_BEARSSL=$withval)
+
+if test -z "$ssl_backends" -o "x$OPT_BEARSSL" != xno; then
+  ssl_msg=
+
+  if test X"$OPT_BEARSSL" != Xno; then
+
+    if test "$OPT_BEARSSL" = "yes"; then
+      OPT_BEARSSL=""
+    fi
+
+    if test -z "$OPT_BEARSSL" ; then
+      dnl check for lib first without setting any new path
+
+      AC_CHECK_LIB(bearssl, br_ssl_client_init_full,
+      dnl libbearssl found, set the variable
+       [
+         AC_DEFINE(USE_BEARSSL, 1, [if BearSSL is enabled])
+         AC_SUBST(USE_BEARSSL, [1])
+         BEARSSL_ENABLED=1
+         USE_BEARSSL="yes"
+         ssl_msg="BearSSL"
+        test bearssl != "$DEFAULT_SSL_BACKEND" || VALID_DEFAULT_SSL_BACKEND=yes
+        ], [], -lbearssl)
+    fi
+
+    addld=""
+    addlib=""
+    addcflags=""
+    bearssllib=""
+
+    if test "x$USE_BEARSSL" != "xyes"; then
+      dnl add the path and test again
+      addld=-L$OPT_BEARSSL/lib$libsuff
+      addcflags=-I$OPT_BEARSSL/include
+      bearssllib=$OPT_BEARSSL/lib$libsuff
+
+      LDFLAGS="$LDFLAGS $addld"
+      if test "$addcflags" != "-I/usr/include"; then
+         CPPFLAGS="$CPPFLAGS $addcflags"
+      fi
+
+      AC_CHECK_LIB(bearssl, br_ssl_client_init_full,
+       [
+       AC_DEFINE(USE_BEARSSL, 1, [if BearSSL is enabled])
+       AC_SUBST(USE_BEARSSL, [1])
+       BEARSSL_ENABLED=1
+       USE_BEARSSL="yes"
+       ssl_msg="BearSSL"
+       test bearssl != "$DEFAULT_SSL_BACKEND" || VALID_DEFAULT_SSL_BACKEND=yes
+       ],
+       [
+         CPPFLAGS=$_cppflags
+         LDFLAGS=$_ldflags
+       ], -lbearssl)
+    fi
+
+    if test "x$USE_BEARSSL" = "xyes"; then
+      AC_MSG_NOTICE([detected BearSSL])
+      check_for_ca_bundle=1
+
+      LIBS="-lbearssl $LIBS"
+
+      if test -n "$bearssllib"; then
+        dnl when shared libs were found in a path that the run-time
+        dnl linker doesn't search through, we need to add it to
+        dnl CURL_LIBRARY_PATH to prevent further configure tests to fail
+        dnl due to this
+        if test "x$cross_compiling" != "xyes"; then
+          CURL_LIBRARY_PATH="$CURL_LIBRARY_PATH:$bearssllib"
+          export CURL_LIBRARY_PATH
+          AC_MSG_NOTICE([Added $bearssllib to CURL_LIBRARY_PATH])
+        fi
+      fi
+    fi
+
+  fi dnl BearSSL not disabled
+
+  test -z "$ssl_msg" || ssl_backends="${ssl_backends:+$ssl_backends, }$ssl_msg"
+fi
+
+dnl ----------------------------------------------------
 dnl NSS. Only check if GnuTLS and OpenSSL are not enabled
 dnl ----------------------------------------------------
 
@@ -2631,70 +2632,10 @@ if test -z "$ssl_backends" -o "x$OPT_NSS" != xno; then
   test -z "$ssl_msg" || ssl_backends="${ssl_backends:+$ssl_backends, }$ssl_msg"
 fi
 
-OPT_AXTLS=off
-
-AC_ARG_WITH(axtls,dnl
-AC_HELP_STRING([--with-axtls=PATH],[Where to look for axTLS, PATH points to the axTLS installation prefix (default: /usr/local).  Ignored if another SSL engine is selected.])
-AC_HELP_STRING([--without-axtls], [disable axTLS]),
-  OPT_AXTLS=$withval)
-
-if test -z "$ssl_backends" -o "x$OPT_AXTLS" != xno; then
-  ssl_msg=
-  if test X"$OPT_AXTLS" != Xno; then
-    dnl backup the pre-axtls variables
-    CLEANLDFLAGS="$LDFLAGS"
-    CLEANCPPFLAGS="$CPPFLAGS"
-    CLEANLIBS="$LIBS"
-
-    case "$OPT_AXTLS" in
-    yes)
-      dnl --with-axtls (without path) used
-      PREFIX_AXTLS=/usr/local
-      LIB_AXTLS="$PREFIX_AXTLS/lib"
-      LDFLAGS="$LDFLAGS -L$LIB_AXTLS"
-      CPPFLAGS="$CPPFLAGS -I$PREFIX_AXTLS/include"
-      ;;
-    off)
-      dnl no --with-axtls option given, just check default places
-      PREFIX_AXTLS=
-      ;;
-    *)
-      dnl check the given --with-axtls spot
-      PREFIX_AXTLS=$OPT_AXTLS
-      LIB_AXTLS="$PREFIX_AXTLS/lib"
-      LDFLAGS="$LDFLAGS -L$LIB_AXTLS"
-      CPPFLAGS="$CPPFLAGS -I$PREFIX_AXTLS/include"
-      ;;
-    esac
-
-    AC_CHECK_LIB(axtls, ssl_version,[
-      LIBS="-laxtls $LIBS"
-      AC_DEFINE(USE_AXTLS, 1, [if axTLS is enabled])
-      AC_SUBST(USE_AXTLS, [1])
-      AXTLS_ENABLED=1
-      check_for_ca_bundle=1
-      USE_AXTLS="yes"
-      ssl_msg="axTLS"
-      test axtls != "$DEFAULT_SSL_BACKEND" || VALID_DEFAULT_SSL_BACKEND=yes
-
-      if test "x$cross_compiling" != "xyes"; then
-        CURL_LIBRARY_PATH="$CURL_LIBRARY_PATH:$LIB_AXTLS"
-        export CURL_LIBRARY_PATH
-        AC_MSG_NOTICE([Added $LIB_AXTLS to CURL_LIBRARY_PATH])
-      fi
-      ],[
-      LDFLAGS="$CLEANLDFLAGS"
-      CPPFLAGS="$CLEANCPPFLAGS"
-      LIBS="$CLEANLIBS"
-    ])
-  fi
-  test -z "$ssl_msg" || ssl_backends="${ssl_backends:+$ssl_backends, }$ssl_msg"
-fi
-
-case "x$OPENSSL_ENABLED$GNUTLS_ENABLED$NSS_ENABLED$POLARSSL_ENABLED$MBEDTLS_ENABLED$AXTLS_ENABLED$CYASSL_ENABLED$WINSSL_ENABLED$DARWINSSL_ENABLED$MESALINK_ENABLED" in
+case "x$OPENSSL_ENABLED$GNUTLS_ENABLED$NSS_ENABLED$MBEDTLS_ENABLED$WOLFSSL_ENABLED$WINSSL_ENABLED$SECURETRANSPORT_ENABLED$MESALINK_ENABLED$BEARSSL_ENABLED$AMISSL_ENABLED" in
 x)
   AC_MSG_WARN([SSL disabled, you will not be able to use HTTPS, FTPS, NTLM and more.])
-  AC_MSG_WARN([Use --with-ssl, --with-gnutls, --with-polarssl, --with-cyassl, --with-nss, --with-axtls, --with-winssl, --with-darwinssl, or --with-mesalink to address this.])
+  AC_MSG_WARN([Use --with-ssl, --with-gnutls, --with-wolfssl, --with-mbedtls, --with-nss, --with-schannel, --with-secure-transport, --with-mesalink, --with-amissl or --with-bearssl to address this.])
   ;;
 x1)
   # one SSL backend is enabled
@@ -2734,7 +2675,7 @@ dnl **********************************************************************
 dnl Check for the CA bundle
 dnl **********************************************************************
 
-if test "$check_for_ca_bundle" -gt 0; then
+if test -n "$check_for_ca_bundle"; then
   CURL_CHECK_CA_BUNDLE
 fi
 
@@ -2749,7 +2690,7 @@ AC_ARG_WITH(libpsl,
            with_libpsl=yes)
 if test $with_libpsl != "no"; then
   AC_SEARCH_LIBS(psl_builtin, psl,
-    [curl_psl_msg="yes";
+    [curl_psl_msg="enabled";
      AC_DEFINE([USE_LIBPSL], [1], [PSL support enabled])
      ],
     [curl_psl_msg="no      (libpsl not found)";
@@ -2757,7 +2698,7 @@ if test $with_libpsl != "no"; then
      ]
   )
 fi
-AM_CONDITIONAL([USE_LIBPSL], [test "$curl_psl_msg" = "yes"])
+AM_CONDITIONAL([USE_LIBPSL], [test "$curl_psl_msg" = "enabled"])
 
 dnl **********************************************************************
 dnl Check for libmetalink
@@ -3118,16 +3059,12 @@ AC_HELP_STRING([--disable-versioned-symbols], [Disable versioned symbols in shar
           versioned_symbols_flavour="GNUTLS_"
         elif test "x$NSS_ENABLED" = "x1"; then
           versioned_symbols_flavour="NSS_"
-        elif test "x$POLARSSL_ENABLED" = "x1"; then
-          versioned_symbols_flavour="POLARSSL_"
-        elif test "x$CYASSL_ENABLED" = "x1"; then
-          versioned_symbols_flavour="CYASSL_"
-        elif test "x$AXTLS_ENABLED" = "x1"; then
-          versioned_symbols_flavour="AXTLS_"
+        elif test "x$WOLFSSL_ENABLED" = "x1"; then
+          versioned_symbols_flavour="WOLFSSL_"
         elif test "x$WINSSL_ENABLED" = "x1"; then
-          versioned_symbols_flavour="WINSSL_"
-        elif test "x$DARWINSSL_ENABLED" = "x1"; then
-          versioned_symbols_flavour="DARWINSSL_"
+          versioned_symbols_flavour="SCHANNEL_"
+        elif test "x$SECURETRANSPORT_ENABLED" = "x1"; then
+          versioned_symbols_flavour="SECURE_TRANSPORT_"
         else
           versioned_symbols_flavour=""
         fi
@@ -3443,6 +3380,331 @@ if test X"$want_h2" != Xno; then
 fi
 
 dnl **********************************************************************
+dnl Check for ngtcp2 (QUIC)
+dnl **********************************************************************
+
+OPT_TCP2="yes"
+curl_h3_msg="disabled (--with-ngtcp2, --with-quiche)"
+
+if test "x$disable_http" = "xyes"; then
+  # without HTTP, ngtcp2 is no use
+  OPT_TCP2="no"
+fi
+
+AC_ARG_WITH(ngtcp2,
+AC_HELP_STRING([--with-ngtcp2=PATH],[Enable ngtcp2 usage])
+AC_HELP_STRING([--without-ngtcp2],[Disable ngtcp2 usage]),
+  [OPT_TCP2=$withval])
+case "$OPT_TCP2" in
+  no)
+    dnl --without-ngtcp2 option used
+    want_tcp2="no"
+    ;;
+  yes)
+    dnl --with-ngtcp2 option used without path
+    want_tcp2="default"
+    want_tcp2_path=""
+    ;;
+  *)
+    dnl --with-ngtcp2 option used with path
+    want_tcp2="yes"
+    want_tcp2_path="$withval/lib/pkgconfig"
+    ;;
+esac
+
+curl_tcp2_msg="disabled (--with-ngtcp2)"
+if test X"$want_tcp2" != Xno; then
+  dnl backup the pre-ngtcp2 variables
+  CLEANLDFLAGS="$LDFLAGS"
+  CLEANCPPFLAGS="$CPPFLAGS"
+  CLEANLIBS="$LIBS"
+
+  CURL_CHECK_PKGCONFIG(libngtcp2, $want_tcp2_path)
+
+  if test "$PKGCONFIG" != "no" ; then
+    LIB_TCP2=`CURL_EXPORT_PCDIR([$want_tcp2_path])
+      $PKGCONFIG --libs-only-l libngtcp2`
+    AC_MSG_NOTICE([-l is $LIB_TCP2])
+
+    CPP_TCP2=`CURL_EXPORT_PCDIR([$want_tcp2_path]) dnl
+      $PKGCONFIG --cflags-only-I libngtcp2`
+    AC_MSG_NOTICE([-I is $CPP_TCP2])
+
+    LD_TCP2=`CURL_EXPORT_PCDIR([$want_tcp2_path])
+      $PKGCONFIG --libs-only-L libngtcp2`
+    AC_MSG_NOTICE([-L is $LD_TCP2])
+
+    LDFLAGS="$LDFLAGS $LD_TCP2"
+    CPPFLAGS="$CPPFLAGS $CPP_TCP2"
+    LIBS="$LIB_TCP2 $LIBS"
+
+    if test "x$cross_compiling" != "xyes"; then
+      DIR_TCP2=`echo $LD_TCP2 | $SED -e 's/-L//'`
+    fi
+    AC_CHECK_LIB(ngtcp2, ngtcp2_conn_client_new,
+      [
+       AC_CHECK_HEADERS(ngtcp2/ngtcp2.h,
+          NGTCP2_ENABLED=1
+          AC_DEFINE(USE_NGTCP2, 1, [if ngtcp2 is in use])
+          AC_SUBST(USE_NGTCP2, [1])
+          CURL_LIBRARY_PATH="$CURL_LIBRARY_PATH:$DIR_TCP2"
+          export CURL_LIBRARY_PATH
+          AC_MSG_NOTICE([Added $DIR_TCP2 to CURL_LIBRARY_PATH])
+       )
+      ],
+        dnl not found, revert back to clean variables
+        LDFLAGS=$CLEANLDFLAGS
+        CPPFLAGS=$CLEANCPPFLAGS
+        LIBS=$CLEANLIBS
+    )
+
+  else
+    dnl no ngtcp2 pkg-config found, deal with it
+    if test X"$want_tcp2" != Xdefault; then
+      dnl To avoid link errors, we do not allow --with-ngtcp2 without
+      dnl a pkgconfig file
+      AC_MSG_ERROR([--with-ngtcp2 was specified but could not find ngtcp2 pkg-config file.])
+    fi
+  fi
+
+fi
+
+if test "x$NGTCP2_ENABLED" = "x1"; then
+  dnl backup the pre-ngtcp2_crypto_openssl variables
+  CLEANLDFLAGS="$LDFLAGS"
+  CLEANCPPFLAGS="$CPPFLAGS"
+  CLEANLIBS="$LIBS"
+
+  CURL_CHECK_PKGCONFIG(libngtcp2_crypto_openssl, $want_tcp2_path)
+
+  if test "$PKGCONFIG" != "no" ; then
+    LIB_NGTCP2_CRYPTO_OPENSSL=`CURL_EXPORT_PCDIR([$want_tcp2_path])
+      $PKGCONFIG --libs-only-l libngtcp2_crypto_openssl`
+    AC_MSG_NOTICE([-l is $LIB_NGTCP2_CRYPTO_OPENSSL])
+
+    CPP_NGTCP2_CRYPTO_OPENSSL=`CURL_EXPORT_PCDIR([$want_tcp2_path]) dnl
+      $PKGCONFIG --cflags-only-I libngtcp2_crypto_openssl`
+    AC_MSG_NOTICE([-I is $CPP_NGTCP2_CRYPTO_OPENSSL])
+
+    LD_NGTCP2_CRYPTO_OPENSSL=`CURL_EXPORT_PCDIR([$want_tcp2_path])
+      $PKGCONFIG --libs-only-L libngtcp2_crypto_openssl`
+    AC_MSG_NOTICE([-L is $LD_NGTCP2_CRYPTO_OPENSSL])
+
+    LDFLAGS="$LDFLAGS $LD_NGTCP2_CRYPTO_OPENSSL"
+    CPPFLAGS="$CPPFLAGS $CPP_NGTCP2_CRYPTO_OPENSSL"
+    LIBS="$LIB_NGTCP2_CRYPTO_OPENSSL $LIBS"
+
+    if test "x$cross_compiling" != "xyes"; then
+      DIR_NGTCP2_CRYPTO_OPENSSL=`echo $LD_NGTCP2_CRYPTO_OPENSSL | $SED -e 's/-L//'`
+    fi
+    AC_CHECK_LIB(ngtcp2_crypto_openssl, ngtcp2_crypto_ctx_initial,
+      [
+       AC_CHECK_HEADERS(ngtcp2/ngtcp2_crypto.h,
+          NGTCP2_ENABLED=1
+          AC_DEFINE(USE_NGTCP2_CRYPTO_OPENSSL, 1, [if ngtcp2_crypto_openssl is in use])
+          AC_SUBST(USE_NGTCP2_CRYPTO_OPENSSL, [1])
+          CURL_LIBRARY_PATH="$CURL_LIBRARY_PATH:$DIR_NGTCP2_CRYPTO_OPENSSL"
+          export CURL_LIBRARY_PATH
+          AC_MSG_NOTICE([Added $DIR_NGTCP2_CRYPTO_OPENSSL to CURL_LIBRARY_PATH])
+       )
+      ],
+        dnl not found, revert back to clean variables
+        LDFLAGS=$CLEANLDFLAGS
+        CPPFLAGS=$CLEANCPPFLAGS
+        LIBS=$CLEANLIBS
+    )
+
+  else
+    dnl no ngtcp2_crypto_openssl pkg-config found, deal with it
+    if test X"$want_tcp2" != Xdefault; then
+      dnl To avoid link errors, we do not allow --with-ngtcp2 without
+      dnl a pkgconfig file
+      AC_MSG_ERROR([--with-ngtcp2 was specified but could not find ngtcp2_crypto_openssl pkg-config file.])
+    fi
+  fi
+fi
+
+dnl **********************************************************************
+dnl Check for nghttp3 (HTTP/3 with ngtcp2)
+dnl **********************************************************************
+
+OPT_NGHTTP3="yes"
+
+if test "x$NGTCP2_ENABLED" = "x"; then
+  # without ngtcp2, nghttp3 is of no use for us
+  OPT_NGHTTP3="no"
+fi
+
+AC_ARG_WITH(nghttp3,
+AC_HELP_STRING([--with-nghttp3=PATH],[Enable nghttp3 usage])
+AC_HELP_STRING([--without-nghttp3],[Disable nghttp3 usage]),
+  [OPT_NGHTTP3=$withval])
+case "$OPT_NGHTTP3" in
+  no)
+    dnl --without-nghttp3 option used
+    want_nghttp3="no"
+    ;;
+  yes)
+    dnl --with-nghttp3 option used without path
+    want_nghttp3="default"
+    want_nghttp3_path=""
+    ;;
+  *)
+    dnl --with-nghttp3 option used with path
+    want_nghttp3="yes"
+    want_nghttp3_path="$withval/lib/pkgconfig"
+    ;;
+esac
+
+curl_http3_msg="disabled (--with-nghttp3)"
+if test X"$want_nghttp3" != Xno; then
+  dnl backup the pre-nghttp3 variables
+  CLEANLDFLAGS="$LDFLAGS"
+  CLEANCPPFLAGS="$CPPFLAGS"
+  CLEANLIBS="$LIBS"
+
+  CURL_CHECK_PKGCONFIG(libnghttp3, $want_nghttp3_path)
+
+  if test "$PKGCONFIG" != "no" ; then
+    LIB_NGHTTP3=`CURL_EXPORT_PCDIR([$want_nghttp3_path])
+      $PKGCONFIG --libs-only-l libnghttp3`
+    AC_MSG_NOTICE([-l is $LIB_NGHTTP3])
+
+    CPP_NGHTTP3=`CURL_EXPORT_PCDIR([$want_nghttp3_path]) dnl
+      $PKGCONFIG --cflags-only-I libnghttp3`
+    AC_MSG_NOTICE([-I is $CPP_NGHTTP3])
+
+    LD_NGHTTP3=`CURL_EXPORT_PCDIR([$want_nghttp3_path])
+      $PKGCONFIG --libs-only-L libnghttp3`
+    AC_MSG_NOTICE([-L is $LD_NGHTTP3])
+
+    LDFLAGS="$LDFLAGS $LD_NGHTTP3"
+    CPPFLAGS="$CPPFLAGS $CPP_NGHTTP3"
+    LIBS="$LIB_NGHTTP3 $LIBS"
+
+    if test "x$cross_compiling" != "xyes"; then
+      DIR_NGHTTP3=`echo $LD_NGHTTP3 | $SED -e 's/-L//'`
+    fi
+    AC_CHECK_LIB(nghttp3, nghttp3_conn_client_new,
+      [
+       AC_CHECK_HEADERS(nghttp3/nghttp3.h,
+          curl_h3_msg="enabled (ngtcp2 + nghttp3)"
+          NGHTTP3_ENABLED=1
+          AC_DEFINE(USE_NGHTTP3, 1, [if nghttp3 is in use])
+          AC_SUBST(USE_NGHTTP3, [1])
+          CURL_LIBRARY_PATH="$CURL_LIBRARY_PATH:$DIR_NGHTTP3"
+          export CURL_LIBRARY_PATH
+          AC_MSG_NOTICE([Added $DIR_NGHTTP3 to CURL_LIBRARY_PATH])
+          experimental="$experimental HTTP3"
+       )
+      ],
+        dnl not found, revert back to clean variables
+        LDFLAGS=$CLEANLDFLAGS
+        CPPFLAGS=$CLEANCPPFLAGS
+        LIBS=$CLEANLIBS
+    )
+
+  else
+    dnl no nghttp3 pkg-config found, deal with it
+    if test X"$want_nghttp3" != Xdefault; then
+      dnl To avoid link errors, we do not allow --with-nghttp3 without
+      dnl a pkgconfig file
+      AC_MSG_ERROR([--with-nghttp3 was specified but could not find nghttp3 pkg-config file.])
+    fi
+  fi
+
+fi
+
+dnl **********************************************************************
+dnl Check for quiche (QUIC)
+dnl **********************************************************************
+
+OPT_QUICHE="yes"
+
+if test "x$disable_http" = "xyes" -o "x$USE_NGTCP" = "x1"; then
+  # without HTTP or with ngtcp2, quiche is no use
+  OPT_QUICHE="no"
+fi
+
+AC_ARG_WITH(quiche,
+AC_HELP_STRING([--with-quiche=PATH],[Enable quiche usage])
+AC_HELP_STRING([--without-quiche],[Disable quiche usage]),
+  [OPT_QUICHE=$withval])
+case "$OPT_QUICHE" in
+  no)
+    dnl --without-quiche option used
+    want_quiche="no"
+    ;;
+  yes)
+    dnl --with-quiche option used without path
+    want_quiche="default"
+    want_quiche_path=""
+    ;;
+  *)
+    dnl --with-quiche option used with path
+    want_quiche="yes"
+    want_quiche_path="$withval"
+    ;;
+esac
+
+if test X"$want_quiche" != Xno; then
+  dnl backup the pre-quiche variables
+  CLEANLDFLAGS="$LDFLAGS"
+  CLEANCPPFLAGS="$CPPFLAGS"
+  CLEANLIBS="$LIBS"
+
+  CURL_CHECK_PKGCONFIG(quiche, $want_quiche_path)
+
+  if test "$PKGCONFIG" != "no" ; then
+    LIB_QUICHE=`CURL_EXPORT_PCDIR([$want_quiche_path])
+      $PKGCONFIG --libs-only-l quiche`
+    AC_MSG_NOTICE([-l is $LIB_QUICHE])
+
+    CPP_QUICHE=`CURL_EXPORT_PCDIR([$want_quiche_path]) dnl
+      $PKGCONFIG --cflags-only-I quiche`
+    AC_MSG_NOTICE([-I is $CPP_QUICHE])
+
+    LD_QUICHE=`CURL_EXPORT_PCDIR([$want_quiche_path])
+      $PKGCONFIG --libs-only-L quiche`
+    AC_MSG_NOTICE([-L is $LD_QUICHE])
+
+    LDFLAGS="$LDFLAGS $LD_QUICHE"
+    CPPFLAGS="$CPPFLAGS $CPP_QUICHE"
+    LIBS="$LIB_QUICHE $LIBS"
+
+    if test "x$cross_compiling" != "xyes"; then
+      DIR_QUICHE=`echo $LD_QUICHE | $SED -e 's/-L//'`
+    fi
+    AC_CHECK_LIB(quiche, quiche_connect,
+      [
+       AC_CHECK_HEADERS(quiche.h,
+          experimental="$experimental HTTP3"
+          AC_MSG_NOTICE([HTTP3 support is experimental])
+          curl_h3_msg="enabled (quiche)"
+          QUICHE_ENABLED=1
+          AC_DEFINE(USE_QUICHE, 1, [if quiche is in use])
+          AC_SUBST(USE_QUICHE, [1])
+          CURL_LIBRARY_PATH="$CURL_LIBRARY_PATH:$DIR_QUICHE"
+          export CURL_LIBRARY_PATH
+          AC_MSG_NOTICE([Added $DIR_QUICHE to CURL_LIBRARY_PATH]),
+       )
+      ],
+        dnl not found, revert back to clean variables
+        LDFLAGS=$CLEANLDFLAGS
+        CPPFLAGS=$CLEANCPPFLAGS
+        LIBS=$CLEANLIBS
+    )
+  else
+    dnl no nghttp3 pkg-config found, deal with it
+    if test X"$want_quiche" != Xdefault; then
+      dnl To avoid link errors, we do not allow --with-nghttp3 without
+      dnl a pkgconfig file
+      AC_MSG_ERROR([--with-quiche was specified but could not find quiche pkg-config file.])
+    fi
+  fi
+fi
+
+dnl **********************************************************************
 dnl Check for zsh completion path
 dnl **********************************************************************
 
@@ -3468,6 +3730,36 @@ case "$OPT_ZSH_FPATH" in
 esac
 
 dnl **********************************************************************
+dnl Check for fish completion path
+dnl **********************************************************************
+
+OPT_FISH_FPATH=default
+AC_ARG_WITH(fish-functions-dir,
+AC_HELP_STRING([--with-fish-functions-dir=PATH],[Install fish completions to PATH])
+AC_HELP_STRING([--without-fish-functions-dir],[Do not install fish completions]),
+  [OPT_FISH_FPATH=$withval])
+case "$OPT_FISH_FPATH" in
+  no)
+    dnl --without-fish-functions-dir option used
+    ;;
+  default|yes)
+    dnl --with-fish-functions-dir option used without path
+    CURL_CHECK_PKGCONFIG(fish)
+    if test "$PKGCONFIG" != "no" ; then
+      FISH_FUNCTIONS_DIR="$($PKGCONFIG --variable completionsdir fish)"
+    else
+      FISH_FUNCTIONS_DIR="$datarootdir/fish/vendor_completions.d"
+    fi
+    AC_SUBST(FISH_FUNCTIONS_DIR)
+    ;;
+  *)
+    dnl --with-fish-functions-dir option used with path
+    FISH_FUNCTIONS_DIR="$withval"
+    AC_SUBST(FISH_FUNCTIONS_DIR)
+    ;;
+esac
+
+dnl **********************************************************************
 dnl Back to "normal" configuring
 dnl **********************************************************************
 
@@ -3552,6 +3844,7 @@ dnl default includes
 ]
 )
 
+
 dnl Checks for typedefs, structures, and compiler characteristics.
 AC_C_CONST
 CURL_CHECK_VARIADIC_MACROS
@@ -3672,7 +3965,6 @@ CURL_CHECK_FUNC_CLOSESOCKET
 CURL_CHECK_FUNC_CLOSESOCKET_CAMEL
 CURL_CHECK_FUNC_CONNECT
 CURL_CHECK_FUNC_FCNTL
-CURL_CHECK_FUNC_FDOPEN
 CURL_CHECK_FUNC_FREEADDRINFO
 CURL_CHECK_FUNC_FREEIFADDRS
 CURL_CHECK_FUNC_FSETXATTR
@@ -3684,6 +3976,9 @@ CURL_CHECK_FUNC_GETHOSTBYADDR_R
 CURL_CHECK_FUNC_GETHOSTBYNAME
 CURL_CHECK_FUNC_GETHOSTBYNAME_R
 CURL_CHECK_FUNC_GETHOSTNAME
+CURL_CHECK_FUNC_GETPEERNAME
+CURL_CHECK_FUNC_GETSOCKNAME
+CURL_CHECK_FUNC_IF_NAMETOINDEX
 CURL_CHECK_FUNC_GETIFADDRS
 CURL_CHECK_FUNC_GETSERVBYPORT_R
 CURL_CHECK_FUNC_GMTIME_R
@@ -3743,6 +4038,7 @@ AC_CHECK_FUNCS([fnmatch \
   setlocale \
   setmode \
   setrlimit \
+  usleep \
   utime \
   utimes
 ],[
@@ -3767,14 +4063,6 @@ AC_CHECK_FUNCS([fnmatch \
   fi
 ])
 
-if test "$ipv6" = "yes"; then
-  if test "$curl_cv_func_getaddrinfo" = "yes"; then
-    AC_DEFINE(ENABLE_IPV6, 1, [Define if you want to enable IPv6 support])
-    IPV6_ENABLED=1
-    AC_SUBST(IPV6_ENABLED)
-  fi
-fi
-
 CURL_CHECK_NONBLOCKING_SOCKET
 
 dnl ************************************************************
@@ -4025,7 +4313,6 @@ AC_HELP_STRING([--disable-tls-srp],[Disable TLS-SRP authentication]),
 [ case "$enableval" in
   no)
        AC_MSG_RESULT(no)
-       AC_DEFINE(CURL_DISABLE_TLS_SRP, 1, [to disable TLS-SRP authentication])
        want_tls_srp=no
        ;;
   *)   AC_MSG_RESULT(yes)
@@ -4078,7 +4365,7 @@ fi
 dnl ************************************************************
 dnl disable cookies support
 dnl
-AC_MSG_CHECKING([whether to enable support for cookies])
+AC_MSG_CHECKING([whether to support cookies])
 AC_ARG_ENABLE(cookies,
 AC_HELP_STRING([--enable-cookies],[Enable cookies support])
 AC_HELP_STRING([--disable-cookies],[Disable cookies support]),
@@ -4094,6 +4381,187 @@ AC_HELP_STRING([--disable-cookies],[Disable cookies support]),
 )
 
 dnl ************************************************************
+dnl disable HTTP authentication support
+dnl
+AC_MSG_CHECKING([whether to support HTTP authentication])
+AC_ARG_ENABLE(http-auth,
+AC_HELP_STRING([--enable-http-auth],[Enable HTTP authentication support])
+AC_HELP_STRING([--disable-http-auth],[Disable HTTP authentication support]),
+[ case "$enableval" in
+  no)
+       AC_MSG_RESULT(no)
+       AC_DEFINE(CURL_DISABLE_HTTP_AUTH, 1, [disable HTTP authentication])
+       ;;
+  *)   AC_MSG_RESULT(yes)
+       ;;
+  esac ],
+       AC_MSG_RESULT(yes)
+)
+
+dnl ************************************************************
+dnl disable DoH support
+dnl
+AC_MSG_CHECKING([whether to support DoH])
+AC_ARG_ENABLE(doh,
+AC_HELP_STRING([--enable-doh],[Enable DoH support])
+AC_HELP_STRING([--disable-doh],[Disable DoH support]),
+[ case "$enableval" in
+  no)
+       AC_MSG_RESULT(no)
+       AC_DEFINE(CURL_DISABLE_DOH, 1, [disable DoH])
+       ;;
+  *)   AC_MSG_RESULT(yes)
+       ;;
+  esac ],
+       AC_MSG_RESULT(yes)
+)
+
+dnl ************************************************************
+dnl disable mime API support
+dnl
+AC_MSG_CHECKING([whether to support the MIME API])
+AC_ARG_ENABLE(mime,
+AC_HELP_STRING([--enable-mime],[Enable mime API support])
+AC_HELP_STRING([--disable-mime],[Disable mime API support]),
+[ case "$enableval" in
+  no)
+       AC_MSG_RESULT(no)
+       AC_DEFINE(CURL_DISABLE_MIME, 1, [disable mime API])
+       ;;
+  *)   AC_MSG_RESULT(yes)
+       ;;
+  esac ],
+       AC_MSG_RESULT(yes)
+)
+
+dnl ************************************************************
+dnl disable date parsing
+dnl
+AC_MSG_CHECKING([whether to support date parsing])
+AC_ARG_ENABLE(dateparse,
+AC_HELP_STRING([--enable-dateparse],[Enable date parsing])
+AC_HELP_STRING([--disable-dateparse],[Disable date parsing]),
+[ case "$enableval" in
+  no)
+       AC_MSG_RESULT(no)
+       AC_DEFINE(CURL_DISABLE_PARSEDATE, 1, [disable date parsing])
+       ;;
+  *)   AC_MSG_RESULT(yes)
+       ;;
+  esac ],
+       AC_MSG_RESULT(yes)
+)
+
+dnl ************************************************************
+dnl disable netrc
+dnl
+AC_MSG_CHECKING([whether to support netrc parsing])
+AC_ARG_ENABLE(netrc,
+AC_HELP_STRING([--enable-netrc],[Enable netrc parsing])
+AC_HELP_STRING([--disable-netrc],[Disable netrc parsing]),
+[ case "$enableval" in
+  no)
+       AC_MSG_RESULT(no)
+       AC_DEFINE(CURL_DISABLE_NETRC, 1, [disable netrc parsing])
+       ;;
+  *)   AC_MSG_RESULT(yes)
+       ;;
+  esac ],
+       AC_MSG_RESULT(yes)
+)
+
+dnl ************************************************************
+dnl disable progress-meter
+dnl
+AC_MSG_CHECKING([whether to support progress-meter])
+AC_ARG_ENABLE(progress-meter,
+AC_HELP_STRING([--enable-progress-meter],[Enable progress-meter])
+AC_HELP_STRING([--disable-progress-meter],[Disable progress-meter]),
+[ case "$enableval" in
+  no)
+       AC_MSG_RESULT(no)
+       AC_DEFINE(CURL_DISABLE_PROGRESS_METER, 1, [disable progress-meter])
+       ;;
+  *)   AC_MSG_RESULT(yes)
+       ;;
+  esac ],
+       AC_MSG_RESULT(yes)
+)
+
+dnl ************************************************************
+dnl disable shuffle DNS support
+dnl
+AC_MSG_CHECKING([whether to support DNS shuffling])
+AC_ARG_ENABLE(dnsshuffle,
+AC_HELP_STRING([--enable-dnsshuffle],[Enable DNS shuffling])
+AC_HELP_STRING([--disable-dnsshuffle],[Disable DNS shuffling]),
+[ case "$enableval" in
+  no)
+       AC_MSG_RESULT(no)
+       AC_DEFINE(CURL_DISABLE_SHUFFLE_DNS, 1, [disable DNS shuffling])
+       ;;
+  *)   AC_MSG_RESULT(yes)
+       ;;
+  esac ],
+       AC_MSG_RESULT(yes)
+)
+
+dnl ************************************************************
+dnl switch on/off alt-svc
+dnl
+curl_altsvc_msg="no      (--enable-alt-svc)";
+AC_MSG_CHECKING([whether to support alt-svc])
+AC_ARG_ENABLE(alt-svc,
+AC_HELP_STRING([--enable-alt-svc],[Enable alt-svc support])
+AC_HELP_STRING([--disable-alt-svc],[Disable alt-svc support]),
+[ case "$enableval" in
+  no)
+       AC_MSG_RESULT(no)
+       ;;
+  *) AC_MSG_RESULT(yes)
+       curl_altsvc_msg="enabled";
+       enable_altsvc="yes"
+       ;;
+  esac ],
+       AC_MSG_RESULT(no)
+)
+
+if test "$enable_altsvc" = "yes"; then
+  AC_DEFINE(USE_ALTSVC, 1, [to enable alt-svc])
+  experimental="$experimental alt-svc"
+fi
+
+dnl *************************************************************
+dnl check whether ESNI support, if desired, is actually available
+dnl
+if test "x$want_esni" != "xno"; then
+  AC_MSG_CHECKING([whether ESNI support is available])
+
+  dnl assume NOT and look for sufficient condition
+  ESNI_ENABLED=0
+  ESNI_SUPPORT=''
+
+  dnl OpenSSL with a chosen ESNI function should be enough
+  dnl so more exhaustive checking seems unnecessary for now
+  if test "x$OPENSSL_ENABLED" = "x1"; then
+    AC_CHECK_FUNCS(SSL_get_esni_status,
+      ESNI_SUPPORT="ESNI support available (OpenSSL with SSL_get_esni_status)"
+      ESNI_ENABLED=1)
+
+  dnl add 'elif' chain here for additional implementations
+  fi
+
+  dnl now deal with whatever we found
+  if test "x$ESNI_ENABLED" = "x1"; then
+    AC_DEFINE(USE_ESNI, 1, [if ESNI support is available])
+    AC_MSG_RESULT($ESNI_SUPPORT)
+    experimental="$experimental ESNI"
+  else
+    AC_MSG_ERROR([--enable-esni ignored: No ESNI support found])
+  fi
+fi
+
+dnl ************************************************************
 dnl hiding of library internal symbols
 dnl
 CURL_CONFIGURE_SYMBOL_HIDING
@@ -4162,10 +4630,14 @@ if test "x$HAVE_GSSAPI" = "x1"; then
   SUPPORT_FEATURES="$SUPPORT_FEATURES GSS-API"
 fi
 
-if test "x$curl_psl_msg" = "xyes"; then
+if test "x$curl_psl_msg" = "xenabled"; then
   SUPPORT_FEATURES="$SUPPORT_FEATURES PSL"
 fi
 
+if test "x$enable_altsvc" = "xyes"; then
+  SUPPORT_FEATURES="$SUPPORT_FEATURES alt-svc"
+fi
+
 if test "x$CURL_DISABLE_CRYPTO_AUTH" != "x1" -a \
     \( "x$HAVE_GSSAPI" = "x1" -o "x$USE_WINDOWS_SSPI" = "x1" \); then
   SUPPORT_FEATURES="$SUPPORT_FEATURES SPNEGO"
@@ -4179,7 +4651,7 @@ fi
 if test "x$CURL_DISABLE_CRYPTO_AUTH" != "x1"; then
   if test "x$OPENSSL_ENABLED" = "x1" -o "x$USE_WINDOWS_SSPI" = "x1" \
       -o "x$GNUTLS_ENABLED" = "x1" -o "x$MBEDTLS_ENABLED" = "x1" \
-      -o "x$NSS_ENABLED" = "x1" -o "x$DARWINSSL_ENABLED" = "x1"; then
+      -o "x$NSS_ENABLED" = "x1" -o "x$SECURETRANSPORT_ENABLED" = "x1"; then
     SUPPORT_FEATURES="$SUPPORT_FEATURES NTLM"
 
     if test "x$CURL_DISABLE_HTTP" != "x1" -a \
@@ -4197,6 +4669,10 @@ if test "x$USE_NGHTTP2" = "x1"; then
   SUPPORT_FEATURES="$SUPPORT_FEATURES HTTP2"
 fi
 
+if test "x$USE_NGTCP2" = "x1" -o "x$USE_QUICHE" = "x1"; then
+  SUPPORT_FEATURES="$SUPPORT_FEATURES HTTP3"
+fi
+
 if test "x$CURL_WITH_MULTI_SSL" = "x1"; then
   SUPPORT_FEATURES="$SUPPORT_FEATURES MultiSSL"
 fi
@@ -4206,6 +4682,10 @@ if test "x$OPENSSL_ENABLED" = "x1" -o "x$GNUTLS_ENABLED" = "x1" \
   SUPPORT_FEATURES="$SUPPORT_FEATURES HTTPS-proxy"
 fi
 
+if test "x$ESNI_ENABLED" = "x1"; then
+  SUPPORT_FEATURES="$SUPPORT_FEATURES ESNI"
+fi
+
 AC_SUBST(SUPPORT_FEATURES)
 
 dnl For supported protocols in pkg-config file
@@ -4261,7 +4741,7 @@ if test "x$CURL_DISABLE_SMB" != "x1" \
     -a "x$CURL_DISABLE_CRYPTO_AUTH" != "x1" \
     -a \( "x$OPENSSL_ENABLED" = "x1" -o "x$USE_WINDOWS_SSPI" = "x1" \
       -o "x$GNUTLS_ENABLED" = "x1" -o "x$MBEDTLS_ENABLED" = "x1" \
-      -o "x$NSS_ENABLED" = "x1" -o "x$DARWINSSL_ENABLED" = "x1" \); then
+      -o "x$NSS_ENABLED" = "x1" -o "x$SECURETRANSPORT_ENABLED" = "x1" \); then
   SUPPORT_PROTOCOLS="$SUPPORT_PROTOCOLS SMB"
   if test "x$SSL_ENABLED" = "x1"; then
     SUPPORT_PROTOCOLS="$SUPPORT_PROTOCOLS SMBS"
@@ -4340,17 +4820,7 @@ AC_CONFIG_FILES([Makefile \
            tests/libtest/Makefile \
            tests/unit/Makefile \
            packages/Makefile \
-           packages/Win32/Makefile \
-           packages/Win32/cygwin/Makefile \
-           packages/Linux/Makefile \
-           packages/Linux/RPM/Makefile \
-           packages/Linux/RPM/curl.spec \
-           packages/Linux/RPM/curl-ssl.spec \
-           packages/Solaris/Makefile \
            packages/vms/Makefile \
-           packages/AIX/Makefile \
-           packages/AIX/RPM/Makefile \
-           packages/AIX/RPM/curl.spec \
            curl-config \
            libcurl.pc
 ])
@@ -4362,34 +4832,49 @@ XC_AMEND_DISTCLEAN([lib src tests/unit tests/server tests/libtest docs/examples]
 
 AC_MSG_NOTICE([Configured to build curl/libcurl:
 
-  curl version:     ${CURLVERSION}
   Host setup:       ${host}
   Install prefix:   ${prefix}
   Compiler:         ${CC}
-  SSL support:      ${curl_ssl_msg}
-  SSH support:      ${curl_ssh_msg}
-  zlib support:     ${curl_zlib_msg}
-  brotli support:   ${curl_brotli_msg}
-  GSS-API support:  ${curl_gss_msg}
-  TLS-SRP support:  ${curl_tls_srp_msg}
+   CFLAGS:          ${CFLAGS}
+   CPPFLAGS:        ${CPPFLAGS}
+   LDFLAGS:         ${LDFLAGS}
+   LIBS:            ${LIBS}
+
+  curl version:     ${CURLVERSION}
+  SSL:              ${curl_ssl_msg}
+  SSH:              ${curl_ssh_msg}
+  zlib:             ${curl_zlib_msg}
+  brotli:           ${curl_brotli_msg}
+  GSS-API:          ${curl_gss_msg}
+  TLS-SRP:          ${curl_tls_srp_msg}
   resolver:         ${curl_res_msg}
-  IPv6 support:     ${curl_ipv6_msg}
-  Unix sockets support: ${curl_unix_sockets_msg}
-  IDN support:      ${curl_idn_msg}
+  IPv6:             ${curl_ipv6_msg}
+  Unix sockets:     ${curl_unix_sockets_msg}
+  IDN:              ${curl_idn_msg}
   Build libcurl:    Shared=${enable_shared}, Static=${enable_static}
   Built-in manual:  ${curl_manual_msg}
   --libcurl option: ${curl_libcurl_msg}
   Verbose errors:   ${curl_verbose_msg}
-  SSPI support:     ${curl_sspi_msg}
+  Code coverage:    ${curl_coverage_msg}
+  SSPI:             ${curl_sspi_msg}
   ca cert bundle:   ${ca}${ca_warning}
   ca cert path:     ${capath}${capath_warning}
   ca fallback:      ${with_ca_fallback}
-  LDAP support:     ${curl_ldap_msg}
-  LDAPS support:    ${curl_ldaps_msg}
-  RTSP support:     ${curl_rtsp_msg}
-  RTMP support:     ${curl_rtmp_msg}
-  metalink support: ${curl_mtlnk_msg}
-  PSL support:      ${curl_psl_msg}
-  HTTP2 support:    ${curl_h2_msg}
+  LDAP:             ${curl_ldap_msg}
+  LDAPS:            ${curl_ldaps_msg}
+  RTSP:             ${curl_rtsp_msg}
+  RTMP:             ${curl_rtmp_msg}
+  Metalink:         ${curl_mtlnk_msg}
+  PSL:              ${curl_psl_msg}
+  Alt-svc:          ${curl_altsvc_msg}
+  HTTP2:            ${curl_h2_msg}
+  HTTP3:            ${curl_h3_msg}
+  ESNI:             ${curl_esni_msg}
   Protocols:        ${SUPPORT_PROTOCOLS}
+  Features:         ${SUPPORT_FEATURES}
 ])
+if test -n "$experimental"; then
+ cat >&2 << _EOF
+  WARNING: $experimental enabled but marked EXPERIMENTAL. Use with caution!
+_EOF
+fi
diff --git a/docs/ALTSVC.md b/docs/ALTSVC.md
new file mode 100644 (file)
index 0000000..6a462bb
--- /dev/null
@@ -0,0 +1,39 @@
+# Alt-Svc
+
+curl features **EXPERIMENTAL** support for the Alt-Svc: HTTP header.
+
+## Enable Alt-Svc in build
+
+`./configure --enable-alt-svc`
+
+## Standard
+
+[RFC 7838](https://tools.ietf.org/html/rfc7838)
+
+# Alt-Svc cache file format
+
+This a text based file with one line per entry and each line consists of nine
+space separated fields.
+
+## Example
+
+    h2 quic.tech 8443 h3-22 quic.tech 8443 "20190808 06:18:37" 0 0
+
+## Fields
+
+1. The ALPN id for the source origin
+2. The host name for the source origin
+3. The port number for the source origin
+4. The ALPN id for the destination host
+5. The host name for the destination host
+6. The host number for the destination host
+7. The expiration date and time of this entry within double quotes. The date format is "YYYYMMDD HH:MM:SS" and the time zone is GMT.
+8. Boolean (1 or 0) if "persist" was set for this entry
+9. Integer priority value (not currently used)
+
+# TODO
+
+- handle multiple response headers, when one of them says `clear` (should
+  override them all)
+- using `Age:` value for caching age as per spec
+- `CURLALTSVC_IMMEDIATELY` support
index b3624b1..d0e80b8 100644 (file)
@@ -23,6 +23,8 @@ Requests](https://github.com/whoshuu/cpr) by Huu Nguyen
 Cocoa: [BBHTTP](https://github.com/brunodecarvalho/BBHTTP) written by Bruno de Carvalho
 [curlhandle](https://github.com/karelia/curlhandle) Written by Dan Wood
 
+Clojure: [clj-curl](https://github.com/lsevero/clj-curl) by Lucas Severo
+
 [D](https://dlang.org/library/std/net/curl.html) Written by Kenneth Bogert
 
 [Delphi](https://github.com/Mercury13/curl4delphi) Written by Mikhail Merkuryev
@@ -53,6 +55,8 @@ Go: [go-curl](https://github.com/andelf/go-curl) by ShuYu Wang
 
 [Julia](https://github.com/forio/Curl.jl) Written by Paul Howe
 
+[Kapito](https://github.com/puzza007/katipo) is an Erlang HTTP library around libcurl.
+
 [Lisp](https://common-lisp.net/project/cl-curl/) Written by Liam Healy
 
 Lua: [luacurl](http://luacurl.luaforge.net/) by Alexander Marinov, [Lua-cURL](https://github.com/Lua-cURL) by Jürgen Hötzel
@@ -61,6 +65,8 @@ Lua: [luacurl](http://luacurl.luaforge.net/) by Alexander Marinov, [Lua-cURL](ht
 
 [.NET](https://sourceforge.net/projects/libcurl-net/) libcurl-net by Jeffrey Phillips
 
+[Nim](https://nimble.directory/pkg/libcurl) wrapper for libcurl
+
 [node.js](https://github.com/JCMais/node-libcurl) node-libcurl by Jonathan Cardoso Machado
 
 [Object-Pascal](https://web.archive.org/web/20020610214926/www.tekool.com/opcurl) Free Pascal, Delphi and Kylix binding written by Christophe Espern.
@@ -69,14 +75,17 @@ Lua: [luacurl](http://luacurl.luaforge.net/) by Alexander Marinov, [Lua-cURL](ht
 
 [Pascal](https://web.archive.org/web/20030804091414/houston.quik.com/jkp/curlpas/) Free Pascal, Delphi and Kylix binding written by Jeffrey Pohlmeyer.
 
-Perl: [WWW--Curl](https://github.com/szbalint/WWW--Curl) Maintained by Cris
+Perl: [WWW::Curl](https://github.com/szbalint/WWW--Curl) Maintained by Cris
 Bailiff and Bálint Szilakszi,
 [perl6-net-curl](https://github.com/azawawi/perl6-net-curl) by Ahmad M. Zawawi
+[NET::Curl](https://metacpan.org/pod/Net::Curl) by Przemyslaw Iskra
 
 [PHP](https://php.net/curl) Originally written by Sterling Hughes
 
 [PostgreSQL](https://github.com/pramsey/pgsql-http) - HTTP client for PostgreSQL
 
+[PureBasic](https://www.purebasic.com/documentation/http/index.html) uses libcurl in its "native" HTTP subsystem
+
 [Python](http://pycurl.io/) PycURL by Kjetil Jacobsen
 
 [R](https://cran.r-project.org/package=curl)
diff --git a/docs/BUG-BOUNTY.md b/docs/BUG-BOUNTY.md
new file mode 100644 (file)
index 0000000..8ee9ac6
--- /dev/null
@@ -0,0 +1,106 @@
+# The curl bug bounty
+
+The curl project runs a bug bounty program in association with
+[HackerOne](https://www.hackerone.com) and the [Internet Bug
+Bounty](https://internetbugbounty.org).
+
+# How does it work?
+
+Start out by posting your suspected security vulnerability directly to [curl's
+HackerOne program](https://hackerone.com/curl).
+
+After you have reported a security issue, it has been deemed credible, and a
+patch and advisory has been made public, you may be eligible for a bounty from
+this program.
+
+See all details at [https://hackerone.com/curl](https://hackerone.com/curl)
+
+This bounty is relying on funds from sponsors. If you use curl professionally,
+consider help funding this! See
+[https://opencollective.com/curl](https://opencollective.com/curl) for
+details.
+
+# What are the reward amounts?
+
+The curl projects offer monetary compensation for reported and published
+security vulnerabilities. The amount of money that is rewarded depends on how
+serious the flaw is determined to be.
+
+We offer reward money *up to* a certain amount per severity. The curl security
+team determines the severity of each reported flaw on a case by case basis and
+the exact amount rewarded to the reporter is then decided.
+
+Check out the current award amounts at [https://hackerone.com/curl](https://hackerone.com/curl)
+
+# Who is eligible for a reward?
+
+Everyone and anyone who reports a security problem in a released curl version
+that hasn't already been reported can ask for a bounty.
+
+Vulnerabilities in features that are off by default and documented as
+experimental are not eligible for a reward.
+
+The vulnerability has to be fixed and publicly announced (by the curl project)
+before a bug bounty will be considered.
+
+Bounties need to be requested within twelve months from the publication of the
+vulnerability.
+
+The vulnerabilities must not have been made public before February 1st, 2019.
+We do not retroactively pay for old, already known, or published security
+problems.
+
+# Product vulnerabilities only
+
+This bug bounty only concerns the curl and libcurl products and thus their
+respective source codes - when running on existing hardware. It does not
+include documentation, websites, or other infrastructure.
+
+The curl security team will be the sole arbiter if a reported flaw can be
+subject to a bounty or not.
+
+# How are vulnerabilities graded?
+
+The grading of each reported vulnerability that makes a reward claim will be
+performed by the curl security team. The grading will be based on the CVSS
+(Common Vulnerability Scoring System) 3.0.
+
+# How are reward amounts determined?
+
+The curl security team first gives the vulnerability a score, as mentioned
+above, and based on that level we set an amount depending on the specifics of
+the individual case. Other sponsors of the program might also get involved and
+can raise the amounts depending on the particular issue.
+
+# What happens if the bounty fund is drained?
+
+The bounty fund depends on sponsors. If we pay out more bounties than we add,
+the fund will eventually drain. If that end up happening, we will simply not
+be able to pay out as high bounties as we would like and hope that we can
+convince new sponsors to help us top up the fund again.
+
+# Regarding taxes, etc. on the bounties
+
+In the event that the individual receiving a curl bug bounty needs to pay
+taxes on the reward money, the responsibility lies with the receiver. The
+curl project or its security team never actually receive any of this money,
+hold the money, or pay out the money.
+
+## Bonus levels
+
+In cooperation with [Dropbox](https://www.dropbox.com) the curl bug bounty can
+offer the highest levels of rewards if the issue covers one of the interest
+areas of theirs - and only if the bug is graded *high* or *critical*. A
+non-exhaustive list of vulnerabilities Dropbox is interested in are:
+
+ - RCE
+ - URL parsing vulnerabilities with demonstrable security impact
+
+Dropbox would generally hand out rewards for critical vulnerabilities ranging
+from 12k-32k USD where RCE is on the upper end of the spectrum.
+
+URL parsing vulnerabilities with demonstrable security impact might include
+incorrectly determining the authority of a URL when a special character is
+inserted into the path of the URL (as a hypothetical). This type of
+vulnerability would likely yield 6k-12k unless further impact could be
+demonstrated.
index 7322d9b..480e0ca 100644 (file)
--- a/docs/BUGS
+++ b/docs/BUGS
@@ -61,9 +61,14 @@ BUGS
   using our security development process.
 
   Security related bugs or bugs that are suspected to have a security impact,
-  should be reported by email to curl-security@haxx.se so that they first can
-  be dealt with away from the public to minimize the harm and impact it will
-  have on existing users out there who might be using the vulnerable versions.
+  should be reported on the curl security tracker at HackerOne:
+
+        https://hackerone.com/curl
+
+  This ensures that the report reaches the curl security team so that they
+  first can be deal with the report away from the public to minimize the harm
+  and impact it will have on existing users out there who might be using the
+  vulnerable versions.
 
   The curl project's process for handling security related issues is
   documented here:
index f246b57..10e2f4d 100644 (file)
@@ -30,6 +30,16 @@ Lists how to use the script and it lists all existing warnings it has and
 problems it detects. At the time of this writing, the existing checksrc
 warnings are:
 
+- `ASSIGNWITHINCONDITION`: Assignment within a conditional expression. The
+  code style mandates the assignment to be done outside of it.
+
+- `ASTERISKNOSPACE`: A pointer was declared like `char* name` instead of the more
+   appropriate `char *name` style. The asterisk should sit next to the name.
+
+- `ASTERISKSPACE`: A pointer was declared like `char * name` instead of the
+   more appropriate `char *name` style. The asterisk should sit right next to
+   the name without a space in between.
+
 - `BADCOMMAND`: There's a bad !checksrc! instruction in the code. See the
    **Ignore certain warnings** section below for details.
 
@@ -49,17 +59,32 @@ warnings are:
 
 - `FOPENMODE`: `fopen()` needs a macro for the mode string, use it
 
-- `INDENTATION`: detected a wrong start column for code. Note that this warning
-   only checks some specific places and will certainly miss many bad
+- `INDENTATION`: detected a wrong start column for code. Note that this
+   warning only checks some specific places and will certainly miss many bad
    indentations.
 
 - `LONGLINE`: A line is longer than 79 columns.
 
+- `MULTISPACE`: Multiple spaces were found where only one should be used.
+
+- `NOSPACEEQUALS`: An equals sign was found without preceding space. We prefer
+  `a = 2` and *not* `a=2`.
+
+- `OPENCOMMENT`: File ended with a comment (`/*`) still "open".
+
 - `PARENBRACE`: `){` was used without sufficient space in between.
 
 - `RETURNNOSPACE`: `return` was used without space between the keyword and the
    following value.
 
+- `SEMINOSPACE`: There was no space (or newline) following a semicolon.
+
+- `SIZEOFNOPAREN`: Found use of sizeof without parentheses. We prefer
+  `sizeof(int)` style.
+
+- `SNPRINTF` - Found use of `snprintf()`. Since we use an internal replacement
+   with a different return code etc, we prefer `msnprintf()`.
+
 - `SPACEAFTERPAREN`: there was a space after open parenthesis, `( text`.
 
 - `SPACEBEFORECLOSE`: there was a space before a close parenthesis, `text )`.
@@ -78,6 +103,19 @@ warnings are:
 - `UNUSEDIGNORE`: a checksrc inlined warning ignore was asked for but not used,
    that's an ignore that should be removed or changed to get used.
 
+### Extended warnings
+
+Some warnings are quite computationally expensive to perform, so they are
+turned off by default. To enable these warnings, place a `.checksrc` file in
+the directory where they should be activated with commands to enable the
+warnings you are interested in. The format of the file is to enable one
+warning per line like so: `enable <EXTENDEDWARNING>`
+
+Currently there is one extended warning which can be enabled:
+
+- `COPYRIGHTYEAR`: the current changeset hasn't updated the copyright year in
+   the source file
+
 ## Ignore certain warnings
 
 Due to the nature of the source code and the flaws of the checksrc tool, there
index 0d3be3b..19aedf3 100644 (file)
@@ -6,11 +6,12 @@ and
 [`--ciphers`](https://curl.haxx.se/docs/manpage.html#--ciphers)
 users can control which ciphers to consider when negotiating TLS connections.
 
-TLS 1.3 ciphers are supported since curl 7.61 with options
+TLS 1.3 ciphers are supported since curl 7.61 for OpenSSL 1.1.1+ with options
 [`CURLOPT_TLS13_CIPHERS`](https://curl.haxx.se/libcurl/c/CURLOPT_TLS13_CIPHERS.html)
 and
 [`--tls13-ciphers`](https://curl.haxx.se/docs/manpage.html#--tls13-ciphers)
-.
+. If you are using a different SSL backend you can try setting TLS 1.3 cipher
+suites by using the respective regular cipher option.
 
 The names of the known ciphers differ depending on which TLS backend that
 libcurl was built to use. This is an attempt to list known cipher names.
@@ -269,9 +270,16 @@ When specifying multiple cipher names, separate them with colon (`:`).
 `ecdhe_ecdsa_chacha20_poly1305_sha_256`
 `dhe_rsa_chacha20_poly1305_sha_256`
 
+### TLS 1.3 cipher suites
+
+`aes_128_gcm_sha_256`
+`aes_256_gcm_sha_384`
+`chacha20_poly1305_sha_256`
+
 ## GSKit
 
-Ciphers are internally defined as numeric codes (https://www.ibm.com/support/knowledgecenter/ssw_ibm_i_73/apis/gsk_attribute_set_buffer.htm),
+Ciphers are internally defined as
+[numeric codes](https://www.ibm.com/support/knowledgecenter/ssw_ibm_i_73/apis/gsk_attribute_set_buffer.htm),
 but libcurl maps them to the following case-insensitive names.
 
 ### SSL2 cipher suites (insecure: disabled by default)
@@ -446,9 +454,18 @@ but libcurl maps them to the following case-insensitive names.
 `DHE-PSK-CHACHA20-POLY1305`,
 `EDH-RSA-DES-CBC3-SHA`,
 
-## WinSSL
+## Schannel
+
+Schannel allows the enabling and disabling of encryption algorithms, but not
+specific ciphersuites. They are
+[defined](https://docs.microsoft.com/windows/desktop/SecCrypto/alg-id) by
+Microsoft.
 
-WinSSL allows the enabling and disabling of encryption algorithms, but not specific ciphersuites. They are defined by Microsoft (https://msdn.microsoft.com/en-us/library/windows/desktop/aa375549(v=vs.85).aspx)
+There is also the case that the selected algorithm is not supported by the
+protocol or does not match the ciphers offered by the server during the SSL
+negotiation. In this case curl will return error
+`CURLE_SSL_CONNECT_ERROR (35) SEC_E_ALGORITHM_MISMATCH`
+and the request will fail.
 
 `CALG_MD2`,
 `CALG_MD4`,
@@ -496,3 +513,4 @@ WinSSL allows the enabling and disabling of encryption algorithms, but not speci
 `CALG_ECDH`,
 `CALG_ECMQV`,
 `CALG_ECDSA`,
+`CALG_ECDH_EPHEM`,
index 2d275cd..0ceb5b9 100644 (file)
@@ -9,8 +9,8 @@ style is more important than individual contributors having their own personal
 tastes satisfied.
 
 Our C code has a few style rules. Most of them are verified and upheld by the
-"lib/checksrc.pl" script. Invoked with "make checksrc" or even by default by
-the build system when built after "./configure --enable-debug" has been used.
+`lib/checksrc.pl` script. Invoked with `make checksrc` or even by default by
+the build system when built after `./configure --enable-debug` has been used.
 
 It is normally not a problem for anyone to follow the guidelines, as you just
 need to copy the style already used in the source code and there are no
@@ -227,7 +227,7 @@ Align with the "current open" parenthesis:
 Use **#ifdef HAVE_FEATURE** to do conditional code. We avoid checking for
 particular operating systems or hardware in the #ifdef lines. The HAVE_FEATURE
 shall be generated by the configure script for unix-like systems and they are
-hard-coded in the config-[system].h files for the others.
+hard-coded in the `config-[system].h` files for the others.
 
 We also encourage use of macros/functions that possibly are empty or defined
 to constants when libcurl is built without that feature, to make the code
index caec3f4..978b87d 100644 (file)
@@ -20,8 +20,8 @@ Before posting to one of the curl mailing lists, please read up on the
 We also hang out on IRC in #curl on irc.freenode.net
 
 If you're at all interested in the code side of things, consider clicking
-'watch' on the [curl repo on github](https://github.com/curl/curl) to get
-notified on pull requests and new issues posted there.
+'watch' on the [curl repo on github](https://github.com/curl/curl) to be
+notified of pull requests and new issues posted there.
 
 ### License and copyright
 
@@ -155,7 +155,7 @@ to loose in the flood of many emails, like they sometimes do on the mailing
 lists.
 
 Every pull request submitted will automatically be tested in several different
-ways. Every pull request is verfied that:
+ways. Every pull request is verified for each of the following:
 
  - ... it still builds, warning-free, on Linux and macOS, with both
    clang and gcc
diff --git a/docs/CURL-DISABLE.md b/docs/CURL-DISABLE.md
new file mode 100644 (file)
index 0000000..83436b4
--- /dev/null
@@ -0,0 +1,110 @@
+# Code defines to disable features and protocols
+
+## CURL_DISABLE_COOKIES
+
+Disable support for HTTP cookies.
+
+## CURL_DISABLE_CRYPTO_AUTH
+
+Disable support for authentication methods using crypto.
+
+## CURL_DISABLE_DICT
+
+Disable the DICT protocol
+
+## CURL_DISABLE_DOH
+
+Disable DNS-over-HTTPS
+
+## CURL_DISABLE_FILE
+
+Disable the FILE protocol
+
+## CURL_DISABLE_FTP
+
+Disable the FTP (and FTPS) protocol
+
+## CURL_DISABLE_GOPHER
+
+Disable the GOPHER protocol.
+
+## CURL_DISABLE_HTTP
+
+Disable the HTTP(S) protocols. Note that this then also disable HTTP proxy
+support.
+
+## CURL_DISABLE_HTTP_AUTH
+
+Disable support for all HTTP authentication methods.
+
+## CURL_DISABLE_IMAP
+
+Disable the IMAP(S) protocols.
+
+## CURL_DISABLE_LDAP
+
+Disable the LDAP(S) protocols.
+
+## CURL_DISABLE_LDAPS
+
+Disable the LDAPS protocol.
+
+## CURL_DISABLE_LIBCURL_OPTION
+
+Disable the --libcurl option from the curl tool.
+
+## CURL_DISABLE_MIME
+
+Disable MIME support.
+
+## CURL_DISABLE_NETRC
+
+Disable the netrc parser.
+
+## CURL_DISABLE_OPENSSL_AUTO_LOAD_CONFIG
+
+Disable the auto load config support in the OpenSSL backend.
+
+## CURL_DISABLE_PARSEDATE
+
+Disable date parsing
+
+## CURL_DISABLE_POP
+
+Disable the POP(S) protocols
+
+## CURL_DISABLE_PROGRESS_METER
+
+Disable the built-in progress meter
+
+## CURL_DISABLE_PROXY
+
+Disable support for proxies
+
+## CURL_DISABLE_RTSP
+
+Disable the RTSP protocol.
+
+## CURL_DISABLE_SHUFFLE_DNS
+
+Disable the shuffle DNS feature
+
+## CURL_DISABLE_SMB
+
+Disable the SMB(S) protocols
+
+## CURL_DISABLE_SMTP
+
+Disable the SMTP(S) protocols
+
+## CURL_DISABLE_TELNET
+
+Disable the TELNET protocol
+
+## CURL_DISABLE_TFTP
+
+Disable the TFTP protocol
+
+## CURL_DISABLE_VERBOSE_STRINGS
+
+Disable verbose strings and error messages.
index 3ca7ee9..4f4ef8a 100644 (file)
@@ -5,88 +5,32 @@ email the curl-library mailing list as soon as possible and explain to us why
 this is a problem for you and how your use case can't be satisfied properly
 using a work around.
 
-## axTLS backend
+## PolarSSL
 
-Here are some complaints on axTLS.
+The polarssl TLS library has not had an update in over three years. The last
+release was done on [January 7
+2016](https://tls.mbed.org/tech-updates/releases). This library has been
+superseded by the mbedTLS library, which is the current incarnation of
+PolarSSL. curl has supported mbedTLS since 2015.
 
- - home page without HTTPS
- - [doesn't support modern TLS features like SNI](https://github.com/dsheets/axtls/issues/2)
- - [lacks support for modern ciphers](https://github.com/micropython/micropython/issues/3198)
- - [doesn't allow for outside bug report submissions](https://sourceforge.net/p/axtls/bugs/)
- - there's virtually no discussion about it in its [forum](https://sourceforge.net/p/axtls/discussion/)
-   nor [mailing list](https://sourceforge.net/p/axtls/mailman/axtls-general/)
+It seems unlikely that this library is a good choice for users to get proper
+TLS security and support today and at the same time there are plenty of good
+and updated alternatives.
 
-Combined, this list hints that this is not a library and project we should
-recommend to users.
+I consider it likely that the existing users of curl + polarssl out there are
+stuck on old curl versions and when they eventually manage to update curl they
+should also be able to update their TLS library.
 
 ### State
 
-Since June 1st, 2018 (curl 7.61.0) axTLS support is disabled in code and
-requires a small code change to build without errors. [See
-PR](https://github.com/curl/curl/pull/2628)
+In the curl 7.65.2 release (July 17, 2019) the ability to build with this TLS
+backend is removed from the configure script. The code remains and can be
+built and used going forward, but it has to be manually enabled in a build (or
+the configure removal reverted).
 
 ### Removal
 
-Remove all axTLS related code from curl on December 1st, exactly six months
-after previously mentioned commit. To be shipped on December 26, 2018
-(possibly called version 7.64.0)
-
-## HTTP pipelining
-
-HTTP pipelining is badly supported by curl in the sense that we have bugs and
-it is a fragile feature without enough tests. Also, when something turns out
-to have problems it is really tricky to debug due to the timing sensitivity so
-very often enabling debug outputs or similar completely changes the nature of
-the behavior and things are not reproducing anymore!
-
-HTTP pipelining was never enabled by default by the large desktop browsers due
-to all the issues with it. Both Firefox and Chrome have also dropped
-pipelining support entirely since a long time back now. We are in fact over
-time becoming more and more lonely in supporting pipelining.
-
-The bad state of HTTP pipelining was a primary driving factor behind HTTP/2
-and its multiplexing feature. HTTP/2 multiplexing is truly and really
-"pipelining done right". It is way more solid, practical and solves the use
-case in a better way with better performance and fewer downsides and problems.
-
-In 2018, pipelining *should* be abandoned and HTTP/2 should be used instead.
-
-### State
-
-In 7.62.0, we will add code that ignores the "enable pipeline" option
-setting). The *setopt() function would still return "OK" though so the
-application couldn't tell that this is happening.
-
-Users who truly need pipelining from that version will need to modify the code
-(ever so slightly) and rebuild.
-
-### Removal
-
-Six months later, in sync with the planned release happen in April 2019,
-(might be 7.66.0), assuming no major riots have occurred due to this in the
-mean time, we rip out the pipelining code. It is in the order of 1000 lines of
-libcurl code.
-
-Left to answer: should the *setopt() function start to return error when these
-options are set to be able to tell when they're trying to use options that are
-no longer around or should we maintain behavior as much as possible?
-
-## `CURLOPT_DNS_USE_GLOBAL_CACHE`
-
-This option makes libcurl use a global non-thread-safe cache for DNS if
-enabled. The option has been marked as "obsolete" in the header file and in
-documentation for several years already.
-
-There's proper and safe method alternative provided since many years: the
-share API.
-
-### State
-
-In curl 7.62.0 setting this option to TRUE will not have any effect. The
-global cache will not be enabled. The code still remains so it is easy to
-revert if need be.
-
-### Removal
-
-Remove all global-cache related code from curl around April 2019 (might be
-7.66.0).
+The support for PolarSSL and all code for it will be completely removed from
+the curl code base six months after it ships disabled in configure in a
+release. In the release on or near February 27, 2020. (possibly called curl
+7.70.0).
diff --git a/docs/ESNI.md b/docs/ESNI.md
new file mode 100644 (file)
index 0000000..7feaa75
--- /dev/null
@@ -0,0 +1,139 @@
+# TLS: ESNI support in curl and libcurl
+
+## Summary
+
+**ESNI** means **Encrypted Server Name Indication**, a TLS 1.3
+extension which is currently the subject of an
+[IETF Draft][tlsesni].
+
+This file is intended to show the latest current state of ESNI support
+in **curl** and **libcurl**.
+
+At end of August 2019, an [experimental fork of curl][niallorcurl],
+built using an [experimental fork of OpenSSL][sftcdopenssl], which in
+turn provided an implementation of ESNI, was demonstrated
+interoperating with a server belonging to the [DEfO
+Project][defoproj].
+
+Further sections here describe
+
+-   resources needed for building and demonstrating **curl** support
+    for ESNI,
+
+-   progress to date,
+
+-   TODO items, and
+
+-   additional details of specific stages of the progress.
+
+## Resources needed
+
+To build and demonstrate ESNI support in **curl** and/or **libcurl**,
+you will need
+
+-   a TLS library, supported by **libcurl**, which implements ESNI;
+
+-   an edition of **curl** and/or **libcurl** which supports the ESNI
+    implementation of the chosen TLS library;
+
+-   an environment for building and running **curl**, and at least
+    building **OpenSSL**;
+
+-   a server, supporting ESNI, against which to run a demonstration
+    and perhaps a specific target URL;
+
+-   some instructions.
+
+The following set of resources is currently known to be available.
+
+| Set  | Component    | Location                      | Remarks                                    |
+|:-----|:-------------|:------------------------------|:-------------------------------------------|
+| DEfO | TLS library  | [sftcd/openssl][sftcdopenssl] | Tag *esni-2019-08-30* avoids bleeding edge |
+|      | curl fork    | [niallor/curl][niallorcurl]   | Tag *esni-2019-08-30* likewise             |
+|      | instructions | [ESNI-README][niallorreadme]  |                                            |
+
+## Progress
+
+### PR 4011 (Jun 2019) expected in curl release 7.67.0 (Oct 2019)
+
+-   Details [below](#pr4011);
+
+-   New **curl** feature: `CURL_VERSION_ESNI`;
+
+-   New configuration option: `--enable-esni`;
+
+-   Build-time check for availability of resources needed for ESNI
+    support;
+
+-   Pre-processor symbol `USE_ESNI` for conditional compilation of
+    ESNI support code, subject to configuration option and
+    availability of needed resources.
+
+## TODO
+
+-   (next PR) Add libcurl options to set ESNI parameters.
+
+-   (next PR) Add curl tool command line options to set ESNI parameters.
+
+-   (WIP) Extend DoH functions so that published ESNI parameters can be
+    retrieved from DNS instead of being required as options.
+
+-   (WIP) Work with OpenSSL community to finalize ESNI API.
+
+-   Track OpenSSL ESNI API in libcurl
+
+-   Identify and implement any changes needed for CMake.
+
+-   Optimize build-time checking of available resources.
+
+-   Encourage ESNI support work on other TLS/SSL backends.
+
+## Additional detail
+
+### PR 4011
+
+**TLS: Provide ESNI support framework for curl and libcurl**
+
+The proposed change provides a framework to facilitate work to
+implement ESNI support in curl and libcurl. It is not intended
+either to provide ESNI functionality or to favour any particular
+TLS-providing backend. Specifically, the change reserves a
+feature bit for ESNI support (symbol `CURL_VERSION_ESNI`),
+implements setting and reporting of this bit, includes dummy
+book-keeping for the symbol, adds a build-time configuration
+option (`--enable-esni`), provides an extensible check for
+resources available to provide ESNI support, and defines a
+compiler pre-processor symbol (`USE_ESNI`) accordingly.
+
+Proposed-by: @niallor (Niall O'Reilly)\
+Encouraged-by: @sftcd (Stephen Farrell)\
+See-also: [this message](https://curl.haxx.se/mail/lib-2019-05/0108.html)
+
+Limitations:
+-   Book-keeping (symbols-in-versions) needs real release number, not 'DUMMY'.
+
+-   Framework is incomplete, as it covers autoconf, but not CMake.
+
+-   Check for available resources, although extensible, refers only to
+    specific work in progress ([described
+    here](https://github.com/sftcd/openssl/tree/master/esnistuff)) to
+    implement ESNI for OpenSSL, as this is the immediate motivation
+    for the proposed change.
+
+## References
+
+Cloudflare blog: [Encrypting SNI: Fixing One of the Core Internet Bugs][corebug]
+
+Cloudflare blog: [Encrypt it or lose it: how encrypted SNI works][esniworks]
+
+IETF Draft: [Encrypted Server Name Indication for TLS 1.3][tlsesni]
+
+---
+
+[tlsesni]:             https://datatracker.ietf.org/doc/draft-ietf-tls-esni/
+[esniworks]:   https://blog.cloudflare.com/encrypted-sni/
+[corebug]:             https://blog.cloudflare.com/esni/
+[defoproj]:            https://defo.ie/
+[sftcdopenssl]: https://github.com/sftcd/openssl/
+[niallorcurl]: https://github.com/niallor/curl/
+[niallorreadme]: https://github.com/niallor/curl/blob/master/ESNI-README.md
diff --git a/docs/EXPERIMENTAL.md b/docs/EXPERIMENTAL.md
new file mode 100644 (file)
index 0000000..6c33bcf
--- /dev/null
@@ -0,0 +1,22 @@
+# Experimental
+
+Some features and functionality in curl and libcurl are considered
+**EXPERIMENTAL**.
+
+Experimental support in curl means:
+
+1. Experimental features are provided to allow users to try them out and
+   provide feedback on functionality and API etc before they ship and get
+   "carved in stone".
+2. You must enable the feature when invoking configure as otherwise curl will
+   not be built with the feature present.
+3. We strongly advice against using this feature in production.
+4. **We reserve the right to change behavior** of the feature without sticking
+   to our API/ABI rules as we do for regular features, as long as it is marked
+   experimental.
+5. Experimental features are clearly marked so in documentation. Beware.
+
+## Experimental features right now
+
+ - HTTP/3 support and options
+ - alt-svc support and options
index 98de7b6..53f1c9e 100644 (file)
--- a/docs/FAQ
+++ b/docs/FAQ
@@ -43,8 +43,8 @@ FAQ
   3.9 How do I use curl in my favorite programming language?
   3.10 What about SOAP, WebDAV, XML-RPC or similar protocols over HTTP?
   3.11 How do I POST with a different Content-Type?
-  3.12 Why do FTP specific features over HTTP proxy fail?
-  3.13 Why does my single/double quotes fail?
+  3.12 Why do FTP-specific features over HTTP proxy fail?
+  3.13 Why do my single/double quotes fail?
   3.14 Does curl support Javascript or PAC (automated proxy config)?
   3.15 Can I do recursive fetches with curl?
   3.16 What certificates do I need when I use SSL?
@@ -72,7 +72,7 @@ FAQ
   4.8 I found a bug!
   4.9 Curl can't authenticate to the server that requires NTLM?
   4.10 My HTTP request using HEAD, PUT or DELETE doesn't work!
-  4.11 Why does my HTTP range requests return the full document?
+  4.11 Why do my HTTP range requests return the full document?
   4.12 Why do I get "certificate verify failed" ?
   4.13 Why is curl -R on Windows one hour off?
   4.14 Redirects work in browser but not with curl!
@@ -253,11 +253,10 @@ FAQ
   any way by the project.
 
   We still get help from companies. Haxx provides web site, bandwidth, mailing
-  lists etc, sourceforge.net hosts project services we take advantage from,
-  like the bug tracker, and GitHub hosts the primary git repository at
-  https://github.com/curl/curl. Also again, some companies have sponsored
-  certain parts of the development in the past and I hope some will continue to
-  do so in the future.
+  lists etc, GitHub hosts the primary git repository and other services like
+  the bug tracker at https://github.com/curl/curl. Also again, some companies
+  have sponsored certain parts of the development in the past and I hope some
+  will continue to do so in the future.
 
   If you want to support our project, consider a donation or a banner-program
   or even better: by helping us with coding, documenting or testing etc.
@@ -447,10 +446,10 @@ FAQ
   backends.
 
   curl can be built to use one of the following SSL alternatives: OpenSSL,
-  GnuTLS, yassl, NSS, PolarSSL, axTLS, Secure Transport (native iOS/OS X),
-  WinSSL (native Windows) or GSKit (native IBM i). They all have their pros
-  and cons, and we try to maintain a comparison of them here:
-  https://curl.haxx.se/docs/ssl-compared.html
+  libressl, BoringSSL, GnuTLS, wolfSSL, NSS, mbedTLS, MesaLink, Secure
+  Transport (native iOS/OS X), Schannel (native Windows), GSKit (native IBM
+  i), or BearSSL. They all have their pros and cons, and we try to maintain a
+  comparison of them here: https://curl.haxx.se/docs/ssl-compared.html
 
   2.3 Where can I find a copy of LIBEAY32.DLL?
 
@@ -484,7 +483,7 @@ FAQ
   and logs and check out why the configure script doesn't find the SSL libs
   and/or include files.
 
-  Also, check out the other paragraph in this FAQ labelled "configure doesn't
+  Also, check out the other paragraph in this FAQ labeled "configure doesn't
   find OpenSSL even when it is installed".
 
   3.2 How do I tell curl to resume a transfer?
@@ -558,10 +557,9 @@ FAQ
 
   3.9 How do I use curl in my favorite programming language?
 
-  There exist many language interfaces/bindings for curl that integrates it
-  better with various languages. If you are fluid in a script language, you
-  may very well opt to use such an interface instead of using the command line
-  tool.
+  Many programming languages have interfaces/bindings that allow you to use
+  curl without having to use the command line tool. If you are fluent in such
+  a language, you may prefer to use one of these interfaces instead.
 
   Find out more about which languages that support curl directly, and how to
   install and use them, in the libcurl section of the curl web site:
@@ -573,13 +571,14 @@ FAQ
   about bindings on the curl-library list too, but be prepared that people on
   that list may not know anything about bindings.
 
-  In October 2009, there were interfaces available for the following
-  languages: Ada95, Basic, C, C++, Ch, Cocoa, D, Dylan, Eiffel, Euphoria,
-  Ferite, Gambas, glib/GTK+, Haskell, ILE/RPG, Java, Lisp, Lua, Mono, .NET,
-  Object-Pascal, OCaml, Pascal, Perl, PHP, PostgreSQL, Python, R, Rexx, Ruby,
-  Scheme, S-Lang, Smalltalk, SP-Forth, SPL, Tcl, Visual Basic, Visual FoxPro,
-  Q, wxwidgets and XBLite. By the time you read this, additional ones may have
-  appeared!
+  In February 2019, there were interfaces available for the following
+  languages: Ada95, Basic, C, C++, Ch, Cocoa, D, Delphi, Dylan, Eiffel,
+  Euphoria, Falcon, Ferite, Gambas, glib/GTK+, Go, Guile, Harbour, Haskell,
+  Java, Julia, Lisp, Lua, Mono, .NET, node.js, Object-Pascal, OCaml, Pascal,
+  Perl, PHP, PostgreSQL, Python, R, Rexx, Ring, RPG, Ruby, Rust, Scheme,
+  Scilab, S-Lang, Smalltalk, SP-Forth, SPL, Tcl, Visual Basic, Visual FoxPro,
+  Q, wxwidgets, XBLite and Xoho. By the time you read this, additional ones
+  may have appeared!
 
   3.10 What about SOAP, WebDAV, XML-RPC or similar protocols over HTTP?
 
@@ -598,11 +597,11 @@ FAQ
 
         curl -d "datatopost" -H "Content-Type: text/xml" [URL]
 
-  3.12 Why do FTP specific features over HTTP proxy fail?
+  3.12 Why do FTP-specific features over HTTP proxy fail?
 
   Because when you use a HTTP proxy, the protocol spoken on the network will
   be HTTP, even if you specify a FTP URL. This effectively means that you
-  normally can't use FTP specific features such as FTP upload and FTP quote
+  normally can't use FTP-specific features such as FTP upload and FTP quote
   etc.
 
   There is one exception to this rule, and that is if you can "tunnel through"
@@ -610,7 +609,7 @@ FAQ
   and is generally not available as proxy admins usually disable tunneling to
   ports other than 443 (which is used for HTTPS access through proxies).
 
-  3.13 Why does my single/double quotes fail?
+  3.13 Why do my single/double quotes fail?
 
   To specify a command line option that includes spaces, you might need to
   put the entire option within quotes. Like in:
@@ -746,7 +745,7 @@ FAQ
   directory, you get the actual root directory.
 
   To specify a file in your user's home directory, you need to use the correct
-  URL syntax which for sftp might look similar to:
+  URL syntax which for SFTP might look similar to:
 
     curl -O -u user:password sftp://example.com/~/file.txt
 
@@ -895,7 +894,7 @@ FAQ
        <H1>Moved Permanently</H1> The document has moved <A
        HREF="http://same_url_now_with_a_trailing_slash/">here</A>.
 
-    it might be because you request a directory URL but without the trailing
+    it might be because you requested a directory URL but without the trailing
     slash. Try the same operation again _with_ the trailing URL, or use the
     -L/--location option to follow the redirection.
 
@@ -926,8 +925,8 @@ FAQ
   anyone would call security.
 
   Also note that regular HTTP (using Basic authentication) and FTP passwords
-  are sent in clear across the network. All it takes for anyone to fetch them
-  is to listen on the network.  Eavesdropping is very easy. Use more secure
+  are sent as cleartext across the network. All it takes for anyone to fetch
+  them is to listen on the network. Eavesdropping is very easy. Use more secure
   authentication methods (like Digest, Negotiate or even NTLM) or consider the
   SSL-based alternatives HTTPS and FTPS.
 
@@ -962,7 +961,7 @@ FAQ
   software you're trying to interact with. This is not anything curl can do
   anything about.
 
-  4.11 Why does my HTTP range requests return the full document?
+  4.11 Why do my HTTP range requests return the full document?
 
   Because the range may not be supported by the server, or the server may
   choose to ignore it and return the full document anyway.
@@ -1012,8 +1011,8 @@ FAQ
   redirects the browser to another given URL.
 
   There is no way to make curl follow these redirects. You must either
-  manually figure out what the page is set to do, or you write a script that
-  parses the results and fetches the new URL.
+  manually figure out what the page is set to do, or write a script that parses
+  the results and fetches the new URL.
 
   4.15 FTPS doesn't work
 
@@ -1025,7 +1024,7 @@ FAQ
   speak SSL. FTPS:// connections default to port 990.
 
   To use explicit FTPS, you use a FTP:// URL and the --ftp-ssl option (or one
-  of its related flavours). This is the most common method, and the one
+  of its related flavors). This is the most common method, and the one
   mandated by RFC4217. This kind of connection will then of course use the
   standard FTP port 21 by default.
 
@@ -1116,7 +1115,7 @@ FAQ
   an embedded device with only a single network connection) may want to act
   immediately if its lone network connection goes down.  That can be achieved
   by having the application monitor the network connection on its own using an
-  OS-specific mechanism, then signalling libcurl to abort (see also item 5.13).
+  OS-specific mechanism, then signaling libcurl to abort (see also item 5.13).
 
   4.20 curl doesn't return error for HTTP non-200 responses!
 
index 39ac390..68d38fc 100644 (file)
@@ -183,8 +183,7 @@ IMAPS (*1)
 FOOTNOTES
 =========
 
-  *1 = requires OpenSSL, GnuTLS, NSS, yassl, axTLS, PolarSSL, WinSSL (native
-       Windows), Secure Transport (native iOS/OS X) or GSKit (native IBM i)
+  *1 = requires a TLS library
   *2 = requires OpenLDAP or WinLDAP
   *3 = requires a GSS-API implementation (such as Heimdal or MIT Kerberos) or
        SSPI (native Windows)
@@ -197,8 +196,7 @@ FOOTNOTES
   *8 = requires libssh2
   *9 = requires OpenSSL, GnuTLS, mbedTLS, NSS, yassl, Secure Transport or SSPI
        (native Windows)
-  *10 = requires any of the SSL libraries in (*1) above other than axTLS, which
-        does not support SSLv3
+  *10 = requires an SSL library that supports SSLv3
   *11 = requires libidn or Windows
   *12 = requires libz
   *13 = requires libmetalink, and either an Apple or Microsoft operating
index 6de2eff..d49358b 100644 (file)
@@ -97,7 +97,7 @@ Anyone can aspire to become a curl maintainer.
 ### Duties
 
 There are no mandatory duties. We hope and wish that maintainers consider
-reviewing patches and help merching them, especially when the changes are
+reviewing patches and help merging them, especially when the changes are
 within the area of personal expertise and experience.
 
 ### Requirements
@@ -108,7 +108,7 @@ within the area of personal expertise and experience.
 
 ### Recommendations
 
-- please enable 2fa on your github account to reduce risk of malicious sourc
+- please enable 2fa on your github account to reduce risk of malicious source
   code tampering
 - consider enabling signed git commits for additional verification of changes
 
index a84ad8f..a628d05 100644 (file)
@@ -218,6 +218,8 @@ November:
 
 March: security vulnerability: libcurl Arbitrary File Access
 
+April: added CMake support
+
 August: security vulnerability: libcurl embedded zero in cert name
 
 December: Added support for IMAP, POP3 and SMTP
@@ -247,6 +249,13 @@ August:
 
  Gopher support added (re-added actually, see January 2006)
 
+2011
+----
+
+February: added support for the axTLS backend
+
+April: added the cyassl backend (later renamed to WolfSSL)
+
 2012
 ----
 
@@ -276,14 +285,31 @@ August:
 
  September: Web site had 245,000 unique visitors and served 236GB data
 
+ SMB and SMBS support
+
+2015
+----
+
+ June: support for multiplexing with HTTP/2
+
+ August: support for HTTP/2 server push
+
+ December: Public Suffix List
+
 2016
 ----
 
+ January: the curl tool defaults to HTTP/2 for HTTPS URLs
+
  December: curl 7.52.0 introduced support for HTTPS-proxy!
 
+ First TLS 1.3 support
+
 2017
 ----
 
+ July: OSS-Fuzz started fuzzing libcurl
+
  September: Added Multi-SSL support
 
  The web site serves 3100 GB/month
@@ -293,3 +319,41 @@ August:
     curl_easy_setopt() options:   249
     Public functions in libcurl:  74
     Contributors:                 1609
+
+ October: SSLKEYLOGFILE support, new MIME API
+
+ November: brotli
+
+2018
+----
+
+ January: new SSH backend powered by libssh
+
+ March: starting with the 1803 release of Windows 10, curl is shipped bundled
+ with Microsoft's operating system.
+
+ July: curl shows headers using bold type face
+
+ October: added DNS-over-HTTPS (DoH) and the URL API
+
+ MesaLink is a new supported TLS backend
+
+ libcurl now does HTTP/2 (and multiplexing) by default on HTTPS URLs
+
+ curl and libcurl are installed in an estimated 5 *billion* instances
+ world-wide.
+
+ October 31: Curl and libcurl 7.62.0
+
+    Public curl releases:         177
+    Command line options:         219
+    curl_easy_setopt() options:   261
+    Public functions in libcurl:  80
+    Contributors:                 1808
+
+2019
+----
+
+ August: the first HTTP/3 requests with curl.
+
+ September: 7.66.0 is released and the tool offers parallel downloads
index a1b2834..06790f8 100644 (file)
   original [Netscape spec from 1994](https://curl.haxx.se/rfc/cookie_spec.html).
 
   In 2011, [RFC6265](https://www.ietf.org/rfc/rfc6265.txt) was finally
-  published and details how cookies work within HTTP.
+  published and details how cookies work within HTTP. In 2016, an update which
+  added support for prefixes was
+  [proposed](https://tools.ietf.org/html/draft-ietf-httpbis-cookie-prefixes-00),
+  and in 2017, another update was
+  [drafted](https://tools.ietf.org/html/draft-ietf-httpbis-cookie-alone-01)
+  to deprecate modification of 'secure' cookies from non-secure origins. Both
+  of these drafts have been incorporated into a proposal to
+  [replace](https://tools.ietf.org/html/draft-ietf-httpbis-rfc6265bis-02)
+  RFC6265. Cookie prefixes and secure cookie modification protection has been
+  implemented by curl.
 
 ## Cookies saved to disk
 
index e20ce0c..5b4435f 100644 (file)
@@ -7,7 +7,7 @@ HTTP/2 with curl
 Build prerequisites
 -------------------
   - nghttp2
-  - OpenSSL, libressl, BoringSSL, NSS, GnutTLS, mbedTLS, wolfSSL or SChannel
+  - OpenSSL, libressl, BoringSSL, NSS, GnutTLS, mbedTLS, wolfSSL or Schannel
     with a new enough version.
 
 [nghttp2](https://nghttp2.org/)
@@ -61,7 +61,7 @@ the necessary TLS features. Right now we support:
   - NSS:              ALPN and NPN
   - GnuTLS:           ALPN
   - mbedTLS:          ALPN
-  - SChannel:         ALPN
+  - Schannel:         ALPN
   - wolfSSL:          ALPN
   - Secure Transport: ALPN
 
diff --git a/docs/HTTP3.md b/docs/HTTP3.md
new file mode 100644 (file)
index 0000000..c77f774
--- /dev/null
@@ -0,0 +1,115 @@
+# HTTP3 (and QUIC)
+
+## Resources
+
+[HTTP/3 Explained](https://daniel.haxx.se/http3-explained/) - the online free
+book describing the protocols involved.
+
+[QUIC implementation](https://github.com/curl/curl/wiki/QUIC-implementation) -
+the wiki page describing the plan for how to support QUIC and HTTP/3 in curl
+and libcurl.
+
+[quicwg.org](https://quicwg.org/) - home of the official protocol drafts
+
+## QUIC libraries
+
+QUIC libraries we're experimenting with:
+
+[ngtcp2](https://github.com/ngtcp2/ngtcp2)
+
+[quiche](https://github.com/cloudflare/quiche)
+
+## Experimental!
+
+HTTP/3 and QUIC support in curl is considered **EXPERIMENTAL** until further
+notice. It needs to be enabled at build-time.
+
+Further development and tweaking of the HTTP/3 support in curl will happen in
+in the master branch using pull-requests, just like ordinary changes.
+
+# ngtcp2 version
+
+## Build
+
+Build (patched) OpenSSL
+
+     % git clone --depth 1 -b openssl-quic-draft-23 https://github.com/tatsuhiro-t/openssl
+     % cd openssl
+     % ./config enable-tls1_3 --prefix=<somewhere1>
+     % make
+     % make install_sw
+
+Build nghttp3
+
+     % cd ..
+     % git clone https://github.com/ngtcp2/nghttp3
+     % cd nghttp3
+     % autoreconf -i
+     % ./configure --prefix=<somewhere2> --enable-lib-only
+     % make
+     % make install
+
+Build ngtcp2
+
+     % cd ..
+     % git clone https://github.com/ngtcp2/ngtcp2
+     % cd ngtcp2
+     % autoreconf -i
+     % ./configure PKG_CONFIG_PATH=<somewhere1>/lib/pkgconfig:<somewhere2>/lib/pkgconfig LDFLAGS="-Wl,-rpath,<somewhere1>/lib" --prefix=<somewhere3>
+     % make
+     % make install
+
+Build curl
+
+     % cd ..
+     % git clone https://github.com/curl/curl
+     % cd curl
+     % ./buildconf
+     % LDFLAGS="-Wl,-rpath,<somewhere1>/lib" ./configure --with-ssl=<somewhere1> --with-nghttp3=<somewhere2> --with-ngtcp2=<somewhere3>
+     % make
+
+# quiche version
+
+## build
+
+Clone quiche and BoringSSL:
+
+     % git clone --recursive https://github.com/cloudflare/quiche
+
+Build BoringSSL (it needs to be built manually so it can be reused with curl):
+
+     % cd quiche/deps/boringssl
+     % mkdir build
+     % cd build
+     % cmake -DCMAKE_POSITION_INDEPENDENT_CODE=on ..
+     % make
+     % cd ..
+     % mkdir -p .openssl/lib
+     % cp build/crypto/libcrypto.a build/ssl/libssl.a .openssl/lib
+     % ln -s $PWD/include .openssl
+
+Build quiche:
+
+     % cd ../..
+     % QUICHE_BSSL_PATH=$PWD/deps/boringssl cargo build --release --features pkg-config-meta
+
+Clone and build curl:
+
+     % cd ..
+     % git clone https://github.com/curl/curl
+     % cd curl
+     % ./buildconf
+     % ./configure LDFLAGS="-Wl,-rpath,$PWD/../quiche/target/release" --with-ssl=$PWD/../quiche/deps/boringssl/.openssl --with-quiche=$PWD/../quiche/target/release
+     % make
+
+## Run
+
+Use HTTP/3 directly:
+
+    curl --http3 https://nghttp2.org:8443/
+
+Upgrade via Alt-Svc:
+
+    curl --alt-svc altsvc.cache https://quic.aiortc.org/
+
+See this [list of public HTTP/3 servers](https://bagder.github.io/HTTP3-test/)
index 7d36557..380f3b3 100644 (file)
@@ -7,6 +7,18 @@ document does not describe how to install curl or libcurl using such a binary
 package. This document describes how to compile, build and install curl and
 libcurl from source code.
 
+## Building using vcpkg
+
+You can download and install curl and libcurl using the [vcpkg](https://github.com/Microsoft/vcpkg/) dependency manager:
+
+    git clone https://github.com/Microsoft/vcpkg.git
+    cd vcpkg
+    ./bootstrap-vcpkg.sh
+    ./vcpkg integrate install
+    vcpkg install curl[tool]
+
+The curl port in vcpkg is kept up to date by Microsoft team members and community contributors. If the version is out of date, please [create an issue or pull request](https://github.com/Microsoft/vcpkg) on the vcpkg repository.
+
 ## Building from git
 
 If you get your code off a git repository instead of a release tarball, see
@@ -56,15 +68,15 @@ you have pkg-config installed, set the pkg-config path first, like this:
 
 Without pkg-config installed, use this:
 
-   ./configure --with-ssl=/opt/OpenSSL
+    ./configure --with-ssl=/opt/OpenSSL
 
 If you insist on forcing a build without SSL support, even though you may
 have OpenSSL installed in your system, you can run configure like this:
 
-   ./configure --without-ssl
+    ./configure --without-ssl
 
 If you have OpenSSL installed, but with the libraries in one place and the
-header files somewhere else, you have to set the LDFLAGS and CPPFLAGS
+header files somewhere else, you have to set the `LDFLAGS` and `CPPFLAGS`
 environment variables prior to running configure.  Something like this should
 work:
 
@@ -101,14 +113,14 @@ The default OpenSSL configure check will also detect and use BoringSSL or
 libressl.
 
  - GnuTLS: `--without-ssl --with-gnutls`.
- - Cyassl: `--without-ssl --with-cyassl`
+ - wolfSSL: `--without-ssl --with-wolfssl`
  - NSS: `--without-ssl --with-nss`
  - PolarSSL: `--without-ssl --with-polarssl`
  - mbedTLS: `--without-ssl --with-mbedtls`
- - axTLS: `--without-ssl --with-axtls`
- - schannel: `--without-ssl --with-winssl`
- - secure transport: `--without-ssl --with-darwinssl`
+ - schannel: `--without-ssl --with-schannel`
+ - secure transport: `--without-ssl --with-secure-transport`
  - MesaLink: `--without-ssl --with-mesalink`
+ - BearSSL: `--without-ssl --with-bearssl`
 
 # Windows
 
@@ -122,9 +134,9 @@ libressl.
  KB140584 is a must for any Windows developer. Especially important is full
  understanding if you are not going to follow the advice given above.
 
- - [How To Use the C Run-Time](https://support.microsoft.com/kb/94248/en-us)
- - [How to link with the correct C Run-Time CRT library](https://support.microsoft.com/kb/140584/en-us)
- - [Potential Errors Passing CRT Objects Across DLL Boundaries](https://msdn.microsoft.com/en-us/library/ms235460)
+ - [How To Use the C Run-Time](https://support.microsoft.com/help/94248/how-to-use-the-c-run-time)
+ - [Run-Time Library Compiler Options](https://docs.microsoft.com/cpp/build/reference/md-mt-ld-use-run-time-library)
+ - [Potential Errors Passing CRT Objects Across DLL Boundaries](https://docs.microsoft.com/cpp/c-runtime-library/potential-errors-passing-crt-objects-across-dll-boundaries)
 
 If your app is misbehaving in some strange way, or it is suffering from
 memory corruption, before asking for further help, please try first to
@@ -149,7 +161,7 @@ make targets available to build libcurl with more features, use:
    and SSPI support.
 
 If you have any problems linking libraries or finding header files, be sure
-to verify that the provided "Makefile.m32" files use the proper paths, and
+to verify that the provided `Makefile.m32` files use the proper paths, and
 adjust as necessary. It is also possible to override these paths with
 environment variables, for example:
 
@@ -173,8 +185,8 @@ If you want to enable LDAPS support then set LDAPS=1.
 ## Cygwin
 
 Almost identical to the unix installation. Run the configure script in the
-curl source tree root with `sh configure`. Make sure you have the sh
-executable in /bin/ or you'll see the configure fail toward the end.
+curl source tree root with `sh configure`. Make sure you have the `sh`
+executable in `/bin/` or you'll see the configure fail toward the end.
 
 Run `make`
 
@@ -184,26 +196,14 @@ The configure utility, unfortunately, is not available for the Windows
 environment, therefore, you cannot use the various disable-protocol options of
 the configure utility on this platform.
 
-However, you can use the following defines to disable specific
-protocols:
-
- - `HTTP_ONLY`             disables all protocols except HTTP
- - `CURL_DISABLE_FTP`      disables FTP
- - `CURL_DISABLE_LDAP`     disables LDAP
- - `CURL_DISABLE_TELNET`   disables TELNET
- - `CURL_DISABLE_DICT`     disables DICT
- - `CURL_DISABLE_FILE`     disables FILE
- - `CURL_DISABLE_TFTP`     disables TFTP
- - `CURL_DISABLE_HTTP`     disables HTTP
- - `CURL_DISABLE_IMAP`     disables IMAP
- - `CURL_DISABLE_POP3`     disables POP3
- - `CURL_DISABLE_SMTP`     disables SMTP
+You can use specific defines to disable specific protocols and features. See
+[CURL-DISABLE.md](CURL-DISABLE-md) for the full list.
 
 If you want to set any of these defines you have the following options:
 
- - Modify lib/config-win32.h
- - Modify lib/curl_setup.h
- - Modify winbuild/Makefile.vc
+ - Modify `lib/config-win32.h`
+ - Modify `lib/curl_setup.h`
+ - Modify `winbuild/Makefile.vc`
  - Modify the "Preprocessor Definitions" in the libcurl project
 
 Note: The pre-processor settings can be found using the Visual Studio IDE
@@ -214,12 +214,12 @@ versions.
 ## Using BSD-style lwIP instead of Winsock TCP/IP stack in Win32 builds
 
 In order to compile libcurl and curl using BSD-style lwIP TCP/IP stack it is
-necessary to make definition of preprocessor symbol USE_LWIPSOCK visible to
+necessary to make definition of preprocessor symbol `USE_LWIPSOCK` visible to
 libcurl and curl compilation processes. To set this definition you have the
 following alternatives:
 
- - Modify lib/config-win32.h and src/config-win32.h
- - Modify winbuild/Makefile.vc
+ - Modify `lib/config-win32.h` and `src/config-win32.h`
+ - Modify `winbuild/Makefile.vc`
  - Modify the "Preprocessor Definitions" in the libcurl project
 
 Note: The pre-processor settings can be found using the Visual Studio IDE
@@ -249,13 +249,13 @@ look for dynamic import symbols.
 
 ## Legacy Windows and SSL
 
-WinSSL (specifically SChannel from Windows SSPI), is the native SSL library in
-Windows. However, WinSSL in Windows <= XP is unable to connect to servers that
+Schannel (from Windows SSPI), is the native SSL library in Windows. However,
+Schannel in Windows <= XP is unable to connect to servers that
 no longer support the legacy handshakes and algorithms used by those
 versions. If you will be using curl in one of those earlier versions of
 Windows you should choose another SSL backend such as OpenSSL.
 
-# Apple iOS and Mac OS X
+# Apple iOS and macOS
 
 On modern Apple operating systems, curl can be built to use Apple's SSL/TLS
 implementation, Secure Transport, instead of OpenSSL. To build with Secure
@@ -270,12 +270,12 @@ the server. This, of course, includes the root certificates that ship with the
 OS. The `--cert` and `--engine` options, and their libcurl equivalents, are
 currently unimplemented in curl with Secure Transport.
 
-For OS X users: In OS X 10.8 ("Mountain Lion"), Apple made a major overhaul to
-the Secure Transport API that, among other things, added support for the newer
-TLS 1.1 and 1.2 protocols. To get curl to support TLS 1.1 and 1.2, you must
-build curl on Mountain Lion or later, or by using the equivalent SDK. If you
-set the `MACOSX_DEPLOYMENT_TARGET` environmental variable to an earlier
-version of OS X prior to building curl, then curl will use the new Secure
+For macOS users: In OS X 10.8 ("Mountain Lion"), Apple made a major overhaul
+to the Secure Transport API that, among other things, added support for the
+newer TLS 1.1 and 1.2 protocols. To get curl to support TLS 1.1 and 1.2, you
+must build curl on Mountain Lion or later, or by using the equivalent SDK. If
+you set the `MACOSX_DEPLOYMENT_TARGET` environmental variable to an earlier
+version of macOS prior to building curl, then curl will use the new Secure
 Transport API on Mountain Lion and later, and fall back on the older API when
 the same curl binary is executed on older cats. For example, running these
 commands in curl's directory in the shell will build the code such that it
@@ -285,11 +285,52 @@ will run on cats as old as OS X 10.6 ("Snow Leopard") (using bash):
     ./configure --with-darwinssl
     make
 
+# Android
+
+When building curl for Android it's recommended to use a Linux environment
+since using curl's `configure` script is the easiest way to build curl
+for Android. Before you can build curl for Android, you need to install the
+Android NDK first. This can be done using the SDK Manager that is part of
+Android Studio. Once you have installed the Android NDK, you need to figure out
+where it has been installed and then set up some environment variables before
+launching `configure`. On macOS, those variables could look like this to compile
+for `aarch64` and API level 29:
+
+    export NDK=~/Library/Android/sdk/ndk/20.1.5948944
+    export HOST_TAG=darwin-x86_64
+    export TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/$HOST_TAG
+    export AR=$TOOLCHAIN/bin/aarch64-linux-android-ar
+    export AS=$TOOLCHAIN/bin/aarch64-linux-android-as
+    export CC=$TOOLCHAIN/bin/aarch64-linux-android29-clang
+    export CXX=$TOOLCHAIN/bin/aarch64-linux-android29-clang++
+    export LD=$TOOLCHAIN/bin/aarch64-linux-android-ld
+    export RANLIB=$TOOLCHAIN/bin/aarch64-linux-android-ranlib
+    export STRIP=$TOOLCHAIN/bin/aarch64-linux-android-strip
+
+When building on Linux or targeting other API levels or architectures, you need
+to adjust those variables accordingly. After that you can build curl like this:
+
+    ./configure --host aarch64-linux-android --with-pic --disable-shared
+
+Note that this won't give you SSL/TLS support. If you need SSL/TLS, you have
+to build curl against a SSL/TLS layer, e.g. OpenSSL, because it's impossible for
+curl to access Android's native SSL/TLS layer. To build curl for Android using
+OpenSSL, follow the OpenSSL build instructions and then install `libssl.a` and
+`libcrypto.a` to `$TOOLCHAIN/sysroot/usr/lib` and copy `include/openssl` to
+`$TOOLCHAIN/sysroot/usr/include`. Now you can build curl for Android using
+OpenSSL like this:
+    
+    ./configure --host aarch64-linux-android --with-pic --disable-shared --with-ssl="$TOOLCHAIN/sysroot/usr"
+
+Note, however, that you must target at least Android M (API level 23) or `configure`
+won't be able to detect OpenSSL since `stderr` (and the like) weren't defined
+before Android M.
+
 # Cross compile
 
 Download and unpack the curl package.
 
-'cd' to the new directory. (e.g. `cd curl-7.12.3`)
+`cd` to the new directory. (e.g. `cd curl-7.12.3`)
 
 Set environment variables to point to the cross-compile toolchain and call
 configure with any options you need.  Be sure and specify the `--host` and
@@ -328,7 +369,7 @@ In some cases, you may be able to simplify the above commands to as little as:
 
 There are a number of configure options that can be used to reduce the size of
 libcurl for embedded applications where binary size is an important factor.
-First, be sure to set the CFLAGS variable when configuring with any relevant
+First, be sure to set the `CFLAGS` variable when configuring with any relevant
 compiler optimization flags to reduce the size of the binary.  For gcc, this
 would mean at minimum the -Os option, and potentially the `-march=X`,
 `-mdynamic-no-pic` and `-flto` options as well, e.g.
@@ -361,8 +402,8 @@ use, here are some other flags that can reduce the size of the library:
 
 The GNU compiler and linker have a number of options that can reduce the
 size of the libcurl dynamic libraries on some platforms even further.
-Specify them by providing appropriate CFLAGS and LDFLAGS variables on the
-configure command-line, e.g.
+Specify them by providing appropriate `CFLAGS` and `LDFLAGS` variables on
+the configure command-line, e.g.
 
     CFLAGS="-Os -ffunction-sections -fdata-sections
             -fno-unwind-tables -fno-asynchronous-unwind-tables -flto"
@@ -384,7 +425,7 @@ in a lower total size than dynamically linking.
 Note that the curl test harness can detect the use of some, but not all, of
 the `--disable` statements suggested above. Use will cause tests relying on
 those features to fail.  The test harness can be manually forced to skip the
-relevant tests by specifying certain key words on the runtests.pl command
+relevant tests by specifying certain key words on the `runtests.pl` command
 line.  Following is a list of appropriate key words:
 
  - `--disable-cookies`          !cookies
index d1c4c62..9ae7228 100644 (file)
@@ -7,13 +7,13 @@ curl internals
  - [Windows vs Unix](#winvsunix)
  - [Library](#Library)
    - [`Curl_connect`](#Curl_connect)
-   - [`Curl_do`](#Curl_do)
+   - [`multi_do`](#multi_do)
    - [`Curl_readwrite`](#Curl_readwrite)
-   - [`Curl_done`](#Curl_done)
+   - [`multi_done`](#multi_done)
    - [`Curl_disconnect`](#Curl_disconnect)
  - [HTTP(S)](#http)
  - [FTP](#ftp)
  - [Kerberos](#kerberos)
+ - [Kerberos](#kerberos)
  - [TELNET](#telnet)
  - [FILE](#file)
  - [SMB](#smb)
@@ -34,10 +34,17 @@ curl internals
  - [`curl_off_t`](#curl_off_t)
  - [curlx](#curlx)
  - [Content Encoding](#contentencoding)
- - [hostip.c explained](#hostip)
+ - [`hostip.c` explained](#hostip)
  - [Track Down Memory Leaks](#memoryleak)
  - [`multi_socket`](#multi_socket)
  - [Structs in libcurl](#structs)
+   - [Curl_easy](#Curl_easy)
+   - [connectdata](#connectdata)
+   - [Curl_multi](#Curl_multi)
+   - [Curl_handler](#Curl_handler)
+   - [conncache](#conncache)
+   - [Curl_share](#Curl_share)
+   - [CookieInfo](#CookieInfo)
 
 <a name="intro"></a>
 Intro
@@ -66,7 +73,7 @@ git
 Portability
 ===========
 
- We write curl and libcurl to compile with C89 compilers.  On 32bit and up
+ We write curl and libcurl to compile with C89 compilers.  On 32-bit and up
  machines. Most of libcurl assumes more or less POSIX compliance but that's
  not a requirement.
 
@@ -83,12 +90,11 @@ Dependencies
  - libssh2      0.16
  - c-ares       1.6.0
  - libidn2      2.0.0
- - cyassl       2.0.0
+ - wolfSSL      2.0.0
  - openldap     2.0
  - MIT Kerberos 1.2.4
  - GSKit        V5R3M0
  - NSS          3.14.x
- - axTLS        2.1.0
  - PolarSSL     1.3.0
  - Heimdal      ?
  - nghttp2      1.0.0
@@ -119,7 +125,7 @@ Build tools
  - GNU M4       1.4
  - perl         5.004
  - roffit       0.5
- - groff        ? (any version that supports "groff -Tps -man [in] [out]")
+ - groff        ? (any version that supports `groff -Tps -man [in] [out]`)
  - ps2pdf (gs)  ?
 
 <a name="winvsunix"></a>
@@ -133,7 +139,7 @@ Windows vs Unix
 
    In curl, this is solved with defines and macros, so that the source looks
    the same in all places except for the header file that defines them. The
-   macros in use are sclose(), sread() and swrite().
+   macros in use are `sclose()`, `sread()` and `swrite()`.
 
  2. Windows requires a couple of init calls for the socket stuff.
 
@@ -172,14 +178,14 @@ Library
  There are plenty of entry points to the library, namely each publicly defined
  function that libcurl offers to applications. All of those functions are
  rather small and easy-to-follow. All the ones prefixed with `curl_easy` are
- put in the lib/easy.c file.
+ put in the `lib/easy.c` file.
 
  `curl_global_init()` and `curl_global_cleanup()` should be called by the
  application to initialize and clean up global stuff in the library. As of
  today, it can handle the global SSL initing if SSL is enabled and it can init
  the socket layer on windows machines. libcurl itself has no "global" scope.
 
- All printf()-style functions use the supplied clones in lib/mprintf.c. This
+ All printf()-style functions use the supplied clones in `lib/mprintf.c`. This
  makes sure we stay absolutely platform independent.
 
  [ `curl_easy_init()`][2] allocates an internal struct and makes some
@@ -198,8 +204,8 @@ Library
  `curl_multi_wait()`, and `curl_multi_perform()` until the transfer is done
  and then returns.
 
- Some of the most important key functions in url.c are called from multi.c
- when certain key steps are to be made in the transfer operation.
+ Some of the most important key functions in `url.c` are called from
`multi.c` when certain key steps are to be made in the transfer operation.
 
 <a name="Curl_connect"></a>
 Curl_connect()
@@ -207,32 +213,32 @@ Curl_connect()
 
    Analyzes the URL, it separates the different components and connects to the
    remote host. This may involve using a proxy and/or using SSL. The
-   `Curl_resolv()` function in lib/hostip.c is used for looking up host names
-   (it does then use the proper underlying method, which may vary between
-   platforms and builds).
+   `Curl_resolv()` function in `lib/hostip.c` is used for looking up host
+   names (it does then use the proper underlying method, which may vary
+   between platforms and builds).
 
    When `Curl_connect` is done, we are connected to the remote site. Then it
    is time to tell the server to get a document/file. `Curl_do()` arranges
    this.
 
-   This function makes sure there's an allocated and initiated 'connectdata'
+   This function makes sure there's an allocated and initiated `connectdata`
    struct that is used for this particular connection only (although there may
    be several requests performed on the same connect). A bunch of things are
    inited/inherited from the `Curl_easy` struct.
 
-<a name="Curl_do"></a>
-Curl_do()
+<a name="multi_do"></a>
+multi_do()
 ---------
 
-   `Curl_do()` makes sure the proper protocol-specific function is called. The
-   functions are named after the protocols they handle.
+   `multi_do()` makes sure the proper protocol-specific function is called.
+   The functions are named after the protocols they handle.
 
    The protocol-specific functions of course deal with protocol-specific
    negotiations and setup. They have access to the `Curl_sendf()` (from
-   lib/sendf.c) function to send printf-style formatted data to the remote
+   `lib/sendf.c`) function to send printf-style formatted data to the remote
    host and when they're ready to make the actual file transfer they call the
-   `Curl_Transfer()` function (in lib/transfer.c) to setup the transfer and
-   returns.
+   `Curl_setup_transfer()` function (in `lib/transfer.c`) to setup the
+   transfer and returns.
 
    If this DO function fails and the connection is being re-used, libcurl will
    then close this connection, setup a new connection and re-issue the DO
@@ -240,28 +246,24 @@ Curl_do()
    we have discovered a dead connection before the DO function and thus we
    might wrongly be re-using a connection that was closed by the remote peer.
 
-   Some time during the DO function, the `Curl_setup_transfer()` function must
-   be called with some basic info about the upcoming transfer: what socket(s)
-   to read/write and the expected file transfer sizes (if known).
-
 <a name="Curl_readwrite"></a>
 Curl_readwrite()
 ----------------
 
    Called during the transfer of the actual protocol payload.
 
-   During transfer, the progress functions in lib/progress.c are called at
+   During transfer, the progress functions in `lib/progress.c` are called at
    frequent intervals (or at the user's choice, a specified callback might get
-   called). The speedcheck functions in lib/speedcheck.c are also used to
+   called). The speedcheck functions in `lib/speedcheck.c` are also used to
    verify that the transfer is as fast as required.
 
-<a name="Curl_done"></a>
-Curl_done()
+<a name="multi_done"></a>
+multi_done()
 -----------
 
    Called after a transfer is done. This function takes care of everything
    that has to be done after a transfer. This function attempts to leave
-   matters in a state so that `Curl_do()` should be possible to call again on
+   matters in a state so that `multi_do()` should be possible to call again on
    the same connection (in a persistent connection case). It might also soon
    be closed with `Curl_disconnect()`.
 
@@ -284,11 +286,12 @@ HTTP(S)
 =======
 
  HTTP offers a lot and is the protocol in curl that uses the most lines of
- code. There is a special file (lib/formdata.c) that offers all the multipart
- post functions.
+ code. There is a special file `lib/formdata.c` that offers all the
multipart post functions.
 
- base64-functions for user+password stuff (and more) is in (lib/base64.c) and
- all functions for parsing and sending cookies are found in (lib/cookie.c).
+ base64-functions for user+password stuff (and more) is in `lib/base64.c`
+ and all functions for parsing and sending cookies are found in
+ `lib/cookie.c`.
 
  HTTPS uses in almost every case the same procedure as HTTP, with only two
  exceptions: the connect procedure is different and the function used to read
@@ -310,18 +313,18 @@ FTP
 ===
 
  The `Curl_if2ip()` function can be used for getting the IP number of a
- specified network interface, and it resides in lib/if2ip.c.
+ specified network interface, and it resides in `lib/if2ip.c`.
 
  `Curl_ftpsendf()` is used for sending FTP commands to the remote server. It
  was made a separate function to prevent us programmers from forgetting that
- they must be CRLF terminated. They must also be sent in one single write() to
- make firewalls and similar happy.
+ they must be CRLF terminated. They must also be sent in one single `write()`
to make firewalls and similar happy.
 
 <a name="kerberos"></a>
 Kerberos
---------
+========
 
- Kerberos support is mainly in lib/krb5.c and lib/security.c but also
+ Kerberos support is mainly in `lib/krb5.c` and `lib/security.c` but also
  `curl_sasl_sspi.c` and `curl_sasl_gssapi.c` for the email protocols and
  `socks_gssapi.c` and `socks_sspi.c` for SOCKS5 proxy specifics.
 
@@ -329,55 +332,57 @@ Kerberos
 TELNET
 ======
 
- Telnet is implemented in lib/telnet.c.
+ Telnet is implemented in `lib/telnet.c`.
 
 <a name="file"></a>
 FILE
 ====
 
- The file:// protocol is dealt with in lib/file.c.
+ The `file://` protocol is dealt with in `lib/file.c`.
 
 <a name="smb"></a>
 SMB
 ===
 
- The smb:// protocol is dealt with in lib/smb.c.
+ The `smb://` protocol is dealt with in `lib/smb.c`.
 
 <a name="ldap"></a>
 LDAP
 ====
 
- Everything LDAP is in lib/ldap.c and lib/openldap.c
+ Everything LDAP is in `lib/ldap.c` and `lib/openldap.c`.
 
 <a name="email"></a>
 E-mail
 ======
 
- The e-mail related source code is in lib/imap.c, lib/pop3.c and lib/smtp.c.
+ The e-mail related source code is in `lib/imap.c`, `lib/pop3.c` and
+ `lib/smtp.c`.
 
 <a name="general"></a>
 General
 =======
 
  URL encoding and decoding, called escaping and unescaping in the source code,
- is found in lib/escape.c.
+ is found in `lib/escape.c`.
 
- While transferring data in Transfer() a few functions might get used.
- `curl_getdate()` in lib/parsedate.c is for HTTP date comparisons (and more).
+ While transferring data in `Transfer()` a few functions might get used.
+ `curl_getdate()` in `lib/parsedate.c` is for HTTP date comparisons (and
+ more).
 
lib/getenv.c offers `curl_getenv()` which is for reading environment
`lib/getenv.c` offers `curl_getenv()` which is for reading environment
  variables in a neat platform independent way. That's used in the client, but
- also in lib/url.c when checking the proxy environment variables. Note that
- contrary to the normal unix getenv(), this returns an allocated buffer that
- must be free()ed after use.
+ also in `lib/url.c` when checking the proxy environment variables. Note that
+ contrary to the normal unix `getenv()`, this returns an allocated buffer that
+ must be `free()`ed after use.
 
- lib/netrc.c holds the .netrc parser
+ `lib/netrc.c` holds the `.netrc` parser.
 
lib/timeval.c features replacement functions for systems that don't have
gettimeofday() and a few support functions for timeval conversions.
`lib/timeval.c` features replacement functions for systems that don't have
`gettimeofday()` and a few support functions for timeval conversions.
 
  A function named `curl_version()` that returns the full curl version string
- is found in lib/version.c.
+ is found in `lib/version.c`.
 
 <a name="persistent"></a>
 Persistent Connections
@@ -391,7 +396,7 @@ Persistent Connections
    as well as all the options etc that the library-user may choose.
 
  - The `Curl_easy` struct holds the "connection cache" (an array of
-   pointers to 'connectdata' structs).
+   pointers to `connectdata` structs).
 
  - This enables the 'curl handle' to be reused on subsequent transfers.
 
@@ -439,10 +444,10 @@ SSL libraries
  in future libcurl versions.
 
  To deal with this internally in the best way possible, we have a generic SSL
- function API as provided by the vtls/vtls.[ch] system, and they are the only
+ function API as provided by the `vtls/vtls.[ch]` system, and they are the only
  SSL functions we must use from within libcurl. vtls is then crafted to use
  the appropriate lower-level function calls to whatever SSL library that is in
- use. For example vtls/openssl.[ch] for the OpenSSL library.
+ use. For example `vtls/openssl.[ch]` for the OpenSSL library.
 
 <a name="symbols"></a>
 Library Symbols
@@ -461,7 +466,7 @@ Return Codes and Informationals
 
  I've made things simple. Almost every function in libcurl returns a CURLcode,
  that must be `CURLE_OK` if everything is OK or otherwise a suitable error
- code as the curl/curl.h include file defines. The very spot that detects an
+ code as the `curl/curl.h` include file defines. The very spot that detects an
  error must use the `Curl_failf()` function to set the human-readable error
  description.
 
@@ -483,20 +488,20 @@ API/ABI
 Client
 ======
 
main() resides in `src/tool_main.c`.
`main()` resides in `src/tool_main.c`.
 
- `src/tool_hugehelp.c` is automatically generated by the mkhelp.pl perl script
to display the complete "manual" and the `src/tool_urlglob.c` file holds the
functions used for the URL-"globbing" support. Globbing in the sense that the
{} and [] expansion stuff is there.
+ `src/tool_hugehelp.c` is automatically generated by the `mkhelp.pl` perl
script to display the complete "manual" and the `src/tool_urlglob.c` file
holds the functions used for the URL-"globbing" support. Globbing in the
sense that the `{}` and `[]` expansion stuff is there.
 
- The client mostly sets up its 'config' struct properly, then
+ The client mostly sets up its `config` struct properly, then
  it calls the `curl_easy_*()` functions of the library and when it gets back
  control after the `curl_easy_perform()` it cleans up the library, checks
  status and exits.
 
- When the operation is done, the ourWriteOut() function in src/writeout.c may
- be called to report about the operation. That function is using the
+ When the operation is done, the `ourWriteOut()` function in `src/writeout.c`
may be called to report about the operation. That function is using the
  `curl_easy_getinfo()` function to extract useful information from the curl
  session.
 
@@ -507,30 +512,32 @@ Client
 Memory Debugging
 ================
 
- The file lib/memdebug.c contains debug-versions of a few functions. Functions
- such as malloc, free, fopen, fclose, etc that somehow deal with resources
- that might give us problems if we "leak" them. The functions in the memdebug
- system do nothing fancy, they do their normal function and then log
- information about what they just did. The logged data can then be analyzed
- after a complete session,
+ The file `lib/memdebug.c` contains debug-versions of a few functions.
+ Functions such as `malloc()`, `free()`, `fopen()`, `fclose()`, etc that
+ somehow deal with resources that might give us problems if we "leak" them.
+ The functions in the memdebug system do nothing fancy, they do their normal
+ function and then log information about what they just did. The logged data
can then be analyzed after a complete session,
 
- memanalyze.pl is the perl script present in tests/ that analyzes a log file
- generated by the memory tracking system. It detects if resources are
+ `memanalyze.pl` is the perl script present in `tests/` that analyzes a log
file generated by the memory tracking system. It detects if resources are
  allocated but never freed and other kinds of errors related to resource
  management.
 
- Internally, definition of preprocessor symbol DEBUGBUILD restricts code which
- is only compiled for debug enabled builds. And symbol CURLDEBUG is used to
- differentiate code which is _only_ used for memory tracking/debugging.
+ Internally, definition of preprocessor symbol `DEBUGBUILD` restricts code
+ which is only compiled for debug enabled builds. And symbol `CURLDEBUG` is
+ used to differentiate code which is _only_ used for memory
+ tracking/debugging.
 
- Use -DCURLDEBUG when compiling to enable memory debugging, this is also
- switched on by running configure with --enable-curldebug. Use -DDEBUGBUILD
- when compiling to enable a debug build or run configure with --enable-debug.
+ Use `-DCURLDEBUG` when compiling to enable memory debugging, this is also
+ switched on by running configure with `--enable-curldebug`. Use
+ `-DDEBUGBUILD` when compiling to enable a debug build or run configure with
+ `--enable-debug`.
 
curl --version will list 'Debug' feature for debug enabled builds, and
`curl --version` will list 'Debug' feature for debug enabled builds, and
  will list 'TrackMemory' feature for curl debug memory tracking capable
  builds. These features are independent and can be controlled when running
- the configure script. When --enable-debug is given both features will be
+ the configure script. When `--enable-debug` is given both features will be
  enabled, unless some restriction prevents memory tracking from being used.
 
 <a name="test"></a>
@@ -541,12 +548,12 @@ Test Suite
  curl archive tree, and it contains a bunch of scripts and a lot of test case
  data.
 
- The main test script is runtests.pl that will invoke test servers like
- httpserver.pl and ftpserver.pl before all the test cases are performed. The
- test suite currently only runs on Unix-like platforms.
+ The main test script is `runtests.pl` that will invoke test servers like
+ `httpserver.pl` and `ftpserver.pl` before all the test cases are performed.
The test suite currently only runs on Unix-like platforms.
 
- You'll find a description of the test suite in the tests/README file, and the
- test case data files in the tests/FILEFORMAT file.
+ You'll find a description of the test suite in the `tests/README` file, and
+ the test case data files in the `tests/FILEFORMAT` file.
 
  The test suite automatically detects if curl was built with the memory
  debugging enabled, and if it was, it will detect memory leaks, too.
@@ -574,7 +581,7 @@ Asynchronous name resolves
  prevent linking errors later on). Then I simply build the areslib project
  (the other projects adig/ahost seem to fail under MSVC).
 
- Next was libcurl. I opened lib/config-win32.h and I added a:
+ Next was libcurl. I opened `lib/config-win32.h` and I added a:
  `#define USE_ARES 1`
 
  Next thing I did was I added the path for the ares includes to the include
@@ -583,8 +590,8 @@ Asynchronous name resolves
  Lastly, I also changed libcurl to be single-threaded rather than
  multi-threaded, again this was to prevent some duplicate symbol errors. I'm
  not sure why I needed to change everything to single-threaded, but when I
- didn't I got redefinition errors for several CRT functions (malloc, stricmp,
- etc.)
+ didn't I got redefinition errors for several CRT functions (`malloc()`,
`stricmp()`, etc.)
 
 <a name="curl_off_t"></a>
 `curl_off_t`
@@ -592,9 +599,10 @@ Asynchronous name resolves
 
  `curl_off_t` is a data type provided by the external libcurl include
  headers. It is the type meant to be used for the [`curl_easy_setopt()`][1]
- options that end with LARGE. The type is 64bit large on most modern
+ options that end with LARGE. The type is 64-bit large on most modern
  platforms.
 
+<a name="curlx"></a>
 curlx
 =====
 
@@ -604,15 +612,15 @@ curlx
  additional functions.
 
  We provide them through a single header file for easy access for apps:
- "curlx.h"
+ `curlx.h`
 
 `curlx_strtoofft()`
 -------------------
    A macro that converts a string containing a number to a `curl_off_t` number.
    This might use the `curlx_strtoll()` function which is provided as source
    code in strtoofft.c. Note that the function is only provided if no
-   strtoll() (or equivalent) function exist on your platform. If `curl_off_t`
-   is only a 32 bit number on your platform, this macro uses strtol().
+   `strtoll()` (or equivalent) function exist on your platform. If `curl_off_t`
+   is only a 32-bit number on your platform, this macro uses `strtol()`.
 
 Future
 ------
@@ -646,27 +654,28 @@ Content Encoding
  [HTTP/1.1][4] specifies that a client may request that a server encode its
  response. This is usually used to compress a response using one (or more)
  encodings from a set of commonly available compression techniques. These
- schemes include 'deflate' (the zlib algorithm), 'gzip' 'br' (brotli) and
'compress'. A client requests that the server perform an encoding by including
- an Accept-Encoding header in the request document. The value of the header
- should be one of the recognized tokens 'deflate', ... (there's a way to
+ schemes include `deflate` (the zlib algorithm), `gzip`, `br` (brotli) and
`compress`. A client requests that the server perform an encoding by including
+ an `Accept-Encoding` header in the request document. The value of the header
+ should be one of the recognized tokens `deflate`, ... (there's a way to
  register new schemes/tokens, see sec 3.5 of the spec). A server MAY honor
  the client's encoding request. When a response is encoded, the server
- includes a Content-Encoding header in the response. The value of the
Content-Encoding header indicates which encodings were used to encode the
+ includes a `Content-Encoding` header in the response. The value of the
`Content-Encoding` header indicates which encodings were used to encode the
  data, in the order in which they were applied.
 
  It's also possible for a client to attach priorities to different schemes so
  that the server knows which it prefers. See sec 14.3 of RFC 2616 for more
- information on the Accept-Encoding header. See sec [3.1.2.2 of RFC 7231][15]
- for more information on the Content-Encoding header.
+ information on the `Accept-Encoding` header. See sec
+ [3.1.2.2 of RFC 7231][15] for more information on the `Content-Encoding`
+ header.
 
 ## Supported content encodings
 
- The 'deflate', 'gzip' and 'br' content encodings are supported by libcurl.
+ The `deflate`, `gzip` and `br` content encodings are supported by libcurl.
  Both regular and chunked transfers work fine.  The zlib library is required
- for the 'deflate' and 'gzip' encodings, while the brotli decoding library is
- for the 'br' encoding.
+ for the `deflate` and `gzip` encodings, while the brotli decoding library is
+ for the `br` encoding.
 
 ## The libcurl interface
 
@@ -674,45 +683,45 @@ Content Encoding
 
   [`curl_easy_setopt`][1](curl, [`CURLOPT_ACCEPT_ENCODING`][5], string)
 
- where string is the intended value of the Accept-Encoding header.
+ where string is the intended value of the `Accept-Encoding` header.
 
  Currently, libcurl does support multiple encodings but only
- understands how to process responses that use the "deflate", "gzip" and/or
"br" content encodings, so the only values for [`CURLOPT_ACCEPT_ENCODING`][5]
- that will work (besides "identity," which does nothing) are "deflate",
"gzip" and "br". If a response is encoded using the "compress" or methods,
+ understands how to process responses that use the `deflate`, `gzip` and/or
`br` content encodings, so the only values for [`CURLOPT_ACCEPT_ENCODING`][5]
+ that will work (besides `identity`, which does nothing) are `deflate`,
`gzip` and `br`. If a response is encoded using the `compress` or methods,
  libcurl will return an error indicating that the response could
- not be decoded.  If `<string>` is NULL no Accept-Encoding header is generated.
- If `<string>` is a zero-length string, then an Accept-Encoding header
- containing all supported encodings will be generated.
+ not be decoded.  If `<string>` is NULL no `Accept-Encoding` header is
+ generated. If `<string>` is a zero-length string, then an `Accept-Encoding`
header containing all supported encodings will be generated.
 
  The [`CURLOPT_ACCEPT_ENCODING`][5] must be set to any non-NULL value for
  content to be automatically decoded.  If it is not set and the server still
  sends encoded content (despite not having been asked), the data is returned
- in its raw form and the Content-Encoding type is not checked.
+ in its raw form and the `Content-Encoding` type is not checked.
 
 ## The curl interface
 
- Use the [--compressed][6] option with curl to cause it to ask servers to
+ Use the [`--compressed`][6] option with curl to cause it to ask servers to
  compress responses using any format supported by curl.
 
 <a name="hostip"></a>
-hostip.c explained
-==================
+`hostip.c` explained
+====================
 
- The main compile-time defines to keep in mind when reading the host*.c source
- file are these:
+ The main compile-time defines to keep in mind when reading the `host*.c`
source file are these:
 
 ## `CURLRES_IPV6`
 
- this host has getaddrinfo() and family, and thus we use that. The host may
+ this host has `getaddrinfo()` and family, and thus we use that. The host may
  not be able to resolve IPv6, but we don't really have to take that into
  account. Hosts that aren't IPv6-enabled have `CURLRES_IPV4` defined.
 
 ## `CURLRES_ARES`
 
  is defined if libcurl is built to use c-ares for asynchronous name
- resolves. This can be Windows or *nix.
+ resolves. This can be Windows or \*nix.
 
 ## `CURLRES_THREADED`
 
@@ -725,20 +734,20 @@ hostip.c explained
  libcurl is not built to use an asynchronous resolver, `CURLRES_SYNCH` is
  defined.
 
-## host*.c sources
+## `host*.c` sources
 
- The host*.c sources files are split up like this:
+ The `host*.c` sources files are split up like this:
 
- - hostip.c      - method-independent resolver functions and utility functions
- - hostasyn.c    - functions for asynchronous name resolves
- - hostsyn.c     - functions for synchronous name resolves
- - asyn-ares.c   - functions for asynchronous name resolves using c-ares
- - asyn-thread.c - functions for asynchronous name resolves using threads
- - hostip4.c     - IPv4 specific functions
- - hostip6.c     - IPv6 specific functions
+ - `hostip.c`      - method-independent resolver functions and utility functions
+ - `hostasyn.c`    - functions for asynchronous name resolves
+ - `hostsyn.c`     - functions for synchronous name resolves
+ - `asyn-ares.c`   - functions for asynchronous name resolves using c-ares
+ - `asyn-thread.c` - functions for asynchronous name resolves using threads
+ - `hostip4.c`     - IPv4 specific functions
+ - `hostip6.c`     - IPv6 specific functions
 
- The hostip.h is the single united header file for all this. It defines the
- `CURLRES_*` defines based on the config*.h and `curl_setup.h` defines.
+ The `hostip.h` is the single united header file for all this. It defines the
+ `CURLRES_*` defines based on the `config*.h` and `curl_setup.h` defines.
 
 <a name="memoryleak"></a>
 Track Down Memory Leaks
@@ -750,14 +759,13 @@ Track Down Memory Leaks
   than one thread. If you want/need to use it in a multi-threaded app. Please
   adjust accordingly.
 
-
 ## Build
 
-  Rebuild libcurl with -DCURLDEBUG (usually, rerunning configure with
-  --enable-debug fixes this). 'make clean' first, then 'make' so that all
+  Rebuild libcurl with `-DCURLDEBUG` (usually, rerunning configure with
+  `--enable-debug` fixes this). `make clean` first, then `make` so that all
   files are actually rebuilt properly. It will also make sense to build
-  libcurl with the debug option (usually -g to the compiler) so that debugging
-  it will be easier if you actually do find a leak in the library.
+  libcurl with the debug option (usually `-g` to the compiler) so that
+  debugging it will be easier if you actually do find a leak in the library.
 
   This will create a library that has memory debugging enabled.
 
@@ -765,7 +773,7 @@ Track Down Memory Leaks
 
   Add a line in your application code:
 
-       `curl_memdebug("dump");`
+       `curl_dbg_memdebug("dump");`
 
   This will make the malloc debug system output a full trace of all resource
   using functions to the given file name. Make sure you rebuild your program
@@ -781,7 +789,7 @@ Track Down Memory Leaks
 
 ## Analyze the Flow
 
-  Use the tests/memanalyze.pl perl script to analyze the dump file:
+  Use the `tests/memanalyze.pl` perl script to analyze the dump file:
 
     tests/memanalyze.pl dump
 
@@ -797,45 +805,46 @@ Track Down Memory Leaks
 
  Implementation of the `curl_multi_socket` API
 
-  The main ideas of this API are simply:
-
-   1 - The application can use whatever event system it likes as it gets info
-       from libcurl about what file descriptors libcurl waits for what action
-       on. (The previous API returns `fd_sets` which is very select()-centric).
-
-   2 - When the application discovers action on a single socket, it calls
-       libcurl and informs that there was action on this particular socket and
-       libcurl can then act on that socket/transfer only and not care about
-       any other transfers. (The previous API always had to scan through all
-       the existing transfers.)
-
-  The idea is that [`curl_multi_socket_action()`][7] calls a given callback
-  with information about what socket to wait for what action on, and the
-  callback only gets called if the status of that socket has changed.
-
-  We also added a timer callback that makes libcurl call the application when
-  the timeout value changes, and you set that with [`curl_multi_setopt()`][9]
-  and the [`CURLMOPT_TIMERFUNCTION`][10] option. To get this to work,
-  Internally, there's an added struct to each easy handle in which we store
-  an "expire time" (if any). The structs are then "splay sorted" so that we
-  can add and remove times from the linked list and yet somewhat swiftly
-  figure out both how long there is until the next nearest timer expires
-  and which timer (handle) we should take care of now. Of course, the upside
-  of all this is that we get a [`curl_multi_timeout()`][8] that should also
-  work with old-style applications that use [`curl_multi_perform()`][11].
-
-  We created an internal "socket to easy handles" hash table that given
-  a socket (file descriptor) returns the easy handle that waits for action on
-  that socket.  This hash is made using the already existing hash code
-  (previously only used for the DNS cache).
-
-  To make libcurl able to report plain sockets in the socket callback, we had
-  to re-organize the internals of the [`curl_multi_fdset()`][12] etc so that
-  the conversion from sockets to `fd_sets` for that function is only done in
-  the last step before the data is returned. I also had to extend c-ares to
-  get a function that can return plain sockets, as that library too returned
-  only `fd_sets` and that is no longer good enough. The changes done to c-ares
-  are available in c-ares 1.3.1 and later.
+ The main ideas of this API are simply:
+
+ 1. The application can use whatever event system it likes as it gets info
+    from libcurl about what file descriptors libcurl waits for what action
+    on. (The previous API returns `fd_sets` which is very
+    `select()`-centric).
+
+ 2. When the application discovers action on a single socket, it calls
+    libcurl and informs that there was action on this particular socket and
+    libcurl can then act on that socket/transfer only and not care about
+    any other transfers. (The previous API always had to scan through all
+    the existing transfers.)
+
+ The idea is that [`curl_multi_socket_action()`][7] calls a given callback
+ with information about what socket to wait for what action on, and the
+ callback only gets called if the status of that socket has changed.
+
+ We also added a timer callback that makes libcurl call the application when
+ the timeout value changes, and you set that with [`curl_multi_setopt()`][9]
+ and the [`CURLMOPT_TIMERFUNCTION`][10] option. To get this to work,
+ Internally, there's an added struct to each easy handle in which we store
+ an "expire time" (if any). The structs are then "splay sorted" so that we
+ can add and remove times from the linked list and yet somewhat swiftly
+ figure out both how long there is until the next nearest timer expires
+ and which timer (handle) we should take care of now. Of course, the upside
+ of all this is that we get a [`curl_multi_timeout()`][8] that should also
+ work with old-style applications that use [`curl_multi_perform()`][11].
+
+ We created an internal "socket to easy handles" hash table that given
+ a socket (file descriptor) returns the easy handle that waits for action on
+ that socket.  This hash is made using the already existing hash code
+ (previously only used for the DNS cache).
+
+ To make libcurl able to report plain sockets in the socket callback, we had
+ to re-organize the internals of the [`curl_multi_fdset()`][12] etc so that
+ the conversion from sockets to `fd_sets` for that function is only done in
+ the last step before the data is returned. I also had to extend c-ares to
+ get a function that can return plain sockets, as that library too returned
+ only `fd_sets` and that is no longer good enough. The changes done to c-ares
+ are available in c-ares 1.3.1 and later.
 
 <a name="structs"></a>
 Structs in libcurl
@@ -844,40 +853,42 @@ Structs in libcurl
 This section should cover 7.32.0 pretty accurately, but will make sense even
 for older and later versions as things don't change drastically that often.
 
+<a name="Curl_easy"></a>
 ## Curl_easy
 
   The `Curl_easy` struct is the one returned to the outside in the external API
-  as a "CURL *". This is usually known as an easy handle in API documentations
+  as a `CURL *`. This is usually known as an easy handle in API documentations
   and examples.
 
   Information and state that is related to the actual connection is in the
-  'connectdata' struct. When a transfer is about to be made, libcurl will
+  `connectdata` struct. When a transfer is about to be made, libcurl will
   either create a new connection or re-use an existing one. The particular
   connectdata that is used by this handle is pointed out by
   `Curl_easy->easy_conn`.
 
   Data and information that regard this particular single transfer is put in
-  the SingleRequest sub-struct.
+  the `SingleRequest` sub-struct.
 
   When the `Curl_easy` struct is added to a multi handle, as it must be in
-  order to do any transfer, the ->multi member will point to the `Curl_multi`
-  struct it belongs to. The ->prev and ->next members will then be used by the
-  multi code to keep a linked list of `Curl_easy` structs that are added to
-  that same multi handle. libcurl always uses multi so ->multi *will* point to
-  a `Curl_multi` when a transfer is in progress.
+  order to do any transfer, the `->multi` member will point to the `Curl_multi`
+  struct it belongs to. The `->prev` and `->next` members will then be used by
+  the multi code to keep a linked list of `Curl_easy` structs that are added to
+  that same multi handle. libcurl always uses multi so `->multi` *will* point
+  to a `Curl_multi` when a transfer is in progress.
 
-  ->mstate is the multi state of this particular `Curl_easy`. When
+  `->mstate` is the multi state of this particular `Curl_easy`. When
   `multi_runsingle()` is called, it will act on this handle according to which
   state it is in. The mstate is also what tells which sockets to return for a
   specific `Curl_easy` when [`curl_multi_fdset()`][12] is called etc.
 
-  The libcurl source code generally use the name 'data' for the variable that
+  The libcurl source code generally use the name `data` for the variable that
   points to the `Curl_easy`.
 
   When doing multiplexed HTTP/2 transfers, each `Curl_easy` is associated with
   an individual stream, sharing the same connectdata struct. Multiplexing
   makes it even more important to keep things associated with the right thing!
 
+<a name="connectdata"></a>
 ## connectdata
 
   A general idea in libcurl is to keep connections around in a connection
@@ -885,16 +896,16 @@ for older and later versions as things don't change drastically that often.
   re-use an existing one instead of creating a new as it creates a significant
   performance boost.
 
-  Each 'connectdata' identifies a single physical connection to a server. If
+  Each `connectdata` identifies a single physical connection to a server. If
   the connection can't be kept alive, the connection will be closed after use
   and then this struct can be removed from the cache and freed.
 
   Thus, the same `Curl_easy` can be used multiple times and each time select
-  another connectdata struct to use for the connection. Keep this in mind, as
-  it is then important to consider if options or choices are based on the
+  another `connectdata` struct to use for the connection. Keep this in mind,
+  as it is then important to consider if options or choices are based on the
   connection or the `Curl_easy`.
 
-  Functions in libcurl will assume that connectdata->data points to the
+  Functions in libcurl will assume that `connectdata->data` points to the
   `Curl_easy` that uses this connection (for the moment).
 
   As a special complexity, some protocols supported by libcurl require a
@@ -909,15 +920,16 @@ for older and later versions as things don't change drastically that often.
   this single struct and thus can be considered a single connection for most
   internal concerns.
 
-  The libcurl source code generally use the name 'conn' for the variable that
+  The libcurl source code generally use the name `conn` for the variable that
   points to the connectdata.
 
+<a name="Curl_multi"></a>
 ## Curl_multi
 
   Internally, the easy interface is implemented as a wrapper around multi
   interface functions. This makes everything multi interface.
 
-  `Curl_multi` is the multi handle struct exposed as "CURLM *" in external
+  `Curl_multi` is the multi handle struct exposed as `CURLM *` in external
   APIs.
 
   This struct holds a list of `Curl_easy` structs that have been added to this
@@ -944,18 +956,19 @@ for older and later versions as things don't change drastically that often.
   `->conn_cache` points to the connection cache. It keeps track of all
   connections that are kept after use. The cache has a maximum size.
 
-  `->closure_handle` is described in the 'connectdata' section.
+  `->closure_handle` is described in the `connectdata` section.
 
-  The libcurl source code generally use the name 'multi' for the variable that
+  The libcurl source code generally use the name `multi` for the variable that
   points to the `Curl_multi` struct.
 
+<a name="Curl_handler"></a>
 ## Curl_handler
 
   Each unique protocol that is supported by libcurl needs to provide at least
   one `Curl_handler` struct. It defines what the protocol is called and what
   functions the main code should call to deal with protocol specific issues.
-  In general, there's a source file named [protocol].c in which there's a
-  "struct `Curl_handler` `Curl_handler_[protocol]`" declared. In url.c there's
+  In general, there's a source file named `[protocol].c` in which there's a
+  `struct Curl_handler Curl_handler_[protocol]` declared. In `url.c` there's
   then the main array with all individual `Curl_handler` structs pointed to
   from a single array which is scanned through when a URL is given to libcurl
   to work with.
@@ -967,9 +980,9 @@ for older and later versions as things don't change drastically that often.
   `->setup_connection` is called to allow the protocol code to allocate
   protocol specific data that then gets associated with that `Curl_easy` for
   the rest of this transfer. It gets freed again at the end of the transfer.
-  It will be called before the 'connectdata' for the transfer has been
+  It will be called before the `connectdata` for the transfer has been
   selected/created. Most protocols will allocate its private
-  'struct [PROTOCOL]' here and assign `Curl_easy->req.protop` to point to it.
+  `struct [PROTOCOL]` here and assign `Curl_easy->req.protop` to point to it.
 
   `->connect_it` allows a protocol to do some specific actions after the TCP
   connect is done, that can still be considered part of the connection phase.
@@ -996,25 +1009,25 @@ for older and later versions as things don't change drastically that often.
   `->do_more` gets called during the `DO_MORE` state. The FTP protocol uses
   this state when setting up the second connection.
 
-  ->`proto_getsock`
-  ->`doing_getsock`
-  ->`domore_getsock`
-  ->`perform_getsock`
+  `->proto_getsock`
+  `->doing_getsock`
+  `->domore_getsock`
+  `->perform_getsock`
   Functions that return socket information. Which socket(s) to wait for which
   action(s) during the particular multi state.
 
-  ->disconnect is called immediately before the TCP connection is shutdown.
+  `->disconnect` is called immediately before the TCP connection is shutdown.
 
-  ->readwrite gets called during transfer to allow the protocol to do extra
+  `->readwrite` gets called during transfer to allow the protocol to do extra
   reads/writes
 
-  ->defport is the default report TCP or UDP port this protocol uses
+  `->defport` is the default report TCP or UDP port this protocol uses
 
-  ->protocol is one or more bits in the `CURLPROTO_*` set. The SSL versions
+  `->protocol` is one or more bits in the `CURLPROTO_*` set. The SSL versions
   have their "base" protocol set and then the SSL variation. Like
   "HTTP|HTTPS".
 
-  ->flags is a bitmask with additional information about the protocol that will
+  `->flags` is a bitmask with additional information about the protocol that will
   make it get treated differently by the generic engine:
 
   - `PROTOPT_SSL` - will make it connect and negotiate SSL
@@ -1029,7 +1042,7 @@ for older and later versions as things don't change drastically that often.
     limit which "direction" of socket actions that the main engine will
     concern itself with.
 
-  - `PROTOPT_NONETWORK` - a protocol that doesn't use network (read file:)
+  - `PROTOPT_NONETWORK` - a protocol that doesn't use network (read `file:`)
 
   - `PROTOPT_NEEDSPWD` - this protocol needs a password and will use a default
     one unless one is provided
@@ -1037,16 +1050,18 @@ for older and later versions as things don't change drastically that often.
   - `PROTOPT_NOURLQUERY` - this protocol can't handle a query part on the URL
     (?foo=bar)
 
+<a name="conncache"></a>
 ## conncache
 
   Is a hash table with connections for later re-use. Each `Curl_easy` has a
   pointer to its connection cache. Each multi handle sets up a connection
   cache that all added `Curl_easy`s share by default.
 
+<a name="Curl_share"></a>
 ## Curl_share
 
   The libcurl share API allocates a `Curl_share` struct, exposed to the
-  external API as "CURLSH *".
+  external API as `CURLSH *`.
 
   The idea is that the struct can have a set of its own versions of caches and
   pools and then by providing this struct in the `CURLOPT_SHARE` option, those
@@ -1059,10 +1074,11 @@ for older and later versions as things don't change drastically that often.
   The `Curl_share` struct can currently hold cookies, DNS cache and the SSL
   session cache.
 
+<a name="CookieInfo"></a>
 ## CookieInfo
 
   This is the main cookie struct. It holds all known cookies and related
-  information. Each `Curl_easy` has its own private CookieInfo even when
+  information. Each `Curl_easy` has its own private `CookieInfo` even when
   they are added to a multi handle. They can be made to share cookies by using
   the share API.
 
index 1dcb79f..5fd230f 100644 (file)
@@ -12,14 +12,13 @@ check the changelog of the current development status, as one or more of these
 problems may have been fixed or changed somewhat since this was written!
 
  1. HTTP
- 1.1 CURLFORM_CONTENTLEN in an array
- 1.2 Disabling HTTP Pipelining
  1.3 STARTTRANSFER time is wrong for HTTP POSTs
  1.4 multipart formposts file name encoding
  1.5 Expect-100 meets 417
  1.6 Unnecessary close when 401 received waiting for 100
+ 1.7 Deflate error after all content was received
+ 1.8 DoH isn't used for all name resolves when enabled
  1.9 HTTP/2 frames while in the connection pool kill reuse
- 1.10 Strips trailing dot from host name
  1.11 CURLOPT_SEEKFUNCTION not called with CURLFORM_STREAM
 
  2. TLS
@@ -29,6 +28,9 @@ problems may have been fixed or changed somewhat since this was written!
  2.4 DarwinSSL won't import PKCS#12 client certificates without a password
  2.5 Client cert handling with Issuer DN differs between backends
  2.6 CURL_GLOBAL_SSL
+ 2.7 Client cert (MTLS) issues with Schannel
+ 2.8 Schannel disable CURLOPT_SSL_VERIFYPEER and verify hostname
+ 2.9 TLS session cache doesn't work with TFO
 
  3. Email protocols
  3.1 IMAP SEARCH ALL truncated response
@@ -41,14 +43,19 @@ problems may have been fixed or changed somewhat since this was written!
  4.2 -J with -C - fails
  4.3 --retry and transfer timeouts
  4.4 --upload-file . hang if delay in STDIN
+ 4.5 Improve --data-urlencode space encoding
 
  5. Build and portability issues
+ 5.1 USE_UNIX_SOCKETS on Windows
  5.2 curl-config --libs contains private details
+ 5.3 curl compiled on OSX 10.13 failed to run on OSX 10.10
+ 5.4 Cannot compile against a static build of OpenLDAP
  5.5 can't handle Unicode arguments in Windows
  5.6 cmake support gaps
  5.7 Visual Studio project gaps
  5.8 configure finding libs in wrong directory
  5.9 Utilize Requires.private directives in libcurl.pc
+ 5.10 IDN tests failing on Windows / MSYS2
 
  6. Authentication
  6.1 NTLM authentication and unicode
@@ -56,6 +63,8 @@ problems may have been fixed or changed somewhat since this was written!
  6.3 NTLM in system context uses wrong name
  6.4 Negotiate and Kerberos V5 need a fake user name
  6.5 NTLM doesn't support password with § character
+ 6.6 libcurl can fail to try alternatives with --proxy-any
+ 6.7 Don't clear digest for single realm
 
  7. FTP
  7.1 FTP without or slow 220 response
@@ -89,9 +98,12 @@ problems may have been fixed or changed somewhat since this was written!
  11.4 HTTP test server 'connection-monitor' problems
  11.5 Connection information when using TCP Fast Open
  11.6 slow connect to localhost on Windows
+ 11.7 signal-based resolver timeouts
 
  12. LDAP and OpenLDAP
  12.1 OpenLDAP hangs after returning results
+ 12.2 LDAP on Windows does authentication wrong?
+ 12.3 LDAP on Windows doesn't work
 
  13. TCP/IP
  13.1 --interface for ipv6 binds to unusable IP address
@@ -103,23 +115,6 @@ problems may have been fixed or changed somewhat since this was written!
 
 1. HTTP
 
-1.1 CURLFORM_CONTENTLEN in an array
-
- It is not possible to pass a 64-bit value using CURLFORM_CONTENTLEN with
- CURLFORM_ARRAY, when compiled on 32-bit platforms that support 64-bit
- integers. This is because the underlying structure 'curl_forms' uses a dual
- purpose char* for storing these values in via casting. For more information
- see the now closed related issue:
- https://github.com/curl/curl/issues/608
-
-1.2 Disabling HTTP Pipelining
-
- Disabling HTTP Pipelining when there are ongoing transfers can lead to
- heap corruption and crash. https://curl.haxx.se/bug/view.cgi?id=1411
-
- Similarly, removing a handle when pipelining corrupts data:
- https://github.com/curl/curl/issues/2101
-
 1.3 STARTTRANSFER time is wrong for HTTP POSTs
 
  Wrong STARTTRANSFER timer accounting for POST requests Timer works fine with
@@ -151,6 +146,25 @@ problems may have been fixed or changed somewhat since this was written!
  waiting for the the 100-continue response.
  https://curl.haxx.se/mail/lib-2008-08/0462.html
 
+1.7 Deflate error after all content was received
+
+ There's a situation where we can get an error in a HTTP response that is
+ compressed, when that error is detected after all the actual body contents
+ have been received and delivered to the application. This is tricky, but is
+ ultimately a broken server.
+
+ See https://github.com/curl/curl/issues/2719
+
+1.8 DoH isn't used for all name resolves when enabled
+
+ Even if DoH is specified to be used, there are some name resolves that are
+ done without it. This should be fixed. When the internal function
+ `Curl_resolver_wait_resolv()` is called, it doesn't use DoH to complete the
+ resolve as it otherwise should.
+
+ See https://github.com/curl/curl/pull/3857 and
+ https://github.com/curl/curl/pull/3850
+
 1.9 HTTP/2 frames while in the connection pool kill reuse
 
  If the server sends HTTP/2 frames (like for example an HTTP/2 PING frame) to
@@ -161,41 +175,6 @@ problems may have been fixed or changed somewhat since this was written!
  This is *best* fixed by adding monitoring to connections while they are kept
  in the pool so that pings can be responded to appropriately.
 
-1.10 Strips trailing dot from host name
-
- When given a URL with a trailing dot for the host name part:
- "https://example.com./", libcurl will strip off the dot and use the name
- without a dot internally and send it dot-less in HTTP Host: headers and in
- the TLS SNI field.
-
- The HTTP part violates RFC 7230 section 5.4 but the SNI part is accordance
- with RFC 6066 section 3.
-
- URLs using these trailing dots are very rare in the wild and we have not seen
- or gotten any real-world problems with such URLs reported. The popular
- browsers seem to have stayed with not stripping the dot for both uses (thus
- they violate RFC 6066 instead of RFC 7230).
-
- Daniel took the discussion to the HTTPbis mailing list in March 2016:
- https://lists.w3.org/Archives/Public/ietf-http-wg/2016JanMar/0430.html but
- there was not major rush or interest to fix this. The impression I get is
- that most HTTP people rather not rock the boat now and instead prioritize web
- compatibility rather than to strictly adhere to these RFCs.
-
- Our current approach allows a knowing client to send a custom HTTP header
- with the dot added.
-
- It can also be noted that while adding a trailing dot to the host name in
- most (all?) cases will make the name resolve to the same set of IP addresses,
- many HTTP servers will not happily accept the trailing dot there unless that
- has been specifically configured to be a fine virtual host.
-
- If URLs with trailing dots for host names become more popular or even just
- used more than for just plain fun experiments, I'm sure we will have reason
- to go back and reconsider.
-
- See https://github.com/curl/curl/issues/716 for the discussion.
-
 1.11 CURLOPT_SEEKFUNCTION not called with CURLFORM_STREAM
 
  I'm using libcurl to POST form data using a FILE* with the CURLFORM_STREAM
@@ -268,6 +247,19 @@ problems may have been fixed or changed somewhat since this was written!
 
  https://github.com/curl/curl/issues/2276
 
+2.7 Client cert (MTLS) issues with Schannel
+
+ See https://github.com/curl/curl/issues/3145
+
+2.8 Schannel disable CURLOPT_SSL_VERIFYPEER and verify hostname
+
+ This seems to be a limitation in the underlying Schannel API.
+
+ https://github.com/curl/curl/issues/3284
+
+2.9 TLS session cache doesn't work with TFO
+
+ See https://github.com/curl/curl/issues/4301
 
 3. Email protocols
 
@@ -342,14 +334,36 @@ problems may have been fixed or changed somewhat since this was written!
 
  See https://github.com/curl/curl/issues/2051
 
+4.5 Improve --data-urlencode space encoding
+
+ ASCII space characters in --data-urlencode are currently encoded as %20
+ rather than +, which RFC 1866 says should be used.
+
+ See https://github.com/curl/curl/issues/3229
+
 5. Build and portability issues
 
+5.1 USE_UNIX_SOCKETS on Windows
+
+ Due to incorrect CMake checks for the presence of the feature, it will never
+ be enabled for windows in a cmake build.
+
+ See https://github.com/curl/curl/issues/4040
+
 5.2 curl-config --libs contains private details
 
  "curl-config --libs" will include details set in LDFLAGS when configure is
  run that might be needed only for building libcurl. Further, curl-config
  --cflags suffers from the same effects with CFLAGS/CPPFLAGS.
 
+5.3 curl compiled on OSX 10.13 failed to run on OSX 10.10
+
+ See https://github.com/curl/curl/issues/2905
+
+5.4 Cannot compile against a static build of OpenLDAP
+
+ See https://github.com/curl/curl/issues/2367
+
 5.5 can't handle Unicode arguments in Windows
 
  If a URL or filename can't be encoded using the user's current codepage then
@@ -367,10 +381,16 @@ problems may have been fixed or changed somewhat since this was written!
  offers. This includes:
 
   - use of correct soname for the shared library build
+
   - support for several TLS backends are missing
+
   - the unit tests cause link failures in regular non-static builds
+
   - no nghttp2 check
 
+  - unusable tool_hugehelp.c with MinGW, see
+    https://github.com/curl/curl/issues/3125
+
 5.7 Visual Studio project gaps
 
  The Visual Studio projects lack some features that the autoconf and nmake
@@ -406,17 +426,24 @@ problems may have been fixed or changed somewhat since this was written!
 
  https://github.com/curl/curl/issues/864
 
+5.10 IDN tests failing on Windows / MSYS2
+
+ It seems like MSYS2 does some UTF-8-to-something-else conversion for Windows
+ compatibility.
+
+ https://github.com/curl/curl/issues/3747
+
 6. Authentication
 
 6.1 NTLM authentication and unicode
 
  NTLM authentication involving unicode user name or password only works
- properly if built with UNICODE defined together with the WinSSL/schannel
+ properly if built with UNICODE defined together with the WinSSL/Schannel
  backend. The original problem was mentioned in:
  https://curl.haxx.se/mail/lib-2009-10/0024.html
  https://curl.haxx.se/bug/view.cgi?id=896
 
- The WinSSL/schannel version verified to work as mentioned in
+ The WinSSL/Schannel version verified to work as mentioned in
  https://curl.haxx.se/mail/lib-2012-07/0073.html
 
 6.2 MIT Kerberos for Windows build
@@ -447,6 +474,21 @@ problems may have been fixed or changed somewhat since this was written!
 
  https://github.com/curl/curl/issues/2120
 
+6.6 libcurl can fail to try alternatives with --proxy-any
+
+ When connecting via a proxy using --proxy-any, a failure to establish an
+ authentication will cause libcurl to abort trying other options if the
+ failed method has a higher preference than the alternatives. As an example,
+ --proxy-any against a proxy which advertise Negotiate and NTLM, but which
+ fails to set up Kerberos authentication won't proceed to try authentication
+ using NTLM.
+
+ https://github.com/curl/curl/issues/876
+
+6.7 Don't clear digest for single realm
+
+ https://github.com/curl/curl/issues/3267
+
 7. FTP
 
 7.1 FTP without or slow 220 response
@@ -638,7 +680,8 @@ problems may have been fixed or changed somewhat since this was written!
  CURLINFO_LOCAL_PORT (and possibly a few other) fails when TCP Fast Open is
  enabled.
 
- See https://github.com/curl/curl/issues/1332
+ See https://github.com/curl/curl/issues/1332 and
+ https://github.com/curl/curl/issues/4296
 
 11.6 slow connect to localhost on Windows
 
@@ -654,6 +697,19 @@ problems may have been fixed or changed somewhat since this was written!
 
  https://github.com/curl/curl/issues/2281
 
+11.7 signal-based resolver timeouts
+
+ libcurl built without an asynchronous resolver library uses alarm() to time
+ out DNS lookups. When a timeout occurs, this causes libcurl to jump from the
+ signal handler back into the library with a sigsetjmp, which effectively
+ causes libcurl to continue running within the signal handler. This is
+ non-portable and could cause problems on some platforms. A discussion on the
+ problem is available at https://curl.haxx.se/mail/lib-2008-09/0197.html
+
+ Also, alarm() provides timeout resolution only to the nearest second. alarm
+ ought to be replaced by setitimer on systems that support it.
+
+
 12. LDAP and OpenLDAP
 
 12.1 OpenLDAP hangs after returning results
@@ -675,6 +731,16 @@ problems may have been fixed or changed somewhat since this was written!
  See https://github.com/curl/curl/issues/622 and
      https://curl.haxx.se/mail/lib-2016-01/0101.html
 
+12.2 LDAP on Windows does authentication wrong?
+
+ https://github.com/curl/curl/issues/3116
+
+12.3 LDAP on Windows doesn't work
+
+ A simple curl command line getting "ldap://ldap.forumsys.com" returns an
+ error that says "no memory" !
+
+ https://github.com/curl/curl/issues/4261
 
 13. TCP/IP
 
index 5376bdb..1083a2d 100644 (file)
@@ -57,10 +57,6 @@ not have the announcement clause that collides with GPL.
  different obligations. You should select the license that best meets your
  needs.
 
-## axTLS
-
- (May be used for SSL/TLS support) Uses a Modified BSD-style license.
-
 ## mbedTLS
 
  (May be used for SSL/TLS support) Uses the [Apache 2.0
@@ -79,6 +75,11 @@ not have the announcement clause that collides with GPL.
  (May be used for SSL/TLS support) As an OpenSSL fork, it has the same
  license as that.
 
+## BearSSL
+
+ (May be used for SSL/TLS support) Uses an MIT license that is very liberal
+ and imposes no restrictions on any other library or part you may link with.
+
 ## c-ares
 
  (Used for asynchronous name resolves) Uses an MIT license that is very
diff --git a/docs/MANUAL b/docs/MANUAL
deleted file mode 100644 (file)
index 59b9742..0000000
+++ /dev/null
@@ -1,1058 +0,0 @@
-LATEST VERSION
-
-  You always find news about what's going on as well as the latest versions
-  from the curl web pages, located at:
-
-        https://curl.haxx.se
-
-SIMPLE USAGE
-
-  Get the main page from Netscape's web-server:
-
-        curl http://www.netscape.com/
-
-  Get the README file the user's home directory at funet's ftp-server:
-
-        curl ftp://ftp.funet.fi/README
-
-  Get a web page from a server using port 8000:
-
-        curl http://www.weirdserver.com:8000/
-
-  Get a directory listing of an FTP site:
-
-        curl ftp://cool.haxx.se/
-
-  Get the definition of curl from a dictionary:
-
-        curl dict://dict.org/m:curl
-
-  Fetch two documents at once:
-
-        curl ftp://cool.haxx.se/ http://www.weirdserver.com:8000/
-
-  Get a file off an FTPS server:
-
-        curl ftps://files.are.secure.com/secrets.txt
-
-  or use the more appropriate FTPS way to get the same file:
-
-        curl --ftp-ssl ftp://files.are.secure.com/secrets.txt
-
-  Get a file from an SSH server using SFTP:
-
-        curl -u username sftp://example.com/etc/issue
-
-  Get a file from an SSH server using SCP using a private key
-  (not password-protected) to authenticate:
-
-        curl -u username: --key ~/.ssh/id_rsa \
-             scp://example.com/~/file.txt
-
-  Get a file from an SSH server using SCP using a private key
-  (password-protected) to authenticate:
-
-        curl -u username: --key ~/.ssh/id_rsa --pass private_key_password \
-             scp://example.com/~/file.txt
-
-  Get the main page from an IPv6 web server:
-
-        curl "http://[2001:1890:1112:1::20]/"
-
-  Get a file from an SMB server:
-
-        curl -u "domain\username:passwd" smb://server.example.com/share/file.txt
-
-DOWNLOAD TO A FILE
-
-  Get a web page and store in a local file with a specific name:
-
-        curl -o thatpage.html http://www.netscape.com/
-
-  Get a web page and store in a local file, make the local file get the name
-  of the remote document (if no file name part is specified in the URL, this
-  will fail):
-
-        curl -O http://www.netscape.com/index.html
-
-  Fetch two files and store them with their remote names:
-
-        curl -O www.haxx.se/index.html -O curl.haxx.se/download.html
-
-USING PASSWORDS
-
- FTP
-
-   To ftp files using name+passwd, include them in the URL like:
-
-        curl ftp://name:passwd@machine.domain:port/full/path/to/file
-
-   or specify them with the -u flag like
-
-        curl -u name:passwd ftp://machine.domain:port/full/path/to/file
-
- FTPS
-
-   It is just like for FTP, but you may also want to specify and use
-   SSL-specific options for certificates etc.
-
-   Note that using FTPS:// as prefix is the "implicit" way as described in the
-   standards while the recommended "explicit" way is done by using FTP:// and
-   the --ftp-ssl option.
-
- SFTP / SCP
-
-   This is similar to FTP, but you can use the --key option to specify a
-   private key to use instead of a password. Note that the private key may
-   itself be protected by a password that is unrelated to the login password
-   of the remote system; this password is specified using the --pass option.
-   Typically, curl will automatically extract the public key from the private
-   key file, but in cases where curl does not have the proper library support,
-   a matching public key file must be specified using the --pubkey option.
-
- HTTP
-
-   Curl also supports user and password in HTTP URLs, thus you can pick a file
-   like:
-
-        curl http://name:passwd@machine.domain/full/path/to/file
-
-   or specify user and password separately like in
-
-        curl -u name:passwd http://machine.domain/full/path/to/file
-
-   HTTP offers many different methods of authentication and curl supports
-   several: Basic, Digest, NTLM and Negotiate (SPNEGO). Without telling which
-   method to use, curl defaults to Basic. You can also ask curl to pick the
-   most secure ones out of the ones that the server accepts for the given URL,
-   by using --anyauth.
-
-   NOTE! According to the URL specification, HTTP URLs can not contain a user
-   and password, so that style will not work when using curl via a proxy, even
-   though curl allows it at other times. When using a proxy, you _must_ use
-   the -u style for user and password.
-
- HTTPS
-
-   Probably most commonly used with private certificates, as explained below.
-
-PROXY
-
- curl supports both HTTP and SOCKS proxy servers, with optional authentication.
- It does not have special support for FTP proxy servers since there are no
- standards for those, but it can still be made to work with many of them. You
- can also use both HTTP and SOCKS proxies to transfer files to and from FTP
- servers.
-
- Get an ftp file using an HTTP proxy named my-proxy that uses port 888:
-
-        curl -x my-proxy:888 ftp://ftp.leachsite.com/README
-
- Get a file from an HTTP server that requires user and password, using the
- same proxy as above:
-
-        curl -u user:passwd -x my-proxy:888 http://www.get.this/
-
- Some proxies require special authentication. Specify by using -U as above:
-
-        curl -U user:passwd -x my-proxy:888 http://www.get.this/
-
- A comma-separated list of hosts and domains which do not use the proxy can
- be specified as:
-
-        curl --noproxy localhost,get.this -x my-proxy:888 http://www.get.this/
-
- If the proxy is specified with --proxy1.0 instead of --proxy or -x, then
- curl will use HTTP/1.0 instead of HTTP/1.1 for any CONNECT attempts.
-
- curl also supports SOCKS4 and SOCKS5 proxies with --socks4 and --socks5.
-
- See also the environment variables Curl supports that offer further proxy
- control.
-
- Most FTP proxy servers are set up to appear as a normal FTP server from the
- client's perspective, with special commands to select the remote FTP server.
- curl supports the -u, -Q and --ftp-account options that can be used to
- set up transfers through many FTP proxies. For example, a file can be
- uploaded to a remote FTP server using a Blue Coat FTP proxy with the
- options:
-
-   curl -u "Remote-FTP-Username@remote.ftp.server Proxy-Username:Remote-Pass" \
-        --ftp-account Proxy-Password --upload-file local-file \
-        ftp://my-ftp.proxy.server:21/remote/upload/path/
-
- See the manual for your FTP proxy to determine the form it expects to set up
- transfers, and curl's -v option to see exactly what curl is sending.
-
-RANGES
-
-  HTTP 1.1 introduced byte-ranges. Using this, a client can request
-  to get only one or more subparts of a specified document. Curl supports
-  this with the -r flag.
-
-  Get the first 100 bytes of a document:
-
-        curl -r 0-99 http://www.get.this/
-
-  Get the last 500 bytes of a document:
-
-        curl -r -500 http://www.get.this/
-
-  Curl also supports simple ranges for FTP files as well. Then you can only
-  specify start and stop position.
-
-  Get the first 100 bytes of a document using FTP:
-
-        curl -r 0-99 ftp://www.get.this/README
-
-UPLOADING
-
- FTP / FTPS / SFTP / SCP
-
-  Upload all data on stdin to a specified server:
-
-        curl -T - ftp://ftp.upload.com/myfile
-
-  Upload data from a specified file, login with user and password:
-
-        curl -T uploadfile -u user:passwd ftp://ftp.upload.com/myfile
-
-  Upload a local file to the remote site, and use the local file name at the remote
-  site too:
-
-        curl -T uploadfile -u user:passwd ftp://ftp.upload.com/
-
-  Upload a local file to get appended to the remote file:
-
-        curl -T localfile -a ftp://ftp.upload.com/remotefile
-
-  Curl also supports ftp upload through a proxy, but only if the proxy is
-  configured to allow that kind of tunneling. If it does, you can run curl in
-  a fashion similar to:
-
-        curl --proxytunnel -x proxy:port -T localfile ftp.upload.com
-
-SMB / SMBS
-
-        curl -T file.txt -u "domain\username:passwd" \
-             smb://server.example.com/share/
-
- HTTP
-
-  Upload all data on stdin to a specified HTTP site:
-
-        curl -T - http://www.upload.com/myfile
-
-  Note that the HTTP server must have been configured to accept PUT before
-  this can be done successfully.
-
-  For other ways to do HTTP data upload, see the POST section below.
-
-VERBOSE / DEBUG
-
-  If curl fails where it isn't supposed to, if the servers don't let you in,
-  if you can't understand the responses: use the -v flag to get verbose
-  fetching. Curl will output lots of info and what it sends and receives in
-  order to let the user see all client-server interaction (but it won't show
-  you the actual data).
-
-        curl -v ftp://ftp.upload.com/
-
-  To get even more details and information on what curl does, try using the
-  --trace or --trace-ascii options with a given file name to log to, like
-  this:
-
-        curl --trace trace.txt www.haxx.se
-
-
-DETAILED INFORMATION
-
-  Different protocols provide different ways of getting detailed information
-  about specific files/documents. To get curl to show detailed information
-  about a single file, you should use -I/--head option. It displays all
-  available info on a single file for HTTP and FTP. The HTTP information is a
-  lot more extensive.
-
-  For HTTP, you can get the header information (the same as -I would show)
-  shown before the data by using -i/--include. Curl understands the
-  -D/--dump-header option when getting files from both FTP and HTTP, and it
-  will then store the headers in the specified file.
-
-  Store the HTTP headers in a separate file (headers.txt in the example):
-
-        curl --dump-header headers.txt curl.haxx.se
-
-  Note that headers stored in a separate file can be very useful at a later
-  time if you want curl to use cookies sent by the server. More about that in
-  the cookies section.
-
-POST (HTTP)
-
-  It's easy to post data using curl. This is done using the -d <data>
-  option.  The post data must be urlencoded.
-
-  Post a simple "name" and "phone" guestbook.
-
-        curl -d "name=Rafael%20Sagula&phone=3320780" \
-             http://www.where.com/guest.cgi
-
-  How to post a form with curl, lesson #1:
-
-  Dig out all the <input> tags in the form that you want to fill in.
-
-  If there's a "normal" post, you use -d to post. -d takes a full "post
-  string", which is in the format
-
-        <variable1>=<data1>&<variable2>=<data2>&...
-
-  The 'variable' names are the names set with "name=" in the <input> tags, and
-  the data is the contents you want to fill in for the inputs. The data *must*
-  be properly URL encoded. That means you replace space with + and that you
-  replace weird letters with %XX where XX is the hexadecimal representation of
-  the letter's ASCII code.
-
-  Example:
-
-  (page located at http://www.formpost.com/getthis/
-
-        <form action="post.cgi" method="post">
-        <input name=user size=10>
-        <input name=pass type=password size=10>
-        <input name=id type=hidden value="blablabla">
-        <input name=ding value="submit">
-        </form>
-
-  We want to enter user 'foobar' with password '12345'.
-
-  To post to this, you enter a curl command line like:
-
-        curl -d "user=foobar&pass=12345&id=blablabla&ding=submit" \
-             http://www.formpost.com/getthis/post.cgi
-
-
-  While -d uses the application/x-www-form-urlencoded mime-type, generally
-  understood by CGI's and similar, curl also supports the more capable
-  multipart/form-data type. This latter type supports things like file upload.
-
-  -F accepts parameters like -F "name=contents". If you want the contents to
-  be read from a file, use <@filename> as contents. When specifying a file,
-  you can also specify the file content type by appending ';type=<mime type>'
-  to the file name. You can also post the contents of several files in one
-  field.  For example, the field name 'coolfiles' is used to send three files,
-  with different content types using the following syntax:
-
-        curl -F "coolfiles=@fil1.gif;type=image/gif,fil2.txt,fil3.html" \
-             http://www.post.com/postit.cgi
-
-  If the content-type is not specified, curl will try to guess from the file
-  extension (it only knows a few), or use the previously specified type (from
-  an earlier file if several files are specified in a list) or else it will
-  use the default type 'application/octet-stream'.
-
-  Emulate a fill-in form with -F. Let's say you fill in three fields in a
-  form. One field is a file name which to post, one field is your name and one
-  field is a file description. We want to post the file we have written named
-  "cooltext.txt". To let curl do the posting of this data instead of your
-  favourite browser, you have to read the HTML source of the form page and
-  find the names of the input fields. In our example, the input field names
-  are 'file', 'yourname' and 'filedescription'.
-
-        curl -F "file=@cooltext.txt" -F "yourname=Daniel" \
-             -F "filedescription=Cool text file with cool text inside" \
-             http://www.post.com/postit.cgi
-
-  To send two files in one post you can do it in two ways:
-
-  1. Send multiple files in a single "field" with a single field name:
-
-        curl -F "pictures=@dog.gif,cat.gif"
-
-  2. Send two fields with two field names:
-
-        curl -F "docpicture=@dog.gif" -F "catpicture=@cat.gif"
-
-  To send a field value literally without interpreting a leading '@'
-  or '<', or an embedded ';type=', use --form-string instead of
-  -F. This is recommended when the value is obtained from a user or
-  some other unpredictable source. Under these circumstances, using
-  -F instead of --form-string would allow a user to trick curl into
-  uploading a file.
-
-REFERRER
-
-  An HTTP request has the option to include information about which address
-  referred it to the actual page.  Curl allows you to specify the
-  referrer to be used on the command line. It is especially useful to
-  fool or trick stupid servers or CGI scripts that rely on that information
-  being available or contain certain data.
-
-        curl -e www.coolsite.com http://www.showme.com/
-
-  NOTE: The Referer: [sic] field is defined in the HTTP spec to be a full URL.
-
-USER AGENT
-
-  An HTTP request has the option to include information about the browser
-  that generated the request. Curl allows it to be specified on the command
-  line. It is especially useful to fool or trick stupid servers or CGI
-  scripts that only accept certain browsers.
-
-  Example:
-
-  curl -A 'Mozilla/3.0 (Win95; I)' http://www.nationsbank.com/
-
-  Other common strings:
-    'Mozilla/3.0 (Win95; I)'     Netscape Version 3 for Windows 95
-    'Mozilla/3.04 (Win95; U)'    Netscape Version 3 for Windows 95
-    'Mozilla/2.02 (OS/2; U)'     Netscape Version 2 for OS/2
-    'Mozilla/4.04 [en] (X11; U; AIX 4.2; Nav)'           NS for AIX
-    'Mozilla/4.05 [en] (X11; U; Linux 2.0.32 i586)'      NS for Linux
-
-  Note that Internet Explorer tries hard to be compatible in every way:
-    'Mozilla/4.0 (compatible; MSIE 4.01; Windows 95)'    MSIE for W95
-
-  Mozilla is not the only possible User-Agent name:
-    'Konqueror/1.0'             KDE File Manager desktop client
-    'Lynx/2.7.1 libwww-FM/2.14' Lynx command line browser
-
-COOKIES
-
-  Cookies are generally used by web servers to keep state information at the
-  client's side. The server sets cookies by sending a response line in the
-  headers that looks like 'Set-Cookie: <data>' where the data part then
-  typically contains a set of NAME=VALUE pairs (separated by semicolons ';'
-  like "NAME1=VALUE1; NAME2=VALUE2;"). The server can also specify for what
-  path the "cookie" should be used for (by specifying "path=value"), when the
-  cookie should expire ("expire=DATE"), for what domain to use it
-  ("domain=NAME") and if it should be used on secure connections only
-  ("secure").
-
-  If you've received a page from a server that contains a header like:
-        Set-Cookie: sessionid=boo123; path="/foo";
-
-  it means the server wants that first pair passed on when we get anything in
-  a path beginning with "/foo".
-
-  Example, get a page that wants my name passed in a cookie:
-
-        curl -b "name=Daniel" www.sillypage.com
-
-  Curl also has the ability to use previously received cookies in following
-  sessions. If you get cookies from a server and store them in a file in a
-  manner similar to:
-
-        curl --dump-header headers www.example.com
-
-  ... you can then in a second connect to that (or another) site, use the
-  cookies from the 'headers' file like:
-
-        curl -b headers www.example.com
-
-  While saving headers to a file is a working way to store cookies, it is
-  however error-prone and not the preferred way to do this. Instead, make curl
-  save the incoming cookies using the well-known netscape cookie format like
-  this:
-
-        curl -c cookies.txt www.example.com
-
-  Note that by specifying -b you enable the "cookie awareness" and with -L
-  you can make curl follow a location: (which often is used in combination
-  with cookies). So that if a site sends cookies and a location, you can
-  use a non-existing file to trigger the cookie awareness like:
-
-        curl -L -b empty.txt www.example.com
-
-  The file to read cookies from must be formatted using plain HTTP headers OR
-  as netscape's cookie file. Curl will determine what kind it is based on the
-  file contents.  In the above command, curl will parse the header and store
-  the cookies received from www.example.com.  curl will send to the server the
-  stored cookies which match the request as it follows the location.  The
-  file "empty.txt" may be a nonexistent file.
-
-  To read and write cookies from a netscape cookie file, you can set both -b
-  and -c to use the same file:
-
-        curl -b cookies.txt -c cookies.txt www.example.com
-
-PROGRESS METER
-
-  The progress meter exists to show a user that something actually is
-  happening. The different fields in the output have the following meaning:
-
-  % Total    % Received % Xferd  Average Speed          Time             Curr.
-                                 Dload  Upload Total    Current  Left    Speed
-  0  151M    0 38608    0     0   9406      0  4:41:43  0:00:04  4:41:39  9287
-
-  From left-to-right:
-   %             - percentage completed of the whole transfer
-   Total         - total size of the whole expected transfer
-   %             - percentage completed of the download
-   Received      - currently downloaded amount of bytes
-   %             - percentage completed of the upload
-   Xferd         - currently uploaded amount of bytes
-   Average Speed
-   Dload         - the average transfer speed of the download
-   Average Speed
-   Upload        - the average transfer speed of the upload
-   Time Total    - expected time to complete the operation
-   Time Current  - time passed since the invoke
-   Time Left     - expected time left to completion
-   Curr.Speed    - the average transfer speed the last 5 seconds (the first
-                   5 seconds of a transfer is based on less time of course.)
-
-  The -# option will display a totally different progress bar that doesn't
-  need much explanation!
-
-SPEED LIMIT
-
-  Curl allows the user to set the transfer speed conditions that must be met
-  to let the transfer keep going. By using the switch -y and -Y you
-  can make curl abort transfers if the transfer speed is below the specified
-  lowest limit for a specified time.
-
-  To have curl abort the download if the speed is slower than 3000 bytes per
-  second for 1 minute, run:
-
-        curl -Y 3000 -y 60 www.far-away-site.com
-
-  This can very well be used in combination with the overall time limit, so
-  that the above operation must be completed in whole within 30 minutes:
-
-        curl -m 1800 -Y 3000 -y 60 www.far-away-site.com
-
-  Forcing curl not to transfer data faster than a given rate is also possible,
-  which might be useful if you're using a limited bandwidth connection and you
-  don't want your transfer to use all of it (sometimes referred to as
-  "bandwidth throttle").
-
-  Make curl transfer data no faster than 10 kilobytes per second:
-
-        curl --limit-rate 10K www.far-away-site.com
-
-    or
-
-        curl --limit-rate 10240 www.far-away-site.com
-
-  Or prevent curl from uploading data faster than 1 megabyte per second:
-
-        curl -T upload --limit-rate 1M ftp://uploadshereplease.com
-
-  When using the --limit-rate option, the transfer rate is regulated on a
-  per-second basis, which will cause the total transfer speed to become lower
-  than the given number. Sometimes of course substantially lower, if your
-  transfer stalls during periods.
-
-CONFIG FILE
-
-  Curl automatically tries to read the .curlrc file (or _curlrc file on win32
-  systems) from the user's home dir on startup.
-
-  The config file could be made up with normal command line switches, but you
-  can also specify the long options without the dashes to make it more
-  readable. You can separate the options and the parameter with spaces, or
-  with = or :. Comments can be used within the file. If the first letter on a
-  line is a '#'-symbol the rest of the line is treated as a comment.
-
-  If you want the parameter to contain spaces, you must enclose the entire
-  parameter within double quotes ("). Within those quotes, you specify a
-  quote as \".
-
-  NOTE: You must specify options and their arguments on the same line.
-
-  Example, set default time out and proxy in a config file:
-
-        # We want a 30 minute timeout:
-        -m 1800
-        # ... and we use a proxy for all accesses:
-        proxy = proxy.our.domain.com:8080
-
-  White spaces ARE significant at the end of lines, but all white spaces
-  leading up to the first characters of each line are ignored.
-
-  Prevent curl from reading the default file by using -q as the first command
-  line parameter, like:
-
-        curl -q www.thatsite.com
-
-  Force curl to get and display a local help page in case it is invoked
-  without URL by making a config file similar to:
-
-        # default url to get
-        url = "http://help.with.curl.com/curlhelp.html"
-
-  You can specify another config file to be read by using the -K/--config
-  flag. If you set config file name to "-" it'll read the config from stdin,
-  which can be handy if you want to hide options from being visible in process
-  tables etc:
-
-        echo "user = user:passwd" | curl -K - http://that.secret.site.com
-
-EXTRA HEADERS
-
-  When using curl in your own very special programs, you may end up needing
-  to pass on your own custom headers when getting a web page. You can do
-  this by using the -H flag.
-
-  Example, send the header "X-you-and-me: yes" to the server when getting a
-  page:
-
-        curl -H "X-you-and-me: yes" www.love.com
-
-  This can also be useful in case you want curl to send a different text in a
-  header than it normally does. The -H header you specify then replaces the
-  header curl would normally send. If you replace an internal header with an
-  empty one, you prevent that header from being sent. To prevent the Host:
-  header from being used:
-
-        curl -H "Host:" www.server.com
-
-FTP and PATH NAMES
-
-  Do note that when getting files with the ftp:// URL, the given path is
-  relative the directory you enter. To get the file 'README' from your home
-  directory at your ftp site, do:
-
-        curl ftp://user:passwd@my.site.com/README
-
-  But if you want the README file from the root directory of that very same
-  site, you need to specify the absolute file name:
-
-        curl ftp://user:passwd@my.site.com//README
-
-  (I.e with an extra slash in front of the file name.)
-
-SFTP and SCP and PATH NAMES
-
-  With sftp: and scp: URLs, the path name given is the absolute name on the
-  server. To access a file relative to the remote user's home directory,
-  prefix the file with /~/ , such as:
-
-        curl -u $USER sftp://home.example.com/~/.bashrc
-
-FTP and firewalls
-
-  The FTP protocol requires one of the involved parties to open a second
-  connection as soon as data is about to get transferred. There are two ways to
-  do this.
-
-  The default way for curl is to issue the PASV command which causes the
-  server to open another port and await another connection performed by the
-  client. This is good if the client is behind a firewall that doesn't allow
-  incoming connections.
-
-        curl ftp.download.com
-
-  If the server, for example, is behind a firewall that doesn't allow connections
-  on ports other than 21 (or if it just doesn't support the PASV command), the
-  other way to do it is to use the PORT command and instruct the server to
-  connect to the client on the given IP number and port (as parameters to the
-  PORT command).
-
-  The -P flag to curl supports a few different options. Your machine may have
-  several IP-addresses and/or network interfaces and curl allows you to select
-  which of them to use. Default address can also be used:
-
-        curl -P - ftp.download.com
-
-  Download with PORT but use the IP address of our 'le0' interface (this does
-  not work on windows):
-
-        curl -P le0 ftp.download.com
-
-  Download with PORT but use 192.168.0.10 as our IP address to use:
-
-        curl -P 192.168.0.10 ftp.download.com
-
-NETWORK INTERFACE
-
-  Get a web page from a server using a specified port for the interface:
-
-        curl --interface eth0:1 http://www.netscape.com/
-
-  or
-
-        curl --interface 192.168.1.10 http://www.netscape.com/
-
-HTTPS
-
-  Secure HTTP requires SSL libraries to be installed and used when curl is
-  built. If that is done, curl is capable of retrieving and posting documents
-  using the HTTPS protocol.
-
-  Example:
-
-        curl https://www.secure-site.com
-
-  Curl is also capable of using your personal certificates to get/post files
-  from sites that require valid certificates. The only drawback is that the
-  certificate needs to be in PEM-format. PEM is a standard and open format to
-  store certificates with, but it is not used by the most commonly used
-  browsers (Netscape and MSIE both use the so called PKCS#12 format). If you
-  want curl to use the certificates you use with your (favourite) browser, you
-  may need to download/compile a converter that can convert your browser's
-  formatted certificates to PEM formatted ones. This kind of converter is
-  included in recent versions of OpenSSL, and for older versions Dr Stephen
-  N. Henson has written a patch for SSLeay that adds this functionality. You
-  can get his patch (that requires an SSLeay installation) from his site at:
-  https://web.archive.org/web/20170715155512/www.drh-consultancy.demon.co.uk/
-
-  Example on how to automatically retrieve a document using a certificate with
-  a personal password:
-
-        curl -E /path/to/cert.pem:password https://secure.site.com/
-
-  If you neglect to specify the password on the command line, you will be
-  prompted for the correct password before any data can be received.
-
-  Many older SSL-servers have problems with SSLv3 or TLS, which newer versions
-  of OpenSSL etc use, therefore it is sometimes useful to specify what
-  SSL-version curl should use. Use -3, -2 or -1 to specify that exact SSL
-  version to use (for SSLv3, SSLv2 or TLSv1 respectively):
-
-        curl -2 https://secure.site.com/
-
-  Otherwise, curl will first attempt to use v3 and then v2.
-
-  To use OpenSSL to convert your favourite browser's certificate into a PEM
-  formatted one that curl can use, do something like this:
-
-    In Netscape, you start with hitting the 'Security' menu button.
-
-    Select 'certificates->yours' and then pick a certificate in the list
-
-    Press the 'Export' button
-
-    enter your PIN code for the certs
-
-    select a proper place to save it
-
-    Run the 'openssl' application to convert the certificate. If you cd to the
-    openssl installation, you can do it like:
-
-     # ./apps/openssl pkcs12 -in [file you saved] -clcerts -out [PEMfile]
-
-    In Firefox, select Options, then Advanced, then the Encryption tab,
-    View Certificates. This opens the Certificate Manager, where you can
-    Export. Be sure to select PEM for the Save as type.
-
-    In Internet Explorer, select Internet Options, then the Content tab, then
-    Certificates. Then you can Export, and depending on the format you may
-    need to convert to PEM.
-
-    In Chrome, select Settings, then Show Advanced Settings. Under HTTPS/SSL
-    select Manage Certificates.
-
-RESUMING FILE TRANSFERS
-
- To continue a file transfer where it was previously aborted, curl supports
- resume on HTTP(S) downloads as well as FTP uploads and downloads.
-
- Continue downloading a document:
-
-        curl -C - -o file ftp://ftp.server.com/path/file
-
- Continue uploading a document(*1):
-
-        curl -C - -T file ftp://ftp.server.com/path/file
-
- Continue downloading a document from a web server(*2):
-
-        curl -C - -o file http://www.server.com/
-
- (*1) = This requires that the FTP server supports the non-standard command
-        SIZE. If it doesn't, curl will say so.
-
- (*2) = This requires that the web server supports at least HTTP/1.1. If it
-        doesn't, curl will say so.
-
-TIME CONDITIONS
-
- HTTP allows a client to specify a time condition for the document it
- requests. It is If-Modified-Since or If-Unmodified-Since. Curl allows you to
- specify them with the -z/--time-cond flag.
-
- For example, you can easily make a download that only gets performed if the
- remote file is newer than a local copy. It would be made like:
-
-        curl -z local.html http://remote.server.com/remote.html
-
- Or you can download a file only if the local file is newer than the remote
- one. Do this by prepending the date string with a '-', as in:
-
-        curl -z -local.html http://remote.server.com/remote.html
-
- You can specify a "free text" date as condition. Tell curl to only download
- the file if it was updated since January 12, 2012:
-
-        curl -z "Jan 12 2012" http://remote.server.com/remote.html
-
- Curl will then accept a wide range of date formats. You always make the date
- check the other way around by prepending it with a dash '-'.
-
-DICT
-
-  For fun try
-
-        curl dict://dict.org/m:curl
-        curl dict://dict.org/d:heisenbug:jargon
-        curl dict://dict.org/d:daniel:web1913
-
-  Aliases for 'm' are 'match' and 'find', and aliases for 'd' are 'define'
-  and 'lookup'. For example,
-
-        curl dict://dict.org/find:curl
-
-  Commands that break the URL description of the RFC (but not the DICT
-  protocol) are
-
-        curl dict://dict.org/show:db
-        curl dict://dict.org/show:strat
-
-  Authentication is still missing (but this is not required by the RFC)
-
-LDAP
-
-  If you have installed the OpenLDAP library, curl can take advantage of it
-  and offer ldap:// support.
-  On Windows, curl will use WinLDAP from Platform SDK by default.
-
-  Default protocol version used by curl is LDAPv3. LDAPv2 will be used as
-  fallback mechanism in case if LDAPv3 will fail to connect.
-
-  LDAP is a complex thing and writing an LDAP query is not an easy task. I do
-  advise you to dig up the syntax description for that elsewhere. One such
-  place might be:
-
-  RFC 2255, "The LDAP URL Format" https://curl.haxx.se/rfc/rfc2255.txt
-
-  To show you an example, this is how I can get all people from my local LDAP
-  server that has a certain sub-domain in their email address:
-
-        curl -B "ldap://ldap.frontec.se/o=frontec??sub?mail=*sth.frontec.se"
-
-  If I want the same info in HTML format, I can get it by not using the -B
-  (enforce ASCII) flag.
-
-  You also can use authentication when accessing LDAP catalog:
-
-      curl -u user:passwd "ldap://ldap.frontec.se/o=frontec??sub?mail=*"
-      curl "ldap://user:passwd@ldap.frontec.se/o=frontec??sub?mail=*"
-
-  By default, if user and password provided, OpenLDAP/WinLDAP will use basic
-  authentication. On Windows you can control this behavior by providing
-  one of --basic, --ntlm or --digest option in curl command line
-
-      curl --ntlm "ldap://user:passwd@ldap.frontec.se/o=frontec??sub?mail=*"
-
-  On Windows, if no user/password specified, auto-negotiation mechanism will
-  be used with current logon credentials (SSPI/SPNEGO).
-
-ENVIRONMENT VARIABLES
-
-  Curl reads and understands the following environment variables:
-
-        http_proxy, HTTPS_PROXY, FTP_PROXY
-
-  They should be set for protocol-specific proxies. General proxy should be
-  set with
-
-        ALL_PROXY
-
-  A comma-separated list of host names that shouldn't go through any proxy is
-  set in (only an asterisk, '*' matches all hosts)
-
-        NO_PROXY
-
-  If the host name matches one of these strings, or the host is within the
-  domain of one of these strings, transactions with that node will not be
-  proxied. When a domain is used, it needs to start with a period. A user can
-  specify that both www.example.com and foo.example.com should not use a
-  proxy by setting NO_PROXY to ".example.com". By including the full name you
-  can exclude specific host names, so to make www.example.com not use a proxy
-  but still have foo.example.com do it, set NO_PROXY to "www.example.com"
-
-  The usage of the -x/--proxy flag overrides the environment variables.
-
-NETRC
-
-  Unix introduced the .netrc concept a long time ago. It is a way for a user
-  to specify name and password for commonly visited FTP sites in a file so
-  that you don't have to type them in each time you visit those sites. You
-  realize this is a big security risk if someone else gets hold of your
-  passwords, so therefore most unix programs won't read this file unless it is
-  only readable by yourself (curl doesn't care though).
-
-  Curl supports .netrc files if told to (using the -n/--netrc and
-  --netrc-optional options). This is not restricted to just FTP,
-  so curl can use it for all protocols where authentication is used.
-
-  A very simple .netrc file could look something like:
-
-        machine curl.haxx.se login iamdaniel password mysecret
-
-CUSTOM OUTPUT
-
-  To better allow script programmers to get to know about the progress of
-  curl, the -w/--write-out option was introduced. Using this, you can specify
-  what information from the previous transfer you want to extract.
-
-  To display the amount of bytes downloaded together with some text and an
-  ending newline:
-
-        curl -w 'We downloaded %{size_download} bytes\n' www.download.com
-
-KERBEROS FTP TRANSFER
-
-  Curl supports kerberos4 and kerberos5/GSSAPI for FTP transfers. You need
-  the kerberos package installed and used at curl build time for it to be
-  available.
-
-  First, get the krb-ticket the normal way, like with the kinit/kauth tool.
-  Then use curl in way similar to:
-
-        curl --krb private ftp://krb4site.com -u username:fakepwd
-
-  There's no use for a password on the -u switch, but a blank one will make
-  curl ask for one and you already entered the real password to kinit/kauth.
-
-TELNET
-
-  The curl telnet support is basic and very easy to use. Curl passes all data
-  passed to it on stdin to the remote server. Connect to a remote telnet
-  server using a command line similar to:
-
-        curl telnet://remote.server.com
-
-  And enter the data to pass to the server on stdin. The result will be sent
-  to stdout or to the file you specify with -o.
-
-  You might want the -N/--no-buffer option to switch off the buffered output
-  for slow connections or similar.
-
-  Pass options to the telnet protocol negotiation, by using the -t option. To
-  tell the server we use a vt100 terminal, try something like:
-
-        curl -tTTYPE=vt100 telnet://remote.server.com
-
-  Other interesting options for it -t include:
-
-   - XDISPLOC=<X display> Sets the X display location.
-
-   - NEW_ENV=<var,val> Sets an environment variable.
-
-  NOTE: The telnet protocol does not specify any way to login with a specified
-  user and password so curl can't do that automatically. To do that, you need
-  to track when the login prompt is received and send the username and
-  password accordingly.
-
-PERSISTENT CONNECTIONS
-
-  Specifying multiple files on a single command line will make curl transfer
-  all of them, one after the other in the specified order.
-
-  libcurl will attempt to use persistent connections for the transfers so that
-  the second transfer to the same host can use the same connection that was
-  already initiated and was left open in the previous transfer. This greatly
-  decreases connection time for all but the first transfer and it makes a far
-  better use of the network.
-
-  Note that curl cannot use persistent connections for transfers that are used
-  in subsequence curl invokes. Try to stuff as many URLs as possible on the
-  same command line if they are using the same host, as that'll make the
-  transfers faster. If you use an HTTP proxy for file transfers, practically
-  all transfers will be persistent.
-
-MULTIPLE TRANSFERS WITH A SINGLE COMMAND LINE
-
-  As is mentioned above, you can download multiple files with one command line
-  by simply adding more URLs. If you want those to get saved to a local file
-  instead of just printed to stdout, you need to add one save option for each
-  URL you specify. Note that this also goes for the -O option (but not
-  --remote-name-all).
-
-  For example: get two files and use -O for the first and a custom file
-  name for the second:
-
-    curl -O http://url.com/file.txt ftp://ftp.com/moo.exe -o moo.jpg
-
-  You can also upload multiple files in a similar fashion:
-
-    curl -T local1 ftp://ftp.com/moo.exe -T local2 ftp://ftp.com/moo2.txt
-
-IPv6
-
-  curl will connect to a server with IPv6 when a host lookup returns an IPv6
-  address and fall back to IPv4 if the connection fails. The --ipv4 and --ipv6
-  options can specify which address to use when both are available. IPv6
-  addresses can also be specified directly in URLs using the syntax:
-
-    http://[2001:1890:1112:1::20]/overview.html
-
-  When this style is used, the -g option must be given to stop curl from
-  interpreting the square brackets as special globbing characters.  Link local
-  and site local addresses including a scope identifier, such as fe80::1234%1,
-  may also be used, but the scope portion must be numeric or match an existing
-  network interface on Linux and the percent character must be URL escaped. The
-  previous example in an SFTP URL might look like:
-
-    sftp://[fe80::1234%251]/
-
-  IPv6 addresses provided other than in URLs (e.g. to the --proxy, --interface
-  or --ftp-port options) should not be URL encoded.
-
-METALINK
-
-  Curl supports Metalink (both version 3 and 4 (RFC 5854) are supported), a way
-  to list multiple URIs and hashes for a file. Curl will make use of the mirrors
-  listed within for failover if there are errors (such as the file or server not
-  being available). It will also verify the hash of the file after the download
-  completes. The Metalink file itself is downloaded and processed in memory and
-  not stored in the local file system.
-
-  Example to use a remote Metalink file:
-
-    curl --metalink http://www.example.com/example.metalink
-
-  To use a Metalink file in the local file system, use FILE protocol (file://):
-
-    curl --metalink file://example.metalink
-
-  Please note that if FILE protocol is disabled, there is no way to use a local
-  Metalink file at the time of this writing. Also note that if --metalink and
-  --include are used together, --include will be ignored. This is because including
-  headers in the response will break Metalink parser and if the headers are included
-  in the file described in Metalink file, hash check will fail.
-
-MAILING LISTS
-
-  For your convenience, we have several open mailing lists to discuss curl,
-  its development and things relevant to this. Get all info at
-  https://curl.haxx.se/mail/. Some of the lists available are:
-
-  curl-users
-
-    Users of the command line tool. How to use it, what doesn't work, new
-    features, related tools, questions, news, installations, compilations,
-    running, porting etc.
-
-  curl-library
-
-    Developers using or developing libcurl. Bugs, extensions, improvements.
-
-  curl-announce
-
-    Low-traffic. Only receives announcements of new public versions. At worst,
-    that makes something like one or two mails per month, but usually only one
-    mail every second month.
-
-  curl-and-php
-
-    Using the curl functions in PHP. Everything curl with a PHP angle. Or PHP
-    with a curl angle.
-
-  curl-and-python
-
-    Python hackers using curl with or without the python binding pycurl.
-
-  Please direct curl questions, feature requests and trouble reports to one of
-  these mailing lists instead of mailing any individual.
index 0183f1a..5ce0d83 100644 (file)
@@ -5,7 +5,7 @@
 #                            | (__| |_| |  _ <| |___
 #                             \___|\___/|_| \_\_____|
 #
-# Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 #
 # This software is licensed as described in the file COPYING, which
 # you should have received as part of this distribution. The terms
@@ -42,7 +42,9 @@ CLEANFILES = $(GENHTMLPAGES) $(PDFPAGES) $(MANDISTPAGES) curl.1
 
 EXTRA_DIST =                                    \
  $(noinst_man_MANS)                             \
+ ALTSVC.md                                      \
  BINDINGS.md                                    \
+ BUG-BOUNTY.md                                  \
  BUGS                                           \
  CHECKSRC.md                                    \
  CIPHERS.md                                     \
@@ -50,7 +52,10 @@ EXTRA_DIST =                                    \
  CODE_OF_CONDUCT.md                             \
  CODE_STYLE.md                                  \
  CONTRIBUTE.md                                  \
+ CURL-DISABLE.md                                \
  DEPRECATE.md                                   \
+ ESNI.md                                        \
+ EXPERIMENTAL.md                                \
  FAQ                                            \
  FEATURES                                       \
  GOVERNANCE.md                                  \
@@ -58,6 +63,7 @@ EXTRA_DIST =                                    \
  HISTORY.md                                     \
  HTTP-COOKIES.md                                \
  HTTP2.md                                       \
+ HTTP3.md                                       \
  INSTALL                                        \
  INSTALL.cmake                                  \
  INSTALL.md                                     \
@@ -65,7 +71,7 @@ EXTRA_DIST =                                    \
  KNOWN_BUGS                                     \
  LICENSE-MIXING.md                              \
  MAIL-ETIQUETTE                                 \
MANUAL                                         \
PARALLEL-TRANSFERS.md                          \
  README.cmake                                   \
  README.md                                      \
  README.netware                                 \
@@ -95,7 +101,7 @@ SUFFIXES = .1 .html .pdf
 # have changed.
 $(abs_builddir)/curl.1:
        if test "$(top_builddir)x" != "$(top_srcdir)x" -a -e "$(srcdir)/curl.1"; then \
-               cp -fp "$(srcdir)/curl.1" $@; fi
+               $(INSTALL_DATA) "$(srcdir)/curl.1" $@; fi
        cd cmdline-opts && $(MAKE)
 
 html: $(HTMLPAGES)
index 55a931f..1e58d6f 100644 (file)
@@ -21,7 +21,7 @@
 #                            | (__| |_| |  _ <| |___
 #                             \___|\___/|_| \_\_____|
 #
-# Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 #
 # This software is licensed as described in the file COPYING, which
 # you should have received as part of this distribution. The terms
@@ -111,8 +111,7 @@ build_triplet = @build@
 host_triplet = @host@
 subdir = docs
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/ax_code_coverage.m4 \
-       $(top_srcdir)/m4/ax_compile_check_sizeof.m4 \
+am__aclocal_m4_deps = $(top_srcdir)/m4/ax_compile_check_sizeof.m4 \
        $(top_srcdir)/m4/curl-compilers.m4 \
        $(top_srcdir)/m4/curl-confopts.m4 \
        $(top_srcdir)/m4/curl-functions.m4 \
@@ -266,12 +265,6 @@ CC = @CC@
 CCDEPMODE = @CCDEPMODE@
 CFLAGS = @CFLAGS@
 CFLAG_CURL_SYMBOL_HIDING = @CFLAG_CURL_SYMBOL_HIDING@
-CODE_COVERAGE_CFLAGS = @CODE_COVERAGE_CFLAGS@
-CODE_COVERAGE_CPPFLAGS = @CODE_COVERAGE_CPPFLAGS@
-CODE_COVERAGE_CXXFLAGS = @CODE_COVERAGE_CXXFLAGS@
-CODE_COVERAGE_ENABLED = @CODE_COVERAGE_ENABLED@
-CODE_COVERAGE_LDFLAGS = @CODE_COVERAGE_LDFLAGS@
-CODE_COVERAGE_LIBS = @CODE_COVERAGE_LIBS@
 CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
@@ -313,14 +306,15 @@ ENABLE_SHARED = @ENABLE_SHARED@
 ENABLE_STATIC = @ENABLE_STATIC@
 EXEEXT = @EXEEXT@
 FGREP = @FGREP@
+FISH_FUNCTIONS_DIR = @FISH_FUNCTIONS_DIR@
 GCOV = @GCOV@
-GENHTML = @GENHTML@
 GREP = @GREP@
 HAVE_BROTLI = @HAVE_BROTLI@
 HAVE_GNUTLS_SRP = @HAVE_GNUTLS_SRP@
 HAVE_LDAP_SSL = @HAVE_LDAP_SSL@
 HAVE_LIBZ = @HAVE_LIBZ@
 HAVE_OPENSSL_SRP = @HAVE_OPENSSL_SRP@
+HAVE_PROTO_BSDSOCKET_H = @HAVE_PROTO_BSDSOCKET_H@
 IDN_ENABLED = @IDN_ENABLED@
 INSTALL = @INSTALL@
 INSTALL_DATA = @INSTALL_DATA@
@@ -381,9 +375,7 @@ STRIP = @STRIP@
 SUPPORT_FEATURES = @SUPPORT_FEATURES@
 SUPPORT_PROTOCOLS = @SUPPORT_PROTOCOLS@
 USE_ARES = @USE_ARES@
-USE_AXTLS = @USE_AXTLS@
-USE_CYASSL = @USE_CYASSL@
-USE_DARWINSSL = @USE_DARWINSSL@
+USE_BEARSSL = @USE_BEARSSL@
 USE_GNUTLS = @USE_GNUTLS@
 USE_GNUTLS_NETTLE = @USE_GNUTLS_NETTLE@
 USE_LIBRTMP = @USE_LIBRTMP@
@@ -392,12 +384,17 @@ USE_LIBSSH2 = @USE_LIBSSH2@
 USE_MBEDTLS = @USE_MBEDTLS@
 USE_MESALINK = @USE_MESALINK@
 USE_NGHTTP2 = @USE_NGHTTP2@
+USE_NGHTTP3 = @USE_NGHTTP3@
+USE_NGTCP2 = @USE_NGTCP2@
+USE_NGTCP2_CRYPTO_OPENSSL = @USE_NGTCP2_CRYPTO_OPENSSL@
 USE_NSS = @USE_NSS@
 USE_OPENLDAP = @USE_OPENLDAP@
-USE_POLARSSL = @USE_POLARSSL@
+USE_QUICHE = @USE_QUICHE@
 USE_SCHANNEL = @USE_SCHANNEL@
+USE_SECTRANSP = @USE_SECTRANSP@
 USE_UNIX_SOCKETS = @USE_UNIX_SOCKETS@
 USE_WINDOWS_SSPI = @USE_WINDOWS_SSPI@
+USE_WOLFSSL = @USE_WOLFSSL@
 VERSION = @VERSION@
 VERSIONNUM = @VERSIONNUM@
 ZLIB_LIBS = @ZLIB_LIBS@
@@ -476,7 +473,9 @@ DIST_SUBDIRS = $(SUBDIRS) examples libcurl
 CLEANFILES = $(GENHTMLPAGES) $(PDFPAGES) $(MANDISTPAGES) curl.1
 EXTRA_DIST = \
  $(noinst_man_MANS)                             \
+ ALTSVC.md                                      \
  BINDINGS.md                                    \
+ BUG-BOUNTY.md                                  \
  BUGS                                           \
  CHECKSRC.md                                    \
  CIPHERS.md                                     \
@@ -484,7 +483,10 @@ EXTRA_DIST = \
  CODE_OF_CONDUCT.md                             \
  CODE_STYLE.md                                  \
  CONTRIBUTE.md                                  \
+ CURL-DISABLE.md                                \
  DEPRECATE.md                                   \
+ ESNI.md                                        \
+ EXPERIMENTAL.md                                \
  FAQ                                            \
  FEATURES                                       \
  GOVERNANCE.md                                  \
@@ -492,6 +494,7 @@ EXTRA_DIST = \
  HISTORY.md                                     \
  HTTP-COOKIES.md                                \
  HTTP2.md                                       \
+ HTTP3.md                                       \
  INSTALL                                        \
  INSTALL.cmake                                  \
  INSTALL.md                                     \
@@ -499,7 +502,7 @@ EXTRA_DIST = \
  KNOWN_BUGS                                     \
  LICENSE-MIXING.md                              \
  MAIL-ETIQUETTE                                 \
MANUAL                                         \
PARALLEL-TRANSFERS.md                          \
  README.cmake                                   \
  README.md                                      \
  README.netware                                 \
@@ -887,7 +890,7 @@ uninstall-man: uninstall-man1
 # have changed.
 $(abs_builddir)/curl.1:
        if test "$(top_builddir)x" != "$(top_srcdir)x" -a -e "$(srcdir)/curl.1"; then \
-               cp -fp "$(srcdir)/curl.1" $@; fi
+               $(INSTALL_DATA) "$(srcdir)/curl.1" $@; fi
        cd cmdline-opts && $(MAKE)
 
 html: $(HTMLPAGES)
diff --git a/docs/PARALLEL-TRANSFERS.md b/docs/PARALLEL-TRANSFERS.md
new file mode 100644 (file)
index 0000000..da688ea
--- /dev/null
@@ -0,0 +1,58 @@
+# Parallel transfers
+
+curl 7.66.0 introduces support for doing multiple transfers simultaneously; in
+parallel.
+
+## -Z, --parallel
+
+When this command line option is used, curl will perform the transfers given
+to it at the same time. It will do up to `--parallel-max` concurrent
+transfers, with a default value of 50.
+
+## Progress meter
+
+The progress meter that is displayed when doing parallel transfers is
+completely different than the regular one used for each single transfer.
+
+  It shows:
+
+ o percent download (if known, which means *all* transfers need to have a
+   known size)
+ o percent upload (if known, with the same caveat as for download)
+ o total amount of downloaded data
+ o total amount of uploaded data
+ o number of transfers to perform
+ o number of concurrent transfers being transferred right now
+ o number of transfers queued up waiting to start
+ o total time all transfers are expected to take (if sizes are known)
+ o current time the transfers have spent so far
+ o estimated time left (if sizes are known)
+ o current transfer speed (the faster of UL/DL speeds measured over the last
+   few seconds)
+
+Example:
+
+    DL% UL%  Dled  Uled  Xfers  Live   Qd Total     Current  Left    Speed
+    72  --  37.9G     0   101    30    23  0:00:55  0:00:34  0:00:22 2752M
+
+## Behavior differences
+
+Connections are shared fine between different easy handles, but the
+"authentication contexts" are not. So for example doing HTTP Digest auth with
+one handle for a particular transfer and then continue on with another handle
+that reuses the same connection, the second handle can't send the necessary
+Authorization header at once since the context is only kept in the original
+easy handle.
+
+To fix this, the authorization state could be made possible to share with the
+share API as well, as a context per origin + path (realm?) basically.
+
+Visible in test 153, 1412 and more.
+
+## Feedback!
+
+This is early days for parallel transfer support. Keep your eyes open for
+unintended side effects or downright bugs.
+
+Tell us what you think and how you think we could improve this feature!
+
index 635ed8f..d203458 100644 (file)
@@ -16,7 +16,7 @@ in the source code repo
 
 - run "./maketgz 7.34.0" to build the release tarballs. It is important that
   you run this on a machine with the correct set of autotools etc installed
-  as this is what then will be shipped and used by most users on *nix like
+  as this is what then will be shipped and used by most users on \*nix like
   systems.
 
 - push the git commits and the new tag
@@ -84,9 +84,15 @@ Coming dates
 Based on the description above, here are some planned release dates (at the
 time of this writing):
 
-- October 31, 2018
-- December 12, 2018
-- February 6, 2019
-- April 3, 2019
-- May 29, 2019
-- July 24, 2019
+- January 8, 2020 (moved)
+- February 27, 2020
+- April 22, 2020
+- June 17, 2020
+- August 12, 2020
+- October 7, 2020
+- December 2, 2020
+- January 27, 2021
+
+The above (and more) curl-related dates are published in
+[iCalendar format](https://calendar.google.com/calendar/ical/c9u5d64odop9js55oltfarjk6g%40group.calendar.google.com/public/basic.ics)
+as well.
index 64989b1..1d47682 100644 (file)
@@ -5,38 +5,52 @@ Roadmap of things Daniel Stenberg wants to work on next. It is intended to
 serve as a guideline for others for information, feedback and possible
 participation.
 
-QUIC
+HSTS
 ----
 
See the [QUIC wiki page](https://github.com/curl/curl/wiki/QUIC).
Complete and merge [the existing PR](https://github.com/curl/curl/pull/2682).
 
-HTTP cookies
+ Loading a huge preload file is probably not too interesting to most people,
+ but using a custom file and reacting to HSTS response header probably are
+ good features.
+
+DNS-over-TLS
 ------------
 
-Two cookie drafts have been adopted by the httpwg in IETF and we should
-support them as the popular browsers will as well:
+ Similar to DNS-over-HTTPS. Could share quite a lot of generic code.
+
+ESNI (Encrypted SNI)
+--------------------
 
-[Deprecate modification of 'secure' cookies from non-secure
-origins](https://tools.ietf.org/html/draft-ietf-httpbis-cookie-alone-00)
+ See Daniel's post on [Support of Encrypted
+ SNI](https://curl.haxx.se/mail/lib-2019-03/0000.html) on the mailing list.
 
-[Cookie Prefixes](https://tools.ietf.org/html/draft-ietf-httpbis-cookie-prefixes-00)
+ Initial work exists in https://github.com/curl/curl/pull/4011
 
-[Firefox bug report about secure cookies](https://bugzilla.mozilla.org/show_bug.cgi?id=976073)
+tiny-curl
+---------
 
-SRV records
------------
+ There's no immediate action for this but users seem keen on being able to
+ building custom minimized versions of libcurl for their products. Make sure
+ new features that are "niche" can still be disabled at build-time.
+
+MQTT
+----
 
-How to find services for specific domains/hosts.
+ Support receiving and sending MQTT messages. Initial work exists in
+ https://github.com/curl/curl/pull/3514
 
-Improve
--------
+Hardcode “localhost”
+--------------------
 
-1. curl -h output (considered overwhelming to users).
+ No need to resolve it. Avoid a risk where this is resolved over the network
+ and actually responds with something else than a local address. Some
+ operating systems already do this. Also:
+ https://tools.ietf.org/html/draft-ietf-dnsop-let-localhost-be-localhost-02
 
-2. We have > 200 command line options, is there a way to redo things to
-   simplify or improve the situation as we are likely to keep adding
-   features/options in the future too.
+"menu config"-style build feature selection
+-------------------------------------------
 
-3. Perform some of the clean up from the TODO document, removing old
-   definitions and such like that are currently earmarked to be removed years
  ago.
+ Allow easier building of custom libcurl versions with only a selected feature
+ where the available features are easily browsable and toggle-able ON/OFF or
similar.
index 9dd4cb7..e844a9a 100644 (file)
@@ -10,9 +10,8 @@ Publishing Information
 All known and public curl or libcurl related vulnerabilities are listed on
 [the curl web site security page](https://curl.haxx.se/docs/security.html).
 
-Security vulnerabilities should not be entered in the project's public bug
-tracker unless the necessary configuration is in place to limit access to the
-issue to only the reporter and the project's security team.
+Security vulnerabilities **should not** be entered in the project's public bug
+tracker.
 
 Vulnerability Handling
 ----------------------
@@ -23,20 +22,20 @@ No information should be made public about a vulnerability until it is
 formally announced at the end of this process. That means, for example that a
 bug tracker entry must NOT be created to track the issue since that will make
 the issue public and it should not be discussed on any of the project's public
-mailing lists. Also messages associated with any commits should not make
-any reference to the security nature of the commit if done prior to the public
+mailing lists. Also messages associated with any commits should not make any
+reference to the security nature of the commit if done prior to the public
 announcement.
 
-- The person discovering the issue, the reporter, reports the vulnerability
-  privately to `curl-security@haxx.se`. That's an email alias that reaches a
-  handful of selected and trusted people.
+- The person discovering the issue, the reporter, reports the vulnerability on
+  [https://hackerone.com/curl](https://hackerone.com/curl). Issues filed there
+  reach a handful of selected and trusted people.
 
 - Messages that do not relate to the reporting or managing of an undisclosed
   security vulnerability in curl or libcurl are ignored and no further action
   is required.
 
-- A person in the security team sends an e-mail to the original reporter to
-  acknowledge the report.
+- A person in the security team responds to the original report to acknowledge
+  that a human has seen the report.
 
 - The security team investigates the report and either rejects it or accepts
   it.
@@ -51,9 +50,9 @@ announcement.
   should involve the reporter as much as possible.
 
 - The release of the information should be "as soon as possible" and is most
-  often synced with an upcoming release that contains the fix. If the
-  reporter, or anyone else, thinks the next planned release is too far away
-  then a separate earlier release for security reasons should be considered.
+  often synchronized with an upcoming release that contains the fix. If the
+  reporter, or anyone else involved, thinks the next planned release is too
+  far away, then a separate earlier release should be considered.
 
 - Write a security advisory draft about the problem that explains what the
   problem is, its impact, which versions it affects, solutions or workarounds,
@@ -61,12 +60,14 @@ announcement.
   Figure out the CWE (Common Weakness Enumeration) number for the flaw.
 
 - Request a CVE number from
+  [HackerOne](https://docs.hackerone.com/programs/cve-requests.html)
+
+- Consider informing
   [distros@openwall](https://oss-security.openwall.org/wiki/mailing-lists/distros)
-  when also informing and preparing them for the upcoming public security
-  vulnerability announcement - attach the advisory draft for information. Note
-  that 'distros' won't accept an embargo longer than 14 days and they do not
-  care for Windows-specific flaws. For windows-specific flaws, request CVE
-  directly from MITRE.
+  to prepare them about the upcoming public security vulnerability
+  announcement - attach the advisory draft for information. Note that
+  'distros' won't accept an embargo longer than 14 days and they do not care
+  for Windows-specific flaws.
 
 - Update the "security advisory" with the CVE number.
 
@@ -93,6 +94,9 @@ announcement.
 curl-security (at haxx dot se)
 ------------------------------
 
+This is a private mailing list for discussions on and about curl security
+issues.
+
 Who is on this list? There are a couple of criteria you must meet, and then we
 might ask you to join the list or you can ask to join it. It really isn't very
 formal. We basically only require that you have a long-term presence in the
@@ -121,19 +125,8 @@ Publishing Security Advisories
 6. On security advisory release day, push the changes on the curl-www
    repository's remote master branch.
 
-Bountygraph Bug Bounty
-----------------------
-
-The curl project runs a bug bounty program in association with
-bountygraph.com.
-
-After you have reported a security issue to the curl project, it has been
-deemed credible and a patch and advisory has been made public you can be
-eligible for a bounty from this program.
-
-See all details at [BountyGraph](https://bountygraph.com/programs/curl).
-
-This bounty is relying on funds from
-[sponsors](https://bountygraph.com/programs/curl#publicpledges). If you use
-curl professionally, consider help funding this!
+Bug Bounty
+----------
 
+See [BUG-BOUNTY](https://curl.haxx.se/docs/bugbounty.html) for details on the
+bug bounty program.
index 91803e2..aaf7bdb 100644 (file)
@@ -53,9 +53,9 @@
   Note that these weak ciphers are identified as flawed. For example, this
   includes symmetric ciphers with less than 128 bit keys and RC4.
 
-  WinSSL in Windows XP is not able to connect to servers that no longer
+  Schannel in Windows XP is not able to connect to servers that no longer
   support the legacy handshakes and algorithms used by those versions, so we
-  advice against building curl to use WinSSL on really old Windows versions.
+  advice against building curl to use Schannel on really old Windows versions.
 
   References:
 
@@ -77,9 +77,9 @@
   Some SSL backends may do certificate revocation checks (CRL, OCSP, etc)
   depending on the OS or build configuration. The --ssl-no-revoke option was
   introduced in 7.44.0 to disable revocation checking but currently is only
-  supported for WinSSL (the native Windows SSL library), with an exception in
-  the case of Windows' Untrusted Publishers blacklist which it seems can't be
-  bypassed. This option may have broader support to accommodate other SSL
+  supported for Schannel (the native Windows SSL library), with an exception
+  in the case of Windows' Untrusted Publishers blacklist which it seems can't
+  be bypassed. This option may have broader support to accommodate other SSL
   backends in the future.
 
   References:
index 926cd19..af74c0b 100644 (file)
@@ -6,11 +6,17 @@
 
 "Captain Basil"
 "Spoon Man"
+1ocalhost on github
+3dyd on github
 Aaro Koskinen
 Aaron Oneal
 Aaron Orenstein
+Aaron Scarisbrick
 Abram Pousada
+AceCrow on Github
+Adam Barclay
 Adam Brown
+Adam Coyne
 Adam D. Moss
 Adam Langley
 Adam Light
@@ -18,6 +24,7 @@ Adam Marcionek
 Adam Piggott
 Adam Sampson
 Adam Tkac
+Adrian Burcea
 Adrian Peniak
 Adrian Schuur
 Adriano Meirelles
@@ -31,7 +38,6 @@ Alan Jenkins
 Alan Pinstein
 Albert Chin-A-Young
 Albert Choy
-Ale Vesely
 Alejandro Alvarez Ayllon
 Alejandro R. Sedeño
 Aleksandar Milivojevic
@@ -44,13 +50,17 @@ Alex Baines
 Alex Bligh
 Alex Chan
 Alex Fishman
+Alex Grebenschikov
 Alex Gruz
+Alex Konev
 Alex Malinovich
+Alex Mayorga
 Alex McLellan
 Alex Neblett
 Alex Nichols
 Alex Potapenko
 Alex Rousskov
+Alex Samorukov
 Alex Suykov
 Alex Vinnik
 Alex aka WindEagle
@@ -78,6 +88,7 @@ Alfonso Martone
 Alfred Gebert
 Allen Pulsifer
 Alona Rossen
+Amit Katyal
 Amol Pattekar
 Amr Shahin
 Anatol Belski
@@ -86,13 +97,15 @@ Anders Bakken
 Anders Gustafsson
 Anders Havn
 Anders Roxell
+Anderson Sasaki
 Anderson Toshiyuki Sasaki
 Andi Jahja
 Andre Guibert de Bruet
 Andre Heinecke
 Andreas Damm
-Andreas Faerber
+Andreas Falkenhahn
 Andreas Farber
+Andreas Kostyrka
 Andreas Malzahn
 Andreas Ntaflos
 Andreas Olsson
@@ -106,7 +119,9 @@ Andrei Benea
 Andrei Cipu
 Andrei Karas
 Andrei Kurushin
+Andrei Neculau
 Andrei Sedoi
+Andrei Valeriu BICA
 Andrei Virtosu
 Andrej E Baranov
 Andrew Benham
@@ -114,6 +129,7 @@ Andrew Biggs
 Andrew Bushnell
 Andrew Francis
 Andrew Fuller
+Andrew Ishchuk
 Andrew Krieger
 Andrew Kurushin
 Andrew Lambert
@@ -139,6 +155,7 @@ Anton Gerasimov
 Anton Kalmykov
 Anton Malov
 Anton Yabchinskiy
+Antoni Villalonga
 Antonio Larrosa
 Antony74 on github
 Antti Hätälä
@@ -147,6 +164,7 @@ Arkadiusz Miskiewicz
 Armel Asselin
 Arnaud Compan
 Arnaud Ebalard
+Arnaud Rebillout
 Aron Bergman
 Artak Galoyan
 Arthur Murray
@@ -159,31 +177,41 @@ Ates Goral
 Augustus Saunders
 Avery Fay
 Axel Tillequin
+Ayoub Boudhar
 Balaji Parasuram
+Balaji S Rao
 Balaji Salunke
+Balazs Kovacsics
 Balint Szilakszi
 Barry Abrahamson
+Barry Pollard
 Bart Whiteley
 Bas Mevissen
 Bas van Schaik
+Bastien Bouclet
 Basuke Suzuki
 Ben Boeckel
 Ben Darnell
 Ben Greear
+Ben Kohler
 Ben Madsen
 Ben Noordhuis
 Ben Van Hof
+Ben Voris
 Ben Winslow
 Benbuck Nason
 Benjamin Gerard
 Benjamin Gilbert
 Benjamin Johnson
 Benjamin Kircher
+Benjamin Ritcey
 Benjamin Sergeant
 Benoit Neil
 Benoit Sigoure
 Bernard Leak
 Bernard Spil
+Bernd Mueller
+Bernhard Iselborn
 Bernhard M. Wiedemann
 Bernhard Reutner-Fischer
 Bernhard Walle
@@ -196,6 +224,8 @@ Bill Hoffman
 Bill Middlecamp
 Bill Nagel
 Bill Pyne
+Bjarni Ingi Gislason
+Bjoern Franke
 Bjoern Sikora
 Bjorn Augustsson
 Bjorn Reese
@@ -213,14 +243,17 @@ Brad King
 Brad Spencer
 Bradford Bruce
 Brandon Casey
+Brandon Dong
 Brandon Wang
 Brendan Jurd
 Brent Beardsley
 Brian Akins
 Brian Carpenter
+Brian Chaplin
 Brian Childs
 Brian Chrisman
 Brian Dessent
+Brian E. Gallew
 Brian J. Murrell
 Brian Prodoehl
 Brian R Duffy
@@ -234,15 +267,19 @@ Bruno Thomsen
 Bruno de Carvalho
 Bryan Henderson
 Bryan Kemp
+Bylon2 on github
 Byrial Jensen
+Caleb Raitto
 Cameron Kaiser
 Cameron MacMinn
 Camille Moncelier
 Caolan McNamara
 Carie Pointer
 Carlo Cannas
+Carlo Marcelo Arenas Belón
 Carlo Teubner
 Carlo Wood
+Carlos ORyan
 Carsten Lange
 Casey O'Donnell
 Catalin Patulea
@@ -253,6 +290,7 @@ Charles Romestant
 Chen Prog
 Chester Liu
 Chih-Chung Chang
+Chih-Hsuan Yen
 Chris "Bob Bob"
 Chris Araman
 Chris Carlmar
@@ -277,20 +315,26 @@ Christian Schmitz
 Christian Stewart
 Christian Vogt
 Christian Weisgerber
+Christoph M. Becker
 Christophe Demory
+Christophe Dervieux
 Christophe Legry
 Christopher Conroy
 Christopher Head
 Christopher Palow
 Christopher R. Palmer
+Christopher Reid
 Christopher Stone
 Chungtsun Li
 Ciprian Badescu
 Claes Jakobsson
 Clarence Gardner
+Claudio Neves
 Clemens Gruber
+Cliff Crosland
 Clifford Wolf
 Clint Clayton
+Clément Notin
 Cody Jones
 Cody Mack
 Colby Ranger
@@ -301,6 +345,7 @@ Colm Buckley
 Constantine Sapuntzakis
 Cory Benfield
 Cory Nelson
+Costya Shulyupin
 Craig A West
 Craig Davison
 Craig Markwardt
@@ -308,6 +353,7 @@ Craig de Stigter
 Cris Bailiff
 Cristian Rodríguez
 Curt Bogmine
+Cynthia Coan
 Cyril B
 Cyrill Osterwalder
 Cédric Connes
@@ -322,7 +368,6 @@ Damian Dixon
 Damien Adant
 Damien Vielpeau
 Dan Becker
-Dan C
 Dan Cristian
 Dan Donahue
 Dan Fandrich
@@ -345,12 +390,14 @@ Daniel Johnson
 Daniel Kahn Gillmor
 Daniel Krügler
 Daniel Lee Hwang
+Daniel Lublin
 Daniel Melani
 Daniel Mentz
 Daniel Romero
 Daniel Schauenberg
 Daniel Seither
 Daniel Shahaf
+Daniel Silverstone
 Daniel Steinberg
 Daniel Stenberg
 Daniel Theron
@@ -390,11 +437,11 @@ David Lang
 David LeBlanc
 David Lord
 David McCreedy
-David Meyer
 David Odin
 David Phillips
 David Rosenstrauch
 David Ryskalczyk
+David Sanderson
 David Schweikert
 David Shaw
 David Strauss
@@ -405,12 +452,14 @@ David Woodhouse
 David Wright
 David Yan
 Dengminwen
+Denis Chaplygin
 Denis Feklushkin
 Denis Ollier
 Dennis Clarke
 Derek Higgins
 Desmond O. Chang
 Detlef Schmier
+Dheeraj Sangamkar
 Didier Brisebourg
 Diego Bes
 Diego Casorran
@@ -472,6 +521,7 @@ Eason-Yu on github
 Ebenezer Ikonne
 Ed Morley
 Edin Kadribasic
+Edmond Yu
 Eduard Bloch
 Edward Kimmel
 Edward Rudd
@@ -481,10 +531,13 @@ Eelco Dolstra
 Eetu Ojanen
 Egon Eckert
 Eldar Zaitov
+Eli Schwartz
+Elia Tufarolo
 Elliot Saba
 Ellis Pritchard
 Elmira A Semenova
 Emanuele Bovisio
+Emil Engler
 Emil Lerner
 Emil Romanus
 Emiliano Ida
@@ -493,6 +546,7 @@ Enrico Scholz
 Enrik Berkhan
 Eramoto Masaya
 Eric Cooper
+Eric Curtin
 Eric Gallager
 Eric Hu
 Eric Landes
@@ -503,12 +557,15 @@ Eric Mertens
 Eric Rautman
 Eric Rescorla
 Eric Ridge
+Eric Rosenquist
 Eric S. Raymond
 Eric Thelin
 Eric Vergnaud
 Eric Wong
+Eric Wu
 Eric Young
 Erick Nuwendam
+Erik Jacobsen
 Erik Janssen
 Erik Johansson
 Erik Minekus
@@ -517,6 +574,7 @@ Ernst Sjöstrand
 Erwan Legrand
 Erwin Authried
 Ethan Glasser Camp
+Etienne Simard
 Eugene Kotlyarov
 Evan Jordan
 Even Rouault
@@ -531,14 +589,17 @@ Fabian Ruff
 Fabrice Fontaine
 Fabrizio Ammollo
 Fahim Chandurwala
+Federico Bianchi
 Fedor Karpelevitch
 Feist Josselin
+Felix Hädicke
 Felix Kaiser
 Felix Yan
 Felix von Leitner
 Feng Tu
 Fernando Muñoz
 Flavio Medeiros
+Florian Pritz
 Florian Schoppmann
 Florian Weimer
 Florin Petriuc
@@ -546,6 +607,7 @@ Forrest Cahoon
 Francisco Moraes
 Francisco Sedano
 Francois Petitjean
+Francois Rivard
 Frank Denis
 Frank Gevaerts
 Frank Hempel
@@ -579,6 +641,7 @@ Georg Horn
 Georg Huettenegger
 Georg Lippitsch
 Georg Wicherski
+George Liu
 Gerd v. Egidy
 Gergely Nagy
 Gerhard Herre
@@ -590,7 +653,10 @@ Gil Weber
 Gilad
 Gilbert Ramirez Jr.
 Gilles Blanc
+Gilles Vollant
+Giorgos Oikonomou
 Gisle Vanem
+GitYuanQu on github
 Giuseppe Attardi
 Giuseppe D'Ambrosio
 Giuseppe Persico
@@ -610,19 +676,23 @@ Greg Onufer
 Greg Pratt
 Greg Rowe
 Greg Zavertnik
+Gregory Nicholls
 Gregory Szorc
+Griffin Downs
 Grigory Entin
 Guenole Bescon
-Guenter Knauf
 Guido Berhoerster
 Guillaume Arluison
 Gunter Knauf
 Gustaf Hui
 Gustavo Grieco
+Guy Poizat
 GwanYeong Kim
 Gwenole Beauchesne
 Gökhan Şengün
 Götz Babin-Ebell
+Hagai Auro
+Haibo Huang
 Hamish Mackenzie
 Han Han
 Han Qiao
@@ -643,9 +713,11 @@ He Qin
 Heikki Korpela
 Heinrich Ko
 Heinrich Schaefer
+Helge Klein
 Helmut K. C. Tessarek
 Helwing Lutz
 Hendrik Visage
+Henri Gomez
 Henrik Gaßmann
 Henrik Storner
 Henry Ludemann
@@ -655,8 +727,10 @@ Hidemoto Nakada
 Ho-chi Chen
 Hoi-Ho Chan
 Hongli Lai
+Howard Blaise
 Howard Chu
 Hubert Kario
+Huzaifa Sidhpurwala
 Hzhijun
 Ian D Allen
 Ian Fette
@@ -667,19 +741,25 @@ Ian Turner
 Ian Wilkes
 Ignacio Vazquez-Abrams
 Igor Franchuk
+Igor Khristophorov
+Igor Makarov
 Igor Novoseltsev
 Igor Polyakov
 Ihor Karpenko
 Iida Yosiaki
 Ilguiz Latypov
 Ilja van Sprundel
+Ilya Kosarev
 Immanuel Gregoire
 Inca R
 Ingmar Runge
 Ingo Ralf Blum
 Ingo Wilken
 Irfan Adilovic
+Ironbars13 on github
+Irving Wolfe
 Isaac Boukris
+Isaiah Norton
 Ishan SinghLevett
 Ithubg on github
 Ivan Avdeev
@@ -687,6 +767,7 @@ Ivo Bellin Salarin
 Jack Zhang
 Jackarain on github
 Jacky Lam
+Jacob Barthelmeh
 Jacob Meuser
 Jacob Moshenko
 Jactry Zeng
@@ -695,6 +776,7 @@ Jaime Fullaondo
 Jakub Wilk
 Jakub Zakrzewski
 James Atwill
+James Brown
 James Bursa
 James Cheng
 James Clancy
@@ -703,24 +785,30 @@ James Dury
 James Gallagher
 James Griffiths
 James Housley
+James Knight
 James MacMillan
 James Slaughter
 Jamie Lokier
 Jamie Newton
 Jamie Wilkinson
 Jan Alexander Steffens
+Jan Chren
 Jan Ehrhardt
 Jan Koen Annot
 Jan Kunder
 Jan Schaumann
 Jan Schmidt
 Jan Van Boghout
+JanB on github
+Janne Johansson
 Jared Jennings
 Jared Lundell
 Jari Aalto
 Jari Sundell
+Jason Baietto
 Jason Glasgow
 Jason Juang
+Jason Lee
 Jason Liu
 Jason McDonald
 Jason S. Priebe
@@ -746,13 +834,18 @@ Jeff Hodges
 Jeff Johnson
 Jeff King
 Jeff Lawson
+Jeff Mears
 Jeff Phillips
 Jeff Pohlmeyer
 Jeff Weber
 Jeffrey Walton
+Jens Finkhaeuser
 Jens Rantil
+Jens Schleusener
+Jeremie Rapin
 Jeremy Friesner
 Jeremy Huddleston
+Jeremy Lainé
 Jeremy Lin
 Jeremy Pearson
 Jeremy Tan
@@ -774,6 +867,7 @@ Jim Freeman
 Jim Fuller
 Jim Hollinger
 Jim Meyering
+Jimmy Gaussen
 Jiri Dvorak
 Jiri Hruska
 Jiri Jaburek
@@ -791,7 +885,9 @@ Johan Nilsson
 Johan van Selst
 Johannes Bauer
 Johannes Ernst
+Johannes G. Kristinsson
 Johannes Schindelin
+John A. Bristor
 John Bradshaw
 John Butterfield
 John Coffey
@@ -814,12 +910,16 @@ John Marino
 John Marshall
 John McGowan
 John P. McCaskey
+John Schroeder
 John Starks
 John Suprock
+John V. Chow
 John Wanghui
+John Weismiller
 John Wilkinson
 John-Mark Bell
 Johnny Luong
+Jojojov on github
 Jon DeVree
 Jon Grubbs
 Jon Nelson
@@ -832,13 +932,15 @@ Jon Turner
 Jonas Forsman
 Jonas Minnberg
 Jonas Schnelli
+Jonas Vautherin
 Jonatan Lander
 Jonatan Vela
 Jonathan Cardoso Machado
-Jonathan Cardoso Machado Machado
 Jonathan Hseu
+Jonathan Moerman
 Jonathan Nieder
 Jongki Suwandi
+Joombalaya on github
 Joonas Kuorilehto
 Jose Alf
 Jose Kahan
@@ -846,6 +948,8 @@ Josef Wolf
 Josh Bialkowski
 Josh Kapell
 Joshua Kwan
+Joshua Swink
+Josie Huddleston
 Josue Andrade Gomes
 Jozef Kralik
 Juan Barreto
@@ -853,15 +957,19 @@ Juan F. Codagnone
 Juan Ignacio Hervás
 Juan RP
 Judson Bishop
+Juergen Hoetzel
 Juergen Wilke
 Jukka Pihl
 Julian Noble
 Julian Ospald
+Julian Romero Nieto
 Julian Taylor
+Julian Z
 Julien Chaffraix
 Julien Nabet
 Julien Royer
 Jun-ichiro itojun Hagino
+Junho Choi
 Jurij Smakov
 Juro Bystricky
 Justin Clift
@@ -870,6 +978,7 @@ Justin Fletcher
 Justin Karneges
 Justin Maggard
 János Fekete
+Jérémy Rocher
 Jörg Mueller-Tolk
 Jörn Hartroth
 K. R. Walker
@@ -886,6 +995,7 @@ Karol Pietrzak
 Kartik Mahajan
 Kaspar Brand
 Katie Wang
+Katsuhiko YOSHIDA
 Kazuho Oku
 Kees Cook
 Kees Dekker
@@ -915,19 +1025,28 @@ Kjetil Jacobsen
 Klaus Stein
 Klevtsov Vadim
 Kobi Gurkan
+Koen Dergent
 Konstantin Isakov
+Konstantin Kushnir
 Kris Kennaway
 Krishnendu Majumdar
 Krister Johansen
 Kristian Gunstone
 Kristian Köhntopp
 Kristiyan Tsaklev
+Kristoffer Gleditsch
+Kunal Ekawde
 Kurt Fankhauser
+Kyle Abramowitz
+Kyle Edwards
 Kyle J. McKay
 Kyle L. Huff
 Kyle Sallee
+Kyohei Kadota
 Kyselgov E.N
 Lachlan O'Dea
+Ladar Levison
+Lance Ware
 Larry Campbell
 Larry Fahnoe
 Larry Lin
@@ -939,7 +1058,6 @@ Lars J. Aas
 Lars Johannesen
 Lars Nilsson
 Lars Torben Wilson
-Lau Hang Kin
 Laurent Bonnans
 Laurent Rabret
 Lauri Kasanen
@@ -949,10 +1067,13 @@ Lawrence Wagerfield
 Legoff Vincent
 Lehel Bernadt
 Leif W
+Leigh Purdie
 Leith Bade
 Len Krause
+Len Marinaccio
 Lenaic Lefever
 Lenny Rachitsky
+Leon Breedt
 Leon Winter
 Leonardo Rosati
 Leonardo Taccari
@@ -961,6 +1082,7 @@ Lijo Antony
 Linas Vepstas
 Lindley French
 Ling Thio
+Linos Giannopoulos
 Linus Lewandowski
 Linus Nielsen Feltzing
 Linus Nordberg
@@ -978,6 +1100,7 @@ Luca Altea
 Luca Boccassi
 Lucas Adamski
 Lucas Pardue
+Lucas Severo
 Ludek Finstrle
 Ludovico Cavedon
 Ludwig Nussel
@@ -992,6 +1115,7 @@ Luz Paz
 Luật Nguyễn
 Lyman Epp
 Lyndon Hill
+MAntoniak on github
 Maciej Karpiuk
 Maciej Puzio
 Maciej W. Rozycki
@@ -1012,7 +1136,9 @@ Marc Hesse
 Marc Hörsken
 Marc Kleine-Budde
 Marc Renault
+Marc Schlatter
 Marc-Antoine Perennou
+Marcel Hernandez
 Marcel Raad
 Marcel Roelofs
 Marcelo Echeverria
@@ -1023,7 +1149,9 @@ Marcin Konicki
 Marco Deckel
 Marco G. Salvagno
 Marco Maggi
+Marcos Diazr
 Marcus Hoffmann
+Marcus Klein
 Marcus Sundberg
 Marcus Webster
 Marian Klymov
@@ -1031,7 +1159,6 @@ Mario Schroeder
 Mark Brand
 Mark Butler
 Mark Davies
-Mark Eichin
 Mark Hamilton
 Mark Incley
 Mark Karpeles
@@ -1040,12 +1167,15 @@ Mark Nottingham
 Mark Salisbury
 Mark Snelling
 Mark Tully
+Mark W. Eichin
+Mark Wotton
 Markus Duft
 Markus Elfring
 Markus Koetter
 Markus Moeller
 Markus Oberhumer
 Markus Westerlind
+Maros Priputen
 Marquis de Muesli
 Martijn Koster
 Martin Ankerl
@@ -1054,29 +1184,35 @@ Martin Drasar
 Martin Dreher
 Martin Frodl
 Martin Galvan
+Martin Gartner
 Martin Hager
 Martin Hedenfalk
 Martin Jansen
+Martin Kammerhofer
 Martin Kepplinger
 Martin Lemke
 Martin Skinner
+Martin Staael
 Martin Storsjö
 Martin Vejnár
 Marty Kuhrt
 Maruko
+Massimiliano Fantuzzi
 Massimiliano Ziccardi
 Massimo Callegari
 Mateusz Loskot
 Mathias Axelsson
+Mathieu Legare
 Mats Lidell
 Matt Arsenault
 Matt Ford
 Matt Kraai
+Matt McClure
 Matt Veenstra
 Matt Witherspoon
 Matt Wixson
-Matteo B.
 Matteo Bignotti
+Matteo Bignottignotti
 Matteo Rocco
 Matthew Blain
 Matthew Clarke
@@ -1085,11 +1221,13 @@ Matthew Kerwin
 Matthew Whitehead
 Matthias Bolte
 Mattias Fornander
+Matus Uzak
 Maurice Barnum
 Mauro Iorio
 Mauro Rappa
 Max Dymond
 Max Katsev
+Max Kellermann
 Max Khon
 Max Savenkov
 Maxim Ivanov
@@ -1100,13 +1238,17 @@ Maxime Legros
 Mehmet Bozkurt
 Mekonikum
 Melissa Mears
+Mert Yazıcıoğlu
 Mettgut Jamalla
+Michael Anti
 Michael Benedict
+Michael Brehm
 Michael Calmer
 Michael Cronenworth
 Michael Curtis
 Michael Day
 Michael Felt
+Michael Forney
 Michael Gmelin
 Michael Goffioul
 Michael Jahn
@@ -1114,18 +1256,25 @@ Michael Jerris
 Michael Kalinin
 Michael Kaufmann
 Michael Kilburn
+Michael Kujawa
 Michael König
+Michael Lee
 Michael Maltese
 Michael Mealling
 Michael Mueller
 Michael Osipov
+Michael Schmid
 Michael Smith
 Michael Stapelberg
+Michael Steuer
 Michael Stillwell
+Michael Vittiglio
 Michael Wallner
 Michal Bonino
 Michal Marek
 Michal Trybus
+Michal Čaplygin
+Michał Antoniak
 Michał Fita
 Michał Górny
 Michał Janiszewski
@@ -1142,6 +1291,7 @@ Mikalai Ananenka
 Mike Bytnar
 Mike Crowe
 Mike Dobbs
+Mike Dowell
 Mike Giancola
 Mike Hasselberg
 Mike Henshaw
@@ -1158,17 +1308,21 @@ Miroslav Spousta
 Mitz Wark
 Mohamed Lrhazi
 Mohammad AlSaleh
+Mohammad Hasbini
 Mohun Biswas
 Mostyn Bramley-Moore
 Moti Avrahami
+MrSorcus on github
 Muz Dima
 Myk Taylor
+NTMan on Github
 Nach M. S.
 Nagai H
 Nate Prewitt
 Nathan Coulter
 Nathan O'Sullivan
 Nathanael Nerode
+Nathaniel J. Smith
 Nathaniel Waisbrot
 Naveen Chandran
 Naveen Noel
@@ -1178,6 +1332,7 @@ Neil Bowers
 Neil Dunbar
 Neil Kolban
 Neil Spring
+Niall O'Reilly
 Nic Roets
 Nicholas Maniscalco
 Nick Draffen
@@ -1190,11 +1345,13 @@ Nico Baggus
 Nicolas Berloquin
 Nicolas Croiset
 Nicolas François
+Nicolas Grekas
 Nicolas Morey-Chaisemartin
 Niels van Tongeren
 Nikita Schmidt
 Nikitinskit Dmitriy
 Niklas Angebrand
+Niklas Hambüchen
 Nikolai Kondrashov
 Nikos Mavrogiannopoulos
 Nikos Tsipinakis
@@ -1213,6 +1370,7 @@ Ola Mork
 Olaf Flebbe
 Olaf Stüben
 Oleg Pudeyev
+Olen Andoni
 Oli Kingshott
 Oliver Gondža
 Oliver Graute
@@ -1220,6 +1378,7 @@ Oliver Kuckertz
 Oliver Schindler
 Olivier Berger
 Olivier Brunel
+Omar Ramadan
 Orange Tsai
 Oren Souroujon
 Oren Tirosh
@@ -1227,9 +1386,11 @@ Orgad Shaneh
 Ori Avtalion
 Oscar Koeroo
 Oscar Norlander
+Oskar Liljeblad
 Oumph on github
 P R Schaffner
 Palo Markovic
+Paolo Mossino
 Paolo Piacentini
 Paras Sethia
 Pascal Gaudette
@@ -1250,9 +1411,13 @@ Patrick Smith
 Patrick Watson
 Patrik Thunstrom
 Pau Garcia i Quiles
+Paul B. Omta
 Paul Donohue
+Paul Dreik
+Paul Groke
 Paul Harrington
 Paul Harris
+Paul Hoffman
 Paul Howarth
 Paul Joyce
 Paul Marks
@@ -1262,8 +1427,10 @@ Paul Nolan
 Paul Oliver
 Paul Querna
 Paul Saab
+Paulo Roberto Tomasi
 Pavel Cenek
 Pavel Gushchin
+Pavel Löbl
 Pavel Orehov
 Pavel Pavlov
 Pavel Raiskup
@@ -1273,6 +1440,7 @@ Pawel A. Gajda
 Pawel Kierski
 Pedro Larroy
 Pedro Neves
+Peng Li
 Per Lundberg
 Per Malmberg
 Pete Lomax
@@ -1290,7 +1458,9 @@ Peter O'Gorman
 Peter Pentchev
 Peter Piekarski
 Peter Silva
+Peter Simonyi
 Peter Su
+Peter Sumatra
 Peter Sylvester
 Peter Todd
 Peter Varga
@@ -1314,6 +1484,7 @@ Philip Langdale
 Philip Prindeville
 Philipp Waehnert
 Philippe Hameau
+Philippe Marguinaud
 Philippe Raoult
 Philippe Vaucher
 Pierre
@@ -1322,7 +1493,10 @@ Pierre Chapuis
 Pierre Joye
 Pierre Ynard
 Piotr Dobrogost
+Piotr Komborski
+Po-Chuan Hsieh
 Pooyan McSporran
+Poul T Lomholt
 Pramod Sharma
 Prash Dush
 Praveen Pvs
@@ -1348,7 +1522,7 @@ Rajkumar Mandal
 Ralf S. Engelschall
 Ralph Beckmann
 Ralph Mitchell
-Ramana Mokkapati
+Ram Krushna Mishra
 Ran Mozes
 Randall S. Becker
 Randy Armstrong
@@ -1359,11 +1533,14 @@ Ray Dassen
 Ray Pekowski
 Ray Satiro
 Razvan Cojocaru
+Reed Loden
 Reinhard Max
 Reinout van Schouwen
+Remco van Hooff
 Remi Gacogne
 Remo E
 Renato Botelho
+Renaud Allard
 Renaud Chaillat
 Renaud Duhaut
 Renaud Guillard
@@ -1373,13 +1550,17 @@ Rene Rebe
 Reuven Wachtfogel
 Reza Arbab
 Ricardo Cadime
+Ricardo Gomes
 Rich Burridge
 Rich Gray
+Rich Mirch
 Rich Rauenzahn
 Rich Turner
+Richard Adams
 Richard Alcock
 Richard Archer
 Richard Atterer
+Richard Bowker
 Richard Bramante
 Richard Clayton
 Richard Cooper
@@ -1396,7 +1577,10 @@ Richy Kim
 Rick Deist
 Rick Jones
 Rick Richardson
+Rick Welykochy
+Rickard Hallerbäck
 Ricki Hirner
+Ricky Leverence
 Ricky-Tigg on github
 Rider Linden
 Rikard Falkeborn
@@ -1413,6 +1597,7 @@ Robert D. Young
 Robert Foreman
 Robert Iakobashvili
 Robert Kolcun
+Robert Linden
 Robert Olson
 Robert Prag
 Robert Schumann
@@ -1429,10 +1614,14 @@ Rodric Glaser
 Rodrigo Silva
 Roger Leigh
 Roland Blom
+Roland Hieber
 Roland Krikava
 Roland Zimmermann
+Rolf Eike Beer
 Rolland Dudemaine
 Romain Coltel
+Romain Fliedel
+Romain Geissler
 Roman Koifman
 Roman Mamedov
 Romulo A. Ceccon
@@ -1441,6 +1630,7 @@ Ron Parker
 Ron Zapp
 Ronnie Mose
 Rosimildo da Silva
+Roy Bellingan
 Roy Shan
 Rune Kleveland
 Ruslan Baratov
@@ -1457,6 +1647,7 @@ Ryuichi KAWAMATA
 Rémy Léone
 S. Moonesamy
 SBKarr on github
+SLDiggie on github
 Salah-Eddin Shaban
 Salvador Dávila
 Salvatore Sorrentino
@@ -1467,10 +1658,12 @@ Sam Schanken
 Sampo Kellomaki
 Samuel Díaz García
 Samuel Listopad
+Samuel Surtees
 Samuel Thibault
 Sander Gates
 Sandor Feldi
 Santhana Todatry
+Santino Keupp
 Saqib Ali
 Sara Golemon
 Saran Neti
@@ -1486,22 +1679,29 @@ Sean Boudreau
 Sean Burford
 Sean MacLennan
 Sean Miller
+Sebastiaan van Erk
+Sebastian Haglund
 Sebastian Mundry
 Sebastian Pohlschmidt
 Sebastian Rasmussen
 Senthil Raja Velu
 Sergei Kuzmin
 Sergei Nikulov
+Sergey Ogryzkov
 Sergey Tatarincev
 Sergii Kavunenko
 Sergii Pylypenko
 Sergio Ballestrero
+Sergio Barresi
 Sergio Borghese
 Serj Kalichev
 Seshubabu Pasam
 Seth Mos
+Sevan Janiyan
 Sh Diao
 Shachaf Ben-Kiki
+Shailesh Kapse
+Shankar Jadhavar
 Shao Shuchao
 Sharad Gupta
 Shard
@@ -1509,6 +1709,8 @@ Shaun Jackman
 Shawn Landden
 Shawn Poulson
 Shine Fan
+Shiraz Kanga
+Shlomi Fish
 Shmulik Regev
 Siddhartha Prakash Jain
 Sidney San Martín
@@ -1516,12 +1718,14 @@ Siegfried Gyuricsko
 Simon Dick
 Simon H.
 Simon Josefsson
+Simon Legner
 Simon Liu
 Simon Warta
 Somnath Kundu
 Song Ma
 Sonia Subramanian
 Spacen Jasset
+Spezifant on github
 Spiridonoff A.V
 Spork Schivago
 Stadler Stephan
@@ -1532,23 +1736,26 @@ Stefan Agner
 Stefan Bühler
 Stefan Eissing
 Stefan Esser
+Stefan Grether
 Stefan Kanthak
 Stefan Krause
 Stefan Neis
 Stefan Teleman
 Stefan Tomanek
 Stefan Ulrich
+Stefano Simonelli
 Steinar H. Gunderson
 Stepan Broz
 Stephan Bergmann
+Stephan Lagerholm
 Stephan Mühlstrasser
+Stephan Szabo
 Stephen Brokenshire
 Stephen Collyer
 Stephen Kick
 Stephen More
 Stephen Toub
 Sterling Hughes
-Steve Brokenshire
 Steve Green
 Steve H Truong
 Steve Havelka
@@ -1558,16 +1765,20 @@ Steve Little
 Steve Marx
 Steve Oliphant
 Steve Roskowski
+Steve Walch
 Steven Bazyl
 Steven G. Johnson
 Steven Gu
 Steven M. Schweda
 Steven Parkes
+Stian Soiland-Reyes
 Stoned Elipot
 Stuart Henderson
+SumatraPeter on github
 Sune Ahlgren
 Sunny Purushe
 Sven Anders
+Sven Blumenstein
 Sven Neuhaus
 Sven Wegener
 Svyatoslav Mishyn
@@ -1578,15 +1789,20 @@ T. Bharath
 T. Yamada
 TJ Saunders
 Tae Hyoung Ahn
+Tae Wong
+Taiyu Len
 Taneli Vähäkangas
 Tanguy Fautre
 Tatsuhiro Tsujikawa
+Teemu Yli-Elsila
 Temprimus
 Terri Oda
 Terry Wu
+The Infinnovation team
 TheAssassin on github
 Theodore Dubois
 Thomas Braun
+Thomas Gamper
 Thomas Glanzmann
 Thomas J. Moore
 Thomas Klausner
@@ -1596,6 +1812,7 @@ Thomas Petazzoni
 Thomas Ruecker
 Thomas Schwinge
 Thomas Tonino
+Thomas Vegas
 Thomas van Hesteren
 Thorsten Schöning
 Tiit Pikma
@@ -1613,23 +1830,29 @@ Tim Rühsen
 Tim Sneddon
 Tim Stack
 Tim Starling
+Tim Tassonis
+Tim Verhoeven
 Timo Sirainen
 Timotej Lazar
 Timothe Litt
 Timothy Polich
 Tinus van den Berg
 Tobias Blomberg
+Tobias Hintze
+Tobias Lindgren
 Tobias Markus
 Tobias Rundström
 Tobias Stoeckmann
 Toby Peterson
 Todd A Ouska
+Todd Kaufmann
 Todd Kulesza
 Todd Short
 Todd Vierling
 Tom Benoist
 Tom Donovan
 Tom Grace
+Tom Greenslade
 Tom Lee
 Tom Mattison
 Tom Moers
@@ -1639,6 +1862,7 @@ Tom Seddon
 Tom Sparrow
 Tom Wright
 Tom Zerucha
+Tom van der Woerdt
 Tomas Hoger
 Tomas Jakobsson
 Tomas Mlcoch
@@ -1662,8 +1886,10 @@ Toshiyuki Maezawa
 Traian Nicolescu
 Travis Burtrum
 Travis Obenhaus
+Trivikram Kamat
 Troels Walsted Hansen
 Troy Engel
+Tseng Jun
 Tuomo Rinne
 Tupone Alfredo
 Tyler Hall
@@ -1674,14 +1900,19 @@ Ulrich Doehner
 Ulrich Telle
 Ulrich Zadow
 Valentin David
+Valerii Zapodovnikov
 Vasiliy Faronov
+Vasily Lobaskin
 Vasy Okhin
 Venkat Akella
 Venkataramana Mokkapati
+Vicente Garcia
+Victor Magierski
 Victor Snezhko
 Vijay Panghal
 Vikram Saxena
 Viktor Szakats
+Vilhelm Prytz
 Ville Skyttä
 Vilmos Nebehaj
 Vincas Razma
@@ -1695,17 +1926,20 @@ Vlad Ureche
 Vladimir Grishchenko
 Vladimir Kotal
 Vladimir Lazarenko
+Vlastimil Ovčáčík
 Vojtech Janota
 Vojtech Minarik
 Vojtěch Král
+Volker Schmid
 Vsevolod Novikov
 W. Mark Kubacki
 Waldek Kozba
 Walter J. Mack
 Ward Willats
-Warp Kawada
 Warren Menzer
 Wayne Haigh
+Wenchao Li
+Wenxiang Qian
 Werner Koch
 Wesley Laxton
 Wesley Miaw
@@ -1714,6 +1948,7 @@ Wham Bang
 Wilfredo Sanchez
 Will Dietz
 Willem Sparreboom
+William A. Rowe Jr
 William Ahern
 Wojciech Zwiefka
 Wouter Van Rooy
@@ -1721,12 +1956,16 @@ Wu Yongzheng
 Wyatt O'Day
 Xavier Bouchoux
 XhstormR on github
+Xiang Xiao
 Xiangbin Li
+Xiaoyin Liu
+XmiliaH on github
 Yaakov Selkowitz
-Yamada Yasuharu
 Yang Tse
 Yarram Sunil
 Yasuharu Yamada
+Yasuhiro Matsumoto
+Yechiel Kalmenson
 Yehezkel Horowitz
 Yehoshua Hershberg
 Yi Huang
@@ -1734,6 +1973,7 @@ Yiming Jing
 Yingwei Liu
 Yonggang Luo
 Yousuke Kimoto
+Yu Xin
 Yukihiro Kawada
 Yun SangHo
 Yuriy Sosov
@@ -1744,10 +1984,14 @@ Zdenek Pavlas
 Zekun Ni
 Zenju on github
 Zero King
+Zhao Yisha
 Zhaoyang Wu
+Zhibiao Wu
 Zhouyihai Ding
 Zmey Petroff
 Zvi Har'El
+aasivov on github
+accountantM on github
 adnn on github
 afrind on github
 ahodesuka on github
@@ -1755,56 +1999,92 @@ anshnd on github
 arainchik on github
 asavah on github
 baumanj on github
+bdry on github
+bobmitchell1956 on github
 bsammon on github
+buzo-ffm on github
+bxac on github
 cbartl on github
+cclauss on github
 clbr on github
 cmfrolick on github
+codesniffer13 on github
+d912e3 on github
+daboul on github
 dasimx on github
+dbrowndan on github
 destman on github
 dkjjr89 on github
+dkwolfe4 on github
+dnivras on github
 dpull on github
+dtmsecurity on github
 eXeC64 on github
 elelel on github
 elephoenix on github
+elsamuko on github
 guitared on github
 hsiao yi
 imilli on github
+infinnovation-dev on github
 iz8mbw on github
 jakirkham on github
+jasal82 on github
+jnbr on github
 jonrumsey on github
 joshhe on github
 jungle-boogie on github
 jveazey on github
+jzinn on github
 ka7 on github
+kouzhudong on github
 kreshano on github
+l00p3r on Hackerone
 lijian996 on github
 lukaszgn on github
 madblobfish on github
 marc-groundctl on github
+masbug on github
 mccormickt12 on github
+migueljcrum on github
 mkzero on github
+momala454 on github
 moohoorama on github
+nedres on github
 neex on github
 neheb on github
+nevv on HackerOne/curl
+niallor on github
+nianxuejie on github
+nico-abram on github
+niner on github
 nk
 nopjmp on github
 olesteban on github
 omau on github
+osabc on github
 ovidiu-benea on github
 patelvivekv1993 on github
-paulharris on github
+patnyb on github
+pendrek at hackerone
 pszemus on github
+sayrer on github
 silveja1 on github
+smuellerDD on github
+sstruchtrup on github
 steelman on github
 steini2000 on github
 stootill on github
 swalkaus at yahoo.com
 tarek112 on github
+tholin on github
 tommink[at]post.pl
+tonystz on Github
+tpaukrt on github
 vanillajonathan on github
+wesinator on github
 wmsch on github
 wncboy on github
-wyattoday on github
 youngchopin on github
 zelinchen on github
 zzq1015 on github
index d7fe127..6f4919c 100644 (file)
--- a/docs/TODO
+++ b/docs/TODO
  All bugs documented in the KNOWN_BUGS document are subject for fixing!
 
  1. libcurl
- 1.2 More data sharing
+ 1.1 TFO support on Windows
+ 1.2 Consult %APPDATA% also for .netrc
  1.3 struct lifreq
- 1.4 signal-based resolver timeouts
+ 1.4 alt-svc sharing
  1.5 get rid of PATH_MAX
- 1.6 Modified buffer size approach
  1.7 Support HTTP/2 for HTTP(S) proxies
  1.8 CURLOPT_RESOLVE for any port number
  1.9 Cache negative name resolves
  1.16 Try to URL encode given URL
  1.17 Add support for IRIs
  1.18 try next proxy if one doesn't work
- 1.19 Timeout idle connections from the pool
  1.20 SRV and URI DNS records
  1.22 CURLINFO_PAUSE_STATE
  1.23 Offer API to flush the connection pool
  1.24 TCP Fast Open for windows
  1.25 Expose tried IP addresses that failed
- 1.26 CURL_REFUSE_CLEARTEXT
  1.27 hardcode the "localhost" addresses
  1.28 FD_CLOEXEC
+ 1.29 Upgrade to websockets
+ 1.30 config file parsing
 
  2. libcurl - multi interface
  2.1 More non-blocking
@@ -50,6 +50,7 @@
  2.3 Non-blocking curl_multi_remove_handle()
  2.4 Split connect and authentication process
  2.5 Edge-triggered sockets should work
+ 2.6 multi upkeep
 
  3. Documentation
  3.2 Provide cmake config-file
@@ -58,7 +59,6 @@
  4.1 HOST
  4.2 Alter passive/active on failure and retry
  4.3 Earlier bad letter detection
- 4.4 REST for large files
  4.5 ASCII support
  4.6 GSSAPI via Windows SSPI
  4.7 STAT for LIST without data connection
 
  5. HTTP
  5.1 Better persistency for HTTP 1.0
- 5.2 support FF3 sqlite cookie files
  5.3 Rearrange request header order
+ 5.4 Allow SAN names in HTTP/2 server push
  5.5 auth= in URLs
- 5.6 Refuse "downgrade" redirects
- 5.7 QUIC
- 5.8 Leave secure cookies alone
 
  6. TELNET
  6.1 ditch stdin
  6.3 feature negotiation debug data
 
  7. SMTP
- 7.1 Pipelining
  7.2 Enhanced capability support
  7.3 Add CURLOPT_MAIL_CLIENT option
 
  8. POP3
- 8.1 Pipelining
  8.2 Enhanced capability support
 
  9. IMAP
  11.4 Create remote directories
 
  12. New protocols
- 12.1 RSYNC
 
  13. SSL
- 13.1 Disable specific versions
  13.2 Provide mutex locking API
  13.3 Support in-memory certs/ca certs/keys
  13.4 Cache/share OpenSSL contexts
  13.6 Provide callback for cert verification
  13.7 improve configure --with-ssl
  13.8 Support DANE
- 13.9 Configurable loading of OpenSSL configuration file
  13.10 Support Authority Information Access certificate extension (AIA)
  13.11 Support intermediate & root pinning for PINNEDPUBLICKEY
  13.12 Support HSTS
- 13.13 Support HPKP
  13.14 Support the clienthello extension
 
  14. GnuTLS
- 14.1 SSL engine stuff
  14.2 check connection
 
  15. WinSSL/SChannel
  15.1 Add support for client certificate authentication
  15.3 Add support for the --ciphers option
+ 15.4 Add option to disable client certificate auto-send
 
  16. SASL
  16.1 Other authentication mechanisms
 
  17. SSH protocols
  17.1 Multiplexing
- 17.2 SFTP performance
+ 17.2 Handle growing SFTP files
  17.3 Support better than MD5 hostkey hash
  17.4 Support CURLOPT_PREQUOTE
 
  18.1 sync
  18.2 glob posts
  18.3 prevent file overwriting
- 18.4 simultaneous parallel transfers
  18.5 UTF-8 filenames in Content-Disposition
- 18.6 warning when setting an option
- 18.7 warning if curl version is not in sync with libcurl version
- 18.8 offer color-coded HTTP header output
+ 18.7 at least N milliseconds between requests
  18.9 Choose the name of file in braces for complex URLs
  18.10 improve how curl works in a windows console window
- 18.11 -w output to stderr
+ 18.11 Windows: set attribute 'archive' for completed downloads
  18.12 keep running, read instructions from pipe/socket
- 18.13 support metalink in http headers
- 18.14 --fail without --location should treat 3xx as a failure
  18.15 --retry should resume
  18.16 send only part of --data
  18.17 consider file name from the redirected URL with -O ?
  19. Build
  19.1 roffit
  19.2 Enable PIE and RELRO by default
+ 19.3 cmake test suite improvements
 
  20. Test suite
  20.1 SSL tunnel
  20.5 Add support for concurrent connections
  20.6 Use the RFC6265 test suite
  20.7 Support LD_PRELOAD on macOS
+ 20.8 Run web-platform-tests url tests
 
  21. Next SONAME bump
  21.1 http-style HEAD output for FTP
  22.3 size_t
  22.4 remove several functions
  22.5 remove CURLOPT_FAILONERROR
- 22.6 remove CURLOPT_DNS_USE_GLOBAL_CACHE
  22.7 remove progress meter from libcurl
  22.8 remove 'curl_httppost' from public
 
 
 1. libcurl
 
-1.2 More data sharing
+1.1 TFO support on Windows
 
- curl_share_* functions already exist and work, and they can be extended to
- share more. For example, enable sharing of the ares channel.
+ TCP Fast Open is supported on several platforms but not on Windows. Work on
+ this was once started but never finished.
+
+ See https://github.com/curl/curl/pull/3378
+
+1.2 Consult %APPDATA% also for .netrc
+
+ %APPDATA%\.netrc is not considered when running on Windows. Shouldn't it?
+
+ See https://github.com/curl/curl/issues/4016
 
 1.3 struct lifreq
 
  SIOCGIFADDR on newer Solaris versions as they claim the latter is obsolete.
  To support IPv6 interface addresses for network interfaces properly.
 
-1.4 signal-based resolver timeouts
+1.4 alt-svc sharing
 
- libcurl built without an asynchronous resolver library uses alarm() to time
- out DNS lookups. When a timeout occurs, this causes libcurl to jump from the
- signal handler back into the library with a sigsetjmp, which effectively
- causes libcurl to continue running within the signal handler. This is
- non-portable and could cause problems on some platforms. A discussion on the
- problem is available at https://curl.haxx.se/mail/lib-2008-09/0197.html
+ The share interface could benefit from allowing the alt-svc cache to be
+ possible to share between easy handles.
 
- Also, alarm() provides timeout resolution only to the nearest second. alarm
- ought to be replaced by setitimer on systems that support it.
+ See https://github.com/curl/curl/issues/4476
 
 1.5 get rid of PATH_MAX
 
  Having code use and rely on PATH_MAX is not nice:
  https://insanecoding.blogspot.com/2007/11/pathmax-simply-isnt.html
 
- Currently the SSH based code uses it a bit, but to remove PATH_MAX from there
- we need libssh2 to properly tell us when we pass in a too small buffer and
- its current API (as of libssh2 1.2.7) doesn't.
-
-1.6 Modified buffer size approach
-
- Current libcurl allocates a fixed 16K size buffer for download and an
- additional 16K for upload. They are always unconditionally part of the easy
- handle. If CRLF translations are requested, an additional 32K "scratch
- buffer" is allocated. A total of 64K transfer buffers in the worst case.
-
- First, while the handles are not actually in use these buffers could be freed
- so that lingering handles just kept in queues or whatever waste less memory.
-
- Secondly, SFTP is a protocol that needs to handle many ~30K blocks at once
- since each need to be individually acked and therefore libssh2 must be
- allowed to send (or receive) many separate ones in parallel to achieve high
- transfer speeds. A current libcurl build with a 16K buffer makes that
- impossible, but one with a 512K buffer will reach MUCH faster transfers. But
- allocating 512K unconditionally for all buffers just in case they would like
- to do fast SFTP transfers at some point is not a good solution either.
-
- Dynamically allocate buffer size depending on protocol in use in combination
- with freeing it after each individual transfer? Other suggestions?
+ Currently the libssh2 SSH based code uses it, but to remove PATH_MAX from
+ there we need libssh2 to properly tell us when we pass in a too small buffer
+ and its current API (as of libssh2 1.2.7) doesn't.
 
 1.7 Support HTTP/2 for HTTP(S) proxies
 
  Support for doing HTTP/2 to HTTP and HTTPS proxies is still missing.
 
+ See https://github.com/curl/curl/issues/3570
+
 1.8 CURLOPT_RESOLVE for any port number
 
  This option allows applications to set a replacement IP address for a given
 
  https://github.com/curl/curl/issues/896
 
-1.19 Timeout idle connections from the pool
-
- libcurl currently keeps connections in its connection pool for an indefinite
- period of time, until it either gets reused, gets noticed that it has been
- closed by the server or gets pruned to make room for a new connection.
-
- To reduce overhead (especially for when we add monitoring of the connections
- in the pool), we should introduce a timeout so that connections that have
- been idle for N seconds get closed.
-
 1.20 SRV and URI DNS records
 
  Offer support for resolving SRV and URI DNS records for libcurl to know which
 
  https://github.com/curl/curl/issues/2126
 
-1.26 CURL_REFUSE_CLEARTEXT
-
- An environment variable that when set will make libcurl refuse to use any
- cleartext network protocol. That's all non-encrypted ones (FTP, HTTP, Gopher,
- etc). By adding the check to libcurl and not just curl, this environment
- variable can then help users to block all libcurl-using programs from
- accessing the network using unsafe protocols.
-
- The variable could be given some sort of syntax or different levels and be
- used to also allow for example users to refuse libcurl to do transfers with
- HTTPS certificate checks disabled.
-
- It could also automatically refuse usernames in URLs when set
- (see CURLOPT_DISALLOW_USERNAME_IN_URL)
-
 1.27 hardcode the "localhost" addresses
 
  There's this new spec getting adopted that says "localhost" should always and
 
  https://github.com/curl/curl/issues/2252
 
+1.29 Upgrade to websockets
+
+ libcurl could offer a smoother path to get to a websocket connection.
+ See https://github.com/curl/curl/issues/3523
+
+ Michael Kaufmann suggestion here:
+ https://curl.haxx.se/video/curlup-2017/2017-03-19_05_Michael_Kaufmann_Websocket_support_for_curl.mp4
+
+1.30 config file parsing
+
+ Consider providing an API, possibly in a separate companion library, for
+ parsing a config file like curl's -K/--config option to allow applications to
+ get the same ability to read curl options from files.
+
+ See https://github.com/curl/curl/issues/3698
+
 2. libcurl - multi interface
 
 2.1 More non-blocking
  the internal actions that need to be improved for this to work perfectly is
  the 'maxloops' handling in transfer.c:readwrite_data().
 
+2.6 multi upkeep
+
+ In libcurl 7.62.0 we introduced curl_easy_upkeep. It unfortunately only works
+ on easy handles. We should introduces a version of that for the multi handle,
+ and also consider doing "upkeep" automatically on connections in the
+ connection pool when the multi handle is in used.
+
+ See https://github.com/curl/curl/issues/3199
+
 3. Documentation
 
 3.2 Provide cmake config-file
  Make the detection of (bad) %0d and %0a codes in FTP URL parts earlier in the
  process to avoid doing a resolve and connect in vain.
 
-4.4 REST for large files
-
- REST fix for servers not behaving well on >2GB requests. This should fail if
- the server doesn't set the pointer to the requested index. The tricky
- (impossible?) part is to figure out if the server did the right thing or not.
-
 4.5 ASCII support
 
  FTP ASCII transfers do not follow RFC959. They don't convert the data
  "Better" support for persistent connections over HTTP 1.0
  https://curl.haxx.se/bug/feature.cgi?id=1089001
 
-5.2 support FF3 sqlite cookie files
-
- Firefox 3 is changing from its former format to a a sqlite database instead.
- We should consider how (lib)curl can/should support this.
- https://curl.haxx.se/bug/feature.cgi?id=1871388
-
 5.3 Rearrange request header order
 
  Server implementors often make an effort to detect browser and to reject
  headers use a default value so only headers that need to be moved have to be
  specified.
 
+5.4 Allow SAN names in HTTP/2 server push
+
+ curl only allows HTTP/2 push promise if the provided :authority header value
+ exactly matches the host name given in the URL. It could be extended to allow
+ any name that would match the Subject Alternative Names in the server's TLS
+ certificate.
+
+ See https://github.com/curl/curl/pull/3581
+
 5.5 auth= in URLs
 
  Add the ability to specify the preferred authentication mechanism to use by
 
  For example:
 
- http://test:pass;auth=NTLM@example.com would be equivalent to specifying --user
- test:pass;auth=NTLM or --user test:pass --ntlm from the command line.
+ http://test:pass;auth=NTLM@example.com would be equivalent to specifying
--user test:pass;auth=NTLM or --user test:pass --ntlm from the command line.
 
  Additionally this should be implemented for proxy base URLs as well.
 
-5.6 Refuse "downgrade" redirects
-
- See https://github.com/curl/curl/issues/226
-
- Consider a way to tell curl to refuse to "downgrade" protocol with a redirect
- and/or possibly a bit that refuses redirect to change protocol completely.
-
-5.7 QUIC
-
- The standardization process of QUIC has been taken to the IETF and can be
- followed on the [IETF QUIC Mailing
- list](https://www.ietf.org/mailman/listinfo/quic). I'd like us to get on the
- bandwagon. Ideally, this would be done with a separate library/project to
- handle the binary/framing layer in a similar fashion to how HTTP/2 is
- implemented. This, to allow other projects to benefit from the work and to
- thus broaden the interest and chance of others to participate.
-
-5.8 Leave secure cookies alone
-
- Non-secure origins (HTTP sites) should not be allowed to set or modify
- cookies with the 'secure' property:
-
- https://tools.ietf.org/html/draft-ietf-httpbis-cookie-alone-01
-
 
 6. TELNET
 
 6.1 ditch stdin
 
-Reading input (to send to the remote server) on stdin is a crappy solution for
-library purposes. We need to invent a good way for the application to be able
-to provide the data to send.
+ Reading input (to send to the remote server) on stdin is a crappy solution
+ for library purposes. We need to invent a good way for the application to be
+ able to provide the data to send.
 
 6.2 ditch telnet-specific select
 
@@ -614,15 +558,11 @@ to provide the data to send.
 
 6.3 feature negotiation debug data
 
 Add telnet feature negotiation data to the debug callback as header data.
+ Add telnet feature negotiation data to the debug callback as header data.
 
 
 7. SMTP
 
-7.1 Pipelining
-
- Add support for pipelining emails.
-
 7.2 Enhanced capability support
 
  Add the ability, for an application that uses libcurl, to obtain the list of
@@ -641,10 +581,6 @@ to provide the data to send.
 
 8. POP3
 
-8.1 Pipelining
-
- Add support for pipelining commands.
-
 8.2 Enhanced capability support
 
  Add the ability, for an application that uses libcurl, to obtain the list of
@@ -689,18 +625,8 @@ that doesn't exist on the server, just like --ftp-create-dirs.
 
 12. New protocols
 
-12.1 RSYNC
-
- There's no RFC for the protocol or an URI/URL format.  An implementation
- should most probably use an existing rsync library, such as librsync.
-
 13. SSL
 
-13.1 Disable specific versions
-
- Provide an option that allows for disabling specific SSL versions, such as
- SSLv2 https://curl.haxx.se/bug/feature.cgi?id=1767276
-
 13.2 Provide mutex locking API
 
  Provide a libcurl API for setting mutex callbacks in the underlying SSL
@@ -765,17 +691,6 @@ that doesn't exist on the server, just like --ftp-create-dirs.
  Björn Stenberg wrote a separate initial take on DANE that was never
  completed.
 
-13.9 Configurable loading of OpenSSL configuration file
-
- libcurl calls the OpenSSL function CONF_modules_load_file() in openssl.c,
- Curl_ossl_init(). "We regard any changes in the OpenSSL configuration as a
- security risk or at least as unnecessary."
-
- Please add a configuration switch or something similar to disable the
- CONF_modules_load_file() call.
-
- See https://github.com/curl/curl/issues/2724
-
 13.10 Support Authority Information Access certificate extension (AIA)
 
  AIA can provide various things like CRLs but more importantly information
@@ -808,21 +723,6 @@ that doesn't exist on the server, just like --ftp-create-dirs.
  Doc: https://developer.mozilla.org/en-US/docs/Web/Security/HTTP_strict_transport_security
  RFC 6797: https://tools.ietf.org/html/rfc6797
 
-13.13 Support HPKP
-
- "HTTP Public Key Pinning" is TOFU (trust on first use), time-based
- features indicated by a HTTP header send by the webserver. It's purpose is
- to prevent Man-in-the-middle attacks by trusted CAs by allowing webadmins
- to specify which CAs/certificates/public keys to trust when connection to
- their websites.
-
- It can be build based on PINNEDPUBLICKEY.
-
- Wikipedia: https://en.wikipedia.org/wiki/HTTP_Public_Key_Pinning
- OWASP: https://www.owasp.org/index.php/Certificate_and_Public_Key_Pinning
- Doc: https://developer.mozilla.org/de/docs/Web/Security/Public_Key_Pinning
- RFC: https://tools.ietf.org/html/draft-ietf-websec-key-pinning-21
-
 13.14 Support the clienthello extension
 
  Certain stupid networks and middle boxes have a problem with SSL handshake
@@ -835,10 +735,6 @@ that doesn't exist on the server, just like --ftp-create-dirs.
 
 14. GnuTLS
 
-14.1 SSL engine stuff
-
- Is this even possible?
-
 14.2 check connection
 
  Add a way to check if the connection seems to be alive, to correspond to the
@@ -868,6 +764,19 @@ that doesn't exist on the server, just like --ftp-create-dirs.
  - Specifying Schannel Ciphers and Cipher Strengths
    https://msdn.microsoft.com/en-us/library/windows/desktop/aa380161.aspx
 
+15.4 Add option to disable client certificate auto-send
+
+ Microsoft says "By default, Schannel will, with no notification to the client,
+ attempt to locate a client certificate and send it to the server." That could
+ be considered a privacy violation and unexpected.
+
+ Some Windows users have come to expect that default behavior and to change the
+ default to make it consistent with other SSL backends would be a breaking
+ change. An option should be added that can be used to disable the default
+ Schannel auto-send behavior.
+
+ https://github.com/curl/curl/issues/2262
+
 16. SASL
 
 16.1 Other authentication mechanisms
@@ -900,10 +809,15 @@ that doesn't exist on the server, just like --ftp-create-dirs.
  To fix this, libcurl would have to detect an existing connection and "attach"
  the new transfer to the existing one.
 
-17.2 SFTP performance
+17.2 Handle growing SFTP files
+
+ The SFTP code in libcurl checks the file size *before* a transfer starts and
+ then proceeds to transfer exactly that amount of data. If the remote file
+ grows while the transfer is in progress libcurl won't notice and will not
+ adapt. The OpenSSH SFTP command line tool does and libcurl could also just
+ attempt to download more to see if there is more to get...
 
- libcurl's SFTP transfer performance is sub par and can be improved, mostly by
- the approach mentioned in "1.6 Modified buffer size approach".
+ https://github.com/curl/curl/issues/4344
 
 17.3 Support better than MD5 hostkey hash
 
@@ -943,16 +857,6 @@ that doesn't exist on the server, just like --ftp-create-dirs.
  existing). So that index.html becomes first index.html.1 and then
  index.html.2 etc.
 
-18.4 simultaneous parallel transfers
-
- The client could be told to use maximum N simultaneous parallel transfers and
- then just make sure that happens. It should of course not make more than one
- connection to the same remote host. This would require the client to use the
- multi interface. https://curl.haxx.se/bug/feature.cgi?id=1558595
-
- Using the multi interface would also allow properly using parallel transfers
- with HTTP/2 and supporting HTTP/2 server push from the command line.
-
 18.5 UTF-8 filenames in Content-Disposition
 
  RFC 6266 documents how UTF-8 names can be passed to a client in the
@@ -960,24 +864,16 @@ that doesn't exist on the server, just like --ftp-create-dirs.
 
  https://github.com/curl/curl/issues/1888
 
-18.6 warning when setting an option
-
- Display a warning when libcurl returns an error when setting an option.
- This can be useful to tell when support for a particular feature hasn't been
- compiled into the library.
-
-18.7 warning if curl version is not in sync with libcurl version
+18.7 at least N milliseconds between requests
 
- This is usually a sign of a funny, weird or unexpected install situations
- that aren't always quickly nor easily detected by users. curl and libcurl are
- always released in sync and should use the same version numbers unless very
- special situations.
+ Allow curl command lines issue a lot of request against services that limit
+ users to no more than N requests/second or similar. Could be implemented with
+ an option asking that at least a certain time has elapsed since the previous
+ request before the next one will be performed. Example:
 
-18.8 offer color-coded HTTP header output
+    $ curl "https://example.com/api?input=[1-1000]" -d yadayada --after 500
 
- By offering different color output on the header name and the header
- contents, they could be made more readable and thus help users working on
- HTTP services.
+ See https://github.com/curl/curl/issues/3920
 
 18.9 Choose the name of file in braces for complex URLs
 
@@ -997,13 +893,16 @@ that doesn't exist on the server, just like --ftp-create-dirs.
  window, the transfer is interrupted and can get disconnected. This can
  probably be improved. See https://github.com/curl/curl/issues/322
 
-18.11 -w output to stderr
+18.11 Windows: set attribute 'archive' for completed downloads
 
- -w is quite useful, but not to those of us who use curl without -o or -O
- (such as for scripting through a higher level language). It would be nice to
- have an option that is exactly like -w but sends it to stderr
- instead. Proposed name: --write-stderr. See
- https://github.com/curl/curl/issues/613
+ The archive bit (FILE_ATTRIBUTE_ARCHIVE, 0x20) separates files that shall be
+ backed up from those that are either not ready or have not changed.
+
+ Downloads in progress are neither ready to be backed up, nor should they be
+ opened by a different process. Only after a download has been completed it's
+ sensible to include it in any integer snapshot or backup of the system.
+
+ See https://github.com/curl/curl/issues/3354
 
 18.12 keep running, read instructions from pipe/socket
 
@@ -1013,30 +912,6 @@ that doesn't exist on the server, just like --ftp-create-dirs.
  invoke can talk to the still running instance and ask for transfers to get
  done, and thus maintain its connection pool, DNS cache and more.
 
-18.13 support metalink in http headers
-
- Curl has support for downloading a metalink xml file, processing it, and then
- downloading the target of the metalink. This is done via the --metalink option.
- It would be nice if metalink also supported downloading via metalink
- information that is stored in HTTP headers (RFC 6249). Theoretically this could
- also be supported with the --metalink option.
-
- See https://tools.ietf.org/html/rfc6249
-
- See also https://lists.gnu.org/archive/html/bug-wget/2015-06/msg00034.html for
- an implematation of this in wget.
-
-18.14 --fail without --location should treat 3xx as a failure
-
- To allow a command line like this to detect a redirect and consider it a
- failure:
-
-    curl -v --fail -O https://example.com/curl-7.48.0.tar.gz
-
- ... --fail must treat 3xx responses as failures too. The least problematic
- way to implement this is probably to add that new logic in the command line
- tool only and not in the underlying CURLOPT_FAILONERROR logic.
-
 18.15 --retry should resume
 
  When --retry is used and curl actually retries transfer, it should use the
@@ -1119,6 +994,13 @@ that doesn't exist on the server, just like --ftp-create-dirs.
  to no impact, neither on the performance nor on the general functionality of
  curl.
 
+19.3 cmake test suite improvements
+
+ The cmake build doesn't support 'make show' so it doesn't know which tests
+ are in the makefile or not (making appveyor builds do many false warnings
+ about it) nor does it support running the test suite if building out-of-tree.
+
+ See https://github.com/curl/curl/issues/3109
 
 20. Test suite
 
@@ -1145,17 +1027,17 @@ that doesn't exist on the server, just like --ftp-create-dirs.
 
 20.5 Add support for concurrent connections
 
- Tests 836, 882 and 938 were designed to verify that separate connections aren't
- used when using different login credentials in protocols that shouldn't re-use
- a connection under such circumstances.
+ Tests 836, 882 and 938 were designed to verify that separate connections
+ aren't used when using different login credentials in protocols that
shouldn't re-use a connection under such circumstances.
 
  Unfortunately, ftpserver.pl doesn't appear to support multiple concurrent
- connections. The read while() loop seems to loop until it receives a disconnect
- from the client, where it then enters the waiting for connections loop. When
the client opens a second connection to the server, the first connection hasn't
- been dropped (unless it has been forced - which we shouldn't do in these tests)
- and thus the wait for connections loop is never entered to receive the second
- connection.
+ connections. The read while() loop seems to loop until it receives a
+ disconnect from the client, where it then enters the waiting for connections
loop. When the client opens a second connection to the server, the first
+ connection hasn't been dropped (unless it has been forced - which we
+ shouldn't do in these tests) and thus the wait for connections loop is never
entered to receive the second connection.
 
 20.6 Use the RFC6265 test suite
 
@@ -1172,6 +1054,15 @@ that doesn't exist on the server, just like --ftp-create-dirs.
  properly. Look into making the preload support in runtests.pl portable such
  that it uses DYLD_INSERT_LIBRARIES on macOS.
 
+20.8 Run web-platform-tests url tests
+
+ Run web-platform-tests url tests and compare results with browsers on wpt.fyi
+
+ It would help us find issues to fix and help us document where our parser
+ differs from the WHATWG URL spec parsers.
+
+ See https://github.com/curl/curl/issues/4477
+
 21. Next SONAME bump
 
 21.1 http-style HEAD output for FTP
@@ -1252,12 +1143,6 @@ that doesn't exist on the server, just like --ftp-create-dirs.
  Remove support for CURLOPT_FAILONERROR, it has gotten too kludgy and weird
  internally. Let the app judge success or not for itself.
 
-22.6 remove CURLOPT_DNS_USE_GLOBAL_CACHE
-
- Remove support for a global DNS cache. Anything global is silly, and we
- already offer the share interface for the same functionality but done
- "right".
-
 22.7 remove progress meter from libcurl
 
  The internally provided progress meter output doesn't belong in the library.
index 7f616d9..52c356c 100644 (file)
@@ -113,8 +113,7 @@ build_triplet = @build@
 host_triplet = @host@
 subdir = docs/cmdline-opts
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/ax_code_coverage.m4 \
-       $(top_srcdir)/m4/ax_compile_check_sizeof.m4 \
+am__aclocal_m4_deps = $(top_srcdir)/m4/ax_compile_check_sizeof.m4 \
        $(top_srcdir)/m4/curl-compilers.m4 \
        $(top_srcdir)/m4/curl-confopts.m4 \
        $(top_srcdir)/m4/curl-functions.m4 \
@@ -178,12 +177,6 @@ CC = @CC@
 CCDEPMODE = @CCDEPMODE@
 CFLAGS = @CFLAGS@
 CFLAG_CURL_SYMBOL_HIDING = @CFLAG_CURL_SYMBOL_HIDING@
-CODE_COVERAGE_CFLAGS = @CODE_COVERAGE_CFLAGS@
-CODE_COVERAGE_CPPFLAGS = @CODE_COVERAGE_CPPFLAGS@
-CODE_COVERAGE_CXXFLAGS = @CODE_COVERAGE_CXXFLAGS@
-CODE_COVERAGE_ENABLED = @CODE_COVERAGE_ENABLED@
-CODE_COVERAGE_LDFLAGS = @CODE_COVERAGE_LDFLAGS@
-CODE_COVERAGE_LIBS = @CODE_COVERAGE_LIBS@
 CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
@@ -225,14 +218,15 @@ ENABLE_SHARED = @ENABLE_SHARED@
 ENABLE_STATIC = @ENABLE_STATIC@
 EXEEXT = @EXEEXT@
 FGREP = @FGREP@
+FISH_FUNCTIONS_DIR = @FISH_FUNCTIONS_DIR@
 GCOV = @GCOV@
-GENHTML = @GENHTML@
 GREP = @GREP@
 HAVE_BROTLI = @HAVE_BROTLI@
 HAVE_GNUTLS_SRP = @HAVE_GNUTLS_SRP@
 HAVE_LDAP_SSL = @HAVE_LDAP_SSL@
 HAVE_LIBZ = @HAVE_LIBZ@
 HAVE_OPENSSL_SRP = @HAVE_OPENSSL_SRP@
+HAVE_PROTO_BSDSOCKET_H = @HAVE_PROTO_BSDSOCKET_H@
 IDN_ENABLED = @IDN_ENABLED@
 INSTALL = @INSTALL@
 INSTALL_DATA = @INSTALL_DATA@
@@ -293,9 +287,7 @@ STRIP = @STRIP@
 SUPPORT_FEATURES = @SUPPORT_FEATURES@
 SUPPORT_PROTOCOLS = @SUPPORT_PROTOCOLS@
 USE_ARES = @USE_ARES@
-USE_AXTLS = @USE_AXTLS@
-USE_CYASSL = @USE_CYASSL@
-USE_DARWINSSL = @USE_DARWINSSL@
+USE_BEARSSL = @USE_BEARSSL@
 USE_GNUTLS = @USE_GNUTLS@
 USE_GNUTLS_NETTLE = @USE_GNUTLS_NETTLE@
 USE_LIBRTMP = @USE_LIBRTMP@
@@ -304,12 +296,17 @@ USE_LIBSSH2 = @USE_LIBSSH2@
 USE_MBEDTLS = @USE_MBEDTLS@
 USE_MESALINK = @USE_MESALINK@
 USE_NGHTTP2 = @USE_NGHTTP2@
+USE_NGHTTP3 = @USE_NGHTTP3@
+USE_NGTCP2 = @USE_NGTCP2@
+USE_NGTCP2_CRYPTO_OPENSSL = @USE_NGTCP2_CRYPTO_OPENSSL@
 USE_NSS = @USE_NSS@
 USE_OPENLDAP = @USE_OPENLDAP@
-USE_POLARSSL = @USE_POLARSSL@
+USE_QUICHE = @USE_QUICHE@
 USE_SCHANNEL = @USE_SCHANNEL@
+USE_SECTRANSP = @USE_SECTRANSP@
 USE_UNIX_SOCKETS = @USE_UNIX_SOCKETS@
 USE_WINDOWS_SSPI = @USE_WINDOWS_SSPI@
+USE_WOLFSSL = @USE_WOLFSSL@
 VERSION = @VERSION@
 VERSIONNUM = @VERSIONNUM@
 ZLIB_LIBS = @ZLIB_LIBS@
@@ -371,55 +368,217 @@ top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
 AUTOMAKE_OPTIONS = foreign no-dependencies
 MANPAGE = $(top_builddir)/docs/curl.1
-DPAGES = abstract-unix-socket.d anyauth.d append.d basic.d cacert.d capath.d cert.d \
-  cert-status.d cert-type.d ciphers.d compressed.d compressed-ssh.d     \
-  config.d doh-url.d                                                    \
-  connect-timeout.d connect-to.d continue-at.d cookie.d cookie-jar.d    \
-  create-dirs.d crlf.d crlfile.d data-ascii.d data-binary.d data.d      \
-  data-raw.d data-urlencode.d delegation.d digest.d disable.d           \
-  disable-eprt.d disable-epsv.d dns-interface.d dns-ipv4-addr.d         \
-  dns-ipv6-addr.d dns-servers.d dump-header.d egd-file.d engine.d       \
-  expect100-timeout.d fail.d fail-early.d false-start.d                 \
-  form.d form-string.d ftp-account.d ftp-alternative-to-user.d          \
-  ftp-create-dirs.d ftp-method.d ftp-pasv.d ftp-port.d ftp-pret.d       \
-  ftp-skip-pasv-ip.d ftp-ssl-ccc.d ftp-ssl-ccc-mode.d ftp-ssl-control.d \
-  get.d globoff.d                                                       \
-  happy-eyeballs-timeout-ms.d                                           \
-  head.d header.d help.d hostpubmd5.d http1.0.d                         \
-  http1.1.d http2.d http2-prior-knowledge.d ignore-content-length.d     \
-  include.d insecure.d interface.d ipv4.d ipv6.d junk-session-cookies.d \
-  keepalive-time.d key.d key-type.d krb.d libcurl.d limit-rate.d        \
-  list-only.d local-port.d location.d location-trusted.d                \
-  login-options.d mail-auth.d mail-from.d mail-rcpt.d manual.d          \
-  max-filesize.d max-redirs.d max-time.d metalink.d negotiate.d netrc.d \
-  netrc-file.d netrc-optional.d next.d no-alpn.d no-buffer.d            \
-  no-keepalive.d no-npn.d noproxy.d no-sessionid.d ntlm.d ntlm-wb.d     \
-  oauth2-bearer.d output.d pass.d path-as-is.d pinnedpubkey.d post301.d \
-  post302.d post303.d preproxy.d progress-bar.d proto.d proto-default.d \
-  proto-redir.d proxy1.0.d proxy-anyauth.d proxy-basic.d proxy-cacert.d \
-  proxy-capath.d proxy-cert.d proxy-cert-type.d proxy-ciphers.d         \
-  proxy-crlfile.d proxy.d proxy-digest.d proxy-header.d                 \
-  proxy-insecure.d proxy-key.d proxy-key-type.d proxy-negotiate.d       \
-  proxy-ntlm.d proxy-pass.d proxy-service-name.d                        \
-  proxy-ssl-allow-beast.d proxy-tlsauthtype.d proxy-tlspassword.d       \
-  proxy-tlsuser.d proxy-tlsv1.d proxytunnel.d proxy-user.d pubkey.d     \
-  quote.d random-file.d range.d raw.d referer.d remote-header-name.d    \
-  remote-name-all.d remote-name.d remote-time.d request.d resolve.d     \
-  retry-connrefused.d retry.d retry-delay.d retry-max-time.d sasl-ir.d  \
-  service-name.d show-error.d silent.d socks4a.d socks4.d socks5.d      \
-  socks5-basic.d socks5-gssapi.d proxy-pinnedpubkey.d                   \
-  socks5-gssapi-nec.d socks5-gssapi-service.d socks5-hostname.d         \
-  speed-limit.d speed-time.d ssl-allow-beast.d ssl.d ssl-no-revoke.d    \
-  ssl-reqd.d sslv2.d sslv3.d stderr.d suppress-connect-headers.d        \
-  tcp-fastopen.d tcp-nodelay.d                                          \
-  telnet-option.d tftp-blksize.d tftp-no-options.d time-cond.d          \
-  tls-max.d                                                             \
-  tlsauthtype.d tlspassword.d tlsuser.d tlsv1.0.d tlsv1.1.d tlsv1.2.d   \
-  tlsv1.3.d tlsv1.d trace-ascii.d trace.d trace-time.d tr-encoding.d    \
-  unix-socket.d upload-file.d url.d use-ascii.d user-agent.d user.d     \
-  verbose.d version.d write-out.d xattr.d request-target.d              \
-  styled-output.d tls13-ciphers.d proxy-tls13-ciphers.d                 \
-  disallow-username-in-url.d haproxy-protocol.d
+DPAGES = \
+  abstract-unix-socket.d                       \
+  alt-svc.d                                     \
+  anyauth.d                                    \
+  append.d basic.d                             \
+  cacert.d capath.d                            \
+  cert-status.d                                        \
+  cert-type.d                                  \
+  cert.d                                       \
+  ciphers.d                                    \
+  compressed-ssh.d                             \
+  compressed.d                                 \
+  config.d                                     \
+  connect-timeout.d                            \
+  connect-to.d                                 \
+  continue-at.d                                        \
+  cookie-jar.d                                 \
+  cookie.d                                     \
+  create-dirs.d                                        \
+  crlf.d crlfile.d                             \
+  data-ascii.d                                 \
+  data-binary.d                                        \
+  data-urlencode.d                             \
+  data.d data-raw.d                            \
+  delegation.d                                 \
+  digest.d                                     \
+  disable-eprt.d                               \
+  disable-epsv.d                               \
+  disable.d                                    \
+  disallow-username-in-url.d                   \
+  dns-interface.d                              \
+  dns-ipv4-addr.d                              \
+  dns-ipv6-addr.d                              \
+  dns-servers.d                                        \
+  doh-url.d                                    \
+  dump-header.d                                        \
+  egd-file.d                                   \
+  engine.d                                     \
+  etag-save.d                   \
+  etag-compare.d                \
+  expect100-timeout.d                          \
+  fail-early.d                                 \
+  fail.d                                       \
+  false-start.d                                        \
+  form-string.d                                        \
+  form.d                                       \
+  ftp-account.d                                        \
+  ftp-alternative-to-user.d                    \
+  ftp-create-dirs.d                            \
+  ftp-method.d                                 \
+  ftp-pasv.d                                   \
+  ftp-port.d                                   \
+  ftp-pret.d                                   \
+  ftp-skip-pasv-ip.d                           \
+  ftp-ssl-ccc-mode.d                           \
+  ftp-ssl-ccc.d                                        \
+  ftp-ssl-control.d                            \
+  get.d globoff.d                              \
+  happy-eyeballs-timeout-ms.d                  \
+  haproxy-protocol.d                           \
+  head.d header.d                              \
+  help.d                                       \
+  hostpubmd5.d                                 \
+  http0.9.d                                    \
+  http1.0.d                                    \
+  http1.1.d http2.d                            \
+  http2-prior-knowledge.d                      \
+  http3.d                                       \
+  ignore-content-length.d                      \
+  include.d                                    \
+  insecure.d                                   \
+  interface.d                                  \
+  ipv4.d ipv6.d                                        \
+  junk-session-cookies.d                       \
+  keepalive-time.d                             \
+  key.d key-type.d                             \
+  krb.d libcurl.d                              \
+  limit-rate.d                                 \
+  list-only.d                                  \
+  local-port.d                                 \
+  location-trusted.d                           \
+  location.d                                   \
+  login-options.d                              \
+  mail-auth.d                                  \
+  mail-from.d                                  \
+  mail-rcpt.d                                  \
+  manual.d                                     \
+  max-filesize.d                               \
+  max-redirs.d                                 \
+  max-time.d                                   \
+  metalink.d                                   \
+  negotiate.d                                  \
+  netrc-file.d                                 \
+  netrc-optional.d                             \
+  netrc.d                                      \
+  next.d no-alpn.d                             \
+  no-buffer.d                                  \
+  no-keepalive.d                               \
+  no-npn.d                                     \
+  no-progress-meter.d                           \
+  no-sessionid.d                               \
+  noproxy.d                                    \
+  ntlm.d ntlm-wb.d                             \
+  oauth2-bearer.d                              \
+  output.d                                      \
+  parallel-immediate.d                          \
+  parallel-max.d                                \
+  parallel.d                                    \
+  pass.d                                       \
+  path-as-is.d                                 \
+  pinnedpubkey.d                               \
+  post301.d                                    \
+  post302.d                                    \
+  post303.d                                    \
+  preproxy.d                                   \
+  progress-bar.d                               \
+  proto-default.d                              \
+  proto-redir.d                                        \
+  proto.d                                      \
+  proxy-anyauth.d                              \
+  proxy-basic.d                                        \
+  proxy-cacert.d                               \
+  proxy-capath.d                               \
+  proxy-cert-type.d                            \
+  proxy-cert.d                                 \
+  proxy-ciphers.d                              \
+  proxy-crlfile.d                              \
+  proxy-digest.d                               \
+  proxy-header.d                               \
+  proxy-insecure.d                             \
+  proxy-key-type.d                             \
+  proxy-key.d                                  \
+  proxy-negotiate.d                            \
+  proxy-ntlm.d                                 \
+  proxy-pass.d                                 \
+  proxy-pinnedpubkey.d                         \
+  proxy-service-name.d                         \
+  proxy-ssl-allow-beast.d                      \
+  proxy-tls13-ciphers.d                                \
+  proxy-tlsauthtype.d                          \
+  proxy-tlspassword.d                          \
+  proxy-tlsuser.d                              \
+  proxy-tlsv1.d                                        \
+  proxy-user.d                                 \
+  proxy.d                                      \
+  proxy1.0.d                                   \
+  proxytunnel.d                                        \
+  pubkey.d quote.d                             \
+  random-file.d                                        \
+  range.d raw.d                                        \
+  referer.d                                    \
+  remote-header-name.d                         \
+  remote-name-all.d                            \
+  remote-name.d                                        \
+  remote-time.d                                        \
+  request-target.d                             \
+  request.d                                    \
+  resolve.d                                    \
+  retry-connrefused.d                          \
+  retry-delay.d                                        \
+  retry-max-time.d                             \
+  retry.d                                      \
+  sasl-authzid.d                                       \
+  sasl-ir.d                                    \
+  service-name.d                               \
+  show-error.d                                 \
+  silent.d                                     \
+  socks4.d socks5.d                            \
+  socks4a.d                                    \
+  socks5-basic.d                               \
+  socks5-gssapi-nec.d                          \
+  socks5-gssapi-service.d                      \
+  socks5-gssapi.d                              \
+  socks5-hostname.d                            \
+  speed-limit.d                                        \
+  speed-time.d                                 \
+  ssl-allow-beast.d                            \
+  ssl-no-revoke.d                              \
+  ssl-reqd.d                                   \
+  ssl.d                                                \
+  sslv2.d sslv3.d                              \
+  stderr.d                                     \
+  styled-output.d                              \
+  suppress-connect-headers.d                   \
+  tcp-fastopen.d                               \
+  tcp-nodelay.d                                        \
+  telnet-option.d                              \
+  tftp-blksize.d                               \
+  tftp-no-options.d                            \
+  time-cond.d                                  \
+  tls-max.d                                    \
+  tls13-ciphers.d                              \
+  tlsauthtype.d                                        \
+  tlspassword.d                                        \
+  tlsuser.d                                    \
+  tlsv1.0.d                                    \
+  tlsv1.1.d                                    \
+  tlsv1.2.d                                    \
+  tlsv1.3.d tlsv1.d                            \
+  tr-encoding.d                                        \
+  trace-ascii.d                                        \
+  trace-time.d                                 \
+  trace.d                                      \
+  unix-socket.d                                        \
+  upload-file.d                                        \
+  url.d use-ascii.d                            \
+  user-agent.d                                 \
+  user.d verbose.d                             \
+  version.d                                    \
+  write-out.d                                  \
+  xattr.d
 
 OTHERPAGES = page-footer page-header
 EXTRA_DIST = $(DPAGES) MANPAGE.md gen.pl $(OTHERPAGES) CMakeLists.txt
index 76fa5d4..829551f 100644 (file)
 # Shared between Makefile.am and CMakeLists.txt
 
-DPAGES = abstract-unix-socket.d anyauth.d append.d basic.d cacert.d capath.d cert.d \
-  cert-status.d cert-type.d ciphers.d compressed.d compressed-ssh.d     \
-  config.d doh-url.d                                                    \
-  connect-timeout.d connect-to.d continue-at.d cookie.d cookie-jar.d    \
-  create-dirs.d crlf.d crlfile.d data-ascii.d data-binary.d data.d      \
-  data-raw.d data-urlencode.d delegation.d digest.d disable.d           \
-  disable-eprt.d disable-epsv.d dns-interface.d dns-ipv4-addr.d         \
-  dns-ipv6-addr.d dns-servers.d dump-header.d egd-file.d engine.d       \
-  expect100-timeout.d fail.d fail-early.d false-start.d                 \
-  form.d form-string.d ftp-account.d ftp-alternative-to-user.d          \
-  ftp-create-dirs.d ftp-method.d ftp-pasv.d ftp-port.d ftp-pret.d       \
-  ftp-skip-pasv-ip.d ftp-ssl-ccc.d ftp-ssl-ccc-mode.d ftp-ssl-control.d \
-  get.d globoff.d                                                       \
-  happy-eyeballs-timeout-ms.d                                           \
-  head.d header.d help.d hostpubmd5.d http1.0.d                         \
-  http1.1.d http2.d http2-prior-knowledge.d ignore-content-length.d     \
-  include.d insecure.d interface.d ipv4.d ipv6.d junk-session-cookies.d \
-  keepalive-time.d key.d key-type.d krb.d libcurl.d limit-rate.d        \
-  list-only.d local-port.d location.d location-trusted.d                \
-  login-options.d mail-auth.d mail-from.d mail-rcpt.d manual.d          \
-  max-filesize.d max-redirs.d max-time.d metalink.d negotiate.d netrc.d \
-  netrc-file.d netrc-optional.d next.d no-alpn.d no-buffer.d            \
-  no-keepalive.d no-npn.d noproxy.d no-sessionid.d ntlm.d ntlm-wb.d     \
-  oauth2-bearer.d output.d pass.d path-as-is.d pinnedpubkey.d post301.d \
-  post302.d post303.d preproxy.d progress-bar.d proto.d proto-default.d \
-  proto-redir.d proxy1.0.d proxy-anyauth.d proxy-basic.d proxy-cacert.d \
-  proxy-capath.d proxy-cert.d proxy-cert-type.d proxy-ciphers.d         \
-  proxy-crlfile.d proxy.d proxy-digest.d proxy-header.d                 \
-  proxy-insecure.d proxy-key.d proxy-key-type.d proxy-negotiate.d       \
-  proxy-ntlm.d proxy-pass.d proxy-service-name.d                        \
-  proxy-ssl-allow-beast.d proxy-tlsauthtype.d proxy-tlspassword.d       \
-  proxy-tlsuser.d proxy-tlsv1.d proxytunnel.d proxy-user.d pubkey.d     \
-  quote.d random-file.d range.d raw.d referer.d remote-header-name.d    \
-  remote-name-all.d remote-name.d remote-time.d request.d resolve.d     \
-  retry-connrefused.d retry.d retry-delay.d retry-max-time.d sasl-ir.d  \
-  service-name.d show-error.d silent.d socks4a.d socks4.d socks5.d      \
-  socks5-basic.d socks5-gssapi.d proxy-pinnedpubkey.d                   \
-  socks5-gssapi-nec.d socks5-gssapi-service.d socks5-hostname.d         \
-  speed-limit.d speed-time.d ssl-allow-beast.d ssl.d ssl-no-revoke.d    \
-  ssl-reqd.d sslv2.d sslv3.d stderr.d suppress-connect-headers.d        \
-  tcp-fastopen.d tcp-nodelay.d                                          \
-  telnet-option.d tftp-blksize.d tftp-no-options.d time-cond.d          \
-  tls-max.d                                                             \
-  tlsauthtype.d tlspassword.d tlsuser.d tlsv1.0.d tlsv1.1.d tlsv1.2.d   \
-  tlsv1.3.d tlsv1.d trace-ascii.d trace.d trace-time.d tr-encoding.d    \
-  unix-socket.d upload-file.d url.d use-ascii.d user-agent.d user.d     \
-  verbose.d version.d write-out.d xattr.d request-target.d              \
-  styled-output.d tls13-ciphers.d proxy-tls13-ciphers.d                 \
-  disallow-username-in-url.d haproxy-protocol.d
+DPAGES =                                       \
+  abstract-unix-socket.d                       \
+  alt-svc.d                                     \
+  anyauth.d                                    \
+  append.d basic.d                             \
+  cacert.d capath.d                            \
+  cert-status.d                                        \
+  cert-type.d                                  \
+  cert.d                                       \
+  ciphers.d                                    \
+  compressed-ssh.d                             \
+  compressed.d                                 \
+  config.d                                     \
+  connect-timeout.d                            \
+  connect-to.d                                 \
+  continue-at.d                                        \
+  cookie-jar.d                                 \
+  cookie.d                                     \
+  create-dirs.d                                        \
+  crlf.d crlfile.d                             \
+  data-ascii.d                                 \
+  data-binary.d                                        \
+  data-urlencode.d                             \
+  data.d data-raw.d                            \
+  delegation.d                                 \
+  digest.d                                     \
+  disable-eprt.d                               \
+  disable-epsv.d                               \
+  disable.d                                    \
+  disallow-username-in-url.d                   \
+  dns-interface.d                              \
+  dns-ipv4-addr.d                              \
+  dns-ipv6-addr.d                              \
+  dns-servers.d                                        \
+  doh-url.d                                    \
+  dump-header.d                                        \
+  egd-file.d                                   \
+  engine.d                                     \
+  etag-save.d                   \
+  etag-compare.d                \
+  expect100-timeout.d                          \
+  fail-early.d                                 \
+  fail.d                                       \
+  false-start.d                                        \
+  form-string.d                                        \
+  form.d                                       \
+  ftp-account.d                                        \
+  ftp-alternative-to-user.d                    \
+  ftp-create-dirs.d                            \
+  ftp-method.d                                 \
+  ftp-pasv.d                                   \
+  ftp-port.d                                   \
+  ftp-pret.d                                   \
+  ftp-skip-pasv-ip.d                           \
+  ftp-ssl-ccc-mode.d                           \
+  ftp-ssl-ccc.d                                        \
+  ftp-ssl-control.d                            \
+  get.d globoff.d                              \
+  happy-eyeballs-timeout-ms.d                  \
+  haproxy-protocol.d                           \
+  head.d header.d                              \
+  help.d                                       \
+  hostpubmd5.d                                 \
+  http0.9.d                                    \
+  http1.0.d                                    \
+  http1.1.d http2.d                            \
+  http2-prior-knowledge.d                      \
+  http3.d                                       \
+  ignore-content-length.d                      \
+  include.d                                    \
+  insecure.d                                   \
+  interface.d                                  \
+  ipv4.d ipv6.d                                        \
+  junk-session-cookies.d                       \
+  keepalive-time.d                             \
+  key.d key-type.d                             \
+  krb.d libcurl.d                              \
+  limit-rate.d                                 \
+  list-only.d                                  \
+  local-port.d                                 \
+  location-trusted.d                           \
+  location.d                                   \
+  login-options.d                              \
+  mail-auth.d                                  \
+  mail-from.d                                  \
+  mail-rcpt.d                                  \
+  manual.d                                     \
+  max-filesize.d                               \
+  max-redirs.d                                 \
+  max-time.d                                   \
+  metalink.d                                   \
+  negotiate.d                                  \
+  netrc-file.d                                 \
+  netrc-optional.d                             \
+  netrc.d                                      \
+  next.d no-alpn.d                             \
+  no-buffer.d                                  \
+  no-keepalive.d                               \
+  no-npn.d                                     \
+  no-progress-meter.d                           \
+  no-sessionid.d                               \
+  noproxy.d                                    \
+  ntlm.d ntlm-wb.d                             \
+  oauth2-bearer.d                              \
+  output.d                                      \
+  parallel-immediate.d                          \
+  parallel-max.d                                \
+  parallel.d                                    \
+  pass.d                                       \
+  path-as-is.d                                 \
+  pinnedpubkey.d                               \
+  post301.d                                    \
+  post302.d                                    \
+  post303.d                                    \
+  preproxy.d                                   \
+  progress-bar.d                               \
+  proto-default.d                              \
+  proto-redir.d                                        \
+  proto.d                                      \
+  proxy-anyauth.d                              \
+  proxy-basic.d                                        \
+  proxy-cacert.d                               \
+  proxy-capath.d                               \
+  proxy-cert-type.d                            \
+  proxy-cert.d                                 \
+  proxy-ciphers.d                              \
+  proxy-crlfile.d                              \
+  proxy-digest.d                               \
+  proxy-header.d                               \
+  proxy-insecure.d                             \
+  proxy-key-type.d                             \
+  proxy-key.d                                  \
+  proxy-negotiate.d                            \
+  proxy-ntlm.d                                 \
+  proxy-pass.d                                 \
+  proxy-pinnedpubkey.d                         \
+  proxy-service-name.d                         \
+  proxy-ssl-allow-beast.d                      \
+  proxy-tls13-ciphers.d                                \
+  proxy-tlsauthtype.d                          \
+  proxy-tlspassword.d                          \
+  proxy-tlsuser.d                              \
+  proxy-tlsv1.d                                        \
+  proxy-user.d                                 \
+  proxy.d                                      \
+  proxy1.0.d                                   \
+  proxytunnel.d                                        \
+  pubkey.d quote.d                             \
+  random-file.d                                        \
+  range.d raw.d                                        \
+  referer.d                                    \
+  remote-header-name.d                         \
+  remote-name-all.d                            \
+  remote-name.d                                        \
+  remote-time.d                                        \
+  request-target.d                             \
+  request.d                                    \
+  resolve.d                                    \
+  retry-connrefused.d                          \
+  retry-delay.d                                        \
+  retry-max-time.d                             \
+  retry.d                                      \
+  sasl-authzid.d                                       \
+  sasl-ir.d                                    \
+  service-name.d                               \
+  show-error.d                                 \
+  silent.d                                     \
+  socks4.d socks5.d                            \
+  socks4a.d                                    \
+  socks5-basic.d                               \
+  socks5-gssapi-nec.d                          \
+  socks5-gssapi-service.d                      \
+  socks5-gssapi.d                              \
+  socks5-hostname.d                            \
+  speed-limit.d                                        \
+  speed-time.d                                 \
+  ssl-allow-beast.d                            \
+  ssl-no-revoke.d                              \
+  ssl-reqd.d                                   \
+  ssl.d                                                \
+  sslv2.d sslv3.d                              \
+  stderr.d                                     \
+  styled-output.d                              \
+  suppress-connect-headers.d                   \
+  tcp-fastopen.d                               \
+  tcp-nodelay.d                                        \
+  telnet-option.d                              \
+  tftp-blksize.d                               \
+  tftp-no-options.d                            \
+  time-cond.d                                  \
+  tls-max.d                                    \
+  tls13-ciphers.d                              \
+  tlsauthtype.d                                        \
+  tlspassword.d                                        \
+  tlsuser.d                                    \
+  tlsv1.0.d                                    \
+  tlsv1.1.d                                    \
+  tlsv1.2.d                                    \
+  tlsv1.3.d tlsv1.d                            \
+  tr-encoding.d                                        \
+  trace-ascii.d                                        \
+  trace-time.d                                 \
+  trace.d                                      \
+  unix-socket.d                                        \
+  upload-file.d                                        \
+  url.d use-ascii.d                            \
+  user-agent.d                                 \
+  user.d verbose.d                             \
+  version.d                                    \
+  write-out.d                                  \
+  xattr.d
 
 OTHERPAGES = page-footer page-header
diff --git a/docs/cmdline-opts/alt-svc.d b/docs/cmdline-opts/alt-svc.d
new file mode 100644 (file)
index 0000000..df10bf2
--- /dev/null
@@ -0,0 +1,17 @@
+Long: alt-svc
+Arg: <file name>
+Protocols: HTTPS
+Help: Enable alt-svc with this cache file
+Added: 7.64.1
+---
+WARNING: this option is experimental. Do not use in production.
+
+This option enables the alt-svc parser in curl. If the file name points to an
+existing alt-svc cache file, that will be used. After a completed transfer,
+the cache will be saved to the file name again if it has been modified.
+
+Specify a "" file name (zero length) to avoid loading/saving and make curl
+just handle the cache in memory.
+
+If this option is used several times, curl will load contents from all the
+files but the the last one will be used for saving.
index 073ad3a..6a56787 100644 (file)
@@ -25,9 +25,9 @@ should not be set. If the option is not set, then curl will use the
 certificates in the system and user Keychain to verify the peer, which is the
 preferred method of verifying the peer's certificate chain.
 
-(Schannel/WinSSL only) This option is supported for WinSSL in Windows 7 or
-later with libcurl 7.60 or later. This option is supported for backward
-compatibility with other SSL engines; instead it is recommended to use Windows'
-store of root certificates (the default for WinSSL).
+(Schannel only) This option is supported for Schannel in Windows 7 or later with
+libcurl 7.60 or later. This option is supported for backward compatibility
+with other SSL engines; instead it is recommended to use Windows' store of
+root certificates (the default for Schannel).
 
 If this option is used several times, the last one will be used.
index 510b833..de6b420 100644 (file)
@@ -36,7 +36,7 @@ system or user keychain, or the path to a PKCS#12-encoded certificate and
 private key. If you want to use a file from the current directory, please
 precede it with "./" prefix, in order to avoid confusion with a nickname.
 
-(Schannel/WinSSL only) Client certificates must be specified by a path
+(Schannel only) Client certificates must be specified by a path
 expression to a certificate store. (Loading PFX is not supported; you can
 import it to a store first). You can use
 "<store location>\\<store name>\\<thumbprint>" to refer to a certificate
index 105d628..df3d392 100644 (file)
@@ -15,12 +15,12 @@ if so, the colon or equals characters can be used as separators. If the option
 is specified with one or two dashes, there can be no colon or equals character
 between the option and its parameter.
 
-If the parameter is to contain whitespace, the parameter must be enclosed
-within quotes. Within double quotes, the following escape sequences are
-available: \\\\, \\", \\t, \\n, \\r and \\v. A backslash preceding any other
-letter is ignored. If the first column of a config line is a '#' character,
-the rest of the line will be treated as a comment. Only write one option per
-physical line in the config file.
+If the parameter contains whitespace (or starts with : or =), the parameter
+must be enclosed within quotes. Within double quotes, the following escape
+sequences are available: \\\\, \\", \\t, \\n, \\r and \\v. A backslash
+preceding any other letter is ignored. If the first column of a config line is
+a '#' character, the rest of the line will be treated as a comment. Only write
+one option per physical line in the config file.
 
 Specify the filename to --config as '-' to make curl read the file from stdin.
 
@@ -40,7 +40,7 @@ Unix-like systems (which returns the home dir given the current user in your
 system). On Windows, it then checks for the APPDATA variable, or as a last
 resort the '%USERPROFILE%\\Application Data'.
 
-2) On windows, if there is no _curlrc file in the home dir, it checks for one
+2) On windows, if there is no .curlrc file in the home dir, it checks for one
 in the same dir the curl executable is placed. On Unix-like systems, it will
 simply try to load .curlrc from the determined home dir.
 
index 3ae6975..1e99069 100644 (file)
@@ -1,6 +1,6 @@
 Short: b
 Long: cookie
-Arg: <data>
+Arg: <data|filename>
 Protocols: HTTP
 Help: Send cookies from string/file
 ---
index 7d49966..d18312a 100644 (file)
@@ -24,7 +24,7 @@ chunk that looks like \&'name=daniel&skill=lousy'.
 If you start the data with the letter @, the rest should be a file name to
 read the data from, or - if you want curl to read the data from
 stdin. Multiple files can also be specified. Posting data from a file named
-'foobar' would thus be done with --data @foobar. When --data is told to read
+\&'foobar' would thus be done with --data @foobar. When --data is told to read
 from a file like that, carriage returns and newlines will be stripped out. If
 you don't want the @ character to have a special interpretation use --data-raw
 instead.
index 8fa42c1..c871c4d 100644 (file)
@@ -2,6 +2,7 @@ Long: doh-url
 Arg: <URL>
 Help: Resolve host names over DOH
 Protocols: all
+Added: 7.62.0
 ---
 Specifies which DNS-over-HTTPS (DOH) server to use to resolve hostnames,
 instead of using the default name resolver mechanism. The URL must be HTTPS.
index 05c10af..33c6674 100644 (file)
@@ -12,6 +12,8 @@ site sends to you. Cookies from the headers could then be read in a second
 curl invocation by using the --cookie option! The --cookie-jar option is a
 better way to store cookies.
 
+If no headers are received, the use of this option will create an empty file.
+
 When used in FTP, the FTP server response lines are considered being "headers"
 and thus are saved there.
 
diff --git a/docs/cmdline-opts/etag-compare.d b/docs/cmdline-opts/etag-compare.d
new file mode 100644 (file)
index 0000000..1a698a8
--- /dev/null
@@ -0,0 +1,18 @@
+Long: etag-compare
+Arg: <file>
+Help: Pass an ETag from a file as a custom header
+Protocols: HTTP
+Added: 7.68.0
+---
+This option makes a conditional HTTP request for the specific
+ETag read from the given file by sending a custom If-None-Match
+header using the extracted ETag.
+
+For correct results, make sure that specified file contains only a single
+line with a desired ETag. An empty file is parsed as an empty ETag.
+
+Use the option --etag-save to first save the ETag from a response, and
+then use this option to compare using the saved ETag in a subsequent request.
+
+\fCOMPARISON\fP: There are 2 types of comparison or ETags, Weak and Strong.
+This option expects, and uses a strong comparison.
diff --git a/docs/cmdline-opts/etag-save.d b/docs/cmdline-opts/etag-save.d
new file mode 100644 (file)
index 0000000..214723f
--- /dev/null
@@ -0,0 +1,16 @@
+Long: etag-save
+Arg: <file>
+Help: Parse ETag from a request and save it to a file
+Protocols: HTTP
+Added: 7.68.0
+---
+This option saves an HTTP ETag to the specified file. Etag is
+usually part of headers returned by a request. When server sends an
+ETag, it must be enveloped by a double quote. This option extracts the
+ETag without the double quotes and saves it into the <file>.
+
+A server can send a week ETag which is prefixed by "W/". This identifier
+is not considered, and only relevant ETag between quotation marks is parsed.
+
+It an ETag wasn't send by the server or it cannot be parsed, and empty
+file is created.
index 439b765..a921298 100755 (executable)
@@ -158,7 +158,7 @@ sub single {
             print STDERR "WARN: unrecognized line in $f, ignoring:\n:'$_';"
         }
     }
-    my @dest;
+    my @desc;
     while(<F>) {
         push @desc, $_;
     }
diff --git a/docs/cmdline-opts/http0.9.d b/docs/cmdline-opts/http0.9.d
new file mode 100644 (file)
index 0000000..7e783f6
--- /dev/null
@@ -0,0 +1,13 @@
+Long: http0.9
+Tags: Versions
+Protocols: HTTP
+Added:
+Help: Allow HTTP 0.9 responses
+---
+Tells curl to be fine with HTTP version 0.9 response.
+
+HTTP/0.9 is a completely headerless response and therefore you can also
+connect with this to non-HTTP servers and still get a response since curl will
+simply transparently downgrade - if allowed.
+
+Since curl 7.66.0, HTTP/0.9 is disabled by default.
index 04cff00..cf8f298 100644 (file)
@@ -6,5 +6,6 @@ Mutexed: http1.1 http1.0 http2-prior-knowledge
 Requires: HTTP/2
 See-also: no-alpn
 Help: Use HTTP 2
+See-also: http1.1 http3
 ---
 Tells curl to use HTTP version 2.
diff --git a/docs/cmdline-opts/http3.d b/docs/cmdline-opts/http3.d
new file mode 100644 (file)
index 0000000..8265937
--- /dev/null
@@ -0,0 +1,19 @@
+Long: http3
+Tags: Versions
+Protocols: HTTP
+Added: 7.66.0
+Mutexed: http1.1 http1.0 http2 http2-prior-knowledge
+Requires: HTTP/3
+Help: Use HTTP v3
+See-also: http1.1 http2
+---
+
+WARNING: this option is experimental. Do not use in production.
+
+Tells curl to use HTTP version 3 directly to the host and port number used in
+the URL. A normal HTTP/3 transaction will be done to a host and then get
+redirected via Alt-SVc, but this option allows a user to circumvent that when
+you know that the target speaks HTTP/3 on the given host and port.
+
+This option will make curl fail if a QUIC connection cannot be established, it
+cannot fall back to a lower HTTP version on its own.
index 4877b42..855e2f7 100644 (file)
@@ -5,7 +5,7 @@ Help: Private key file name
 ---
 Private key file name. Allows you to provide your private key in this separate
 file. For SSH, if not specified, curl tries the following candidates in order:
-'~/.ssh/id_rsa', '~/.ssh/id_dsa', './id_rsa', './id_dsa'.
+\&'~/.ssh/id_rsa', '~/.ssh/id_dsa', './id_rsa', './id_dsa'.
 
 If curl is built against OpenSSL library, and the engine pkcs11 is available,
 then a PKCS#11 URI (RFC 7512) can be used to specify a private key located in a
index 04b824b..a97860a 100644 (file)
@@ -4,8 +4,7 @@ Help: Maximum number of redirects allowed
 Protocols: HTTP
 ---
 Set maximum number of redirection-followings allowed. When --location is used,
-is used to prevent curl from following redirections \&"in absurdum". By
-default, the limit is set to 50 redirections. Set this option to -1 to make it
-unlimited.
+is used to prevent curl from following redirections too much. By default, the
+limit is set to 50 redirections. Set this option to -1 to make it unlimited.
 
 If this option is used several times, the last one will be used.
index 0b5d240..50126d2 100644 (file)
@@ -5,7 +5,7 @@ Added: 7.21.5
 Mutexed: netrc
 ---
 This option is similar to --netrc, except that you provide the path (absolute
-or relative) to the netrc file that Curl should use.  You can only specify one
+or relative) to the netrc file that curl should use.  You can only specify one
 netrc file per invocation. If several --netrc-file options are provided,
 the last one will be used.
 
diff --git a/docs/cmdline-opts/no-progress-meter.d b/docs/cmdline-opts/no-progress-meter.d
new file mode 100644 (file)
index 0000000..aff0717
--- /dev/null
@@ -0,0 +1,10 @@
+Long: no-progress-meter
+Help: Do not show the progress meter
+See-also: verbose silent
+Added: 7.67.0
+---
+Option to switch off the progress meter output without muting or otherwise
+affecting warning and informational messages like --silent does.
+
+Note that this is the negated option name documented. You can thus use
+--progress-meter to enable the progress meter again.
diff --git a/docs/cmdline-opts/parallel-immediate.d b/docs/cmdline-opts/parallel-immediate.d
new file mode 100644 (file)
index 0000000..3439310
--- /dev/null
@@ -0,0 +1,9 @@
+Long: parallel-immediate
+Help: Do not wait for multiplexing (with --parallel)
+Added: 7.68.0
+See-also: parallel parallel-max
+---
+When doing parallel transfers, this option will instruct curl that it should
+rather prefer opening up more connections in parallel at once rather than
+waiting to see if new transfers can be added as multiplexed streams on another
+connection.
diff --git a/docs/cmdline-opts/parallel-max.d b/docs/cmdline-opts/parallel-max.d
new file mode 100644 (file)
index 0000000..a8c79c7
--- /dev/null
@@ -0,0 +1,9 @@
+Long: parallel-max
+Help: Maximum concurrency for parallel transfers
+Added: 7.66.0
+See-also: parallel
+---
+When asked to do parallel transfers, using --parallel, this option controls
+the maximum amount of transfers to do simultaneously.
+
+The default is 50.
diff --git a/docs/cmdline-opts/parallel.d b/docs/cmdline-opts/parallel.d
new file mode 100644 (file)
index 0000000..fac84e6
--- /dev/null
@@ -0,0 +1,7 @@
+Short: Z
+Long: parallel
+Help: Perform transfers in parallel
+Added: 7.66.0
+---
+Makes curl perform its transfers in parallel as compared to the regular serial
+manner.
index 0657e6e..cd21911 100644 (file)
@@ -15,13 +15,11 @@ abort the connection before sending or receiving any data.
 
 PEM/DER support:
   7.39.0: OpenSSL, GnuTLS and GSKit
-  7.43.0: NSS and wolfSSL/CyaSSL
+  7.43.0: NSS and wolfSSL
   7.47.0: mbedtls
-  7.49.0: PolarSSL
 sha256 support:
-  7.44.0: OpenSSL, GnuTLS, NSS and wolfSSL/CyaSSL.
+  7.44.0: OpenSSL, GnuTLS, NSS and wolfSSL
   7.47.0: mbedtls
-  7.49.0: PolarSSL
 Other SSL backends not supported.
 
 If this option is used several times, the last one will be used.
index c9eeeab..a1205dd 100644 (file)
@@ -11,7 +11,8 @@ Example, allow only HTTP and HTTPS on redirect:
 
  curl --proto-redir -all,http,https http://example.com
 
-By default curl will allow all protocols on redirect except several disabled
-for security reasons: Since 7.19.4 FILE and SCP are disabled, and since 7.40.0
-SMB and SMBS are also disabled. Specifying \fIall\fP or \fI+all\fP enables all
-protocols on redirect, including those disabled for security.
+By default curl will allow HTTP, HTTPS, FTP and FTPS on redirect (7.65.2).
+Older versions of curl allowed all protocols on redirect except several
+disabled for security reasons: Since 7.19.4 FILE and SCP are disabled, and
+since 7.40.0 SMB and SMBS are also disabled. Specifying \fIall\fP or \fI+all\fP
+enables all protocols on redirect, including those disabled for security.
index 1513fdc..e1ece17 100644 (file)
@@ -6,7 +6,7 @@ Added: 7.20.2
 ---
 Tells curl to limit what protocols it may use in the transfer. Protocols are
 evaluated left to right, are comma separated, and are each a protocol name or
-'all', optionally prefixed by zero or more modifiers. Available modifiers are:
+\&'all', optionally prefixed by zero or more modifiers. Available modifiers are:
 .RS
 .TP 3
 .B +
index 3e35b07..08961b7 100644 (file)
@@ -9,4 +9,8 @@ ciphers. Read up on TLS 1.3 cipher suite details on this URL:
 
  https://curl.haxx.se/docs/ssl-ciphers.html
 
+This option is currently used only when curl is built to use OpenSSL 1.1.1 or
+later. If you are using a different SSL backend you can try setting TLS 1.3
+cipher suites by using the --proxy-ciphers option.
+
 If this option is used several times, the last one will be used.
index b1f6f6e..152466d 100644 (file)
@@ -9,4 +9,10 @@ If you use a Windows SSPI-enabled curl binary and do either Negotiate or NTLM
 authentication then you can tell curl to select the user name and password
 from your environment by specifying a single colon with this option: "-U :".
 
+On systems where it works, curl will hide the given option argument from
+process listings. This is not enough to protect credentials from possibly
+getting seen by other users on the same system as they will still be visible
+for a brief moment before cleared. Such sensitive data should be retrieved
+from a file instead or similar and never used in clear text in a command line.
+
 If this option is used several times, the last one will be used.
index 42aee2b..1f587f1 100644 (file)
@@ -3,11 +3,10 @@ Short: p
 Help: Operate through an HTTP proxy tunnel (using CONNECT)
 See-also: proxy
 ---
-When an HTTP proxy is used --proxy, this option will cause non-HTTP protocols
-to attempt to tunnel through the proxy instead of merely using it to do
-HTTP-like operations. The tunnel approach is made with the HTTP proxy CONNECT
-request and requires that the proxy allows direct connect to the remote port
-number curl wants to tunnel through to.
+When an HTTP proxy is used --proxy, this option will make curl tunnel through
+the proxy. The tunnel approach is made with the HTTP proxy CONNECT request and
+requires that the proxy allows direct connect to the remote port number curl
+wants to tunnel through to.
 
 To suppress proxy CONNECT response headers when curl is set to output headers
 use --suppress-connect-headers.
index cdd3ca6..59a98ea 100644 (file)
@@ -16,9 +16,10 @@ If the server returns failure for one of the commands, the entire operation
 will be aborted. You must send syntactically correct FTP commands as RFC 959
 defines to FTP servers, or one of the commands listed below to SFTP servers.
 
-This option can be used multiple times. When speaking to an FTP server, prefix
-the command with an asterisk (*) to make curl continue even if the command
-fails as by default curl will stop at first failure.
+Prefix the command with an asterisk (*) to make curl continue even if the
+command fails as by default curl will stop at first failure.
+
+This option can be used multiple times.
 
 SFTP is a binary protocol. Unlike for FTP, curl interprets SFTP quote commands
 itself before sending them to the server.  File names may be quoted
index 9e1457b..9c37525 100644 (file)
@@ -11,6 +11,10 @@ the number used for the specific protocol the host will be used for. It means
 you need several entries if you want to provide address for the same host but
 different ports.
 
+By specifying '*' as host you can tell curl to resolve any host and specific
+port pair to the specified address. Wildcard is resolved last so any --resolve
+with a specific host and port will be used first.
+
 The provided address set by this option will be used even if --ipv4 or --ipv6
 is set to make curl use another IP version.
 
@@ -18,4 +22,6 @@ Support for providing the IP address within [brackets] was added in 7.57.0.
 
 Support for providing multiple IP addresses per entry was added in 7.59.0.
 
+Support for resolving with wildcard was added in 7.64.0.
+
 This option can be used many times to add many host names to resolve.
index 32d1c79..3db89b7 100644 (file)
@@ -14,4 +14,7 @@ for all forthcoming retries it will double the waiting time until it reaches
 using --retry-delay you disable this exponential backoff algorithm. See also
 --retry-max-time to limit the total time allowed for retries.
 
+Since curl 7.66.0, curl will comply with the Retry-After: response header if
+one was present to know when to issue the next retry.
+
 If this option is used several times, the last one will be used.
diff --git a/docs/cmdline-opts/sasl-authzid.d b/docs/cmdline-opts/sasl-authzid.d
new file mode 100644 (file)
index 0000000..b34db97
--- /dev/null
@@ -0,0 +1,11 @@
+Long: sasl-authzid
+Help: Use this identity to act as during SASL PLAIN authentication
+Added: 7.66.0
+---
+Use this authorisation identity (authzid), during SASL PLAIN authentication,
+in addition to the authentication identity (authcid) as specified by --user.
+
+If the option isn't specified, the server will derive the authzid from the
+authcid, but if specified, and depending on the server implementation, it may
+be used to access another user's inbox, that the user has been granted access
+to, or a shared mailbox for example.
index cdb6fb5..f94b111 100644 (file)
@@ -1,7 +1,7 @@
 Long: ssl-no-revoke
-Help: Disable cert revocation checks (WinSSL)
+Help: Disable cert revocation checks (Schannel)
 Added: 7.44.0
 ---
-(WinSSL) This option tells curl to disable certificate revocation checks.
+(Schannel) This option tells curl to disable certificate revocation checks.
 WARNING: this option loosens the SSL security, and by using this flag you ask
 for exactly that.
index 7ae8622..b5616f1 100644 (file)
@@ -4,11 +4,11 @@ Tags: Versions
 Protocols: SSL
 Added: 7.54.0
 Requires: TLS
-See-also: tlsv1.0 tlsv1.1 tlsv1.2
-Help: Use TLSv1.0 or greater
+See-also: tlsv1.0 tlsv1.1 tlsv1.2 tlsv1.3
+Help: Set maximum allowed TLS version
 ---
-VERSION defines maximum supported TLS version. A minimum is defined
-by arguments tlsv1.0 or tlsv1.1 or tlsv1.2.
+VERSION defines maximum supported TLS version. The minimum acceptable version
+is set by tlsv1.0, tlsv1.1, tlsv1.2 or tlsv1.3.
 
 .RS
 .IP "default"
index add1615..654a25b 100644 (file)
@@ -9,4 +9,8 @@ cipher suite details on this URL:
 
  https://curl.haxx.se/docs/ssl-ciphers.html
 
+This option is currently used only when curl is built to use OpenSSL 1.1.1 or
+later. If you are using a different SSL backend you can try setting TLS 1.3
+cipher suites by using the --ciphers option.
+
 If this option is used several times, the last one will be used.
index 234a116..b2e6536 100644 (file)
@@ -4,3 +4,5 @@ Added: 7.21.4
 ---
 Set password for use with the TLS authentication method specified with
 --tlsauthtype. Requires that --tlsuser also be set.
+
+This doesn't work with TLS 1.3.
index 72f1e16..7192b9f 100644 (file)
@@ -5,3 +5,5 @@ Added: 7.21.4
 ---
 Set username for use with the TLS authentication method specified with
 --tlsauthtype. Requires that --tlspassword also is set.
+
+This doesn't work with TLS 1.3.
index 312b67b..2b1f015 100644 (file)
@@ -4,3 +4,7 @@ Protocols: TLS
 Added: 7.34.0
 ---
 Forces curl to use TLS version 1.0 or later when connecting to a remote TLS server.
+
+In old versions of curl this option was documented to allow _only_ TLS 1.0,
+but behavior was inconsistent depending on the TLS library. Use --tls-max if
+you want to set a maximum TLS version.
index 8182ac6..405d552 100644 (file)
@@ -4,3 +4,7 @@ Protocols: TLS
 Added: 7.34.0
 ---
 Forces curl to use TLS version 1.1 or later when connecting to a remote TLS server.
+
+In old versions of curl this option was documented to allow _only_ TLS 1.1,
+but behavior was inconsistent depending on the TLS library. Use --tls-max if
+you want to set a maximum TLS version.
index 7ba4402..bdf1fcf 100644 (file)
@@ -4,3 +4,7 @@ Protocols: TLS
 Added: 7.34.0
 ---
 Forces curl to use TLS version 1.2 or later when connecting to a remote TLS server.
+
+In old versions of curl this option was documented to allow _only_ TLS 1.2,
+but behavior was inconsistent depending on the TLS library. Use --tls-max if
+you want to set a maximum TLS version.
index 439def3..7001d28 100644 (file)
@@ -12,6 +12,12 @@ The user name and passwords are split up on the first colon, which makes it
 impossible to use a colon in the user name with this option. The password can,
 still.
 
+On systems where it works, curl will hide the given option argument from
+process listings. This is not enough to protect credentials from possibly
+getting seen by other users on the same system as they will still be visible
+for a brief moment before cleared. Such sensitive data should be retrieved
+from a file instead or similar and never used in clear text in a command line.
+
 When using Kerberos V5 with a Windows based server you should include the
 Windows domain name in the user name, in order for the server to successfully
 obtain a Kerberos Ticket. If you don't then the initial authentication
index 196a4a9..cd35f27 100644 (file)
@@ -55,4 +55,6 @@ there are errors (such as the file or server not being available).
 .IP "PSL"
 PSL is short for Public Suffix List and means that this curl has been built
 with knowledge about "public suffixes".
+.IP "MultiSSL"
+This curl supports multiple TLS backends.
 .RE
index 3747845..2fc0ff2 100644 (file)
@@ -15,6 +15,9 @@ text that curl thinks fit, as described below. All variables are specified as
 output a newline by using \\n, a carriage return with \\r and a tab space with
 \\t.
 
+The output will be written to standard output, but this can be switched to
+standard error by using %{stderr}.
+
 .B NOTE:
 The %-symbol is a special symbol in the win32-environment, where all
 occurrences of % must be doubled when using this option.
@@ -103,6 +106,15 @@ second.
 The result of the SSL peer certificate verification that was requested. 0
 means the verification was successful. (Added in 7.19.0)
 .TP
+.B stderr
+From this point on, the --write-out output will be written to standard
+error. (Added in 7.63.0)
+.TP
+.B stdout
+From this point on, the --write-out output will be written to standard output.
+This is the default, but can be used to switch back after switching to stderr.
+(Added in 7.63.0)
+.TP
 .B time_appconnect
 The time, in seconds, it took from the start until the SSL/SSH/etc
 connect/handshake to the remote host was completed. (Added in 7.19.0)
index 4f31769..ae24704 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH curl-config 1 "November 30, 2017" "Curl 7.62.0" "curl-config manual"
+.TH curl-config 1 "November 30, 2017" "Curl 7.68.0" "curl-config manual"
 
 .SH NAME
 curl-config \- Get information about a libcurl installation
index 1cd598d..bcfc67d 100644 (file)
@@ -22,7 +22,7 @@
 .\"
 .\" DO NOT EDIT. Generated by the curl project gen.pl man page generator.
 .\"
-.TH curl 1 "November 16, 2016" "Curl 7.62.0" "Curl Manual"
+.TH curl 1 "November 16, 2016" "Curl 7.68.0" "Curl Manual"
 
 .SH NAME
 curl \- transfer a URL
@@ -146,6 +146,20 @@ Note: netstat shows the path of an abstract socket prefixed with '@', however
 the <path> argument should not have this leading character.
 
 Added in 7.53.0.
+.IP "--alt-svc <file name>"
+(HTTPS) WARNING: this option is experimental. Do not use in production.
+
+This option enables the alt-svc parser in curl. If the file name points to an
+existing alt-svc cache file, that will be used. After a completed transfer,
+the cache will be saved to the file name again if it has been modified.
+
+Specify a "" file name (zero length) to avoid loading/saving and make curl
+just handle the cache in memory.
+
+If this option is used several times, curl will load contents from all the
+files but the the last one will be used for saving.
+
+Added in 7.64.1.
 .IP "--anyauth"
 (HTTP) Tells curl to figure out authentication method by itself, and use the most
 secure one the remote site claims to support. This is done by first doing a
@@ -197,10 +211,10 @@ should not be set. If the option is not set, then curl will use the
 certificates in the system and user Keychain to verify the peer, which is the
 preferred method of verifying the peer's certificate chain.
 
-(Schannel/WinSSL only) This option is supported for WinSSL in Windows 7 or
-later with libcurl 7.60 or later. This option is supported for backward
-compatibility with other SSL engines; instead it is recommended to use Windows'
-store of root certificates (the default for WinSSL).
+(Schannel only) This option is supported for Schannel in Windows 7 or later with
+libcurl 7.60 or later. This option is supported for backward compatibility
+with other SSL engines; instead it is recommended to use Windows' store of
+root certificates (the default for Schannel).
 
 If this option is used several times, the last one will be used.
 .IP "--capath <dir>"
@@ -264,7 +278,7 @@ system or user keychain, or the path to a PKCS#12-encoded certificate and
 private key. If you want to use a file from the current directory, please
 precede it with "./" prefix, in order to avoid confusion with a nickname.
 
-(Schannel/WinSSL only) Client certificates must be specified by a path
+(Schannel only) Client certificates must be specified by a path
 expression to a certificate store. (Loading PFX is not supported; you can
 import it to a store first). You can use
 "<store location>\\<store name>\\<thumbprint>" to refer to a certificate
@@ -307,12 +321,12 @@ if so, the colon or equals characters can be used as separators. If the option
 is specified with one or two dashes, there can be no colon or equals character
 between the option and its parameter.
 
-If the parameter is to contain whitespace, the parameter must be enclosed
-within quotes. Within double quotes, the following escape sequences are
-available: \\\\, \\", \\t, \\n, \\r and \\v. A backslash preceding any other
-letter is ignored. If the first column of a config line is a '#' character,
-the rest of the line will be treated as a comment. Only write one option per
-physical line in the config file.
+If the parameter contains whitespace (or starts with : or =), the parameter
+must be enclosed within quotes. Within double quotes, the following escape
+sequences are available: \\\\, \\", \\t, \\n, \\r and \\v. A backslash
+preceding any other letter is ignored. If the first column of a config line is
+a '#' character, the rest of the line will be treated as a comment. Only write
+one option per physical line in the config file.
 
 Specify the filename to \fI-K, --config\fP as '-' to make curl read the file from stdin.
 
@@ -332,7 +346,7 @@ Unix-like systems (which returns the home dir given the current user in your
 system). On Windows, it then checks for the APPDATA variable, or as a last
 resort the '%USERPROFILE%\\Application Data'.
 
-2) On windows, if there is no _curlrc file in the home dir, it checks for one
+2) On windows, if there is no .curlrc file in the home dir, it checks for one
 in the same dir the curl executable is placed. On Unix-like systems, it will
 simply try to load .curlrc from the determined home dir.
 
@@ -409,7 +423,7 @@ lethal situation.
 
 If this option is used several times, the last specified file name will be
 used.
-.IP "-b, --cookie <data>"
+.IP "-b, --cookie <data|filename>"
 (HTTP) Pass the data to the HTTP server in the Cookie header. It is supposedly
 the data previously received from the server in a "Set-Cookie:" line.  The
 data should be in the format "NAME1=VALUE1; NAME2=VALUE2".
@@ -528,7 +542,7 @@ chunk that looks like \&'name=daniel&skill=lousy'.
 If you start the data with the letter @, the rest should be a file name to
 read the data from, or - if you want curl to read the data from
 stdin. Multiple files can also be specified. Posting data from a file named
-'foobar' would thus be done with \fI-d, --data\fP @foobar. When --data is told to read
+\&'foobar' would thus be done with \fI-d, --data\fP @foobar. When --data is told to read
 from a file like that, carriage returns and newlines will be stripped out. If
 you don't want the @ character to have a special interpretation use \fI--data-raw\fP
 instead.
@@ -621,6 +635,8 @@ address.
 instead of using the default name resolver mechanism. The URL must be HTTPS.
 
 If this option is used several times, the last one will be used.
+
+Added in 7.62.0.
 .IP "-D, --dump-header <filename>"
 (HTTP FTP) Write the received protocol headers to the specified file.
 
@@ -629,6 +645,8 @@ site sends to you. Cookies from the headers could then be read in a second
 curl invocation by using the \fI-b, --cookie\fP option! The \fI-c, --cookie-jar\fP option is a
 better way to store cookies.
 
+If no headers are received, the use of this option will create an empty file.
+
 When used in FTP, the FTP server response lines are considered being "headers"
 and thus are saved there.
 
@@ -644,6 +662,34 @@ See also \fI--random-file\fP.
 (TLS) Select the OpenSSL crypto engine to use for cipher operations. Use \fI--engine\fP
 list to print a list of build-time supported engines. Note that not all (or
 none) of the engines may be available at run-time.
+.IP "--etag-compare <file>"
+(HTTP) This option makes a conditional HTTP request for the specific
+ETag read from the given file by sending a custom If-None-Match
+header using the extracted ETag.
+
+For correct results, make sure that specified file contains only a single
+line with a desired ETag. An empty file is parsed as an empty ETag.
+
+Use the option \fI--etag-save\fP to first save the ETag from a response, and
+then use this option to compare using the saved ETag in a subsequent request.
+
+\fCOMPARISON\fP: There are 2 types of comparison or ETags, Weak and Strong.
+This option expects, and uses a strong comparison.
+
+Added in 7.68.0.
+.IP "--etag-save <file>"
+(HTTP) This option saves an HTTP ETag to the specified file. Etag is
+usually part of headers returned by a request. When server sends an
+ETag, it must be enveloped by a double quote. This option extracts the
+ETag without the double quotes and saves it into the <file>.
+
+A server can send a week ETag which is prefixed by "W/". This identifier
+is not considered, and only relevant ETag between quotation marks is parsed.
+
+It an ETag wasn't send by the server or it cannot be parsed, and empty
+file is created.
+
+Added in 7.68.0.
 .IP "--expect100-timeout <seconds>"
 (HTTP) Maximum time in seconds that you allow curl to wait for a 100-continue
 response when curl emits an Expects: 100-continue header in its request. By
@@ -1037,6 +1083,14 @@ be the 128 bit MD5 checksum of the remote host's public key, curl will refuse
 the connection with the host unless the md5sums match.
 
 Added in 7.17.1.
+.IP "--http0.9"
+(HTTP) Tells curl to be fine with HTTP version 0.9 response.
+
+HTTP/0.9 is a completely headerless response and therefore you can also
+connect with this to non-HTTP servers and still get a response since curl will
+simply transparently downgrade - if allowed.
+
+Since curl 7.66.0, HTTP/0.9 is disabled by default.
 .IP "-0, --http1.0"
 (HTTP) Tells curl to use HTTP version 1.0 instead of using its internally preferred
 HTTP version.
@@ -1056,7 +1110,20 @@ protocol version in the TLS handshake.
 .IP "--http2"
 (HTTP) Tells curl to use HTTP version 2.
 
-See also \fI--no-alpn\fP. \fI--http2\fP requires that the underlying libcurl was built to support HTTP/2. This option overrides \fI--http1.1\fP and \fI-0, --http1.0\fP and \fI--http2-prior-knowledge\fP. Added in 7.33.0.
+See also \fI--http1.1\fP and \fI--http3\fP. \fI--http2\fP requires that the underlying libcurl was built to support HTTP/2. This option overrides \fI--http1.1\fP and \fI-0, --http1.0\fP and \fI--http2-prior-knowledge\fP. Added in 7.33.0.
+.IP "--http3"
+(HTTP) 
+WARNING: this option is experimental. Do not use in production.
+
+Tells curl to use HTTP version 3 directly to the host and port number used in
+the URL. A normal HTTP/3 transaction will be done to a host and then get
+redirected via Alt-SVc, but this option allows a user to circumvent that when
+you know that the target speaks HTTP/3 on the given host and port.
+
+This option will make curl fail if a QUIC connection cannot be established, it
+cannot fall back to a lower HTTP version on its own.
+
+See also \fI--http1.1\fP and \fI--http2\fP. \fI--http3\fP requires that the underlying libcurl was built to support HTTP/3. This option overrides \fI--http1.1\fP and \fI-0, --http1.0\fP and \fI--http2\fP and \fI--http2-prior-knowledge\fP. Added in 7.66.0.
 .IP "--ignore-content-length"
 (FTP HTTP) For HTTP, Ignore the Content-Length header. This is particularly useful for
 servers running Apache 1.x, which will report incorrect Content-Length for
@@ -1135,7 +1202,7 @@ If this option is used several times, the last one will be used.
 .IP "--key <key>"
 (TLS SSH) Private key file name. Allows you to provide your private key in this separate
 file. For SSH, if not specified, curl tries the following candidates in order:
-'~/.ssh/id_rsa', '~/.ssh/id_dsa', './id_rsa', './id_dsa'.
+\&'~/.ssh/id_rsa', '~/.ssh/id_dsa', './id_rsa', './id_dsa'.
 
 If curl is built against OpenSSL library, and the engine pkcs11 is available,
 then a PKCS#11 URI (RFC 7512) can be used to specify a private key located in a
@@ -1286,9 +1353,8 @@ than this given limit. This concerns both FTP and HTTP transfers.
 See also \fI--limit-rate\fP.
 .IP "--max-redirs <num>"
 (HTTP) Set maximum number of redirection-followings allowed. When \fI-L, --location\fP is used,
-is used to prevent curl from following redirections \&"in absurdum". By
-default, the limit is set to 50 redirections. Set this option to -1 to make it
-unlimited.
+is used to prevent curl from following redirections too much. By default, the
+limit is set to 50 redirections. Set this option to -1 to make it unlimited.
 
 If this option is used several times, the last one will be used.
 .IP "-m, --max-time <seconds>"
@@ -1340,7 +1406,7 @@ If this option is used several times, only the first one is used.
 See also \fI--basic\fP and \fI--ntlm\fP and \fI--anyauth\fP and \fI--proxy-negotiate\fP.
 .IP "--netrc-file <filename>"
 This option is similar to \fI-n, --netrc\fP, except that you provide the path (absolute
-or relative) to the netrc file that Curl should use.  You can only specify one
+or relative) to the netrc file that curl should use.  You can only specify one
 netrc file per invocation. If several \fI--netrc-file\fP options are provided,
 the last one will be used.
 
@@ -1407,6 +1473,14 @@ with an SSL library that supports NPN. NPN is used by a libcurl that supports
 HTTP/2 to negotiate HTTP/2 support with the server during https sessions.
 
 See also \fI--no-alpn\fP and \fI--http2\fP. \fI--no-npn\fP requires that the underlying libcurl was built to support TLS. Added in 7.36.0.
+.IP "--no-progress-meter"
+Option to switch off the progress meter output without muting or otherwise
+affecting warning and informational messages like \fI-s, --silent\fP does.
+
+Note that this is the negated option name documented. You can thus use
+--progress-meter to enable the progress meter again.
+
+See also \fI-v, --verbose\fP and \fI-s, --silent\fP. Added in 7.67.0.
 .IP "--no-sessionid"
 (TLS) Disable curl's use of SSL session-ID caching.  By default all transfers are
 done using the cache. Note that while nothing should ever get hurt by
@@ -1487,6 +1561,25 @@ dynamically. Specifying the output as '-' (a single dash) will force the
 output to be done to stdout.
 
 See also \fI-O, --remote-name\fP and \fI--remote-name-all\fP and \fI-J, --remote-header-name\fP.
+.IP "--parallel-immediate"
+When doing parallel transfers, this option will instruct curl that it should
+rather prefer opening up more connections in parallel at once rather than
+waiting to see if new transfers can be added as multiplexed streams on another
+connection.
+
+See also \fI-Z, --parallel\fP and \fI--parallel-max\fP. Added in 7.68.0.
+.IP "--parallel-max"
+When asked to do parallel transfers, using \fI-Z, --parallel\fP, this option controls
+the maximum amount of transfers to do simultaneously.
+
+The default is 50.
+
+See also \fI-Z, --parallel\fP. Added in 7.66.0.
+.IP "-Z, --parallel"
+Makes curl perform its transfers in parallel as compared to the regular serial
+manner.
+
+Added in 7.66.0.
 .IP "--pass <phrase>"
 (SSH TLS) Passphrase for the private key
 
@@ -1510,13 +1603,11 @@ abort the connection before sending or receiving any data.
 
 PEM/DER support:
   7.39.0: OpenSSL, GnuTLS and GSKit
-  7.43.0: NSS and wolfSSL/CyaSSL
+  7.43.0: NSS and wolfSSL
   7.47.0: mbedtls
-  7.49.0: PolarSSL
 sha256 support:
-  7.44.0: OpenSSL, GnuTLS, NSS and wolfSSL/CyaSSL.
+  7.44.0: OpenSSL, GnuTLS, NSS and wolfSSL
   7.47.0: mbedtls
-  7.49.0: PolarSSL
 Other SSL backends not supported.
 
 If this option is used several times, the last one will be used.
@@ -1597,16 +1688,17 @@ Example, allow only HTTP and HTTPS on redirect:
 
  curl --proto-redir -all,http,https http://example.com
 
-By default curl will allow all protocols on redirect except several disabled
-for security reasons: Since 7.19.4 FILE and SCP are disabled, and since 7.40.0
-SMB and SMBS are also disabled. Specifying \fIall\fP or \fI+all\fP enables all
-protocols on redirect, including those disabled for security.
+By default curl will allow HTTP, HTTPS, FTP and FTPS on redirect (7.65.2).
+Older versions of curl allowed all protocols on redirect except several
+disabled for security reasons: Since 7.19.4 FILE and SCP are disabled, and
+since 7.40.0 SMB and SMBS are also disabled. Specifying \fIall\fP or \fI+all\fP
+enables all protocols on redirect, including those disabled for security.
 
 Added in 7.20.2.
 .IP "--proto <protocols>"
 Tells curl to limit what protocols it may use in the transfer. Protocols are
 evaluated left to right, are comma separated, and are each a protocol name or
-'all', optionally prefixed by zero or more modifiers. Available modifiers are:
+\&'all', optionally prefixed by zero or more modifiers. Available modifiers are:
 .RS
 .TP 3
 .B +
@@ -1756,6 +1848,10 @@ ciphers. Read up on TLS 1.3 cipher suite details on this URL:
 
  https://curl.haxx.se/docs/ssl-ciphers.html
 
+This option is currently used only when curl is built to use OpenSSL 1.1.1 or
+later. If you are using a different SSL backend you can try setting TLS 1.3
+cipher suites by using the \fI--proxy-ciphers\fP option.
+
 If this option is used several times, the last one will be used.
 .IP "--proxy-tlsauthtype <type>"
 Same as \fI--tlsauthtype\fP but used in HTTPS proxy context.
@@ -1780,6 +1876,12 @@ If you use a Windows SSPI-enabled curl binary and do either Negotiate or NTLM
 authentication then you can tell curl to select the user name and password
 from your environment by specifying a single colon with this option: "-U :".
 
+On systems where it works, curl will hide the given option argument from
+process listings. This is not enough to protect credentials from possibly
+getting seen by other users on the same system as they will still be visible
+for a brief moment before cleared. Such sensitive data should be retrieved
+from a file instead or similar and never used in clear text in a command line.
+
 If this option is used several times, the last one will be used.
 .IP "-x, --proxy [protocol://]host[:port]"
 Use the specified proxy.
@@ -1824,11 +1926,10 @@ The only difference between this and the HTTP proxy option \fI-x, --proxy\fP, is
 attempts to use CONNECT through the proxy will specify an HTTP 1.0 protocol
 instead of the default HTTP 1.1.
 .IP "-p, --proxytunnel"
-When an HTTP proxy is used \fI-x, --proxy\fP, this option will cause non-HTTP protocols
-to attempt to tunnel through the proxy instead of merely using it to do
-HTTP-like operations. The tunnel approach is made with the HTTP proxy CONNECT
-request and requires that the proxy allows direct connect to the remote port
-number curl wants to tunnel through to.
+When an HTTP proxy is used \fI-x, --proxy\fP, this option will make curl tunnel through
+the proxy. The tunnel approach is made with the HTTP proxy CONNECT request and
+requires that the proxy allows direct connect to the remote port number curl
+wants to tunnel through to.
 
 To suppress proxy CONNECT response headers when curl is set to output headers
 use \fI--suppress-connect-headers\fP.
@@ -1858,9 +1959,10 @@ If the server returns failure for one of the commands, the entire operation
 will be aborted. You must send syntactically correct FTP commands as RFC 959
 defines to FTP servers, or one of the commands listed below to SFTP servers.
 
-This option can be used multiple times. When speaking to an FTP server, prefix
-the command with an asterisk (*) to make curl continue even if the command
-fails as by default curl will stop at first failure.
+Prefix the command with an asterisk (*) to make curl continue even if the
+command fails as by default curl will stop at first failure.
+
+This option can be used multiple times.
 
 SFTP is a binary protocol. Unlike for FTP, curl interprets SFTP quote commands
 itself before sending them to the server.  File names may be quoted
@@ -2051,6 +2153,10 @@ the number used for the specific protocol the host will be used for. It means
 you need several entries if you want to provide address for the same host but
 different ports.
 
+By specifying '*' as host you can tell curl to resolve any host and specific
+port pair to the specified address. Wildcard is resolved last so any \fI--resolve\fP
+with a specific host and port will be used first.
+
 The provided address set by this option will be used even if \fI-4, --ipv4\fP or \fI-6, --ipv6\fP
 is set to make curl use another IP version.
 
@@ -2058,6 +2164,8 @@ Support for providing the IP address within [brackets] was added in 7.57.0.
 
 Support for providing multiple IP addresses per entry was added in 7.59.0.
 
+Support for resolving with wildcard was added in 7.64.0.
+
 This option can be used many times to add many host names to resolve.
 
 Added in 7.21.3.
@@ -2098,9 +2206,22 @@ for all forthcoming retries it will double the waiting time until it reaches
 using \fI--retry-delay\fP you disable this exponential backoff algorithm. See also
 \fI--retry-max-time\fP to limit the total time allowed for retries.
 
+Since curl 7.66.0, curl will comply with the Retry-After: response header if
+one was present to know when to issue the next retry.
+
 If this option is used several times, the last one will be used.
 
 Added in 7.12.3.
+.IP "--sasl-authzid"
+Use this authorisation identity (authzid), during SASL PLAIN authentication,
+in addition to the authentication identity (authcid) as specified by \fI-u, --user\fP.
+
+If the option isn't specified, the server will derive the authzid from the
+authcid, but if specified, and depending on the server implementation, it may
+be used to access another user's inbox, that the user has been granted access
+to, or a shared mailbox for example.
+
+Added in 7.66.0.
 .IP "--sasl-ir"
 Enable initial response in SASL authentication.
 
@@ -2246,7 +2367,7 @@ this flag you ask for exactly that.
 
 Added in 7.25.0.
 .IP "--ssl-no-revoke"
-(WinSSL) This option tells curl to disable certificate revocation checks.
+(Schannel) This option tells curl to disable certificate revocation checks.
 WARNING: this option loosens the SSL security, and by using this flag you ask
 for exactly that.
 
@@ -2348,8 +2469,8 @@ than the specified date/time.
 
 If this option is used several times, the last one will be used.
 .IP "--tls-max <VERSION>"
-(SSL) VERSION defines maximum supported TLS version. A minimum is defined
-by arguments tlsv1.0 or tlsv1.1 or tlsv1.2.
+(SSL) VERSION defines maximum supported TLS version. The minimum acceptable version
+is set by tlsv1.0, tlsv1.1, tlsv1.2 or tlsv1.3.
 
 .RS
 .IP "default"
@@ -2364,7 +2485,7 @@ Use up to TLSv1.2.
 Use up to TLSv1.3.
 .RE
 
-See also \fI--tlsv1.0\fP and \fI--tlsv1.1\fP and \fI--tlsv1.2\fP. \fI--tls-max\fP requires that the underlying libcurl was built to support TLS. Added in 7.54.0.
+See also \fI--tlsv1.0\fP and \fI--tlsv1.1\fP and \fI--tlsv1.2\fP and \fI--tlsv1.3\fP. \fI--tls-max\fP requires that the underlying libcurl was built to support TLS. Added in 7.54.0.
 .IP "--tls13-ciphers <list of TLS 1.3 ciphersuites>"
 (TLS) Specifies which cipher suites to use in the connection if it negotiates TLS
 1.3. The list of ciphers suites must specify valid ciphers. Read up on TLS 1.3
@@ -2372,6 +2493,10 @@ cipher suite details on this URL:
 
  https://curl.haxx.se/docs/ssl-ciphers.html
 
+This option is currently used only when curl is built to use OpenSSL 1.1.1 or
+later. If you are using a different SSL backend you can try setting TLS 1.3
+cipher suites by using the \fI--ciphers\fP option.
+
 If this option is used several times, the last one will be used.
 .IP "--tlsauthtype <type>"
 Set TLS authentication type. Currently, the only supported option is "SRP",
@@ -2385,23 +2510,39 @@ Added in 7.21.4.
 Set password for use with the TLS authentication method specified with
 \fI--tlsauthtype\fP. Requires that \fI--tlsuser\fP also be set.
 
+This doesn't work with TLS 1.3.
+
 Added in 7.21.4.
 .IP "--tlsuser <name>"
 Set username for use with the TLS authentication method specified with
 \fI--tlsauthtype\fP. Requires that \fI--tlspassword\fP also is set.
 
+This doesn't work with TLS 1.3.
+
 Added in 7.21.4.
 .IP "--tlsv1.0"
 (TLS) Forces curl to use TLS version 1.0 or later when connecting to a remote TLS server.
 
+In old versions of curl this option was documented to allow _only_ TLS 1.0,
+but behavior was inconsistent depending on the TLS library. Use \fI--tls-max\fP if
+you want to set a maximum TLS version.
+
 Added in 7.34.0.
 .IP "--tlsv1.1"
 (TLS) Forces curl to use TLS version 1.1 or later when connecting to a remote TLS server.
 
+In old versions of curl this option was documented to allow _only_ TLS 1.1,
+but behavior was inconsistent depending on the TLS library. Use \fI--tls-max\fP if
+you want to set a maximum TLS version.
+
 Added in 7.34.0.
 .IP "--tlsv1.2"
 (TLS) Forces curl to use TLS version 1.2 or later when connecting to a remote TLS server.
 
+In old versions of curl this option was documented to allow _only_ TLS 1.2,
+but behavior was inconsistent depending on the TLS library. Use \fI--tls-max\fP if
+you want to set a maximum TLS version.
+
 Added in 7.34.0.
 .IP "--tlsv1.3"
 (TLS) Forces curl to use TLS version 1.3 or later when connecting to a remote TLS server.
@@ -2512,6 +2653,12 @@ The user name and passwords are split up on the first colon, which makes it
 impossible to use a colon in the user name with this option. The password can,
 still.
 
+On systems where it works, curl will hide the given option argument from
+process listings. This is not enough to protect credentials from possibly
+getting seen by other users on the same system as they will still be visible
+for a brief moment before cleared. Such sensitive data should be retrieved
+from a file instead or similar and never used in clear text in a command line.
+
 When using Kerberos V5 with a Windows based server you should include the
 Windows domain name in the user name, in order for the server to successfully
 obtain a Kerberos Ticket. If you don't then the initial authentication
@@ -2601,6 +2748,8 @@ there are errors (such as the file or server not being available).
 .IP "PSL"
 PSL is short for Public Suffix List and means that this curl has been built
 with knowledge about "public suffixes".
+.IP "MultiSSL"
+This curl supports multiple TLS backends.
 .RE
 .IP "-w, --write-out <format>"
 Make curl display information on stdout after a completed transfer. The format
@@ -2615,6 +2764,9 @@ text that curl thinks fit, as described below. All variables are specified as
 output a newline by using \\n, a carriage return with \\r and a tab space with
 \\t.
 
+The output will be written to standard output, but this can be switched to
+standard error by using %{stderr}.
+
 .B NOTE:
 The %-symbol is a special symbol in the win32-environment, where all
 occurrences of % must be doubled when using this option.
@@ -2703,6 +2855,15 @@ second.
 The result of the SSL peer certificate verification that was requested. 0
 means the verification was successful. (Added in 7.19.0)
 .TP
+.B stderr
+From this point on, the \fI-w, --write-out\fP output will be written to standard
+error. (Added in 7.63.0)
+.TP
+.B stdout
+From this point on, the \fI-w, --write-out\fP output will be written to standard output.
+This is the default, but can be used to switch back after switching to stderr.
+(Added in 7.63.0)
+.TP
 .B time_appconnect
 The time, in seconds, it took from the start until the SSL/SSH/etc
 connect/handshake to the remote host was completed. (Added in 7.19.0)
index 638f425..b50eaa6 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
  *
  ***************************************************************************/
 /* <DESC>
- * Source code using the multi interface to download many
- * files, with a capped maximum amount of simultaneous transfers.
+ * Download many files in parallel, in the same thread.
  * </DESC>
- * Written by Michael Wallner
  */
 
 #include <errno.h>
@@ -32,7 +30,7 @@
 #ifndef WIN32
 #  include <unistd.h>
 #endif
-#include <curl/multi.h>
+#include <curl/curl.h>
 
 static const char *urls[] = {
   "https://www.microsoft.com",
@@ -84,27 +82,23 @@ static const char *urls[] = {
   "https://www.un.org",
 };
 
-#define MAX 10 /* number of simultaneous transfers */
-#define CNT sizeof(urls)/sizeof(char *) /* total number of transfers to do */
+#define MAX_PARALLEL 10 /* number of simultaneous transfers */
+#define NUM_URLS sizeof(urls)/sizeof(char *)
 
-static size_t cb(char *d, size_t n, size_t l, void *p)
+static size_t write_cb(char *data, size_t n, size_t l, void *userp)
 {
   /* take care of the data here, ignored in this example */
-  (void)d;
-  (void)p;
+  (void)data;
+  (void)userp;
   return n*l;
 }
 
-static void init(CURLM *cm, int i)
+static void add_transfer(CURLM *cm, int i)
 {
   CURL *eh = curl_easy_init();
-
-  curl_easy_setopt(eh, CURLOPT_WRITEFUNCTION, cb);
-  curl_easy_setopt(eh, CURLOPT_HEADER, 0L);
+  curl_easy_setopt(eh, CURLOPT_WRITEFUNCTION, write_cb);
   curl_easy_setopt(eh, CURLOPT_URL, urls[i]);
   curl_easy_setopt(eh, CURLOPT_PRIVATE, urls[i]);
-  curl_easy_setopt(eh, CURLOPT_VERBOSE, 0L);
-
   curl_multi_add_handle(cm, eh);
 }
 
@@ -112,64 +106,23 @@ int main(void)
 {
   CURLM *cm;
   CURLMsg *msg;
-  long L;
-  unsigned int C = 0;
-  int M, Q, U = -1;
-  fd_set R, W, E;
-  struct timeval T;
+  unsigned int transfers = 0;
+  int msgs_left = -1;
+  int still_alive = 1;
 
   curl_global_init(CURL_GLOBAL_ALL);
-
   cm = curl_multi_init();
 
-  /* we can optionally limit the total amount of connections this multi handle
-     uses */
-  curl_multi_setopt(cm, CURLMOPT_MAXCONNECTS, (long)MAX);
+  /* Limit the amount of simultaneous connections curl should allow: */
+  curl_multi_setopt(cm, CURLMOPT_MAXCONNECTS, (long)MAX_PARALLEL);
 
-  for(C = 0; C < MAX; ++C) {
-    init(cm, C);
-  }
+  for(transfers = 0; transfers < MAX_PARALLEL; transfers++)
+    add_transfer(cm, transfers);
 
-  while(U) {
-    curl_multi_perform(cm, &U);
+  do {
+    curl_multi_perform(cm, &still_alive);
 
-    if(U) {
-      FD_ZERO(&R);
-      FD_ZERO(&W);
-      FD_ZERO(&E);
-
-      if(curl_multi_fdset(cm, &R, &W, &E, &M)) {
-        fprintf(stderr, "E: curl_multi_fdset\n");
-        return EXIT_FAILURE;
-      }
-
-      if(curl_multi_timeout(cm, &L)) {
-        fprintf(stderr, "E: curl_multi_timeout\n");
-        return EXIT_FAILURE;
-      }
-      if(L == -1)
-        L = 100;
-
-      if(M == -1) {
-#ifdef WIN32
-        Sleep(L);
-#else
-        sleep((unsigned int)L / 1000);
-#endif
-      }
-      else {
-        T.tv_sec = L/1000;
-        T.tv_usec = (L%1000)*1000;
-
-        if(0 > select(M + 1, &R, &W, &E, &T)) {
-          fprintf(stderr, "E: select(%i,,,,%li): %i: %s\n",
-              M + 1, L, errno, strerror(errno));
-          return EXIT_FAILURE;
-        }
-      }
-    }
-
-    while((msg = curl_multi_info_read(cm, &Q))) {
+    while((msg = curl_multi_info_read(cm, &msgs_left))) {
       if(msg->msg == CURLMSG_DONE) {
         char *url;
         CURL *e = msg->easy_handle;
@@ -182,13 +135,13 @@ int main(void)
       else {
         fprintf(stderr, "E: CURLMsg (%d)\n", msg->msg);
       }
-      if(C < CNT) {
-        init(cm, C++);
-        U++; /* just to prevent it from remaining at 0 if there are more
-                URLs to get */
-      }
+      if(transfers < NUM_URLS)
+        add_transfer(cm, transfers++);
     }
-  }
+    if(still_alive)
+      curl_multi_wait(cm, NULL, 0, 1000, NULL);
+
+  } while(still_alive || (transfers < NUM_URLS));
 
   curl_multi_cleanup(cm);
   curl_global_cleanup();
index ce2e924..53867cb 100644 (file)
@@ -5,7 +5,7 @@
 #                            | (__| |_| |  _ <| |___
 #                             \___|\___/|_| \_\_____|
 #
-# Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 #
 # This software is licensed as described in the file COPYING, which
 # you should have received as part of this distribution. The terms
@@ -61,5 +61,10 @@ include Makefile.inc
 
 all: $(check_PROGRAMS)
 
+CHECKSRC = $(CS_$(V))
+CS_0 = @echo "  RUN     " $@;
+CS_1 =
+CS_ = $(CS_0)
+
 checksrc:
-       @PERL@ $(top_srcdir)/lib/checksrc.pl $(srcdir)/*.c
+       $(CHECKSRC)(@PERL@ $(top_srcdir)/lib/checksrc.pl -ASNPRINTF $(srcdir)/*.c)
index fa9ec72..897ad49 100644 (file)
@@ -21,7 +21,7 @@
 #                            | (__| |_| |  _ <| |___
 #                             \___|\___/|_| \_\_____|
 #
-# Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 #
 # This software is licensed as described in the file COPYING, which
 # you should have received as part of this distribution. The terms
@@ -43,7 +43,7 @@
 #                            | (__| |_| |  _ <| |___
 #                             \___|\___/|_| \_\_____|
 #
-# Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 #
 # This software is licensed as described in the file COPYING, which
 # you should have received as part of this distribution. The terms
@@ -163,11 +163,12 @@ check_PROGRAMS = 10-at-a-time$(EXEEXT) anyauthput$(EXEEXT) \
        sslbackend$(EXEEXT) postit2-formadd$(EXEEXT) \
        multi-formadd$(EXEEXT) shared-connection-cache$(EXEEXT) \
        sftpuploadresume$(EXEEXT) http2-pushinmemory$(EXEEXT) \
-       parseurl$(EXEEXT)
+       parseurl$(EXEEXT) urlapi$(EXEEXT) imap-authzid$(EXEEXT) \
+       pop3-authzid$(EXEEXT) smtp-authzid$(EXEEXT) http3$(EXEEXT) \
+       altsvc$(EXEEXT) http3-present$(EXEEXT) multi-poll$(EXEEXT)
 subdir = docs/examples
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/ax_code_coverage.m4 \
-       $(top_srcdir)/m4/ax_compile_check_sizeof.m4 \
+am__aclocal_m4_deps = $(top_srcdir)/m4/ax_compile_check_sizeof.m4 \
        $(top_srcdir)/m4/curl-compilers.m4 \
        $(top_srcdir)/m4/curl-confopts.m4 \
        $(top_srcdir)/m4/curl-functions.m4 \
@@ -203,6 +204,13 @@ AM_V_lt = $(am__v_lt_@AM_V@)
 am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
 am__v_lt_0 = --silent
 am__v_lt_1 = 
+altsvc_SOURCES = altsvc.c
+altsvc_OBJECTS = altsvc.$(OBJEXT)
+altsvc_LDADD = $(LDADD)
+@USE_EXPLICIT_LIB_DEPS_FALSE@altsvc_DEPENDENCIES =  \
+@USE_EXPLICIT_LIB_DEPS_FALSE@  $(LIBDIR)/libcurl.la
+@USE_EXPLICIT_LIB_DEPS_TRUE@altsvc_DEPENDENCIES =  \
+@USE_EXPLICIT_LIB_DEPS_TRUE@   $(LIBDIR)/libcurl.la
 anyauthput_SOURCES = anyauthput.c
 anyauthput_OBJECTS = anyauthput.$(OBJEXT)
 anyauthput_LDADD = $(LDADD)
@@ -369,6 +377,19 @@ http2_upload_LDADD = $(LDADD)
 @USE_EXPLICIT_LIB_DEPS_FALSE@  $(LIBDIR)/libcurl.la
 @USE_EXPLICIT_LIB_DEPS_TRUE@http2_upload_DEPENDENCIES =  \
 @USE_EXPLICIT_LIB_DEPS_TRUE@   $(LIBDIR)/libcurl.la
+http3_SOURCES = http3.c
+http3_OBJECTS = http3.$(OBJEXT)
+http3_LDADD = $(LDADD)
+@USE_EXPLICIT_LIB_DEPS_FALSE@http3_DEPENDENCIES =  \
+@USE_EXPLICIT_LIB_DEPS_FALSE@  $(LIBDIR)/libcurl.la
+@USE_EXPLICIT_LIB_DEPS_TRUE@http3_DEPENDENCIES = $(LIBDIR)/libcurl.la
+http3_present_SOURCES = http3-present.c
+http3_present_OBJECTS = http3-present.$(OBJEXT)
+http3_present_LDADD = $(LDADD)
+@USE_EXPLICIT_LIB_DEPS_FALSE@http3_present_DEPENDENCIES =  \
+@USE_EXPLICIT_LIB_DEPS_FALSE@  $(LIBDIR)/libcurl.la
+@USE_EXPLICIT_LIB_DEPS_TRUE@http3_present_DEPENDENCIES =  \
+@USE_EXPLICIT_LIB_DEPS_TRUE@   $(LIBDIR)/libcurl.la
 httpcustomheader_SOURCES = httpcustomheader.c
 httpcustomheader_OBJECTS = httpcustomheader.$(OBJEXT)
 httpcustomheader_LDADD = $(LDADD)
@@ -396,6 +417,13 @@ imap_append_LDADD = $(LDADD)
 @USE_EXPLICIT_LIB_DEPS_FALSE@  $(LIBDIR)/libcurl.la
 @USE_EXPLICIT_LIB_DEPS_TRUE@imap_append_DEPENDENCIES =  \
 @USE_EXPLICIT_LIB_DEPS_TRUE@   $(LIBDIR)/libcurl.la
+imap_authzid_SOURCES = imap-authzid.c
+imap_authzid_OBJECTS = imap-authzid.$(OBJEXT)
+imap_authzid_LDADD = $(LDADD)
+@USE_EXPLICIT_LIB_DEPS_FALSE@imap_authzid_DEPENDENCIES =  \
+@USE_EXPLICIT_LIB_DEPS_FALSE@  $(LIBDIR)/libcurl.la
+@USE_EXPLICIT_LIB_DEPS_TRUE@imap_authzid_DEPENDENCIES =  \
+@USE_EXPLICIT_LIB_DEPS_TRUE@   $(LIBDIR)/libcurl.la
 imap_copy_SOURCES = imap-copy.c
 imap_copy_OBJECTS = imap-copy.$(OBJEXT)
 imap_copy_LDADD = $(LDADD)
@@ -515,6 +543,13 @@ multi_formadd_LDADD = $(LDADD)
 @USE_EXPLICIT_LIB_DEPS_FALSE@  $(LIBDIR)/libcurl.la
 @USE_EXPLICIT_LIB_DEPS_TRUE@multi_formadd_DEPENDENCIES =  \
 @USE_EXPLICIT_LIB_DEPS_TRUE@   $(LIBDIR)/libcurl.la
+multi_poll_SOURCES = multi-poll.c
+multi_poll_OBJECTS = multi-poll.$(OBJEXT)
+multi_poll_LDADD = $(LDADD)
+@USE_EXPLICIT_LIB_DEPS_FALSE@multi_poll_DEPENDENCIES =  \
+@USE_EXPLICIT_LIB_DEPS_FALSE@  $(LIBDIR)/libcurl.la
+@USE_EXPLICIT_LIB_DEPS_TRUE@multi_poll_DEPENDENCIES =  \
+@USE_EXPLICIT_LIB_DEPS_TRUE@   $(LIBDIR)/libcurl.la
 multi_post_SOURCES = multi-post.c
 multi_post_OBJECTS = multi-post.$(OBJEXT)
 multi_post_LDADD = $(LDADD)
@@ -543,6 +578,13 @@ persistent_LDADD = $(LDADD)
 @USE_EXPLICIT_LIB_DEPS_FALSE@  $(LIBDIR)/libcurl.la
 @USE_EXPLICIT_LIB_DEPS_TRUE@persistent_DEPENDENCIES =  \
 @USE_EXPLICIT_LIB_DEPS_TRUE@   $(LIBDIR)/libcurl.la
+pop3_authzid_SOURCES = pop3-authzid.c
+pop3_authzid_OBJECTS = pop3-authzid.$(OBJEXT)
+pop3_authzid_LDADD = $(LDADD)
+@USE_EXPLICIT_LIB_DEPS_FALSE@pop3_authzid_DEPENDENCIES =  \
+@USE_EXPLICIT_LIB_DEPS_FALSE@  $(LIBDIR)/libcurl.la
+@USE_EXPLICIT_LIB_DEPS_TRUE@pop3_authzid_DEPENDENCIES =  \
+@USE_EXPLICIT_LIB_DEPS_TRUE@   $(LIBDIR)/libcurl.la
 pop3_dele_SOURCES = pop3-dele.c
 pop3_dele_OBJECTS = pop3-dele.$(OBJEXT)
 pop3_dele_LDADD = $(LDADD)
@@ -716,6 +758,13 @@ simplessl_LDADD = $(LDADD)
 @USE_EXPLICIT_LIB_DEPS_FALSE@  $(LIBDIR)/libcurl.la
 @USE_EXPLICIT_LIB_DEPS_TRUE@simplessl_DEPENDENCIES =  \
 @USE_EXPLICIT_LIB_DEPS_TRUE@   $(LIBDIR)/libcurl.la
+smtp_authzid_SOURCES = smtp-authzid.c
+smtp_authzid_OBJECTS = smtp-authzid.$(OBJEXT)
+smtp_authzid_LDADD = $(LDADD)
+@USE_EXPLICIT_LIB_DEPS_FALSE@smtp_authzid_DEPENDENCIES =  \
+@USE_EXPLICIT_LIB_DEPS_FALSE@  $(LIBDIR)/libcurl.la
+@USE_EXPLICIT_LIB_DEPS_TRUE@smtp_authzid_DEPENDENCIES =  \
+@USE_EXPLICIT_LIB_DEPS_TRUE@   $(LIBDIR)/libcurl.la
 smtp_expn_SOURCES = smtp-expn.c
 smtp_expn_OBJECTS = smtp-expn.$(OBJEXT)
 smtp_expn_LDADD = $(LDADD)
@@ -779,6 +828,13 @@ url2file_LDADD = $(LDADD)
 @USE_EXPLICIT_LIB_DEPS_FALSE@  $(LIBDIR)/libcurl.la
 @USE_EXPLICIT_LIB_DEPS_TRUE@url2file_DEPENDENCIES =  \
 @USE_EXPLICIT_LIB_DEPS_TRUE@   $(LIBDIR)/libcurl.la
+urlapi_SOURCES = urlapi.c
+urlapi_OBJECTS = urlapi.$(OBJEXT)
+urlapi_LDADD = $(LDADD)
+@USE_EXPLICIT_LIB_DEPS_FALSE@urlapi_DEPENDENCIES =  \
+@USE_EXPLICIT_LIB_DEPS_FALSE@  $(LIBDIR)/libcurl.la
+@USE_EXPLICIT_LIB_DEPS_TRUE@urlapi_DEPENDENCIES =  \
+@USE_EXPLICIT_LIB_DEPS_TRUE@   $(LIBDIR)/libcurl.la
 AM_V_P = $(am__v_P_@AM_V@)
 am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
 am__v_P_0 = false
@@ -795,49 +851,53 @@ DEFAULT_INCLUDES =
 depcomp = $(SHELL) $(top_srcdir)/depcomp
 am__maybe_remake_depfiles = depfiles
 am__depfiles_remade = ./$(DEPDIR)/10-at-a-time.Po \
-       ./$(DEPDIR)/anyauthput.Po ./$(DEPDIR)/certinfo.Po \
-       ./$(DEPDIR)/chkspeed.Po ./$(DEPDIR)/cookie_interface.Po \
-       ./$(DEPDIR)/debug.Po ./$(DEPDIR)/externalsocket.Po \
-       ./$(DEPDIR)/fileupload.Po ./$(DEPDIR)/fopen.Po \
-       ./$(DEPDIR)/ftp-wildcard.Po ./$(DEPDIR)/ftpget.Po \
-       ./$(DEPDIR)/ftpgetinfo.Po ./$(DEPDIR)/ftpgetresp.Po \
-       ./$(DEPDIR)/ftpsget.Po ./$(DEPDIR)/ftpupload.Po \
-       ./$(DEPDIR)/ftpuploadfrommem.Po ./$(DEPDIR)/ftpuploadresume.Po \
-       ./$(DEPDIR)/getinfo.Po ./$(DEPDIR)/getinmemory.Po \
-       ./$(DEPDIR)/getredirect.Po ./$(DEPDIR)/http-post.Po \
-       ./$(DEPDIR)/http2-download.Po \
+       ./$(DEPDIR)/altsvc.Po ./$(DEPDIR)/anyauthput.Po \
+       ./$(DEPDIR)/certinfo.Po ./$(DEPDIR)/chkspeed.Po \
+       ./$(DEPDIR)/cookie_interface.Po ./$(DEPDIR)/debug.Po \
+       ./$(DEPDIR)/externalsocket.Po ./$(DEPDIR)/fileupload.Po \
+       ./$(DEPDIR)/fopen.Po ./$(DEPDIR)/ftp-wildcard.Po \
+       ./$(DEPDIR)/ftpget.Po ./$(DEPDIR)/ftpgetinfo.Po \
+       ./$(DEPDIR)/ftpgetresp.Po ./$(DEPDIR)/ftpsget.Po \
+       ./$(DEPDIR)/ftpupload.Po ./$(DEPDIR)/ftpuploadfrommem.Po \
+       ./$(DEPDIR)/ftpuploadresume.Po ./$(DEPDIR)/getinfo.Po \
+       ./$(DEPDIR)/getinmemory.Po ./$(DEPDIR)/getredirect.Po \
+       ./$(DEPDIR)/http-post.Po ./$(DEPDIR)/http2-download.Po \
        ./$(DEPDIR)/http2-pushinmemory.Po \
        ./$(DEPDIR)/http2-serverpush.Po ./$(DEPDIR)/http2-upload.Po \
+       ./$(DEPDIR)/http3-present.Po ./$(DEPDIR)/http3.Po \
        ./$(DEPDIR)/httpcustomheader.Po ./$(DEPDIR)/httpput.Po \
        ./$(DEPDIR)/https.Po ./$(DEPDIR)/imap-append.Po \
-       ./$(DEPDIR)/imap-copy.Po ./$(DEPDIR)/imap-create.Po \
-       ./$(DEPDIR)/imap-delete.Po ./$(DEPDIR)/imap-examine.Po \
-       ./$(DEPDIR)/imap-fetch.Po ./$(DEPDIR)/imap-list.Po \
-       ./$(DEPDIR)/imap-lsub.Po ./$(DEPDIR)/imap-multi.Po \
-       ./$(DEPDIR)/imap-noop.Po ./$(DEPDIR)/imap-search.Po \
-       ./$(DEPDIR)/imap-ssl.Po ./$(DEPDIR)/imap-store.Po \
-       ./$(DEPDIR)/imap-tls.Po ./$(DEPDIR)/multi-app.Po \
-       ./$(DEPDIR)/multi-debugcallback.Po ./$(DEPDIR)/multi-double.Po \
-       ./$(DEPDIR)/multi-formadd.Po ./$(DEPDIR)/multi-post.Po \
+       ./$(DEPDIR)/imap-authzid.Po ./$(DEPDIR)/imap-copy.Po \
+       ./$(DEPDIR)/imap-create.Po ./$(DEPDIR)/imap-delete.Po \
+       ./$(DEPDIR)/imap-examine.Po ./$(DEPDIR)/imap-fetch.Po \
+       ./$(DEPDIR)/imap-list.Po ./$(DEPDIR)/imap-lsub.Po \
+       ./$(DEPDIR)/imap-multi.Po ./$(DEPDIR)/imap-noop.Po \
+       ./$(DEPDIR)/imap-search.Po ./$(DEPDIR)/imap-ssl.Po \
+       ./$(DEPDIR)/imap-store.Po ./$(DEPDIR)/imap-tls.Po \
+       ./$(DEPDIR)/multi-app.Po ./$(DEPDIR)/multi-debugcallback.Po \
+       ./$(DEPDIR)/multi-double.Po ./$(DEPDIR)/multi-formadd.Po \
+       ./$(DEPDIR)/multi-poll.Po ./$(DEPDIR)/multi-post.Po \
        ./$(DEPDIR)/multi-single.Po ./$(DEPDIR)/parseurl.Po \
-       ./$(DEPDIR)/persistent.Po ./$(DEPDIR)/pop3-dele.Po \
-       ./$(DEPDIR)/pop3-list.Po ./$(DEPDIR)/pop3-multi.Po \
-       ./$(DEPDIR)/pop3-noop.Po ./$(DEPDIR)/pop3-retr.Po \
-       ./$(DEPDIR)/pop3-ssl.Po ./$(DEPDIR)/pop3-stat.Po \
-       ./$(DEPDIR)/pop3-tls.Po ./$(DEPDIR)/pop3-top.Po \
-       ./$(DEPDIR)/pop3-uidl.Po ./$(DEPDIR)/post-callback.Po \
-       ./$(DEPDIR)/postinmemory.Po ./$(DEPDIR)/postit2-formadd.Po \
-       ./$(DEPDIR)/postit2.Po ./$(DEPDIR)/progressfunc.Po \
-       ./$(DEPDIR)/resolve.Po ./$(DEPDIR)/rtsp.Po \
-       ./$(DEPDIR)/sendrecv.Po ./$(DEPDIR)/sepheaders.Po \
-       ./$(DEPDIR)/sftpget.Po ./$(DEPDIR)/sftpuploadresume.Po \
+       ./$(DEPDIR)/persistent.Po ./$(DEPDIR)/pop3-authzid.Po \
+       ./$(DEPDIR)/pop3-dele.Po ./$(DEPDIR)/pop3-list.Po \
+       ./$(DEPDIR)/pop3-multi.Po ./$(DEPDIR)/pop3-noop.Po \
+       ./$(DEPDIR)/pop3-retr.Po ./$(DEPDIR)/pop3-ssl.Po \
+       ./$(DEPDIR)/pop3-stat.Po ./$(DEPDIR)/pop3-tls.Po \
+       ./$(DEPDIR)/pop3-top.Po ./$(DEPDIR)/pop3-uidl.Po \
+       ./$(DEPDIR)/post-callback.Po ./$(DEPDIR)/postinmemory.Po \
+       ./$(DEPDIR)/postit2-formadd.Po ./$(DEPDIR)/postit2.Po \
+       ./$(DEPDIR)/progressfunc.Po ./$(DEPDIR)/resolve.Po \
+       ./$(DEPDIR)/rtsp.Po ./$(DEPDIR)/sendrecv.Po \
+       ./$(DEPDIR)/sepheaders.Po ./$(DEPDIR)/sftpget.Po \
+       ./$(DEPDIR)/sftpuploadresume.Po \
        ./$(DEPDIR)/shared-connection-cache.Po ./$(DEPDIR)/simple.Po \
        ./$(DEPDIR)/simplepost.Po ./$(DEPDIR)/simplessl.Po \
-       ./$(DEPDIR)/smtp-expn.Po ./$(DEPDIR)/smtp-mail.Po \
-       ./$(DEPDIR)/smtp-mime.Po ./$(DEPDIR)/smtp-multi.Po \
-       ./$(DEPDIR)/smtp-ssl.Po ./$(DEPDIR)/smtp-tls.Po \
-       ./$(DEPDIR)/smtp-vrfy.Po ./$(DEPDIR)/sslbackend.Po \
-       ./$(DEPDIR)/url2file.Po
+       ./$(DEPDIR)/smtp-authzid.Po ./$(DEPDIR)/smtp-expn.Po \
+       ./$(DEPDIR)/smtp-mail.Po ./$(DEPDIR)/smtp-mime.Po \
+       ./$(DEPDIR)/smtp-multi.Po ./$(DEPDIR)/smtp-ssl.Po \
+       ./$(DEPDIR)/smtp-tls.Po ./$(DEPDIR)/smtp-vrfy.Po \
+       ./$(DEPDIR)/sslbackend.Po ./$(DEPDIR)/url2file.Po \
+       ./$(DEPDIR)/urlapi.Po
 am__mv = mv -f
 COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
        $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
@@ -857,46 +917,50 @@ AM_V_CCLD = $(am__v_CCLD_@AM_V@)
 am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
 am__v_CCLD_0 = @echo "  CCLD    " $@;
 am__v_CCLD_1 = 
-SOURCES = 10-at-a-time.c anyauthput.c certinfo.c chkspeed.c \
+SOURCES = 10-at-a-time.c altsvc.c anyauthput.c certinfo.c chkspeed.c \
        cookie_interface.c debug.c externalsocket.c fileupload.c \
        fopen.c ftp-wildcard.c ftpget.c ftpgetinfo.c ftpgetresp.c \
        ftpsget.c ftpupload.c ftpuploadfrommem.c ftpuploadresume.c \
        getinfo.c getinmemory.c getredirect.c http-post.c \
        http2-download.c http2-pushinmemory.c http2-serverpush.c \
-       http2-upload.c httpcustomheader.c httpput.c https.c \
-       imap-append.c imap-copy.c imap-create.c imap-delete.c \
+       http2-upload.c http3.c http3-present.c httpcustomheader.c \
+       httpput.c https.c imap-append.c imap-authzid.c imap-copy.c \
+       imap-create.c imap-delete.c imap-examine.c imap-fetch.c \
+       imap-list.c imap-lsub.c imap-multi.c imap-noop.c imap-search.c \
+       imap-ssl.c imap-store.c imap-tls.c multi-app.c \
+       multi-debugcallback.c multi-double.c multi-formadd.c \
+       multi-poll.c multi-post.c multi-single.c parseurl.c \
+       persistent.c pop3-authzid.c pop3-dele.c pop3-list.c \
+       pop3-multi.c pop3-noop.c pop3-retr.c pop3-ssl.c pop3-stat.c \
+       pop3-tls.c pop3-top.c pop3-uidl.c post-callback.c \
+       postinmemory.c postit2.c postit2-formadd.c progressfunc.c \
+       resolve.c rtsp.c sendrecv.c sepheaders.c sftpget.c \
+       sftpuploadresume.c shared-connection-cache.c simple.c \
+       simplepost.c simplessl.c smtp-authzid.c smtp-expn.c \
+       smtp-mail.c smtp-mime.c smtp-multi.c smtp-ssl.c smtp-tls.c \
+       smtp-vrfy.c sslbackend.c url2file.c urlapi.c
+DIST_SOURCES = 10-at-a-time.c altsvc.c anyauthput.c certinfo.c \
+       chkspeed.c cookie_interface.c debug.c externalsocket.c \
+       fileupload.c fopen.c ftp-wildcard.c ftpget.c ftpgetinfo.c \
+       ftpgetresp.c ftpsget.c ftpupload.c ftpuploadfrommem.c \
+       ftpuploadresume.c getinfo.c getinmemory.c getredirect.c \
+       http-post.c http2-download.c http2-pushinmemory.c \
+       http2-serverpush.c http2-upload.c http3.c http3-present.c \
+       httpcustomheader.c httpput.c https.c imap-append.c \
+       imap-authzid.c imap-copy.c imap-create.c imap-delete.c \
        imap-examine.c imap-fetch.c imap-list.c imap-lsub.c \
        imap-multi.c imap-noop.c imap-search.c imap-ssl.c imap-store.c \
        imap-tls.c multi-app.c multi-debugcallback.c multi-double.c \
-       multi-formadd.c multi-post.c multi-single.c parseurl.c \
-       persistent.c pop3-dele.c pop3-list.c pop3-multi.c pop3-noop.c \
-       pop3-retr.c pop3-ssl.c pop3-stat.c pop3-tls.c pop3-top.c \
-       pop3-uidl.c post-callback.c postinmemory.c postit2.c \
-       postit2-formadd.c progressfunc.c resolve.c rtsp.c sendrecv.c \
-       sepheaders.c sftpget.c sftpuploadresume.c \
-       shared-connection-cache.c simple.c simplepost.c simplessl.c \
-       smtp-expn.c smtp-mail.c smtp-mime.c smtp-multi.c smtp-ssl.c \
-       smtp-tls.c smtp-vrfy.c sslbackend.c url2file.c
-DIST_SOURCES = 10-at-a-time.c anyauthput.c certinfo.c chkspeed.c \
-       cookie_interface.c debug.c externalsocket.c fileupload.c \
-       fopen.c ftp-wildcard.c ftpget.c ftpgetinfo.c ftpgetresp.c \
-       ftpsget.c ftpupload.c ftpuploadfrommem.c ftpuploadresume.c \
-       getinfo.c getinmemory.c getredirect.c http-post.c \
-       http2-download.c http2-pushinmemory.c http2-serverpush.c \
-       http2-upload.c httpcustomheader.c httpput.c https.c \
-       imap-append.c imap-copy.c imap-create.c imap-delete.c \
-       imap-examine.c imap-fetch.c imap-list.c imap-lsub.c \
-       imap-multi.c imap-noop.c imap-search.c imap-ssl.c imap-store.c \
-       imap-tls.c multi-app.c multi-debugcallback.c multi-double.c \
-       multi-formadd.c multi-post.c multi-single.c parseurl.c \
-       persistent.c pop3-dele.c pop3-list.c pop3-multi.c pop3-noop.c \
-       pop3-retr.c pop3-ssl.c pop3-stat.c pop3-tls.c pop3-top.c \
-       pop3-uidl.c post-callback.c postinmemory.c postit2.c \
-       postit2-formadd.c progressfunc.c resolve.c rtsp.c sendrecv.c \
-       sepheaders.c sftpget.c sftpuploadresume.c \
-       shared-connection-cache.c simple.c simplepost.c simplessl.c \
-       smtp-expn.c smtp-mail.c smtp-mime.c smtp-multi.c smtp-ssl.c \
-       smtp-tls.c smtp-vrfy.c sslbackend.c url2file.c
+       multi-formadd.c multi-poll.c multi-post.c multi-single.c \
+       parseurl.c persistent.c pop3-authzid.c pop3-dele.c pop3-list.c \
+       pop3-multi.c pop3-noop.c pop3-retr.c pop3-ssl.c pop3-stat.c \
+       pop3-tls.c pop3-top.c pop3-uidl.c post-callback.c \
+       postinmemory.c postit2.c postit2-formadd.c progressfunc.c \
+       resolve.c rtsp.c sendrecv.c sepheaders.c sftpget.c \
+       sftpuploadresume.c shared-connection-cache.c simple.c \
+       simplepost.c simplessl.c smtp-authzid.c smtp-expn.c \
+       smtp-mail.c smtp-mime.c smtp-multi.c smtp-ssl.c smtp-tls.c \
+       smtp-vrfy.c sslbackend.c url2file.c urlapi.c
 am__can_run_installinfo = \
   case $$AM_UPDATE_INFO_DIR in \
     n|no|NO) false;; \
@@ -941,12 +1005,6 @@ CCDEPMODE = @CCDEPMODE@
 # This might hold -Werror
 CFLAGS = @CFLAGS@ @CURL_CFLAG_EXTRAS@
 CFLAG_CURL_SYMBOL_HIDING = @CFLAG_CURL_SYMBOL_HIDING@
-CODE_COVERAGE_CFLAGS = @CODE_COVERAGE_CFLAGS@
-CODE_COVERAGE_CPPFLAGS = @CODE_COVERAGE_CPPFLAGS@
-CODE_COVERAGE_CXXFLAGS = @CODE_COVERAGE_CXXFLAGS@
-CODE_COVERAGE_ENABLED = @CODE_COVERAGE_ENABLED@
-CODE_COVERAGE_LDFLAGS = @CODE_COVERAGE_LDFLAGS@
-CODE_COVERAGE_LIBS = @CODE_COVERAGE_LIBS@
 CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
@@ -988,14 +1046,15 @@ ENABLE_SHARED = @ENABLE_SHARED@
 ENABLE_STATIC = @ENABLE_STATIC@
 EXEEXT = @EXEEXT@
 FGREP = @FGREP@
+FISH_FUNCTIONS_DIR = @FISH_FUNCTIONS_DIR@
 GCOV = @GCOV@
-GENHTML = @GENHTML@
 GREP = @GREP@
 HAVE_BROTLI = @HAVE_BROTLI@
 HAVE_GNUTLS_SRP = @HAVE_GNUTLS_SRP@
 HAVE_LDAP_SSL = @HAVE_LDAP_SSL@
 HAVE_LIBZ = @HAVE_LIBZ@
 HAVE_OPENSSL_SRP = @HAVE_OPENSSL_SRP@
+HAVE_PROTO_BSDSOCKET_H = @HAVE_PROTO_BSDSOCKET_H@
 IDN_ENABLED = @IDN_ENABLED@
 INSTALL = @INSTALL@
 INSTALL_DATA = @INSTALL_DATA@
@@ -1058,9 +1117,7 @@ STRIP = @STRIP@
 SUPPORT_FEATURES = @SUPPORT_FEATURES@
 SUPPORT_PROTOCOLS = @SUPPORT_PROTOCOLS@
 USE_ARES = @USE_ARES@
-USE_AXTLS = @USE_AXTLS@
-USE_CYASSL = @USE_CYASSL@
-USE_DARWINSSL = @USE_DARWINSSL@
+USE_BEARSSL = @USE_BEARSSL@
 USE_GNUTLS = @USE_GNUTLS@
 USE_GNUTLS_NETTLE = @USE_GNUTLS_NETTLE@
 USE_LIBRTMP = @USE_LIBRTMP@
@@ -1069,12 +1126,17 @@ USE_LIBSSH2 = @USE_LIBSSH2@
 USE_MBEDTLS = @USE_MBEDTLS@
 USE_MESALINK = @USE_MESALINK@
 USE_NGHTTP2 = @USE_NGHTTP2@
+USE_NGHTTP3 = @USE_NGHTTP3@
+USE_NGTCP2 = @USE_NGTCP2@
+USE_NGTCP2_CRYPTO_OPENSSL = @USE_NGTCP2_CRYPTO_OPENSSL@
 USE_NSS = @USE_NSS@
 USE_OPENLDAP = @USE_OPENLDAP@
-USE_POLARSSL = @USE_POLARSSL@
+USE_QUICHE = @USE_QUICHE@
 USE_SCHANNEL = @USE_SCHANNEL@
+USE_SECTRANSP = @USE_SECTRANSP@
 USE_UNIX_SOCKETS = @USE_UNIX_SOCKETS@
 USE_WINDOWS_SSPI = @USE_WINDOWS_SSPI@
+USE_WOLFSSL = @USE_WOLFSSL@
 VERSION = @VERSION@
 VERSIONNUM = @VERSIONNUM@
 ZLIB_LIBS = @ZLIB_LIBS@
@@ -1161,8 +1223,12 @@ COMPLICATED_EXAMPLES = curlgtk.c curlx.c htmltitle.cpp cacertinmem.c \
   sampleconv.c synctime.c threaded-ssl.c evhiperfifo.c \
   smooth-gtk-thread.c version-check.pl href_extractor.c asiohiper.cpp \
   multi-uv.c xmlstream.c usercertinmem.c sessioninfo.c \
-  threaded-shared-conn.c crawler.c ephiperfifo.c
+  threaded-shared-conn.c crawler.c ephiperfifo.c multi-event.c
 
+CHECKSRC = $(CS_$(V))
+CS_0 = @echo "  RUN     " $@;
+CS_1 = 
+CS_ = $(CS_0)
 all: all-am
 
 .SUFFIXES:
@@ -1211,6 +1277,10 @@ clean-checkPROGRAMS:
        @rm -f 10-at-a-time$(EXEEXT)
        $(AM_V_CCLD)$(LINK) $(10_at_a_time_OBJECTS) $(10_at_a_time_LDADD) $(LIBS)
 
+altsvc$(EXEEXT): $(altsvc_OBJECTS) $(altsvc_DEPENDENCIES) $(EXTRA_altsvc_DEPENDENCIES) 
+       @rm -f altsvc$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(altsvc_OBJECTS) $(altsvc_LDADD) $(LIBS)
+
 anyauthput$(EXEEXT): $(anyauthput_OBJECTS) $(anyauthput_DEPENDENCIES) $(EXTRA_anyauthput_DEPENDENCIES) 
        @rm -f anyauthput$(EXEEXT)
        $(AM_V_CCLD)$(LINK) $(anyauthput_OBJECTS) $(anyauthput_LDADD) $(LIBS)
@@ -1307,6 +1377,14 @@ http2-upload$(EXEEXT): $(http2_upload_OBJECTS) $(http2_upload_DEPENDENCIES) $(EX
        @rm -f http2-upload$(EXEEXT)
        $(AM_V_CCLD)$(LINK) $(http2_upload_OBJECTS) $(http2_upload_LDADD) $(LIBS)
 
+http3$(EXEEXT): $(http3_OBJECTS) $(http3_DEPENDENCIES) $(EXTRA_http3_DEPENDENCIES) 
+       @rm -f http3$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(http3_OBJECTS) $(http3_LDADD) $(LIBS)
+
+http3-present$(EXEEXT): $(http3_present_OBJECTS) $(http3_present_DEPENDENCIES) $(EXTRA_http3_present_DEPENDENCIES) 
+       @rm -f http3-present$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(http3_present_OBJECTS) $(http3_present_LDADD) $(LIBS)
+
 httpcustomheader$(EXEEXT): $(httpcustomheader_OBJECTS) $(httpcustomheader_DEPENDENCIES) $(EXTRA_httpcustomheader_DEPENDENCIES) 
        @rm -f httpcustomheader$(EXEEXT)
        $(AM_V_CCLD)$(LINK) $(httpcustomheader_OBJECTS) $(httpcustomheader_LDADD) $(LIBS)
@@ -1323,6 +1401,10 @@ imap-append$(EXEEXT): $(imap_append_OBJECTS) $(imap_append_DEPENDENCIES) $(EXTRA
        @rm -f imap-append$(EXEEXT)
        $(AM_V_CCLD)$(LINK) $(imap_append_OBJECTS) $(imap_append_LDADD) $(LIBS)
 
+imap-authzid$(EXEEXT): $(imap_authzid_OBJECTS) $(imap_authzid_DEPENDENCIES) $(EXTRA_imap_authzid_DEPENDENCIES) 
+       @rm -f imap-authzid$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(imap_authzid_OBJECTS) $(imap_authzid_LDADD) $(LIBS)
+
 imap-copy$(EXEEXT): $(imap_copy_OBJECTS) $(imap_copy_DEPENDENCIES) $(EXTRA_imap_copy_DEPENDENCIES) 
        @rm -f imap-copy$(EXEEXT)
        $(AM_V_CCLD)$(LINK) $(imap_copy_OBJECTS) $(imap_copy_LDADD) $(LIBS)
@@ -1391,6 +1473,10 @@ multi-formadd$(EXEEXT): $(multi_formadd_OBJECTS) $(multi_formadd_DEPENDENCIES) $
        @rm -f multi-formadd$(EXEEXT)
        $(AM_V_CCLD)$(LINK) $(multi_formadd_OBJECTS) $(multi_formadd_LDADD) $(LIBS)
 
+multi-poll$(EXEEXT): $(multi_poll_OBJECTS) $(multi_poll_DEPENDENCIES) $(EXTRA_multi_poll_DEPENDENCIES) 
+       @rm -f multi-poll$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(multi_poll_OBJECTS) $(multi_poll_LDADD) $(LIBS)
+
 multi-post$(EXEEXT): $(multi_post_OBJECTS) $(multi_post_DEPENDENCIES) $(EXTRA_multi_post_DEPENDENCIES) 
        @rm -f multi-post$(EXEEXT)
        $(AM_V_CCLD)$(LINK) $(multi_post_OBJECTS) $(multi_post_LDADD) $(LIBS)
@@ -1407,6 +1493,10 @@ persistent$(EXEEXT): $(persistent_OBJECTS) $(persistent_DEPENDENCIES) $(EXTRA_pe
        @rm -f persistent$(EXEEXT)
        $(AM_V_CCLD)$(LINK) $(persistent_OBJECTS) $(persistent_LDADD) $(LIBS)
 
+pop3-authzid$(EXEEXT): $(pop3_authzid_OBJECTS) $(pop3_authzid_DEPENDENCIES) $(EXTRA_pop3_authzid_DEPENDENCIES) 
+       @rm -f pop3-authzid$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(pop3_authzid_OBJECTS) $(pop3_authzid_LDADD) $(LIBS)
+
 pop3-dele$(EXEEXT): $(pop3_dele_OBJECTS) $(pop3_dele_DEPENDENCIES) $(EXTRA_pop3_dele_DEPENDENCIES) 
        @rm -f pop3-dele$(EXEEXT)
        $(AM_V_CCLD)$(LINK) $(pop3_dele_OBJECTS) $(pop3_dele_LDADD) $(LIBS)
@@ -1507,6 +1597,10 @@ simplessl$(EXEEXT): $(simplessl_OBJECTS) $(simplessl_DEPENDENCIES) $(EXTRA_simpl
        @rm -f simplessl$(EXEEXT)
        $(AM_V_CCLD)$(LINK) $(simplessl_OBJECTS) $(simplessl_LDADD) $(LIBS)
 
+smtp-authzid$(EXEEXT): $(smtp_authzid_OBJECTS) $(smtp_authzid_DEPENDENCIES) $(EXTRA_smtp_authzid_DEPENDENCIES) 
+       @rm -f smtp-authzid$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(smtp_authzid_OBJECTS) $(smtp_authzid_LDADD) $(LIBS)
+
 smtp-expn$(EXEEXT): $(smtp_expn_OBJECTS) $(smtp_expn_DEPENDENCIES) $(EXTRA_smtp_expn_DEPENDENCIES) 
        @rm -f smtp-expn$(EXEEXT)
        $(AM_V_CCLD)$(LINK) $(smtp_expn_OBJECTS) $(smtp_expn_LDADD) $(LIBS)
@@ -1543,6 +1637,10 @@ url2file$(EXEEXT): $(url2file_OBJECTS) $(url2file_DEPENDENCIES) $(EXTRA_url2file
        @rm -f url2file$(EXEEXT)
        $(AM_V_CCLD)$(LINK) $(url2file_OBJECTS) $(url2file_LDADD) $(LIBS)
 
+urlapi$(EXEEXT): $(urlapi_OBJECTS) $(urlapi_DEPENDENCIES) $(EXTRA_urlapi_DEPENDENCIES) 
+       @rm -f urlapi$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(urlapi_OBJECTS) $(urlapi_LDADD) $(LIBS)
+
 mostlyclean-compile:
        -rm -f *.$(OBJEXT)
 
@@ -1550,6 +1648,7 @@ distclean-compile:
        -rm -f *.tab.c
 
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/10-at-a-time.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/altsvc.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/anyauthput.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/certinfo.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/chkspeed.Po@am__quote@ # am--include-marker
@@ -1574,10 +1673,13 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/http2-pushinmemory.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/http2-serverpush.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/http2-upload.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/http3-present.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/http3.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/httpcustomheader.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/httpput.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/https.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/imap-append.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/imap-authzid.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/imap-copy.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/imap-create.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/imap-delete.Po@am__quote@ # am--include-marker
@@ -1595,10 +1697,12 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/multi-debugcallback.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/multi-double.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/multi-formadd.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/multi-poll.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/multi-post.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/multi-single.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parseurl.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/persistent.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pop3-authzid.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pop3-dele.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pop3-list.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pop3-multi.Po@am__quote@ # am--include-marker
@@ -1624,6 +1728,7 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/simple.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/simplepost.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/simplessl.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/smtp-authzid.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/smtp-expn.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/smtp-mail.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/smtp-mime.Po@am__quote@ # am--include-marker
@@ -1633,6 +1738,7 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/smtp-vrfy.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sslbackend.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/url2file.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/urlapi.Po@am__quote@ # am--include-marker
 
 $(am__depfiles_remade):
        @$(MKDIR_P) $(@D)
@@ -1797,6 +1903,7 @@ clean-am: clean-checkPROGRAMS clean-generic clean-libtool \
 
 distclean: distclean-am
                -rm -f ./$(DEPDIR)/10-at-a-time.Po
+       -rm -f ./$(DEPDIR)/altsvc.Po
        -rm -f ./$(DEPDIR)/anyauthput.Po
        -rm -f ./$(DEPDIR)/certinfo.Po
        -rm -f ./$(DEPDIR)/chkspeed.Po
@@ -1821,10 +1928,13 @@ distclean: distclean-am
        -rm -f ./$(DEPDIR)/http2-pushinmemory.Po
        -rm -f ./$(DEPDIR)/http2-serverpush.Po
        -rm -f ./$(DEPDIR)/http2-upload.Po
+       -rm -f ./$(DEPDIR)/http3-present.Po
+       -rm -f ./$(DEPDIR)/http3.Po
        -rm -f ./$(DEPDIR)/httpcustomheader.Po
        -rm -f ./$(DEPDIR)/httpput.Po
        -rm -f ./$(DEPDIR)/https.Po
        -rm -f ./$(DEPDIR)/imap-append.Po
+       -rm -f ./$(DEPDIR)/imap-authzid.Po
        -rm -f ./$(DEPDIR)/imap-copy.Po
        -rm -f ./$(DEPDIR)/imap-create.Po
        -rm -f ./$(DEPDIR)/imap-delete.Po
@@ -1842,10 +1952,12 @@ distclean: distclean-am
        -rm -f ./$(DEPDIR)/multi-debugcallback.Po
        -rm -f ./$(DEPDIR)/multi-double.Po
        -rm -f ./$(DEPDIR)/multi-formadd.Po
+       -rm -f ./$(DEPDIR)/multi-poll.Po
        -rm -f ./$(DEPDIR)/multi-post.Po
        -rm -f ./$(DEPDIR)/multi-single.Po
        -rm -f ./$(DEPDIR)/parseurl.Po
        -rm -f ./$(DEPDIR)/persistent.Po
+       -rm -f ./$(DEPDIR)/pop3-authzid.Po
        -rm -f ./$(DEPDIR)/pop3-dele.Po
        -rm -f ./$(DEPDIR)/pop3-list.Po
        -rm -f ./$(DEPDIR)/pop3-multi.Po
@@ -1871,6 +1983,7 @@ distclean: distclean-am
        -rm -f ./$(DEPDIR)/simple.Po
        -rm -f ./$(DEPDIR)/simplepost.Po
        -rm -f ./$(DEPDIR)/simplessl.Po
+       -rm -f ./$(DEPDIR)/smtp-authzid.Po
        -rm -f ./$(DEPDIR)/smtp-expn.Po
        -rm -f ./$(DEPDIR)/smtp-mail.Po
        -rm -f ./$(DEPDIR)/smtp-mime.Po
@@ -1880,6 +1993,7 @@ distclean: distclean-am
        -rm -f ./$(DEPDIR)/smtp-vrfy.Po
        -rm -f ./$(DEPDIR)/sslbackend.Po
        -rm -f ./$(DEPDIR)/url2file.Po
+       -rm -f ./$(DEPDIR)/urlapi.Po
        -rm -f Makefile
 distclean-am: clean-am distclean-compile distclean-generic \
        distclean-tags
@@ -1926,6 +2040,7 @@ installcheck-am:
 
 maintainer-clean: maintainer-clean-am
                -rm -f ./$(DEPDIR)/10-at-a-time.Po
+       -rm -f ./$(DEPDIR)/altsvc.Po
        -rm -f ./$(DEPDIR)/anyauthput.Po
        -rm -f ./$(DEPDIR)/certinfo.Po
        -rm -f ./$(DEPDIR)/chkspeed.Po
@@ -1950,10 +2065,13 @@ maintainer-clean: maintainer-clean-am
        -rm -f ./$(DEPDIR)/http2-pushinmemory.Po
        -rm -f ./$(DEPDIR)/http2-serverpush.Po
        -rm -f ./$(DEPDIR)/http2-upload.Po
+       -rm -f ./$(DEPDIR)/http3-present.Po
+       -rm -f ./$(DEPDIR)/http3.Po
        -rm -f ./$(DEPDIR)/httpcustomheader.Po
        -rm -f ./$(DEPDIR)/httpput.Po
        -rm -f ./$(DEPDIR)/https.Po
        -rm -f ./$(DEPDIR)/imap-append.Po
+       -rm -f ./$(DEPDIR)/imap-authzid.Po
        -rm -f ./$(DEPDIR)/imap-copy.Po
        -rm -f ./$(DEPDIR)/imap-create.Po
        -rm -f ./$(DEPDIR)/imap-delete.Po
@@ -1971,10 +2089,12 @@ maintainer-clean: maintainer-clean-am
        -rm -f ./$(DEPDIR)/multi-debugcallback.Po
        -rm -f ./$(DEPDIR)/multi-double.Po
        -rm -f ./$(DEPDIR)/multi-formadd.Po
+       -rm -f ./$(DEPDIR)/multi-poll.Po
        -rm -f ./$(DEPDIR)/multi-post.Po
        -rm -f ./$(DEPDIR)/multi-single.Po
        -rm -f ./$(DEPDIR)/parseurl.Po
        -rm -f ./$(DEPDIR)/persistent.Po
+       -rm -f ./$(DEPDIR)/pop3-authzid.Po
        -rm -f ./$(DEPDIR)/pop3-dele.Po
        -rm -f ./$(DEPDIR)/pop3-list.Po
        -rm -f ./$(DEPDIR)/pop3-multi.Po
@@ -2000,6 +2120,7 @@ maintainer-clean: maintainer-clean-am
        -rm -f ./$(DEPDIR)/simple.Po
        -rm -f ./$(DEPDIR)/simplepost.Po
        -rm -f ./$(DEPDIR)/simplessl.Po
+       -rm -f ./$(DEPDIR)/smtp-authzid.Po
        -rm -f ./$(DEPDIR)/smtp-expn.Po
        -rm -f ./$(DEPDIR)/smtp-mail.Po
        -rm -f ./$(DEPDIR)/smtp-mime.Po
@@ -2009,6 +2130,7 @@ maintainer-clean: maintainer-clean-am
        -rm -f ./$(DEPDIR)/smtp-vrfy.Po
        -rm -f ./$(DEPDIR)/sslbackend.Po
        -rm -f ./$(DEPDIR)/url2file.Po
+       -rm -f ./$(DEPDIR)/urlapi.Po
        -rm -f Makefile
 maintainer-clean-am: distclean-am maintainer-clean-generic
 
@@ -2051,7 +2173,7 @@ uninstall-am:
 all: $(check_PROGRAMS)
 
 checksrc:
-       @PERL@ $(top_srcdir)/lib/checksrc.pl $(srcdir)/*.c
+       $(CHECKSRC)(@PERL@ $(top_srcdir)/lib/checksrc.pl -ASNPRINTF $(srcdir)/*.c)
 
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
index f51871f..b588b5f 100644 (file)
@@ -5,7 +5,7 @@
 #                            | (__| |_| |  _ <| |___
 #                             \___|\___/|_| \_\_____|
 #
-# Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 #
 # This software is licensed as described in the file COPYING, which
 # you should have received as part of this distribution. The terms
@@ -34,7 +34,9 @@ check_PROGRAMS = 10-at-a-time anyauthput cookie_interface debug fileupload \
   imap-tls imap-multi url2file sftpget ftpsget postinmemory http2-download \
   http2-upload http2-serverpush getredirect ftpuploadfrommem               \
   ftpuploadresume sslbackend postit2-formadd multi-formadd                 \
-  shared-connection-cache sftpuploadresume http2-pushinmemory parseurl
+  shared-connection-cache sftpuploadresume http2-pushinmemory parseurl     \
+  urlapi imap-authzid pop3-authzid smtp-authzid http3 altsvc               \
+  http3-present multi-poll
 
 # These examples require external dependencies that may not be commonly
 # available on POSIX systems, so don't bother attempting to compile them here.
@@ -43,4 +45,4 @@ COMPLICATED_EXAMPLES = curlgtk.c curlx.c htmltitle.cpp cacertinmem.c \
   sampleconv.c synctime.c threaded-ssl.c evhiperfifo.c \
   smooth-gtk-thread.c version-check.pl href_extractor.c asiohiper.cpp \
   multi-uv.c xmlstream.c usercertinmem.c sessioninfo.c \
-  threaded-shared-conn.c crawler.c ephiperfifo.c
+  threaded-shared-conn.c crawler.c ephiperfifo.c multi-event.c
index 9b6c69b..1f50a92 100644 (file)
@@ -27,11 +27,6 @@ ifndef LIBSSH2_PATH
 LIBSSH2_PATH = ../../../libssh2-1.5.0
 endif
 
-# Edit the path below to point to the base of your axTLS package.
-ifndef AXTLS_PATH
-AXTLS_PATH = ../../../axTLS-1.2.7
-endif
-
 # Edit the path below to point to the base of your libidn package.
 ifndef LIBIDN_PATH
 LIBIDN_PATH = ../../../libidn-1.32
@@ -197,14 +192,9 @@ WITH_SSH2 = 1
 WITH_SSL = 1
 WITH_ZLIB = 1
 endif
-ifeq ($(findstring -axtls,$(CFG)),-axtls)
-WITH_AXTLS = 1
-WITH_SSL =
-else
 ifeq ($(findstring -ssl,$(CFG)),-ssl)
 WITH_SSL = 1
 endif
-endif
 ifeq ($(findstring -zlib,$(CFG)),-zlib)
 WITH_ZLIB = 1
 endif
@@ -245,15 +235,6 @@ ifdef WITH_SSL
   LDLIBS += $(OPENSSL_PATH)/out_nw_$(LIBARCH_L)/crypto.$(LIBEXT)
   IMPORTS += GetProcessSwitchCount RunningProcess
 else
-ifdef WITH_AXTLS
-  INCLUDES += -I$(AXTLS_PATH)/inc
-ifdef LINK_STATIC
-  LDLIBS += $(AXTLS_PATH)/lib/libaxtls.$(LIBEXT)
-else
-  MODULES += libaxtls.nlm
-  IMPORTS += $(AXTLS_PATH)/lib/libaxtls.imp
-endif
-endif
 endif
 ifdef WITH_ZLIB
   # INCLUDES += -I$(ZLIB_PATH)
diff --git a/docs/examples/altsvc.c b/docs/examples/altsvc.c
new file mode 100644 (file)
index 0000000..24ef425
--- /dev/null
@@ -0,0 +1,56 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+/* <DESC>
+ * HTTP with Alt-Svc support
+ * </DESC>
+ */
+#include <stdio.h>
+#include <curl/curl.h>
+
+int main(void)
+{
+  CURL *curl;
+  CURLcode res;
+
+  curl = curl_easy_init();
+  if(curl) {
+    curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
+
+    /* cache the alternatives in this file */
+    curl_easy_setopt(curl, CURLOPT_ALTSVC, "altsvc.txt");
+
+    /* restrict which HTTP versions to use alternatives */
+    curl_easy_setopt(curl, CURLOPT_ALTSVC_CTRL, (long)
+                     CURLALTSVC_H1|CURLALTSVC_H2|CURLALTSVC_H3);
+
+    /* Perform the request, res will get the return code */
+    res = curl_easy_perform(curl);
+    /* Check for errors */
+    if(res != CURLE_OK)
+      fprintf(stderr, "curl_easy_perform() failed: %s\n",
+              curl_easy_strerror(res));
+
+    /* always cleanup */
+    curl_easy_cleanup(curl);
+  }
+  return 0;
+}
index 14da10c..a6ecb31 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
index 6f4c61c..ea295d0 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -29,7 +29,7 @@
 #include <curl/curl.h>
 #include <stdio.h>
 
-size_t writefunction(void *ptr, size_t size, size_t nmemb, void *stream)
+static size_t writefunction(void *ptr, size_t size, size_t nmemb, void *stream)
 {
   fwrite(ptr, size, nmemb, (FILE *)stream);
   return (nmemb*size);
@@ -38,88 +38,83 @@ size_t writefunction(void *ptr, size_t size, size_t nmemb, void *stream)
 static CURLcode sslctx_function(CURL *curl, void *sslctx, void *parm)
 {
   CURLcode rv = CURLE_ABORTED_BY_CALLBACK;
-  X509_STORE *store = NULL;
-  X509 *cert = NULL;
-  BIO *bio = NULL;
-  char *mypem =
-    /* CA for example.com. CN = DigiCert High Assurance EV Root CA */
+
+  /** This example uses two (fake) certificates **/
+  static const char mypem[] =
+    "-----BEGIN CERTIFICATE-----\n"
+    "MIIH0zCCBbugAwIBAgIIXsO3pkN/pOAwDQYJKoZIhvcNAQEFBQAwQjESMBAGA1UE\n"
+    "AwwJQUNDVlJBSVoxMRAwDgYDVQQLDAdQS0lBQ0NWMQ0wCwYDVQQKDARBQ0NWMQsw\n"
+    "CQYDVQQGEwJFUzAeFw0xMTA1MDUwOTM3MzdaFw0zMDEyMzEwOTM3MzdaMEIxEjAQ\n"
+    "BgNVBAMMCUFDQ1ZSQUlaMTEQMA4GA1UECwwHUEtJQUNDVjENMAsGA1UECgwEQUND\n"
+    "VjELMAkGA1UEBhMCRVMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCb\n"
+    "qau/YUqXry+XZpp0X9DZlv3P4uRm7x8fRzPCRKPfmt4ftVTdFXxpNRFvu8gMjmoY\n"
+    "HtiP2Ra8EEg2XPBjs5BaXCQ316PWywlxufEBcoSwfdtNgM3802/J+Nq2DoLSRYWo\n"
+    "G2ioPej0RGy9ocLLA76MPhMAhN9KSMDjIgro6TenGEyxCQ0jVn8ETdkXhBilyNpA\n"
+    "0KIV9VMJcRz/RROE5iZe+OCIHAr8Fraocwa48GOEAqDGWuzndN9wrqODJerWx5eH\n"
+    "k6fGioozl2A3ED6XPm4pFdahD9GILBKfb6qkxkLrQaLjlUPTAYVtjrs78yM2x/47\n"
+    "JyCpZET/LtZ1qmxNYEAZSUNUY9rizLpm5U9EelvZaoErQNV/+QEnWCzI7UiRfD+m\n"
+    "AM/EKXMRNt6GGT6d7hmKG9Ww7Y49nCrADdg9ZuM8Db3VlFzi4qc1GwQA9j9ajepD\n"
+    "vV+JHanBsMyZ4k0ACtrJJ1vnE5Bc5PUzolVt3OAJTS+xJlsndQAJxGJ3KQhfnlms\n"
+    "tn6tn1QwIgPBHnFk/vk4CpYY3QIUrCPLBhwepH2NDd4nQeit2hW3sCPdK6jT2iWH\n"
+    "7ehVRE2I9DZ+hJp4rPcOVkkO1jMl1oRQQmwgEh0q1b688nCBpHBgvgW1m54ERL5h\n"
+    "I6zppSSMEYCUWqKiuUnSwdzRp+0xESyeGabu4VXhwOrPDYTkF7eifKXeVSUG7szA\n"
+    "h1xA2syVP1XgNce4hL60Xc16gwFy7ofmXx2utYXGJt/mwZrpHgJHnyqobalbz+xF\n"
+    "d3+YJ5oyXSrjhO7FmGYvliAd3djDJ9ew+f7Zfc3Qn48LFFhRny+Lwzgt3uiP1o2H\n"
+    "pPVWQxaZLPSkVrQ0uGE3ycJYgBugl6H8WY3pEfbRD0tVNEYqi4Y7\n"
+    "-----END CERTIFICATE-----\n"
     "-----BEGIN CERTIFICATE-----\n"
-    "MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBs\n"
-    "MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3\n"
-    "d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j\n"
-    "ZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAwMFoXDTMxMTExMDAwMDAwMFowbDEL\n"
-    "MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3\n"
-    "LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug\n"
-    "RVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm\n"
-    "+9S75S0tMqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTW\n"
-    "PNt0OKRKzE0lgvdKpVMSOO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEM\n"
-    "xChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFB\n"
-    "Ik5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQNAQTXKFx01p8VdteZOE3\n"
-    "hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUeh10aUAsg\n"
-    "EsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQF\n"
-    "MAMBAf8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaA\n"
-    "FLE+w2kD+L9HAdSYJhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3Nec\n"
-    "nzyIZgYIVyHbIUf4KmeqvxgydkAQV8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6z\n"
-    "eM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFpmyPInngiK3BD41VHMWEZ71jF\n"
-    "hS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkKmNEVX58Svnw2\n"
-    "Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe\n"
-    "vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep\n"
-    "+OkuE6N36B9K\n"
+    "MIIFtTCCA52gAwIBAgIIYY3HhjsBggUwDQYJKoZIhvcNAQEFBQAwRDEWMBQGA1UE\n"
+    "AwwNQUNFRElDT00gUm9vdDEMMAoGA1UECwwDUEtJMQ8wDQYDVQQKDAZFRElDT00x\n"
+    "CzAJBgNVBAYTAkVTMB4XDTA4MDQxODE2MjQyMloXDTI4MDQxMzE2MjQyMlowRDEW\n"
+    "MBQGA1UEAwwNQUNFRElDT00gUm9vdDEMMAoGA1UECwwDUEtJMQ8wDQYDVQQKDAZF\n"
+    "RElDT00xCzAJBgNVBAYTAkVTMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKC\n"
+    "AgEA/5KV4WgGdrQsyFhIyv2AVClVYyT/kGWbEHV7w2rbYgIB8hiGtXxaOLHkWLn7\n"
+    "09gtn70yN78sFW2+tfQh0hOR2QetAQXW8713zl9CgQr5auODAKgrLlUTY4HKRxx7\n"
+    "XBZXehuDYAQ6PmXDzQHe3qTWDLqO3tkE7hdWIpuPY/1NFgu3e3eM+SW10W2ZEi5P\n"
+    "gvoFNTPhNahXwOf9jU8/kzJPeGYDdwdY6ZXIfj7QeQCM8htRM5u8lOk6e25SLTKe\n"
+    "I6RF+7YuE7CLGLHdztUdp0J/Vb77W7tH1PwkzQSulgUV1qzOMPPKC8W64iLgpq0i\n"
+    "5ALudBF/TP94HTXa5gI06xgSYXcGCRZj6hitoocf8seACQl1ThCojz2GuHURwCRi\n"
+    "ipZ7SkXp7FnFvmuD5uHorLUwHv4FB4D54SMNUI8FmP8sX+g7tq3PgbUhh8oIKiMn\n"
+    "MCArz+2UW6yyetLHKKGKC5tNSixthT8Jcjxn4tncB7rrZXtaAWPWkFtPF2Y9fwsZ\n"
+    "o5NjEFIqnxQWWOLcpfShFosOkYuByptZ+thrkQdlVV9SH686+5DdaaVbnG0OLLb6\n"
+    "zqylfDJKZ0DcMDQj3dcEI2bw/FWAp/tmGYI1Z2JwOV5vx+qQQEQIHriy1tvuWacN\n"
+    "GHk0vFQYXlPKNFHtRQrmjseCNj6nOGOpMCwXEGCSn1WHElkQwg9naRHMTh5+Spqt\n"
+    "r0CodaxWkHS4oJyleW/c6RrIaQXpuvoDs3zk4E7Czp3otkYNbn5XOmeUwssfnHdK\n"
+    "Z05phkOTOPu220+DkdRgfks+KzgHVZhepA==\n"
     "-----END CERTIFICATE-----\n";
 
-  /* clear the current thread's OpenSSL error queue */
-  ERR_clear_error();
+  BIO *cbio = BIO_new_mem_buf(mypem, sizeof(mypem));
+  X509_STORE  *cts = SSL_CTX_get_cert_store((SSL_CTX *)sslctx);
+  int i;
+  STACK_OF(X509_INFO) *inf;
+  (void)curl;
+  (void)parm;
 
-  /* get a BIO */
-  bio = BIO_new_mem_buf(mypem, -1);
-  if(!bio)
-    goto err;
-
-  /* use it to read the PEM formatted certificate from memory into an X509
-   * structure that SSL can use
-   */
-  if(!PEM_read_bio_X509(bio, &cert, 0, NULL))
-    goto err;
-
-  /* get a pointer to the X509 certificate store (which may be empty!) */
-  store = SSL_CTX_get_cert_store((SSL_CTX *)sslctx);
-  if(!store)
-    goto err;
-
-  /* add our certificate to this store */
-  if(!X509_STORE_add_cert(store, cert)) {
-    unsigned long error = ERR_peek_last_error();
-
-    /* Ignore error X509_R_CERT_ALREADY_IN_HASH_TABLE which means the
-     * certificate is already in the store. That could happen if
-     * libcurl already loaded the certificate from a ca cert bundle
-     * set at libcurl build-time or runtime.
-     */
-    if(ERR_GET_LIB(error) != ERR_LIB_X509 ||
-       ERR_GET_REASON(error) != X509_R_CERT_ALREADY_IN_HASH_TABLE)
-      goto err;
-
-    ERR_clear_error();
+  if(!cts || !cbio) {
+    return rv;
   }
 
-  rv = CURLE_OK;
+  inf = PEM_X509_INFO_read_bio(cbio, NULL, NULL, NULL);
 
-err:
-  if(rv != CURLE_OK) {
-    char errbuf[256];
-    unsigned long error = ERR_peek_last_error();
+  if(!inf) {
+    BIO_free(cbio);
+    return rv;
+  }
 
-    fprintf(stderr, "error adding certificate\n");
-    if(error) {
-      ERR_error_string_n(error, errbuf, sizeof(errbuf));
-      fprintf(stderr, "%s\n", errbuf);
+  for(i = 0; i < sk_X509_INFO_num(inf); i++) {
+    X509_INFO *itmp = sk_X509_INFO_value(inf, i);
+    if(itmp->x509) {
+      X509_STORE_add_cert(cts, itmp->x509);
+    }
+    if(itmp->crl) {
+      X509_STORE_add_crl(cts, itmp->crl);
     }
   }
 
-  X509_free(cert);
-  BIO_free(bio);
-  ERR_clear_error();
+  sk_X509_INFO_pop_free(inf, X509_INFO_free);
+  BIO_free(cbio);
 
+  rv = CURLE_OK;
   return rv;
 }
 
@@ -128,26 +123,26 @@ int main(void)
   CURL *ch;
   CURLcode rv;
 
-  rv = curl_global_init(CURL_GLOBAL_ALL);
+  curl_global_init(CURL_GLOBAL_ALL);
   ch = curl_easy_init();
-  rv = curl_easy_setopt(ch, CURLOPT_VERBOSE, 0L);
-  rv = curl_easy_setopt(ch, CURLOPT_HEADER, 0L);
-  rv = curl_easy_setopt(ch, CURLOPT_NOPROGRESS, 1L);
-  rv = curl_easy_setopt(ch, CURLOPT_NOSIGNAL, 1L);
-  rv = curl_easy_setopt(ch, CURLOPT_WRITEFUNCTION, *writefunction);
-  rv = curl_easy_setopt(ch, CURLOPT_WRITEDATA, stdout);
-  rv = curl_easy_setopt(ch, CURLOPT_HEADERFUNCTION, *writefunction);
-  rv = curl_easy_setopt(ch, CURLOPT_HEADERDATA, stderr);
-  rv = curl_easy_setopt(ch, CURLOPT_SSLCERTTYPE, "PEM");
-  rv = curl_easy_setopt(ch, CURLOPT_SSL_VERIFYPEER, 1L);
-  rv = curl_easy_setopt(ch, CURLOPT_URL, "https://www.example.com/");
-
-  /* turn off the default CA locations (optional)
-   * otherwise libcurl will load CA certificates from the locations that
-   * were detected/specified at build-time
+  curl_easy_setopt(ch, CURLOPT_VERBOSE, 0L);
+  curl_easy_setopt(ch, CURLOPT_HEADER, 0L);
+  curl_easy_setopt(ch, CURLOPT_NOPROGRESS, 1L);
+  curl_easy_setopt(ch, CURLOPT_NOSIGNAL, 1L);
+  curl_easy_setopt(ch, CURLOPT_WRITEFUNCTION, *writefunction);
+  curl_easy_setopt(ch, CURLOPT_WRITEDATA, stdout);
+  curl_easy_setopt(ch, CURLOPT_HEADERFUNCTION, *writefunction);
+  curl_easy_setopt(ch, CURLOPT_HEADERDATA, stderr);
+  curl_easy_setopt(ch, CURLOPT_SSLCERTTYPE, "PEM");
+  curl_easy_setopt(ch, CURLOPT_SSL_VERIFYPEER, 1L);
+  curl_easy_setopt(ch, CURLOPT_URL, "https://www.example.com/");
+
+  /* Turn off the default CA locations, otherwise libcurl will load CA
+   * certificates from the locations that were detected/specified at
+   * build-time
    */
-  rv = curl_easy_setopt(ch, CURLOPT_CAINFO, NULL);
-  rv = curl_easy_setopt(ch, CURLOPT_CAPATH, NULL);
+  curl_easy_setopt(ch, CURLOPT_CAINFO, NULL);
+  curl_easy_setopt(ch, CURLOPT_CAPATH, NULL);
 
   /* first try: retrieve page without ca certificates -> should fail
    * unless libcurl was built --with-ca-fallback enabled at build-time
@@ -167,13 +162,13 @@ int main(void)
    * handle. normally you would set the ssl ctx function before making
    * any transfers, and not use this option.
    */
-  rv = curl_easy_setopt(ch, CURLOPT_FRESH_CONNECT, 1L);
+  curl_easy_setopt(ch, CURLOPT_FRESH_CONNECT, 1L);
 
   /* second try: retrieve page using cacerts' certificate -> will succeed
    * load the certificate by installing a function doing the necessary
    * "modifications" to the SSL CONTEXT just before link init
    */
-  rv = curl_easy_setopt(ch, CURLOPT_SSL_CTX_FUNCTION, *sslctx_function);
+  curl_easy_setopt(ch, CURLOPT_SSL_CTX_FUNCTION, *sslctx_function);
   rv = curl_easy_perform(ch);
   if(rv == CURLE_OK)
     printf("*** transfer succeeded ***\n");
index 0b0ba72..bf9c487 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
index d8fa5a4..7ddfb81 100644 (file)
@@ -6,7 +6,7 @@
  *                             \___|\___/|_| \_\_____|
  *
  * Web crawler based on curl and libxml2.
- * Copyright (C) 2018 Jeroen Ooms <jeroenooms@gmail.com>
+ * Copyright (C) 2018 - 2019 Jeroen Ooms <jeroenooms@gmail.com>
  * License: MIT
  *
  * To compile:
@@ -81,7 +81,7 @@ CURL *make_handle(char *url)
   curl_easy_setopt(handle, CURLOPT_PRIVATE, mem);
 
   /* For completeness */
-  curl_easy_setopt(handle, CURLOPT_ENCODING, "gzip, deflate");
+  curl_easy_setopt(handle, CURLOPT_ACCEPT_ENCODING, "");
   curl_easy_setopt(handle, CURLOPT_TIMEOUT, 5L);
   curl_easy_setopt(handle, CURLOPT_FOLLOWLOCATION, 1L);
   curl_easy_setopt(handle, CURLOPT_MAXREDIRS, 10L);
index 79e89ac..5990799 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- *  Copyright (c) 2000 David Odin (aka DindinX) for MandrakeSoft
+ *  Copyright (c) 2000 - 2019 David Odin (aka DindinX) for MandrakeSoft
  */
 /* <DESC>
  * use the libcurl in a gtk-threaded application
@@ -45,14 +45,12 @@ int my_progress_func(GtkWidget *bar,
 void *my_thread(void *ptr)
 {
   CURL *curl;
-  CURLcode res;
-  FILE *outfile;
-  gchar *url = ptr;
 
   curl = curl_easy_init();
   if(curl) {
+    gchar *url = ptr;
     const char *filename = "test.curl";
-    outfile = fopen(filename, "wb");
+    FILE *outfile = fopen(filename, "wb");
 
     curl_easy_setopt(curl, CURLOPT_URL, url);
     curl_easy_setopt(curl, CURLOPT_WRITEDATA, outfile);
@@ -62,7 +60,7 @@ void *my_thread(void *ptr)
     curl_easy_setopt(curl, CURLOPT_PROGRESSFUNCTION, my_progress_func);
     curl_easy_setopt(curl, CURLOPT_PROGRESSDATA, Bar);
 
-    res = curl_easy_perform(curl);
+    curl_easy_perform(curl);
 
     fclose(outfile);
     /* always cleanup */
index 49f52e6..e21a9ff 100644 (file)
@@ -15,7 +15,7 @@
  */
 
 /*
- * Copyright (c) 2003 The OpenEvidence Project.  All rights reserved.
+ * Copyright (c) 2003 - 2019 The OpenEvidence Project.  All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -277,7 +277,7 @@ int main(int argc, char **argv)
 
   int tabLength = 100;
   char *binaryptr;
-  char *mimetype;
+  char *mimetype = NULL;
   char *mimetypeaccept = NULL;
   char *contenttype;
   const char **pp;
@@ -294,7 +294,7 @@ int main(int argc, char **argv)
 
   binaryptr = malloc(tabLength);
 
-  p.verbose = 0;
+  memset(&p, '\0', sizeof(p));
   p.errorbio = BIO_new_fp(stderr, BIO_NOCLOSE);
 
   curl_global_init(CURL_GLOBAL_DEFAULT);
@@ -372,7 +372,7 @@ int main(int argc, char **argv)
     args++;
   }
 
-  if(mimetype == NULL || mimetypeaccept == NULL)
+  if(mimetype == NULL || mimetypeaccept == NULL || p.p12file == NULL)
     badarg = 1;
 
   if(badarg) {
@@ -544,7 +544,7 @@ int main(int argc, char **argv)
   BIO_printf(p.errorbio, "%d %s %d\n", __LINE__, "curl_easy_perform",
              res = curl_easy_perform(p.curl));
   {
-    int result = curl_easy_getinfo(p.curl, CURLINFO_CONTENT_TYPE, &response);
+    curl_easy_getinfo(p.curl, CURLINFO_CONTENT_TYPE, &response);
     if(mimetypeaccept && p.verbose) {
       if(!strcmp(mimetypeaccept, response))
         BIO_printf(p.errorbio, "the response has a correct mimetype : %s\n",
index e273725..c076a85 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -72,13 +72,6 @@ callback.
 #include <unistd.h>
 
 #include <curl/curl.h>
-#include <curl/multi.h>
-
-#ifdef __GNUC__
-#define _Unused __attribute__((unused))
-#else
-#define _Unused
-#endif
 
 #define MSG_OUT stdout /* Send info to stdout, change to stderr if you want */
 
@@ -115,7 +108,7 @@ typedef struct _SockInfo
   GlobalInfo *global;
 } SockInfo;
 
-#define __case(code) \
+#define mycase(code) \
   case code: s = __STRING(code)
 
 /* Die if we get a bad CURLMcode somewhere */
@@ -124,14 +117,14 @@ static void mcode_or_die(const char *where, CURLMcode code)
   if(CURLM_OK != code) {
     const char *s;
     switch(code) {
-      __case(CURLM_BAD_HANDLE); break;
-      __case(CURLM_BAD_EASY_HANDLE); break;
-      __case(CURLM_OUT_OF_MEMORY); break;
-      __case(CURLM_INTERNAL_ERROR); break;
-      __case(CURLM_UNKNOWN_OPTION); break;
-      __case(CURLM_LAST); break;
+      mycase(CURLM_BAD_HANDLE); break;
+      mycase(CURLM_BAD_EASY_HANDLE); break;
+      mycase(CURLM_OUT_OF_MEMORY); break;
+      mycase(CURLM_INTERNAL_ERROR); break;
+      mycase(CURLM_UNKNOWN_OPTION); break;
+      mycase(CURLM_LAST); break;
       default: s = "CURLM_unknown"; break;
-      __case(CURLM_BAD_SOCKET);
+      mycase(CURLM_BAD_SOCKET);
       fprintf(MSG_OUT, "ERROR: %s returns %s\n", where, s);
       /* ignore this error */
       return;
@@ -149,27 +142,29 @@ static void timer_cb(GlobalInfo* g, int revents);
 static int multi_timer_cb(CURLM *multi, long timeout_ms, GlobalInfo *g)
 {
   struct itimerspec its;
-  CURLMcode rc;
 
   fprintf(MSG_OUT, "multi_timer_cb: Setting timeout to %ld ms\n", timeout_ms);
 
-  timerfd_settime(g->tfd, /*flags=*/0, &its, NULL);
   if(timeout_ms > 0) {
     its.it_interval.tv_sec = 1;
     its.it_interval.tv_nsec = 0;
     its.it_value.tv_sec = timeout_ms / 1000;
-    its.it_value.tv_nsec = (timeout_ms % 1000) * 1000;
-    timerfd_settime(g->tfd, /*flags=*/0, &its, NULL);
+    its.it_value.tv_nsec = (timeout_ms % 1000) * 1000 * 1000;
   }
   else if(timeout_ms == 0) {
-    rc = curl_multi_socket_action(g->multi,
-                                  CURL_SOCKET_TIMEOUT, 0, &g->still_running);
-    mcode_or_die("multi_timer_cb: curl_multi_socket_action", rc);
+    /* libcurl wants us to timeout now, however setting both fields of
+     * new_value.it_value to zero disarms the timer. The closest we can
+     * do is to schedule the timer to fire in 1 ns. */
+    its.it_interval.tv_sec = 1;
+    its.it_interval.tv_nsec = 0;
+    its.it_value.tv_sec = 0;
+    its.it_value.tv_nsec = 1;
   }
   else {
     memset(&its, 0, sizeof(struct itimerspec));
-    timerfd_settime(g->tfd, /*flags=*/0, &its, NULL);
   }
+
+  timerfd_settime(g->tfd, /*flags=*/0, &its, NULL);
   return 0;
 }
 
@@ -206,8 +201,8 @@ static void event_cb(GlobalInfo *g, int fd, int revents)
   CURLMcode rc;
   struct itimerspec its;
 
-  int action = (revents & EPOLLIN ? CURL_POLL_IN : 0) |
-               (revents & EPOLLOUT ? CURL_POLL_OUT : 0);
+  int action = ((revents & EPOLLIN) ? CURL_CSELECT_IN : 0) |
+               ((revents & EPOLLOUT) ? CURL_CSELECT_OUT : 0);
 
   rc = curl_multi_socket_action(g->multi, fd, action, &g->still_running);
   mcode_or_die("event_cb: curl_multi_socket_action", rc);
@@ -257,7 +252,9 @@ static void remsock(SockInfo *f, GlobalInfo* g)
 {
   if(f) {
     if(f->sockfd) {
-      epoll_ctl(g->epfd, EPOLL_CTL_DEL, f->sockfd, NULL);
+      if(epoll_ctl(g->epfd, EPOLL_CTL_DEL, f->sockfd, NULL))
+        fprintf(stderr, "EPOLL_CTL_DEL failed for fd: %d : %s\n",
+                f->sockfd, strerror(errno));
     }
     free(f);
   }
@@ -270,11 +267,13 @@ static void setsock(SockInfo *f, curl_socket_t s, CURL *e, int act,
                     GlobalInfo *g)
 {
   struct epoll_event ev;
-  int kind = (act & CURL_POLL_IN ? EPOLLIN : 0) |
-             (act & CURL_POLL_OUT ? EPOLLOUT : 0);
+  int kind = ((act & CURL_POLL_IN) ? EPOLLIN : 0) |
+             ((act & CURL_POLL_OUT) ? EPOLLOUT : 0);
 
   if(f->sockfd) {
-    epoll_ctl(g->epfd, EPOLL_CTL_DEL, f->sockfd, NULL);
+    if(epoll_ctl(g->epfd, EPOLL_CTL_DEL, f->sockfd, NULL))
+      fprintf(stderr, "EPOLL_CTL_DEL failed for fd: %d : %s\n",
+              f->sockfd, strerror(errno));
   }
 
   f->sockfd = s;
@@ -283,7 +282,9 @@ static void setsock(SockInfo *f, curl_socket_t s, CURL *e, int act,
 
   ev.events = kind;
   ev.data.fd = s;
-  epoll_ctl(g->epfd, EPOLL_CTL_ADD, s, &ev);
+  if(epoll_ctl(g->epfd, EPOLL_CTL_ADD, s, &ev))
+    fprintf(stderr, "EPOLL_CTL_ADD failed for fd: %d : %s\n",
+            s, strerror(errno));
 }
 
 
@@ -329,21 +330,21 @@ static int sock_cb(CURL *e, curl_socket_t s, int what, void *cbp, void *sockp)
 
 
 /* CURLOPT_WRITEFUNCTION */
-static size_t write_cb(void *ptr _Unused, size_t size, size_t nmemb,
-                       void *data)
+static size_t write_cb(void *ptr, size_t size, size_t nmemb, void *data)
 {
-  size_t realsize = size * nmemb;
-  ConnInfo *conn _Unused = (ConnInfo*) data;
-
-  return realsize;
+  (void)ptr;
+  (void)data;
+  return size * nmemb;
 }
 
 
 /* CURLOPT_PROGRESSFUNCTION */
-static int prog_cb(void *p, double dltotal, double dlnow, double ult _Unused,
-                   double uln _Unused)
+static int prog_cb(void *p, double dltotal, double dlnow, double ult,
+                   double uln)
 {
   ConnInfo *conn = (ConnInfo *)p;
+  (void)ult;
+  (void)uln;
 
   fprintf(MSG_OUT, "Progress: %s (%g/%g)\n", conn->url, dlnow, dltotal);
   return 0;
@@ -461,14 +462,14 @@ void SignalHandler(int signo)
   }
 }
 
-int main(int argc _Unused, char **argv _Unused)
+int main(int argc, char **argv)
 {
   GlobalInfo g;
-  int err;
-  int idx;
   struct itimerspec its;
   struct epoll_event ev;
   struct epoll_event events[10];
+  (void)argc;
+  (void)argv;
 
   g_should_exit_ = 0;
   signal(SIGINT, SignalHandler);
@@ -510,11 +511,9 @@ int main(int argc _Unused, char **argv _Unused)
   fprintf(MSG_OUT, "Entering wait loop\n");
   fflush(MSG_OUT);
   while(!g_should_exit_) {
-    /* TODO(josh): use epoll_pwait to avoid a race on the signal. Mask the
-     * signal before the while loop, and then re-enable the signal during
-     * epoll wait. Mask at the end of the loop. */
-    err = epoll_wait(g.epfd, events, sizeof(events)/sizeof(struct epoll_event),
-                     10000);
+    int idx;
+    int err = epoll_wait(g.epfd, events,
+                         sizeof(events)/sizeof(struct epoll_event), 10000);
     if(err == -1) {
       if(errno == EINTR) {
         fprintf(MSG_OUT, "note: wait interrupted\n");
@@ -543,5 +542,6 @@ int main(int argc _Unused, char **argv _Unused)
   fflush(MSG_OUT);
 
   curl_multi_cleanup(g.multi);
+  clean_fifo(&g);
   return 0;
 }
index c0c230b..4d77d52 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -119,13 +119,12 @@ static int multi_timer_cb(CURLM *multi, long timeout_ms, GlobalInfo *g)
 {
   DPRINT("%s %li\n", __PRETTY_FUNCTION__,  timeout_ms);
   ev_timer_stop(g->loop, &g->timer_event);
-  if(timeout_ms > 0) {
+  if(timeout_ms >= 0) {
+    /* -1 means delete, other values are timeout times in milliseconds */
     double  t = timeout_ms / 1000;
     ev_timer_init(&g->timer_event, timer_cb, t, 0.);
     ev_timer_start(g->loop, &g->timer_event);
   }
-  else if(timeout_ms == 0)
-    timer_cb(g->loop, &g->timer_event, 0);
   return 0;
 }
 
@@ -204,8 +203,8 @@ static void event_cb(EV_P_ struct ev_io *w, int revents)
   GlobalInfo *g = (GlobalInfo*) w->data;
   CURLMcode rc;
 
-  int action = (revents&EV_READ?CURL_POLL_IN:0)|
-    (revents&EV_WRITE?CURL_POLL_OUT:0);
+  int action = ((revents & EV_READ) ? CURL_POLL_IN : 0) |
+    ((revents & EV_WRITE) ? CURL_POLL_OUT : 0);
   rc = curl_multi_socket_action(g->multi, w->fd, action, &g->still_running);
   mcode_or_die("event_cb: curl_multi_socket_action", rc);
   check_multi_info(g);
@@ -248,7 +247,8 @@ static void setsock(SockInfo *f, curl_socket_t s, CURL *e, int act,
 {
   printf("%s  \n", __PRETTY_FUNCTION__);
 
-  int kind = (act&CURL_POLL_IN?EV_READ:0)|(act&CURL_POLL_OUT?EV_WRITE:0);
+  int kind = ((act & CURL_POLL_IN) ? EV_READ : 0) |
+             ((act & CURL_POLL_OUT) ? EV_WRITE : 0);
 
   f->sockfd = s;
   f->action = act;
@@ -422,7 +422,6 @@ static int init_fifo(GlobalInfo *g)
 int main(int argc, char **argv)
 {
   GlobalInfo g;
-  CURLMcode rc;
   (void)argc;
   (void)argv;
 
index 0ac113d..bd0adf2 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -124,8 +124,10 @@ int main(void)
     servaddr.sin_port   = htons(PORTNUM);
 
     servaddr.sin_addr.s_addr = inet_addr(IPADDR);
-    if(INADDR_NONE == servaddr.sin_addr.s_addr)
+    if(INADDR_NONE == servaddr.sin_addr.s_addr) {
+      close(sockfd);
       return 2;
+    }
 
     if(connect(sockfd, (struct sockaddr *) &servaddr, sizeof(servaddr)) ==
        -1) {
@@ -157,10 +159,16 @@ int main(void)
 
     curl_easy_cleanup(curl);
 
+    close(sockfd);
+
     if(res) {
       printf("libcurl error: %d\n", res);
       return 4;
     }
   }
+
+#ifdef WIN32
+  WSACleanup();
+#endif
   return 0;
 }
index 8128608..0689275 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
index f1706fb..a11a522 100644 (file)
@@ -13,7 +13,7 @@
  * See the main() function at the bottom that shows an app that retrieves from
  * a specified url using fgets() and fread() and saves as two output files.
  *
- * Copyright (c) 2003, 2017 Simtec Electronics
+ * Copyright (c) 2003 - 2019 Simtec Electronics
  *
  * Re-implemented by Vincent Sanders <vince@kyllikki.org> with extensive
  * reference to original curl example code
@@ -211,7 +211,7 @@ static int fill_buffer(URL_FILE *file, size_t want)
 static int use_buffer(URL_FILE *file, size_t want)
 {
   /* sort out buffer */
-  if((file->buffer_pos - want) <= 0) {
+  if(file->buffer_pos <= want) {
     /* ditch buffer - write will recreate */
     free(file->buffer);
     file->buffer = NULL;
index f249bc1..c7ed23f 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -41,8 +41,6 @@ static size_t write_it(char *buff, size_t size, size_t nmemb,
 
 int main(int argc, char **argv)
 {
-  int rc = CURLE_OK;
-
   /* curl easy handle */
   CURL *handle;
 
@@ -50,7 +48,7 @@ int main(int argc, char **argv)
   struct callback_data data = { 0 };
 
   /* global initialization */
-  rc = curl_global_init(CURL_GLOBAL_ALL);
+  int rc = curl_global_init(CURL_GLOBAL_ALL);
   if(rc)
     return rc;
 
index a2a7da0..fc7ab4a 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -36,7 +36,7 @@ struct FtpFile {
 static size_t my_fwrite(void *buffer, size_t size, size_t nmemb, void *stream)
 {
   struct FtpFile *out = (struct FtpFile *)stream;
-  if(out && !out->stream) {
+  if(!out->stream) {
     /* open file for writing */
     out->stream = fopen(out->filename, "wb");
     if(!out->stream)
index 277e52b..db16408 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -56,7 +56,6 @@ int main(void)
     curl_easy_setopt(curl, CURLOPT_NOBODY, 1L);
     /* Ask for filetime */
     curl_easy_setopt(curl, CURLOPT_FILETIME, 1L);
-    /* No header output: TODO 14.1 http-style HEAD output for ftp */
     curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, throw_away);
     curl_easy_setopt(curl, CURLOPT_HEADER, 0L);
     /* Switch on full protocol/debug output */
index fb7489f..91162e6 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2015, 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -38,7 +38,7 @@ static size_t my_fwrite(void *buffer, size_t size, size_t nmemb,
                         void *stream)
 {
   struct FtpFile *out = (struct FtpFile *)stream;
-  if(out && !out->stream) {
+  if(!out->stream) {
     /* open file for writing */
     out->stream = fopen(out->filename, "wb");
     if(!out->stream)
index bd77bb1..25e292d 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
index fd643fc..1fa3b59 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -163,16 +163,14 @@ static int update_timeout_cb(CURLM *multi, long timeout_ms, void *userp)
   MSG_OUT("*** update_timeout_cb %ld => %ld:%ld ***\n",
           timeout_ms, timeout.tv_sec, timeout.tv_usec);
 
-  /* TODO
-   *
-   * if timeout_ms is 0, call curl_multi_socket_action() at once!
-   *
+  /*
    * if timeout_ms is -1, just delete the timer
    *
-   * for all other values of timeout_ms, this should set or *update*
-   * the timer to the new value
+   * For other values of timeout_ms, this should set or *update* the timer to
+   * the new value
    */
-  g->timer_event = g_timeout_add(timeout_ms, timer_cb, g);
+  if(timeout_ms >= 0)
+    g->timer_event = g_timeout_add(timeout_ms, timer_cb, g);
   return 0;
 }
 
@@ -184,8 +182,8 @@ static gboolean event_cb(GIOChannel *ch, GIOCondition condition, gpointer data)
   int fd = g_io_channel_unix_get_fd(ch);
 
   int action =
-    (condition & G_IO_IN ? CURL_CSELECT_IN : 0) |
-    (condition & G_IO_OUT ? CURL_CSELECT_OUT : 0);
+    ((condition & G_IO_IN) ? CURL_CSELECT_IN : 0) |
+    ((condition & G_IO_OUT) ? CURL_CSELECT_OUT : 0);
 
   rc = curl_multi_socket_action(g->multi, fd, action, &g->still_running);
   mcode_or_die("event_cb: curl_multi_socket_action", rc);
@@ -220,7 +218,8 @@ static void setsock(SockInfo *f, curl_socket_t s, CURL *e, int act,
                     GlobalInfo *g)
 {
   GIOCondition kind =
-    (act&CURL_POLL_IN?G_IO_IN:0)|(act&CURL_POLL_OUT?G_IO_OUT:0);
+    ((act & CURL_POLL_IN) ? G_IO_IN : 0) |
+    ((act & CURL_POLL_OUT) ? G_IO_OUT : 0);
 
   f->sockfd = s;
   f->action = act;
@@ -257,8 +256,8 @@ static int sock_cb(CURL *e, curl_socket_t s, int what, void *cbp, void *sockp)
   else {
     if(!fdp) {
       MSG_OUT("Adding data: %s%s\n",
-              what&CURL_POLL_IN?"READ":"",
-              what&CURL_POLL_OUT?"WRITE":"");
+              (what & CURL_POLL_IN) ? "READ" : "",
+              (what & CURL_POLL_OUT) ? "WRITE" : "");
       addsock(s, e, what, g);
     }
     else {
@@ -413,7 +412,6 @@ int init_fifo(void)
 int main(int argc, char **argv)
 {
   GlobalInfo *g;
-  CURLMcode rc;
   GMainLoop*gmain;
   int fd;
   GIOChannel* ch;
index fec62b8..c02659b 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -72,12 +72,6 @@ callback.
 #include <errno.h>
 #include <sys/cdefs.h>
 
-#ifdef __GNUC__
-#define _Unused __attribute__((unused))
-#else
-#define _Unused
-#endif
-
 #define MSG_OUT stdout /* Send info to stdout, change to stderr if you want */
 
 
@@ -115,7 +109,7 @@ typedef struct _SockInfo
   GlobalInfo *global;
 } SockInfo;
 
-#define __case(code) \
+#define mycase(code) \
   case code: s = __STRING(code)
 
 /* Die if we get a bad CURLMcode somewhere */
@@ -124,14 +118,14 @@ static void mcode_or_die(const char *where, CURLMcode code)
   if(CURLM_OK != code) {
     const char *s;
     switch(code) {
-      __case(CURLM_BAD_HANDLE); break;
-      __case(CURLM_BAD_EASY_HANDLE); break;
-      __case(CURLM_OUT_OF_MEMORY); break;
-      __case(CURLM_INTERNAL_ERROR); break;
-      __case(CURLM_UNKNOWN_OPTION); break;
-      __case(CURLM_LAST); break;
+      mycase(CURLM_BAD_HANDLE); break;
+      mycase(CURLM_BAD_EASY_HANDLE); break;
+      mycase(CURLM_OUT_OF_MEMORY); break;
+      mycase(CURLM_INTERNAL_ERROR); break;
+      mycase(CURLM_UNKNOWN_OPTION); break;
+      mycase(CURLM_LAST); break;
       default: s = "CURLM_unknown"; break;
-      __case(CURLM_BAD_SOCKET);
+      mycase(CURLM_BAD_SOCKET);
       fprintf(MSG_OUT, "ERROR: %s returns %s\n", where, s);
       /* ignore this error */
       return;
@@ -143,32 +137,24 @@ static void mcode_or_die(const char *where, CURLMcode code)
 
 
 /* Update the event timer after curl_multi library calls */
-static int multi_timer_cb(CURLM *multi _Unused, long timeout_ms, GlobalInfo *g)
+static int multi_timer_cb(CURLM *multi, long timeout_ms, GlobalInfo *g)
 {
   struct timeval timeout;
-  CURLMcode rc;
+  (void)multi;
 
   timeout.tv_sec = timeout_ms/1000;
   timeout.tv_usec = (timeout_ms%1000)*1000;
   fprintf(MSG_OUT, "multi_timer_cb: Setting timeout to %ld ms\n", timeout_ms);
 
-  /* TODO
-   *
-   * if timeout_ms is 0, call curl_multi_socket_action() at once!
-   *
+  /*
    * if timeout_ms is -1, just delete the timer
    *
-   * for all other values of timeout_ms, this should set or *update*
-   * the timer to the new value
+   * For all other values of timeout_ms, this should set or *update* the timer
+   * to the new value
    */
-  if(timeout_ms == 0) {
-    rc = curl_multi_socket_action(g->multi,
-                                  CURL_SOCKET_TIMEOUT, 0, &g->still_running);
-    mcode_or_die("multi_timer_cb: curl_multi_socket_action", rc);
-  }
-  else if(timeout_ms == -1)
+  if(timeout_ms == -1)
     evtimer_del(&g->timer_event);
-  else
+  else /* includes timeout zero */
     evtimer_add(&g->timer_event, &timeout);
   return 0;
 }
@@ -211,8 +197,8 @@ static void event_cb(int fd, short kind, void *userp)
   CURLMcode rc;
 
   int action =
-    (kind & EV_READ ? CURL_CSELECT_IN : 0) |
-    (kind & EV_WRITE ? CURL_CSELECT_OUT : 0);
+    ((kind & EV_READ) ? CURL_CSELECT_IN : 0) |
+    ((kind & EV_WRITE) ? CURL_CSELECT_OUT : 0);
 
   rc = curl_multi_socket_action(g->multi, fd, action, &g->still_running);
   mcode_or_die("event_cb: curl_multi_socket_action", rc);
@@ -229,10 +215,12 @@ static void event_cb(int fd, short kind, void *userp)
 
 
 /* Called by libevent when our timeout expires */
-static void timer_cb(int fd _Unused, short kind _Unused, void *userp)
+static void timer_cb(int fd, short kind, void *userp)
 {
   GlobalInfo *g = (GlobalInfo *)userp;
   CURLMcode rc;
+  (void)fd;
+  (void)kind;
 
   rc = curl_multi_socket_action(g->multi,
                                   CURL_SOCKET_TIMEOUT, 0, &g->still_running);
@@ -258,7 +246,8 @@ static void setsock(SockInfo *f, curl_socket_t s, CURL *e, int act,
                     GlobalInfo *g)
 {
   int kind =
-     (act&CURL_POLL_IN?EV_READ:0)|(act&CURL_POLL_OUT?EV_WRITE:0)|EV_PERSIST;
+     ((act & CURL_POLL_IN) ? EV_READ : 0) |
+     ((act & CURL_POLL_OUT) ? EV_WRITE : 0) | EV_PERSIST;
 
   f->sockfd = s;
   f->action = act;
@@ -311,21 +300,21 @@ static int sock_cb(CURL *e, curl_socket_t s, int what, void *cbp, void *sockp)
 
 
 /* CURLOPT_WRITEFUNCTION */
-static size_t write_cb(void *ptr _Unused, size_t size, size_t nmemb,
-                       void *data)
+static size_t write_cb(void *ptr, size_t size, size_t nmemb, void *data)
 {
-  size_t realsize = size * nmemb;
-  ConnInfo *conn _Unused = (ConnInfo*) data;
-
-  return realsize;
+  (void)ptr;
+  (void)data;
+  return size * nmemb;
 }
 
 
 /* CURLOPT_PROGRESSFUNCTION */
-static int prog_cb(void *p, double dltotal, double dlnow, double ult _Unused,
-                   double uln _Unused)
+static int prog_cb(void *p, double dltotal, double dlnow, double ult,
+                   double uln)
 {
   ConnInfo *conn = (ConnInfo *)p;
+  (void)ult;
+  (void)uln;
 
   fprintf(MSG_OUT, "Progress: %s (%g/%g)\n", conn->url, dlnow, dltotal);
   return 0;
@@ -368,12 +357,14 @@ static void new_conn(char *url, GlobalInfo *g)
 }
 
 /* This gets called whenever data is received from the fifo */
-static void fifo_cb(int fd _Unused, short event _Unused, void *arg)
+static void fifo_cb(int fd, short event, void *arg)
 {
   char s[1024];
   long int rv = 0;
   int n = 0;
   GlobalInfo *g = (GlobalInfo *)arg;
+  (void)fd;
+  (void)event;
 
   do {
     s[0]='\0';
@@ -434,9 +425,11 @@ static void clean_fifo(GlobalInfo *g)
     unlink(fifo);
 }
 
-int main(int argc _Unused, char **argv _Unused)
+int main(int argc, char **argv)
 {
   GlobalInfo g;
+  (void)argc;
+  (void)argv;
 
   memset(&g, 0, sizeof(GlobalInfo));
   g.evbase = event_base_new();
index aa2b438..c04733c 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 2012 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 2012 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
index 2f4500f..1cfb273 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -74,13 +74,14 @@ void dumpNode(TidyDoc doc, TidyNode tnod, int indent)
 
 int main(int argc, char **argv)
 {
-  CURL *curl;
-  char curl_errbuf[CURL_ERROR_SIZE];
-  TidyDoc tdoc;
-  TidyBuffer docbuf = {0};
-  TidyBuffer tidy_errbuf = {0};
-  int err;
   if(argc == 2) {
+    CURL *curl;
+    char curl_errbuf[CURL_ERROR_SIZE];
+    TidyDoc tdoc;
+    TidyBuffer docbuf = {0};
+    TidyBuffer tidy_errbuf = {0};
+    int err;
+
     curl = curl_easy_init();
     curl_easy_setopt(curl, CURLOPT_URL, argv[1]);
     curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, curl_errbuf);
index 8148888..e31e3e3 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -136,9 +136,9 @@ static void StartElement(void *voidContext,
                          const xmlChar *name,
                          const xmlChar **attributes)
 {
-  Context *context = (Context *)voidContext;
+  Context *context = static_cast<Context *>(voidContext);
 
-  if(COMPARE((char *)name, "TITLE")) {
+  if(COMPARE(reinterpret_cast<char *>(name), "TITLE")) {
     context->title = "";
     context->addTitle = true;
   }
@@ -152,9 +152,9 @@ static void StartElement(void *voidContext,
 static void EndElement(void *voidContext,
                        const xmlChar *name)
 {
-  Context *context = (Context *)voidContext;
+  Context *context = static_cast<Context *>(voidContext);
 
-  if(COMPARE((char *)name, "TITLE"))
+  if(COMPARE(reinterpret_cast<char *>(name), "TITLE"))
     context->addTitle = false;
 }
 
@@ -167,7 +167,7 @@ static void handleCharacters(Context *context,
                              int length)
 {
   if(context->addTitle)
-    context->title.append((char *)chars, length);
+    context->title.append(reinterpret_cast<char *>(chars), length);
 }
 
 //
@@ -178,7 +178,7 @@ static void Characters(void *voidContext,
                        const xmlChar *chars,
                        int length)
 {
-  Context *context = (Context *)voidContext;
+  Context *context = static_cast<Context *>(voidContext);
 
   handleCharacters(context, chars, length);
 }
@@ -191,7 +191,7 @@ static void cdata(void *voidContext,
                   const xmlChar *chars,
                   int length)
 {
-  Context *context = (Context *)voidContext;
+  Context *context = static_cast<Context *>(voidContext);
 
   handleCharacters(context, chars, length);
 }
index 0175452..b4c7d37 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
index b4ac7c9..333b7df 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
 #define CURLPIPE_MULTIPLEX 0
 #endif
 
-#define NUM_HANDLES 1000
-
-static void *curl_hnd[NUM_HANDLES];
-static int num_transfers;
+struct transfer {
+  CURL *easy;
+  unsigned int num;
+  FILE *out;
+};
 
-/* a handle to number lookup, highly ineffective when we do many
-   transfers... */
-static int hnd2num(CURL *hnd)
-{
-  int i;
-  for(i = 0; i< num_transfers; i++) {
-    if(curl_hnd[i] == hnd)
-      return i;
-  }
-  return 0; /* weird, but just a fail-safe */
-}
+#define NUM_HANDLES 1000
 
 static
 void dump(const char *text, int num, unsigned char *ptr, size_t size,
@@ -113,12 +104,13 @@ int my_trace(CURL *handle, curl_infotype type,
              void *userp)
 {
   const char *text;
-  int num = hnd2num(handle);
+  struct transfer *t = (struct transfer *)userp;
+  unsigned int num = t->num;
   (void)handle; /* prevent compiler warning */
-  (void)userp;
+
   switch(type) {
   case CURLINFO_TEXT:
-    fprintf(stderr, "== %d Info: %s", num, data);
+    fprintf(stderr, "== %u Info: %s", num, data);
     /* FALLTHROUGH */
   default: /* in case a new one is introduced to shock us */
     return 0;
@@ -147,17 +139,19 @@ int my_trace(CURL *handle, curl_infotype type,
   return 0;
 }
 
-static void setup(CURL *hnd, int num)
+static void setup(struct transfer *t, int num)
 {
-  FILE *out;
   char filename[128];
+  CURL *hnd;
+
+  hnd = t->easy = curl_easy_init();
 
   snprintf(filename, 128, "dl-%d", num);
 
-  out = fopen(filename, "wb");
+  t->out = fopen(filename, "wb");
 
   /* write to this file */
-  curl_easy_setopt(hnd, CURLOPT_WRITEDATA, out);
+  curl_easy_setopt(hnd, CURLOPT_WRITEDATA, t->out);
 
   /* set the same URL */
   curl_easy_setopt(hnd, CURLOPT_URL, "https://localhost:8443/index.html");
@@ -165,6 +159,7 @@ static void setup(CURL *hnd, int num)
   /* please be verbose */
   curl_easy_setopt(hnd, CURLOPT_VERBOSE, 1L);
   curl_easy_setopt(hnd, CURLOPT_DEBUGFUNCTION, my_trace);
+  curl_easy_setopt(hnd, CURLOPT_DEBUGDATA, t);
 
   /* HTTP/2 please */
   curl_easy_setopt(hnd, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_2_0);
@@ -177,37 +172,35 @@ static void setup(CURL *hnd, int num)
   /* wait for pipe connection to confirm */
   curl_easy_setopt(hnd, CURLOPT_PIPEWAIT, 1L);
 #endif
-
-  curl_hnd[num] = hnd;
 }
 
 /*
- * Simply download two files over HTTP/2, using the same physical connection!
+ * Download many transfers over HTTP/2, using the same connection!
  */
 int main(int argc, char **argv)
 {
-  CURL *easy[NUM_HANDLES];
+  struct transfer trans[NUM_HANDLES];
   CURLM *multi_handle;
   int i;
   int still_running = 0; /* keep number of running handles */
-
-  if(argc > 1)
+  int num_transfers;
+  if(argc > 1) {
     /* if given a number, do that many transfers */
     num_transfers = atoi(argv[1]);
-
-  if(!num_transfers || (num_transfers > NUM_HANDLES))
-    num_transfers = 3; /* a suitable low default */
+    if((num_transfers < 1) || (num_transfers > NUM_HANDLES))
+      num_transfers = 3; /* a suitable low default */
+  }
+  else
+    num_transfers = 3; /* suitable default */
 
   /* init a multi stack */
   multi_handle = curl_multi_init();
 
-  for(i = 0; i<num_transfers; i++) {
-    easy[i] = curl_easy_init();
-    /* set options */
-    setup(easy[i], i);
+  for(i = 0; i < num_transfers; i++) {
+    setup(&trans[i], i);
 
     /* add the individual transfer */
-    curl_multi_add_handle(multi_handle, easy[i]);
+    curl_multi_add_handle(multi_handle, trans[i].easy);
   }
 
   curl_multi_setopt(multi_handle, CURLMOPT_PIPELINING, CURLPIPE_MULTIPLEX);
@@ -286,10 +279,12 @@ int main(int argc, char **argv)
     }
   }
 
-  curl_multi_cleanup(multi_handle);
+  for(i = 0; i < num_transfers; i++) {
+    curl_multi_remove_handle(multi_handle, trans[i].easy);
+    curl_easy_cleanup(trans[i].easy);
+  }
 
-  for(i = 0; i<num_transfers; i++)
-    curl_easy_cleanup(easy[i]);
+  curl_multi_cleanup(multi_handle);
 
   return 0;
 }
index 66abb0f..63dff4c 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -128,9 +128,12 @@ int my_trace(CURL *handle, curl_infotype type,
 
 #define OUTPUTFILE "dl"
 
-static void setup(CURL *hnd)
+static int setup(CURL *hnd)
 {
   FILE *out = fopen(OUTPUTFILE, "wb");
+  if(!out)
+    /* failed */
+    return 1;
 
   /* write to this file */
   curl_easy_setopt(hnd, CURLOPT_WRITEDATA, out);
@@ -153,7 +156,7 @@ static void setup(CURL *hnd)
   /* wait for pipe connection to confirm */
   curl_easy_setopt(hnd, CURLOPT_PIPEWAIT, 1L);
 #endif
-
+  return 0; /* all is good */
 }
 
 /* called when there's an incoming push */
@@ -176,6 +179,11 @@ static int server_push_callback(CURL *parent,
 
   /* here's a new stream, save it in a new file for each new push */
   out = fopen(filename, "wb");
+  if(!out) {
+    /* if we can't save it, deny it */
+    fprintf(stderr, "Failed to create output file for push\n");
+    return CURL_PUSH_DENY;
+  }
 
   /* write to this file */
   curl_easy_setopt(easy, CURLOPT_WRITEDATA, out);
@@ -215,7 +223,10 @@ int main(void)
   easy = curl_easy_init();
 
   /* set options */
-  setup(easy);
+  if(setup(easy)) {
+    fprintf(stderr, "failed\n");
+    return 1;
+  }
 
   /* add the easy transfer */
   curl_multi_add_handle(multi_handle, easy);
index 2717998..8f1fd4a 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
 
 #define NUM_HANDLES 1000
 
-static void *curl_hnd[NUM_HANDLES];
-static int num_transfers;
-
-/* a handle to number lookup, highly ineffective when we do many
-   transfers... */
-static int hnd2num(CURL *hnd)
-{
-  int i;
-  for(i = 0; i< num_transfers; i++) {
-    if(curl_hnd[i] == hnd)
-      return i;
-  }
-  return 0; /* weird, but just a fail-safe */
-}
+struct input {
+  FILE *in;
+  size_t bytes_read; /* count up */
+  CURL *hnd;
+  int num;
+};
 
 static
 void dump(const char *text, int num, unsigned char *ptr, size_t size,
@@ -115,15 +107,14 @@ int my_trace(CURL *handle, curl_infotype type,
 {
   char timebuf[60];
   const char *text;
-  int num = hnd2num(handle);
+  struct input *i = (struct input *)userp;
+  int num = i->num;
   static time_t epoch_offset;
   static int    known_offset;
   struct timeval tv;
   time_t secs;
   struct tm *now;
-
   (void)handle; /* prevent compiler warning */
-  (void)userp;
 
   gettimeofday(&tv, NULL);
   if(!known_offset) {
@@ -166,12 +157,6 @@ int my_trace(CURL *handle, curl_infotype type,
   return 0;
 }
 
-struct input {
-  FILE *in;
-  size_t bytes_read; /* count up */
-  CURL *hnd;
-};
-
 static size_t read_callback(void *ptr, size_t size, size_t nmemb, void *userp)
 {
   struct input *i = userp;
@@ -180,16 +165,17 @@ static size_t read_callback(void *ptr, size_t size, size_t nmemb, void *userp)
   return retcode;
 }
 
-static struct input indata[NUM_HANDLES];
-
-static void setup(CURL *hnd, int num, const char *upload)
+static void setup(struct input *i, int num, const char *upload)
 {
   FILE *out;
   char url[256];
   char filename[128];
   struct stat file_info;
   curl_off_t uploadsize;
+  CURL *hnd;
 
+  hnd = i->hnd = curl_easy_init();
+  i->num = num;
   snprintf(filename, 128, "dl-%d", num);
   out = fopen(filename, "wb");
 
@@ -199,8 +185,7 @@ static void setup(CURL *hnd, int num, const char *upload)
   stat(upload, &file_info);
   uploadsize = file_info.st_size;
 
-  indata[num].in = fopen(upload, "rb");
-  indata[num].hnd = hnd;
+  i->in = fopen(upload, "rb");
 
   /* write to this file */
   curl_easy_setopt(hnd, CURLOPT_WRITEDATA, out);
@@ -208,7 +193,7 @@ static void setup(CURL *hnd, int num, const char *upload)
   /* we want to use our own read function */
   curl_easy_setopt(hnd, CURLOPT_READFUNCTION, read_callback);
   /* read from this file */
-  curl_easy_setopt(hnd, CURLOPT_READDATA, &indata[num]);
+  curl_easy_setopt(hnd, CURLOPT_READDATA, i);
   /* provide the size of the upload */
   curl_easy_setopt(hnd, CURLOPT_INFILESIZE_LARGE, uploadsize);
 
@@ -221,6 +206,7 @@ static void setup(CURL *hnd, int num, const char *upload)
   /* please be verbose */
   curl_easy_setopt(hnd, CURLOPT_VERBOSE, 1L);
   curl_easy_setopt(hnd, CURLOPT_DEBUGFUNCTION, my_trace);
+  curl_easy_setopt(hnd, CURLOPT_DEBUGDATA, i);
 
   /* HTTP/2 please */
   curl_easy_setopt(hnd, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_2_0);
@@ -233,8 +219,6 @@ static void setup(CURL *hnd, int num, const char *upload)
   /* wait for pipe connection to confirm */
   curl_easy_setopt(hnd, CURLOPT_PIPEWAIT, 1L);
 #endif
-
-  curl_hnd[num] = hnd;
 }
 
 /*
@@ -242,33 +226,35 @@ static void setup(CURL *hnd, int num, const char *upload)
  */
 int main(int argc, char **argv)
 {
-  CURL *easy[NUM_HANDLES];
+  struct input trans[NUM_HANDLES];
   CURLM *multi_handle;
   int i;
   int still_running = 0; /* keep number of running handles */
   const char *filename = "index.html";
+  int num_transfers;
 
-  if(argc > 1)
+  if(argc > 1) {
     /* if given a number, do that many transfers */
     num_transfers = atoi(argv[1]);
 
-  if(argc > 2)
-    /* if given a file name, upload this! */
-    filename = argv[2];
+    if(!num_transfers || (num_transfers > NUM_HANDLES))
+      num_transfers = 3; /* a suitable low default */
 
-  if(!num_transfers || (num_transfers > NUM_HANDLES))
-    num_transfers = 3; /* a suitable low default */
+    if(argc > 2)
+      /* if given a file name, upload this! */
+      filename = argv[2];
+  }
+  else
+    num_transfers = 3;
 
   /* init a multi stack */
   multi_handle = curl_multi_init();
 
   for(i = 0; i<num_transfers; i++) {
-    easy[i] = curl_easy_init();
-    /* set options */
-    setup(easy[i], i, filename);
+    setup(&trans[i], i, filename);
 
     /* add the individual transfer */
-    curl_multi_add_handle(multi_handle, easy[i]);
+    curl_multi_add_handle(multi_handle, trans[i].hnd);
   }
 
   curl_multi_setopt(multi_handle, CURLMOPT_PIPELINING, CURLPIPE_MULTIPLEX);
@@ -352,8 +338,10 @@ int main(int argc, char **argv)
 
   curl_multi_cleanup(multi_handle);
 
-  for(i = 0; i<num_transfers; i++)
-    curl_easy_cleanup(easy[i]);
+  for(i = 0; i<num_transfers; i++) {
+    curl_multi_remove_handle(multi_handle, trans[i].hnd);
+    curl_easy_cleanup(trans[i].hnd);
+  }
 
   return 0;
 }
diff --git a/docs/examples/http3-present.c b/docs/examples/http3-present.c
new file mode 100644 (file)
index 0000000..857952d
--- /dev/null
@@ -0,0 +1,47 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+/* <DESC>
+ * Checks if HTTP/3 support is present in libcurl.
+ * </DESC>
+ */
+#include <stdio.h>
+#include <curl/curl.h>
+
+int main(void)
+{
+  curl_version_info_data *ver;
+
+  curl_global_init(CURL_GLOBAL_ALL);
+
+  ver = curl_version_info(CURLVERSION_NOW);
+  if(ver->features & CURL_VERSION_HTTP2)
+    printf("HTTP/2 support is present\n");
+
+  if(ver->features & CURL_VERSION_HTTP3)
+    printf("HTTP/3 support is present\n");
+
+  if(ver->features & CURL_VERSION_ALTSVC)
+    printf("Alt-svc support is present\n");
+
+  curl_global_cleanup();
+  return 0;
+}
diff --git a/docs/examples/http3.c b/docs/examples/http3.c
new file mode 100644 (file)
index 0000000..240a7ed
--- /dev/null
@@ -0,0 +1,54 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+/* <DESC>
+ * Very simple HTTP/3 GET
+ * </DESC>
+ */
+#include <stdio.h>
+#include <curl/curl.h>
+
+int main(void)
+{
+  CURL *curl;
+  CURLcode res;
+
+  curl = curl_easy_init();
+  if(curl) {
+    curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
+
+    /* Forcing HTTP/3 will make the connection fail if the server isn't
+       accessible over QUIC + HTTP/3 on the given host and port.
+       Consider using CURLOPT_ALTSVC instead! */
+    curl_easy_setopt(curl, CURLOPT_HTTP_VERSION, (long)CURL_HTTP_VERSION_3);
+
+    /* Perform the request, res will get the return code */
+    res = curl_easy_perform(curl);
+    /* Check for errors */
+    if(res != CURLE_OK)
+      fprintf(stderr, "curl_easy_perform() failed: %s\n",
+              curl_easy_strerror(res));
+
+    /* always cleanup */
+    curl_easy_cleanup(curl);
+  }
+  return 0;
+}
index d22b7bc..6712f8c 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -49,7 +49,7 @@ int main(void)
     chunk = curl_slist_append(chunk, "X-silly-header;");
 
     /* set our custom set of headers */
-    res = curl_easy_setopt(curl, CURLOPT_HTTPHEADER, chunk);
+    curl_easy_setopt(curl, CURLOPT_HTTPHEADER, chunk);
 
     curl_easy_setopt(curl, CURLOPT_URL, "localhost");
     curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
index cca83fe..07b417f 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
index bbf9fe4..ab05433 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -85,14 +85,15 @@ int main(void)
 {
   CURL *curl;
   CURLcode res = CURLE_OK;
-  const char **p;
-  long infilesize;
-  struct upload_status upload_ctx;
-
-  upload_ctx.lines_read = 0;
 
   curl = curl_easy_init();
   if(curl) {
+    const char **p;
+    long infilesize;
+    struct upload_status upload_ctx;
+
+    upload_ctx.lines_read = 0;
+
     /* Set username and password */
     curl_easy_setopt(curl, CURLOPT_USERNAME, "user");
     curl_easy_setopt(curl, CURLOPT_PASSWORD, "secret");
diff --git a/docs/examples/imap-authzid.c b/docs/examples/imap-authzid.c
new file mode 100644 (file)
index 0000000..bfe7d71
--- /dev/null
@@ -0,0 +1,71 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+
+/* <DESC>
+ * IMAP example showing how to retreieve e-mails from a shared mailed box
+ * </DESC>
+ */
+
+#include <stdio.h>
+#include <curl/curl.h>
+
+/* This is a simple example showing how to fetch mail using libcurl's IMAP
+ * capabilities.
+ *
+ * Note that this example requires libcurl 7.66.0 or above.
+ */
+
+int main(void)
+{
+  CURL *curl;
+  CURLcode res = CURLE_OK;
+
+  curl = curl_easy_init();
+  if(curl) {
+    /* Set the username and password */
+    curl_easy_setopt(curl, CURLOPT_USERNAME, "user");
+    curl_easy_setopt(curl, CURLOPT_PASSWORD, "secret");
+
+    /* Set the authorisation identity (identity to act as) */
+    curl_easy_setopt(curl, CURLOPT_SASL_AUTHZID, "shared-mailbox");
+
+    /* Force PLAIN authentication */
+    curl_easy_setopt(curl, CURLOPT_LOGIN_OPTIONS, "AUTH=PLAIN");
+
+    /* This will fetch message 1 from the user's inbox */
+    curl_easy_setopt(curl, CURLOPT_URL,
+                     "imap://imap.example.com/INBOX/;UID=1");
+
+    /* Perform the fetch */
+    res = curl_easy_perform(curl);
+
+    /* Check for errors */
+    if(res != CURLE_OK)
+      fprintf(stderr, "curl_easy_perform() failed: %s\n",
+              curl_easy_strerror(res));
+
+    /* Always cleanup */
+    curl_easy_cleanup(curl);
+  }
+
+  return (int)res;
+}
index 291e1e6..cbd3ebb 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
index d130c3d..c77d46a 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
index 566890e..719919a 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
index 8479457..b08dd42 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
index 78867d8..dc03d0e 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -147,11 +147,11 @@ int main(void)
   /* See how the transfers went */
   while((msg = curl_multi_info_read(multi_handle, &msgs_left))) {
     if(msg->msg == CURLMSG_DONE) {
-      int idx, found = 0;
+      int idx;
 
       /* Find out which handle this message is about */
       for(idx = 0; idx<HANDLECOUNT; idx++) {
-        found = (msg->easy_handle == handles[idx]);
+        int found = (msg->easy_handle == handles[idx]);
         if(found)
           break;
       }
diff --git a/docs/examples/multi-event.c b/docs/examples/multi-event.c
new file mode 100644 (file)
index 0000000..482de8e
--- /dev/null
@@ -0,0 +1,240 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+
+/* <DESC>
+ * multi_socket API using libevent
+ * </DESC>
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <event2/event.h>
+#include <curl/curl.h>
+
+struct event_base *base;
+CURLM *curl_handle;
+struct event *timeout;
+
+typedef struct curl_context_s {
+  struct event *event;
+  curl_socket_t sockfd;
+} curl_context_t;
+
+static void curl_perform(int fd, short event, void *arg);
+
+static curl_context_t* create_curl_context(curl_socket_t sockfd)
+{
+  curl_context_t *context;
+
+  context = (curl_context_t *) malloc(sizeof(*context));
+
+  context->sockfd = sockfd;
+
+  context->event = event_new(base, sockfd, 0, curl_perform, context);
+
+  return context;
+}
+
+static void destroy_curl_context(curl_context_t *context)
+{
+  event_del(context->event);
+  event_free(context->event);
+  free(context);
+}
+
+static void add_download(const char *url, int num)
+{
+  char filename[50];
+  FILE *file;
+  CURL *handle;
+
+  snprintf(filename, 50, "%d.download", num);
+
+  file = fopen(filename, "wb");
+  if(!file) {
+    fprintf(stderr, "Error opening %s\n", filename);
+    return;
+  }
+
+  handle = curl_easy_init();
+  curl_easy_setopt(handle, CURLOPT_WRITEDATA, file);
+  curl_easy_setopt(handle, CURLOPT_PRIVATE, file);
+  curl_easy_setopt(handle, CURLOPT_URL, url);
+  curl_multi_add_handle(curl_handle, handle);
+  fprintf(stderr, "Added download %s -> %s\n", url, filename);
+}
+
+static void check_multi_info(void)
+{
+  char *done_url;
+  CURLMsg *message;
+  int pending;
+  CURL *easy_handle;
+  FILE *file;
+
+  while((message = curl_multi_info_read(curl_handle, &pending))) {
+    switch(message->msg) {
+    case CURLMSG_DONE:
+      /* Do not use message data after calling curl_multi_remove_handle() and
+         curl_easy_cleanup(). As per curl_multi_info_read() docs:
+         "WARNING: The data the returned pointer points to will not survive
+         calling curl_multi_cleanup, curl_multi_remove_handle or
+         curl_easy_cleanup." */
+      easy_handle = message->easy_handle;
+
+      curl_easy_getinfo(easy_handle, CURLINFO_EFFECTIVE_URL, &done_url);
+      curl_easy_getinfo(easy_handle, CURLINFO_PRIVATE, &file);
+      printf("%s DONE\n", done_url);
+
+      curl_multi_remove_handle(curl_handle, easy_handle);
+      curl_easy_cleanup(easy_handle);
+      if(file) {
+        fclose(file);
+      }
+      break;
+
+    default:
+      fprintf(stderr, "CURLMSG default\n");
+      break;
+    }
+  }
+}
+
+static void curl_perform(int fd, short event, void *arg)
+{
+  int running_handles;
+  int flags = 0;
+  curl_context_t *context;
+
+  if(event & EV_READ)
+    flags |= CURL_CSELECT_IN;
+  if(event & EV_WRITE)
+    flags |= CURL_CSELECT_OUT;
+
+  context = (curl_context_t *) arg;
+
+  curl_multi_socket_action(curl_handle, context->sockfd, flags,
+                           &running_handles);
+
+  check_multi_info();
+}
+
+static void on_timeout(evutil_socket_t fd, short events, void *arg)
+{
+  int running_handles;
+  curl_multi_socket_action(curl_handle, CURL_SOCKET_TIMEOUT, 0,
+                           &running_handles);
+  check_multi_info();
+}
+
+static int start_timeout(CURLM *multi, long timeout_ms, void *userp)
+{
+  if(timeout_ms < 0) {
+    evtimer_del(timeout);
+  }
+  else {
+    if(timeout_ms == 0)
+      timeout_ms = 1; /* 0 means directly call socket_action, but we'll do it
+                         in a bit */
+    struct timeval tv;
+    tv.tv_sec = timeout_ms / 1000;
+    tv.tv_usec = (timeout_ms % 1000) * 1000;
+    evtimer_del(timeout);
+    evtimer_add(timeout, &tv);
+  }
+  return 0;
+}
+
+static int handle_socket(CURL *easy, curl_socket_t s, int action, void *userp,
+                  void *socketp)
+{
+  curl_context_t *curl_context;
+  int events = 0;
+
+  switch(action) {
+  case CURL_POLL_IN:
+  case CURL_POLL_OUT:
+  case CURL_POLL_INOUT:
+    curl_context = socketp ?
+      (curl_context_t *) socketp : create_curl_context(s);
+
+    curl_multi_assign(curl_handle, s, (void *) curl_context);
+
+    if(action != CURL_POLL_IN)
+      events |= EV_WRITE;
+    if(action != CURL_POLL_OUT)
+      events |= EV_READ;
+
+    events |= EV_PERSIST;
+
+    event_del(curl_context->event);
+    event_assign(curl_context->event, base, curl_context->sockfd, events,
+      curl_perform, curl_context);
+    event_add(curl_context->event, NULL);
+
+    break;
+  case CURL_POLL_REMOVE:
+    if(socketp) {
+      event_del(((curl_context_t*) socketp)->event);
+      destroy_curl_context((curl_context_t*) socketp);
+      curl_multi_assign(curl_handle, s, NULL);
+    }
+    break;
+  default:
+    abort();
+  }
+
+  return 0;
+}
+
+int main(int argc, char **argv)
+{
+  if(argc <= 1)
+    return 0;
+
+  if(curl_global_init(CURL_GLOBAL_ALL)) {
+    fprintf(stderr, "Could not init curl\n");
+    return 1;
+  }
+
+  base = event_base_new();
+  timeout = evtimer_new(base, on_timeout, NULL);
+
+  curl_handle = curl_multi_init();
+  curl_multi_setopt(curl_handle, CURLMOPT_SOCKETFUNCTION, handle_socket);
+  curl_multi_setopt(curl_handle, CURLMOPT_TIMERFUNCTION, start_timeout);
+
+  while(argc-- > 1) {
+    add_download(argv[argc], argc);
+  }
+
+  event_base_dispatch(base);
+
+  curl_multi_cleanup(curl_handle);
+  event_free(timeout);
+  event_base_free(base);
+
+  libevent_global_shutdown();
+  curl_global_cleanup();
+
+  return 0;
+}
diff --git a/docs/examples/multi-poll.c b/docs/examples/multi-poll.c
new file mode 100644 (file)
index 0000000..255a3d4
--- /dev/null
@@ -0,0 +1,76 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+/* <DESC>
+ * single download with the multi interface's curl_multi_poll
+ * </DESC>
+ */
+
+#include <stdio.h>
+#include <string.h>
+
+/* somewhat unix-specific */
+#include <sys/time.h>
+#include <unistd.h>
+
+/* curl stuff */
+#include <curl/curl.h>
+
+int main(void)
+{
+  CURL *http_handle;
+  CURLM *multi_handle;
+  int still_running = 1; /* keep number of running handles */
+
+  curl_global_init(CURL_GLOBAL_DEFAULT);
+
+  http_handle = curl_easy_init();
+
+  curl_easy_setopt(http_handle, CURLOPT_URL, "https://www.example.com/");
+
+  multi_handle = curl_multi_init();
+
+  curl_multi_add_handle(multi_handle, http_handle);
+
+  while(still_running) {
+    CURLMcode mc; /* curl_multi_poll() return code */
+    int numfds;
+
+    /* we start some action by calling perform right away */
+    mc = curl_multi_perform(multi_handle, &still_running);
+
+    if(still_running)
+      /* wait for activity, timeout or "nothing" */
+      mc = curl_multi_poll(multi_handle, NULL, 0, 1000, &numfds);
+
+    if(mc != CURLM_OK) {
+      fprintf(stderr, "curl_multi_wait() failed, code %d.\n", mc);
+      break;
+    }
+  }
+
+  curl_multi_remove_handle(multi_handle, http_handle);
+  curl_easy_cleanup(http_handle);
+  curl_multi_cleanup(multi_handle);
+  curl_global_cleanup();
+
+  return 0;
+}
index 83ed3f5..da07a16 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -69,16 +69,15 @@ int main(int argc, char **argv)
 {
   pthread_t tid[NUMT];
   int i;
-  int error;
 
   /* Must initialize libcurl before any threads are started */
   curl_global_init(CURL_GLOBAL_ALL);
 
   for(i = 0; i< NUMT; i++) {
-    error = pthread_create(&tid[i],
-                           NULL, /* default attributes please */
-                           pull_one_url,
-                           (void *)urls[i]);
+    int error = pthread_create(&tid[i],
+                               NULL, /* default attributes please */
+                               pull_one_url,
+                               (void *)urls[i]);
     if(0 != error)
       fprintf(stderr, "Couldn't run thread number %d, errno %d\n", i, error);
     else
@@ -87,7 +86,7 @@ int main(int argc, char **argv)
 
   /* now wait for all threads to terminate */
   for(i = 0; i< NUMT; i++) {
-    error = pthread_join(tid[i], NULL);
+    pthread_join(tid[i], NULL);
     fprintf(stderr, "Thread %d terminated\n", i);
   }
 
diff --git a/docs/examples/pop3-authzid.c b/docs/examples/pop3-authzid.c
new file mode 100644 (file)
index 0000000..5736357
--- /dev/null
@@ -0,0 +1,70 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+
+/* <DESC>
+ * POP3 example showing how to retrieve e-mails from a shared mailbox
+ * </DESC>
+ */
+
+#include <stdio.h>
+#include <curl/curl.h>
+
+/* This is a simple example showing how to retrieve mail using libcurl's POP3
+ * capabilities.
+ *
+ * Note that this example requires libcurl 7.66.0 or above.
+ */
+
+int main(void)
+{
+  CURL *curl;
+  CURLcode res = CURLE_OK;
+
+  curl = curl_easy_init();
+  if(curl) {
+    /* Set the username and password */
+    curl_easy_setopt(curl, CURLOPT_USERNAME, "user");
+    curl_easy_setopt(curl, CURLOPT_PASSWORD, "secret");
+
+    /* Set the authorisation identity (identity to act as) */
+    curl_easy_setopt(curl, CURLOPT_SASL_AUTHZID, "shared-mailbox");
+
+    /* Force PLAIN authentication */
+    curl_easy_setopt(curl, CURLOPT_LOGIN_OPTIONS, "AUTH=PLAIN");
+
+    /* This will retrieve message 1 from the user's mailbox */
+    curl_easy_setopt(curl, CURLOPT_URL, "pop3://pop.example.com/1");
+
+    /* Perform the retr */
+    res = curl_easy_perform(curl);
+
+    /* Check for errors */
+    if(res != CURLE_OK)
+      fprintf(stderr, "curl_easy_perform() failed: %s\n",
+              curl_easy_strerror(res));
+
+    /* Always cleanup */
+    curl_easy_cleanup(curl);
+  }
+
+  return (int)res;
+}
index 1449783..ca07515 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
index b530a04..ef3c6d3 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
index bc162d0..6242d32 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
index b36ddb5..61cb424 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
index f0d4e26..b557906 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
index 46a0a45..5b3a8de 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
index f127120..578844a 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
index 25a1e8e..e2718c5 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -67,7 +67,6 @@ int main(void)
   curl_global_init(CURL_GLOBAL_ALL);
   curl = curl_easy_init();
   if(curl) {
-
     curl_easy_setopt(curl, CURLOPT_URL, "https://www.example.org/");
 
     /* send all data to this function  */
@@ -105,11 +104,9 @@ int main(void)
 
     /* always cleanup */
     curl_easy_cleanup(curl);
-
-    free(chunk.memory);
-
-    /* we're done with libcurl, so clean it up */
-    curl_global_cleanup();
   }
+
+  free(chunk.memory);
+  curl_global_cleanup();
   return 0;
 }
index a501ce9..21d2a9f 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -34,7 +34,6 @@
  * <input type="submit" value="send" name="submit">
  * </form>
  *
- * This exact source code has not been verified to work.
  */
 
 #include <stdio.h>
index 2808f7a..b3a1a93 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -34,7 +34,6 @@
  * <input type="submit" value="send" name="submit">
  * </form>
  *
- * This exact source code has not been verified to work.
  */
 
 #include <stdio.h>
index c3b52d6..81a2862 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -31,14 +31,14 @@ int main(void)
 {
   CURL *curl;
   CURLcode res = CURLE_OK;
-  struct curl_slist *host = NULL;
 
   /* Each single name resolve string should be written using the format
      HOST:PORT:ADDRESS where HOST is the name libcurl will try to resolve,
      PORT is the port number of the service where libcurl wants to connect to
      the HOST and ADDRESS is the numerical IP address
    */
-  host = curl_slist_append(NULL, "example.com:443:127.0.0.1");
+  struct curl_slist *host = curl_slist_append(NULL,
+                                              "example.com:443:127.0.0.1");
 
   curl = curl_easy_init();
   if(curl) {
index 75b5d39..1793d9d 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, Jim Hollinger
+ * Copyright (c) 2011 - 2019, Jim Hollinger
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
index 7bfaa51..a81747b 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -90,7 +90,6 @@ static CURLcode my_conv_from_utf8_to_ebcdic(char *buffer, size_t length)
 int main(void)
 {
   CURL *curl;
-  CURLcode res;
 
   curl = curl_easy_init();
   if(curl) {
@@ -104,7 +103,7 @@ int main(void)
     curl_easy_setopt(curl, CURLOPT_CONV_FROM_UTF8_FUNCTION,
                      my_conv_from_utf8_to_ebcdic);
 
-    res = curl_easy_perform(curl);
+    curl_easy_perform(curl);
 
     /* always cleanup */
     curl_easy_cleanup(curl);
index cf764be..c6f1b1a 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -59,12 +59,9 @@ static int wait_on_socket(curl_socket_t sockfd, int for_recv, long timeout_ms)
 int main(void)
 {
   CURL *curl;
-  CURLcode res;
   /* Minimalistic http request */
   const char *request = "GET / HTTP/1.0\r\nHost: example.com\r\n\r\n";
   size_t request_len = strlen(request);
-  curl_socket_t sockfd;
-  size_t nsent_total = 0;
 
   /* A general note of caution here: if you're using curl_easy_recv() or
      curl_easy_send() to implement HTTP or _any_ other protocol libcurl
@@ -76,6 +73,10 @@ int main(void)
 
   curl = curl_easy_init();
   if(curl) {
+    CURLcode res;
+    curl_socket_t sockfd;
+    size_t nsent_total = 0;
+
     curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
     /* Do not do the transfer - only connect to host */
     curl_easy_setopt(curl, CURLOPT_CONNECT_ONLY, 1L);
index 86a813a..d137c4b 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
index 44a3caf..e5a74b9 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -47,7 +47,7 @@ static size_t my_fwrite(void *buffer, size_t size, size_t nmemb,
                         void *stream)
 {
   struct FtpFile *out = (struct FtpFile *)stream;
-  if(out && !out->stream) {
+  if(!out->stream) {
     /* open file for writing */
     out->stream = fopen(out->filename, "wb");
     if(!out->stream)
index 6e60c1e..e7d9d23 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -49,9 +49,8 @@ static curl_off_t sftpGetRemoteFileSize(const char *i_remoteFile)
 {
   CURLcode result = CURLE_GOT_NOTHING;
   curl_off_t remoteFileSizeByte = -1;
-  CURL *curlHandlePtr = NULL;
+  CURL *curlHandlePtr = curl_easy_init();
 
-  curlHandlePtr = curl_easy_init();
   curl_easy_setopt(curlHandlePtr, CURLOPT_VERBOSE, 1L);
 
   curl_easy_setopt(curlHandlePtr, CURLOPT_URL, i_remoteFile);
@@ -65,6 +64,8 @@ static curl_off_t sftpGetRemoteFileSize(const char *i_remoteFile)
     result = curl_easy_getinfo(curlHandlePtr,
                                CURLINFO_CONTENT_LENGTH_DOWNLOAD_T,
                                &remoteFileSizeByte);
+    if(result)
+      return -1;
     printf("filesize: %" CURL_FORMAT_CURL_OFF_T "\n", remoteFileSizeByte);
   }
   curl_easy_cleanup(curlHandlePtr);
index 91864d9..2ccb9ea 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -46,8 +46,6 @@ static void my_unlock(CURL *handle, curl_lock_data data, void *useptr)
 
 int main(void)
 {
-  CURL *curl;
-  CURLcode res;
   CURLSH *share;
   int i;
 
@@ -61,8 +59,10 @@ int main(void)
      still reuse connections since the pool is in the shared object! */
 
   for(i = 0; i < 3; i++) {
-    curl = curl_easy_init();
+    CURL *curl = curl_easy_init();
     if(curl) {
+      CURLcode res;
+
       curl_easy_setopt(curl, CURLOPT_URL, "https://curl.haxx.se/");
 
       /* use the share object */
index 5a4f18f..ed404e8 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -67,14 +67,12 @@ size_t write_file(void *ptr, size_t size, size_t nmemb, FILE *stream)
 /* https://weather.com/weather/today/l/46214?cc=*&dayf=5&unit=i */
 void *pull_one_url(void *NaN)
 {
-  CURL *curl;
-  CURLcode res;
-  gchar *http;
-  FILE *outfile;
-
   /* Stop threads from entering unless j is incremented */
   pthread_mutex_lock(&lock);
   while(j < num_urls) {
+    CURL *curl;
+    gchar *http;
+
     printf("j = %d\n", j);
 
     http =
@@ -86,7 +84,7 @@ void *pull_one_url(void *NaN)
     curl = curl_easy_init();
     if(curl) {
 
-      outfile = fopen(urls[j], "wb");
+      FILE *outfile = fopen(urls[j], "wb");
 
       /* Set the URL and transfer type */
       curl_easy_setopt(curl, CURLOPT_URL, http);
@@ -98,7 +96,7 @@ void *pull_one_url(void *NaN)
       j++;  /* critical line */
       pthread_mutex_unlock(&lock);
 
-      res = curl_easy_perform(curl);
+      curl_easy_perform(curl);
 
       fclose(outfile);
       printf("fclose\n");
@@ -131,14 +129,13 @@ void *create_thread(void *progress_bar)
 {
   pthread_t tid[NUMT];
   int i;
-  int error;
 
   /* Make sure I don't create more threads than urls. */
   for(i = 0; i < NUMT && i < num_urls ; i++) {
-    error = pthread_create(&tid[i],
-                           NULL, /* default attributes please */
-                           pull_one_url,
-                           NULL);
+    int error = pthread_create(&tid[i],
+                               NULL, /* default attributes please */
+                               pull_one_url,
+                               NULL);
     if(0 != error)
       fprintf(stderr, "Couldn't run thread number %d, errno %d\n", i, error);
     else
@@ -147,7 +144,7 @@ void *create_thread(void *progress_bar)
 
   /* Wait for all threads to terminate. */
   for(i = 0; i < NUMT && i < num_urls; i++) {
-    error = pthread_join(tid[i], NULL);
+    pthread_join(tid[i], NULL);
     fprintf(stderr, "Thread %d terminated\n", i);
   }
 
diff --git a/docs/examples/smtp-authzid.c b/docs/examples/smtp-authzid.c
new file mode 100644 (file)
index 0000000..decdb71
--- /dev/null
@@ -0,0 +1,161 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+
+/* <DESC>
+ * Send e-mail on behalf of another user with SMTP
+ * </DESC>
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <curl/curl.h>
+
+/*
+ * This is a simple example show how to send an email using libcurl's SMTP
+ * capabilities.
+ *
+ * Note that this example requires libcurl 7.66.0 or above.
+ */
+
+/* The libcurl options want plain addresses, the viewable headers in the mail
+ * can very well get a full name as well.
+ */
+#define FROM_ADDR    "<ursel@example.org>"
+#define SENDER_ADDR  "<kurt@example.org>"
+#define TO_ADDR      "<addressee@example.net>"
+
+#define FROM_MAIL    "Ursel " FROM_ADDR
+#define SENDER_MAIL  "Kurt " SENDER_ADDR
+#define TO_MAIL      "A Receiver " TO_ADDR
+
+static const char *payload_text[] = {
+  "Date: Mon, 29 Nov 2010 21:54:29 +1100\r\n",
+  "To: " TO_MAIL "\r\n",
+  "From: " FROM_MAIL "\r\n",
+  "Sender: " SENDER_MAIL "\r\n",
+  "Message-ID: <dcd7cb36-11db-487a-9f3a-e652a9458efd@"
+  "rfcpedant.example.org>\r\n",
+  "Subject: SMTP example message\r\n",
+  "\r\n", /* empty line to divide headers from body, see RFC5322 */
+  "The body of the message starts here.\r\n",
+  "\r\n",
+  "It could be a lot of lines, could be MIME encoded, whatever.\r\n",
+  "Check RFC5322.\r\n",
+  NULL
+};
+
+struct upload_status {
+  int lines_read;
+};
+
+static size_t payload_source(void *ptr, size_t size, size_t nmemb, void *userp)
+{
+  struct upload_status *upload_ctx = (struct upload_status *)userp;
+  const char *data;
+
+  if((size == 0) || (nmemb == 0) || ((size*nmemb) < 1)) {
+    return 0;
+  }
+
+  data = payload_text[upload_ctx->lines_read];
+
+  if(data) {
+    size_t len = strlen(data);
+    memcpy(ptr, data, len);
+    upload_ctx->lines_read++;
+
+    return len;
+  }
+
+  return 0;
+}
+
+int main(void)
+{
+  CURL *curl;
+  CURLcode res = CURLE_OK;
+  struct curl_slist *recipients = NULL;
+  struct upload_status upload_ctx;
+
+  upload_ctx.lines_read = 0;
+
+  curl = curl_easy_init();
+  if(curl) {
+    /* This is the URL for your mailserver. In this example we connect to the
+       smtp-submission port as we require an authenticated connection. */
+    curl_easy_setopt(curl, CURLOPT_URL, "smtp://mail.example.com:587");
+
+    /* Set the username and password */
+    curl_easy_setopt(curl, CURLOPT_USERNAME, "kurt");
+    curl_easy_setopt(curl, CURLOPT_PASSWORD, "xipj3plmq");
+
+    /* Set the authorisation identity (identity to act as) */
+    curl_easy_setopt(curl, CURLOPT_SASL_AUTHZID, "ursel");
+
+    /* Force PLAIN authentication */
+    curl_easy_setopt(curl, CURLOPT_LOGIN_OPTIONS, "AUTH=PLAIN");
+
+    /* Note that this option isn't strictly required, omitting it will result
+     * in libcurl sending the MAIL FROM command with empty sender data. All
+     * autoresponses should have an empty reverse-path, and should be directed
+     * to the address in the reverse-path which triggered them. Otherwise,
+     * they could cause an endless loop. See RFC 5321 Section 4.5.5 for more
+     * details.
+     */
+    curl_easy_setopt(curl, CURLOPT_MAIL_FROM, FROM_ADDR);
+
+    /* Add a recipient, in this particular case it corresponds to the
+     * To: addressee in the header. */
+    recipients = curl_slist_append(recipients, TO_ADDR);
+    curl_easy_setopt(curl, CURLOPT_MAIL_RCPT, recipients);
+
+    /* We're using a callback function to specify the payload (the headers and
+     * body of the message). You could just use the CURLOPT_READDATA option to
+     * specify a FILE pointer to read from. */
+    curl_easy_setopt(curl, CURLOPT_READFUNCTION, payload_source);
+    curl_easy_setopt(curl, CURLOPT_READDATA, &upload_ctx);
+    curl_easy_setopt(curl, CURLOPT_UPLOAD, 1L);
+
+    /* Send the message */
+    res = curl_easy_perform(curl);
+
+    /* Check for errors */
+    if(res != CURLE_OK)
+      fprintf(stderr, "curl_easy_perform() failed: %s\n",
+              curl_easy_strerror(res));
+
+    /* Free the list of recipients */
+    curl_slist_free_all(recipients);
+
+    /* curl won't send the QUIT command until you call cleanup, so you should
+     * be able to re-use this connection for additional messages (setting
+     * CURLOPT_MAIL_FROM and CURLOPT_MAIL_RCPT as required, and calling
+     * curl_easy_perform() again. It may not be a good idea to keep the
+     * connection open for a very long time though (more than a few minutes
+     * may result in the server timing out the connection), and you do want to
+     * clean up in the end.
+     */
+    curl_easy_cleanup(curl);
+  }
+
+  return (int)res;
+}
index fb0ed1d..bc23c42 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
index 35997fa..1cf575c 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -70,16 +70,17 @@ int main(void)
 {
   CURL *curl;
   CURLcode res = CURLE_OK;
-  struct curl_slist *headers = NULL;
-  struct curl_slist *recipients = NULL;
-  struct curl_slist *slist = NULL;
-  curl_mime *mime;
-  curl_mime *alt;
-  curl_mimepart *part;
-  const char **cpp;
 
   curl = curl_easy_init();
   if(curl) {
+    struct curl_slist *headers = NULL;
+    struct curl_slist *recipients = NULL;
+    struct curl_slist *slist = NULL;
+    curl_mime *mime;
+    curl_mime *alt;
+    curl_mimepart *part;
+    const char **cpp;
+
     /* This is the URL for your mailserver */
     curl_easy_setopt(curl, CURLOPT_URL, "smtp://mail.example.com");
 
index 019da7d..7c62966 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
index 671a80d..94d918b 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
index 4e0623f..50bdc06 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
index c1489a9..14c2303 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -56,7 +56,7 @@ int main(int argc, char **argv)
 
     return 0;
   }
-  else if(isdigit(*name)) {
+  else if(isdigit((int)(unsigned char)*name)) {
     int id = atoi(name);
 
     result = curl_global_sslset((curl_sslbackend)id, NULL, NULL);
index d84cea9..29ceaa5 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -137,7 +137,6 @@ size_t SyncTime_CURL_WriteOutput(void *ptr, size_t size, size_t nmemb,
 size_t SyncTime_CURL_WriteHeader(void *ptr, size_t size, size_t nmemb,
                                  void *stream)
 {
-  int   i, RetVal;
   char  TmpStr1[26], TmpStr2[26];
 
   (void)stream;
@@ -156,11 +155,13 @@ size_t SyncTime_CURL_WriteHeader(void *ptr, size_t size, size_t nmemb,
                                          TmpStr1 & 2? */
         AutoSyncTime = 0;
       else {
-        RetVal = sscanf((char *)(ptr), "Date: %s %hu %s %hu %hu:%hu:%hu",
-                        TmpStr1, &SYSTime.wDay, TmpStr2, &SYSTime.wYear,
-                        &SYSTime.wHour, &SYSTime.wMinute, &SYSTime.wSecond);
+        int RetVal = sscanf((char *)(ptr), "Date: %s %hu %s %hu %hu:%hu:%hu",
+                            TmpStr1, &SYSTime.wDay, TmpStr2, &SYSTime.wYear,
+                            &SYSTime.wHour, &SYSTime.wMinute,
+                            &SYSTime.wSecond);
 
         if(RetVal == 7) {
+          int i;
           SYSTime.wMilliseconds = 500;    /* adjust to midpoint, 0.5 sec */
           for(i = 0; i<12; i++) {
             if(strcmp(MthStr[i], TmpStr2) == 0) {
@@ -257,25 +258,15 @@ int main(int argc, char *argv[])
 {
   CURL    *curl;
   conf_t  conf[1];
-  int     OptionIndex;
-  struct  tm *lt;
-  struct  tm *gmt;
-  time_t  tt;
-  time_t  tt_local;
-  time_t  tt_gmt;
-  double  tzonediffFloat;
-  int     tzonediffWord;
-  char    timeBuf[61];
-  char    tzoneBuf[16];
   int     RetValue;
 
-  OptionIndex     = 0;
   ShowAllHeader   = 0;    /* Do not show HTTP Header */
   AutoSyncTime    = 0;    /* Do not synchronise computer clock */
   RetValue        = 0;    /* Successful Exit */
   conf_init(conf);
 
   if(argc > 1) {
+    int OptionIndex = 0;
     while(OptionIndex < argc) {
       if(strncmp(argv[OptionIndex], "--server=", 9) == 0)
         snprintf(conf->timeserver, MAX_STRING, "%s", &argv[OptionIndex][9]);
@@ -308,6 +299,16 @@ int main(int argc, char *argv[])
   curl_global_init(CURL_GLOBAL_ALL);
   curl = curl_easy_init();
   if(curl) {
+    struct tm *lt;
+    struct tm *gmt;
+    time_t tt;
+    time_t tt_local;
+    time_t tt_gmt;
+    double tzonediffFloat;
+    int tzonediffWord;
+    char timeBuf[61];
+    char tzoneBuf[16];
+
     SyncTime_CURL_Init(curl, conf->http_proxy, conf->proxy_user);
 
     /* Calculating time diff between GMT and localtime */
index e238b95..f20b8a4 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -117,7 +117,6 @@ int main(void)
 {
   pthread_t tid[NUM_THREADS];
   int i;
-  int error;
   CURLSH *share;
   struct initurl url[NUM_THREADS];
 
@@ -132,6 +131,7 @@ int main(void)
   init_locks();
 
   for(i = 0; i< NUM_THREADS; i++) {
+    int error;
     url[i].url = URL;
     url[i].share = share;
     url[i].threadno = i;
@@ -144,7 +144,7 @@ int main(void)
 
   /* now wait for all threads to terminate */
   for(i = 0; i< NUM_THREADS; i++) {
-    error = pthread_join(tid[i], NULL);
+    pthread_join(tid[i], NULL);
     fprintf(stderr, "Thread %d terminated\n", i);
   }
 
index adf4629..f61d728 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -29,7 +29,7 @@
  * (libgcrypt) so far.
  *
  * OpenSSL docs for this:
- *   https://www.openssl.org/docs/crypto/threads.html
+ *   https://www.openssl.org/docs/man1.0.2/man3/CRYPTO_num_locks.html
  * gcrypt docs for this:
  *   https://gnupg.org/documentation/manuals/gcrypt/Multi_002dThreading.html
  */
@@ -135,7 +135,6 @@ int main(int argc, char **argv)
 {
   pthread_t tid[NUMT];
   int i;
-  int error;
   (void)argc; /* we don't use any arguments in this example */
   (void)argv;
 
@@ -145,10 +144,10 @@ int main(int argc, char **argv)
   init_locks();
 
   for(i = 0; i< NUMT; i++) {
-    error = pthread_create(&tid[i],
-                           NULL, /* default attributes please */
-                           pull_one_url,
-                           (void *)urls[i]);
+    int error = pthread_create(&tid[i],
+                               NULL, /* default attributes please */
+                               pull_one_url,
+                               (void *)urls[i]);
     if(0 != error)
       fprintf(stderr, "Couldn't run thread number %d, errno %d\n", i, error);
     else
@@ -157,7 +156,7 @@ int main(int argc, char **argv)
 
   /* now wait for all threads to terminate */
   for(i = 0; i< NUMT; i++) {
-    error = pthread_join(tid[i], NULL);
+    pthread_join(tid[i], NULL);
     fprintf(stderr, "Thread %d terminated\n", i);
   }
 
index 1bede8c..314cbe0 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -57,7 +57,7 @@ int main(int argc, char *argv[])
   /* Switch on full protocol/debug output while testing */
   curl_easy_setopt(curl_handle, CURLOPT_VERBOSE, 1L);
 
-  /* disable progress meter, set to 0L to enable and disable debug output */
+  /* disable progress meter, set to 0L to enable it */
   curl_easy_setopt(curl_handle, CURLOPT_NOPROGRESS, 1L);
 
   /* send all data to this function  */
diff --git a/docs/examples/urlapi.c b/docs/examples/urlapi.c
new file mode 100644 (file)
index 0000000..594f942
--- /dev/null
@@ -0,0 +1,72 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+/* <DESC>
+ * Set working URL with CURLU *.
+ * </DESC>
+ */
+#include <stdio.h>
+#include <curl/curl.h>
+
+#if !CURL_AT_LEAST_VERSION(7, 62, 0)
+#error "this example requires curl 7.62.0 or later"
+#endif
+
+int main(void)
+{
+  CURL *curl;
+  CURLcode res;
+
+  CURLU *urlp;
+  CURLUcode uc;
+
+  /* get a curl handle */
+  curl = curl_easy_init();
+
+  /* init Curl URL */
+  urlp = curl_url();
+  uc = curl_url_set(urlp, CURLUPART_URL,
+                    "http://example.com/path/index.html", 0);
+
+  if(uc) {
+    fprintf(stderr, "curl_url_set() failed: %in", uc);
+    goto cleanup;
+  }
+
+  if(curl) {
+    /* set urlp to use as working URL */
+    curl_easy_setopt(curl, CURLOPT_CURLU, urlp);
+    curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
+
+    res = curl_easy_perform(curl);
+    /* Check for errors */
+    if(res != CURLE_OK)
+      fprintf(stderr, "curl_easy_perform() failed: %s\n",
+              curl_easy_strerror(res));
+
+    goto cleanup;
+  }
+
+  cleanup:
+  curl_url_cleanup(urlp);
+  curl_easy_cleanup(curl);
+  return 0;
+}
index 40505b0..7427ae7 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 2013 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 2013 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -177,25 +177,25 @@ int main(void)
   CURL *ch;
   CURLcode rv;
 
-  rv = curl_global_init(CURL_GLOBAL_ALL);
+  curl_global_init(CURL_GLOBAL_ALL);
   ch = curl_easy_init();
-  rv = curl_easy_setopt(ch, CURLOPT_VERBOSE, 0L);
-  rv = curl_easy_setopt(ch, CURLOPT_HEADER, 0L);
-  rv = curl_easy_setopt(ch, CURLOPT_NOPROGRESS, 1L);
-  rv = curl_easy_setopt(ch, CURLOPT_NOSIGNAL, 1L);
-  rv = curl_easy_setopt(ch, CURLOPT_WRITEFUNCTION, writefunction);
-  rv = curl_easy_setopt(ch, CURLOPT_WRITEDATA, stdout);
-  rv = curl_easy_setopt(ch, CURLOPT_HEADERFUNCTION, writefunction);
-  rv = curl_easy_setopt(ch, CURLOPT_HEADERDATA, stderr);
-  rv = curl_easy_setopt(ch, CURLOPT_SSLCERTTYPE, "PEM");
+  curl_easy_setopt(ch, CURLOPT_VERBOSE, 0L);
+  curl_easy_setopt(ch, CURLOPT_HEADER, 0L);
+  curl_easy_setopt(ch, CURLOPT_NOPROGRESS, 1L);
+  curl_easy_setopt(ch, CURLOPT_NOSIGNAL, 1L);
+  curl_easy_setopt(ch, CURLOPT_WRITEFUNCTION, writefunction);
+  curl_easy_setopt(ch, CURLOPT_WRITEDATA, stdout);
+  curl_easy_setopt(ch, CURLOPT_HEADERFUNCTION, writefunction);
+  curl_easy_setopt(ch, CURLOPT_HEADERDATA, stderr);
+  curl_easy_setopt(ch, CURLOPT_SSLCERTTYPE, "PEM");
 
   /* both VERIFYPEER and VERIFYHOST are set to 0 in this case because there is
      no CA certificate*/
 
-  rv = curl_easy_setopt(ch, CURLOPT_SSL_VERIFYPEER, 0L);
-  rv = curl_easy_setopt(ch, CURLOPT_SSL_VERIFYHOST, 0L);
-  rv = curl_easy_setopt(ch, CURLOPT_URL, "https://www.example.com/");
-  rv = curl_easy_setopt(ch, CURLOPT_SSLKEYTYPE, "PEM");
+  curl_easy_setopt(ch, CURLOPT_SSL_VERIFYPEER, 0L);
+  curl_easy_setopt(ch, CURLOPT_SSL_VERIFYHOST, 0L);
+  curl_easy_setopt(ch, CURLOPT_URL, "https://www.example.com/");
+  curl_easy_setopt(ch, CURLOPT_SSLKEYTYPE, "PEM");
 
   /* first try: retrieve page without user certificate and key -> will fail
    */
@@ -211,7 +211,7 @@ int main(void)
    * load the certificate and key by installing a function doing the necessary
    * "modifications" to the SSL CONTEXT just before link init
    */
-  rv = curl_easy_setopt(ch, CURLOPT_SSL_CTX_FUNCTION, *sslctx_function);
+  curl_easy_setopt(ch, CURLOPT_SSL_CTX_FUNCTION, *sslctx_function);
   rv = curl_easy_perform(ch);
   if(rv == CURLE_OK) {
     printf("*** transfer succeeded ***\n");
index 0aad0d0..153bcad 100644 (file)
@@ -114,8 +114,7 @@ build_triplet = @build@
 host_triplet = @host@
 subdir = docs/libcurl
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/ax_code_coverage.m4 \
-       $(top_srcdir)/m4/ax_compile_check_sizeof.m4 \
+am__aclocal_m4_deps = $(top_srcdir)/m4/ax_compile_check_sizeof.m4 \
        $(top_srcdir)/m4/curl-compilers.m4 \
        $(top_srcdir)/m4/curl-confopts.m4 \
        $(top_srcdir)/m4/curl-functions.m4 \
@@ -448,12 +447,6 @@ CC = @CC@
 CCDEPMODE = @CCDEPMODE@
 CFLAGS = @CFLAGS@
 CFLAG_CURL_SYMBOL_HIDING = @CFLAG_CURL_SYMBOL_HIDING@
-CODE_COVERAGE_CFLAGS = @CODE_COVERAGE_CFLAGS@
-CODE_COVERAGE_CPPFLAGS = @CODE_COVERAGE_CPPFLAGS@
-CODE_COVERAGE_CXXFLAGS = @CODE_COVERAGE_CXXFLAGS@
-CODE_COVERAGE_ENABLED = @CODE_COVERAGE_ENABLED@
-CODE_COVERAGE_LDFLAGS = @CODE_COVERAGE_LDFLAGS@
-CODE_COVERAGE_LIBS = @CODE_COVERAGE_LIBS@
 CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
@@ -495,14 +488,15 @@ ENABLE_SHARED = @ENABLE_SHARED@
 ENABLE_STATIC = @ENABLE_STATIC@
 EXEEXT = @EXEEXT@
 FGREP = @FGREP@
+FISH_FUNCTIONS_DIR = @FISH_FUNCTIONS_DIR@
 GCOV = @GCOV@
-GENHTML = @GENHTML@
 GREP = @GREP@
 HAVE_BROTLI = @HAVE_BROTLI@
 HAVE_GNUTLS_SRP = @HAVE_GNUTLS_SRP@
 HAVE_LDAP_SSL = @HAVE_LDAP_SSL@
 HAVE_LIBZ = @HAVE_LIBZ@
 HAVE_OPENSSL_SRP = @HAVE_OPENSSL_SRP@
+HAVE_PROTO_BSDSOCKET_H = @HAVE_PROTO_BSDSOCKET_H@
 IDN_ENABLED = @IDN_ENABLED@
 INSTALL = @INSTALL@
 INSTALL_DATA = @INSTALL_DATA@
@@ -563,9 +557,7 @@ STRIP = @STRIP@
 SUPPORT_FEATURES = @SUPPORT_FEATURES@
 SUPPORT_PROTOCOLS = @SUPPORT_PROTOCOLS@
 USE_ARES = @USE_ARES@
-USE_AXTLS = @USE_AXTLS@
-USE_CYASSL = @USE_CYASSL@
-USE_DARWINSSL = @USE_DARWINSSL@
+USE_BEARSSL = @USE_BEARSSL@
 USE_GNUTLS = @USE_GNUTLS@
 USE_GNUTLS_NETTLE = @USE_GNUTLS_NETTLE@
 USE_LIBRTMP = @USE_LIBRTMP@
@@ -574,12 +566,17 @@ USE_LIBSSH2 = @USE_LIBSSH2@
 USE_MBEDTLS = @USE_MBEDTLS@
 USE_MESALINK = @USE_MESALINK@
 USE_NGHTTP2 = @USE_NGHTTP2@
+USE_NGHTTP3 = @USE_NGHTTP3@
+USE_NGTCP2 = @USE_NGTCP2@
+USE_NGTCP2_CRYPTO_OPENSSL = @USE_NGTCP2_CRYPTO_OPENSSL@
 USE_NSS = @USE_NSS@
 USE_OPENLDAP = @USE_OPENLDAP@
-USE_POLARSSL = @USE_POLARSSL@
+USE_QUICHE = @USE_QUICHE@
 USE_SCHANNEL = @USE_SCHANNEL@
+USE_SECTRANSP = @USE_SECTRANSP@
 USE_UNIX_SOCKETS = @USE_UNIX_SOCKETS@
 USE_WINDOWS_SSPI = @USE_WINDOWS_SSPI@
+USE_WOLFSSL = @USE_WOLFSSL@
 VERSION = @VERSION@
 VERSIONNUM = @VERSIONNUM@
 ZLIB_LIBS = @ZLIB_LIBS@
@@ -687,6 +684,7 @@ man_MANS = \
  curl_multi_info_read.3 \
  curl_multi_init.3 \
  curl_multi_perform.3 \
+ curl_multi_poll.3 \
  curl_multi_remove_handle.3 \
  curl_multi_setopt.3 \
  curl_multi_socket.3 \
@@ -694,6 +692,7 @@ man_MANS = \
  curl_multi_socket_all.3 \
  curl_multi_strerror.3 \
  curl_multi_timeout.3 \
+ curl_multi_wakeup.3 \
  curl_multi_wait.3 \
  curl_share_cleanup.3 \
  curl_share_init.3 \
index b4ff45d..e1185e7 100644 (file)
@@ -46,6 +46,7 @@ man_MANS = \
  curl_multi_info_read.3 \
  curl_multi_init.3 \
  curl_multi_perform.3 \
+ curl_multi_poll.3 \
  curl_multi_remove_handle.3 \
  curl_multi_setopt.3 \
  curl_multi_socket.3 \
@@ -53,6 +54,7 @@ man_MANS = \
  curl_multi_socket_all.3 \
  curl_multi_strerror.3 \
  curl_multi_timeout.3 \
+ curl_multi_wakeup.3 \
  curl_multi_wait.3 \
  curl_share_cleanup.3 \
  curl_share_init.3 \
index c73b6d8..834660e 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH curl_easy_cleanup 3 "August 09, 2018" "libcurl 7.62.0" "libcurl Manual"
+.TH curl_easy_cleanup 3 "August 09, 2018" "libcurl 7.68.0" "libcurl Manual"
 
 .SH NAME
 curl_easy_cleanup - End a libcurl easy handle
index b0b9dbb..daba039 100644 (file)
@@ -5,7 +5,7 @@
 .\" *                            | (__| |_| |  _ <| |___
 .\" *                             \___|\___/|_| \_\_____|
 .\" *
-.\" * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 .\" *
 .\" * This software is licensed as described in the file COPYING, which
 .\" * you should have received as part of this distribution. The terms
@@ -19,7 +19,7 @@
 .\" * KIND, either express or implied.
 .\" *
 .\" **************************************************************************
-.TH curl_easy_duphandle 3 "September 23, 2018" "libcurl 7.62.0" "libcurl Manual"
+.TH curl_easy_duphandle 3 "March 01, 2019" "libcurl 7.68.0" "libcurl Manual"
 
 .SH NAME
 curl_easy_duphandle - Clone a libcurl session handle
@@ -40,10 +40,12 @@ will be pointed to by the new handle as well. You must therefore make sure to
 keep the data around until both handles have been cleaned up.
 
 The new handle will \fBnot\fP inherit any state information, no connections,
-no SSL sessions and no cookies.
+no SSL sessions and no cookies. It also will not inherit any share object
+states or options (it will be made as if \fICURLOPT_SHARE(3)\fP was set to
+NULL).
 
-\fBNote\fP that even in multi-threaded programs, this function must be called
-in a synchronous way, the input handle may not be in use when cloned.
+In multi-threaded programs, this function must be called in a synchronous way,
+the input handle may not be in use when cloned.
 .SH RETURN VALUE
 If this function returns NULL, something went wrong and no valid handle was
 returned.
index 76594ee..f5b6269 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH curl_easy_escape 3 "August 12, 2017" "libcurl 7.62.0" "libcurl Manual"
+.TH curl_easy_escape 3 "August 12, 2017" "libcurl 7.68.0" "libcurl Manual"
 
 .SH NAME
 curl_easy_escape - URL encodes the given string
index 36a0186..b628e84 100644 (file)
@@ -5,7 +5,7 @@
 .\" *                            | (__| |_| |  _ <| |___
 .\" *                             \___|\___/|_| \_\_____|
 .\" *
-.\" * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 .\" *
 .\" * This software is licensed as described in the file COPYING, which
 .\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH curl_easy_getinfo 3 "May 17, 2018" "libcurl 7.62.0" "libcurl Manual"
+.TH curl_easy_getinfo 3 "August 06, 2019" "libcurl 7.68.0" "libcurl Manual"
 
 .SH NAME
 curl_easy_getinfo - extract information from a curl handle
@@ -158,6 +158,9 @@ Upload size.  See \fICURLINFO_CONTENT_LENGTH_UPLOAD_T(3)\fP
 .IP CURLINFO_CONTENT_TYPE
 Content type from the Content-Type header.
 See \fICURLINFO_CONTENT_TYPE(3)\fP
+.IP CURLINFO_RETRY_AFTER
+The value from the from the Retry-After header.
+See \fICURLINFO_RETRY_AFTER(3)\fP
 .IP CURLINFO_PRIVATE
 User's private data pointer.
 See \fICURLINFO_PRIVATE(3)\fP
@@ -243,7 +246,7 @@ curl_easy_perform()
     |--|--|--|--|--|--REDIRECT
 .fi
 .IP NAMELOOKUP
-\fICURLINFO_NAMELOOKUP_TIME\fP and \fIfICURLINFO_NAMELOOKUP_TIME_T\fP.
+\fICURLINFO_NAMELOOKUP_TIME\fP and \fICURLINFO_NAMELOOKUP_TIME_T\fP.
 The time it took from the start until the name resolving was completed.
 .IP CONNECT
 \fICURLINFO_CONNECT_TIME\fP and \fICURLINFO_CONNECT_TIME_T\fP.
index 2ac700d..fb84df0 100644 (file)
@@ -19,7 +19,7 @@
 .\" * KIND, either express or implied.
 .\" *
 .\" **************************************************************************
-.TH curl_easy_init 3 "February 03, 2016" "libcurl 7.62.0" "libcurl Manual"
+.TH curl_easy_init 3 "February 03, 2016" "libcurl 7.68.0" "libcurl Manual"
 
 .SH NAME
 curl_easy_init - Start a libcurl easy session
index 6fe00a2..8364c32 100644 (file)
@@ -19,7 +19,7 @@
 .\" * KIND, either express or implied.
 .\" *
 .\" **************************************************************************
-.TH curl_easy_pause 3 "May 01, 2016" "libcurl 7.62.0" "libcurl Manual"
+.TH curl_easy_pause 3 "May 01, 2016" "libcurl 7.68.0" "libcurl Manual"
 
 .SH NAME
 curl_easy_pause - pause and unpause a connection
index 7cc9355..fa1c8b9 100644 (file)
@@ -19,7 +19,7 @@
 .\" * KIND, either express or implied.
 .\" *
 .\" **************************************************************************
-.TH curl_easy_perform 3 "September 23, 2018" "libcurl 7.62.0" "libcurl Manual"
+.TH curl_easy_perform 3 "September 23, 2018" "libcurl 7.68.0" "libcurl Manual"
 
 .SH NAME
 curl_easy_perform - perform a blocking file transfer
index b5216ba..9816578 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH curl_easy_recv 3 "December 18, 2016" "libcurl 7.62.0" "libcurl Manual"
+.TH curl_easy_recv 3 "December 18, 2016" "libcurl 7.68.0" "libcurl Manual"
 
 .SH NAME
 curl_easy_recv - receives raw data on an "easy" connection
index 832a4b8..2474d4a 100644 (file)
@@ -19,7 +19,7 @@
 .\" * KIND, either express or implied.
 .\" *
 .\" **************************************************************************
-.TH curl_easy_reset 3 "September 23, 2018" "libcurl 7.62.0" "libcurl Manual"
+.TH curl_easy_reset 3 "September 23, 2018" "libcurl 7.68.0" "libcurl Manual"
 
 .SH NAME
 curl_easy_reset - reset all options of a libcurl session handle
index 36be65b..d4a7d03 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH curl_easy_send 3 "December 18, 2016" "libcurl 7.62.0" "libcurl Manual"
+.TH curl_easy_send 3 "December 18, 2016" "libcurl 7.68.0" "libcurl Manual"
 
 .SH NAME
 curl_easy_send - sends raw data over an "easy" connection
index 1787646..8cb8621 100644 (file)
@@ -5,7 +5,7 @@
 .\" *                            | (__| |_| |  _ <| |___
 .\" *                             \___|\___/|_| \_\_____|
 .\" *
-.\" * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
 .\" *
 .\" * This software is licensed as described in the file COPYING, which
 .\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH curl_easy_setopt 3 "September 07, 2018" "libcurl 7.62.0" "libcurl Manual"
+.TH curl_easy_setopt 3 "January 05, 2020" "libcurl 7.68.0" "libcurl Manual"
 
 .SH NAME
 curl_easy_setopt \- set options for a curl easy handle
@@ -257,6 +257,8 @@ TLS authentication methods. See \fICURLOPT_TLSAUTH_TYPE(3)\fP
 Proxy TLS authentication methods. See \fICURLOPT_PROXY_TLSAUTH_TYPE(3)\fP
 .IP CURLOPT_PROXYAUTH
 HTTP proxy authentication methods. See \fICURLOPT_PROXYAUTH(3)\fP
+.IP CURLOPT_SASL_AUTHZID
+SASL authorisation identity (identity to act as). See \fICURLOPT_SASL_AUTHZID(3)\fP
 .IP CURLOPT_SASL_IR
 Enable SASL initial response. See \fICURLOPT_SASL_IR(3)\fP
 .IP CURLOPT_XOAUTH2_BEARER
@@ -314,12 +316,18 @@ File to write cookies to. See \fICURLOPT_COOKIEJAR(3)\fP
 Start a new cookie session. See \fICURLOPT_COOKIESESSION(3)\fP
 .IP CURLOPT_COOKIELIST
 Add or control cookies. See \fICURLOPT_COOKIELIST(3)\fP
+.IP CURLOPT_ALTSVC
+Specify the Alt-Svc: cache file name. See \fICURLOPT_ALTSVC(3)\fP
+.IP CURLOPT_ALTSVC_CTRL
+Enable and configure Alt-Svc: treatment. See \fICURLOPT_ALTSVC_CTRL(3)\fP
 .IP CURLOPT_HTTPGET
 Do an HTTP GET request. See \fICURLOPT_HTTPGET(3)\fP
 .IP CURLOPT_REQUEST_TARGET
 Set the request target. \fICURLOPT_REQUEST_TARGET(3)\fP
 .IP CURLOPT_HTTP_VERSION
 HTTP version to use. \fICURLOPT_HTTP_VERSION(3)\fP
+.IP CURLOPT_HTTP09_ALLOWED
+Allow HTTP/0.9 responses. \fICURLOPT_HTTP09_ALLOWED(3)\fP
 .IP CURLOPT_IGNORE_CONTENT_LENGTH
 Ignore Content-Length. See \fICURLOPT_IGNORE_CONTENT_LENGTH(3)\fP
 .IP CURLOPT_HTTP_CONTENT_DECODING
@@ -328,6 +336,12 @@ Disable Content decoding. See \fICURLOPT_HTTP_CONTENT_DECODING(3)\fP
 Disable Transfer decoding. See \fICURLOPT_HTTP_TRANSFER_DECODING(3)\fP
 .IP CURLOPT_EXPECT_100_TIMEOUT_MS
 100-continue timeout. See \fICURLOPT_EXPECT_100_TIMEOUT_MS(3)\fP
+.IP CURLOPT_TRAILERFUNCTION
+Set callback for sending trailing headers. See
+\fICURLOPT_TRAILERFUNCTION(3)\fP
+.IP CURLOPT_TRAILERDATA
+Custom pointer passed to the trailing headers callback. See
+\fICURLOPT_TRAILERDATA(3)\fP
 .IP CURLOPT_PIPEWAIT
 Wait on connection to pipeline on it. See \fICURLOPT_PIPEWAIT(3)\fP
 .IP CURLOPT_STREAM_DEPENDS
@@ -408,6 +422,8 @@ Range requests. See \fICURLOPT_RANGE(3)\fP
 Resume a transfer. See \fICURLOPT_RESUME_FROM(3)\fP
 .IP CURLOPT_RESUME_FROM_LARGE
 Resume a transfer. See \fICURLOPT_RESUME_FROM_LARGE(3)\fP
+.IP CURLOPT_CURLU
+Set URL to work on with CURLU *. See \fICURLOPT_CURLU(3)\fP
 .IP CURLOPT_CUSTOMREQUEST
 Custom request/method. See \fICURLOPT_CUSTOMREQUEST(3)\fP
 .IP CURLOPT_FILETIME
@@ -455,6 +471,8 @@ Maximum number of connections in the connection pool. See \fICURLOPT_MAXCONNECTS
 Use a new connection. \fICURLOPT_FRESH_CONNECT(3)\fP
 .IP CURLOPT_FORBID_REUSE
 Prevent subsequent connections from re-using this. See \fICURLOPT_FORBID_REUSE(3)\fP
+.IP CURLOPT_MAXAGE_CONN
+Limit the age of connections for reuse. See \fICURLOPT_MAXAGE_CONN(3)\fP
 .IP CURLOPT_CONNECTTIMEOUT
 Timeout for the connection phase. See \fICURLOPT_CONNECTTIMEOUT(3)\fP
 .IP CURLOPT_CONNECTTIMEOUT_MS
@@ -606,6 +624,10 @@ TELNET options. See \fICURLOPT_TELNETOPTIONS(3)\fP
 error occurred as \fI<curl/curl.h>\fP defines. See the \fIlibcurl-errors(3)\fP
 man page for the full list with descriptions.
 
+Strings passed on to libcurl must be shorter than 8000000 bytes, otherwise
+\fIcurl_easy_setopt(3)\fP returns \fBCURLE_BAD_FUNCTION_ARGUMENT\fP (added in
+7.65.0).
+
 If you try to set an option that libcurl doesn't know about, perhaps because
 the library is too old to support it or the option was removed in a recent
 version, this function will return \fICURLE_UNKNOWN_OPTION\fP. If support for
index 3c1a1ac..bd623e4 100644 (file)
@@ -19,7 +19,7 @@
 .\" * KIND, either express or implied.
 .\" *
 .\" **************************************************************************
-.TH curl_easy_strerror 3 "February 03, 2016" "libcurl 7.62.0" "libcurl Manual"
+.TH curl_easy_strerror 3 "February 03, 2016" "libcurl 7.68.0" "libcurl Manual"
 
 .SH NAME
 curl_easy_strerror - return string describing error code
index 86fa155..901c73c 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH curl_easy_unescape 3 "October 04, 2016" "libcurl 7.62.0" "libcurl Manual"
+.TH curl_easy_unescape 3 "October 04, 2016" "libcurl 7.68.0" "libcurl Manual"
 
 .SH NAME
 curl_easy_unescape - URL decodes the given string
index 9487b15..20eb8b0 100644 (file)
@@ -19,7 +19,7 @@
 .\" * KIND, either express or implied.
 .\" *
 .\" **************************************************************************
-.TH curl_escape 3 "February 03, 2016" "libcurl 7.62.0" "libcurl Manual"
+.TH curl_escape 3 "February 03, 2016" "libcurl 7.68.0" "libcurl Manual"
 
 .SH NAME
 curl_escape - URL encodes the given string
index 17e2701..b26087b 100644 (file)
@@ -19,7 +19,7 @@
 .\" * KIND, either express or implied.
 .\" *
 .\" **************************************************************************
-.TH curl_formadd 3 "October 08, 2017" "libcurl 7.62.0" "libcurl Manual"
+.TH curl_formadd 3 "December 11, 2018" "libcurl 7.68.0" "libcurl Manual"
 
 .SH NAME
 curl_formadd - add a section to a multipart/formdata HTTP POST
@@ -176,7 +176,8 @@ Deprecated in 7.56.0. Before this release, field names were allowed to
 contain zero-valued bytes. The pseudo-filename "-" to read stdin is
 discouraged although still supported, but data is not read before being
 actually sent: the effective data size can then not be automatically
-determined, resulting in a chunked encoding transfer.
+determined, resulting in a chunked encoding transfer. Backslashes and
+double quotes in field and file names are now escaped before transmission.
 .SH RETURN VALUE
 0 means everything was ok, non-zero means an error occurred corresponding
 to a CURL_FORMADD_* constant defined in
index 195678a..da7b256 100644 (file)
@@ -19,7 +19,7 @@
 .\" * KIND, either express or implied.
 .\" *
 .\" **************************************************************************
-.TH curl_formfree 3 "August 09, 2018" "libcurl 7.62.0" "libcurl Manual"
+.TH curl_formfree 3 "August 09, 2018" "libcurl 7.68.0" "libcurl Manual"
 
 .SH NAME
 curl_formfree - free a previously build multipart/formdata HTTP POST chain
index 7130879..6e95978 100644 (file)
@@ -19,7 +19,7 @@
 .\" * KIND, either express or implied.
 .\" *
 .\" **************************************************************************
-.TH curl_formget 3 "September 02, 2017" "libcurl 7.62.0" "libcurl Manual"
+.TH curl_formget 3 "September 02, 2017" "libcurl 7.68.0" "libcurl Manual"
 
 .SH NAME
 curl_formget - serialize a previously built multipart/formdata HTTP POST chain
index 4fcf6ba..eb58b19 100644 (file)
@@ -19,7 +19,7 @@
 .\" * KIND, either express or implied.
 .\" *
 .\" **************************************************************************
-.TH curl_free 3 "August 09, 2018" "libcurl 7.62.0" "libcurl Manual"
+.TH curl_free 3 "August 09, 2018" "libcurl 7.68.0" "libcurl Manual"
 
 .SH NAME
 curl_free - reclaim memory that has been obtained through a libcurl call
index 47309e1..6a27f1c 100644 (file)
@@ -19,7 +19,7 @@
 .\" * KIND, either express or implied.
 .\" *
 .\" **************************************************************************
-.TH curl_getdate 3 "January 18, 2018" "libcurl 7.62.0" "libcurl Manual"
+.TH curl_getdate 3 "January 18, 2018" "libcurl 7.68.0" "libcurl Manual"
 
 .SH NAME
 curl_getdate - Convert a date string to number of seconds
index db0cb0e..763e99a 100644 (file)
@@ -19,7 +19,7 @@
 .\" * KIND, either express or implied.
 .\" *
 .\" **************************************************************************
-.TH curl_getenv 3 "February 03, 2016" "libcurl 7.62.0" "libcurl Manual"
+.TH curl_getenv 3 "February 03, 2016" "libcurl 7.68.0" "libcurl Manual"
 
 .SH NAME
 curl_getenv - return value for environment name
index 7e59db6..a1929cc 100644 (file)
@@ -19,7 +19,7 @@
 .\" * KIND, either express or implied.
 .\" *
 .\" **************************************************************************
-.TH curl_global_cleanup 3 "September 20, 2016" "libcurl 7.62.0" "libcurl Manual"
+.TH curl_global_cleanup 3 "September 20, 2016" "libcurl 7.68.0" "libcurl Manual"
 
 .SH NAME
 curl_global_cleanup - global libcurl cleanup
index c310876..8e83dc5 100644 (file)
@@ -19,7 +19,7 @@
 .\" * KIND, either express or implied.
 .\" *
 .\" **************************************************************************
-.TH curl_global_init 3 "April 17, 2018" "libcurl 7.62.0" "libcurl Manual"
+.TH curl_global_init 3 "April 17, 2018" "libcurl 7.68.0" "libcurl Manual"
 
 .SH NAME
 curl_global_init - Global libcurl initialisation
index d14d791..86936d8 100644 (file)
@@ -5,7 +5,7 @@
 .\" *                            | (__| |_| |  _ <| |___
 .\" *                             \___|\___/|_| \_\_____|
 .\" *
-.\" * Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 .\" *
 .\" * This software is licensed as described in the file COPYING, which
 .\" * you should have received as part of this distribution. The terms
@@ -19,7 +19,7 @@
 .\" * KIND, either express or implied.
 .\" *
 .\" **************************************************************************
-.TH curl_global_init_mem 3 "September 23, 2018" "libcurl 7.62.0" "libcurl Manual"
+.TH curl_global_init_mem 3 "August 11, 2019" "libcurl 7.68.0" "libcurl Manual"
 
 .SH NAME
 curl_global_init_mem - Global libcurl initialisation with memory callbacks
@@ -60,6 +60,8 @@ to that man page for documentation.
 .SH "CAUTION"
 Manipulating these gives considerable powers to the application to severely
 screw things up for libcurl. Take care!
+.SH AVAILABILITY
+Added in 7.12.0
 .SH "SEE ALSO"
 .BR curl_global_init "(3), "
 .BR curl_global_cleanup "(3), "
index 961f664..64642e4 100644 (file)
@@ -19,7 +19,7 @@
 .\" * KIND, either express or implied.
 .\" *
 .\" **************************************************************************
-.TH curl_global_sslset 3 "October 30, 2018" "libcurl 7.62.0" "libcurl Manual"
+.TH curl_global_sslset 3 "November 07, 2019" "libcurl 7.68.0" "libcurl Manual"
 
 .SH NAME
 curl_global_sslset - Select SSL backend to use with libcurl
@@ -42,9 +42,10 @@ typedef enum {
   CURLSSLBACKEND_WOLFSSL = 7,
   CURLSSLBACKEND_SCHANNEL = 8,
   CURLSSLBACKEND_DARWINSSL = 9,
-  CURLSSLBACKEND_AXTLS = 10,
+  CURLSSLBACKEND_AXTLS = 10, /* deprecated */
   CURLSSLBACKEND_MBEDTLS = 11,
-  CURLSSLBACKEND_MESALINK = 12
+  CURLSSLBACKEND_MESALINK = 12,
+  CURLSSLBACKEND_BEARSSL = 13
 } curl_sslbackend;
 
 .B "CURLsslset curl_global_sslset(curl_sslbackend " id,
index a97484c..dad45f9 100644 (file)
@@ -19,7 +19,7 @@
 .\" * KIND, either express or implied.
 .\" *
 .\" **************************************************************************
-.TH curl_mime_addpart 3 "September 22, 2017" "libcurl 7.62.0" "libcurl Manual"
+.TH curl_mime_addpart 3 "September 22, 2017" "libcurl 7.68.0" "libcurl Manual"
 
 .SH NAME
 curl_mime_addpart - append a new empty part to a mime structure
index 2c45a48..bea46f2 100644 (file)
@@ -19,7 +19,7 @@
 .\" * KIND, either express or implied.
 .\" *
 .\" **************************************************************************
-.TH curl_mime_data 3 "September 22, 2017" "libcurl 7.62.0" "libcurl Manual"
+.TH curl_mime_data 3 "September 22, 2017" "libcurl 7.68.0" "libcurl Manual"
 
 .SH NAME
 curl_mime_data - set a mime part's body data from memory
index 6f48d35..a34abde 100644 (file)
@@ -19,7 +19,7 @@
 .\" * KIND, either express or implied.
 .\" *
 .\" **************************************************************************
-.TH curl_mime_data_cb 3 "April 17, 2018" "libcurl 7.62.0" "libcurl Manual"
+.TH curl_mime_data_cb 3 "April 17, 2018" "libcurl 7.68.0" "libcurl Manual"
 
 .SH NAME
 curl_mime_data_cb - set a callback-based data source for a mime part's body
index f3e93e9..c685899 100644 (file)
@@ -19,7 +19,7 @@
 .\" * KIND, either express or implied.
 .\" *
 .\" **************************************************************************
-.TH curl_mime_encoder 3 "September 05, 2017" "libcurl 7.62.0" "libcurl Manual"
+.TH curl_mime_encoder 3 "September 05, 2017" "libcurl 7.68.0" "libcurl Manual"
 
 .SH NAME
 curl_mime_encoder - set a mime part's encoder and content transfer encoding
index 970805b..72762b0 100644 (file)
@@ -19,7 +19,7 @@
 .\" * KIND, either express or implied.
 .\" *
 .\" **************************************************************************
-.TH curl_mime_filedata 3 "April 17, 2018" "libcurl 7.62.0" "libcurl Manual"
+.TH curl_mime_filedata 3 "April 17, 2018" "libcurl 7.68.0" "libcurl Manual"
 
 .SH NAME
 curl_mime_filedata - set a mime part's body data from a file contents
index 1190abf..2669cc5 100644 (file)
@@ -19,7 +19,7 @@
 .\" * KIND, either express or implied.
 .\" *
 .\" **************************************************************************
-.TH curl_mime_filename 3 "September 22, 2017" "libcurl 7.62.0" "libcurl Manual"
+.TH curl_mime_filename 3 "September 22, 2017" "libcurl 7.68.0" "libcurl Manual"
 
 .SH NAME
 curl_mime_filename - set a mime part's remote file name
index 3f3fc06..e78454e 100644 (file)
@@ -19,7 +19,7 @@
 .\" * KIND, either express or implied.
 .\" *
 .\" **************************************************************************
-.TH curl_mime_free 3 "August 09, 2018" "libcurl 7.62.0" "libcurl Manual"
+.TH curl_mime_free 3 "August 09, 2018" "libcurl 7.68.0" "libcurl Manual"
 
 .SH NAME
 curl_mime_free - free a previously built mime structure
index 8ea6d94..47107b5 100644 (file)
@@ -19,7 +19,7 @@
 .\" * KIND, either express or implied.
 .\" *
 .\" **************************************************************************
-.TH curl_mime_headers 3 "September 22, 2017" "libcurl 7.62.0" "libcurl Manual"
+.TH curl_mime_headers 3 "September 22, 2017" "libcurl 7.68.0" "libcurl Manual"
 
 .SH NAME
 curl_mime_headers - set a mime part's custom headers
index f7c7da4..5998eaa 100644 (file)
@@ -19,7 +19,7 @@
 .\" * KIND, either express or implied.
 .\" *
 .\" **************************************************************************
-.TH curl_mime_init 3 "September 22, 2017" "libcurl 7.62.0" "libcurl Manual"
+.TH curl_mime_init 3 "September 22, 2017" "libcurl 7.68.0" "libcurl Manual"
 
 .SH NAME
 curl_mime_init - create a mime handle
index f68c79e..d6ea794 100644 (file)
@@ -19,7 +19,7 @@
 .\" * KIND, either express or implied.
 .\" *
 .\" **************************************************************************
-.TH curl_mime_name 3 "September 22, 2017" "libcurl 7.62.0" "libcurl Manual"
+.TH curl_mime_name 3 "September 22, 2017" "libcurl 7.68.0" "libcurl Manual"
 
 .SH NAME
 curl_mime_name - set a mime part's name
index a442a57..ab19b2c 100644 (file)
@@ -19,7 +19,7 @@
 .\" * KIND, either express or implied.
 .\" *
 .\" **************************************************************************
-.TH curl_mime_subparts 3 "September 05, 2017" "libcurl 7.62.0" "libcurl Manual"
+.TH curl_mime_subparts 3 "September 05, 2017" "libcurl 7.68.0" "libcurl Manual"
 
 .SH NAME
 curl_mime_subparts - set subparts of a multipart mime part
index 3f89dd3..96ea102 100644 (file)
@@ -19,7 +19,7 @@
 .\" * KIND, either express or implied.
 .\" *
 .\" **************************************************************************
-.TH curl_mime_type 3 "April 17, 2018" "libcurl 7.62.0" "libcurl Manual"
+.TH curl_mime_type 3 "April 17, 2018" "libcurl 7.68.0" "libcurl Manual"
 
 .SH NAME
 curl_mime_type - set a mime part's content type
index 386c852..4aa5782 100644 (file)
@@ -19,7 +19,7 @@
 .\" * KIND, either express or implied.
 .\" *
 .\" **************************************************************************
-.TH curl_printf 3 "April 01, 2016" "libcurl 7.62.0" "libcurl Manual"
+.TH curl_printf 3 "April 01, 2016" "libcurl 7.68.0" "libcurl Manual"
 
 .SH NAME
 curl_maprintf, curl_mfprintf, curl_mprintf, curl_msnprintf, curl_msprintf
index e8fdaa5..dfe6e0d 100644 (file)
@@ -19,7 +19,7 @@
 .\" * KIND, either express or implied.
 .\" *
 .\" **************************************************************************
-.TH curl_multi_add_handle 3 "June 30, 2018" "libcurl 7.62.0" "libcurl Manual"
+.TH curl_multi_add_handle 3 "June 30, 2018" "libcurl 7.68.0" "libcurl Manual"
 
 .SH NAME
 curl_multi_add_handle - add an easy handle to a multi session
index 888c59a..0dcdcfd 100644 (file)
@@ -19,7 +19,7 @@
 .\" * KIND, either express or implied.
 .\" *
 .\" **************************************************************************
-.TH curl_multi_assign 3 "February 03, 2016" "libcurl 7.62.0" "libcurl Manual"
+.TH curl_multi_assign 3 "February 03, 2016" "libcurl 7.68.0" "libcurl Manual"
 
 .SH NAME
 curl_multi_assign \- set data to associate with an internal socket
index 7c6c208..1e31e78 100644 (file)
@@ -19,7 +19,7 @@
 .\" * KIND, either express or implied.
 .\" *
 .\" **************************************************************************
-.TH curl_multi_cleanup 3 "August 09, 2018" "libcurl 7.62.0" "libcurl Manual"
+.TH curl_multi_cleanup 3 "August 09, 2018" "libcurl 7.68.0" "libcurl Manual"
 
 .SH NAME
 curl_multi_cleanup - close down a multi session
index 1a6dbd7..b2655f0 100644 (file)
@@ -19,7 +19,7 @@
 .\" * KIND, either express or implied.
 .\" *
 .\" **************************************************************************
-.TH curl_multi_fdset 3 "November 09, 2017" "libcurl 7.62.0" "libcurl Manual"
+.TH curl_multi_fdset 3 "November 09, 2017" "libcurl 7.68.0" "libcurl Manual"
 
 .SH NAME
 curl_multi_fdset - extracts file descriptor information from a multi handle
index 98d5300..5bd8bea 100644 (file)
@@ -19,7 +19,7 @@
 .\" * KIND, either express or implied.
 .\" *
 .\" **************************************************************************
-.TH curl_multi_info_read 3 "February 03, 2016" "libcurl 7.62.0" "libcurl Manual"
+.TH curl_multi_info_read 3 "February 03, 2016" "libcurl 7.68.0" "libcurl Manual"
 
 .SH NAME
 curl_multi_info_read - read multi stack informationals
index 234c897..0d357db 100644 (file)
@@ -19,7 +19,7 @@
 .\" * KIND, either express or implied.
 .\" *
 .\" **************************************************************************
-.TH curl_multi_init 3 "September 23, 2018" "libcurl 7.62.0" "libcurl Manual"
+.TH curl_multi_init 3 "September 23, 2018" "libcurl 7.68.0" "libcurl Manual"
 
 .SH NAME
 curl_multi_init - create a multi handle
index da54e2f..e83eafd 100644 (file)
@@ -5,7 +5,7 @@
 .\" *                            | (__| |_| |  _ <| |___
 .\" *                             \___|\___/|_| \_\_____|
 .\" *
-.\" * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 .\" *
 .\" * This software is licensed as described in the file COPYING, which
 .\" * you should have received as part of this distribution. The terms
@@ -19,7 +19,7 @@
 .\" * KIND, either express or implied.
 .\" *
 .\" **************************************************************************
-.TH curl_multi_perform 3 "February 03, 2016" "libcurl 7.62.0" "libcurl Manual"
+.TH curl_multi_perform 3 "October 31, 2019" "libcurl 7.68.0" "libcurl Manual"
 
 .SH NAME
 curl_multi_perform - reads/writes available data from each easy handle
@@ -47,6 +47,8 @@ know that there is one or more transfers less "running". You can then call
 \fIcurl_multi_info_read(3)\fP to get information about each individual
 completed transfer, and that returned info includes CURLcode and more. If an
 added handle fails very quickly, it may never be counted as a running_handle.
+You could use \fIcurl_multi_info_read(3)\fP to track actual status of the
+added handles in that case.
 
 When \fIrunning_handles\fP is set to zero (0) on the return of this function,
 there is no longer any transfers in progress.
diff --git a/docs/libcurl/curl_multi_poll.3 b/docs/libcurl/curl_multi_poll.3
new file mode 100644 (file)
index 0000000..edf2ca6
--- /dev/null
@@ -0,0 +1,118 @@
+.\" **************************************************************************
+.\" *                                  _   _ ____  _
+.\" *  Project                     ___| | | |  _ \| |
+.\" *                             / __| | | | |_) | |
+.\" *                            | (__| |_| |  _ <| |___
+.\" *                             \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
+.\" * are also available at https://curl.haxx.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.TH curl_multi_poll 3 "November 17, 2019" "libcurl 7.68.0" "libcurl Manual"
+
+.SH NAME
+curl_multi_poll - polls on all easy handles in a multi handle
+.SH SYNOPSIS
+.nf
+#include <curl/curl.h>
+
+CURLMcode curl_multi_poll(CURLM *multi_handle,
+                          struct curl_waitfd extra_fds[],
+                          unsigned int extra_nfds,
+                          int timeout_ms,
+                          int *numfds);
+.ad
+.SH DESCRIPTION
+\fIcurl_multi_poll(3)\fP polls all file descriptors used by the curl easy
+handles contained in the given multi handle set.  It will block until activity
+is detected on at least one of the handles or \fItimeout_ms\fP has passed.
+Alternatively, if the multi handle has a pending internal timeout that has a
+shorter expiry time than \fItimeout_ms\fP, that shorter time will be used
+instead to make sure timeout accuracy is reasonably kept.
+
+The calling application may pass additional curl_waitfd structures which are
+similar to \fIpoll(2)\fP's pollfd structure to be waited on in the same call.
+
+On completion, if \fInumfds\fP is non-NULL, it will be populated with the
+total number of file descriptors on which interesting events occurred. This
+number can include both libcurl internal descriptors as well as descriptors
+provided in \fIextra_fds\fP.
+
+The \fIcurl_multi_wakeup(3)\fP function can be used from another thread to
+wake up this function and return faster. This is one of the details
+that makes this function different than \fIcurl_multi_wait(3)\fP which cannot
+be woken up this way.
+
+If no extra file descriptors are provided and libcurl has no file descriptor
+to offer to wait for, this function will instead wait during \fItimeout_ms\fP
+milliseconds (or shorter if an internal timer indicates so). This is the
+other detail that makes this function different than
+\fIcurl_multi_wait(3)\fP.
+
+This function is encouraged to be used instead of select(3) when using the
+multi interface to allow applications to easier circumvent the common problem
+with 1024 maximum file descriptors.
+.SH curl_waitfd
+.nf
+struct curl_waitfd {
+  curl_socket_t fd;
+  short events;
+  short revents;
+};
+.fi
+.IP CURL_WAIT_POLLIN
+Bit flag to curl_waitfd.events indicating the socket should poll on read
+events such as new data received.
+.IP CURL_WAIT_POLLPRI
+Bit flag to curl_waitfd.events indicating the socket should poll on high
+priority read events such as out of band data.
+.IP CURL_WAIT_POLLOUT
+Bit flag to curl_waitfd.events indicating the socket should poll on write
+events such as the socket being clear to write without blocking.
+.SH EXAMPLE
+.nf
+CURL *easy_handle;
+CURLM *multi_handle;
+
+/* add the individual easy handle */
+curl_multi_add_handle(multi_handle, easy_handle);
+
+do {
+  CURLMcode mc;
+  int numfds;
+
+  mc = curl_multi_perform(multi_handle, &still_running);
+
+  if(mc == CURLM_OK) {
+    /* wait for activity or timeout */
+    mc = curl_multi_poll(multi_handle, NULL, 0, 1000, &numfds);
+  }
+
+  if(mc != CURLM_OK) {
+    fprintf(stderr, "curl_multi failed, code %d.\\n", mc);
+    break;
+  }
+
+} while(still_running);
+
+curl_multi_remove_handle(multi_handle, easy_handle);
+.fi
+.SH RETURN VALUE
+CURLMcode type, general libcurl multi interface error code. See
+\fIlibcurl-errors(3)\fP
+.SH AVAILABILITY
+This function was added in libcurl 7.66.0.
+.SH "SEE ALSO"
+.BR curl_multi_fdset "(3), " curl_multi_perform "(3), "
+.BR curl_multi_wait "(3), " curl_multi_wakeup "(3)"
index d6cbf5b..4d4c540 100644 (file)
@@ -5,7 +5,7 @@
 .\" *                            | (__| |_| |  _ <| |___
 .\" *                             \___|\___/|_| \_\_____|
 .\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 .\" *
 .\" * This software is licensed as described in the file COPYING, which
 .\" * you should have received as part of this distribution. The terms
@@ -19,7 +19,7 @@
 .\" * KIND, either express or implied.
 .\" *
 .\" **************************************************************************
-.TH curl_multi_remove_handle 3 "February 03, 2016" "libcurl 7.62.0" "libcurl Manual"
+.TH curl_multi_remove_handle 3 "February 19, 2019" "libcurl 7.68.0" "libcurl Manual"
 
 .SH NAME
 curl_multi_remove_handle - remove an easy handle from a multi session
@@ -38,6 +38,9 @@ perfectly legal to invoke \fIcurl_easy_perform(3)\fP on this easy handle.
 Removing an easy handle while being used is perfectly legal and will
 effectively halt the transfer in progress involving that easy handle. All
 other easy handles and transfers will remain unaffected.
+
+It is fine to remove a handle at any time during a transfer, just not from
+within any libcurl callback function.
 .SH RETURN VALUE
 CURLMcode type, general libcurl multi interface error code.
 .SH "SEE ALSO"
index 63bb059..c05589c 100644 (file)
@@ -5,7 +5,7 @@
 .\" *                            | (__| |_| |  _ <| |___
 .\" *                             \___|\___/|_| \_\_____|
 .\" *
-.\" * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 .\" *
 .\" * This software is licensed as described in the file COPYING, which
 .\" * you should have received as part of this distribution. The terms
@@ -19,7 +19,7 @@
 .\" * KIND, either express or implied.
 .\" *
 .\" **************************************************************************
-.TH curl_multi_setopt 3 "February 03, 2016" "libcurl 7.62.0" "libcurl Manual"
+.TH curl_multi_setopt 3 "September 24, 2019" "libcurl 7.68.0" "libcurl Manual"
 
 .SH NAME
 curl_multi_setopt \- set options for a curl multi handle
@@ -68,6 +68,8 @@ See \fICURLMOPT_SOCKETDATA(3)\fP
 See \fICURLMOPT_TIMERFUNCTION(3)\fP
 .IP CURLMOPT_TIMERDATA
 See \fICURLMOPT_TIMERDATA(3)\fP
+.IP CURLMOPT_MAX_CONCURRENT_STREAMS
+See \fICURLMOPT_MAX_CONCURRENT_STREAMS(3)\fP
 .SH RETURNS
 The standard CURLMcode for multi interface error codes. Note that it returns a
 CURLM_UNKNOWN_OPTION if you try setting an option that this version of libcurl
index a486c97..43dc92d 100644 (file)
@@ -19,7 +19,7 @@
 .\" * KIND, either express or implied.
 .\" *
 .\" **************************************************************************
-.TH curl_multi_socket 3 "June 30, 2018" "libcurl 7.62.0" "libcurl Manual"
+.TH curl_multi_socket 3 "June 30, 2018" "libcurl 7.68.0" "libcurl Manual"
 
 .SH NAME
 curl_multi_socket \- reads/writes available data
index 3887c8f..bca4ee6 100644 (file)
@@ -5,7 +5,7 @@
 .\" *                            | (__| |_| |  _ <| |___
 .\" *                             \___|\___/|_| \_\_____|
 .\" *
-.\" * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 .\" *
 .\" * This software is licensed as described in the file COPYING, which
 .\" * you should have received as part of this distribution. The terms
@@ -19,7 +19,7 @@
 .\" * KIND, either express or implied.
 .\" *
 .\" **************************************************************************
-.TH curl_multi_socket_action 3 "June 30, 2018" "libcurl 7.62.0" "libcurl Manual"
+.TH curl_multi_socket_action 3 "June 10, 2019" "libcurl 7.68.0" "libcurl Manual"
 
 .SH NAME
 curl_multi_socket_action \- reads/writes available data given an action
@@ -44,15 +44,14 @@ libcurl will test the descriptor internally. It is also permissible to pass
 CURL_SOCKET_TIMEOUT to the \fBsockfd\fP parameter in order to initiate the
 whole process or when a timeout occurs.
 
-At return, \fBrunning_handles\fP points to the number
-of running easy handles within the multi handle. When this number reaches
-zero, all transfers are complete/done. When you call
-\fIcurl_multi_socket_action(3)\fP on a specific socket and the counter
-decreases by one, it DOES NOT necessarily mean that this exact socket/transfer
-is the one that completed. Use \fIcurl_multi_info_read(3)\fP to figure out
-which easy handle that completed.
+At return, \fBrunning_handles\fP points to the number of running easy handles
+within the multi handle. When this number reaches zero, all transfers are
+complete/done. When you call \fIcurl_multi_socket_action(3)\fP on a specific
+socket and the counter decreases by one, it DOES NOT necessarily mean that
+this exact socket/transfer is the one that completed. Use
+\fIcurl_multi_info_read(3)\fP to figure out which easy handle that completed.
 
-The \fIcurl_multi_socket_action(3)\fP functions inform the application about
+The \fIcurl_multi_socket_action(3)\fP function informs the application about
 updates in the socket (file descriptor) status by doing none, one, or multiple
 calls to the socket callback function set with the
 \fICURLMOPT_SOCKETFUNCTION(3)\fP option to \fIcurl_multi_setopt(3)\fP. They
@@ -67,65 +66,6 @@ timeout action: call the \fIcurl_multi_socket_action(3)\fP function with the
 \fIcurl_multi_timeout(3)\fP function to poll the value at any given time, but
 for an event-based system using the callback is far better than relying on
 polling the timeout value.
-.SH "CALLBACK DETAILS"
-
-The socket \fBcallback\fP function uses a prototype like this
-.nf
-
-  int curl_socket_callback(CURL *easy,      /* easy handle */
-                           curl_socket_t s, /* socket */
-                           int action,      /* see values below */
-                           void *userp,    /* private callback pointer */
-                           void *socketp); /* private socket pointer,
-                                              \fBNULL\fP if not
-                                              previously assigned with
-                                              \fIcurl_multi_assign(3)\fP */
-
-.fi
-The callback MUST return 0.
-
-The \fIeasy\fP argument is a pointer to the easy handle that deals with this
-particular socket. Note that a single handle may work with several sockets
-simultaneously.
-
-The \fIs\fP argument is the actual socket value as you use it within your
-system.
-
-The \fIaction\fP argument to the callback has one of five values:
-.RS
-.IP "CURL_POLL_NONE (0)"
-register, not interested in readiness (yet)
-.IP "CURL_POLL_IN (1)"
-register, interested in read readiness
-.IP "CURL_POLL_OUT (2)"
-register, interested in write readiness
-.IP "CURL_POLL_INOUT (3)"
-register, interested in both read and write readiness
-.IP "CURL_POLL_REMOVE (4)"
-unregister
-.RE
-
-The \fIsocketp\fP argument is a private pointer you have previously set with
-\fIcurl_multi_assign(3)\fP to be associated with the \fIs\fP socket. If no
-pointer has been set, socketp will be NULL. This argument is of course a
-service to applications that want to keep certain data or structs that are
-strictly associated to the given socket.
-
-The \fIuserp\fP argument is a private pointer you have previously set with
-\fIcurl_multi_setopt(3)\fP and the \fICURLMOPT_SOCKETDATA(3)\fP option.
-.SH "RETURN VALUE"
-CURLMcode type, general libcurl multi interface error code.
-
-Before version 7.20.0: If you receive \fICURLM_CALL_MULTI_PERFORM\fP, this
-basically means that you should call \fIcurl_multi_socket_action(3)\fP again
-before you wait for more actions on libcurl's sockets. You don't have to do it
-immediately, but the return code means that libcurl may have more data
-available to return or that there may be more data to send off before it is
-"satisfied".
-
-The return code from this function is for the whole multi stack.  Problems
-still might have occurred on individual transfers even when one of these
-functions return OK.
 .SH "TYPICAL USAGE"
 1. Create a multi handle
 
index 3893f99..5cb8983 100644 (file)
@@ -19,7 +19,7 @@
 .\" * KIND, either express or implied.
 .\" *
 .\" **************************************************************************
-.TH curl_multi_strerror 3 "February 03, 2016" "libcurl 7.62.0" "libcurl Manual"
+.TH curl_multi_strerror 3 "February 03, 2016" "libcurl 7.68.0" "libcurl Manual"
 
 .SH NAME
 curl_multi_strerror - return string describing error code
index 97664a2..0149ef7 100644 (file)
@@ -19,7 +19,7 @@
 .\" * KIND, either express or implied.
 .\" *
 .\" **************************************************************************
-.TH curl_multi_timeout 3 "September 23, 2018" "libcurl 7.62.0" "libcurl Manual"
+.TH curl_multi_timeout 3 "September 23, 2018" "libcurl 7.68.0" "libcurl Manual"
 
 .SH NAME
 curl_multi_timeout \- how long to wait for action before proceeding
index d6451b4..d0c1539 100644 (file)
@@ -5,7 +5,7 @@
 .\" *                            | (__| |_| |  _ <| |___
 .\" *                             \___|\___/|_| \_\_____|
 .\" *
-.\" * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 .\" *
 .\" * This software is licensed as described in the file COPYING, which
 .\" * you should have received as part of this distribution. The terms
@@ -19,7 +19,7 @@
 .\" * KIND, either express or implied.
 .\" *
 .\" **************************************************************************
-.TH curl_multi_wait 3 "March 09, 2016" "libcurl 7.62.0" "libcurl Manual"
+.TH curl_multi_wait 3 "November 28, 2019" "libcurl 7.68.0" "libcurl Manual"
 
 .SH NAME
 curl_multi_wait - polls on all easy handles in a multi handle
@@ -50,7 +50,8 @@ number can include both libcurl internal descriptors as well as descriptors
 provided in \fIextra_fds\fP.
 
 If no extra file descriptors are provided and libcurl has no file descriptor
-to offer to wait for, this function will return immediately.
+to offer to wait for, this function will return immediately. (Try
+\fIcurl_multi_poll(3)\fP instead if you rather avoid this behavior.)
 
 This function is encouraged to be used instead of select(3) when using the
 multi interface to allow applications to easier circumvent the common problem
@@ -92,7 +93,7 @@ do {
   }
 
   if(mc != CURLM_OK) {
-    fprintf(stderr, "curl_multi failed, code %d.\n", mc);
+    fprintf(stderr, "curl_multi failed, code %d.\\n", mc);
     break;
   }
 
@@ -120,4 +121,4 @@ CURLMcode type, general libcurl multi interface error code. See
 .SH AVAILABILITY
 This function was added in libcurl 7.28.0.
 .SH "SEE ALSO"
-.BR curl_multi_fdset "(3), " curl_multi_perform "(3)"
+.BR curl_multi_fdset "(3), " curl_multi_perform "(3)", curl_multi_poll "(3) ",
diff --git a/docs/libcurl/curl_multi_wakeup.3 b/docs/libcurl/curl_multi_wakeup.3
new file mode 100644 (file)
index 0000000..462b1a0
--- /dev/null
@@ -0,0 +1,87 @@
+.\" **************************************************************************
+.\" *                                  _   _ ____  _
+.\" *  Project                     ___| | | |  _ \| |
+.\" *                             / __| | | | |_) | |
+.\" *                            | (__| |_| |  _ <| |___
+.\" *                             \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
+.\" * are also available at https://curl.haxx.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.TH curl_multi_wakeup 3 "November 25, 2019" "libcurl 7.68.0" "libcurl Manual"
+
+.SH NAME
+curl_multi_wakeup - wakes up a sleeping curl_multi_poll call
+.SH SYNOPSIS
+#include <curl/curl.h>
+
+CURLMcode curl_multi_wakeup(CURLM *multi_handle);
+.ad
+.SH DESCRIPTION
+This function can be called from any thread and it wakes up a
+sleeping \fIcurl_multi_poll(3)\fP call that is currently (or will be)
+waiting for activity or a timeout.
+
+If the function is called when there is no \fIcurl_multi_poll(3)\fP call,
+it will cause the next call to return immediately.
+
+Calling this function only guarantees to wake up the current (or the next
+if there is no current) \fIcurl_multi_poll(3)\fP call, which means it is
+possible that multiple calls to this function will wake up the same waiting
+operation.
+
+This function has no effect on \fIcurl_multi_wait(3)\fP calls.
+.SH RETURN VALUE
+CURLMcode type, general libcurl multi interface error code.
+.SH AVAILABILITY
+Added in 7.68.0
+.SH EXAMPLE
+.nf
+CURL *easy_handle;
+CURLM *multi_handle;
+
+/* add the individual easy handle */
+curl_multi_add_handle(multi_handle, easy_handle);
+
+/* this is thread 1 */
+do {
+  CURLMcode mc;
+  int numfds;
+
+  mc = curl_multi_perform(multi_handle, &still_running);
+
+  if(mc == CURLM_OK) {
+    /* wait for activity, timeout or wakeup */
+    mc = curl_multi_poll(multi_handle, NULL, 0, 10000, &numfds);
+  }
+
+  if(time_to_die())
+    exit(1);
+
+} while(still_running);
+
+curl_multi_remove_handle(multi_handle, easy_handle);
+
+/* this is thread 2 */
+
+if(something makes us decide to stop thread 1) {
+
+  set_something_to_signal_thread_1_to_exit();
+
+  curl_multi_wakeup(multi_handle);
+}
+
+.fi
+.SH "SEE ALSO"
+.BR curl_multi_poll "(3), " curl_multi_wait "(3)"
index 7217a45..c5374ba 100644 (file)
@@ -19,7 +19,7 @@
 .\" * KIND, either express or implied.
 .\" *
 .\" **************************************************************************
-.TH curl_share_cleanup 3 "August 09, 2018" "libcurl 7.62.0" "libcurl Manual"
+.TH curl_share_cleanup 3 "August 09, 2018" "libcurl 7.68.0" "libcurl Manual"
 
 .SH NAME
 curl_share_cleanup - Clean up a shared object
index 9bc3f59..65bd020 100644 (file)
@@ -19,7 +19,7 @@
 .\" * KIND, either express or implied.
 .\" *
 .\" **************************************************************************
-.TH curl_share_init 3 "September 23, 2018" "libcurl 7.62.0" "libcurl Manual"
+.TH curl_share_init 3 "September 23, 2018" "libcurl 7.68.0" "libcurl Manual"
 
 .SH NAME
 curl_share_init - Create a shared object
index d33d764..67eb2d4 100644 (file)
@@ -5,7 +5,7 @@
 .\" *                            | (__| |_| |  _ <| |___
 .\" *                             \___|\___/|_| \_\_____|
 .\" *
-.\" * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 .\" *
 .\" * This software is licensed as described in the file COPYING, which
 .\" * you should have received as part of this distribution. The terms
@@ -19,7 +19,7 @@
 .\" * KIND, either express or implied.
 .\" *
 .\" **************************************************************************
-.TH curl_share_setopt 3 "May 28, 2018" "libcurl 7.62.0" "libcurl Manual"
+.TH curl_share_setopt 3 "June 04, 2019" "libcurl 7.68.0" "libcurl Manual"
 
 .SH NAME
 curl_share_setopt - Set options for a shared object
@@ -38,8 +38,8 @@ prototype:
 void lock_function(CURL *handle, curl_lock_data data, curl_lock_access access,
 void *userptr);
 
-\fIdata\fP defines what data libcurl wants to lock, and you must make sure that
-only one lock is given at any time for each kind of data.
+The \fIdata\fP argument tells what kind of data libcurl wants to lock. Make
+sure that the callback uses a different lock for each kind of data.
 
 \fIaccess\fP defines what access type libcurl wants, shared or single.
 
index 5e2fcf6..ca31df8 100644 (file)
@@ -19,7 +19,7 @@
 .\" * KIND, either express or implied.
 .\" *
 .\" **************************************************************************
-.TH curl_share_strerror 3 "February 03, 2016" "libcurl 7.62.0" "libcurl Manual"
+.TH curl_share_strerror 3 "February 03, 2016" "libcurl 7.68.0" "libcurl Manual"
 
 .SH NAME
 curl_share_strerror - return string describing error code
index cc0c527..26de895 100644 (file)
@@ -5,7 +5,7 @@
 .\" *                            | (__| |_| |  _ <| |___
 .\" *                             \___|\___/|_| \_\_____|
 .\" *
-.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 .\" *
 .\" * This software is licensed as described in the file COPYING, which
 .\" * you should have received as part of this distribution. The terms
@@ -19,7 +19,7 @@
 .\" * KIND, either express or implied.
 .\" *
 .\" **************************************************************************
-.TH curl_slist_append 3 "May 05, 2017" "libcurl 7.62.0" "libcurl Manual"
+.TH curl_slist_append 3 "January 02, 2019" "libcurl 7.68.0" "libcurl Manual"
 
 .SH NAME
 curl_slist_append - add a string to an slist
@@ -40,17 +40,29 @@ The list should be freed again (after usage) with
 \fIcurl_slist_free_all(3)\fP.
 .SH RETURN VALUE
 A null pointer is returned if anything went wrong, otherwise the new list
-pointer is returned.
+pointer is returned. To avoid overwriting an existing non-empty list on
+failure, the new list should be returned to a temporary variable which can
+be tested for NULL before updating the original list pointer.
 .SH EXAMPLE
 .nf
 CURL *handle;
 struct curl_slist *slist=NULL;
+struct curl_slist *temp=NULL;
 
 slist = curl_slist_append(slist, "pragma:");
 
 if (slist == NULL)
   return -1;
 
+temp = curl_slist_append(slist, "Accept:")
+
+if (temp == NULL) {
+  curl_slist_free_all(slist);
+  return -1;
+}
+
+slist = temp;
+
 curl_easy_setopt(handle, CURLOPT_HTTPHEADER, slist);
 
 curl_easy_perform(handle);
index 891da80..2473bcf 100644 (file)
@@ -19,7 +19,7 @@
 .\" * KIND, either express or implied.
 .\" *
 .\" **************************************************************************
-.TH curl_slist_free_all 3 "September 23, 2018" "libcurl 7.62.0" "libcurl Manual"
+.TH curl_slist_free_all 3 "September 23, 2018" "libcurl 7.68.0" "libcurl Manual"
 
 .SH NAME
 curl_slist_free_all - free an entire curl_slist list
index f81c618..49ff4b2 100644 (file)
@@ -19,7 +19,7 @@
 .\" * KIND, either express or implied.
 .\" *
 .\" **************************************************************************
-.TH curl_strequal 3 "June 29, 2017" "libcurl 7.62.0" "libcurl Manual"
+.TH curl_strequal 3 "June 29, 2017" "libcurl 7.68.0" "libcurl Manual"
 
 .SH NAME
 curl_strequal, curl_strnequal - case insensitive string comparisons
index 09dad33..0220714 100644 (file)
@@ -19,7 +19,7 @@
 .\" * KIND, either express or implied.
 .\" *
 .\" **************************************************************************
-.TH curl_unescape 3 "February 03, 2016" "libcurl 7.62.0" "libcurl Manual"
+.TH curl_unescape 3 "February 03, 2016" "libcurl 7.68.0" "libcurl Manual"
 
 .SH NAME
 curl_unescape - URL decodes the given string
index 6320892..fc2f1ac 100644 (file)
@@ -5,7 +5,7 @@
 .\" *                            | (__| |_| |  _ <| |___
 .\" *                             \___|\___/|_| \_\_____|
 .\" *
-.\" * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 .\" *
 .\" * This software is licensed as described in the file COPYING, which
 .\" * you should have received as part of this distribution. The terms
@@ -19,7 +19,7 @@
 .\" * KIND, either express or implied.
 .\" *
 .\" **************************************************************************
-.TH curl_url 3 "September 08, 2018" "libcurl 7.62.0" "libcurl Manual"
+.TH curl_url 3 "March 22, 2019" "libcurl 7.68.0" "libcurl Manual"
 
 .SH NAME
 curl_url - returns a new CURLU handle
@@ -27,14 +27,6 @@ curl_url - returns a new CURLU handle
 .B #include <curl/curl.h>
 
 CURLU *curl_url();
-.SH EXPERIMENTAL
-The URL API is considered \fBEXPERIMENTAL\fP until further notice. Please test
-it, report bugs and help us perfect it. Once proven to be reliable, the
-experimental label will be removed.
-
-While this API is marked experimental, we reserve the right to modify the API
-slightly if we deem it necessary and it makes it notably better or easier to
-use.
 .SH DESCRIPTION
 This function will allocates and returns a pointer to a fresh CURLU handle, to
 be used for further use of the URL API.
@@ -49,7 +41,7 @@ Returns a \fBCURLU *\fP if successful, or NULL if out of memory.
     char *scheme;
     rc = curl_url_get(url, CURLUPART_SCHEME, &scheme, 0);
     if(!rc) {
-      printf("the scheme is %s\n", scheme);
+      printf("the scheme is %s\\n", scheme);
       curl_free(scheme);
     }
     curl_url_cleanup(url);
index d031896..0a197b8 100644 (file)
@@ -19,7 +19,7 @@
 .\" * KIND, either express or implied.
 .\" *
 .\" **************************************************************************
-.TH curl_url_cleanup 3 "September 08, 2018" "libcurl 7.62.0" "libcurl Manual"
+.TH curl_url_cleanup 3 "September 08, 2018" "libcurl 7.68.0" "libcurl Manual"
 
 .SH NAME
 curl_url_cleanup - free a CURLU handle
index c8dbe10..0e71eed 100644 (file)
@@ -19,7 +19,7 @@
 .\" * KIND, either express or implied.
 .\" *
 .\" **************************************************************************
-.TH curl_url_dup 3 "September 08, 2018" "libcurl 7.62.0" "libcurl Manual"
+.TH curl_url_dup 3 "September 08, 2018" "libcurl 7.68.0" "libcurl Manual"
 
 .SH NAME
 curl_url_dup - duplicate a CURLU handle
index 233e739..57b7432 100644 (file)
@@ -5,7 +5,7 @@
 .\" *                            | (__| |_| |  _ <| |___
 .\" *                             \___|\___/|_| \_\_____|
 .\" *
-.\" * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 .\" *
 .\" * This software is licensed as described in the file COPYING, which
 .\" * you should have received as part of this distribution. The terms
@@ -19,7 +19,7 @@
 .\" * KIND, either express or implied.
 .\" *
 .\" **************************************************************************
-.TH curl_url_get 3 "October 08, 2018" "libcurl 7.62.0" "libcurl Manual"
+.TH curl_url_get 3 "September 25, 2019" "libcurl 7.68.0" "libcurl Manual"
 
 .SH NAME
 curl_url_get - extract a part from a URL
@@ -77,6 +77,11 @@ Scheme cannot be URL decoded on get.
 .IP CURLUPART_PASSWORD
 .IP CURLUPART_OPTIONS
 .IP CURLUPART_HOST
+The host name. If it is an IPv6 numeric address, the zoneid will not be part
+of it but is provided separately in \fICURLUPART_ZONEID\fP. IPv6 numerical
+addresses are returned within brackets ([]).
+.IP CURLUPART_ZONEID
+If the host name is a numeric IPv6 address, this field might also be set.
 .IP CURLUPART_PORT
 Port cannot be URL decoded on get.
 .IP CURLUPART_PATH
@@ -105,7 +110,7 @@ If this function returns an error, no URL part is returned.
   }
 .fi
 .SH AVAILABILITY
-Added in curl 7.62.0
+Added in curl 7.62.0. CURLUPART_ZONEID was added in 7.65.0.
 .SH "SEE ALSO"
 .BR curl_url_cleanup "(3), " curl_url "(3), " curl_url_set "(3), "
 .BR curl_url_dup "(3), "
index 36addaa..751af58 100644 (file)
@@ -5,7 +5,7 @@
 .\" *                            | (__| |_| |  _ <| |___
 .\" *                             \___|\___/|_| \_\_____|
 .\" *
-.\" * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
 .\" *
 .\" * This software is licensed as described in the file COPYING, which
 .\" * you should have received as part of this distribution. The terms
@@ -19,7 +19,7 @@
 .\" * KIND, either express or implied.
 .\" *
 .\" **************************************************************************
-.TH curl_url_set 3 "October 08, 2018" "libcurl 7.62.0" "libcurl Manual"
+.TH curl_url_set 3 "January 05, 2020" "libcurl 7.68.0" "libcurl Manual"
 
 .SH NAME
 curl_url_set - set a URL part
@@ -61,10 +61,15 @@ Scheme cannot be URL decoded on set.
 .IP CURLUPART_PASSWORD
 .IP CURLUPART_OPTIONS
 .IP CURLUPART_HOST
-The host name can use IDNA. The string must then be encoded as your locale
-says or UTF-8 (when winidn is used).
+The host name. If it is IDNA the string must then be encoded as your locale
+says or UTF-8 (when WinIDN is used). If it is a bracketed IPv6 numeric address
+it may contain a zone id (or you can use CURLUPART_ZONEID).
+.IP CURLUPART_ZONEID
+If the host name is a numeric IPv6 address, this field can also be set.
 .IP CURLUPART_PORT
-Port cannot be URL encoded on set.
+Port cannot be URL encoded on set. The given port number is provided as a
+string and the decimal number must be between 1 and 65535. Anything else will
+return an error.
 .IP CURLUPART_PATH
 If a path is set in the URL without a leading slash, a slash will be inserted
 automatically when this URL is read from the handle.
@@ -72,12 +77,13 @@ automatically when this URL is read from the handle.
 The query part will also get spaces converted to pluses when asked to URL
 encode on set with the CURLU_URLENCODE bit.
 
-If used in with \fICURLU_APPENDQUERY\fP, the provided part will be appended on
-the end of the existing query - and if the previous part didn't end with an
-ampersand (&), an ampersand will be inserted before the new appended part.
+If used together with the \fICURLU_APPENDQUERY\fP bit, the provided part will
+be appended on the end of the existing query - and if the previous part didn't
+end with an ampersand (&), an ampersand will be inserted before the new
+appended part.
 
-When \fICURLU_APPENDQUERY\fP is used together with \fICURLU_URLENCODE\fP,
-the '=' symbols will not be URL encoded.
+When \fICURLU_APPENDQUERY\fP is used together with \fICURLU_URLENCODE\fP, the
+first '=' symbol will not be URL encoded.
 
 The question mark in the URL is not part of the actual query contents.
 .IP CURLUPART_FRAGMENT
@@ -107,10 +113,20 @@ instead "guesses" which scheme that was intended based on the host name.  If
 the outermost sub-domain name matches DICT, FTP, IMAP, LDAP, POP3 or SMTP then
 that scheme will be used, otherwise it picks HTTP. Conflicts with the
 \fICURLU_DEFAULT_SCHEME\fP option which takes precedence if both are set.
+.IP CURLU_NO_AUTHORITY
+If set, skips authority checks. The RFC allows individual schemes to omit the
+host part (normally the only mandatory part of the authority), but libcurl
+cannot know whether this is permitted for custom schemes. Specifying the flag
+permits empty authority sections, similar to how file scheme is handled.
+
 .SH RETURN VALUE
 Returns a CURLUcode error value, which is CURLUE_OK (0) if everything went
 fine.
 
+A URL string passed on to \fIcurl_url_set(3)\fP for the \fBCURLUPART_URL\fP
+part, must be shorter than 8000000 bytes otherwise it returns
+\fBCURLUE_MALFORMED_INPUT\fP (added in 7.65.0).
+
 If this function returns an error, no URL part is returned.
 .SH EXAMPLE
 .nf
@@ -125,7 +141,7 @@ If this function returns an error, no URL part is returned.
   curl_url_cleanup(url);
 .fi
 .SH AVAILABILITY
-Added in curl 7.62.0
+Added in curl 7.62.0. CURLUPART_ZONEID was added in 7.65.0.
 .SH "SEE ALSO"
 .BR curl_url_cleanup "(3), " curl_url "(3), " curl_url_get "(3), "
 .BR curl_url_dup "(3), "
index 946addf..c8929c9 100644 (file)
@@ -19,7 +19,7 @@
 .\" * KIND, either express or implied.
 .\" *
 .\" **************************************************************************
-.TH curl_version 3 "February 03, 2016" "libcurl 7.62.0" "libcurl Manual"
+.TH curl_version 3 "February 03, 2016" "libcurl 7.68.0" "libcurl Manual"
 
 .SH NAME
 curl_version - returns the libcurl version string
index 61e4a27..8d67f94 100644 (file)
@@ -5,7 +5,7 @@
 .\" *                            | (__| |_| |  _ <| |___
 .\" *                             \___|\___/|_| \_\_____|
 .\" *
-.\" * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 .\" *
 .\" * This software is licensed as described in the file COPYING, which
 .\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH curl_version_info 3 "September 23, 2018" "libcurl 7.62.0" "libcurl Manual"
+.TH curl_version_info 3 "August 13, 2019" "libcurl 7.68.0" "libcurl Manual"
 
 .SH NAME
 curl_version_info - returns run-time libcurl version info
@@ -79,6 +79,15 @@ typedef struct {
                                   (MAJOR << 24) | (MINOR << 12) | PATCH */
   const char *brotli_version; /* human readable string. */
 
+  /* when 'age is CURLVERSION_SIXTH or alter (7.66.0 or later), these fields
+     also exist */
+  unsigned int nghttp2_ver_num; /* Numeric nghttp2 version
+                                   (MAJOR << 16) | (MINOR << 8) | PATCH */
+  const char *nghttp2_version; /* human readable string. */
+
+  const char *quic_version;    /* human readable quic (+ HTTP/3) library +
+                                  version or NULL */
+
 } curl_version_info_data;
 .fi
 
@@ -100,6 +109,40 @@ environment.
 \fIfeatures\fP can have none, one or more bits set, and the currently defined
 bits are:
 .RS
+.IP CURL_VERSION_ALTSVC
+HTTP Alt-Svc parsing and the associated options (Added in 7.64.1)
+.IP CURL_VERSION_ASYNCHDNS
+libcurl was built with support for asynchronous name lookups, which allows
+more exact timeouts (even on Windows) and less blocking when using the multi
+interface. (added in 7.10.7)
+.IP CURL_VERSION_BROTLI
+supports HTTP Brotli content encoding using libbrotlidec (Added in 7.57.0)
+.IP CURL_VERSION_CONV
+libcurl was built with support for character conversions, as provided by the
+CURLOPT_CONV_* callbacks. (Added in 7.15.4)
+.IP CURL_VERSION_CURLDEBUG
+libcurl was built with memory tracking debug capabilities. This is mainly of
+interest for libcurl hackers. (added in 7.19.6)
+.IP CURL_VERSION_DEBUG
+libcurl was built with debug capabilities (added in 7.10.6)
+.IP CURL_VERSION_GSSAPI
+libcurl was built with support for GSS-API. This makes libcurl use provided
+functions for Kerberos and SPNEGO authentication. It also allows libcurl
+to use the current user credentials without the app having to pass them on.
+(Added in 7.38.0)
+.IP CURL_VERSION_GSSNEGOTIATE
+supports HTTP GSS-Negotiate (added in 7.10.6)
+.IP CURL_VERSION_HTTPS_PROXY
+libcurl was built with support for HTTPS-proxy.
+(Added in 7.52.0)
+.IP CURL_VERSION_HTTP2
+libcurl was built with support for HTTP2.
+(Added in 7.33.0)
+.IP CURL_VERSION_HTTP3
+HTTP/3 and QUIC support are built-in (Added in 7.66.0)
+.IP CURL_VERSION_IDN
+libcurl was built with support for IDNA, domain names with international
+letters. (Added in 7.12.0)
 .IP CURL_VERSION_IPV6
 supports IPv6
 .IP CURL_VERSION_KERBEROS4
@@ -107,71 +150,41 @@ supports Kerberos V4 (when using FTP)
 .IP CURL_VERSION_KERBEROS5
 supports Kerberos V5 authentication for FTP, IMAP, POP3, SMTP and SOCKSv5 proxy
 (Added in 7.40.0)
-.IP CURL_VERSION_SSL
-supports SSL (HTTPS/FTPS) (Added in 7.10)
+.IP CURL_VERSION_LARGEFILE
+libcurl was built with support for large files. (Added in 7.11.1)
 .IP CURL_VERSION_LIBZ
 supports HTTP deflate using libz (Added in 7.10)
+.IP CURL_VERSION_MULTI_SSL
+libcurl was built with multiple SSL backends. For details, see
+\fIcurl_global_sslset(3)\fP.
+(Added in 7.56.0)
 .IP CURL_VERSION_NTLM
 supports HTTP NTLM (added in 7.10.6)
-.IP CURL_VERSION_GSSNEGOTIATE
-supports HTTP GSS-Negotiate (added in 7.10.6)
-.IP CURL_VERSION_DEBUG
-libcurl was built with debug capabilities (added in 7.10.6)
-.IP CURL_VERSION_CURLDEBUG
-libcurl was built with memory tracking debug capabilities. This is mainly of
-interest for libcurl hackers. (added in 7.19.6)
-.IP CURL_VERSION_ASYNCHDNS
-libcurl was built with support for asynchronous name lookups, which allows
-more exact timeouts (even on Windows) and less blocking when using the multi
-interface. (added in 7.10.7)
+.IP CURL_VERSION_NTLM_WB
+libcurl was built with support for NTLM delegation to a winbind helper.
+(Added in 7.22.0)
+.IP CURL_VERSION_PSL
+libcurl was built with support for Mozilla's Public Suffix List. This makes
+libcurl ignore cookies with a domain that's on the list.
+(Added in 7.47.0)
 .IP CURL_VERSION_SPNEGO
 libcurl was built with support for SPNEGO authentication (Simple and Protected
 GSS-API Negotiation Mechanism, defined in RFC 2478.) (added in 7.10.8)
-.IP CURL_VERSION_LARGEFILE
-libcurl was built with support for large files. (Added in 7.11.1)
-.IP CURL_VERSION_IDN
-libcurl was built with support for IDNA, domain names with international
-letters. (Added in 7.12.0)
+.IP CURL_VERSION_SSL
+supports SSL (HTTPS/FTPS) (Added in 7.10)
 .IP CURL_VERSION_SSPI
 libcurl was built with support for SSPI. This is only available on Windows and
 makes libcurl use Windows-provided functions for Kerberos, NTLM, SPNEGO and
 Digest authentication. It also allows libcurl to use the current user
 credentials without the app having to pass them on. (Added in 7.13.2)
-.IP CURL_VERSION_GSSAPI
-libcurl was built with support for GSS-API. This makes libcurl use provided
-functions for Kerberos and SPNEGO authentication. It also allows libcurl
-to use the current user credentials without the app having to pass them on.
-(Added in 7.38.0)
-.IP CURL_VERSION_CONV
-libcurl was built with support for character conversions, as provided by the
-CURLOPT_CONV_* callbacks. (Added in 7.15.4)
 .IP CURL_VERSION_TLSAUTH_SRP
 libcurl was built with support for TLS-SRP. (Added in 7.21.4)
-.IP CURL_VERSION_NTLM_WB
-libcurl was built with support for NTLM delegation to a winbind helper.
-(Added in 7.22.0)
-.IP CURL_VERSION_HTTP2
-libcurl was built with support for HTTP2.
-(Added in 7.33.0)
 .IP CURL_VERSION_UNIX_SOCKETS
 libcurl was built with support for Unix domain sockets.
 (Added in 7.40.0)
-.IP CURL_VERSION_PSL
-libcurl was built with support for Mozilla's Public Suffix List. This makes
-libcurl ignore cookies with a domain that's on the list.
-(Added in 7.47.0)
-.IP CURL_VERSION_HTTPS_PROXY
-libcurl was built with support for HTTPS-proxy.
-(Added in 7.52.0)
-.IP CURL_VERSION_MULTI_SSL
-libcurl was built with multiple SSL backends. For details, see
-\fIcurl_global_sslset(3)\fP.
-(Added in 7.56.0)
-.IP CURL_VERSION_BROTLI
-supports HTTP Brotli content encoding using libbrotlidec (Added in 7.57.0)
 .RE
 \fIssl_version\fP is an ASCII string for the TLS library name + version
-used. If libcurl has no SSL support, this is NULL. For example "WinSSL",
+used. If libcurl has no SSL support, this is NULL. For example "Schannel",
 \&"SecureTransport" or "OpenSSL/1.1.0g".
 
 \fIssl_version_num\fP is always 0.
index d544d46..7282ad5 100644 (file)
@@ -19,7 +19,7 @@
 .\" * KIND, either express or implied.
 .\" *
 .\" **************************************************************************
-.TH libcurl 3 "February 03, 2016" "libcurl 7.62.0" "libcurl easy interface"
+.TH libcurl 3 "February 03, 2016" "libcurl 7.68.0" "libcurl easy interface"
 
 .SH NAME
 libcurl-easy \- easy interface overview
index d888d0a..7c95244 100644 (file)
@@ -19,7 +19,7 @@
 .\" * KIND, either express or implied.
 .\" *
 .\" **************************************************************************
-.TH libcurl-env 3 "April 17, 2018" "libcurl 7.62.0" "libcurl environment variables"
+.TH libcurl-env 3 "April 17, 2018" "libcurl 7.68.0" "libcurl environment variables"
 
 .SH NAME
 libcurl-env \- environment variables libcurl understands
index c3c37bd..3f6a2a1 100644 (file)
@@ -5,7 +5,7 @@
 .\" *                            | (__| |_| |  _ <| |___
 .\" *                             \___|\___/|_| \_\_____|
 .\" *
-.\" * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 .\" *
 .\" * This software is licensed as described in the file COPYING, which
 .\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH libcurl-errors 3 "September 19, 2018" "libcurl 7.62.0" "libcurl errors"
+.TH libcurl-errors 3 "November 17, 2019" "libcurl 7.68.0" "libcurl errors"
 
 .SH NAME
 libcurl-errors \- error codes in libcurl
@@ -60,9 +60,9 @@ Couldn't resolve proxy. The given proxy host could not be resolved.
 Couldn't resolve host. The given remote host was not resolved.
 .IP "CURLE_COULDNT_CONNECT (7)"
 Failed to connect() to host or proxy.
-.IP "CURLE_FTP_WEIRD_SERVER_REPLY (8)"
-The server sent data libcurl couldn't parse. This error code is used for more
-than just FTP and is aliased as \fICURLE_WEIRD_SERVER_REPLY\fP since 7.51.0.
+.IP "CURLE_WEIRD_SERVER_REPLY (8)"
+The server sent data libcurl couldn't parse. This error code was known as as
+\fICURLE_FTP_WEIRD_SERVER_REPLY\fP before 7.51.0.
 .IP "CURLE_REMOTE_ACCESS_DENIED (9)"
 We were denied access to the resource given in the URL.  For FTP, this occurs
 while trying to change to the remote directory.
@@ -163,8 +163,6 @@ libcurl. The error buffer might contain more specific information about which
 exact option it concerns.
 .IP "CURLE_TELNET_OPTION_SYNTAX (49)"
 A telnet option string was Illegally formatted.
-.IP "CURLE_PEER_FAILED_VERIFICATION (51)"
-The remote server's SSL certificate or SSH md5 fingerprint was deemed not OK.
 .IP "CURLE_GOT_NOTHING (52)"
 Nothing was returned from the server, and under the circumstances, getting
 nothing is considered an error.
@@ -180,8 +178,10 @@ Failure with receiving network data.
 problem with the local client certificate.
 .IP "CURLE_SSL_CIPHER (59)"
 Couldn't use specified cipher.
-.IP "CURLE_SSL_CACERT (60)"
-Peer certificate cannot be authenticated with known CA certificates.
+.IP "CURLE_PEER_FAILED_VERIFICATION (60)"
+The remote server's SSL certificate or SSH md5 fingerprint was deemed not OK.
+This error code has been unified with CURLE_SSL_CACERT since 7.62.0. Its
+previous value was 51.
 .IP "CURLE_BAD_CONTENT_ENCODING (61)"
 Unrecognized transfer encoding.
 .IP "CURLE_LDAP_INVALID_URL (62)"
@@ -255,6 +255,11 @@ Status returned failure when asked with \fICURLOPT_SSL_VERIFYSTATUS(3)\fP.
 Stream error in the HTTP/2 framing layer.
 .IP "CURLE_RECURSIVE_API_CALL (93)"
 An API function was called from inside a callback.
+.IP "CURLE_AUTH_ERROR (94)"
+An authentication function returned an error.
+.IP "CURLE_HTTP3 (95)"
+A problem was detected in the HTTP/3 layer. This is somewhat generic and can
+be one out of several problems, see the error buffer for details.
 .IP "CURLE_OBSOLETE*"
 These error codes will never be returned. They were used in an old libcurl
 version and are currently unused.
@@ -267,6 +272,9 @@ This is not really an error. It means you should call
 between. Before version 7.20.0 this could be returned by
 \fIcurl_multi_perform(3)\fP, but in later versions this return code is never
 used.
+.IP "CURLM_CALL_MULTI_SOCKET (-1)"
+An alias for CURLM_CALL_MULTI_PERFORM. Never returned by modern libcurl
+versions.
 .IP "CURLM_OK (0)"
 Things are fine.
 .IP "CURLM_BAD_HANDLE (1)"
@@ -290,6 +298,8 @@ An easy handle already added to a multi handle was attempted to get added a
 second time. (Added in 7.32.1)
 .IP "CURLM_RECURSIVE_API_CALL (8)"
 An API function was called from inside a callback.
+.IP "CURLM_WAKEUP_FAILURE (9)"
+Wakeup is unavailable or failed.
 .SH "CURLSHcode"
 The "share" interface will return a CURLSHcode to indicate when an error has
 occurred.  Also consider \fIcurl_share_strerror(3)\fP.
index fa699de..05c5f3c 100644 (file)
@@ -5,7 +5,7 @@
 .\" *                            | (__| |_| |  _ <| |___
 .\" *                             \___|\___/|_| \_\_____|
 .\" *
-.\" * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 .\" *
 .\" * This software is licensed as described in the file COPYING, which
 .\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH libcurl-multi 3 "June 30, 2018" "libcurl 7.62.0" "libcurl multi interface"
+.TH libcurl-multi 3 "November 28, 2019" "libcurl 7.68.0" "libcurl multi interface"
 
 .SH NAME
 libcurl-multi \- how to use the multi interface
@@ -86,7 +86,7 @@ returns back to the calling application.
 
 Your application extracts info from libcurl about when it would like to get
 invoked to transfer data or do other work. The most convenient way is to use
-\fIcurl_multi_wait(3)\fP that will help you wait until the application should
+\fIcurl_multi_poll(3)\fP that will help you wait until the application should
 call libcurl again. The older API to accomplish the same thing is
 \fIcurl_multi_fdset(3)\fP that extracts fd_sets from libcurl to use in
 select() or poll() calls in order to get to know when the transfers in the
@@ -98,8 +98,7 @@ period for your select() calls.
 \fIcurl_multi_perform(3)\fP stores the number of still running transfers in
 one of its input arguments, and by reading that you can figure out when all
 the transfers in the multi handles are done. 'done' does not mean
-successful. One or more of the transfers may have failed. Tracking when this
-number changes, you know when one or more transfers are done.
+successful. One or more of the transfers may have failed. 
 
 To get information about completed transfers, to figure out success or not and
 similar, \fIcurl_multi_info_read(3)\fP should be called. It can return a
index 0e3c736..8894546 100644 (file)
@@ -5,7 +5,7 @@
 .\" *                            | (__| |_| |  _ <| |___
 .\" *                             \___|\___/|_| \_\_____|
 .\" *
-.\" * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 .\" *
 .\" * This software is licensed as described in the file COPYING, which
 .\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH libcurl-security 3 "September 23, 2018" "libcurl 7.62.0" "libcurl security"
+.TH libcurl-security 3 "July 16, 2019" "libcurl 7.68.0" "libcurl security"
 
 .SH NAME
 libcurl-security \- security considerations when using libcurl
@@ -98,8 +98,8 @@ Never ever switch off certificate verification.
 The \fICURLOPT_FOLLOWLOCATION(3)\fP option automatically follows HTTP
 redirects sent by a remote server.  These redirects can refer to any kind of
 URL, not just HTTP. libcurl restricts the protocols allowed to be used in
-redirects for security reasons: FILE, SCP, SMB and SMBS are disabled by
-default. Applications are encouraged to restrict that set further.
+redirects for security reasons: only HTTP, HTTPS, FTP and FTPS are
+enabled by default. Applications may opt to restrict that set further.
 
 A redirect to a file: URL would cause the libcurl to read (or write) arbitrary
 files from the local filesystem.  If the application returns the data back to
index cafd954..396bb0d 100644 (file)
@@ -19,7 +19,7 @@
 .\" * KIND, either express or implied.
 .\" *
 .\" **************************************************************************
-.TH libcurl-share 3 "November 27, 2017" "libcurl 7.62.0" "libcurl share interface"
+.TH libcurl-share 3 "November 27, 2017" "libcurl 7.68.0" "libcurl share interface"
 
 .SH NAME
 libcurl-share \- how to use the share interface
index 8d7b2a7..7759c4a 100644 (file)
@@ -5,7 +5,7 @@
 .\" *                            | (__| |_| |  _ <| |___
 .\" *                             \___|\___/|_| \_\_____|
 .\" *
-.\" * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
 .\" *
 .\" * This software is licensed as described in the file COPYING, which
 .\" * you should have received as part of this distribution. The terms
@@ -19,7 +19,7 @@
 .\" * KIND, either express or implied.
 .\" *
 .\" **************************************************************************
-.TH libcurl-symbols 3 "okt 31, 2018" "libcurl 7.41.0" "libcurl symbols"
+.TH libcurl-symbols 3 "Jan  8, 2020" "libcurl 7.41.0" "libcurl symbols"
 .SH NAME
 libcurl-symbols \- libcurl symbol version information
 .SH "libcurl symbols"
@@ -35,6 +35,16 @@ The last version that featured the specific symbol. Using the symbol in source
 code will make it no longer compile error-free after that specified version.
 
 This man page is automatically generated from the symbols-in-versions file.
+.IP CURLALTSVC_H1
+Introduced in 7.64.1
+.IP CURLALTSVC_H2
+Introduced in 7.64.1
+.IP CURLALTSVC_H3
+Introduced in 7.64.1
+.IP CURLALTSVC_IMMEDIATELY
+Introduced in 7.64.1
+.IP CURLALTSVC_READONLYFILE
+Introduced in 7.64.1
 .IP CURLAUTH_ANY
 Introduced in 7.10.6
 .IP CURLAUTH_ANYSAFE
@@ -80,6 +90,9 @@ Introduced in 7.1
 Introduced in 7.18.2
 .IP CURLE_ALREADY_COMPLETE
 Introduced in 7.7.2
+Deprecated since 7.8
+.IP CURLE_AUTH_ERROR
+Introduced in 7.66.0
 .IP CURLE_BAD_CALLING_ORDER
 Introduced in 7.1
 Deprecated since 7.17.0
@@ -116,6 +129,7 @@ Introduced in 7.24.0
 Introduced in 7.24.0
 .IP CURLE_FTP_ACCESS_DENIED
 Introduced in 7.1
+Deprecated since 7.17.0
 .IP CURLE_FTP_BAD_DOWNLOAD_RESUME
 Introduced in 7.1
 Deprecated since 7.1
@@ -141,6 +155,7 @@ Deprecated since 7.17.0
 Introduced in 7.17.0
 .IP CURLE_FTP_COULDNT_STOR_FILE
 Introduced in 7.1
+Deprecated since 7.16.3
 .IP CURLE_FTP_COULDNT_USE_REST
 Introduced in 7.1
 .IP CURLE_FTP_PARTIAL_FILE
@@ -167,6 +182,7 @@ Introduced in 7.1
 Introduced in 7.1
 .IP CURLE_FTP_WEIRD_SERVER_REPLY
 Introduced in 7.1
+Deprecated since 7.51.0
 .IP CURLE_FTP_WEIRD_USER_REPLY
 Introduced in 7.1
 Deprecated since 7.17.0
@@ -181,8 +197,11 @@ Introduced in 7.9.1
 Introduced in 7.38.0
 .IP CURLE_HTTP2_STREAM
 Introduced in 7.49.0
+.IP CURLE_HTTP3
+Introduced in 7.68.0
 .IP CURLE_HTTP_NOT_FOUND
 Introduced in 7.1
+Deprecated since 7.10.3
 .IP CURLE_HTTP_PORT_FAILED
 Introduced in 7.3
 Deprecated since 7.12.0
@@ -311,6 +330,7 @@ Introduced in 7.5
 Introduced in 7.21.5
 .IP CURLE_UNKNOWN_TELNET_OPTION
 Introduced in 7.7
+Deprecated since 7.21.5
 .IP CURLE_UNSUPPORTED_PROTOCOL
 Introduced in 7.1
 .IP CURLE_UPLOAD_FAILED
@@ -584,6 +604,8 @@ Introduced in 7.18.2
 Introduced in 7.4.1
 .IP CURLINFO_RESPONSE_CODE
 Introduced in 7.10.8
+.IP CURLINFO_RETRY_AFTER
+Introduced in 7.66.0
 .IP CURLINFO_RTSP_CLIENT_CSEQ
 Introduced in 7.20.0
 .IP CURLINFO_RTSP_CSEQ_RECV
@@ -689,6 +711,8 @@ Introduced in 7.30.0
 Introduced in 7.30.0
 .IP CURLMOPT_MAX_TOTAL_CONNECTIONS
 Introduced in 7.30.0
+.IP CURLMOPT_MAX_CONCURRENT_STREAMS
+Introduced in 7.67.0
 .IP CURLMOPT_PIPELINING
 Introduced in 7.16.0
 .IP CURLMOPT_PIPELINING_SERVER_BL
@@ -731,6 +755,8 @@ Introduced in 7.9.6
 Introduced in 7.9.6
 .IP CURLM_RECURSIVE_API_CALL
 Introduced in 7.59.0
+.IP CURLM_WAKEUP_FAILURE
+Introduced in 7.68.0
 .IP CURLM_UNKNOWN_OPTION
 Introduced in 7.15.4
 .IP CURLOPTTYPE_FUNCTIONPOINT
@@ -743,6 +769,8 @@ Introduced in 7.1
 Introduced in 7.11.0
 .IP CURLOPTTYPE_STRINGPOINT
 Introduced in 7.46.0
+.IP CURLOPTTYPE_SLISTPOINT
+Introduced in 7.65.2
 .IP CURLOPT_ABSTRACT_UNIX_SOCKET
 Introduced in 7.53.0
 .IP CURLOPT_ACCEPTTIMEOUT_MS
@@ -751,6 +779,10 @@ Introduced in 7.24.0
 Introduced in 7.21.6
 .IP CURLOPT_ADDRESS_SCOPE
 Introduced in 7.19.0
+.IP CURLOPT_ALTSVC
+Introduced in 7.64.1
+.IP CURLOPT_ALTSVC_CTRL
+Introduced in 7.64.1
 .IP CURLOPT_APPEND
 Introduced in 7.17.0
 .IP CURLOPT_AUTOREFERER
@@ -780,8 +812,6 @@ Deprecated since 7.16.1
 Introduced in 7.21.7
 .IP CURLOPT_CLOSESOCKETFUNCTION
 Introduced in 7.21.7
-.IP CURLOPT_UPKEEP_INTERVAL_MS
-Introduced in 7.62.0
 .IP CURLOPT_CONNECTTIMEOUT
 Introduced in 7.7
 .IP CURLOPT_CONNECTTIMEOUT_MS
@@ -812,6 +842,8 @@ Introduced in 7.17.1
 Introduced in 7.1
 .IP CURLOPT_CRLFILE
 Introduced in 7.19.0
+.IP CURLOPT_CURLU
+Introduced in 7.63.0
 .IP CURLOPT_CUSTOMREQUEST
 Introduced in 7.1
 .IP CURLOPT_DEBUGDATA
@@ -917,6 +949,8 @@ Introduced in 7.10
 Introduced in 7.7.2
 .IP CURLOPT_HEADEROPT
 Introduced in 7.37.0
+.IP CURLOPT_HTTP09_ALLOWED
+Introduced in 7.64.0
 .IP CURLOPT_HTTP200ALIASES
 Introduced in 7.10.3
 .IP CURLOPT_HTTPAUTH
@@ -986,6 +1020,8 @@ Introduced in 7.25.0
 Introduced in 7.20.0
 .IP CURLOPT_MAIL_RCPT
 Introduced in 7.20.0
+.IP CURLOPT_MAXAGE_CONN
+Introduced in 7.65.0
 .IP CURLOPT_MAXCONNECTS
 Introduced in 7.7
 .IP CURLOPT_MAXFILESIZE
@@ -1176,6 +1212,8 @@ Introduced in 7.20.0
 Introduced in 7.20.0
 .IP CURLOPT_RTSP_TRANSPORT
 Introduced in 7.20.0
+.IP CURLOPT_SASL_AUTHZID
+Introduced in 7.66.0
 .IP CURLOPT_SASL_IR
 Introduced in 7.31.0
 .IP CURLOPT_SEEKDATA
@@ -1317,6 +1355,10 @@ Introduced in 7.21.4
 Introduced in 7.21.4
 .IP CURLOPT_TLSAUTH_USERNAME
 Introduced in 7.21.4
+.IP CURLOPT_TRAILERDATA
+Introduced in 7.64.0
+.IP CURLOPT_TRAILERFUNCTION
+Introduced in 7.64.0
 .IP CURLOPT_TRANSFERTEXT
 Introduced in 7.1.1
 .IP CURLOPT_TRANSFER_ENCODING
@@ -1325,6 +1367,8 @@ Introduced in 7.21.6
 Introduced in 7.40.0
 .IP CURLOPT_UNRESTRICTED_AUTH
 Introduced in 7.10.4
+.IP CURLOPT_UPKEEP_INTERVAL_MS
+Introduced in 7.62.0
 .IP CURLOPT_UPLOAD
 Introduced in 7.1
 .IP CURLOPT_UPLOAD_BUFFERSIZE
@@ -1495,12 +1539,16 @@ Introduced in 7.16.1
 Introduced in 7.16.1
 .IP CURLSSLBACKEND_AXTLS
 Introduced in 7.38.0
+Deprecated since 7.61.0
+.IP CURLSSLBACKEND_BEARSSL
+Introduced in 7.68.0
 .IP CURLSSLBACKEND_BORINGSSL
 Introduced in 7.49.0
 .IP CURLSSLBACKEND_CYASSL
 Introduced in 7.34.0
 .IP CURLSSLBACKEND_DARWINSSL
 Introduced in 7.34.0
+Deprecated since 7.64.1
 .IP CURLSSLBACKEND_GNUTLS
 Introduced in 7.34.0
 .IP CURLSSLBACKEND_GSKIT
@@ -1523,10 +1571,14 @@ Introduced in 7.34.0
 Introduced in 7.34.0
 .IP CURLSSLBACKEND_SCHANNEL
 Introduced in 7.34.0
+.IP CURLSSLBACKEND_SECURETRANSPORT
+Introduced in 7.64.1
 .IP CURLSSLBACKEND_WOLFSSL
 Introduced in 7.49.0
 .IP CURLSSLOPT_ALLOW_BEAST
 Introduced in 7.25.0
+.IP CURLSSLOPT_NO_PARTIALCHAIN
+Introduced in 7.68.0
 .IP CURLSSLOPT_NO_REVOKE
 Introduced in 7.44.0
 .IP CURLSSLSET_NO_BACKENDS
@@ -1537,26 +1589,6 @@ Introduced in 7.56.0
 Introduced in 7.56.0
 .IP CURLSSLSET_UNKNOWN_BACKEND
 Introduced in 7.56.0
-.IP CURLUPART_FRAGMENT
-Introduced in 7.62.0
-.IP CURLUPART_HOST
-Introduced in 7.62.0
-.IP CURLUPART_OPTIONS
-Introduced in 7.62.0
-.IP CURLUPART_PASSWORD
-Introduced in 7.62.0
-.IP CURLUPART_PATH
-Introduced in 7.62.0
-.IP CURLUPART_PORT
-Introduced in 7.62.0
-.IP CURLUPART_QUERY
-Introduced in 7.62.0
-.IP CURLUPART_SCHEME
-Introduced in 7.62.0
-.IP CURLUPART_URL
-Introduced in 7.62.0
-.IP CURLUPART_USER
-Introduced in 7.62.0
 .IP CURLUE_BAD_HANDLE
 Introduced in 7.62.0
 .IP CURLUE_BAD_PARTPOINTER
@@ -1593,6 +1625,28 @@ Introduced in 7.62.0
 Introduced in 7.62.0
 .IP CURLUE_USER_NOT_ALLOWED
 Introduced in 7.62.0
+.IP CURLUPART_FRAGMENT
+Introduced in 7.62.0
+.IP CURLUPART_HOST
+Introduced in 7.62.0
+.IP CURLUPART_OPTIONS
+Introduced in 7.62.0
+.IP CURLUPART_PASSWORD
+Introduced in 7.62.0
+.IP CURLUPART_PATH
+Introduced in 7.62.0
+.IP CURLUPART_PORT
+Introduced in 7.62.0
+.IP CURLUPART_QUERY
+Introduced in 7.62.0
+.IP CURLUPART_SCHEME
+Introduced in 7.62.0
+.IP CURLUPART_URL
+Introduced in 7.62.0
+.IP CURLUPART_USER
+Introduced in 7.62.0
+.IP CURLUPART_ZONEID
+Introduced in 7.65.0
 .IP CURLUSESSL_ALL
 Introduced in 7.17.0
 .IP CURLUSESSL_CONTROL
@@ -1601,6 +1655,28 @@ Introduced in 7.17.0
 Introduced in 7.17.0
 .IP CURLUSESSL_TRY
 Introduced in 7.17.0
+.IP CURLU_APPENDQUERY
+Introduced in 7.62.0
+.IP CURLU_DEFAULT_PORT
+Introduced in 7.62.0
+.IP CURLU_DEFAULT_SCHEME
+Introduced in 7.62.0
+.IP CURLU_DISALLOW_USER
+Introduced in 7.62.0
+.IP CURLU_GUESS_SCHEME
+Introduced in 7.62.0
+.IP CURLU_NON_SUPPORT_SCHEME
+Introduced in 7.62.0
+.IP CURLU_NO_DEFAULT_PORT
+Introduced in 7.62.0
+.IP CURLU_NO_AUTHORITY
+Introduced in 7.67.0
+.IP CURLU_PATH_AS_IS
+Introduced in 7.62.0
+.IP CURLU_URLDECODE
+Introduced in 7.62.0
+.IP CURLU_URLENCODE
+Introduced in 7.62.0
 .IP CURLVERSION_FIFTH
 Introduced in 7.57.0
 .IP CURLVERSION_FIRST
@@ -1613,6 +1689,8 @@ Introduced in 7.10
 Introduced in 7.11.1
 .IP CURLVERSION_THIRD
 Introduced in 7.12.0
+.IP CURLVERSION_SIXTH
+Introduced in 7.66.0
 .IP CURL_CHUNK_BGN_FUNC_FAIL
 Introduced in 7.21.0
 .IP CURL_CHUNK_BGN_FUNC_OK
@@ -1709,6 +1787,8 @@ Introduced in 7.47.0
 Introduced in 7.33.0
 .IP CURL_HTTP_VERSION_2_PRIOR_KNOWLEDGE
 Introduced in 7.49.0
+.IP CURL_HTTP_VERSION_3
+Introduced in 7.66.0
 .IP CURL_HTTP_VERSION_NONE
 Introduced in 7.9.1
 .IP CURL_IPRESOLVE_V4
@@ -1769,6 +1849,8 @@ Introduced in 7.14.0
 Introduced in 7.14.0
 .IP CURL_POLL_REMOVE
 Introduced in 7.14.0
+.IP CURL_PROGRESSFUNC_CONTINUE
+Introduced in 7.68.0
 .IP CURL_PROGRESS_BAR
 Introduced in 7.1.1
 .IP CURL_PROGRESS_STATS
@@ -1873,8 +1955,14 @@ Introduced in 7.9.7
 Introduced in 7.21.4
 .IP CURL_TLSAUTH_SRP
 Introduced in 7.21.4
+.IP CURL_TRAILERFUNC_ABORT
+Introduced in 7.64.0
+.IP CURL_TRAILERFUNC_OK
+Introduced in 7.64.0
 .IP CURL_UPKEEP_INTERVAL_DEFAULT
 Introduced in 7.62.0
+.IP CURL_VERSION_ALTSVC
+Introduced in 7.64.1
 .IP CURL_VERSION_ASYNCHDNS
 Introduced in 7.10.7
 .IP CURL_VERSION_BROTLI
@@ -1885,6 +1973,8 @@ Introduced in 7.15.4
 Introduced in 7.19.6
 .IP CURL_VERSION_DEBUG
 Introduced in 7.10.6
+.IP CURL_VERSION_ESNI
+Introduced in 7.67.0
 .IP CURL_VERSION_GSSAPI
 Introduced in 7.38.0
 .IP CURL_VERSION_GSSNEGOTIATE
@@ -1892,6 +1982,8 @@ Introduced in 7.10.6
 Deprecated since 7.38.0
 .IP CURL_VERSION_HTTP2
 Introduced in 7.33.0
+.IP CURL_VERSION_HTTP3
+Introduced in 7.66.0
 .IP CURL_VERSION_HTTPS_PROXY
 Introduced in 7.52.0
 .IP CURL_VERSION_IDN
index 191e5c2..c96ad9a 100644 (file)
@@ -5,7 +5,7 @@
 .\" *                            | (__| |_| |  _ <| |___
 .\" *                             \___|\___/|_| \_\_____|
 .\" *
-.\" * Copyright (C) 2015 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 2015 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 .\" *
 .\" * This software is licensed as described in the file COPYING, which
 .\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH libcurl-thread 3 "August 21, 2018" "libcurl 7.62.0" "libcurl thread safety"
+.TH libcurl-thread 3 "June 30, 2019" "libcurl 7.68.0" "libcurl thread safety"
 
 .SH NAME
 libcurl-thread \- libcurl thread safety
@@ -42,14 +42,15 @@ then of course using the underlying SSL library multi-threaded and those libs
 might have their own requirements on this issue.  You may need to provide one
 or two functions to allow it to function properly:
 .IP OpenSSL
-OpenSSL 1.1.0 "can be safely used in multi-threaded applications provided that
-support for the underlying OS threading API is built-in."
+OpenSSL 1.1.0+ "can be safely used in multi-threaded applications provided that
+support for the underlying OS threading API is built-in." In that case the
+engine is used by libcurl in a way that is fully thread-safe.
 
-https://www.openssl.org/docs/manmaster/crypto/threads.html#DESCRIPTION
+https://www.openssl.org/docs/man1.1.0/man3/CRYPTO_THREAD_run_once.html#DESCRIPTION
 
 OpenSSL <= 1.0.2 the user must set callbacks.
 
-https://www.openssl.org/docs/man1.0.2/crypto/threads.html#DESCRIPTION
+https://www.openssl.org/docs/man1.0.2/man3/CRYPTO_set_locking_callback.html#DESCRIPTION
 
 https://curl.haxx.se/libcurl/c/opensslthreadlock.html
 
@@ -57,12 +58,6 @@ https://curl.haxx.se/libcurl/c/opensslthreadlock.html
 https://gnutls.org/manual/html_node/Thread-safety.html
 .IP NSS
 thread-safe already without anything required.
-.IP PolarSSL
-Required actions unknown.
-.IP yassl
-Required actions unknown.
-.IP axTLS
-Required actions unknown.
 .IP Secure-Transport
 The engine is used by libcurl in a way that is fully thread-safe.
 .IP WinSSL
index d54ca11..3189a93 100644 (file)
@@ -5,7 +5,7 @@
 .\" *                            | (__| |_| |  _ <| |___
 .\" *                             \___|\___/|_| \_\_____|
 .\" *
-.\" * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 .\" *
 .\" * This software is licensed as described in the file COPYING, which
 .\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH libcurl-tutorial 3 "September 23, 2018" "libcurl 7.62.0" "libcurl programming"
+.TH libcurl-tutorial 3 "October 31, 2019" "libcurl 7.68.0" "libcurl programming"
 
 .SH NAME
 libcurl-tutorial \- libcurl programming tutorial
@@ -497,13 +497,13 @@ and then a file with binary contents and uploads the whole thing.
 
 .nf
  curl_mime *multipart = curl_mime_init(easyhandle);
- curl_mimepart *part = curl_mime_addpart(mutipart);
+ curl_mimepart *part = curl_mime_addpart(multipart);
  curl_mime_name(part, "name");
  curl_mime_data(part, "daniel", CURL_ZERO_TERMINATED);
- part = curl_mime_addpart(mutipart);
+ part = curl_mime_addpart(multipart);
  curl_mime_name(part, "project");
  curl_mime_data(part, "curl", CURL_ZERO_TERMINATED);
- part = curl_mime_addpart(mutipart);
+ part = curl_mime_addpart(multipart);
  curl_mime_name(part, "logotype-image");
  curl_mime_filedata(part, "curl.png");
 
index cbb2b4c..8a4a306 100644 (file)
@@ -19,7 +19,7 @@
 .\" * KIND, either express or implied.
 .\" *
 .\" **************************************************************************
-.TH libcurl 3 "September 10, 2018" "libcurl 7.62.0" "libcurl url interface"
+.TH libcurl 3 "September 10, 2018" "libcurl 7.68.0" "libcurl url interface"
 
 .SH NAME
 libcurl-url \- URL interface overview
index b336912..3c308c1 100644 (file)
@@ -19,7 +19,7 @@
 .\" * KIND, either express or implied.
 .\" *
 .\" **************************************************************************
-.TH libcurl 3 "July 15, 2017" "libcurl 7.62.0" "libcurl overview"
+.TH libcurl 3 "July 15, 2017" "libcurl 7.68.0" "libcurl overview"
 
 .SH NAME
 libcurl \- client-side URL transfers
index 776b124..3fb7697 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLINFO_ACTIVESOCKET 3 "May 06, 2017" "libcurl 7.62.0" "curl_easy_getinfo options"
+.TH CURLINFO_ACTIVESOCKET 3 "May 06, 2017" "libcurl 7.68.0" "curl_easy_getinfo options"
 
 .SH NAME
 CURLINFO_ACTIVESOCKET \- get the active socket
index 0344c75..e040068 100644 (file)
@@ -5,7 +5,7 @@
 .\" *                            | (__| |_| |  _ <| |___
 .\" *                             \___|\___/|_| \_\_____|
 .\" *
-.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 .\" *
 .\" * This software is licensed as described in the file COPYING, which
 .\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLINFO_APPCONNECT_TIME 3 "May 17, 2018" "libcurl 7.62.0" "curl_easy_getinfo options"
+.TH CURLINFO_APPCONNECT_TIME 3 "August 26, 2019" "libcurl 7.68.0" "curl_easy_getinfo options"
 
 .SH NAME
 CURLINFO_APPCONNECT_TIME \- get the time until the SSL/SSH handshake is completed
@@ -35,6 +35,8 @@ This time is most often very near to the \fICURLINFO_PRETRANSFER_TIME(3)\fP
 time, except for cases such as HTTP pipelining where the pretransfer time can
 be delayed due to waits in line for the pipeline and more.
 
+When a redirect is followed, the time from each request is added together.
+
 See also the TIMES overview in the \fIcurl_easy_getinfo(3)\fP man page.
 .SH PROTOCOLS
 All
index bd16921..a49516b 100644 (file)
@@ -5,7 +5,7 @@
 .\" *                            | (__| |_| |  _ <| |___
 .\" *                             \___|\___/|_| \_\_____|
 .\" *
-.\" * Copyright (C) 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 2018 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 .\" *
 .\" * This software is licensed as described in the file COPYING, which
 .\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLINFO_APPCONNECT_TIME_T 3 "May 17, 2018" "libcurl 7.62.0" "curl_easy_getinfo options"
+.TH CURLINFO_APPCONNECT_TIME_T 3 "August 26, 2019" "libcurl 7.68.0" "curl_easy_getinfo options"
 
 .SH NAME
 CURLINFO_APPCONNECT_TIME_T \- get the time until the SSL/SSH handshake is completed
@@ -36,6 +36,8 @@ This time is most often very near to the \fICURLINFO_PRETRANSFER_TIME_T(3)\fP
 time, except for cases such as HTTP pipelining where the pretransfer time can
 be delayed due to waits in line for the pipeline and more.
 
+When a redirect is followed, the time from each request is added together.
+
 See also the TIMES overview in the \fIcurl_easy_getinfo(3)\fP man page.
 .SH PROTOCOLS
 All
index 9295420..9f4813f 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLINFO_CERTINFO 3 "May 06, 2017" "libcurl 7.62.0" "curl_easy_getinfo options"
+.TH CURLINFO_CERTINFO 3 "November 07, 2018" "libcurl 7.68.0" "curl_easy_getinfo options"
 
 .SH NAME
 CURLINFO_CERTINFO \- get the TLS certificate chain
@@ -72,8 +72,8 @@ if(curl) {
 }
 .fi
 .SH AVAILABILITY
-This option is only working in libcurl built with OpenSSL, NSS, schannel or
-GSKit support. schannel support added in 7.50.0
+This option is only working in libcurl built with OpenSSL, NSS, Schannel or
+GSKit support. Schannel support added in 7.50.0
 
 Added in 7.19.1
 .SH RETURN VALUE
index 1c97fc6..9f38210 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLINFO_CONDITION_UNMET 3 "February 23, 2018" "libcurl 7.62.0" "curl_easy_getinfo options"
+.TH CURLINFO_CONDITION_UNMET 3 "February 23, 2018" "libcurl 7.68.0" "curl_easy_getinfo options"
 
 .SH NAME
 CURLINFO_CONDITION_UNMET \- get info on unmet time conditional
index 3c64546..4db592a 100644 (file)
@@ -5,7 +5,7 @@
 .\" *                            | (__| |_| |  _ <| |___
 .\" *                             \___|\___/|_| \_\_____|
 .\" *
-.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 .\" *
 .\" * This software is licensed as described in the file COPYING, which
 .\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLINFO_CONNECT_TIME 3 "May 17, 2018" "libcurl 7.62.0" "curl_easy_getinfo options"
+.TH CURLINFO_CONNECT_TIME 3 "August 26, 2019" "libcurl 7.68.0" "curl_easy_getinfo options"
 
 .SH NAME
 CURLINFO_CONNECT_TIME \- get the time until connect
@@ -32,6 +32,8 @@ CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_CONNECT_TIME, double *timep);
 Pass a pointer to a double to receive the total time in seconds from the start
 until the connection to the remote host (or proxy) was completed.
 
+When a redirect is followed, the time from each request is added together.
+
 See also the TIMES overview in the \fIcurl_easy_getinfo(3)\fP man page.
 .SH PROTOCOLS
 All
index 7cac104..e4798ac 100644 (file)
@@ -5,7 +5,7 @@
 .\" *                            | (__| |_| |  _ <| |___
 .\" *                             \___|\___/|_| \_\_____|
 .\" *
-.\" * Copyright (C) 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 2018 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 .\" *
 .\" * This software is licensed as described in the file COPYING, which
 .\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLINFO_CONNECT_TIME_T 3 "May 17, 2018" "libcurl 7.62.0" "curl_easy_getinfo options"
+.TH CURLINFO_CONNECT_TIME_T 3 "August 26, 2019" "libcurl 7.68.0" "curl_easy_getinfo options"
 
 .SH NAME
 CURLINFO_CONNECT_TIME_T \- get the time until connect
@@ -31,6 +31,9 @@ CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_CONNECT_TIME_T, curl_off_t *ti
 .SH DESCRIPTION
 Pass a pointer to a curl_off_t to receive the total time in microseconds
 from the start until the connection to the remote host (or proxy) was completed.
+
+When a redirect is followed, the time from each request is added together.
+
 See also the TIMES overview in the \fIcurl_easy_getinfo(3)\fP man page.
 .SH PROTOCOLS
 All
index 494b6da..e833852 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLINFO_CONTENT_LENGTH_DOWNLOAD 3 "June 15, 2017" "libcurl 7.62.0" "curl_easy_getinfo options"
+.TH CURLINFO_CONTENT_LENGTH_DOWNLOAD 3 "June 15, 2017" "libcurl 7.68.0" "curl_easy_getinfo options"
 
 .SH NAME
 CURLINFO_CONTENT_LENGTH_DOWNLOAD \- get content-length of download
index c238175..8b075d3 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLINFO_CONTENT_LENGTH_DOWNLOAD_T 3 "March 31, 2018" "libcurl 7.62.0" "curl_easy_getinfo options"
+.TH CURLINFO_CONTENT_LENGTH_DOWNLOAD_T 3 "March 31, 2018" "libcurl 7.68.0" "curl_easy_getinfo options"
 
 .SH NAME
 CURLINFO_CONTENT_LENGTH_DOWNLOAD_T \- get content-length of download
index c45cc6b..bacc7fe 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLINFO_CONTENT_LENGTH_UPLOAD 3 "June 15, 2017" "libcurl 7.62.0" "curl_easy_getinfo options"
+.TH CURLINFO_CONTENT_LENGTH_UPLOAD 3 "June 15, 2017" "libcurl 7.68.0" "curl_easy_getinfo options"
 
 .SH NAME
 CURLINFO_CONTENT_LENGTH_UPLOAD \- get the specified size of the upload
index 1598254..8e8acfc 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLINFO_CONTENT_LENGTH_UPLOAD_T 3 "March 31, 2018" "libcurl 7.62.0" "curl_easy_getinfo options"
+.TH CURLINFO_CONTENT_LENGTH_UPLOAD_T 3 "March 31, 2018" "libcurl 7.68.0" "curl_easy_getinfo options"
 
 .SH NAME
 CURLINFO_CONTENT_LENGTH_UPLOAD_T \- get the specified size of the upload
index 3ecf5bf..6e8b4fe 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLINFO_CONTENT_TYPE 3 "May 06, 2017" "libcurl 7.62.0" "curl_easy_getinfo options"
+.TH CURLINFO_CONTENT_TYPE 3 "May 06, 2017" "libcurl 7.68.0" "curl_easy_getinfo options"
 
 .SH NAME
 CURLINFO_CONTENT_TYPE \- get Content-Type
index 403c051..c50a7ae 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLINFO_COOKIELIST 3 "March 20, 2018" "libcurl 7.62.0" "curl_easy_getinfo options"
+.TH CURLINFO_COOKIELIST 3 "March 20, 2018" "libcurl 7.68.0" "curl_easy_getinfo options"
 
 .SH NAME
 CURLINFO_COOKIELIST \- get all known cookies
index 8661ca2..1303617 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLINFO_EFFECTIVE_URL 3 "May 04, 2017" "libcurl 7.62.0" "curl_easy_getinfo options"
+.TH CURLINFO_EFFECTIVE_URL 3 "May 04, 2017" "libcurl 7.68.0" "curl_easy_getinfo options"
 
 .SH NAME
 CURLINFO_EFFECTIVE_URL \- get the last used URL
index 97f6c6e..5a0d67c 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLINFO_FILETIME 3 "January 25, 2018" "libcurl 7.62.0" "curl_easy_getinfo options"
+.TH CURLINFO_FILETIME 3 "January 25, 2018" "libcurl 7.68.0" "curl_easy_getinfo options"
 
 .SH NAME
 CURLINFO_FILETIME \- get the remote time of the retrieved document
index 7f17319..f3e88ff 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLINFO_FILETIME 3 "January 25, 2018" "libcurl 7.62.0" "curl_easy_getinfo options"
+.TH CURLINFO_FILETIME 3 "January 25, 2018" "libcurl 7.68.0" "curl_easy_getinfo options"
 
 .SH NAME
 CURLINFO_FILETIME_T \- get the remote time of the retrieved document
index e61fa4e..ba434b6 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLINFO_FTP_ENTRY_PATH 3 "May 06, 2017" "libcurl 7.62.0" "curl_easy_getinfo options"
+.TH CURLINFO_FTP_ENTRY_PATH 3 "May 06, 2017" "libcurl 7.68.0" "curl_easy_getinfo options"
 
 .SH NAME
 CURLINFO_FTP_ENTRY_PATH \- get entry path in FTP server
index 7d8f320..35eded3 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLINFO_HEADER_SIZE 3 "May 06, 2017" "libcurl 7.62.0" "curl_easy_getinfo options"
+.TH CURLINFO_HEADER_SIZE 3 "May 06, 2017" "libcurl 7.68.0" "curl_easy_getinfo options"
 
 .SH NAME
 CURLINFO_HEADER_SIZE \- get size of retrieved headers
index 98bd6aa..52f6e4a 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLINFO_HTTPAUTH_AVAIL 3 "October 07, 2017" "libcurl 7.62.0" "curl_easy_getinfo options"
+.TH CURLINFO_HTTPAUTH_AVAIL 3 "October 07, 2017" "libcurl 7.68.0" "curl_easy_getinfo options"
 
 .SH NAME
 CURLINFO_HTTPAUTH_AVAIL \- get available HTTP authentication methods
index 074e94c..60436b7 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLINFO_HTTP_CONNECTCODE 3 "May 06, 2017" "libcurl 7.62.0" "curl_easy_getinfo options"
+.TH CURLINFO_HTTP_CONNECTCODE 3 "May 06, 2017" "libcurl 7.68.0" "curl_easy_getinfo options"
 
 .SH NAME
 CURLINFO_HTTP_CONNECTCODE \- get the CONNECT response code
index 623fc66..64e31b6 100644 (file)
@@ -5,7 +5,7 @@
 .\" *                            | (__| |_| |  _ <| |___
 .\" *                             \___|\___/|_| \_\_____|
 .\" *
-.\" * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 .\" *
 .\" * This software is licensed as described in the file COPYING, which
 .\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLINFO_HTTP_VERSION 3 "May 11, 2016" "libcurl 7.62.0" "curl_easy_getinfo options"
+.TH CURLINFO_HTTP_VERSION 3 "August 07, 2019" "libcurl 7.68.0" "curl_easy_getinfo options"
 
 .SH NAME
 CURLINFO_HTTP_VERSION \- get the http version used in the connection
@@ -29,9 +29,10 @@ CURLINFO_HTTP_VERSION \- get the http version used in the connection
 
 CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_HTTP_VERSION, long *p);
 .SH DESCRIPTION
-Pass a pointer to a long to receive the version used in the last http connection.
-The returned value will be CURL_HTTP_VERSION_1_0, CURL_HTTP_VERSION_1_1, or
-CURL_HTTP_VERSION_2_0, or 0 if the version can't be determined.
+Pass a pointer to a long to receive the version used in the last http
+connection.  The returned value will be CURL_HTTP_VERSION_1_0,
+CURL_HTTP_VERSION_1_1, CURL_HTTP_VERSION_2_0, CURL_HTTP_VERSION_3 or 0 if the
+version can't be determined.
 .SH PROTOCOLS
 HTTP
 .SH EXAMPLE
index ebfa7a8..0b955e0 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLINFO_LASTSOCKET 3 "May 06, 2017" "libcurl 7.62.0" "curl_easy_getinfo options"
+.TH CURLINFO_LASTSOCKET 3 "May 06, 2017" "libcurl 7.68.0" "curl_easy_getinfo options"
 
 .SH NAME
 CURLINFO_LASTSOCKET \- get the last socket used
index fcd12da..a681c73 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLINFO_LOCAL_IP 3 "May 05, 2017" "libcurl 7.62.0" "curl_easy_getinfo options"
+.TH CURLINFO_LOCAL_IP 3 "May 05, 2017" "libcurl 7.68.0" "curl_easy_getinfo options"
 
 .SH NAME
 CURLINFO_LOCAL_IP \- get local IP address of last connection
index c746060..c14eb1b 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLINFO_LOCAL_PORT 3 "March 16, 2017" "libcurl 7.62.0" "curl_easy_getinfo options"
+.TH CURLINFO_LOCAL_PORT 3 "March 16, 2017" "libcurl 7.68.0" "curl_easy_getinfo options"
 
 .SH NAME
 CURLINFO_LOCAL_PORT \- get the latest local port number
index 160cf66..742a56f 100644 (file)
@@ -5,7 +5,7 @@
 .\" *                            | (__| |_| |  _ <| |___
 .\" *                             \___|\___/|_| \_\_____|
 .\" *
-.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 .\" *
 .\" * This software is licensed as described in the file COPYING, which
 .\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLINFO_NAMELOOKUP_TIME 3 "May 17, 2018" "libcurl 7.62.0" "curl_easy_getinfo options"
+.TH CURLINFO_NAMELOOKUP_TIME 3 "August 26, 2019" "libcurl 7.68.0" "curl_easy_getinfo options"
 
 .SH NAME
 CURLINFO_NAMELOOKUP_TIME \- get the name lookup time
@@ -32,6 +32,8 @@ CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_NAMELOOKUP_TIME, double *timep
 Pass a pointer to a double to receive the total time in seconds from the start
 until the name resolving was completed.
 
+When a redirect is followed, the time from each request is added together.
+
 See also the TIMES overview in the \fIcurl_easy_getinfo(3)\fP man page.
 .SH PROTOCOLS
 All
index 15589c2..0eea027 100644 (file)
@@ -5,7 +5,7 @@
 .\" *                            | (__| |_| |  _ <| |___
 .\" *                             \___|\___/|_| \_\_____|
 .\" *
-.\" * Copyright (C) 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 2018 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 .\" *
 .\" * This software is licensed as described in the file COPYING, which
 .\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLINFO_NAMELOOKUP_TIME_T 3 "May 17, 2018" "libcurl 7.62.0" "curl_easy_getinfo options"
+.TH CURLINFO_NAMELOOKUP_TIME_T 3 "August 26, 2019" "libcurl 7.68.0" "curl_easy_getinfo options"
 
 .SH NAME
 CURLINFO_NAMELOOKUP_TIME_T \- get the name lookup time in microseconds
@@ -32,6 +32,8 @@ CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_NAMELOOKUP_TIME_T, curl_off_t
 Pass a pointer to a curl_off_t to receive the total time in microseconds
 from the start until the name resolving was completed.
 
+When a redirect is followed, the time from each request is added together.
+
 See also the TIMES overview in the \fIcurl_easy_getinfo(3)\fP man page.
 .SH PROTOCOLS
 All
index f267861..9a0de24 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLINFO_NUM_CONNECTS 3 "May 06, 2017" "libcurl 7.62.0" "curl_easy_getinfo options"
+.TH CURLINFO_NUM_CONNECTS 3 "May 06, 2017" "libcurl 7.68.0" "curl_easy_getinfo options"
 
 .SH NAME
 CURLINFO_NUM_CONNECTS \- get number of created connections
index 47770a8..63381ad 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLINFO_OS_ERRNO 3 "May 15, 2017" "libcurl 7.62.0" "curl_easy_getinfo options"
+.TH CURLINFO_OS_ERRNO 3 "November 07, 2018" "libcurl 7.68.0" "curl_easy_getinfo options"
 
 .SH NAME
 CURLINFO_OS_ERRNO \- get errno number from last connect failure
@@ -45,7 +45,7 @@ if(curl) {
     long error;
     res = curl_easy_getinfo(curl, CURLINFO_OS_ERRNO, &error);
     if(res && error) {
-      printf("Errno: %ld\n", error);
+      printf("Errno: %ld\\n", error);
     }
   }
   curl_easy_cleanup(curl);
index e937d33..91f77ac 100644 (file)
@@ -5,7 +5,7 @@
 .\" *                            | (__| |_| |  _ <| |___
 .\" *                             \___|\___/|_| \_\_____|
 .\" *
-.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 .\" *
 .\" * This software is licensed as described in the file COPYING, which
 .\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLINFO_PRETRANSFER_TIME 3 "May 17, 2018" "libcurl 7.62.0" "curl_easy_getinfo options"
+.TH CURLINFO_PRETRANSFER_TIME 3 "August 26, 2019" "libcurl 7.68.0" "curl_easy_getinfo options"
 
 .SH NAME
 CURLINFO_PRETRANSFER_TIME \- get the time until the file transfer start
@@ -35,6 +35,8 @@ pre-transfer commands and negotiations that are specific to the particular
 protocol(s) involved. It does \fInot\fP involve the sending of the protocol-
 specific request that triggers a transfer.
 
+When a redirect is followed, the time from each request is added together.
+
 See also the TIMES overview in the \fIcurl_easy_getinfo(3)\fP man page.
 .SH PROTOCOLS
 All
index 3af5051..a6c827e 100644 (file)
@@ -5,7 +5,7 @@
 .\" *                            | (__| |_| |  _ <| |___
 .\" *                             \___|\___/|_| \_\_____|
 .\" *
-.\" * Copyright (C) 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 2018 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 .\" *
 .\" * This software is licensed as described in the file COPYING, which
 .\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLINFO_PRETRANSFER_TIME_T 3 "May 17, 2018" "libcurl 7.62.0" "curl_easy_getinfo options"
+.TH CURLINFO_PRETRANSFER_TIME_T 3 "August 26, 2019" "libcurl 7.68.0" "curl_easy_getinfo options"
 
 .SH NAME
 CURLINFO_PRETRANSFER_TIME_T \- get the time until the file transfer start
@@ -36,6 +36,8 @@ pre-transfer commands and negotiations that are specific to the particular
 protocol(s) involved. It does \fInot\fP involve the sending of the protocol-
 specific request that triggers a transfer.
 
+When a redirect is followed, the time from each request is added together.
+
 See also the TIMES overview in the \fIcurl_easy_getinfo(3)\fP man page.
 .SH PROTOCOLS
 All
index 9f27192..54c75c5 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLINFO_PRIMARY_IP 3 "March 22, 2017" "libcurl 7.62.0" "curl_easy_getinfo options"
+.TH CURLINFO_PRIMARY_IP 3 "March 22, 2017" "libcurl 7.68.0" "curl_easy_getinfo options"
 
 .SH NAME
 CURLINFO_PRIMARY_IP \- get IP address of last connection
index 9d28963..542ffbe 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLINFO_PRIMARY_PORT 3 "May 06, 2017" "libcurl 7.62.0" "curl_easy_getinfo options"
+.TH CURLINFO_PRIMARY_PORT 3 "May 06, 2017" "libcurl 7.68.0" "curl_easy_getinfo options"
 
 .SH NAME
 CURLINFO_PRIMARY_PORT \- get the latest destination port number
index 5308ccf..aaf34fd 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLINFO_PRIVATE 3 "May 05, 2017" "libcurl 7.62.0" "curl_easy_getinfo options"
+.TH CURLINFO_PRIVATE 3 "May 05, 2017" "libcurl 7.68.0" "curl_easy_getinfo options"
 
 .SH NAME
 CURLINFO_PRIVATE \- get the private pointer
index ec5bfd4..3634106 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLINFO_PROTOCOL 3 "April 27, 2018" "libcurl 7.62.0" "curl_easy_getinfo options"
+.TH CURLINFO_PROTOCOL 3 "April 27, 2018" "libcurl 7.68.0" "curl_easy_getinfo options"
 
 .SH NAME
 CURLINFO_PROTOCOL \- get the protocol used in the connection
index 9eafd33..809a375 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLINFO_PROXYAUTH_AVAIL 3 "October 07, 2017" "libcurl 7.62.0" "curl_easy_getinfo options"
+.TH CURLINFO_PROXYAUTH_AVAIL 3 "October 07, 2017" "libcurl 7.68.0" "curl_easy_getinfo options"
 
 .SH NAME
 CURLINFO_PROXYAUTH_AVAIL \- get available HTTP proxy authentication methods
index 8f287b4..3edf591 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLINFO_PROXY_SSL_VERIFYRESULT 3 "May 31, 2017" "libcurl 7.62.0" "curl_easy_getinfo options"
+.TH CURLINFO_PROXY_SSL_VERIFYRESULT 3 "May 31, 2017" "libcurl 7.68.0" "curl_easy_getinfo options"
 
 .SH NAME
 CURLINFO_PROXY_SSL_VERIFYRESULT \- get the result of the proxy certificate verification
index 507e1a2..5640fdd 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLINFO_REDIRECT_COUNT 3 "May 05, 2017" "libcurl 7.62.0" "curl_easy_getinfo options"
+.TH CURLINFO_REDIRECT_COUNT 3 "May 05, 2017" "libcurl 7.68.0" "curl_easy_getinfo options"
 
 .SH NAME
 CURLINFO_REDIRECT_COUNT \- get the number of redirects
index 6197b25..03ba793 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLINFO_REDIRECT_TIME 3 "May 17, 2018" "libcurl 7.62.0" "curl_easy_getinfo options"
+.TH CURLINFO_REDIRECT_TIME 3 "May 17, 2018" "libcurl 7.68.0" "curl_easy_getinfo options"
 
 .SH NAME
 CURLINFO_REDIRECT_TIME \- get the time for all redirection steps
index 44c483a..cc79711 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLINFO_REDIRECT_TIME_T 3 "May 17, 2018" "libcurl 7.62.0" "curl_easy_getinfo options"
+.TH CURLINFO_REDIRECT_TIME_T 3 "May 17, 2018" "libcurl 7.68.0" "curl_easy_getinfo options"
 
 .SH NAME
 CURLINFO_REDIRECT_TIME_T \- get the time for all redirection steps
index 619dc63..f1b3e7a 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLINFO_REDIRECT_URL 3 "June 24, 2017" "libcurl 7.62.0" "curl_easy_getinfo options"
+.TH CURLINFO_REDIRECT_URL 3 "June 24, 2017" "libcurl 7.68.0" "curl_easy_getinfo options"
 
 .SH NAME
 CURLINFO_REDIRECT_URL \- get the URL a redirect would go to
index ac15b56..e554336 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLINFO_REQUEST_SIZE 3 "May 06, 2017" "libcurl 7.62.0" "curl_easy_getinfo options"
+.TH CURLINFO_REQUEST_SIZE 3 "May 06, 2017" "libcurl 7.68.0" "curl_easy_getinfo options"
 
 .SH NAME
 CURLINFO_REQUEST_SIZE \- get size of sent request
index 0c630a9..a5d8527 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLINFO_RESPONSE_CODE 3 "February 03, 2016" "libcurl 7.62.0" "curl_easy_getinfo options"
+.TH CURLINFO_RESPONSE_CODE 3 "February 03, 2016" "libcurl 7.68.0" "curl_easy_getinfo options"
 
 .SH NAME
 CURLINFO_RESPONSE_CODE \- get the last response code
diff --git a/docs/libcurl/opts/CURLINFO_RETRY_AFTER.3 b/docs/libcurl/opts/CURLINFO_RETRY_AFTER.3
new file mode 100644 (file)
index 0000000..6dedb1c
--- /dev/null
@@ -0,0 +1,64 @@
+.\" **************************************************************************
+.\" *                                  _   _ ____  _
+.\" *  Project                     ___| | | |  _ \| |
+.\" *                             / __| | | | |_) | |
+.\" *                            | (__| |_| |  _ <| |___
+.\" *                             \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
+.\" * are also available at https://curl.haxx.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH CURLINFO_RETRY_AFTER 3 "August 06, 2019" "libcurl 7.68.0" "curl_easy_getinfo options"
+
+.SH NAME
+CURLINFO_RETRY_AFTER \- returns the Retry-After retry delay
+.SH SYNOPSIS
+#include <curl/curl.h>
+
+CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_RETRY_AFTER, curl_off_t *retry);
+.SH DESCRIPTION
+Pass a pointer to a curl_off_t variable to receive the number of seconds the
+HTTP server suggesets the client should wait until the next request is
+issued. The information from the "Retry-After:" header.
+
+While the HTTP header might contain a fixed date string, the
+\fICURLINFO_RETRY_AFTER(3)\fP will alwaus return number of seconds to wait -
+or zero if there was no header or the header couldn't be parsed.
+.SH DEFAULT
+Returns zero delay if there was no header.
+.SH PROTOCOLS
+HTTP(S)
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+  CURLcode res;
+  curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+  res = curl_easy_perform(curl);
+  if(res == CURLE_OK) {
+    curl_off_t wait = 0;
+    curl_easy_getinfo(curl, CURLINFO_RETRY_AFTER, &wait);
+    if(wait)
+      printf("Wait for %" CURL_FORMAT_CURL_OFF_T " seconds\\n", wait);
+  }
+  curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in curl 7.66.0
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR CURLOPT_STDERR "(3), " CURLOPT_HEADERFUNCTION "(3), "
index f95ba82..01bc90d 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLINFO_RTSP_CLIENT_CSEQ 3 "May 31, 2017" "libcurl 7.62.0" "curl_easy_getinfo options"
+.TH CURLINFO_RTSP_CLIENT_CSEQ 3 "May 31, 2017" "libcurl 7.68.0" "curl_easy_getinfo options"
 
 .SH NAME
 CURLINFO_RTSP_CLIENT_CSEQ \- get the next RTSP client CSeq
index 3bb38df..027a98b 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLINFO_RTSP_CSEQ_RECV 3 "May 31, 2017" "libcurl 7.62.0" "curl_easy_getinfo options"
+.TH CURLINFO_RTSP_CSEQ_RECV 3 "May 31, 2017" "libcurl 7.68.0" "curl_easy_getinfo options"
 
 .SH NAME
 CURLINFO_RTSP_CSEQ_RECV \- get the recently received CSeq
index 6155454..c1ba8fe 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLINFO_RTSP_SERVER_CSEQ 3 "May 31, 2017" "libcurl 7.62.0" "curl_easy_getinfo options"
+.TH CURLINFO_RTSP_SERVER_CSEQ 3 "May 31, 2017" "libcurl 7.68.0" "curl_easy_getinfo options"
 
 .SH NAME
 CURLINFO_RTSP_SERVER_CSEQ \- get the next RTSP server CSeq
index df2c0f7..5ad2ddb 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLINFO_RTSP_SESSION_ID 3 "May 31, 2017" "libcurl 7.62.0" "curl_easy_getinfo options"
+.TH CURLINFO_RTSP_SESSION_ID 3 "May 31, 2017" "libcurl 7.68.0" "curl_easy_getinfo options"
 
 .SH NAME
 CURLINFO_RTSP_SESSION_ID \- get RTSP session ID
index af65e1e..4ebde9a 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLINFO_SCHEME 3 "April 08, 2017" "libcurl 7.62.0" "curl_easy_getinfo options"
+.TH CURLINFO_SCHEME 3 "April 08, 2017" "libcurl 7.68.0" "curl_easy_getinfo options"
 
 .SH NAME
 CURLINFO_SCHEME \- get the URL scheme (sometimes called protocol) used in the connection
index 5a9a162..daa0289 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLINFO_SIZE_DOWNLOAD 3 "June 15, 2017" "libcurl 7.62.0" "curl_easy_getinfo options"
+.TH CURLINFO_SIZE_DOWNLOAD 3 "June 15, 2017" "libcurl 7.68.0" "curl_easy_getinfo options"
 
 .SH NAME
 CURLINFO_SIZE_DOWNLOAD \- get the number of downloaded bytes
index b3b818c..1cf2ca7 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLINFO_SIZE_DOWNLOAD_T 3 "March 31, 2018" "libcurl 7.62.0" "curl_easy_getinfo options"
+.TH CURLINFO_SIZE_DOWNLOAD_T 3 "March 31, 2018" "libcurl 7.68.0" "curl_easy_getinfo options"
 
 .SH NAME
 CURLINFO_SIZE_DOWNLOAD_T \- get the number of downloaded bytes
index 3e768a8..f8a9f7a 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLINFO_SIZE_UPLOAD 3 "June 15, 2017" "libcurl 7.62.0" "curl_easy_getinfo options"
+.TH CURLINFO_SIZE_UPLOAD 3 "June 15, 2017" "libcurl 7.68.0" "curl_easy_getinfo options"
 
 .SH NAME
 CURLINFO_SIZE_UPLOAD \- get the number of uploaded bytes
index da96530..2c0eb5e 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLINFO_SIZE_UPLOAD_T 3 "March 31, 2018" "libcurl 7.62.0" "curl_easy_getinfo options"
+.TH CURLINFO_SIZE_UPLOAD_T 3 "March 31, 2018" "libcurl 7.68.0" "curl_easy_getinfo options"
 
 .SH NAME
 CURLINFO_SIZE_UPLOAD_T \- get the number of uploaded bytes
index e5a8f1e..0c6abc2 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLINFO_SPEED_DOWNLOAD 3 "June 15, 2017" "libcurl 7.62.0" "curl_easy_getinfo options"
+.TH CURLINFO_SPEED_DOWNLOAD 3 "June 15, 2017" "libcurl 7.68.0" "curl_easy_getinfo options"
 
 .SH NAME
 CURLINFO_SPEED_DOWNLOAD \- get download speed
index 574674d..4b8b16d 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLINFO_SPEED_DOWNLOAD_T 3 "March 31, 2018" "libcurl 7.62.0" "curl_easy_getinfo options"
+.TH CURLINFO_SPEED_DOWNLOAD_T 3 "March 31, 2018" "libcurl 7.68.0" "curl_easy_getinfo options"
 
 .SH NAME
 CURLINFO_SPEED_DOWNLOAD_T \- get download speed
index 9588d91..19968ee 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLINFO_SPEED_UPLOAD 3 "June 15, 2017" "libcurl 7.62.0" "curl_easy_getinfo options"
+.TH CURLINFO_SPEED_UPLOAD 3 "June 15, 2017" "libcurl 7.68.0" "curl_easy_getinfo options"
 
 .SH NAME
 CURLINFO_SPEED_UPLOAD \- get upload speed
index 9efe81e..f8a3a5c 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLINFO_SPEED_UPLOAD_T 3 "March 31, 2018" "libcurl 7.62.0" "curl_easy_getinfo options"
+.TH CURLINFO_SPEED_UPLOAD_T 3 "March 31, 2018" "libcurl 7.68.0" "curl_easy_getinfo options"
 
 .SH NAME
 CURLINFO_SPEED_UPLOAD_T \- get upload speed
index ea0ce54..5964659 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLINFO_SSL_ENGINES 3 "May 31, 2017" "libcurl 7.62.0" "curl_easy_getinfo options"
+.TH CURLINFO_SSL_ENGINES 3 "May 31, 2017" "libcurl 7.68.0" "curl_easy_getinfo options"
 
 .SH NAME
 CURLINFO_SSL_ENGINES \- get an slist of OpenSSL crypto-engines
index af7b9e6..65e98be 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLINFO_SSL_VERIFYRESULT 3 "March 21, 2018" "libcurl 7.62.0" "curl_easy_getinfo options"
+.TH CURLINFO_SSL_VERIFYRESULT 3 "March 21, 2018" "libcurl 7.68.0" "curl_easy_getinfo options"
 
 .SH NAME
 CURLINFO_SSL_VERIFYRESULT \- get the result of the certificate verification
index b84c085..64c1c6b 100644 (file)
@@ -5,7 +5,7 @@
 .\" *                            | (__| |_| |  _ <| |___
 .\" *                             \___|\___/|_| \_\_____|
 .\" *
-.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 .\" *
 .\" * This software is licensed as described in the file COPYING, which
 .\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLINFO_STARTTRANSFER_TIME 3 "May 17, 2018" "libcurl 7.62.0" "curl_easy_getinfo options"
+.TH CURLINFO_STARTTRANSFER_TIME 3 "August 26, 2019" "libcurl 7.68.0" "curl_easy_getinfo options"
 
 .SH NAME
 CURLINFO_STARTTRANSFER_TIME \- get the time until the first byte is received
@@ -34,6 +34,8 @@ start until the first byte is received by libcurl. This includes
 \fICURLINFO_PRETRANSFER_TIME(3)\fP and also the time the server needs to
 calculate the result.
 
+When a redirect is followed, the time from each request is added together.
+
 See also the TIMES overview in the \fIcurl_easy_getinfo(3)\fP man page.
 .SH PROTOCOLS
 All
index dc7a931..079cf57 100644 (file)
@@ -5,7 +5,7 @@
 .\" *                            | (__| |_| |  _ <| |___
 .\" *                             \___|\___/|_| \_\_____|
 .\" *
-.\" * Copyright (C) 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 2018 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 .\" *
 .\" * This software is licensed as described in the file COPYING, which
 .\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLINFO_STARTTRANSFER_TIME_T 3 "May 17, 2018" "libcurl 7.62.0" "curl_easy_getinfo options"
+.TH CURLINFO_STARTTRANSFER_TIME_T 3 "August 26, 2019" "libcurl 7.68.0" "curl_easy_getinfo options"
 
 .SH NAME
 CURLINFO_STARTTRANSFER_TIME_T \- get the time until the first byte is received
@@ -35,6 +35,8 @@ start until the first byte is received by libcurl. This includes
 \fICURLINFO_PRETRANSFER_TIME_T(3)\fP and also the time the server needs to
 calculate the result.
 
+When a redirect is followed, the time from each request is added together.
+
 See also the TIMES overview in the \fIcurl_easy_getinfo(3)\fP man page.
 .SH PROTOCOLS
 All
index 4cc9a23..efc98d8 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLINFO_TLS_SESSION 3 "May 31, 2017" "libcurl 7.62.0" "curl_easy_getinfo options"
+.TH CURLINFO_TLS_SESSION 3 "May 31, 2017" "libcurl 7.68.0" "curl_easy_getinfo options"
 
 .SH NAME
 CURLINFO_TLS_SESSION \- get TLS session info
index b8993a3..1c9714a 100644 (file)
@@ -5,7 +5,7 @@
 .\" *                            | (__| |_| |  _ <| |___
 .\" *                             \___|\___/|_| \_\_____|
 .\" *
-.\" * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 .\" *
 .\" * This software is licensed as described in the file COPYING, which
 .\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLINFO_TLS_SSL_PTR 3 "October 30, 2018" "libcurl 7.62.0" "curl_easy_getinfo options"
+.TH CURLINFO_TLS_SSL_PTR 3 "July 16, 2019" "libcurl 7.68.0" "curl_easy_getinfo options"
 
 .SH NAME
 CURLINFO_TLS_SESSION, CURLINFO_TLS_SSL_PTR \- get TLS session info
@@ -55,7 +55,7 @@ struct curl_tlssessioninfo {
 
 The \fIbackend\fP struct member is one of the defines in the CURLSSLBACKEND_*
 series: CURLSSLBACKEND_NONE (when built without TLS support),
-CURLSSLBACKEND_AXTLS, CURLSSLBACKEND_CYASSL, CURLSSLBACKEND_DARWINSSL,
+CURLSSLBACKEND_WOLFSSL, CURLSSLBACKEND_DARWINSSL,
 CURLSSLBACKEND_GNUTLS, CURLSSLBACKEND_GSKIT, CURLSSLBACKEND_MBEDTLS,
 CURLSSLBACKEND_NSS, CURLSSLBACKEND_OPENSSL, CURLSSLBACKEND_POLARSSL,
 CURLSSLBACKEND_SCHANNEL or CURLSSLBACKEND_MESALINK. (Note that the OpenSSL
@@ -78,17 +78,15 @@ CURLINFO_TLS_SSL_PTR: SSL *
 Since 7.48.0 the \fIinternals\fP member can point to these other SSL backends
 as well:
 .RS
-.IP axTLS
-SSL *
 .IP mbedTLS
 mbedtls_ssl_context *
 .IP PolarSSL
 ssl_context *
-.IP "Secure Channel (WinSSL)"
+.IP "Secure Channel"
 CtxtHandle *
-.IP "Secure Transport (DarwinSSL)"
+.IP "Secure Transport"
 SSLContext *
-.IP "WolfSSL (formerly CyaSSL)"
+.IP "wolfSSL"
 SSL *
 .IP "MesaLink"
 SSL *
@@ -98,26 +96,26 @@ If the \fIinternals\fP pointer is NULL then either the SSL backend is not
 supported, an SSL session has not yet been established or the connection is no
 longer associated with the easy handle (eg curl_easy_perform has returned).
 .SH LIMITATIONS
-\fBThis option has some limitations that could make it unsafe when it comes to
-the manual verification of certificates.\fP
+This option has some limitations that could make it unsafe when it comes to
+the manual verification of certificates.
 
 This option only retrieves the first in-use SSL session pointer for your easy
 handle, however your easy handle may have more than one in-use SSL session if
 using FTP over SSL. That is because the FTP protocol has a control channel and
-a data channel and one or both may be over SSL. \fBCurrently there is no way to
-retrieve a second in-use SSL session associated with an easy handle.\fP
+a data channel and one or both may be over SSL. Currently there is no way to
+retrieve a second in-use SSL session associated with an easy handle.
 
-This option has not been thoroughly tested with plaintext protocols that can be
-upgraded/downgraded to/from SSL: FTP, SMTP, POP3, IMAP when used with
+This option has not been thoroughly tested with plaintext protocols that can
+be upgraded/downgraded to/from SSL: FTP, SMTP, POP3, IMAP when used with
 \fICURLOPT_USE_SSL(3)\fP. Though you will be able to retrieve the SSL pointer,
-it's possible that before you can do that \fBdata (including auth) may have
-already been sent over a connection after it was upgraded.\fP
+it's possible that before you can do that data (including auth) may have
+already been sent over a connection after it was upgraded.
 
 Renegotiation. If unsafe renegotiation or renegotiation in a way that the
 certificate is allowed to change is allowed by your SSL library this may occur
-and the certificate may change, and \fBdata may continue to be sent or received
+and the certificate may change, and data may continue to be sent or received
 after renegotiation but before you are able to get the (possibly) changed SSL
-pointer,\fP with the (possibly) changed certificate information.
+pointer, with the (possibly) changed certificate information.
 
 If you are using OpenSSL or wolfSSL then \fICURLOPT_SSL_CTX_FUNCTION(3)\fP can
 be used to set a certificate verification callback in the CTX. That is safer
index 2dfd2ae..961f4e7 100644 (file)
@@ -5,7 +5,7 @@
 .\" *                            | (__| |_| |  _ <| |___
 .\" *                             \___|\___/|_| \_\_____|
 .\" *
-.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 .\" *
 .\" * This software is licensed as described in the file COPYING, which
 .\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLINFO_TOTAL_TIME 3 "May 17, 2018" "libcurl 7.62.0" "curl_easy_getinfo options"
+.TH CURLINFO_TOTAL_TIME 3 "August 26, 2019" "libcurl 7.68.0" "curl_easy_getinfo options"
 
 .SH NAME
 CURLINFO_TOTAL_TIME \- get total time of previous transfer
@@ -33,6 +33,8 @@ Pass a pointer to a double to receive the total time in seconds for the
 previous transfer, including name resolving, TCP connect etc. The double
 represents the time in seconds, including fractions.
 
+When a redirect is followed, the time from each request is added together.
+
 See also the TIMES overview in the \fIcurl_easy_getinfo(3)\fP man page.
 .SH PROTOCOLS
 All
index fa7ce04..b247b98 100644 (file)
@@ -5,7 +5,7 @@
 .\" *                            | (__| |_| |  _ <| |___
 .\" *                             \___|\___/|_| \_\_____|
 .\" *
-.\" * Copyright (C) 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 2018 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 .\" *
 .\" * This software is licensed as described in the file COPYING, which
 .\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLINFO_TOTAL_TIME_T 3 "May 17, 2018" "libcurl 7.62.0" "curl_easy_getinfo options"
+.TH CURLINFO_TOTAL_TIME_T 3 "August 26, 2019" "libcurl 7.68.0" "curl_easy_getinfo options"
 
 .SH NAME
 CURLINFO_TOTAL_TIME_T \- get total time of previous transfer in microseconds
@@ -33,6 +33,8 @@ Pass a pointer to a curl_off_t to receive the total time in microseconds
 for the previous transfer, including name resolving, TCP connect etc.
 The curl_off_t represents the time in microseconds.
 
+When a redirect is followed, the time from each request is added together.
+
 See also the TIMES overview in the \fIcurl_easy_getinfo(3)\fP man page.
 .SH PROTOCOLS
 All
index 0f00d41..decc810 100644 (file)
@@ -5,7 +5,7 @@
 .\" *                            | (__| |_| |  _ <| |___
 .\" *                             \___|\___/|_| \_\_____|
 .\" *
-.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 .\" *
 .\" * This software is licensed as described in the file COPYING, which
 .\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE 3 "May 27, 2017" "libcurl 7.62.0" "curl_multi_setopt options"
+.TH CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE 3 "April 05, 2019" "libcurl 7.68.0" "curl_multi_setopt options"
 
 .SH NAME
 CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE \- chunk length threshold for pipelining
@@ -29,6 +29,8 @@ CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE \- chunk length threshold for pipelining
 
 CURLMcode curl_multi_setopt(CURLM *handle, CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE, long size);
 .SH DESCRIPTION
+No function since pipelining was removed in 7.62.0.
+
 Pass a long with a \fBsize\fP in bytes. If a pipelined connection is currently
 processing a chunked (Transfer-encoding: chunked) request with a current chunk
 length larger than \fICURLMOPT_CHUNK_LENGTH_PENALTY_SIZE(3)\fP, that pipeline
index 1ba5749..aa2f88a 100644 (file)
@@ -5,7 +5,7 @@
 .\" *                            | (__| |_| |  _ <| |___
 .\" *                             \___|\___/|_| \_\_____|
 .\" *
-.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 .\" *
 .\" * This software is licensed as described in the file COPYING, which
 .\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE 3 "May 27, 2017" "libcurl 7.62.0" "curl_multi_setopt options"
+.TH CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE 3 "April 05, 2019" "libcurl 7.68.0" "curl_multi_setopt options"
 
 .SH NAME
 CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE \- size threshold for pipelining penalty
@@ -29,6 +29,8 @@ CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE \- size threshold for pipelining penalty
 
 CURLMcode curl_multi_setopt(CURLM *handle, CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE, long size);
 .SH DESCRIPTION
+No function since pipelining was removed in 7.62.0.
+
 Pass a long with a \fBsize\fP in bytes. If a pipelined connection is currently
 processing a request with a Content-Length larger than this
 \fICURLMOPT_CONTENT_LENGTH_PENALTY_SIZE(3)\fP, that pipeline will then not be
index 6b737ec..0af783f 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLMOPT_MAXCONNECTS 3 "September 23, 2018" "libcurl 7.62.0" "curl_multi_setopt options"
+.TH CURLMOPT_MAXCONNECTS 3 "September 23, 2018" "libcurl 7.68.0" "curl_multi_setopt options"
 
 .SH NAME
 CURLMOPT_MAXCONNECTS \- set size of connection cache
diff --git a/docs/libcurl/opts/CURLMOPT_MAX_CONCURRENT_STREAMS.3 b/docs/libcurl/opts/CURLMOPT_MAX_CONCURRENT_STREAMS.3
new file mode 100644 (file)
index 0000000..99cd86c
--- /dev/null
@@ -0,0 +1,56 @@
+.\" **************************************************************************
+.\" *                                  _   _ ____  _
+.\" *  Project                     ___| | | |  _ \| |
+.\" *                             / __| | | | |_) | |
+.\" *                            | (__| |_| |  _ <| |___
+.\" *                             \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
+.\" * are also available at https://curl.haxx.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH CURLMOPT_MAX_CONCURRENT_STREAMS 3 "06 Nov 2019" "libcurl 7.67.0" "curl_multi_setopt options"
+.SH NAME
+CURLMOPT_MAX_CONCURRENT_STREAMS \- set max concurrent streams for http2
+.SH SYNOPSIS
+.nf
+#include <curl/curl.h>
+
+CURLMcode curl_multi_setopt(CURLM *handle, CURLMOPT_MAX_CONCURRENT_STREAMS,
+                            long max);
+.fi
+.SH DESCRIPTION
+Pass a long indicating the \fBmax\fP. The set number will be used as the
+maximum number of concurrent streams for a connections that libcurl should
+support on connections done using HTTP/2.
+
+Valid values range from 1 to 2147483647 (2^31 - 1) and defaults to 100.  The
+value passed here would be honoured based on other system resources
+properties.
+.SH DEFAULT
+100
+.SH PROTOCOLS
+All
+.SH EXAMPLE
+.nf
+  CURLM *m = curl_multi_init();
+  /* max concurrent streams 200 */
+  curl_multi_setopt(m, CURLMOPT_MAX_CONCURRENT_STREAMS, 200L);
+.fi
+.SH AVAILABILITY
+Added in 7.67.0
+.SH RETURN VALUE
+Returns CURLM_OK if the option is supported, and CURLM_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR CURLOPT_MAXCONNECTS "(3), " CURLMOPT_MAXCONNECTS "(3), "
index b6e3231..a809a25 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLMOPT_MAX_HOST_CONNECTIONS 3 "May 27, 2017" "libcurl 7.62.0" "curl_multi_setopt options"
+.TH CURLMOPT_MAX_HOST_CONNECTIONS 3 "May 27, 2017" "libcurl 7.68.0" "curl_multi_setopt options"
 
 .SH NAME
 CURLMOPT_MAX_HOST_CONNECTIONS \- set max number of connections to a single host
index 94e5d2e..86977ad 100644 (file)
@@ -5,7 +5,7 @@
 .\" *                            | (__| |_| |  _ <| |___
 .\" *                             \___|\___/|_| \_\_____|
 .\" *
-.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 .\" *
 .\" * This software is licensed as described in the file COPYING, which
 .\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLMOPT_MAX_PIPELINE_LENGTH 3 "May 27, 2017" "libcurl 7.62.0" "curl_multi_setopt options"
+.TH CURLMOPT_MAX_PIPELINE_LENGTH 3 "April 05, 2019" "libcurl 7.68.0" "curl_multi_setopt options"
 
 .SH NAME
 CURLMOPT_MAX_PIPELINE_LENGTH \- maximum number of requests in a pipeline
@@ -29,6 +29,8 @@ CURLMOPT_MAX_PIPELINE_LENGTH \- maximum number of requests in a pipeline
 
 CURLMcode curl_multi_setopt(CURLM *handle, CURLMOPT_MAX_PIPELINE_LENGTH, long max);
 .SH DESCRIPTION
+No function since pipelining was removed in 7.62.0.
+
 Pass a long. The set \fBmax\fP number will be used as the maximum amount of
 outstanding requests in an HTTP/1.1 pipelined connection. This option is only
 used for HTTP/1.1 pipelining, not for HTTP/2 multiplexing.
index 302fa8a..ed668be 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLMOPT_MAX_TOTAL_CONNECTIONS 3 "May 27, 2017" "libcurl 7.62.0" "curl_multi_setopt options"
+.TH CURLMOPT_MAX_TOTAL_CONNECTIONS 3 "May 27, 2017" "libcurl 7.68.0" "curl_multi_setopt options"
 
 .SH NAME
 CURLMOPT_MAX_TOTAL_CONNECTIONS \- max simultaneously open connections
index 619b331..ff80c38 100644 (file)
@@ -5,7 +5,7 @@
 .\" *                            | (__| |_| |  _ <| |___
 .\" *                             \___|\___/|_| \_\_____|
 .\" *
-.\" * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 .\" *
 .\" * This software is licensed as described in the file COPYING, which
 .\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLMOPT_PIPELINING 3 "September 05, 2018" "libcurl 7.62.0" "curl_multi_setopt options"
+.TH CURLMOPT_PIPELINING 3 "April 05, 2019" "libcurl 7.68.0" "curl_multi_setopt options"
 
 .SH NAME
 CURLMOPT_PIPELINING \- enable HTTP pipelining and multiplexing
@@ -64,7 +64,7 @@ This bit is deprecated and has no effect since version 7.62.0.
 If this bit is set, libcurl will try to multiplex the new transfer over an
 existing connection if possible. This requires HTTP/2.
 .SH DEFAULT
-Since 7.62.0, \fBCURLPIPE_MULTIPLEX\bP is enabled by default.
+Since 7.62.0, \fBCURLPIPE_MULTIPLEX\fP is enabled by default.
 
 Before that, default was \fBCURLPIPE_NOTHING\fP.
 .SH PROTOCOLS
@@ -72,12 +72,12 @@ HTTP(S)
 .SH EXAMPLE
 .nf
 CURLM *m = curl_multi_init();
-/* try HTTP/1 pipelining and HTTP/2 multiplexing */
-curl_multi_setopt(m, CURLMOPT_PIPELINING, CURLPIPE_HTTP1 |
-                                          CURLPIPE_MULTIPLEX);
+/* try HTTP/2 multiplexing */
+curl_multi_setopt(m, CURLMOPT_PIPELINING, CURLPIPE_MULTIPLEX);
 .fi
 .SH AVAILABILITY
-Added in 7.16.0. Multiplex support bit added in 7.43.0.
+Added in 7.16.0. Multiplex support bit added in 7.43.0. HTTP/1 Pipelining
+support was disabled in 7.62.0.
 .SH RETURN VALUE
 Returns CURLM_OK if the option is supported, and CURLM_UNKNOWN_OPTION if not.
 .SH "SEE ALSO"
index bc03048..b583683 100644 (file)
@@ -5,7 +5,7 @@
 .\" *                            | (__| |_| |  _ <| |___
 .\" *                             \___|\___/|_| \_\_____|
 .\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 .\" *
 .\" * This software is licensed as described in the file COPYING, which
 .\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLMOPT_PIPELINING_SERVER_BL 3 "September 23, 2018" "libcurl 7.62.0" "curl_multi_setopt options"
+.TH CURLMOPT_PIPELINING_SERVER_BL 3 "April 05, 2019" "libcurl 7.68.0" "curl_multi_setopt options"
 
 .SH NAME
 CURLMOPT_PIPELINING_SERVER_BL \- pipelining server blacklist
@@ -29,6 +29,8 @@ CURLMOPT_PIPELINING_SERVER_BL \- pipelining server blacklist
 
 CURLMcode curl_multi_setopt(CURLM *handle, CURLMOPT_PIPELINING_SERVER_BL, char **servers);
 .SH DESCRIPTION
+No function since pipelining was removed in 7.62.0.
+
 Pass a \fBservers\fP array of char *, ending with a NULL entry. This is a list
 of server types prefixes (in the Server: HTTP header) that are blacklisted
 from pipelining, i.e server types that are known to not support HTTP
index 5366662..583f6d9 100644 (file)
@@ -5,7 +5,7 @@
 .\" *                            | (__| |_| |  _ <| |___
 .\" *                             \___|\___/|_| \_\_____|
 .\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 .\" *
 .\" * This software is licensed as described in the file COPYING, which
 .\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLMOPT_PIPELINING_SITE_BL 3 "February 03, 2016" "libcurl 7.62.0" "curl_multi_setopt options"
+.TH CURLMOPT_PIPELINING_SITE_BL 3 "April 05, 2019" "libcurl 7.68.0" "curl_multi_setopt options"
 
 .SH NAME
 CURLMOPT_PIPELINING_SITE_BL \- pipelining host blacklist
@@ -29,6 +29,8 @@ CURLMOPT_PIPELINING_SITE_BL \- pipelining host blacklist
 
 CURLMcode curl_multi_setopt(CURLM *handle, CURLMOPT_PIPELINING_SITE_BL, char **hosts);
 .SH DESCRIPTION
+No function since pipelining was removed in 7.62.0.
+
 Pass a \fBhosts\fP array of char *, ending with a NULL entry. This is a list
 of sites that are blacklisted from pipelining, i.e sites that are known to not
 support HTTP pipelining. The array is copied by libcurl.
index 4e4cf51..1b93c72 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLMOPT_PUSHDATA 3 "May 27, 2017" "libcurl 7.62.0" "curl_multi_setopt options"
+.TH CURLMOPT_PUSHDATA 3 "May 27, 2017" "libcurl 7.68.0" "curl_multi_setopt options"
 
 .SH NAME
 CURLMOPT_PUSHDATA \- pointer to pass to push callback
index 8324c92..61f6785 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLMOPT_PUSHFUNCTION 3 "February 03, 2016" "libcurl 7.62.0" "curl_multi_setopt options"
+.TH CURLMOPT_PUSHFUNCTION 3 "February 03, 2016" "libcurl 7.68.0" "curl_multi_setopt options"
 
 .SH NAME
 CURLMOPT_PUSHFUNCTION \- callback that approves or denies server pushes
index 74adda2..97200ff 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLMOPT_SOCKETDATA 3 "May 31, 2017" "libcurl 7.62.0" "curl_multi_setopt options"
+.TH CURLMOPT_SOCKETDATA 3 "May 31, 2017" "libcurl 7.68.0" "curl_multi_setopt options"
 
 .SH NAME
 CURLMOPT_SOCKETDATA \- custom pointer passed to the socket callback
index f519eb4..4973472 100644 (file)
@@ -5,7 +5,7 @@
 .\" *                            | (__| |_| |  _ <| |___
 .\" *                             \___|\___/|_| \_\_____|
 .\" *
-.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 .\" *
 .\" * This software is licensed as described in the file COPYING, which
 .\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLMOPT_SOCKETFUNCTION 3 "September 23, 2018" "libcurl 7.62.0" "curl_multi_setopt options"
+.TH CURLMOPT_SOCKETFUNCTION 3 "June 24, 2019" "libcurl 7.68.0" "curl_multi_setopt options"
 
 .SH NAME
 CURLMOPT_SOCKETFUNCTION \- callback informed about what to wait for
@@ -39,14 +39,24 @@ CURLMcode curl_multi_setopt(CURLM *handle, CURLMOPT_SOCKETFUNCTION, socket_callb
 Pass a pointer to your callback function, which should match the prototype
 shown above.
 
-When the \fIcurl_multi_socket_action(3)\fP function runs, it informs the
+When the \fIcurl_multi_socket_action(3)\fP function is called, it informs the
 application about updates in the socket (file descriptor) status by doing
-none, one, or multiple calls to the \fBsocket_callback\fP. The callback gets
-status updates with changes since the previous time the callback was called.
-If the given callback pointer is NULL, no callback will be called. Set the
-callback's \fBuserp\fP argument with \fICURLMOPT_SOCKETDATA(3)\fP.  See
-\fIcurl_multi_socket_action(3)\fP for more details on how the callback is used
-and should work.
+none, one, or multiple calls to the \fBsocket_callback\fP. The callback
+function gets status updates with changes since the previous time the callback
+was called. If the given callback pointer is set to NULL, no callback will be
+called.
+.SH "CALLBACK ARGUMENTS"
+\fIeasy\fP identifies the specific transfer for which this update is related.
+
+\fIs\fP is the specific socket this function invocation concerns. If the
+\fBwhat\fP argument is not CURL_POLL_REMOVE then it holds information about
+what activity on this socket the application is supposed to
+monitor. Subsequent calls to this callback might update the \fBwhat\fP bits
+for a socket that is already monitored.
+
+\fBuserp\fP is set with \fICURLMOPT_SOCKETDATA(3)\fP.
+
+\fBsocketp\fP is set with \fIcurl_multi_assign(3)\fP or will be NULL.
 
 The \fBwhat\fP parameter informs the callback on the status of the given
 socket. It can hold one of these values:
index b555676..753a7fc 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLMOPT_TIMERDATA 3 "May 27, 2017" "libcurl 7.62.0" "curl_multi_setopt options"
+.TH CURLMOPT_TIMERDATA 3 "May 27, 2017" "libcurl 7.68.0" "curl_multi_setopt options"
 
 .SH NAME
 CURLMOPT_TIMERDATA \- custom pointer to pass to timer callback
index e86e073..8b38147 100644 (file)
@@ -5,7 +5,7 @@
 .\" *                            | (__| |_| |  _ <| |___
 .\" *                             \___|\___/|_| \_\_____|
 .\" *
-.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 .\" *
 .\" * This software is licensed as described in the file COPYING, which
 .\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLMOPT_TIMERFUNCTION 3 "May 27, 2017" "libcurl 7.62.0" "curl_multi_setopt options"
+.TH CURLMOPT_TIMERFUNCTION 3 "May 03, 2019" "libcurl 7.68.0" "curl_multi_setopt options"
 
 .SH NAME
 CURLMOPT_TIMERFUNCTION \- set callback to receive timeout values
@@ -29,7 +29,7 @@ CURLMOPT_TIMERFUNCTION \- set callback to receive timeout values
 #include <curl/curl.h>
 
 int timer_callback(CURLM *multi,    /* multi handle */
-                   long timeout_ms, /* see above */
+                   long timeout_ms, /* timeout in number of ms */
                    void *userp);    /* private callback pointer */
 
 CURLMcode curl_multi_setopt(CURLM *handle, CURLMOPT_TIMERFUNCTION, timer_callback);
@@ -41,22 +41,25 @@ Certain features, such as timeouts and retries, require you to call libcurl
 even when there is no activity on the file descriptors.
 
 Your callback function \fBtimer_callback\fP should install a non-repeating
-timer with an interval of \fBtimeout_ms\fP. Each time that timer fires, call
+timer with an interval of \fBtimeout_ms\fP. When time that timer fires, call
 either \fIcurl_multi_socket_action(3)\fP or \fIcurl_multi_perform(3)\fP,
 depending on which interface you use.
 
-A \fBtimeout_ms\fP value of -1 means you should delete your timer.
+A \fBtimeout_ms\fP value of -1 passed to this callback means you should delete
+the timer. All other values are valid expire times in number of milliseconds.
 
-A \fBtimeout_ms\fP value of 0 means you should call
-\fIcurl_multi_socket_action(3)\fP or \fIcurl_multi_perform(3)\fP (once) as soon
-as possible.
-
-\fBtimer_callback\fP will only be called when the \fBtimeout_ms\fP changes.
+The \fBtimer_callback\fP will only be called when the timeout expire time is
+changed.
 
 The \fBuserp\fP pointer is set with \fICURLMOPT_TIMERDATA(3)\fP.
 
 The timer callback should return 0 on success, and -1 on error. This callback
 can be used instead of, or in addition to, \fIcurl_multi_timeout(3)\fP.
+
+\fBWARNING:\fP even if it feels tempting, avoid calling libcurl directly from
+within the callback itself when the \fBtimeout_ms\fP value is zero, since it
+risks triggering an unpleasant recursive behavior that immediately calls
+another call to the callback with a zero timeout...
 .SH DEFAULT
 NULL
 .SH PROTOCOLS
index 1ffffaf..7d97a28 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_ABSTRACT_UNIX_SOCKET 3 "January 09, 2017" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_ABSTRACT_UNIX_SOCKET 3 "January 09, 2017" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_ABSTRACT_UNIX_SOCKET \- set an abstract Unix domain socket
index 3a758e0..a649c4f 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_ACCEPTTIMEOUT_MS 3 "March 06, 2016" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_ACCEPTTIMEOUT_MS 3 "March 06, 2016" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_ACCEPTTIMEOUT_MS \- timeout waiting for FTP server to connect back
index e16b334..e069093 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_ACCEPT_ENCODING 3 "August 27, 2018" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_ACCEPT_ENCODING 3 "August 27, 2018" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_ACCEPT_ENCODING \- enables automatic decompression of HTTP downloads
index a30f3e7..53a1b48 100644 (file)
@@ -5,7 +5,7 @@
 .\" *                            | (__| |_| |  _ <| |___
 .\" *                             \___|\___/|_| \_\_____|
 .\" *
-.\" * Copyright (C) 1998 - 2014, 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 .\" *
 .\" * This software is licensed as described in the file COPYING, which
 .\" * you should have received as part of this distribution. The terms
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_ADDRESS_SCOPE 3 "May 31, 2017" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_ADDRESS_SCOPE 3 "March 07, 2019" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
-CURLOPT_ADDRESS_SCOPE \- set scope for local IPv6 addresses
+CURLOPT_ADDRESS_SCOPE \- set scope id for IPv6 addresses
 .SH SYNOPSIS
 #include <curl/curl.h>
 
 CURLcode curl_easy_setopt(CURL *handle, CURLOPT_ADDRESS_SCOPE, long scope);
 .SH DESCRIPTION
-Pass a long specifying the scope_id value to use when connecting to IPv6
-link-local or site-local addresses.
+Pass a long specifying the scope id value to use when connecting to IPv6 addresses.
 .SH DEFAULT
 0
 .SH PROTOCOLS
@@ -40,12 +39,10 @@ All, when using IPv6
 CURL *curl = curl_easy_init();
 if(curl) {
   CURLcode ret;
+  long my_scope_id;
   curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
-  /* 0x2 link-local
-     0x5 site-local
-     0x8 organization-local
-     0xe global ... */
-  curl_easy_setopt(curl, CURLOPT_ADDRESS_SCOPE, 0xEL);
+  my_scope_id = if_nametoindex("eth0");
+  curl_easy_setopt(curl, CURLOPT_ADDRESS_SCOPE, my_scope_id);
   ret = curl_easy_perform(curl);
   curl_easy_cleanup(curl);
 }
@@ -54,5 +51,6 @@ if(curl) {
 Added in 7.19.0
 .SH RETURN VALUE
 Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+Returns CURLE_BAD_FUNCTION_ARGUMENT if set to a negative value.
 .SH "SEE ALSO"
 .BR CURLOPT_STDERR "(3), " CURLOPT_DEBUGFUNCTION "(3), "
diff --git a/docs/libcurl/opts/CURLOPT_ALTSVC.3 b/docs/libcurl/opts/CURLOPT_ALTSVC.3
new file mode 100644 (file)
index 0000000..cf8a144
--- /dev/null
@@ -0,0 +1,64 @@
+.\" **************************************************************************
+.\" *                                  _   _ ____  _
+.\" *  Project                     ___| | | |  _ \| |
+.\" *                             / __| | | | |_) | |
+.\" *                            | (__| |_| |  _ <| |___
+.\" *                             \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
+.\" * are also available at https://curl.haxx.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH CURLOPT_ALTSVC 3 "August 14, 2019" "libcurl 7.68.0" "curl_easy_setopt options"
+
+.SH NAME
+CURLOPT_ALTSVC \- set alt-svc cache file name
+.SH SYNOPSIS
+.nf
+#include <curl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_ALTSVC, char *filename);
+.fi
+.SH EXPERIMENTAL
+Warning: this feature is early code and is marked as experimental. It can only
+be enabled by explicitly telling configure with \fB--enable-alt-svc\fP. You are
+advised to not ship this in production before the experimental label is
+removed.
+.SH DESCRIPTION
+Pass in a pointer to a \fIfilename\fP to instruct libcurl to use that file as
+the Alt-Svc cache to read existing cache contents from and possibly also write
+it back to a after a transfer, unless \fBCURLALTSVC_READONLYFILE\fP is set in
+\fICURLOPT_ALTSVC_CTRL(3)\fP.
+
+Specify a blank file name ("") to make libcurl not load from a file at all.
+.SH DEFAULT
+NULL. The alt-svc cache is not read nor written to file.
+.SH PROTOCOLS
+HTTPS
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+  curl_easy_setopt(curl, CURLOPT_ALTSVC_CTRL, CURLALTSVC_H1);
+  curl_easy_setopt(curl, CURLOPT_ALTSVC, "altsvc-cache.txt");
+  curl_easy_perform(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.64.1
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR CURLOPT_ALTSVC_CTRL "(3), " CURLOPT_CONNECT_TO "(3), " CURLOPT_RESOLVE "(3), "
+.BR CURLOPT_COOKIEFILE "(3), "
diff --git a/docs/libcurl/opts/CURLOPT_ALTSVC_CTRL.3 b/docs/libcurl/opts/CURLOPT_ALTSVC_CTRL.3
new file mode 100644 (file)
index 0000000..f399ed5
--- /dev/null
@@ -0,0 +1,90 @@
+.\" **************************************************************************
+.\" *                                  _   _ ____  _
+.\" *  Project                     ___| | | |  _ \| |
+.\" *                             / __| | | | |_) | |
+.\" *                            | (__| |_| |  _ <| |___
+.\" *                             \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
+.\" * are also available at https://curl.haxx.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH CURLOPT_ALTSVC_CTRL 3 "August 13, 2019" "libcurl 7.68.0" "curl_easy_setopt options"
+
+.SH NAME
+CURLOPT_ALTSVC_CTRL \- control alt-svc behavior
+.SH SYNOPSIS
+.nf
+#include <curl/curl.h>
+
+#define CURLALTSVC_IMMEDIATELY  (1<<0)
+#define CURLALTSVC_READONLYFILE (1<<2)
+#define CURLALTSVC_H1           (1<<3)
+#define CURLALTSVC_H2           (1<<4)
+#define CURLALTSVC_H3           (1<<5)
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_ALTSVC_CTRL, long bitmask);
+.fi
+.SH EXPERIMENTAL
+Warning: this feature is early code and is marked as experimental. It can only
+be enabled by explicitly telling configure with \fB--enable-alt-svc\fP. You are
+advised to not ship this in production before the experimental label is
+removed.
+.SH DESCRIPTION
+Populate the long \fIbitmask\fP with the correct set of features to instruct
+libcurl how to handle Alt-Svc for the transfers using this handle.
+
+libcurl will only accept Alt-Svc headers over a secure transport, meaning
+HTTPS. It will also only complete a request to an alternative origin if that
+origin is properly hosted over HTTPS. These requirements are there to make
+sure both the source and the destination are legitimate.
+
+Setting any bit will enable the alt-svc engine.
+.IP "CURLALTSVC_IMMEDIATELY"
+If an Alt-Svc: header is received, this instructs libcurl to switch to one of
+those alternatives asap rather than to save it and use for the next
+request. (Not currently supported).
+.IP "CURLALTSVC_READONLYFILE"
+Do not write the alt-svc cache back to the file specified with
+\fICURLOPT_ALTSVC(3)\fP even if it gets updated. By default a file specified
+with that option will be read and written to as deemed necessary.
+.IP "CURLALTSVC_H1"
+Accept alternative services offered over HTTP/1.1.
+.IP "CURLALTSVC_H2"
+Accept alternative services offered over HTTP/2. This will only be used if
+libcurl was also built to actually support HTTP/2, otherwise this bit will be
+ignored.
+.IP "CURLALTSVC_H3"
+Accept alternative services offered over HTTP/3. This will only be used if
+libcurl was also built to actually support HTTP/3, otherwise this bit will be
+ignored.
+.SH DEFAULT
+0. No Alt-Svc treatment.
+.SH PROTOCOLS
+HTTPS
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+  curl_easy_setopt(curl, CURLOPT_ALTSVC_CTRL, CURLALTSVC_H1);
+  curl_easy_setopt(curl, CURLOPT_ALTSVC, "altsvc-cache.txt");
+  curl_easy_perform(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.64.1
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR CURLOPT_ALTSVC "(3), " CURLOPT_CONNECT_TO "(3), " CURLOPT_RESOLVE "(3), "
index e8a47af..75337ee 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_APPEND 3 "March 06, 2016" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_APPEND 3 "March 06, 2016" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_APPEND \- enable appending to the remote file
index e6c90b5..847f46a 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_AUTOREFERER 3 "May 05, 2017" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_AUTOREFERER 3 "May 05, 2017" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_AUTOREFERER \- automatically update the referer header
index db49da1..8ae2864 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_BUFFERSIZE 3 "May 13, 2017" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_BUFFERSIZE 3 "May 13, 2017" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_BUFFERSIZE \- set preferred receive buffer size
index 974aec3..3e62a29 100644 (file)
@@ -5,7 +5,7 @@
 .\" *                            | (__| |_| |  _ <| |___
 .\" *                             \___|\___/|_| \_\_____|
 .\" *
-.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 .\" *
 .\" * This software is licensed as described in the file COPYING, which
 .\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_CAINFO 3 "March 10, 2017" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_CAINFO 3 "June 10, 2019" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_CAINFO \- path to Certificate Authority (CA) bundle
@@ -47,21 +47,20 @@ libnssckbi.so, which contains a more comprehensive set of trust information
 than supported by nss-pem, because libnssckbi.so also includes information
 about distrusted certificates.
 
-(iOS and macOS only) If curl is built against Secure Transport, then this
-option is supported for backward compatibility with other SSL engines, but it
-should not be set. If the option is not set, then curl will use the
-certificates in the system and user Keychain to verify the peer, which is the
-preferred method of verifying the peer's certificate chain.
+(iOS and macOS) When curl uses Secure Transport this option is supported. If
+the option is not set, then curl will use the certificates in the system and
+user Keychain to verify the peer.
 
-(Schannel/WinSSL only) This option is supported for WinSSL in Windows 7 or
-later with libcurl 7.60 or later. This option is supported for backward
-compatibility with other SSL engines; instead it is recommended to use Windows'
-store of root certificates (the default for WinSSL).
+(Schannel) This option is supported for Schannel in Windows 7 or later but we
+recommend not using it until Windows 8 since it works better starting then.
+If the option is not set, then curl will use the certificates in the Windows'
+store of root certificates (the default for Schannel).
 
 The application does not have to keep the string around after setting this
 option.
 .SH DEFAULT
-Built-in system specific
+Built-in system specific. When curl is built with Secure Transport or
+Schannel, this option is not set by default.
 .SH PROTOCOLS
 All TLS based protocols: HTTPS, FTPS, IMAPS, POP3S, SMTPS etc.
 .SH EXAMPLE
@@ -75,8 +74,8 @@ if(curl) {
 }
 .fi
 .SH AVAILABILITY
-For SSL engines that don't support certificate files the CURLOPT_CAINFO option
-is ignored. Refer to https://curl.haxx.se/docs/ssl-compared.html
+For the SSL engines that don't support certificate files the CURLOPT_CAINFO
+option is ignored. Schannel support added in libcurl 7.60.
 .SH RETURN VALUE
 Returns CURLE_OK if the option is supported, CURLE_UNKNOWN_OPTION if not, or
 CURLE_OUT_OF_MEMORY if there was insufficient heap space.
index 8ea70b1..d03e5a4 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_CAPATH 3 "September 10, 2017" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_CAPATH 3 "September 10, 2017" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_CAPATH \- specify directory holding CA certificates
index e800bf5..88e9327 100644 (file)
@@ -5,7 +5,7 @@
 .\" *                            | (__| |_| |  _ <| |___
 .\" *                             \___|\___/|_| \_\_____|
 .\" *
-.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 .\" *
 .\" * This software is licensed as described in the file COPYING, which
 .\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_CERTINFO 3 "May 27, 2017" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_CERTINFO 3 "January 29, 2019" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_CERTINFO \- request SSL certificate information
@@ -71,7 +71,8 @@ if(curl) {
 }
 .fi
 .SH AVAILABILITY
-This option is supported by the OpenSSL, GnuTLS, NSS and GSKit backends.
+This option is supported by the OpenSSL, GnuTLS, Schannel, NSS and GSKit
+backends.
 .SH RETURN VALUE
 Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
 .SH "SEE ALSO"
index fa4cc02..f6a8f8c 100644 (file)
@@ -5,7 +5,7 @@
 .\" *                            | (__| |_| |  _ <| |___
 .\" *                             \___|\___/|_| \_\_____|
 .\" *
-.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 .\" *
 .\" * This software is licensed as described in the file COPYING, which
 .\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_CHUNK_BGN_FUNCTION 3 "May 31, 2017" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_CHUNK_BGN_FUNCTION 3 "May 03, 2019" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_CHUNK_BGN_FUNCTION \- callback before a transfer with FTP wildcardmatch
@@ -28,6 +28,33 @@ CURLOPT_CHUNK_BGN_FUNCTION \- callback before a transfer with FTP wildcardmatch
 .nf
 #include <curl/curl.h>
 
+struct curl_fileinfo {
+  char *filename;
+  curlfiletype filetype;
+  time_t time;   /* always zero! */
+  unsigned int perm;
+  int uid;
+  int gid;
+  curl_off_t size;
+  long int hardlinks;
+
+  struct {
+    /* If some of these fields is not NULL, it is a pointer to b_data. */
+    char *time;
+    char *perm;
+    char *user;
+    char *group;
+    char *target; /* pointer to the target filename of a symlink */
+  } strings;
+
+  unsigned int flags;
+
+  /* used internally */
+  char *b_data;
+  size_t b_size;
+  size_t b_used;
+};
+
 long chunk_bgn_callback(const void *transfer_info, void *ptr,
                         int remains);
 
@@ -71,20 +98,20 @@ static long file_is_coming(struct curl_fileinfo *finfo,
 
   switch(finfo->filetype) {
   case CURLFILETYPE_DIRECTORY:
-    printf(" DIR\n");
+    printf(" DIR\\n");
     break;
   case CURLFILETYPE_FILE:
     printf("FILE ");
     break;
   default:
-    printf("OTHER\n");
+    printf("OTHER\\n");
     break;
   }
 
   if(finfo->filetype == CURLFILETYPE_FILE) {
     /* do not transfer files >= 50B */
     if(finfo->size > 50) {
-      printf("SKIPPED\n");
+      printf("SKIPPED\\n");
       return CURL_CHUNK_BGN_FUNC_SKIP;
     }
 
index d006d3a..18e0bdd 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_CHUNK_DATA 3 "May 31, 2017" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_CHUNK_DATA 3 "November 07, 2018" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_CHUNK_DATA \- custom pointer to the FTP chunk callbacks
@@ -47,20 +47,20 @@ static long file_is_coming(struct curl_fileinfo *finfo,
 
   switch(finfo->filetype) {
   case CURLFILETYPE_DIRECTORY:
-    printf(" DIR\n");
+    printf(" DIR\\n");
     break;
   case CURLFILETYPE_FILE:
     printf("FILE ");
     break;
   default:
-    printf("OTHER\n");
+    printf("OTHER\\n");
     break;
   }
 
   if(finfo->filetype == CURLFILETYPE_FILE) {
     /* do not transfer files >= 50B */
     if(finfo->size > 50) {
-      printf("SKIPPED\n");
+      printf("SKIPPED\\n");
       return CURL_CHUNK_BGN_FUNC_SKIP;
     }
 
index 31bd764..f1fa6fe 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_CHUNK_END_FUNCTION 3 "May 31, 2017" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_CHUNK_END_FUNCTION 3 "May 31, 2017" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_CHUNK_END_FUNCTION \- callback after a transfer with FTP wildcardmatch
index 5e43cf6..7d428d6 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_CLOSESOCKETDATA 3 "May 31, 2017" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_CLOSESOCKETDATA 3 "November 07, 2018" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_CLOSESOCKETDATA \- pointer passed to the socket close callback
@@ -40,7 +40,7 @@ All except file:
 .nf
 static int closesocket(void *clientp, curl_socket_t item)
 {
-  printf("libcurl wants to close %d now\n", (int)item);
+  printf("libcurl wants to close %d now\\n", (int)item);
   return 0;
 }
 
index facb431..63face6 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_CLOSESOCKETFUNCTION 3 "May 31, 2017" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_CLOSESOCKETFUNCTION 3 "November 07, 2018" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_CLOSESOCKETFUNCTION \- callback to socket close replacement function
@@ -51,7 +51,7 @@ All
 .nf
 static int closesocket(void *clientp, curl_socket_t item)
 {
-  printf("libcurl wants to close %d now\n", (int)item);
+  printf("libcurl wants to close %d now\\n", (int)item);
   return 0;
 }
 
index d93b247..47ce959 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_CONNECTTIMEOUT 3 "October 03, 2017" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_CONNECTTIMEOUT 3 "October 03, 2017" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_CONNECTTIMEOUT \- timeout for the connect phase
index 8764662..49fb7c4 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_CONNECTTIMEOUT_MS 3 "September 23, 2018" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_CONNECTTIMEOUT_MS 3 "September 23, 2018" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_CONNECTTIMEOUT_MS \- timeout for the connect phase
index aefe1c3..6905c57 100644 (file)
@@ -5,7 +5,7 @@
 .\" *                            | (__| |_| |  _ <| |___
 .\" *                             \___|\___/|_| \_\_____|
 .\" *
-.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 .\" *
 .\" * This software is licensed as described in the file COPYING, which
 .\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_CONNECT_ONLY 3 "May 31, 2017" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_CONNECT_ONLY 3 "February 18, 2019" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_CONNECT_ONLY \- stop when connected to target server
@@ -38,6 +38,9 @@ useful when used with the \fICURLINFO_ACTIVESOCKET(3)\fP option to
 \fIcurl_easy_getinfo(3)\fP as the library can set up the connection and then
 the application can obtain the most recently used socket for special data
 transfers.
+
+Transfers marked connect only will not reuse any existing connections and
+connections marked connect only will not be allowed to get reused.
 .SH DEFAULT
 0
 .SH PROTOCOLS
index a9de7d5..d99e2b3 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_CONNECT_TO 3 "May 05, 2018" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_CONNECT_TO 3 "May 05, 2018" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_CONNECT_TO \- Connect to a specific host and port instead of the URL's host and port
index 5165c60..2c69ad1 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_CONV_FROM_NETWORK_FUNCTION 3 "May 31, 2017" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_CONV_FROM_NETWORK_FUNCTION 3 "May 31, 2017" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_CONV_FROM_NETWORK_FUNCTION \- convert data from network to host encoding
index bd3505b..c2731ac 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_CONV_FROM_UTF8_FUNCTION 3 "May 31, 2017" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_CONV_FROM_UTF8_FUNCTION 3 "May 31, 2017" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_CONV_FROM_UTF8_FUNCTION \- convert data from UTF8 to host encoding
index 0fd638f..1f83967 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_CONV_TO_NETWORK_FUNCTION 3 "May 31, 2017" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_CONV_TO_NETWORK_FUNCTION 3 "May 31, 2017" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_CONV_TO_NETWORK_FUNCTION \- convert data to network from host encoding
index fc3392c..9a5789c 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_COOKIE 3 "December 21, 2016" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_COOKIE 3 "December 21, 2016" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_COOKIE \- set contents of HTTP Cookie header
index 1d1d7f0..db05c3b 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_COOKIEFILE 3 "March 13, 2018" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_COOKIEFILE 3 "March 13, 2018" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_COOKIEFILE \- file name to read cookies from
index 691ca52..39e6b1d 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_COOKIEJAR 3 "May 05, 2017" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_COOKIEJAR 3 "May 05, 2017" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_COOKIEJAR \- file name to store cookies to
index 18494f9..f08feec 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_COOKIELIST 3 "April 26, 2016" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_COOKIELIST 3 "April 26, 2016" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_COOKIELIST \- add to or manipulate cookies held in memory
index 5e087b6..34e2ea8 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_COOKIESESSION 3 "May 05, 2017" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_COOKIESESSION 3 "May 05, 2017" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_COOKIESESSION \- start a new cookie session
index 0dbf53f..8edf678 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_COPYPOSTFIELDS 3 "February 03, 2016" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_COPYPOSTFIELDS 3 "February 03, 2016" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_COPYPOSTFIELDS \- have libcurl copy data to POST
index 68ac0a5..0be030e 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_CRLF 3 "May 31, 2017" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_CRLF 3 "May 31, 2017" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_CRLF \- enable/disable CRLF conversion
index a74a1a5..3094347 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_CRLFILE 3 "May 31, 2017" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_CRLFILE 3 "May 31, 2017" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_CRLFILE \- specify a Certificate Revocation List file
diff --git a/docs/libcurl/opts/CURLOPT_CURLU.3 b/docs/libcurl/opts/CURLOPT_CURLU.3
new file mode 100644 (file)
index 0000000..9aa6de5
--- /dev/null
@@ -0,0 +1,70 @@
+.\" **************************************************************************
+.\" *                                  _   _ ____  _
+.\" *  Project                     ___| | | |  _ \| |
+.\" *                             / __| | | | |_) | |
+.\" *                            | (__| |_| |  _ <| |___
+.\" *                             \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
+.\" * are also available at https://curl.haxx.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH CURLOPT_CURLU 3 "October 31, 2019" "libcurl 7.68.0" "curl_easy_setopt options"
+
+.SH NAME
+CURLOPT_CURLU \- set URL with CURLU *
+.SH SYNOPSIS
+#include <curl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_CURLU, void *pointer);
+.SH DESCRIPTION
+Pass in a pointer to the \fIURL\fP to work with. The parameter should be a
+CURLU *. Setting \fICURLOPT_CURLU(3)\fP will explicitly override
+\fICURLOPT_URL(3)\fP.
+
+\fICURLOPT_URL(3)\fP or \fICURLOPT_CURLU(3)\fP \fBmust\fP be set before a
+transfer is started.
+
+libcurl will use this handle and its contents read-only and will not change
+its contents. An application can very well update the contents of the URL
+handle after a transfer is done and if the same handle is then used in a
+subsequent request the updated contents will then be used.
+.SH DEFAULT
+The default value of this parameter is NULL.
+.SH PROTOCOLS
+All
+.SH EXAMPLE
+.nf
+CURL *handle = curl_easy_init();
+CURLU *urlp = curl_url();
+int res = 0;
+if(curl) {
+
+  res = curl_url_set(urlp, CURLUPART_URL, "http://example.com", 0);
+
+  curl_easy_setopt(handle, CURLOPT_CURLU, urlp);
+
+  ret = curl_easy_perform(handle);
+
+  curl_url_cleanup(urlp);
+  curl_easy_cleanup(handle);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.63.0.
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR CURLOPT_URL "(3), "
+.BR curl_url "(3), " curl_url_get "(3), " curl_url_set "(3), "
index 48cfa9f..13e30d1 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_CUSTOMREQUEST 3 "April 17, 2018" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_CUSTOMREQUEST 3 "April 17, 2018" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_CUSTOMREQUEST \- custom string for request
index c38d5eb..8816520 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_DEBUGDATA 3 "February 03, 2016" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_DEBUGDATA 3 "February 03, 2016" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_DEBUGDATA \- custom pointer for debug callback
index 4b20dc8..06567d6 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_DEBUGFUNCTION 3 "October 06, 2016" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_DEBUGFUNCTION 3 "October 06, 2016" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_DEBUGFUNCTION \- debug callback
index a6522d2..391a866 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_DEFAULT_PROTOCOL 3 "December 21, 2016" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_DEFAULT_PROTOCOL 3 "December 21, 2016" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_DEFAULT_PROTOCOL \- default protocol to use if the URL is missing a
index 3b76797..67b419f 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_DIRLISTONLY 3 "May 05, 2017" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_DIRLISTONLY 3 "May 05, 2017" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_DIRLISTONLY \- ask for names only in a directory listing
index 9637f98..e93ead4 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_DISALLOW_USERNAME_IN_URL 3 "February 25, 2018" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_DISALLOW_USERNAME_IN_URL 3 "February 25, 2018" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_DISALLOW_USERNAME_IN_URL \- disallow specifying username in the url
index a5a04d9..7f50982 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_DNS_CACHE_TIMEOUT 3 "December 09, 2017" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_DNS_CACHE_TIMEOUT 3 "December 09, 2017" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_DNS_CACHE_TIMEOUT \- set life-time for DNS cache entries
index 6d3d066..e7f0be9 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_DNS_INTERFACE 3 "May 31, 2017" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_DNS_INTERFACE 3 "May 31, 2017" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_DNS_INTERFACE \- set interface to speak DNS over
index c54fb8b..71172dc 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_DNS_LOCAL_IP4 3 "December 10, 2017" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_DNS_LOCAL_IP4 3 "December 10, 2017" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_DNS_LOCAL_IP4 \- IPv4 address to bind DNS resolves to
index 334f845..e34b07b 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_DNS_LOCAL_IP6 3 "May 31, 2017" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_DNS_LOCAL_IP6 3 "May 31, 2017" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_DNS_LOCAL_IP6 \- IPv6 address to bind DNS resolves to
index 2d3df90..67c064f 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_DNS_SERVERS 3 "May 31, 2017" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_DNS_SERVERS 3 "May 31, 2017" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_DNS_SERVERS \- set preferred DNS servers
index 1060b34..d84ed77 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_DNS_SHUFFLE_ADDRESSES 3 "March 17, 2018" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_DNS_SHUFFLE_ADDRESSES 3 "March 17, 2018" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_DNS_SHUFFLE_ADDRESSES \- Shuffle addresses when a hostname returns more than one
index 7874ea2..665ba6b 100644 (file)
@@ -5,7 +5,7 @@
 .\" *                            | (__| |_| |  _ <| |___
 .\" *                             \___|\___/|_| \_\_____|
 .\" *
-.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 .\" *
 .\" * This software is licensed as described in the file COPYING, which
 .\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_DNS_USE_GLOBAL_CACHE 3 "May 31, 2017" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_DNS_USE_GLOBAL_CACHE 3 "March 07, 2019" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_DNS_USE_GLOBAL_CACHE \- enable/disable global DNS cache
@@ -30,6 +30,8 @@ CURLOPT_DNS_USE_GLOBAL_CACHE \- enable/disable global DNS cache
 CURLcode curl_easy_setopt(CURL *handle, CURLOPT_DNS_USE_GLOBAL_CACHE,
                           long enable);
 .SH DESCRIPTION
+Has no function since 7.62.0. Do note use!
+
 Pass a long. If the \fIenable\fP value is 1, it tells curl to use a global DNS
 cache that will survive between easy handle creations and deletions. This is
 not thread-safe and this will use a global variable.
@@ -54,7 +56,7 @@ if(curl) {
 }
 .fi
 .SH AVAILABILITY
-Subject for removal in the future. Do not use!
+Deprecated since 7.62.0. Has no function.
 .SH RETURN VALUE
 Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
 .SH "SEE ALSO"
index ad7f2b6..64675bf 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_DOH_URL 3 "September 06, 2018" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_DOH_URL 3 "September 06, 2018" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_DOH_URL \- provide the DNS-over-HTTPS URL
index 4a5018f..bd4e3e2 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_EGDSOCKET 3 "May 31, 2017" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_EGDSOCKET 3 "May 31, 2017" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_EGDSOCKET \- set EGD socket path
index d7d20d2..adbeb67 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_ERRORBUFFER 3 "March 13, 2018" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_ERRORBUFFER 3 "March 13, 2018" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_ERRORBUFFER \- set error buffer for error messages
index fdbf1a7..f2f455a 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_EXPECT_100_TIMEOUT_MS 3 "April 17, 2018" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_EXPECT_100_TIMEOUT_MS 3 "April 17, 2018" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_EXPECT_100_TIMEOUT_MS \- timeout for Expect: 100-continue response
index 98e3c30..ec7b84d 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_FAILONERROR 3 "April 17, 2018" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_FAILONERROR 3 "April 17, 2018" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_FAILONERROR \- request failure on HTTP response >= 400
index 09e1380..0685b7a 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_FILETIME 3 "April 03, 2017" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_FILETIME 3 "April 03, 2017" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_FILETIME \- get the modification time of the remote resource
index 7b9188c..1fb7ff1 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_FNMATCH_DATA 3 "May 31, 2017" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_FNMATCH_DATA 3 "May 31, 2017" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_FNMATCH_DATA \- custom pointer to fnmatch callback
index a3d207c..d398d07 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_FNMATCH_FUNCTION 3 "May 31, 2017" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_FNMATCH_FUNCTION 3 "May 31, 2017" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_FNMATCH_FUNCTION \- wildcard matching function callback
index 104540c..73043d3 100644 (file)
@@ -5,7 +5,7 @@
 .\" *                            | (__| |_| |  _ <| |___
 .\" *                             \___|\___/|_| \_\_____|
 .\" *
-.\" * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 .\" *
 .\" * This software is licensed as described in the file COPYING, which
 .\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_FOLLOWLOCATION 3 "May 02, 2018" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_FOLLOWLOCATION 3 "October 31, 2019" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_FOLLOWLOCATION \- follow HTTP 3xx redirects
@@ -40,7 +40,8 @@ libcurl will follow.
 
 libcurl limits what protocols it automatically follows to. The accepted
 protocols are set with \fICURLOPT_REDIR_PROTOCOLS(3)\fP. By default libcurl
-will allow all protocols on redirect except those disabled for security
+will allow HTTP, HTTPS, FTP and FTPS on redirect (7.65.2). Older versions of
+libcurl allowed all protocols on redirect except those disabled for security
 reasons: Since 7.19.4 FILE and SCP are disabled, and since 7.40.0 SMB and SMBS
 are also disabled.
 
index 3d5b5c7..25be2d1 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_FORBID_REUSE 3 "May 31, 2017" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_FORBID_REUSE 3 "May 31, 2017" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_FORBID_REUSE \- make connection get closed at once after use
index d661369..4b39344 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_FRESH_CONNECT 3 "May 31, 2017" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_FRESH_CONNECT 3 "May 31, 2017" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_FRESH_CONNECT \- force a new connection to be used
index 2e27d09..90d9284 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_FTPPORT 3 "May 30, 2017" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_FTPPORT 3 "May 30, 2017" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_FTPPORT \- make FTP transfer active
index 30a91b1..991f57a 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_FTPSSLAUTH 3 "May 31, 2017" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_FTPSSLAUTH 3 "May 31, 2017" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_FTPSSLAUTH \- set order in which to attempt TLS vs SSL when using FTP
index 9c1c9f4..f2e64a3 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_FTP_ACCOUNT 3 "May 05, 2017" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_FTP_ACCOUNT 3 "May 05, 2017" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_FTP_ACCOUNT \- set account info for FTP
index 64f94ec..1946887 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_FTP_ALTERNATIVE_TO_USER 3 "May 05, 2017" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_FTP_ALTERNATIVE_TO_USER 3 "May 05, 2017" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_FTP_ALTERNATIVE_TO_USER \- command to use instead of USER with FTP
index e71d0a5..ca9584f 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_FTP_CREATE_MISSING_DIRS 3 "May 05, 2017" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_FTP_CREATE_MISSING_DIRS 3 "May 05, 2017" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_FTP_CREATE_MISSING_DIRS \- create missing dirs for FTP and SFTP
index 47b6df1..fd6ee51 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_FTP_FILEMETHOD 3 "May 05, 2017" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_FTP_FILEMETHOD 3 "May 05, 2017" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_FTP_FILEMETHOD \- select directory traversing method for FTP
index 5b8ad04..60ba657 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_FTP_RESPONSE_TIMEOUT 3 "October 03, 2017" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_FTP_RESPONSE_TIMEOUT 3 "October 03, 2017" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_FTP_RESPONSE_TIMEOUT \- time allowed to wait for FTP response
index 5f8f171..5f234b4 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_FTP_SKIP_PASV_IP 3 "May 05, 2017" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_FTP_SKIP_PASV_IP 3 "May 05, 2017" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_FTP_SKIP_PASV_IP \- ignore the IP address in the PASV response
index 97ad3c5..2951066 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_FTP_SSL_CCC 3 "May 31, 2017" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_FTP_SSL_CCC 3 "May 31, 2017" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_FTP_SSL_CCC \- switch off SSL again with FTP after auth
index 1a7e0ac..74025b2 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_FTP_USE_EPRT 3 "February 03, 2016" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_FTP_USE_EPRT 3 "February 03, 2016" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_FTP_USE_EPRT \- enable/disable use of EPRT with FTP
index f66b393..ba465af 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_FTP_USE_EPSV 3 "May 05, 2017" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_FTP_USE_EPSV 3 "May 05, 2017" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_FTP_USE_EPSV \- enable/disable use of EPSV
index 386b2a8..7d60f01 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_FTP_USE_PRET 3 "May 05, 2017" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_FTP_USE_PRET 3 "May 05, 2017" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_FTP_USE_PRET \- enable the PRET command
index 29bd6bf..b324c1a 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_GSSAPI_DELEGATION 3 "May 31, 2017" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_GSSAPI_DELEGATION 3 "May 31, 2017" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_GSSAPI_DELEGATION \- set allowed GSS-API delegation
index 454ab35..96cc794 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_HAPPY_EYEBALLS_TIMEOUT_MS 3 "February 21, 2018" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_HAPPY_EYEBALLS_TIMEOUT_MS 3 "February 21, 2018" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_HAPPY_EYEBALLS_TIMEOUT_MS \- head start for ipv6 for happy eyeballs
index 98586b2..7a0e2df 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_HAPROXYPROTOCOL 3 "May 18, 2018" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_HAPROXYPROTOCOL 3 "May 18, 2018" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_HAPROXYPROTOCOL \- send HAProxy PROXY protocol v1 header
index e2df3b3..f108082 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_HEADER 3 "October 03, 2018" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_HEADER 3 "October 03, 2018" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_HEADER \- pass headers to the data stream
index e9240ef..84b9008 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_HEADERDATA 3 "May 05, 2017" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_HEADERDATA 3 "May 05, 2017" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_HEADERDATA \- pointer to pass to header callback
index 74bb725..d52f190 100644 (file)
@@ -5,7 +5,7 @@
 .\" *                            | (__| |_| |  _ <| |___
 .\" *                             \___|\___/|_| \_\_____|
 .\" *
-.\" * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 .\" *
 .\" * This software is licensed as described in the file COPYING, which
 .\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_HEADERFUNCTION 3 "August 11, 2018" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_HEADERFUNCTION 3 "December 26, 2019" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_HEADERFUNCTION \- callback that receives header data
@@ -40,9 +40,9 @@ shown above.
 This function gets called by libcurl as soon as it has received header
 data. The header callback will be called once for each header and only
 complete header lines are passed on to the callback. Parsing headers is very
-easy using this. The size of the data pointed to by \fIbuffer\fP is \fIsize\fP
-multiplied with \fInmemb\fP. Do not assume that the header line is zero
-terminated!
+easy using this. \fIbuffer\fP points to the delivered data, and the size of
+that data is \fInitems\fP; \fIsize\fP is always 1. Do not assume that the
+header line is zero terminated!
 
 The pointer named \fIuserdata\fP is the one you set with the
 \fICURLOPT_HEADERDATA(3)\fP option.
@@ -53,7 +53,7 @@ an error to the library. This will cause the transfer to get aborted and the
 libcurl function in progress will return \fICURLE_WRITE_ERROR\fP.
 
 A complete HTTP header that is passed to this function can be up to
-\fICURL_MAX_HTTP_HEADER\fP (100K) bytes.
+\fICURL_MAX_HTTP_HEADER\fP (100K) bytes and includes the final line terminator.
 
 If this option is not set, or if it is set to NULL, but
 \fICURLOPT_HEADERDATA(3)\fP is set to anything but NULL, the function used to
@@ -68,6 +68,9 @@ negotiation. If you need to operate on only the headers from the final
 response, you will need to collect headers in the callback yourself and use
 HTTP status lines, for example, to delimit response boundaries.
 
+For an HTTP transfer, the status line and the blank line preceding the response
+body are both included as headers and passed to this function.
+
 When a server sends a chunked encoded transfer, it may contain a trailer. That
 trailer is identical to an HTTP header and if such a trailer is received it is
 passed to the application using this callback as well. There are several ways
index 3976d06..a88e61f 100644 (file)
@@ -5,7 +5,7 @@
 .\" *                            | (__| |_| |  _ <| |___
 .\" *                             \___|\___/|_| \_\_____|
 .\" *
-.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 .\" *
 .\" * This software is licensed as described in the file COPYING, which
 .\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_HEADEROPT 3 "April 17, 2018" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_HEADEROPT 3 "October 31, 2019" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_HEADEROPT \- set how to send HTTP headers
@@ -58,12 +58,14 @@ if(curl) {
   list = curl_slist_append(list, "Accept:");
   curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
   curl_easy_setopt(curl, CURLOPT_PROXY, "http://localhost:8080");
+  curl_easy_setopt(curl, CURLOPT_HTTPHEADER, list);
 
   /* HTTPS over a proxy makes a separate CONNECT to the proxy, so tell
      libcurl to not send the custom headers to the proxy. Keep them
      separate! */
   curl_easy_setopt(curl, CURLOPT_HEADEROPT, CURLHEADER_SEPARATE);
   ret = curl_easy_perform(curl);
+  curl_slist_free_all(list);
   curl_easy_cleanup(curl);
 }
 .fi
diff --git a/docs/libcurl/opts/CURLOPT_HTTP09_ALLOWED.3 b/docs/libcurl/opts/CURLOPT_HTTP09_ALLOWED.3
new file mode 100644 (file)
index 0000000..5980aa4
--- /dev/null
@@ -0,0 +1,59 @@
+.\" **************************************************************************
+.\" *                                  _   _ ____  _
+.\" *  Project                     ___| | | |  _ \| |
+.\" *                             / __| | | | |_) | |
+.\" *                            | (__| |_| |  _ <| |___
+.\" *                             \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
+.\" * are also available at https://curl.haxx.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH CURLOPT_HTTP09_ALLOWED 3 "August 05, 2019" "libcurl 7.68.0" "curl_easy_setopt options"
+
+.SH NAME
+CURLOPT_HTTP09 \- allow HTTP/0.9 response
+.SH SYNOPSIS
+#include <curl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_HTTP09_ALLOWED, long allowed);
+.SH DESCRIPTION
+Pass the long argument \fIallowed\fP set to 1L to allow HTTP/0.9 responses.
+
+A HTTP/0.9 response is a server response entirely without headers and only a
+body. You can connect to lots of random TCP services and still get a response
+that curl might consider to be HTTP/0.9!
+.SH DEFAULT
+curl allowed HTTP/0.9 responses by default before 7.66.0
+
+Since 7.66.0, libcurl requires this option set to 1L to allow HTTP/0.9
+responses.
+.SH PROTOCOLS
+HTTP
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+  CURLcode ret;
+  curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
+  curl_easy_setopt(curl, CURLOPT_HTTP09_ALLOWED, 1L);
+  ret = curl_easy_perform(curl);
+}
+.fi
+.SH AVAILABILITY
+Option added in 7.64.0, present along with HTTP.
+.SH RETURN VALUE
+Returns CURLE_OK if HTTP is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR CURLOPT_SSLVERSION "(3), " CURLOPT_HTTP_VERSION "(3), "
index deaa102..b08422f 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_HTTP200ALIASES 3 "May 31, 2017" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_HTTP200ALIASES 3 "May 31, 2017" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_HTTP200ALIASES \- specify alternative matches for HTTP 200 OK
index ad70f08..7921e50 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_HTTPAUTH 3 "June 15, 2018" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_HTTPAUTH 3 "June 15, 2018" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_HTTPAUTH \- set HTTP server authentication methods to try
index c24394c..28ce8e6 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_HTTPGET 3 "May 21, 2018" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_HTTPGET 3 "May 21, 2018" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_HTTPGET \- ask for an HTTP GET request
index 0b24fe0..cf22711 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_HTTPHEADER 3 "January 23, 2018" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_HTTPHEADER 3 "December 30, 2018" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_HTTPHEADER \- set custom HTTP headers
@@ -88,6 +88,10 @@ those servers will get all the contents of your custom headers too.
 Starting in 7.58.0, libcurl will specifically prevent "Authorization:" headers
 from being sent to other hosts than the first used one, unless specifically
 permitted with the \fICURLOPT_UNRESTRICTED_AUTH(3)\fP option.
+
+Starting in 7.64.0, libcurl will specifically prevent "Cookie:" headers
+from being sent to other hosts than the first used one, unless specifically
+permitted with the \fICURLOPT_UNRESTRICTED_AUTH(3)\fP option.
 .SH DEFAULT
 NULL
 .SH PROTOCOLS
index e98dd60..d9e078a 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_HTTPPOST 3 "September 02, 2017" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_HTTPPOST 3 "September 02, 2017" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_HTTPPOST \- specify the multipart formpost content
index ad1b6e4..704baf1 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_HTTPPROXYTUNNEL 3 "April 17, 2018" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_HTTPPROXYTUNNEL 3 "April 17, 2018" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_HTTPPROXYTUNNEL \- tunnel through HTTP proxy
index 3fda352..5490e4b 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_HTTP_CONTENT_DECODING 3 "May 31, 2017" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_HTTP_CONTENT_DECODING 3 "May 31, 2017" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_HTTP_CONTENT_DECODING \- enable/disable HTTP content decoding
index 249eb96..38bb5fb 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_HTTP_TRANSFER_DECODING 3 "May 31, 2017" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_HTTP_TRANSFER_DECODING 3 "May 31, 2017" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_HTTP_TRANSFER_DECODING \- enable/disable HTTP transfer decoding
index a053567..eee1821 100644 (file)
@@ -5,7 +5,7 @@
 .\" *                            | (__| |_| |  _ <| |___
 .\" *                             \___|\___/|_| \_\_____|
 .\" *
-.\" * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 .\" *
 .\" * This software is licensed as described in the file COPYING, which
 .\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_HTTP_VERSION 3 "September 05, 2018" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_HTTP_VERSION 3 "September 14, 2019" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_HTTP_VERSION \- specify HTTP protocol version to use
@@ -30,9 +30,7 @@ CURLOPT_HTTP_VERSION \- specify HTTP protocol version to use
 CURLcode curl_easy_setopt(CURL *handle, CURLOPT_HTTP_VERSION, long version);
 .SH DESCRIPTION
 Pass \fIversion\fP a long, set to one of the values described below. They ask
-libcurl to use the specific HTTP versions. This is not sensible to do unless
-you have a good reason. You have to set this option if you want to use
-libcurl's HTTP/2 support.
+libcurl to use the specific HTTP versions.
 
 Note that the HTTP version is just a request. libcurl will still prioritize to
 re-use an existing connection so it might then re-use a connection using a
@@ -60,6 +58,14 @@ Issue non-TLS HTTP requests using HTTP/2 without HTTP/1.1 Upgrade. It requires
 prior knowledge that the server supports HTTP/2 straight away. HTTPS requests
 will still do HTTP/2 the standard way with negotiated protocol version in the
 TLS handshake. (Added in 7.49.0)
+.IP CURL_HTTP_VERSION_3
+(Added in 7.66.0) Setting this value will make libcurl attempt to use HTTP/3
+directly to server given in the URL. Note that this cannot gracefully
+downgrade to earlier HTTP version if the server doesn't support HTTP/3.
+
+For more reliably upgrading to HTTP/3, set the preferred version to something
+lower and let the server announce its HTTP/3 support via Alt-Svc:. See
+\fICURLOPT_ALTSVC(3)\fP.
 .SH DEFAULT
 Since curl 7.62.0: CURL_HTTP_VERSION_2TLS
 
@@ -85,3 +91,4 @@ Along with HTTP
 Returns CURLE_OK if HTTP is supported, and CURLE_UNKNOWN_OPTION if not.
 .SH "SEE ALSO"
 .BR CURLOPT_SSLVERSION "(3), " CURLOPT_HTTP200ALIASES "(3), "
+.BR CURLOPT_HTTP09_ALLOWED "(3), " CURLOPT_ALTSVC "(3) "
index 30bf50a..0ccc348 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_IGNORE_CONTENT_LENGTH 3 "February 03, 2016" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_IGNORE_CONTENT_LENGTH 3 "February 03, 2016" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_IGNORE_CONTENT_LENGTH \- ignore content length
index f2b6131..cc29ba9 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_INFILESIZE 3 "February 03, 2016" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_INFILESIZE 3 "February 03, 2016" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_INFILESIZE \- set size of the input file to send off
index 27739a6..94e0022 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_INFILESIZE_LARGE 3 "September 23, 2018" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_INFILESIZE_LARGE 3 "September 23, 2018" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_INFILESIZE_LARGE \- set size of the input file to send off
index 5a826c5..f3bb986 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_INTERFACE 3 "June 18, 2018" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_INTERFACE 3 "June 18, 2018" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_INTERFACE \- source interface for outgoing traffic
index 0479fe8..3041338 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_INTERLEAVEDATA 3 "September 15, 2017" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_INTERLEAVEDATA 3 "September 15, 2017" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_INTERLEAVEDATA \- custom pointer passed to RTSP interleave callback
index 0b4efec..3177d3a 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_INTERLEAVEFUNCTION 3 "August 11, 2018" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_INTERLEAVEFUNCTION 3 "August 11, 2018" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_INTERLEAVEFUNCTION \- callback function for RTSP interleaved data
index b8ca6ed..c00a6ee 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_IOCTLDATA 3 "May 31, 2017" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_IOCTLDATA 3 "May 31, 2017" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_IOCTLDATA \- custom pointer passed to I/O callback
index 22f1f7b..1dc7a3f 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_IOCTLFUNCTION 3 "April 17, 2018" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_IOCTLFUNCTION 3 "April 17, 2018" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_IOCTLFUNCTION \- callback for I/O operations
index 8e3c801..4fb1ef6 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_IPRESOLVE 3 "May 05, 2017" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_IPRESOLVE 3 "May 05, 2017" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_IPRESOLVE \- specify which IP protocol version to use
index 1e27366..0833e06 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_ISSUERCERT 3 "May 31, 2017" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_ISSUERCERT 3 "May 31, 2017" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_ISSUERCERT \- issuer SSL certificate filename
index 5d686e5..1a6e7d7 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_KEEP_SENDING_ON_ERROR 3 "May 31, 2017" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_KEEP_SENDING_ON_ERROR 3 "May 31, 2017" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_KEEP_SENDING_ON_ERROR \- keep sending on early HTTP response >= 300
index 107c43c..eeffc51 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_KEYPASSWD 3 "May 31, 2017" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_KEYPASSWD 3 "May 31, 2017" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_KEYPASSWD \- set passphrase to private key
index 10b900a..24019bc 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_KRBLEVEL 3 "May 31, 2017" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_KRBLEVEL 3 "May 31, 2017" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_KRBLEVEL \- set FTP kerberos security level
index cdd75d4..83591a5 100644 (file)
@@ -5,7 +5,7 @@
 .\" *                            | (__| |_| |  _ <| |___
 .\" *                             \___|\___/|_| \_\_____|
 .\" *
-.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 .\" *
 .\" * This software is licensed as described in the file COPYING, which
 .\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_LOCALPORT 3 "May 31, 2017" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_LOCALPORT 3 "October 31, 2019" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_LOCALPORT \- set local port number to use for socket
@@ -42,7 +42,7 @@ All
 CURL *curl = curl_easy_init();
 if(curl) {
   curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/foo.bin");
-  curl_easy_setopt(curl, CURLOPT_LOCALPORT, 8080L);
+  curl_easy_setopt(curl, CURLOPT_LOCALPORT, 49152L);
   /* and try 20 more ports following that */
   curl_easy_setopt(curl, CURLOPT_LOCALPORTRANGE, 20L);
   ret = curl_easy_perform(curl);
index 2886ae0..62fe809 100644 (file)
@@ -5,7 +5,7 @@
 .\" *                            | (__| |_| |  _ <| |___
 .\" *                             \___|\___/|_| \_\_____|
 .\" *
-.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 .\" *
 .\" * This software is licensed as described in the file COPYING, which
 .\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_LOCALPORTRANGE 3 "May 31, 2017" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_LOCALPORTRANGE 3 "October 31, 2019" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_LOCALPORTRANGE \- number of additional local ports to try
@@ -46,7 +46,7 @@ All
 CURL *curl = curl_easy_init();
 if(curl) {
   curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/foo.bin");
-  curl_easy_setopt(curl, CURLOPT_LOCALPORT, 8080L);
+  curl_easy_setopt(curl, CURLOPT_LOCALPORT, 49152L);
   /* and try 20 more ports following that */
   curl_easy_setopt(curl, CURLOPT_LOCALPORTRANGE, 20L);
   ret = curl_easy_perform(curl);
index 51c5286..e2f0610 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_LOGIN_OPTIONS 3 "May 31, 2017" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_LOGIN_OPTIONS 3 "May 31, 2017" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_LOGIN_OPTIONS \- set login options
index 528243d..f3710f3 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_LOW_SPEED_LIMIT 3 "May 06, 2017" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_LOW_SPEED_LIMIT 3 "May 06, 2017" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_LOW_SPEED_LIMIT \- set low speed limit in bytes per second
index 20ed11b..23f594a 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_LOW_SPEED_TIME 3 "May 06, 2017" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_LOW_SPEED_TIME 3 "May 06, 2017" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_LOW_SPEED_TIME \- set low speed limit time period
index c54d754..cea99da 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_MAIL_AUTH 3 "May 31, 2017" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_MAIL_AUTH 3 "May 31, 2017" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_MAIL_AUTH \- SMTP authentication address
index 9c61505..42ed27a 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_MAIL_FROM 3 "May 31, 2017" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_MAIL_FROM 3 "May 31, 2017" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_MAIL_FROM \- SMTP sender address
index e07110d..a1ad5b9 100644 (file)
@@ -5,7 +5,7 @@
 .\" *                            | (__| |_| |  _ <| |___
 .\" *                             \___|\___/|_| \_\_____|
 .\" *
-.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 .\" *
 .\" * This software is licensed as described in the file COPYING, which
 .\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_MAIL_RCPT 3 "May 31, 2017" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_MAIL_RCPT 3 "July 16, 2019" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_MAIL_RCPT \- list of SMTP mail recipients
@@ -32,9 +32,10 @@ CURLcode curl_easy_setopt(CURL *handle, CURLOPT_MAIL_RCPT,
                           struct curl_slist *rcpts);
 .SH DESCRIPTION
 Pass a pointer to a linked list of recipients to pass to the server in your
-SMTP mail request. The linked list should be a fully valid list of \fBstruct
-curl_slist\fP structs properly filled in. Use \fIcurl_slist_append(3)\fP to
-create the list and \fIcurl_slist_free_all(3)\fP to clean up an entire list.
+SMTP mail request. The linked list should be a fully valid list of
+\fBstruct curl_slist\fP structs properly filled in. Use
+\fIcurl_slist_append(3)\fP to create the list and \fIcurl_slist_free_all(3)\fP
+to clean up an entire list.
 
 When performing a mail transfer, each recipient should be specified within a
 pair of angled brackets (<>), however, should you not use an angled bracket as
diff --git a/docs/libcurl/opts/CURLOPT_MAXAGE_CONN.3 b/docs/libcurl/opts/CURLOPT_MAXAGE_CONN.3
new file mode 100644 (file)
index 0000000..703298c
--- /dev/null
@@ -0,0 +1,66 @@
+.\" **************************************************************************
+.\" *                                  _   _ ____  _
+.\" *  Project                     ___| | | |  _ \| |
+.\" *                             / __| | | | |_) | |
+.\" *                            | (__| |_| |  _ <| |___
+.\" *                             \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
+.\" * are also available at https://curl.haxx.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH CURLOPT_MAXAGE_CONN 3 "April 14, 2019" "libcurl 7.68.0" "curl_easy_setopt options"
+
+.SH NAME
+CURLOPT_MAXAGE_CONN \- max idle time allowed for reusing a connection
+.SH SYNOPSIS
+#include <curl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_MAXAGE_CONN, long maxage);
+.SH DESCRIPTION
+Pass a long as parameter containing \fImaxage\fP - the maximum time in seconds
+that you allow an existing connection to have to be considered for reuse for
+this request.
+
+The "connection cache" that holds previously used connections. When a new
+request is to be done, it will consider any connection that matches for
+reuse. The \fICURLOPT_MAXAGE_CONN(3)\fP limit prevents libcurl from trying
+very old connections for reuse, since old connections have a high risk of not
+working and thus trying them is a performance loss and sometimes service loss
+due to the difficulties to figure out the situation. If a connection is found
+in the cache that is older than this set \fImaxage\fP, it will instead be
+closed.
+.SH DEFAULT
+Default maxage is 118 seconds.
+.SH PROTOCOLS
+All
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+  curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+
+  /* only allow 30 seconds idle time */
+  curl_easy_setopt(curl, CURLOPT_MAXAGE_CONN, 30L);
+
+  curl_easy_perform(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in libcurl 7.65.0
+.SH RETURN VALUE
+Returns CURLE_OK.
+.SH "SEE ALSO"
+.BR CURLOPT_TIMEOUT "(3), " CURLOPT_FORBID_REUSE "(3), "
+.BR CURLOPT_FRESH_CONNECT "(3), "
index abb8669..5bfa223 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_MAXCONNECTS 3 "May 30, 2017" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_MAXCONNECTS 3 "May 30, 2017" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_MAXCONNECTS \- maximum connection cache size
index 1af9e54..5306df2 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_MAXFILESIZE 3 "May 30, 2017" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_MAXFILESIZE 3 "May 30, 2017" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_MAXFILESIZE \- maximum file size allowed to download
index f5e4c29..7e7a363 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_MAXFILESIZE_LARGE 3 "May 30, 2017" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_MAXFILESIZE_LARGE 3 "May 30, 2017" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_MAXFILESIZE_LARGE \- maximum file size allowed to download
index 7b54508..0e7e912 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_MAXREDIRS 3 "February 03, 2016" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_MAXREDIRS 3 "February 03, 2016" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_MAXREDIRS \- maximum number of redirects allowed
index 1b89ead..8c0d5c4 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_MAX_RECV_SPEED_LARGE 3 "May 30, 2017" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_MAX_RECV_SPEED_LARGE 3 "May 30, 2017" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_MAX_RECV_SPEED_LARGE \- rate limit data download speed
index 87e4f66..664bcf3 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_MAX_SEND_SPEED_LARGE 3 "May 30, 2017" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_MAX_SEND_SPEED_LARGE 3 "May 30, 2017" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_MAX_SEND_SPEED_LARGE \- rate limit data upload speed
index 363e2e6..a7ad3df 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_MIMEPOST 3 "September 04, 2017" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_MIMEPOST 3 "September 04, 2017" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_MIMEPOST \- set post/send data from mime structure
index 516a4ad..71dd0b3 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_NETRC 3 "May 02, 2018" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_NETRC 3 "November 03, 2018" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_NETRC \- request that .netrc is used
@@ -48,20 +48,21 @@ standard Unix ftp client does). It should only be readable by user.
 \fIlevel\fP should be set to one of the values described below.
 
 .IP CURL_NETRC_OPTIONAL
-The use of your \fI~/.netrc\fP file is optional, and information in the URL is
-to be preferred.  The file will be scanned for the host and user name (to
-find the password only) or for the host only, to find the first user name and
-password after that \fImachine\fP, which ever information is not specified in
-the URL.
+The use of the \fI~/.netrc\fP file is optional, and information in the URL is
+to be preferred.  The file will be scanned for the host and user name (to find
+the password only) or for the host only, to find the first user name and
+password after that \fImachine\fP, which ever information is not specified.
 
 Undefined values of the option will have this effect.
 .IP CURL_NETRC_IGNORED
-The library will ignore the file and use only the information in the URL.
+The library will ignore the \fI~/.netrc\fP file.
 
 This is the default.
 .IP CURL_NETRC_REQUIRED
-This value tells the library that use of the file is required, to ignore the
-information in the URL, and to search the file for the host only.
+The use of the \fI~/.netrc\fP file is required, and information in the URL is
+to be ignored.  The file will be scanned for the host and user name (to find
+the password only) or for the host only, to find the first user name and
+password after that \fImachine\fP, which ever information is not specified.
 .SH DEFAULT
 CURL_NETRC_IGNORED
 .SH PROTOCOLS
index 7387f50..50f2573 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_NETRC_FILE 3 "May 31, 2017" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_NETRC_FILE 3 "May 31, 2017" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_NETRC_FILE \- file name to read .netrc info from
index 8293661..81b4e7e 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_NEW_DIRECTORY_PERMS 3 "May 31, 2017" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_NEW_DIRECTORY_PERMS 3 "May 31, 2017" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_NEW_DIRECTORY_PERMS \- permissions for remotely created directories
index bdbcae0..9817a28 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_NEW_FILE_PERMS 3 "May 31, 2017" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_NEW_FILE_PERMS 3 "May 31, 2017" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_NEW_FILE_PERMS \- permissions for remotely created files
index 8a822a6..6ee6bc6 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_NOBODY 3 "June 21, 2017" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_NOBODY 3 "June 21, 2017" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_NOBODY \- do the download request without getting the body
index 92b6b54..441567f 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_NOPROGRESS 3 "October 09, 2017" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_NOPROGRESS 3 "October 09, 2017" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_NOPROGRESS \- switch off the progress meter
index 8fa692f..06d5613 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_NOPROXY 3 "August 24, 2018" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_NOPROXY 3 "August 24, 2018" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_NOPROXY \- disable proxy use for specific hosts
index 6b58037..f7292b3 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_NOSIGNAL 3 "February 03, 2016" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_NOSIGNAL 3 "February 03, 2016" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_NOSIGNAL \- skip all signal handling
index 6e75a3d..6d27f5b 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_OPENSOCKETDATA 3 "May 15, 2017" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_OPENSOCKETDATA 3 "May 15, 2017" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_OPENSOCKETDATA \- custom pointer passed to open socket callback
index 2405f98..93c9a9c 100644 (file)
@@ -5,7 +5,7 @@
 .\" *                            | (__| |_| |  _ <| |___
 .\" *                             \___|\___/|_| \_\_____|
 .\" *
-.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 .\" *
 .\" * This software is licensed as described in the file COPYING, which
 .\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_OPENSOCKETFUNCTION 3 "May 15, 2017" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_OPENSOCKETFUNCTION 3 "December 03, 2019" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_OPENSOCKETFUNCTION \- set callback for opening sockets
@@ -30,8 +30,6 @@ CURLOPT_OPENSOCKETFUNCTION \- set callback for opening sockets
 
 typedef enum  {
   CURLSOCKTYPE_IPCXN,  /* socket created for a specific IP connection */
-  CURLSOCKTYPE_ACCEPT, /* socket created by accept() call */
-  CURLSOCKTYPE_LAST    /* never use */
 } curlsocktype;
 
 struct curl_sockaddr {
@@ -53,10 +51,9 @@ shown above.
 
 This callback function gets called by libcurl instead of the \fIsocket(2)\fP
 call. The callback's \fIpurpose\fP argument identifies the exact purpose for
-this particular socket: \fICURLSOCKTYPE_IPCXN\fP is for IP based connections
-and \fICURLSOCKTYPE_ACCEPT\fP is for sockets created after accept() - such as
-when doing active FTP. Future versions of libcurl may support more
-purposes.
+this particular socket. \fICURLSOCKTYPE_IPCXN\fP is for IP based connections
+and is the only purpose currently used in libcurl. Future versions of libcurl
+may support more purposes.
 
 The \fIclientp\fP pointer contains whatever user-defined value set using the
 \fICURLOPT_OPENSOCKETDATA(3)\fP function.
index afe2193..327f435 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_PASSWORD 3 "September 23, 2018" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_PASSWORD 3 "September 23, 2018" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_PASSWORD \- password to use in authentication
index 2d4c5a5..7dafbf4 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_PATH_AS_IS 3 "September 23, 2018" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_PATH_AS_IS 3 "September 23, 2018" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_PATH_AS_IS \- do not handle dot dot sequences
index be1caea..bacdc0e 100644 (file)
@@ -5,7 +5,7 @@
 .\" *                            | (__| |_| |  _ <| |___
 .\" *                             \___|\___/|_| \_\_____|
 .\" *
-.\" * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 .\" *
 .\" * This software is licensed as described in the file COPYING, which
 .\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_PINNEDPUBLICKEY 3 "January 25, 2018" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_PINNEDPUBLICKEY 3 "June 02, 2019" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_PINNEDPUBLICKEY \- set pinned public key
@@ -100,27 +100,23 @@ PEM/DER support:
 
   7.39.0-7.48.0,7.58.1+: GSKit
 
-  7.43.0: NSS and wolfSSL/CyaSSL
+  7.43.0: NSS and wolfSSL
 
   7.47.0: mbedtls
 
-  7.49.0: PolarSSL
+  7.54.1: SecureTransport on macOS 10.7+/iOS 10+
 
-  7.54.1: SecureTransport/DarwinSSL on macOS 10.7+/iOS 10+
-
-  7.58.1: SChannel/WinSSL
+  7.58.1: SChannel
 
 sha256 support:
 
-  7.44.0: OpenSSL, GnuTLS, NSS and wolfSSL/CyaSSL
+  7.44.0: OpenSSL, GnuTLS, NSS and wolfSSL
 
   7.47.0: mbedtls
 
-  7.49.0: PolarSSL
-
-  7.54.1: SecureTransport/DarwinSSL on macOS 10.7+/iOS 10+
+  7.54.1: SecureTransport on macOS 10.7+/iOS 10+
 
-  7.58.1: SChannel/WinSSL Windows XP SP3+
+  7.58.1: SChannel Windows XP SP3+
 
 Other SSL backends not supported.
 .SH RETURN VALUE
index bc1685a..3fee87b 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_PIPEWAIT 3 "May 01, 2016" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_PIPEWAIT 3 "May 01, 2016" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_PIPEWAIT \- wait for pipelining/multiplexing
index 1f5a657..728353a 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_PORT 3 "May 31, 2017" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_PORT 3 "May 31, 2017" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_PORT \- set remote port number to work with
index 6161b7b..3ab464e 100644 (file)
@@ -5,7 +5,7 @@
 .\" *                            | (__| |_| |  _ <| |___
 .\" *                             \___|\___/|_| \_\_____|
 .\" *
-.\" * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 .\" *
 .\" * This software is licensed as described in the file COPYING, which
 .\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_POST 3 "May 21, 2018" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_POST 3 "July 22, 2019" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_POST \- request an HTTP POST
@@ -56,7 +56,8 @@ If you use POST to an HTTP 1.1 server, you can send data without knowing the
 size before starting the POST if you use chunked encoding. You enable this by
 adding a header like "Transfer-Encoding: chunked" with
 \fICURLOPT_HTTPHEADER(3)\fP. With HTTP 1.0 or without chunked transfer, you
-must specify the size in the request.
+must specify the size in the request. (Since 7.66.0, libcurl will
+automatically use chunked encoding for POSTs if the size is unknown.)
 
 When setting \fICURLOPT_POST(3)\fP to 1, libcurl will automatically set
 \fICURLOPT_NOBODY(3)\fP and \fICURLOPT_HTTPGET(3)\fP to 0.
index 67d9094..b3e4a66 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_POSTFIELDS 3 "May 21, 2018" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_POSTFIELDS 3 "May 21, 2018" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_POSTFIELDS \- specify data to POST to server
index 10d6bb8..efafd26 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_POSTFIELDSIZE 3 "February 03, 2016" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_POSTFIELDSIZE 3 "February 03, 2016" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_POSTFIELDSIZE \- size of POST data pointed to
index 9bf7ef2..f18ddd2 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_POSTFIELDSIZE_LARGE 3 "February 03, 2016" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_POSTFIELDSIZE_LARGE 3 "February 03, 2016" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_POSTFIELDSIZE_LARGE \- size of POST data pointed to
index d5ab60f..b7c94c6 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_POSTQUOTE 3 "May 05, 2017" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_POSTQUOTE 3 "December 18, 2019" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_POSTQUOTE \- (S)FTP commands to run after the transfer
@@ -41,16 +41,16 @@ NULL
 SFTP and FTP
 .SH EXAMPLE
 .nf
-struct curl_slist *h = NULL;
-h = curl_slist_append(h, "RNFR source-name");
-h = curl_slist_append(h, "RNTO new-name");
+struct curl_slist *cmdlist = NULL;
+cmdlist = curl_slist_append(cmdlist, "RNFR source-name");
+cmdlist = curl_slist_append(cmdlist, "RNTO new-name");
 
 curl = curl_easy_init();
 if(curl) {
   curl_easy_setopt(curl, CURLOPT_URL, "ftp://example.com/foo.bin");
 
   /* pass in the FTP commands to run after the transfer */
-  curl_easy_setopt(curl, CURLOPT_POSTQUOTE, headerlist);
+  curl_easy_setopt(curl, CURLOPT_POSTQUOTE, cmdlist);
 
   ret = curl_easy_perform(curl);
 
index 19117c8..23931da 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_POSTREDIR 3 "April 17, 2018" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_POSTREDIR 3 "April 17, 2018" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_POSTREDIR \- how to act on an HTTP POST redirect
index 37cea3a..98546cb 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_PREQUOTE 3 "June 18, 2017" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_PREQUOTE 3 "December 18, 2019" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_PREQUOTE \- commands to run before an FTP transfer
@@ -44,15 +44,15 @@ NULL
 FTP
 .SH EXAMPLE
 .nf
-struct curl_slist *h = NULL;
-h = curl_slist_append(h, "SYST");
+struct curl_slist *cmdlist = NULL;
+cmdlist = curl_slist_append(cmdlist, "SYST");
 
 curl = curl_easy_init();
 if(curl) {
   curl_easy_setopt(curl, CURLOPT_URL, "ftp://example.com/foo.bin");
 
   /* pass in the FTP commands to run */
-  curl_easy_setopt(curl, CURLOPT_PREQUOTE, headerlist);
+  curl_easy_setopt(curl, CURLOPT_PREQUOTE, cmdlist);
 
   ret = curl_easy_perform(curl);
 
index db08464..173a0c0 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_PRE_PROXY 3 "September 23, 2018" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_PRE_PROXY 3 "September 23, 2018" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_PRE_PROXY \- set pre-proxy to use
index a919dc3..888aee3 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_PRIVATE 3 "December 08, 2017" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_PRIVATE 3 "December 08, 2017" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_PRIVATE \- store a private pointer
index 82f6757..33ccd16 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_PROGRESSDATA 3 "February 03, 2016" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_PROGRESSDATA 3 "February 03, 2016" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_PROGRESSDATA \- custom pointer passed to the progress callback
index fc73d7d..af18a19 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_PROGRESSFUNCTION 3 "February 03, 2016" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_PROGRESSFUNCTION 3 "November 26, 2019" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_PROGRESSFUNCTION \- callback to progress meter function
@@ -61,8 +61,11 @@ Unknown/unused argument values passed to the callback will be set to zero
 the callback will be called one or more times first, before it knows the data
 sizes so a program must be made to handle that.
 
-Returning a non-zero value from this callback will cause libcurl to abort the
-transfer and return \fICURLE_ABORTED_BY_CALLBACK\fP.
+If your callback function returns CURL_PROGRESSFUNC_CONTINUE it will cause
+libcurl to continue executing the default progress function.
+
+Returning any other non-zero value from this callback will cause libcurl to
+abort the transfer and return \fICURLE_ABORTED_BY_CALLBACK\fP.
 
 If you transfer data with the multi interface, this function will not be
 called during periods of idleness unless you call the appropriate libcurl
index df55981..96cfa86 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_PROTOCOLS 3 "February 03, 2016" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_PROTOCOLS 3 "February 03, 2016" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_PROTOCOLS \- set allowed protocols
index dda6acc..bd650e4 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_PROXY 3 "August 24, 2018" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_PROXY 3 "August 24, 2018" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_PROXY \- set proxy to use
index 5660ea5..29be2e4 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_PROXYAUTH 3 "May 30, 2017" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_PROXYAUTH 3 "May 30, 2017" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_PROXYAUTH \- set HTTP proxy authentication methods to try
index 18f2b35..f987d40 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_PROXYHEADER 3 "May 30, 2017" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_PROXYHEADER 3 "May 30, 2017" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_PROXYHEADER \- custom HTTP headers to pass to proxy
index d6335ba..072e19d 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_PROXYPASSWORD 3 "May 30, 2017" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_PROXYPASSWORD 3 "May 30, 2017" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_PROXYPASSWORD \- password to use with proxy authentication
index 4a28d9d..e01811a 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_PROXYPORT 3 "May 31, 2017" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_PROXYPORT 3 "May 31, 2017" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_PROXYPORT \- port number the proxy listens on
index 193179d..15e3f83 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_PROXYTYPE 3 "May 30, 2017" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_PROXYTYPE 3 "May 30, 2017" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_PROXYTYPE \- proxy protocol type
index ed41c55..cd3f2c8 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_PROXYUSERNAME 3 "May 30, 2017" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_PROXYUSERNAME 3 "May 30, 2017" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_PROXYUSERNAME \- user name to use for proxy authentication
index 1ac3cf3..e5b74b1 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_PROXYUSERPWD 3 "May 30, 2017" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_PROXYUSERPWD 3 "May 30, 2017" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_PROXYUSERPWD \- user name and password to use for proxy authentication
index 66dd195..8f4b813 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_PROXY_CAINFO 3 "April 17, 2018" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_PROXY_CAINFO 3 "April 17, 2018" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_PROXY_CAINFO \- path to proxy Certificate Authority (CA) bundle
index 701f7a6..c889ed2 100644 (file)
@@ -5,7 +5,7 @@
 .\" *                            | (__| |_| |  _ <| |___
 .\" *                             \___|\___/|_| \_\_____|
 .\" *
-.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 .\" *
 .\" * This software is licensed as described in the file COPYING, which
 .\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_PROXY_CAPATH 3 "April 17, 2018" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_PROXY_CAPATH 3 "May 15, 2019" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_PROXY_CAPATH \- specify directory holding proxy CA certificates
@@ -56,9 +56,8 @@ if(curl) {
 .SH AVAILABILITY
 Added in 7.52.0
 
-This option is supported by the OpenSSL, GnuTLS, PolarSSL and mbedTLS
-(since 7.56.0) backends. The NSS backend provides the option only for
-backward compatibility.
+This option is supported by the OpenSSL, GnuTLS, and mbedTLS (since 7.56.0)
+backends. The NSS backend provides the option only for backward compatibility.
 .SH RETURN VALUE
 CURLE_OK if supported; or an error such as:
 
index e312843..8dc8dad 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_PROXY_CRLFILE 3 "April 17, 2018" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_PROXY_CRLFILE 3 "April 17, 2018" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_PROXY_CRLFILE \- specify a proxy Certificate Revocation List file
index b3fe8d7..3bd03d0 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_PROXY_KEYPASSWD 3 "April 17, 2018" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_PROXY_KEYPASSWD 3 "April 17, 2018" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_PROXY_KEYPASSWD \- set passphrase to proxy private key
index 440894a..604b228 100644 (file)
@@ -5,7 +5,7 @@
 .\" *                            | (__| |_| |  _ <| |___
 .\" *                             \___|\___/|_| \_\_____|
 .\" *
-.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 .\" *
 .\" * This software is licensed as described in the file COPYING, which
 .\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_PROXY_PINNEDPUBLICKEY 3 "May 31, 2017" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_PROXY_PINNEDPUBLICKEY 3 "May 15, 2019" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_PROXY_PINNEDPUBLICKEY \- set pinned public key for https proxy
@@ -95,11 +95,11 @@ footer:
 .SH AVAILABILITY
 PEM/DER support:
 
-  7.52.0: GSKit, GnuTLS, NSS, OpenSSL, PolarSSL, mbedtls, wolfSSL/CyaSSL
+  7.52.0: GSKit, GnuTLS, NSS, OpenSSL, mbedtls, wolfSSL
 
 sha256 support:
 
-  7.52.0: GnuTLS, NSS, OpenSSL, PolarSSL, mbedtls, wolfSSL/CyaSSL
+  7.52.0: GnuTLS, NSS, OpenSSL, mbedtls, wolfSSL
 
 Other SSL backends not supported.
 .SH RETURN VALUE
index 871dea3..a3eaa9a 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_PROXY_SERVICE_NAME 3 "May 31, 2017" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_PROXY_SERVICE_NAME 3 "May 31, 2017" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_PROXY_SERVICE_NAME \- proxy authentication service name
index 21fc124..d042023 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_PROXY_SSLCERT 3 "April 17, 2018" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_PROXY_SSLCERT 3 "April 17, 2018" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_PROXY_SSLCERT \- set SSL proxy client certificate
index afb3d73..853d57c 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_PROXY_SSLCERTTYPE 3 "April 17, 2018" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_PROXY_SSLCERTTYPE 3 "April 17, 2018" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_PROXY_SSLCERTTYPE \- specify type of the proxy client SSL certificate
index a9e4d2e..974e946 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_PROXY_SSLKEY 3 "May 31, 2017" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_PROXY_SSLKEY 3 "May 31, 2017" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_PROXY_SSLKEY \- specify private keyfile for TLS and SSL proxy client cert
index 8586145..0e9b004 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_PROXY_SSLKEYTYPE 3 "April 17, 2018" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_PROXY_SSLKEYTYPE 3 "April 17, 2018" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_PROXY_SSLKEYTYPE \- set type of the proxy private key file
index df478f3..e832ce7 100644 (file)
@@ -5,7 +5,7 @@
 .\" *                            | (__| |_| |  _ <| |___
 .\" *                             \___|\___/|_| \_\_____|
 .\" *
-.\" * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2019, 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
 .\" *
 .\" * This software is licensed as described in the file COPYING, which
 .\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_PROXY_SSLVERSION 3 "September 23, 2018" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_PROXY_SSLVERSION 3 "October 31, 2019" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_PROXY_SSLVERSION \- set preferred proxy TLS/SSL version
@@ -51,7 +51,7 @@ TLSv1.3
 The maximum TLS version can be set by using \fIone\fP of the
 CURL_SSLVERSION_MAX_ macros below. It is also possible to OR \fIone\fP of the
 CURL_SSLVERSION_ macros with \fIone\fP of the CURL_SSLVERSION_MAX_ macros.
-The MAX macros are not supported for SSL backends axTLS or wolfSSL.
+The MAX macros are not supported for WolfSSL.
 .RS
 .IP CURL_SSLVERSION_MAX_DEFAULT
 The flag defines the maximum supported TLS version as TLSv1.2, or the default
@@ -70,6 +70,11 @@ The flag defines maximum supported TLS version as TLSv1.2.
 The flag defines maximum supported TLS version as TLSv1.3.
 (Added in 7.54.0)
 .RE
+
+In versions of curl prior to 7.54 the CURL_SSLVERSION_TLS options were
+documented to allow \fIonly\fP the specified TLS version, but behavior was
+inconsistent depending on the TLS library.
+
 .SH DEFAULT
 CURL_SSLVERSION_DEFAULT
 .SH PROTOCOLS
index 5ad69b9..aef74b7 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_PROXY_SSL_CIPHER_LIST 3 "October 10, 2018" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_PROXY_SSL_CIPHER_LIST 3 "October 10, 2018" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_PROXY_SSL_CIPHER_LIST \- specify ciphers to use for proxy TLS
index 8fa3410..890d12e 100644 (file)
@@ -5,7 +5,7 @@
 .\" *                            | (__| |_| |  _ <| |___
 .\" *                             \___|\___/|_| \_\_____|
 .\" *
-.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 .\" *
 .\" * This software is licensed as described in the file COPYING, which
 .\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_PROXY_SSL_OPTIONS 3 "May 31, 2017" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_PROXY_SSL_OPTIONS 3 "July 16, 2019" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_PROXY_SSL_OPTIONS \- set proxy SSL behavior options
@@ -40,13 +40,10 @@ lessens the security, and by setting this option to 1 you ask for exactly
 that.  This option is only supported for DarwinSSL, NSS and OpenSSL.
 
 \fICURLSSLOPT_NO_REVOKE\fP tells libcurl to disable certificate revocation
-checks for those SSL backends where such behavior is present. \fBCurrently
-this option is only supported for WinSSL (the native Windows SSL library),
-with an exception in the case of Windows' Untrusted Publishers blacklist which
-it seems can't be bypassed.\fP This option may have broader support to
-accommodate other SSL backends in the future.
-https://curl.haxx.se/docs/ssl-compared.html
-
+checks for those SSL backends where such behavior is present. This option is
+only supported for Schannel (the native Windows SSL library), with an
+exception in the case of Windows' Untrusted Publishers blacklist which it
+seems can't be bypassed.
 .SH DEFAULT
 0
 .SH PROTOCOLS
index ad111f3..8e1ec49 100644 (file)
@@ -5,7 +5,7 @@
 .\" *                            | (__| |_| |  _ <| |___
 .\" *                             \___|\___/|_| \_\_____|
 .\" *
-.\" * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 .\" *
 .\" * This software is licensed as described in the file COPYING, which
 .\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_PROXY_SSL_VERIFYHOST 3 "May 02, 2018" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_PROXY_SSL_VERIFYHOST 3 "August 20, 2019" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_PROXY_SSL_VERIFYHOST \- verify the proxy certificate's name against host
@@ -43,8 +43,15 @@ Curl considers the proxy the intended one when the Common Name field or a
 Subject Alternate Name field in the certificate matches the host name in the
 proxy string which you told curl to use.
 
-When the \fIverify\fP value is 1L, \fIcurl_easy_setopt\fP will return an error
-and the option value will not be changed due to old legacy reasons.
+If \fIverify\fP value is set to 1:
+
+In 7.28.0 and earlier: treated as a debug option of some sorts, not supported
+anymore due to frequently leading to programmer mistakes.
+
+From 7.28.1 to 7.65.3: setting it to 1 made curl_easy_setopt() return an error
+and leaving the flag untouched.
+
+From 7.66.0: treats 1 and 2 the same.
 
 When the \fIverify\fP value is 0L, the connection succeeds regardless of the
 names used in the certificate. Use that ability with caution!
index a657daa..f457565 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_PROXY_SSL_VERIFYPEER 3 "December 16, 2016" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_PROXY_SSL_VERIFYPEER 3 "December 16, 2016" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_PROXY_SSL_VERIFYPEER \- verify the proxy's SSL certificate
index eeb90e2..f3a166c 100644 (file)
@@ -5,7 +5,7 @@
 .\" *                            | (__| |_| |  _ <| |___
 .\" *                             \___|\___/|_| \_\_____|
 .\" *
-.\" * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 .\" *
 .\" * This software is licensed as described in the file COPYING, which
 .\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_PROXY_TLS13_CIPHERS 3 "October 10, 2018" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_PROXY_TLS13_CIPHERS 3 "October 31, 2019" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_PROXY_TLS13_CIPHERS \- ciphers suites for proxy TLS 1.3
@@ -38,6 +38,10 @@ You'll find more details about cipher lists on this URL:
 
  https://curl.haxx.se/docs/ssl-ciphers.html
 
+This option is currently used only when curl is built to use OpenSSL 1.1.1 or
+later. If you are using a different SSL backend you can try setting TLS 1.3
+cipher suites by using the CURLOPT_PROXY_SSL_CIPHER_LIST option.
+
 The application does not have to keep the string around after setting this
 option.
 .SH DEFAULT
index 34c02db..186f14e 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_PROXY_TLSAUTH_PASSWORD 3 "May 31, 2017" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_PROXY_TLSAUTH_PASSWORD 3 "May 31, 2017" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_PROXY_TLSAUTH_PASSWORD \- password to use for proxy TLS authentication
index 33f91d7..6125788 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_PROXY_TLSAUTH_TYPE 3 "May 31, 2017" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_PROXY_TLSAUTH_TYPE 3 "May 31, 2017" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_PROXY_TLSAUTH_TYPE \- set proxy TLS authentication methods
index cc80cb9..9683d0f 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_PROXY_TLSAUTH_USERNAME 3 "May 31, 2017" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_PROXY_TLSAUTH_USERNAME 3 "May 31, 2017" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_PROXY_TLSAUTH_USERNAME \- user name to use for proxy TLS authentication
index 35dfb08..a1a0afa 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_PROXY_TRANSFER_MODE 3 "April 17, 2018" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_PROXY_TRANSFER_MODE 3 "April 17, 2018" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_PROXY_TRANSFER_MODE \- append FTP transfer mode to URL for proxy
index 216c393..6cc6446 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_PUT 3 "April 17, 2018" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_PUT 3 "April 17, 2018" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_PUT \- make an HTTP PUT request
index be8537a..94337bd 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_QUOTE 3 "April 17, 2018" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_QUOTE 3 "December 18, 2019" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_QUOTE \- (S)FTP commands to run before transfer
@@ -82,16 +82,16 @@ NULL
 SFTP and FTP
 .SH EXAMPLE
 .nf
-struct curl_slist *h = NULL;
-h = curl_slist_append(h, "RNFR source-name");
-h = curl_slist_append(h, "RNTO new-name");
+struct curl_slist *cmdlist = NULL;
+cmdlist = curl_slist_append(cmdlist, "RNFR source-name");
+cmdlist = curl_slist_append(cmdlist, "RNTO new-name");
 
 curl = curl_easy_init();
 if(curl) {
   curl_easy_setopt(curl, CURLOPT_URL, "ftp://example.com/foo.bin");
 
   /* pass in the FTP commands to run before the transfer */
-  curl_easy_setopt(curl, CURLOPT_QUOTE, headerlist);
+  curl_easy_setopt(curl, CURLOPT_QUOTE, cmdlist);
 
   ret = curl_easy_perform(curl);
 
index a9972e2..acd09af 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_RANDOM_FILE 3 "May 31, 2017" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_RANDOM_FILE 3 "May 31, 2017" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_RANDOM_FILE \- specify a source for random data
index eb5c414..42f4bad 100644 (file)
@@ -5,7 +5,7 @@
 .\" *                            | (__| |_| |  _ <| |___
 .\" *                             \___|\___/|_| \_\_____|
 .\" *
-.\" * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 .\" *
 .\" * This software is licensed as described in the file COPYING, which
 .\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_RANGE 3 "December 21, 2016" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_RANGE 3 "October 31, 2019" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_RANGE \- set byte range to request
@@ -44,6 +44,14 @@ For RTSP, the formatting of a range should follow RFC2326 Section 12.29. For
 RTSP, byte ranges are \fBnot\fP permitted. Instead, ranges should be given in
 npt, utc, or smpte formats.
 
+For HTTP PUT uploads this option should not be used, since it may conflict with
+other options. If you need to upload arbitrary parts of a file (like for
+Amazon's web services) support is limited. We suggest set resume position using
+\fICURLOPT_RESUME_FROM(3)\fP, set end (resume+size) position using
+\fICURLOPT_INFILESIZE(3)\fP and seek to the resume position before initiating
+the transfer for each part. For more information refer to
+https://curl.haxx.se/mail/lib-2019-05/0012.html
+
 Pass a NULL to this option to disable the use of ranges.
 
 The application does not have to keep the string around after setting this
index 97c4bdd..f6e3b26 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_READDATA 3 "August 11, 2018" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_READDATA 3 "August 11, 2018" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_READDATA \- custom pointer passed to the read callback
index dca61c4..fc15fa1 100644 (file)
@@ -5,7 +5,7 @@
 .\" *                            | (__| |_| |  _ <| |___
 .\" *                             \___|\___/|_| \_\_____|
 .\" *
-.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 .\" *
 .\" * This software is licensed as described in the file COPYING, which
 .\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_READFUNCTION 3 "August 11, 2018" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_READFUNCTION 3 "January 06, 2020" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_READFUNCTION \- read callback for data uploads
@@ -70,8 +70,37 @@ The default internal read callback is fread().
 .SH PROTOCOLS
 This is used for all protocols when doing uploads.
 .SH EXAMPLE
-Here's an example setting a read callback for reading that to upload to an FTP
-site: https://curl.haxx.se/libcurl/c/ftpupload.html
+.nf
+size_t read_callback(void *ptr, size_t size, size_t nmemb, void *userdata)
+{
+  FILE *readhere = (FILE *)userdata;
+  curl_off_t nread;
+
+  /* copy as much data as possible into the 'ptr' buffer, but no more than
+     'size' * 'nmemb' bytes! */
+  size_t retcode = fread(ptr, size, nmemb, readhere);
+
+  nread = (curl_off_t)retcode;
+
+  fprintf(stderr, "*** We read %" CURL_FORMAT_CURL_OFF_T
+          " bytes from file\\n", nread);
+  return retcode;
+}
+
+void setup(char *uploadthis)
+{
+  FILE *file = fopen(uploadthis, "rb");
+  CURLcode result;
+
+  /* set callback to use */
+  curl_easy_setopt(curl, CURLOPT_READFUNCTION, read_callback);
+
+  /* pass in suitable argument to callback */
+  curl_easy_setopt(curl, CURLOPT_READDATA, (void *)file);
+
+  result = curl_easy_perform(curl);
+}
+.fi
 .SH AVAILABILITY
 CURL_READFUNC_PAUSE return code was added in 7.18.0 and CURL_READFUNC_ABORT
 was added in 7.12.1.
@@ -80,3 +109,4 @@ This will return CURLE_OK.
 .SH "SEE ALSO"
 .BR CURLOPT_READDATA "(3), " CURLOPT_WRITEFUNCTION "(3), "
 .BR CURLOPT_SEEKFUNCTION "(3), " CURLOPT_UPLOAD "(3), " CURLOPT_POST "(3), "
+.BR CURLOPT_UPLOAD_BUFFERSIZE "(3), "
index 90742c1..439d992 100644 (file)
@@ -5,7 +5,7 @@
 .\" *                            | (__| |_| |  _ <| |___
 .\" *                             \___|\___/|_| \_\_____|
 .\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 .\" *
 .\" * This software is licensed as described in the file COPYING, which
 .\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_REDIR_PROTOCOLS 3 "September 21, 2016" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_REDIR_PROTOCOLS 3 "October 31, 2019" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_REDIR_PROTOCOLS \- set protocols allowed to redirect to
@@ -38,10 +38,11 @@ redirections.
 Protocols denied by \fICURLOPT_PROTOCOLS(3)\fP are not overridden by this
 option.
 
-By default libcurl will allow all protocols on redirect except several disabled
-for security reasons: Since 7.19.4 FILE and SCP are disabled, and since 7.40.0
-SMB and SMBS are also disabled. \fICURLPROTO_ALL\fP enables all protocols on
-redirect, including those disabled for security.
+By default libcurl will allow HTTP, HTTPS, FTP and FTPS on redirect (7.65.2).
+Older versions of libcurl allowed all protocols on redirect except several
+disabled for security reasons: Since 7.19.4 FILE and SCP are disabled, and
+since 7.40.0 SMB and SMBS are also disabled. \fICURLPROTO_ALL\fP enables all
+protocols on redirect, including those disabled for security.
 
 These are the available protocol defines:
 .nf
index 00cc497..0fb1e0a 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_REFERER 3 "December 21, 2016" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_REFERER 3 "December 21, 2016" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_REFERER \- set the HTTP referer header
index b11d20f..0abcebe 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_REQUEST_TARGET 3 "June 21, 2017" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_REQUEST_TARGET 3 "June 21, 2017" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_REQUEST_TARGET \- specify an alternative target for this request
index 83363c4..89ecf9d 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_RESOLVE 3 "May 30, 2018" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_RESOLVE 3 "May 30, 2018" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_RESOLVE \- provide custom host name to IP address resolves
index a59b206..4071712 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_RESOLVER_START_DATA 3 "February 14, 2018" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_RESOLVER_START_DATA 3 "February 14, 2018" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_RESOLVER_START_DATA \- custom pointer passed to the resolver start callback
index 94027bb..7338f9e 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_RESOLVER_START_FUNCTION 3 "February 14, 2018" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_RESOLVER_START_FUNCTION 3 "February 14, 2018" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_RESOLVER_START_FUNCTION \- set callback to be called before a new resolve request is started
index ffb3766..cf83ca3 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_RESUME_FROM 3 "February 03, 2016" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_RESUME_FROM 3 "February 03, 2016" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_RESUME_FROM \- set a point to resume transfer from
index 7b46abf..680872f 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_RESUME_FROM_LARGE 3 "February 03, 2016" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_RESUME_FROM_LARGE 3 "February 03, 2016" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_RESUME_FROM_LARGE \- set a point to resume transfer from
index 640cc28..98f554a 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_RTSP_CLIENT_CSEQ 3 "April 17, 2018" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_RTSP_CLIENT_CSEQ 3 "April 17, 2018" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_RTSP_CLIENT_CSEQ \- set the RTSP client CSEQ number
index 715e8dd..bcf4a27 100644 (file)
@@ -5,7 +5,7 @@
 .\" *                            | (__| |_| |  _ <| |___
 .\" *                             \___|\___/|_| \_\_____|
 .\" *
-.\" * Copyright (C) 1998 - 2014, 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 .\" *
 .\" * This software is licensed as described in the file COPYING, which
 .\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_RTSP_REQUEST 3 "April 17, 2018" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_RTSP_REQUEST 3 "July 16, 2019" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_RTSP_REQUEST \- specify RTSP request
@@ -34,15 +34,15 @@ enum values as a long in the \fIrequest\fP argument. Unless noted otherwise,
 commands require the Session ID to be initialized.
 .IP CURL_RTSPREQ_OPTIONS
 Used to retrieve the available methods of the server. The application is
-responsible for parsing and obeying the response. \fB(The session ID is not
-needed for this method.)\fP
+responsible for parsing and obeying the response. The session ID is not needed
+for this method.
 .IP CURL_RTSPREQ_DESCRIBE
 Used to get the low level description of a stream. The application should note
 what formats it understands in the \fI'Accept:'\fP header. Unless set
-manually, libcurl will automatically fill in \fI'Accept:
-application/sdp'\fP. Time-condition headers will be added to Describe requests
-if the \fICURLOPT_TIMECONDITION(3)\fP option is active. \fB(The session ID is
-not needed for this method)\fP
+manually, libcurl will automatically fill in \fI'Accept: application/sdp'\fP.
+Time-condition headers will be added to Describe requests if the
+\fICURLOPT_TIMECONDITION(3)\fP option is active. \fB(The session ID is not
+needed for this method)\fP
 .IP CURL_RTSPREQ_ANNOUNCE
 When sent by a client, this method changes the description of the session. For
 example, if a client is using the server to record a meeting, the client can
@@ -54,8 +54,8 @@ Setup is used to initialize the transport layer for the session. The
 application must set the desired Transport options for a session by using the
 \fICURLOPT_RTSP_TRANSPORT(3)\fP option prior to calling setup. If no session
 ID is currently set with \fICURLOPT_RTSP_SESSION_ID(3)\fP, libcurl will
-extract and use the session ID in the response to this request. \fB(The
-session ID is not needed for this method).\fP
+extract and use the session ID in the response to this request. The session ID
+is not needed for this method.
 .IP CURL_RTSPREQ_PLAY
 Send a Play command to the server. Use the \fICURLOPT_RANGE(3)\fP option to
 modify the playback time (e.g. 'npt=10-15').
index f9d8517..deb6ca3 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_RTSP_SERVER_CSEQ 3 "May 31, 2017" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_RTSP_SERVER_CSEQ 3 "May 31, 2017" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_RTSP_SERVER_CSEQ \- set the RTSP server CSEQ number
index b53daa5..d73d821 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_RTSP_SESSION_ID 3 "May 31, 2017" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_RTSP_SESSION_ID 3 "May 31, 2017" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_RTSP_SESSION_ID \- set RTSP session ID
index 0c04029..36f9cb6 100644 (file)
@@ -5,7 +5,7 @@
 .\" *                            | (__| |_| |  _ <| |___
 .\" *                             \___|\___/|_| \_\_____|
 .\" *
-.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 .\" *
 .\" * This software is licensed as described in the file COPYING, which
 .\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_RTSP_STREAM_URI 3 "May 31, 2017" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_RTSP_STREAM_URI 3 "July 16, 2019" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_RTSP_STREAM_URI \- set RTSP stream URI
@@ -43,7 +43,7 @@ examples might be set to \fIrtsp://foo/twister\fP
 The application does not have to keep the string around after setting this
 option.
 .SH DEFAULT
-'*'
+\&'*'
 .SH PROTOCOLS
 RTSP
 .SH EXAMPLE
index 2123c35..5fd1bb9 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_RTSP_TRANSPORT 3 "May 31, 2017" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_RTSP_TRANSPORT 3 "May 31, 2017" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_RTSP_TRANSPORT \- set RTSP Transport: header
diff --git a/docs/libcurl/opts/CURLOPT_SASL_AUTHZID.3 b/docs/libcurl/opts/CURLOPT_SASL_AUTHZID.3
new file mode 100644 (file)
index 0000000..6544547
--- /dev/null
@@ -0,0 +1,64 @@
+.\" **************************************************************************
+.\" *                                  _   _ ____  _
+.\" *  Project                     ___| | | |  _ \| |
+.\" *                             / __| | | | |_) | |
+.\" *                            | (__| |_| |  _ <| |___
+.\" *                             \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
+.\" * are also available at https://curl.haxx.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH CURLOPT_SASL_AUTHZID 3 "11 Sep 2019" "libcurl 7.66.0" "curl_easy_setopt options"
+.SH NAME
+CURLOPT_SASL_AUTHZID \- authorisation identity (identity to act as)
+.SH SYNOPSIS
+#include <curl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SASL_AUTHZID, char *authzid);
+.SH DESCRIPTION
+Pass a char * as parameter, which should be pointing to the zero terminated
+authorisation identity (authzid) for the transfer. Only applicable to the PLAIN
+SASL authentication mechanism where it is optional.
+
+When not specified only the authentication identity (authcid) as specified by
+the username will be sent to the server, along with the password. The server
+will derive a authzid from the authcid when not provided, which it will then
+uses internally.
+
+When the authzid is specified, the use of which is server dependent, it can be
+used to access another user's inbox, that the user has been granted access to,
+or a shared mailbox for example.
+.SH DEFAULT
+blank
+.SH PROTOCOLS
+IMAP, POP3 and SMTP
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+  curl_easy_setopt(curl, CURLOPT_URL, "imap://example.com/");
+  curl_easy_setopt(curl, CURLOPT_USERNAME, "Kurt");
+  curl_easy_setopt(curl, CURLOPT_PASSWORD, "xipj3plmq");
+  curl_easy_setopt(curl, CURLOPT_SASL_AUTHZID, "Ursel");
+  ret = curl_easy_perform(curl);
+  curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.66.0
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR CURLOPT_USERNAME "(3), " CURLOPT_PASSWORD "(3), ".BR CURLOPT_USERPWD "(3)"
index 7da1443..d0fa781 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_SASL_IR 3 "May 31, 2017" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_SASL_IR 3 "May 31, 2017" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_SASL_IR \- enable sending initial response in first packet
index c3d998c..651eab8 100644 (file)
@@ -5,7 +5,7 @@
 .\" *                            | (__| |_| |  _ <| |___
 .\" *                             \___|\___/|_| \_\_____|
 .\" *
-.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 .\" *
 .\" * This software is licensed as described in the file COPYING, which
 .\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_SEEKDATA 3 "August 12, 2017" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_SEEKDATA 3 "October 31, 2019" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_SEEKDATA \- custom pointer passed to the seek callback
@@ -41,7 +41,7 @@ HTTP, FTP, SFTP
 static int seek_cb(void *userp, curl_off_t offset, int origin)
 {
   struct data *d = (struct data *)userp;
-  lseek(our_fd, offset, origin);
+  lseek(d->our_fd, offset, origin);
   return CURL_SEEKFUNC_OK;
 }
 
index 6819799..5d3372e 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_SEEKFUNCTION 3 "April 17, 2018" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_SEEKFUNCTION 3 "April 17, 2018" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_SEEKFUNCTION \- user callback for seeking in input stream
index 60c4ba7..ab54e27 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_SERVICE_NAME 3 "May 31, 2017" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_SERVICE_NAME 3 "May 31, 2017" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_SERVICE_NAME \- authentication service name
index 8b7338c..cbbe78e 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_SHARE 3 "May 31, 2017" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_SHARE 3 "May 31, 2017" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_SHARE \- specify share handle to use
index 9cb475e..14939de 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_SOCKOPTDATA 3 "May 15, 2017" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_SOCKOPTDATA 3 "May 15, 2017" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_SOCKOPTDATA \- custom pointer to pass to sockopt callback
index faf8b14..b5c96c6 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_SOCKOPTFUNCTION 3 "May 15, 2017" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_SOCKOPTFUNCTION 3 "May 15, 2017" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_SOCKOPTFUNCTION \- set callback for setting socket options
index 90650c0..4f0171b 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_SOCKS5_AUTH 3 "April 27, 2017" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_SOCKS5_AUTH 3 "April 27, 2017" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_SOCKS5_AUTH \- set allowed methods for SOCKS5 proxy authentication
index 5a77700..ec3e5ce 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_SOCKS5_GSSAPI_NEC 3 "May 31, 2017" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_SOCKS5_GSSAPI_NEC 3 "May 31, 2017" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_SOCKS5_GSSAPI_NEC \- set socks proxy gssapi negotiation protection
index 9e4c0f8..333523b 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_SOCKS5_GSSAPI_SERVICE 3 "May 31, 2017" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_SOCKS5_GSSAPI_SERVICE 3 "May 31, 2017" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_SOCKS5_GSSAPI_SERVICE \- SOCKS5 proxy authentication service name
index ad498d8..6c46b43 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_SSH_AUTH_TYPES 3 "May 31, 2017" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_SSH_AUTH_TYPES 3 "May 31, 2017" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_SSH_AUTH_TYPES \- set desired auth types for SFTP and SCP
index 480853b..fd5556b 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_SSH_COMPRESSION 3 "August 10, 2018" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_SSH_COMPRESSION 3 "August 10, 2018" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_SSH_COMPRESSION \- enables compression / decompression of SSH traffic
index 9439542..beafeb4 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_SSH_HOST_PUBLIC_KEY_MD5 3 "May 31, 2017" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_SSH_HOST_PUBLIC_KEY_MD5 3 "May 31, 2017" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_SSH_HOST_PUBLIC_KEY_MD5 \- checksum of SSH server public key
index 7f742b9..af8ce65 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_SSH_KEYDATA 3 "May 31, 2017" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_SSH_KEYDATA 3 "May 31, 2017" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_SSH_KEYDATA \- pointer to pass to the SSH key callback
index 721d047..8f87a4e 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_SSH_KEYFUNCTION 3 "May 31, 2017" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_SSH_KEYFUNCTION 3 "May 31, 2017" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_SSH_KEYFUNCTION \- callback for known host matching logic
index 12b29a8..1490ba4 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_SSH_KNOWNHOSTS 3 "May 31, 2017" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_SSH_KNOWNHOSTS 3 "May 31, 2017" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_SSH_KNOWNHOSTS \- file name holding the SSH known hosts
index ef0728d..2cc754d 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_SSH_PRIVATE_KEYFILE 3 "May 31, 2017" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_SSH_PRIVATE_KEYFILE 3 "May 31, 2017" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_SSH_PRIVATE_KEYFILE \- set private key file for SSH auth
index 6f1e7f1..d094575 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_SSH_PUBLIC_KEYFILE 3 "May 31, 2017" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_SSH_PUBLIC_KEYFILE 3 "May 31, 2017" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_SSH_PUBLIC_KEYFILE \- set public key file for SSH auth
index 1f62458..841f251 100644 (file)
@@ -5,7 +5,7 @@
 .\" *                            | (__| |_| |  _ <| |___
 .\" *                             \___|\___/|_| \_\_____|
 .\" *
-.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 .\" *
 .\" * This software is licensed as described in the file COPYING, which
 .\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_SSLCERT 3 "April 18, 2018" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_SSLCERT 3 "January 29, 2019" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_SSLCERT \- set SSL client certificate
@@ -39,11 +39,10 @@ you wish to authenticate with as it is named in the security database. If you
 want to use a file from the current directory, please precede it with "./"
 prefix, in order to avoid confusion with a nickname.
 
-(Schannel/WinSSL only) Client certificates must be specified by a path
-expression to a certificate store. (Loading PFX is not supported; you can
-import it to a store first). You can use
-"<store location>\\<store name>\\<thumbprint>" to refer to a certificate
-in the system certificates store, for example,
+(Schannel only) Client certificates must be specified by a path expression to
+a certificate store. (Loading PFX is not supported; you can import it to a
+store first). You can use "<store location>\\<store name>\\<thumbprint>" to
+refer to a certificate in the system certificates store, for example,
 "CurrentUser\\MY\\934a7ac6f8a5d579285a74fa61e19f23ddfe8d7a". Thumbprint is
 usually a SHA-1 hex string which you can see in certificate details. Following
 store locations are supported: CurrentUser, LocalMachine, CurrentService,
index dbf6d62..3ae7aa8 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_SSLCERTTYPE 3 "May 31, 2017" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_SSLCERTTYPE 3 "May 31, 2017" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_SSLCERTTYPE \- specify type of the client SSL certificate
index 4cf91c7..18264bd 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_SSLENGINE 3 "May 31, 2017" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_SSLENGINE 3 "May 31, 2017" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_SSLENGINE \- set SSL engine identifier
index 52058d6..f196744 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_SSLENGINE_DEFAULT 3 "May 31, 2017" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_SSLENGINE_DEFAULT 3 "May 31, 2017" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_SSLENGINE_DEFAULT \- make SSL engine default
index f22cc2d..3ede517 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_SSLKEY 3 "May 31, 2017" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_SSLKEY 3 "May 31, 2017" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_SSLKEY \- specify private keyfile for TLS and SSL client cert
index a100cdd..8f9b27d 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_SSLKEYTYPE 3 "May 31, 2017" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_SSLKEYTYPE 3 "May 31, 2017" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_SSLKEYTYPE \- set type of the private key file
index eaaac03..fb21ce2 100644 (file)
@@ -5,7 +5,7 @@
 .\" *                            | (__| |_| |  _ <| |___
 .\" *                             \___|\___/|_| \_\_____|
 .\" *
-.\" * Copyright (C) 1998 - 2015, 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2019, 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
 .\" *
 .\" * This software is licensed as described in the file COPYING, which
 .\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_SSLVERSION 3 "October 10, 2018" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_SSLVERSION 3 "October 31, 2019" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_SSLVERSION \- set preferred TLS/SSL version
@@ -60,7 +60,7 @@ TLS v1.3 or later (Added in 7.52.0)
 The maximum TLS version can be set by using \fIone\fP of the
 CURL_SSLVERSION_MAX_ macros below. It is also possible to OR \fIone\fP of the
 CURL_SSLVERSION_ macros with \fIone\fP of the CURL_SSLVERSION_MAX_ macros.
-The MAX macros are not supported for SSL backends axTLS or wolfSSL.
+The MAX macros are not supported for WolfSSL.
 .RS
 .IP CURL_SSLVERSION_MAX_DEFAULT
 The flag defines the maximum supported TLS version by libcurl, or the default
@@ -80,6 +80,11 @@ The flag defines maximum supported TLS version as TLS v1.2.
 The flag defines maximum supported TLS version as TLS v1.3.
 (Added in 7.54.0)
 .RE
+
+In versions of curl prior to 7.54 the CURL_SSLVERSION_TLS options were
+documented to allow \fIonly\fP the specified TLS version, but behavior was
+inconsistent depending on the TLS library.
+
 .SH DEFAULT
 CURL_SSLVERSION_DEFAULT
 .SH PROTOCOLS
index cd0e134..8def7ae 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_SSL_CIPHER_LIST 3 "October 10, 2018" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_SSL_CIPHER_LIST 3 "October 10, 2018" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_SSL_CIPHER_LIST \- specify ciphers to use for TLS
index 56348ab..9876d8c 100644 (file)
@@ -5,7 +5,7 @@
 .\" *                            | (__| |_| |  _ <| |___
 .\" *                             \___|\___/|_| \_\_____|
 .\" *
-.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 .\" *
 .\" * This software is licensed as described in the file COPYING, which
 .\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_SSL_CTX_DATA 3 "May 31, 2017" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_SSL_CTX_DATA 3 "June 02, 2019" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_SSL_CTX_DATA \- custom pointer passed to ssl_ctx callback
@@ -113,8 +113,8 @@ int main(void)
 }
 .fi
 .SH AVAILABILITY
-Added in 7.11.0 for OpenSSL. Added in 7.42.0 for wolfSSL/CyaSSL. Other SSL
-backends not supported.
+Added in 7.11.0 for OpenSSL, in 7.42.0 for wolfSSL and in 7.54.0 for
+mbedTLS. Other SSL backends are not supported.
 .SH RETURN VALUE
 CURLE_OK if supported; or an error such as:
 
index 40a0282..c68d2ee 100644 (file)
@@ -5,7 +5,7 @@
 .\" *                            | (__| |_| |  _ <| |___
 .\" *                             \___|\___/|_| \_\_____|
 .\" *
-.\" * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 .\" *
 .\" * This software is licensed as described in the file COPYING, which
 .\" * you should have received as part of this distribution. The terms
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_SSL_CTX_FUNCTION 3 "August 29, 2018" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_SSL_CTX_FUNCTION 3 "June 02, 2019" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
-CURLOPT_SSL_CTX_FUNCTION \- SSL context callback for OpenSSL, wolfSSL/CyaSSL or mbedTLS
+CURLOPT_SSL_CTX_FUNCTION \- SSL context callback for OpenSSL, wolfSSL or mbedTLS
 .SH SYNOPSIS
 .nf
 #include <curl/curl.h>
@@ -33,9 +33,8 @@ CURLcode ssl_ctx_callback(CURL *curl, void *ssl_ctx, void *userptr);
 CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SSL_CTX_FUNCTION,
                           ssl_ctx_callback);
 .SH DESCRIPTION
-This option only works for libcurl powered by OpenSSL, wolfSSL/CyaSSL or
-mbedTLS. If libcurl was built against another SSL library this functionality is
-absent.
+This option only works for libcurl powered by OpenSSL, wolfSSL or mbedTLS. If
+libcurl was built against another SSL library this functionality is absent.
 
 Pass a pointer to your callback function, which should match the prototype
 shown above.
@@ -44,11 +43,11 @@ This callback function gets called by libcurl just before the initialization
 of an SSL connection after having processed all other SSL related options to
 give a last chance to an application to modify the behavior of the SSL
 initialization. The \fIssl_ctx\fP parameter is actually a pointer to the SSL
-library's \fISSL_CTX\fP for OpenSSL or wolfSSL/CyaSSL, and a pointer to
-\fImbedtls_ssl_config\fP for mbedTLS. If an error is returned from the callback
-no attempt to establish a connection is made and the perform operation will
-return the callback's error code. Set the \fIuserptr\fP argument with the
-\fICURLOPT_SSL_CTX_DATA(3)\fP option.
+library's \fISSL_CTX\fP for OpenSSL or wolfSSL, and a pointer to
+\fImbedtls_ssl_config\fP for mbedTLS. If an error is returned from the
+callback no attempt to establish a connection is made and the perform
+operation will return the callback's error code. Set the \fIuserptr\fP
+argument with the \fICURLOPT_SSL_CTX_DATA(3)\fP option.
 
 This function will get called on all new connections made to a server, during
 the SSL negotiation. The \fIssl_ctx\fP will point to a newly initialized object
@@ -73,8 +72,8 @@ See cacertinmem.c in docs/examples directory for usage example.
 
 https://curl.haxx.se/libcurl/c/cacertinmem.html
 .SH AVAILABILITY
-Added in 7.11.0 for OpenSSL. Added in 7.42.0 for wolfSSL/CyaSSL. Added in
-7.54.0 for mbedTLS. Other SSL backends not supported.
+Added in 7.11.0 for OpenSSL, in 7.42.0 for wolfSSL and in 7.54.0 for
+mbedTLS. Other SSL backends are not supported.
 .SH RETURN VALUE
 CURLE_OK if supported; or an error such as:
 
index a645fee..5dccf24 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_SSL_ENABLE_ALPN 3 "May 31, 2017" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_SSL_ENABLE_ALPN 3 "May 31, 2017" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_SSL_ENABLE_ALPN \- enable ALPN
index bf10ebe..76f7b8a 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_SSL_ENABLE_NPN 3 "May 31, 2017" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_SSL_ENABLE_NPN 3 "May 31, 2017" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_SSL_ENABLE_NPN \- enable NPN
index 5d6df3c..04e7bc7 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_SSL_FALSESTART 3 "May 15, 2017" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_SSL_FALSESTART 3 "May 15, 2017" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_SSL_FALSESTART \- enable TLS false start
index ee9ebf7..83e8e12 100644 (file)
@@ -5,7 +5,7 @@
 .\" *                            | (__| |_| |  _ <| |___
 .\" *                             \___|\___/|_| \_\_____|
 .\" *
-.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 .\" *
 .\" * This software is licensed as described in the file COPYING, which
 .\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_SSL_OPTIONS 3 "May 31, 2017" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_SSL_OPTIONS 3 "December 02, 2019" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_SSL_OPTIONS \- set SSL behavior options
@@ -29,25 +29,27 @@ CURLOPT_SSL_OPTIONS \- set SSL behavior options
 
 CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SSL_OPTIONS, long bitmask);
 .SH DESCRIPTION
-Pass a long with a bitmask to tell libcurl about specific SSL behaviors.
-
-\fICURLSSLOPT_ALLOW_BEAST\fP tells libcurl to not attempt to use any
-workarounds for a security flaw in the SSL3 and TLS1.0 protocols.  If this
-option isn't used or this bit is set to 0, the SSL layer libcurl uses may use a
-work-around for this flaw although it might cause interoperability problems
-with some (older) SSL implementations. WARNING: avoiding this work-around
-lessens the security, and by setting this option to 1 you ask for exactly that.
-This option is only supported for DarwinSSL, NSS and OpenSSL.
-
-Added in 7.44.0:
-
-\fICURLSSLOPT_NO_REVOKE\fP tells libcurl to disable certificate revocation
-checks for those SSL backends where such behavior is present. \fBCurrently this
-option is only supported for WinSSL (the native Windows SSL library), with an
-exception in the case of Windows' Untrusted Publishers blacklist which it seems
-can't be bypassed.\fP This option may have broader support to accommodate other
-SSL backends in the future.
-https://curl.haxx.se/docs/ssl-compared.html
+Pass a long with a bitmask to tell libcurl about specific SSL
+behaviors. Available bits:
+.IP CURLSSLOPT_ALLOW_BEAST
+Tells libcurl to not attempt to use any workarounds for a security flaw in the
+SSL3 and TLS1.0 protocols.  If this option isn't used or this bit is set to 0,
+the SSL layer libcurl uses may use a work-around for this flaw although it
+might cause interoperability problems with some (older) SSL
+implementations. WARNING: avoiding this work-around lessens the security, and
+by setting this option to 1 you ask for exactly that.  This option is only
+supported for DarwinSSL, NSS and OpenSSL.
+.IP CURLSSLOPT_NO_REVOKE
+Tells libcurl to disable certificate revocation checks for those SSL backends
+where such behavior is present. This option is only supported for Schannel
+(the native Windows SSL library), with an exception in the case of Windows'
+Untrusted Publishers blacklist which it seems can't be bypassed. (Added in
+7.44.0)
+.IP CURLSSLOPT_NO_PARTIALCHAIN
+Tells libcurl to not accept "partial" certificate chains, which it otherwise
+does by default. This option is only supported for OpenSSL and will fail the
+certificate verification if the chain ends with an intermediate certificate
+and not with a root cert. (Added in 7.68.0)
 .SH DEFAULT
 0
 .SH PROTOCOLS
index 0456478..6fb5b33 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_SSL_SESSIONID_CACHE 3 "May 31, 2017" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_SSL_SESSIONID_CACHE 3 "May 31, 2017" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_SSL_SESSIONID_CACHE \- enable/disable use of the SSL session-ID cache
index b39daaf..901a9cc 100644 (file)
@@ -5,7 +5,7 @@
 .\" *                            | (__| |_| |  _ <| |___
 .\" *                             \___|\___/|_| \_\_____|
 .\" *
-.\" * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 .\" *
 .\" * This software is licensed as described in the file COPYING, which
 .\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_SSL_VERIFYHOST 3 "February 02, 2017" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_SSL_VERIFYHOST 3 "August 20, 2019" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_SSL_VERIFYHOST \- verify the certificate's name against host
@@ -46,11 +46,15 @@ Curl considers the server the intended one when the Common Name field or a
 Subject Alternate Name field in the certificate matches the host name in the
 URL to which you told Curl to connect.
 
-When the \fIverify\fP value is 1, \fIcurl_easy_setopt\fP will return an error
-and the option value will not be changed.  It was previously (in 7.28.0 and
-earlier) a debug option of some sorts, but it is no longer supported due to
-frequently leading to programmer mistakes. Future versions will stop returning
-an error for 1 and just treat 1 and 2 the same.
+If \fIverify\fP value is set to 1:
+
+In 7.28.0 and earlier: treated as a debug option of some sorts, not supported
+anymore due to frequently leading to programmer mistakes.
+
+From 7.28.1 to 7.65.3: setting it to 1 made curl_easy_setopt() return an error
+and leaving the flag untouched.
+
+From 7.66.0: treats 1 and 2 the same.
 
 When the \fIverify\fP value is 0, the connection succeeds regardless of the
 names in the certificate. Use that ability with caution!
index 81e2780..cce1cbb 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_SSL_VERIFYPEER 3 "June 24, 2018" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_SSL_VERIFYPEER 3 "June 24, 2018" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_SSL_VERIFYPEER \- verify the peer's SSL certificate
index 7822cb9..d1f78f5 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_SSL_VERIFYSTATUS 3 "October 09, 2018" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_SSL_VERIFYSTATUS 3 "October 09, 2018" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_SSL_VERIFYSTATUS \- verify the certificate's status
index 16efa5d..470093d 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_STDERR 3 "February 03, 2016" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_STDERR 3 "February 03, 2016" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_STDERR \- redirect stderr to another stream
index 8bc9f2a..f657ea5 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_STREAM_DEPENDS 3 "May 31, 2017" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_STREAM_DEPENDS 3 "May 31, 2017" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_STREAM_DEPENDS \- set stream this transfer depends on
index c5c11d9..ef0c6be 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_STREAM_DEPENDS_E 3 "April 17, 2018" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_STREAM_DEPENDS_E 3 "April 17, 2018" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_STREAM_DEPENDS_E \- set stream this transfer depends on exclusively
index f124e0a..a873e3a 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_STREAM_WEIGHT 3 "April 17, 2018" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_STREAM_WEIGHT 3 "April 17, 2018" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_STREAM_WEIGHT \- set numerical stream weight
index 1e79b51..8103ff4 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_SUPPRESS_CONNECT_HEADERS 3 "April 28, 2016" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_SUPPRESS_CONNECT_HEADERS 3 "April 28, 2016" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_SUPPRESS_CONNECT_HEADERS \- Suppress proxy CONNECT response headers from user callbacks
index 3fe3241..6233e4c 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_TCP_FASTOPEN 3 "May 15, 2017" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_TCP_FASTOPEN 3 "May 15, 2017" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_TCP_FASTOPEN \- enable TCP Fast Open
index 406758d..ef42440 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_TCP_KEEPALIVE 3 "February 03, 2016" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_TCP_KEEPALIVE 3 "February 03, 2016" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_TCP_KEEPALIVE \- enable TCP keep-alive probing
index b74ae12..09042b9 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_TCP_KEEPIDLE 3 "January 02, 2017" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_TCP_KEEPIDLE 3 "January 02, 2017" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_TCP_KEEPIDLE \- set TCP keep-alive idle time wait
index 0ac8848..a87705e 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_TCP_KEEPINTVL 3 "January 02, 2017" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_TCP_KEEPINTVL 3 "January 02, 2017" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_TCP_KEEPINTVL \- set TCP keep-alive interval
index 204109c..75c72e4 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_TCP_NODELAY 3 "January 15, 2018" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_TCP_NODELAY 3 "January 15, 2018" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_TCP_NODELAY \- set the TCP_NODELAY option
index f9ad6d1..11f5548 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_TELNETOPTIONS 3 "May 31, 2017" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_TELNETOPTIONS 3 "May 31, 2017" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_TELNETOPTIONS \- custom telnet options
index bf2a6ad..ab7b215 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_TFTP_BLKSIZE 3 "May 31, 2017" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_TFTP_BLKSIZE 3 "May 31, 2017" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_TFTP_BLKSIZE \- TFTP block size
index 9581903..25e42bb 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_TFTP_NO_OPTIONS 3 "April 06, 2016" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_TFTP_NO_OPTIONS 3 "April 06, 2016" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_TFTP_NO_OPTIONS \- Do not send TFTP options requests.
index bc5b278..87fe8ed 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_TIMECONDITION 3 "April 03, 2016" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_TIMECONDITION 3 "April 03, 2016" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_TIMECONDITION \- select condition for a time request
index ab31ac9..bbf19f6 100644 (file)
@@ -5,7 +5,7 @@
 .\" *                            | (__| |_| |  _ <| |___
 .\" *                             \___|\___/|_| \_\_____|
 .\" *
-.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 .\" *
 .\" * This software is licensed as described in the file COPYING, which
 .\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_TIMEOUT 3 "October 03, 2017" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_TIMEOUT 3 "October 15, 2019" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_TIMEOUT \- set maximum time the request is allowed to take
@@ -31,9 +31,9 @@ CURLcode curl_easy_setopt(CURL *handle, CURLOPT_TIMEOUT, long timeout);
 .SH DESCRIPTION
 Pass a long as parameter containing \fItimeout\fP - the maximum time in
 seconds that you allow the libcurl transfer operation to take. Normally, name
-lookups can take a considerable time and limiting operations to less than a
-few minutes risk aborting perfectly normal operations. This option may cause
-libcurl to use the SIGALRM signal to timeout system calls.
+lookups can take a considerable time and limiting operations risk aborting
+perfectly normal operations. This option may cause libcurl to use the SIGALRM
+signal to timeout system calls.
 
 In unix-like systems, this might cause signals to be used unless
 \fICURLOPT_NOSIGNAL(3)\fP is set.
@@ -41,11 +41,12 @@ In unix-like systems, this might cause signals to be used unless
 If both \fICURLOPT_TIMEOUT(3)\fP and \fICURLOPT_TIMEOUT_MS(3)\fP are set, the
 value set last will be used.
 
-Since this puts a hard limit for how long time a request is allowed to take,
-it has limited use in dynamic use cases with varying transfer times. You are
-then advised to explore \fICURLOPT_LOW_SPEED_LIMIT(3)\fP,
-\fICURLOPT_LOW_SPEED_TIME(3)\fP or using \fICURLOPT_PROGRESSFUNCTION(3)\fP to
-implement your own timeout logic.
+Since this option puts a hard limit on how long time a request is allowed to
+take, it has limited use in dynamic use cases with varying transfer times. That
+is especially apparent when using the multi interface, which may queue the
+transfer, and that time is included. You are advised to explore
+\fICURLOPT_LOW_SPEED_LIMIT(3)\fP, \fICURLOPT_LOW_SPEED_TIME(3)\fP or using
+\fICURLOPT_PROGRESSFUNCTION(3)\fP to implement your own timeout logic.
 .SH DEFAULT
 Default timeout is 0 (zero) which means it never times out during transfer.
 .SH PROTOCOLS
index 4d4499a..0a2b920 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_TIMEOUT_MS 3 "September 23, 2018" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_TIMEOUT_MS 3 "September 23, 2018" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_TIMEOUT_MS \- set maximum time the request is allowed to take
index 39e0c76..d47e690 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_TIMEVALUE 3 "January 25, 2018" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_TIMEVALUE 3 "January 25, 2018" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_TIMEVALUE \- set time value for conditional
index ff3a2b8..4581b44 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_TIMEVALUE_LARGE 3 "January 25, 2018" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_TIMEVALUE_LARGE 3 "January 25, 2018" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_TIMEVALUE_LARGE \- set time value for conditional
index 00cc283..c00570c 100644 (file)
@@ -5,7 +5,7 @@
 .\" *                            | (__| |_| |  _ <| |___
 .\" *                             \___|\___/|_| \_\_____|
 .\" *
-.\" * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 .\" *
 .\" * This software is licensed as described in the file COPYING, which
 .\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_TLS13_CIPHERS 3 "October 10, 2018" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_TLS13_CIPHERS 3 "October 31, 2019" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_TLS13_CIPHERS \- specify ciphers suites to use for TLS 1.3
@@ -37,6 +37,10 @@ You'll find more details about cipher lists on this URL:
 
  https://curl.haxx.se/docs/ssl-ciphers.html
 
+This option is currently used only when curl is built to use OpenSSL 1.1.1 or
+later. If you are using a different SSL backend you can try setting TLS 1.3
+cipher suites by using the CURLOPT_SSL_CIPHER_LIST option.
+
 The application does not have to keep the string around after setting this
 option.
 .SH DEFAULT
index 3d8df3f..06f2515 100644 (file)
@@ -5,7 +5,7 @@
 .\" *                            | (__| |_| |  _ <| |___
 .\" *                             \___|\___/|_| \_\_____|
 .\" *
-.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 .\" *
 .\" * This software is licensed as described in the file COPYING, which
 .\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_TLSAUTH_PASSWORD 3 "May 31, 2017" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_TLSAUTH_PASSWORD 3 "December 16, 2019" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_TLSAUTH_PASSWORD \- password to use for TLS authentication
@@ -36,6 +36,8 @@ to use for the TLS authentication method specified with the
 
 The application does not have to keep the string around after setting this
 option.
+
+This feature relies in TLS SRP which doesn't work with TLS 1.3.
 .SH DEFAULT
 NULL
 .SH PROTOCOLS
index aadcacd..1a92eec 100644 (file)
@@ -5,7 +5,7 @@
 .\" *                            | (__| |_| |  _ <| |___
 .\" *                             \___|\___/|_| \_\_____|
 .\" *
-.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 .\" *
 .\" * This software is licensed as described in the file COPYING, which
 .\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_TLSAUTH_TYPE 3 "May 31, 2017" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_TLSAUTH_TYPE 3 "December 16, 2019" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_TLSAUTH_TYPE \- set TLS authentication methods
@@ -29,8 +29,8 @@ CURLOPT_TLSAUTH_TYPE \- set TLS authentication methods
 
 CURLcode curl_easy_setopt(CURL *handle, CURLOPT_TLSAUTH_TYPE, char *type);
 .SH DESCRIPTION
-Pass a pointer to a zero terminated string as parameter. The string
-should be the method of the TLS authentication. Supported method is "SRP".
+Pass a pointer to a zero terminated string as parameter. The string should be
+the method of the TLS authentication. Supported method is "SRP".
 
 .IP SRP
 TLS-SRP authentication. Secure Remote Password authentication for TLS is
@@ -41,6 +41,8 @@ options.
 
 The application does not have to keep the string around after setting this
 option.
+
+TLS SRP doesn't work with TLS 1.3.
 .SH DEFAULT
 blank
 .SH PROTOCOLS
index 9f6e89a..f702b9d 100644 (file)
@@ -5,7 +5,7 @@
 .\" *                            | (__| |_| |  _ <| |___
 .\" *                             \___|\___/|_| \_\_____|
 .\" *
-.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 .\" *
 .\" * This software is licensed as described in the file COPYING, which
 .\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_TLSAUTH_USERNAME 3 "May 31, 2017" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_TLSAUTH_USERNAME 3 "December 16, 2019" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_TLSAUTH_USERNAME \- user name to use for TLS authentication
@@ -36,6 +36,8 @@ to use for the TLS authentication method specified with the
 
 The application does not have to keep the string around after setting this
 option.
+
+This feature relies in TLS SRP which doesn't work with TLS 1.3.
 .SH DEFAULT
 NULL
 .SH PROTOCOLS
diff --git a/docs/libcurl/opts/CURLOPT_TRAILERDATA.3 b/docs/libcurl/opts/CURLOPT_TRAILERDATA.3
new file mode 100644 (file)
index 0000000..4f20fdf
--- /dev/null
@@ -0,0 +1,50 @@
+.\" **************************************************************************
+.\" *                                  _   _ ____  _
+.\" *  Project                     ___| | | |  _ \| |
+.\" *                             / __| | | | |_) | |
+.\" *                            | (__| |_| |  _ <| |___
+.\" *                             \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
+.\" * are also available at https://curl.haxx.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH CURLOPT_TRAILERDATA 3 "October 31, 2019" "libcurl 7.68.0" "curl_easy_setopt options"
+
+.SH NAME
+CURLOPT_TRAILERDATA \- Custom pointer passed to the trailing headers callback
+.SH SYNOPSIS
+#include <curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_TRAILERDATA, void *userdata);
+.SH DESCRIPTION:
+Data pointer to be passed to the HTTP trailer callback function.
+.SH DEFAULT
+NULL
+.SH PROTOCOLS
+HTTP
+.SH EXAMPLE
+.nf
+/* Assuming we have a CURL handle in the hndl variable. */
+
+struct MyData data;
+
+curl_easy_setopt(hndl, CURLOPT_TRAILERDATA, &data);
+.fi
+
+A more complete example can be found in examples/http_trailers.html
+.SH AVAILABILITY
+This option was added in curl 7.64.0 and is present if HTTP support is enabled
+.SH "SEE ALSO"
+.BR CURLOPT_TRAILERFUNCTION "(3), "
diff --git a/docs/libcurl/opts/CURLOPT_TRAILERFUNCTION.3 b/docs/libcurl/opts/CURLOPT_TRAILERFUNCTION.3
new file mode 100644 (file)
index 0000000..36ea893
--- /dev/null
@@ -0,0 +1,102 @@
+.\" **************************************************************************
+.\" *                                  _   _ ____  _
+.\" *  Project                     ___| | | |  _ \| |
+.\" *                             / __| | | | |_) | |
+.\" *                            | (__| |_| |  _ <| |___
+.\" *                             \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
+.\" * are also available at https://curl.haxx.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH CURLOPT_TRAILERFUNCTION 3 "October 31, 2019" "libcurl 7.68.0" "curl_easy_setopt options"
+
+.SH NAME
+CURLOPT_TRAILERFUNCTION \- Set callback for sending trailing headers
+.SH SYNOPSIS
+#include <curl.h>
+
+int curl_trailer_callback(struct curl_slist ** list, void *userdata);
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_TRAILERFUNCTION, curl_trailer_callback *func);
+.SH DESCRIPTION
+Pass a pointer to a callback function.
+
+This callback function will be called once right before sending the final
+CR LF in an HTTP chunked transfer to fill a list of trailing headers to be
+sent before finishing the HTTP transfer.
+
+You can set the userdata argument with the CURLOPT_TRAILERDATA option.
+
+The trailing headers included in the linked list must not be CRLF-terminated,
+because libcurl will add the appropriate line termination characters after
+each header item.
+
+If you use curl_slist_append to add trailing headers to the curl_slist then
+libcurl will duplicate the strings, and will free the curl_slist and the
+duplicates once the trailers have been sent.
+
+If one of the trailing headers is not formatted correctly
+(i.e. HeaderName: headerdata) it will be ignored and an info message
+will be emitted.
+
+The return value can either be CURL_TRAILERFUNC_OK or CURL_TRAILERFUNC_ABORT
+which would respectively instruct libcurl to either continue with sending the
+trailers or to abort the request.
+
+If you set this option to NULL, then the transfer proceeds as usual
+without any interruptions.
+.SH DEFAULT
+NULL
+.SH PROTOCOLS
+HTTP
+.SH EXAMPLE
+#include <curl/curl.h>
+
+static int trailer_cb(struct curl_slist **tr, void *data)
+{
+  /* libcurl will free the list */
+  tr = curl_slist_append(*tr, "My-super-awesome-trailer: trailer-stuff");
+  return CURL_TRAILERFUNC_OK;
+}
+
+CURL *curl = curl_easy_init();
+if(curl) {
+  /* Set the URL of the request */
+  curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/");
+  /* Now set it as a put */
+  curl_easy_setopt(curl, CURLOPT_PUT, 1L);
+
+  /* Assuming we have a function that will return the data to be pushed
+     Let that function be read_cb */
+  curl_easy_setopt(curl, CURLOPT_READFUNCTION, read_cb);
+
+  struct curl_slist *headers = NULL;
+  headers = curl_slist_append(headers, "Trailer: My-super-awsome-trailer");
+  res = curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
+
+  /* Set the trailers filling callback */
+  curl_easy_setopt(curl, CURLOPT_TRAILERFUNCTION, trailer_cb);
+
+  /* Perform the request, res will get the return code */
+  res = curl_easy_perform(curl);
+
+  curl_easy_cleanup(curl);
+
+  curl_slist_free_all(headers);
+}
+.SH AVAILABILITY
+This option was added in curl 7.64.0 and is present if HTTP support is enabled
+.SH "SEE ALSO"
+.BR CURLOPT_TRAILERDATA "(3), "
index e3aeef8..087b273 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_TRANSFERTEXT 3 "May 31, 2017" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_TRANSFERTEXT 3 "May 31, 2017" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_TRANSFERTEXT \- request a text based transfer for FTP
index 5abc972..b266ef1 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_TRANSFER_ENCODING 3 "May 15, 2017" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_TRANSFER_ENCODING 3 "May 15, 2017" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_TRANSFER_ENCODING \- ask for HTTP Transfer Encoding
index a581c0f..9084dc7 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_UNIX_SOCKET_PATH 3 "April 17, 2018" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_UNIX_SOCKET_PATH 3 "April 17, 2018" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_UNIX_SOCKET_PATH \- set Unix domain socket
index d5b4da3..c7fb804 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_UNRESTRICTED_AUTH 3 "May 15, 2017" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_UNRESTRICTED_AUTH 3 "May 15, 2017" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_UNRESTRICTED_AUTH \- send credentials to other hosts too
index 1a76ec1..0600aa4 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_UPLOAD 3 "April 17, 2018" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_UPLOAD 3 "April 17, 2018" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_UPLOAD \- enable data upload
index 55ba037..f1515f8 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_UPLOAD_BUFFERSIZE 3 "August 18, 2018" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_UPLOAD_BUFFERSIZE 3 "August 18, 2018" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_UPLOAD_BUFFERSIZE \- set preferred upload buffer size
index 3fd21a8..0ff7654 100644 (file)
@@ -5,7 +5,7 @@
 .\" *                            | (__| |_| |  _ <| |___
 .\" *                             \___|\___/|_| \_\_____|
 .\" *
-.\" * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 .\" *
 .\" * This software is licensed as described in the file COPYING, which
 .\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_URL 3 "July 31, 2018" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_URL 3 "December 18, 2019" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_URL \- provide the URL to use in the request
@@ -59,7 +59,10 @@ use for this transfer, independent of what libcurl has been compiled to
 support. That may be useful if you accept the URL from an external source and
 want to limit the accessibility.
 
-\fICURLOPT_URL(3)\fP is the only option that \fBmust\fP be set before a
+The \fICURLOPT_URL(3)\fP string will be ignored if \fICURLOPT_CURLU(3)\fP is
+set.
+
+\fICURLOPT_URL(3)\fP or \fICURLOPT_CURLU(3)\fP \fBmust\fP be set before a
 transfer is started.
 
 The host part of the URL contains the address of the server that you want to
@@ -225,7 +228,6 @@ scp://user@example.com/etc/issue - This specifies the file /etc/issue
 
 scp://example.com/~/my-file - This specifies the file my-file in the
 user's home directory on the server
-
 .IP SFTP
 The path part of a SFTP request specifies the file to retrieve and from what
 directory. If the file part is omitted then libcurl downloads the directory
@@ -258,6 +260,7 @@ in the root of the "files" share
 smb://server.example.com/files/ -T issue - This specifies the file "issue" will
 be uploaded to the root of the "files" share.
 
+curl supports SMB version 1 (only)
 .IP LDAP
 The path part of a LDAP request can be used to specify the: Distinguished
 Name, Attributes, Scope, Filter and Extension for a LDAP search. Each field
@@ -351,4 +354,4 @@ similar is called.
 .BR CURLOPT_VERBOSE "(3), " CURLOPT_PROTOCOLS "(3), "
 .BR CURLOPT_FORBID_REUSE "(3), " CURLOPT_FRESH_CONNECT "(3), "
 .BR curl_easy_perform "(3), "
-.BR CURLINFO_REDIRECT_URL "(3), " CURLOPT_PATH_AS_IS "(3), "
+.BR CURLINFO_REDIRECT_URL "(3), " CURLOPT_PATH_AS_IS "(3), " CURLOPT_CURLU "(3), "
index 5d4662c..f117d06 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_USERAGENT 3 "December 21, 2016" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_USERAGENT 3 "December 21, 2016" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_USERAGENT \- set HTTP user-agent header
index 2cfb5e4..3d966a5 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_USERNAME 3 "May 05, 2017" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_USERNAME 3 "May 05, 2017" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_USERNAME \- user name to use in authentication
index c12d4d7..362fcf0 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_USERPWD 3 "August 24, 2017" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_USERPWD 3 "August 24, 2017" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_USERPWD \- user name and password to use in authentication
index 070410f..6fc9fe3 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_USE_SSL 3 "October 10, 2018" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_USE_SSL 3 "October 10, 2018" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_USE_SSL \- request using SSL / TLS for the transfer
index 0d3c418..8cdda59 100644 (file)
@@ -5,7 +5,7 @@
 .\" *                            | (__| |_| |  _ <| |___
 .\" *                             \___|\___/|_| \_\_____|
 .\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 .\" *
 .\" * This software is licensed as described in the file COPYING, which
 .\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_VERBOSE 3 "February 03, 2016" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_VERBOSE 3 "December 04, 2019" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_VERBOSE \- set verbose mode on/off
@@ -62,3 +62,4 @@ Always
 Returns CURLE_OK
 .SH "SEE ALSO"
 .BR CURLOPT_STDERR "(3), " CURLOPT_DEBUGFUNCTION "(3), "
+.BR CURLOPT_ERRORBUFFER "(3), "
index 8691676..700f8db 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_WILDCARDMATCH 3 "May 18, 2018" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_WILDCARDMATCH 3 "May 18, 2018" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_WILDCARDMATCH \- enable directory wildcard transfers
index 312a327..fba489a 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_WRITEDATA 3 "August 11, 2018" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_WRITEDATA 3 "August 11, 2018" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_WRITEDATA \- custom pointer passed to the write callback
index 73ee554..5fbaf5b 100644 (file)
@@ -5,7 +5,7 @@
 .\" *                            | (__| |_| |  _ <| |___
 .\" *                             \___|\___/|_| \_\_____|
 .\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
 .\" *
 .\" * This software is licensed as described in the file COPYING, which
 .\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_WRITEFUNCTION 3 "July 24, 2018" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_WRITEFUNCTION 3 "November 23, 2018" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_WRITEFUNCTION \- set callback for writing received data
@@ -36,8 +36,10 @@ Pass a pointer to your callback function, which should match the prototype
 shown above.
 
 This callback function gets called by libcurl as soon as there is data
-received that needs to be saved.  \fIptr\fP points to the delivered data, and
-the size of that data is \fInmemb\fP; \fIsize\fP is always 1.
+received that needs to be saved. For most transfers, this callback gets called
+many times and each invoke delivers another chunk of data. \fIptr\fP points to
+the delivered data, and the size of that data is \fInmemb\fP; \fIsize\fP is
+always 1.
 
 The callback function will be passed as much data as possible in all invokes,
 but you must not make any assumptions. It may be one byte, it may be
index 0e03d5a..ef6c4e6 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_XFERINFODATA 3 "October 09, 2017" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_XFERINFODATA 3 "October 09, 2017" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_XFERINFODATA \- custom pointer passed to the progress callback
index 49856fd..34cbff7 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_XFERINFOFUNCTION 3 "February 03, 2016" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_XFERINFOFUNCTION 3 "November 26, 2019" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_XFERINFOFUNCTION \- callback to progress meter function
@@ -58,8 +58,11 @@ Unknown/unused argument values passed to the callback will be set to zero
 the callback will be called one or more times first, before it knows the data
 sizes so a program must be made to handle that.
 
-Returning a non-zero value from this callback will cause libcurl to abort the
-transfer and return \fICURLE_ABORTED_BY_CALLBACK\fP.
+If your callback function returns CURL_PROGRESSFUNC_CONTINUE it will cause
+libcurl to continue executing the default progress function.
+
+Returning any other non-zero value from this callback will cause libcurl to
+abort the transfer and return \fICURLE_ABORTED_BY_CALLBACK\fP.
 
 If you transfer data with the multi interface, this function will not be
 called during periods of idleness unless you call the appropriate libcurl
index b12ef2f..b4b0329 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_XOAUTH2_BEARER 3 "May 22, 2018" "libcurl 7.62.0" "curl_easy_setopt options"
+.TH CURLOPT_XOAUTH2_BEARER 3 "May 22, 2018" "libcurl 7.68.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_XOAUTH2_BEARER \- specify OAuth 2.0 access token
index 20fdb62..fa31d9d 100644 (file)
@@ -113,8 +113,7 @@ build_triplet = @build@
 host_triplet = @host@
 subdir = docs/libcurl/opts
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/ax_code_coverage.m4 \
-       $(top_srcdir)/m4/ax_compile_check_sizeof.m4 \
+am__aclocal_m4_deps = $(top_srcdir)/m4/ax_compile_check_sizeof.m4 \
        $(top_srcdir)/m4/curl-compilers.m4 \
        $(top_srcdir)/m4/curl-confopts.m4 \
        $(top_srcdir)/m4/curl-functions.m4 \
@@ -208,12 +207,6 @@ CC = @CC@
 CCDEPMODE = @CCDEPMODE@
 CFLAGS = @CFLAGS@
 CFLAG_CURL_SYMBOL_HIDING = @CFLAG_CURL_SYMBOL_HIDING@
-CODE_COVERAGE_CFLAGS = @CODE_COVERAGE_CFLAGS@
-CODE_COVERAGE_CPPFLAGS = @CODE_COVERAGE_CPPFLAGS@
-CODE_COVERAGE_CXXFLAGS = @CODE_COVERAGE_CXXFLAGS@
-CODE_COVERAGE_ENABLED = @CODE_COVERAGE_ENABLED@
-CODE_COVERAGE_LDFLAGS = @CODE_COVERAGE_LDFLAGS@
-CODE_COVERAGE_LIBS = @CODE_COVERAGE_LIBS@
 CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
@@ -255,14 +248,15 @@ ENABLE_SHARED = @ENABLE_SHARED@
 ENABLE_STATIC = @ENABLE_STATIC@
 EXEEXT = @EXEEXT@
 FGREP = @FGREP@
+FISH_FUNCTIONS_DIR = @FISH_FUNCTIONS_DIR@
 GCOV = @GCOV@
-GENHTML = @GENHTML@
 GREP = @GREP@
 HAVE_BROTLI = @HAVE_BROTLI@
 HAVE_GNUTLS_SRP = @HAVE_GNUTLS_SRP@
 HAVE_LDAP_SSL = @HAVE_LDAP_SSL@
 HAVE_LIBZ = @HAVE_LIBZ@
 HAVE_OPENSSL_SRP = @HAVE_OPENSSL_SRP@
+HAVE_PROTO_BSDSOCKET_H = @HAVE_PROTO_BSDSOCKET_H@
 IDN_ENABLED = @IDN_ENABLED@
 INSTALL = @INSTALL@
 INSTALL_DATA = @INSTALL_DATA@
@@ -323,9 +317,7 @@ STRIP = @STRIP@
 SUPPORT_FEATURES = @SUPPORT_FEATURES@
 SUPPORT_PROTOCOLS = @SUPPORT_PROTOCOLS@
 USE_ARES = @USE_ARES@
-USE_AXTLS = @USE_AXTLS@
-USE_CYASSL = @USE_CYASSL@
-USE_DARWINSSL = @USE_DARWINSSL@
+USE_BEARSSL = @USE_BEARSSL@
 USE_GNUTLS = @USE_GNUTLS@
 USE_GNUTLS_NETTLE = @USE_GNUTLS_NETTLE@
 USE_LIBRTMP = @USE_LIBRTMP@
@@ -334,12 +326,17 @@ USE_LIBSSH2 = @USE_LIBSSH2@
 USE_MBEDTLS = @USE_MBEDTLS@
 USE_MESALINK = @USE_MESALINK@
 USE_NGHTTP2 = @USE_NGHTTP2@
+USE_NGHTTP3 = @USE_NGHTTP3@
+USE_NGTCP2 = @USE_NGTCP2@
+USE_NGTCP2_CRYPTO_OPENSSL = @USE_NGTCP2_CRYPTO_OPENSSL@
 USE_NSS = @USE_NSS@
 USE_OPENLDAP = @USE_OPENLDAP@
-USE_POLARSSL = @USE_POLARSSL@
+USE_QUICHE = @USE_QUICHE@
 USE_SCHANNEL = @USE_SCHANNEL@
+USE_SECTRANSP = @USE_SECTRANSP@
 USE_UNIX_SOCKETS = @USE_UNIX_SOCKETS@
 USE_WINDOWS_SSPI = @USE_WINDOWS_SSPI@
+USE_WOLFSSL = @USE_WOLFSSL@
 VERSION = @VERSION@
 VERSIONNUM = @VERSIONNUM@
 ZLIB_LIBS = @ZLIB_LIBS@
@@ -443,6 +440,7 @@ man_MANS = \
   CURLINFO_REDIRECT_URL.3                       \
   CURLINFO_REQUEST_SIZE.3                       \
   CURLINFO_RESPONSE_CODE.3                      \
+  CURLINFO_RETRY_AFTER.3                        \
   CURLINFO_RTSP_CLIENT_CSEQ.3                   \
   CURLINFO_RTSP_CSEQ_RECV.3                     \
   CURLINFO_RTSP_SERVER_CSEQ.3                   \
@@ -467,6 +465,7 @@ man_MANS = \
   CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE.3          \
   CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE.3        \
   CURLMOPT_MAXCONNECTS.3                        \
+  CURLMOPT_MAX_CONCURRENT_STREAMS.3             \
   CURLMOPT_MAX_HOST_CONNECTIONS.3               \
   CURLMOPT_MAX_PIPELINE_LENGTH.3                \
   CURLMOPT_MAX_TOTAL_CONNECTIONS.3              \
@@ -483,6 +482,8 @@ man_MANS = \
   CURLOPT_ACCEPTTIMEOUT_MS.3                    \
   CURLOPT_ACCEPT_ENCODING.3                     \
   CURLOPT_ADDRESS_SCOPE.3                       \
+  CURLOPT_ALTSVC.3                              \
+  CURLOPT_ALTSVC_CTRL.3                         \
   CURLOPT_APPEND.3                              \
   CURLOPT_AUTOREFERER.3                         \
   CURLOPT_BUFFERSIZE.3                          \
@@ -494,7 +495,6 @@ man_MANS = \
   CURLOPT_CHUNK_END_FUNCTION.3                  \
   CURLOPT_CLOSESOCKETDATA.3                     \
   CURLOPT_CLOSESOCKETFUNCTION.3                 \
-  CURLOPT_UPKEEP_INTERVAL_MS.3             \
   CURLOPT_CONNECTTIMEOUT.3                      \
   CURLOPT_CONNECTTIMEOUT_MS.3                   \
   CURLOPT_CONNECT_ONLY.3                        \
@@ -510,6 +510,7 @@ man_MANS = \
   CURLOPT_COPYPOSTFIELDS.3                      \
   CURLOPT_CRLF.3                                \
   CURLOPT_CRLFILE.3                             \
+  CURLOPT_CURLU.3                               \
   CURLOPT_CUSTOMREQUEST.3                       \
   CURLOPT_DEBUGDATA.3                           \
   CURLOPT_DEBUGFUNCTION.3                       \
@@ -553,6 +554,7 @@ man_MANS = \
   CURLOPT_HEADERDATA.3                          \
   CURLOPT_HEADERFUNCTION.3                      \
   CURLOPT_HEADEROPT.3                           \
+  CURLOPT_HTTP09_ALLOWED.3                      \
   CURLOPT_HTTP200ALIASES.3                      \
   CURLOPT_HTTPAUTH.3                            \
   CURLOPT_HTTPGET.3                             \
@@ -583,6 +585,7 @@ man_MANS = \
   CURLOPT_MAIL_AUTH.3                           \
   CURLOPT_MAIL_FROM.3                           \
   CURLOPT_MAIL_RCPT.3                           \
+  CURLOPT_MAXAGE_CONN.3                         \
   CURLOPT_MAXCONNECTS.3                         \
   CURLOPT_MAXFILESIZE.3                         \
   CURLOPT_MAXFILESIZE_LARGE.3                   \
@@ -665,6 +668,7 @@ man_MANS = \
   CURLOPT_RTSP_SESSION_ID.3                     \
   CURLOPT_RTSP_STREAM_URI.3                     \
   CURLOPT_RTSP_TRANSPORT.3                      \
+  CURLOPT_SASL_AUTHZID.3                        \
   CURLOPT_SASL_IR.3                             \
   CURLOPT_SEEKDATA.3                            \
   CURLOPT_SEEKFUNCTION.3                        \
@@ -723,10 +727,13 @@ man_MANS = \
   CURLOPT_TLSAUTH_PASSWORD.3                    \
   CURLOPT_TLSAUTH_TYPE.3                        \
   CURLOPT_TLSAUTH_USERNAME.3                    \
+  CURLOPT_TRAILERDATA.3                         \
+  CURLOPT_TRAILERFUNCTION.3                     \
   CURLOPT_TRANSFERTEXT.3                        \
   CURLOPT_TRANSFER_ENCODING.3                   \
   CURLOPT_UNIX_SOCKET_PATH.3                    \
   CURLOPT_UNRESTRICTED_AUTH.3                   \
+  CURLOPT_UPKEEP_INTERVAL_MS.3                  \
   CURLOPT_UPLOAD.3                              \
   CURLOPT_UPLOAD_BUFFERSIZE.3                   \
   CURLOPT_URL.3                                 \
index 117842d..93c4357 100644 (file)
@@ -43,6 +43,7 @@ man_MANS =                                      \
   CURLINFO_REDIRECT_URL.3                       \
   CURLINFO_REQUEST_SIZE.3                       \
   CURLINFO_RESPONSE_CODE.3                      \
+  CURLINFO_RETRY_AFTER.3                        \
   CURLINFO_RTSP_CLIENT_CSEQ.3                   \
   CURLINFO_RTSP_CSEQ_RECV.3                     \
   CURLINFO_RTSP_SERVER_CSEQ.3                   \
@@ -67,6 +68,7 @@ man_MANS =                                      \
   CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE.3          \
   CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE.3        \
   CURLMOPT_MAXCONNECTS.3                        \
+  CURLMOPT_MAX_CONCURRENT_STREAMS.3             \
   CURLMOPT_MAX_HOST_CONNECTIONS.3               \
   CURLMOPT_MAX_PIPELINE_LENGTH.3                \
   CURLMOPT_MAX_TOTAL_CONNECTIONS.3              \
@@ -83,6 +85,8 @@ man_MANS =                                      \
   CURLOPT_ACCEPTTIMEOUT_MS.3                    \
   CURLOPT_ACCEPT_ENCODING.3                     \
   CURLOPT_ADDRESS_SCOPE.3                       \
+  CURLOPT_ALTSVC.3                              \
+  CURLOPT_ALTSVC_CTRL.3                         \
   CURLOPT_APPEND.3                              \
   CURLOPT_AUTOREFERER.3                         \
   CURLOPT_BUFFERSIZE.3                          \
@@ -94,7 +98,6 @@ man_MANS =                                      \
   CURLOPT_CHUNK_END_FUNCTION.3                  \
   CURLOPT_CLOSESOCKETDATA.3                     \
   CURLOPT_CLOSESOCKETFUNCTION.3                 \
-  CURLOPT_UPKEEP_INTERVAL_MS.3             \
   CURLOPT_CONNECTTIMEOUT.3                      \
   CURLOPT_CONNECTTIMEOUT_MS.3                   \
   CURLOPT_CONNECT_ONLY.3                        \
@@ -110,6 +113,7 @@ man_MANS =                                      \
   CURLOPT_COPYPOSTFIELDS.3                      \
   CURLOPT_CRLF.3                                \
   CURLOPT_CRLFILE.3                             \
+  CURLOPT_CURLU.3                               \
   CURLOPT_CUSTOMREQUEST.3                       \
   CURLOPT_DEBUGDATA.3                           \
   CURLOPT_DEBUGFUNCTION.3                       \
@@ -153,6 +157,7 @@ man_MANS =                                      \
   CURLOPT_HEADERDATA.3                          \
   CURLOPT_HEADERFUNCTION.3                      \
   CURLOPT_HEADEROPT.3                           \
+  CURLOPT_HTTP09_ALLOWED.3                      \
   CURLOPT_HTTP200ALIASES.3                      \
   CURLOPT_HTTPAUTH.3                            \
   CURLOPT_HTTPGET.3                             \
@@ -183,6 +188,7 @@ man_MANS =                                      \
   CURLOPT_MAIL_AUTH.3                           \
   CURLOPT_MAIL_FROM.3                           \
   CURLOPT_MAIL_RCPT.3                           \
+  CURLOPT_MAXAGE_CONN.3                         \
   CURLOPT_MAXCONNECTS.3                         \
   CURLOPT_MAXFILESIZE.3                         \
   CURLOPT_MAXFILESIZE_LARGE.3                   \
@@ -265,6 +271,7 @@ man_MANS =                                      \
   CURLOPT_RTSP_SESSION_ID.3                     \
   CURLOPT_RTSP_STREAM_URI.3                     \
   CURLOPT_RTSP_TRANSPORT.3                      \
+  CURLOPT_SASL_AUTHZID.3                        \
   CURLOPT_SASL_IR.3                             \
   CURLOPT_SEEKDATA.3                            \
   CURLOPT_SEEKFUNCTION.3                        \
@@ -323,10 +330,13 @@ man_MANS =                                      \
   CURLOPT_TLSAUTH_PASSWORD.3                    \
   CURLOPT_TLSAUTH_TYPE.3                        \
   CURLOPT_TLSAUTH_USERNAME.3                    \
+  CURLOPT_TRAILERDATA.3                         \
+  CURLOPT_TRAILERFUNCTION.3                     \
   CURLOPT_TRANSFERTEXT.3                        \
   CURLOPT_TRANSFER_ENCODING.3                   \
   CURLOPT_UNIX_SOCKET_PATH.3                    \
   CURLOPT_UNRESTRICTED_AUTH.3                   \
+  CURLOPT_UPKEEP_INTERVAL_MS.3                  \
   CURLOPT_UPLOAD.3                              \
   CURLOPT_UPLOAD_BUFFERSIZE.3                   \
   CURLOPT_URL.3                                 \
index fa0d6f7..18f04bd 100644 (file)
 
  Name                           Introduced  Deprecated  Removed
 
+CURLALTSVC_H1                   7.64.1
+CURLALTSVC_H2                   7.64.1
+CURLALTSVC_H3                   7.64.1
+CURLALTSVC_IMMEDIATELY          7.64.1
+CURLALTSVC_READONLYFILE         7.64.1
 CURLAUTH_ANY                    7.10.6
 CURLAUTH_ANYSAFE                7.10.6
 CURLAUTH_BASIC                  7.10.6
@@ -33,7 +38,8 @@ CURLCLOSEPOLICY_OLDEST          7.7
 CURLCLOSEPOLICY_SLOWEST         7.7
 CURLE_ABORTED_BY_CALLBACK       7.1
 CURLE_AGAIN                     7.18.2
-CURLE_ALREADY_COMPLETE          7.7.2
+CURLE_ALREADY_COMPLETE          7.7.2         7.8
+CURLE_AUTH_ERROR                7.66.0
 CURLE_BAD_CALLING_ORDER         7.1           7.17.0
 CURLE_BAD_CONTENT_ENCODING      7.10
 CURLE_BAD_DOWNLOAD_RESUME       7.10
@@ -50,7 +56,7 @@ CURLE_FILESIZE_EXCEEDED         7.10.8
 CURLE_FILE_COULDNT_READ_FILE    7.1
 CURLE_FTP_ACCEPT_FAILED         7.24.0
 CURLE_FTP_ACCEPT_TIMEOUT        7.24.0
-CURLE_FTP_ACCESS_DENIED         7.1
+CURLE_FTP_ACCESS_DENIED         7.1           7.17.0
 CURLE_FTP_BAD_DOWNLOAD_RESUME   7.1           7.1
 CURLE_FTP_BAD_FILE_LIST         7.21.0
 CURLE_FTP_CANT_GET_HOST         7.1
@@ -60,7 +66,7 @@ CURLE_FTP_COULDNT_RETR_FILE     7.1
 CURLE_FTP_COULDNT_SET_ASCII     7.1           7.17.0
 CURLE_FTP_COULDNT_SET_BINARY    7.1           7.17.0
 CURLE_FTP_COULDNT_SET_TYPE      7.17.0
-CURLE_FTP_COULDNT_STOR_FILE     7.1
+CURLE_FTP_COULDNT_STOR_FILE     7.1           7.16.3
 CURLE_FTP_COULDNT_USE_REST      7.1
 CURLE_FTP_PARTIAL_FILE          7.1           7.1
 CURLE_FTP_PORT_FAILED           7.1
@@ -71,14 +77,15 @@ CURLE_FTP_USER_PASSWORD_INCORRECT 7.1         7.17.0
 CURLE_FTP_WEIRD_227_FORMAT      7.1
 CURLE_FTP_WEIRD_PASS_REPLY      7.1
 CURLE_FTP_WEIRD_PASV_REPLY      7.1
-CURLE_FTP_WEIRD_SERVER_REPLY    7.1
+CURLE_FTP_WEIRD_SERVER_REPLY    7.1           7.51.0
 CURLE_FTP_WEIRD_USER_REPLY      7.1           7.17.0
 CURLE_FTP_WRITE_ERROR           7.1           7.17.0
 CURLE_FUNCTION_NOT_FOUND        7.1
 CURLE_GOT_NOTHING               7.9.1
 CURLE_HTTP2                     7.38.0
 CURLE_HTTP2_STREAM              7.49.0
-CURLE_HTTP_NOT_FOUND            7.1
+CURLE_HTTP3                     7.68.0
+CURLE_HTTP_NOT_FOUND            7.1           7.10.3
 CURLE_HTTP_PORT_FAILED          7.3           7.12.0
 CURLE_HTTP_POST_ERROR           7.1
 CURLE_HTTP_RANGE_ERROR          7.1           7.17.0
@@ -137,7 +144,7 @@ CURLE_TFTP_PERM                 7.15.0
 CURLE_TFTP_UNKNOWNID            7.15.0
 CURLE_TOO_MANY_REDIRECTS        7.5
 CURLE_UNKNOWN_OPTION            7.21.5
-CURLE_UNKNOWN_TELNET_OPTION     7.7
+CURLE_UNKNOWN_TELNET_OPTION     7.7           7.21.5
 CURLE_UNSUPPORTED_PROTOCOL      7.1
 CURLE_UPLOAD_FAILED             7.16.3
 CURLE_URL_MALFORMAT             7.1
@@ -260,6 +267,7 @@ CURLINFO_REDIRECT_TIME_T        7.61.0
 CURLINFO_REDIRECT_URL           7.18.2
 CURLINFO_REQUEST_SIZE           7.4.1
 CURLINFO_RESPONSE_CODE          7.10.8
+CURLINFO_RETRY_AFTER            7.66.0
 CURLINFO_RTSP_CLIENT_CSEQ       7.20.0
 CURLINFO_RTSP_CSEQ_RECV         7.20.0
 CURLINFO_RTSP_SERVER_CSEQ       7.20.0
@@ -312,6 +320,7 @@ CURLMOPT_MAXCONNECTS            7.16.3
 CURLMOPT_MAX_HOST_CONNECTIONS   7.30.0
 CURLMOPT_MAX_PIPELINE_LENGTH    7.30.0
 CURLMOPT_MAX_TOTAL_CONNECTIONS  7.30.0
+CURLMOPT_MAX_CONCURRENT_STREAMS  7.67.0
 CURLMOPT_PIPELINING             7.16.0
 CURLMOPT_PIPELINING_SERVER_BL   7.30.0
 CURLMOPT_PIPELINING_SITE_BL     7.30.0
@@ -333,16 +342,20 @@ CURLM_INTERNAL_ERROR            7.9.6
 CURLM_OK                        7.9.6
 CURLM_OUT_OF_MEMORY             7.9.6
 CURLM_RECURSIVE_API_CALL        7.59.0
+CURLM_WAKEUP_FAILURE            7.68.0
 CURLM_UNKNOWN_OPTION            7.15.4
 CURLOPTTYPE_FUNCTIONPOINT       7.1
 CURLOPTTYPE_LONG                7.1
 CURLOPTTYPE_OBJECTPOINT         7.1
 CURLOPTTYPE_OFF_T               7.11.0
 CURLOPTTYPE_STRINGPOINT         7.46.0
+CURLOPTTYPE_SLISTPOINT          7.65.2
 CURLOPT_ABSTRACT_UNIX_SOCKET    7.53.0
 CURLOPT_ACCEPTTIMEOUT_MS        7.24.0
 CURLOPT_ACCEPT_ENCODING         7.21.6
 CURLOPT_ADDRESS_SCOPE           7.19.0
+CURLOPT_ALTSVC                  7.64.1
+CURLOPT_ALTSVC_CTRL             7.64.1
 CURLOPT_APPEND                  7.17.0
 CURLOPT_AUTOREFERER             7.1
 CURLOPT_BUFFERSIZE              7.10
@@ -356,7 +369,6 @@ CURLOPT_CLOSEFUNCTION           7.7           7.11.1      7.15.5
 CURLOPT_CLOSEPOLICY             7.7           7.16.1
 CURLOPT_CLOSESOCKETDATA         7.21.7
 CURLOPT_CLOSESOCKETFUNCTION     7.21.7
-CURLOPT_UPKEEP_INTERVAL_MS 7.62.0
 CURLOPT_CONNECTTIMEOUT          7.7
 CURLOPT_CONNECTTIMEOUT_MS       7.16.2
 CURLOPT_CONNECT_ONLY            7.15.2
@@ -372,6 +384,7 @@ CURLOPT_COOKIESESSION           7.9.7
 CURLOPT_COPYPOSTFIELDS          7.17.1
 CURLOPT_CRLF                    7.1
 CURLOPT_CRLFILE                 7.19.0
+CURLOPT_CURLU                   7.63.0
 CURLOPT_CUSTOMREQUEST           7.1
 CURLOPT_DEBUGDATA               7.9.6
 CURLOPT_DEBUGFUNCTION           7.9.6
@@ -421,6 +434,7 @@ CURLOPT_HEADER                  7.1
 CURLOPT_HEADERDATA              7.10
 CURLOPT_HEADERFUNCTION          7.7.2
 CURLOPT_HEADEROPT               7.37.0
+CURLOPT_HTTP09_ALLOWED          7.64.0
 CURLOPT_HTTP200ALIASES          7.10.3
 CURLOPT_HTTPAUTH                7.10.6
 CURLOPT_HTTPGET                 7.8.1
@@ -454,6 +468,7 @@ CURLOPT_LOW_SPEED_TIME          7.1
 CURLOPT_MAIL_AUTH               7.25.0
 CURLOPT_MAIL_FROM               7.20.0
 CURLOPT_MAIL_RCPT               7.20.0
+CURLOPT_MAXAGE_CONN             7.65.0
 CURLOPT_MAXCONNECTS             7.7
 CURLOPT_MAXFILESIZE             7.10.8
 CURLOPT_MAXFILESIZE_LARGE       7.11.0
@@ -543,6 +558,7 @@ CURLOPT_RTSP_SERVER_CSEQ        7.20.0
 CURLOPT_RTSP_SESSION_ID         7.20.0
 CURLOPT_RTSP_STREAM_URI         7.20.0
 CURLOPT_RTSP_TRANSPORT          7.20.0
+CURLOPT_SASL_AUTHZID            7.66.0
 CURLOPT_SASL_IR                 7.31.0
 CURLOPT_SEEKDATA                7.18.0
 CURLOPT_SEEKFUNCTION            7.18.0
@@ -612,10 +628,13 @@ CURLOPT_TLS13_CIPHERS           7.61.0
 CURLOPT_TLSAUTH_PASSWORD        7.21.4
 CURLOPT_TLSAUTH_TYPE            7.21.4
 CURLOPT_TLSAUTH_USERNAME        7.21.4
+CURLOPT_TRAILERDATA             7.64.0
+CURLOPT_TRAILERFUNCTION         7.64.0
 CURLOPT_TRANSFERTEXT            7.1.1
 CURLOPT_TRANSFER_ENCODING       7.21.6
 CURLOPT_UNIX_SOCKET_PATH        7.40.0
 CURLOPT_UNRESTRICTED_AUTH       7.10.4
+CURLOPT_UPKEEP_INTERVAL_MS 7.62.0
 CURLOPT_UPLOAD                  7.1
 CURLOPT_UPLOAD_BUFFERSIZE       7.62.0
 CURLOPT_URL                     7.1
@@ -700,10 +719,11 @@ CURLSSH_AUTH_KEYBOARD           7.16.1
 CURLSSH_AUTH_NONE               7.16.1
 CURLSSH_AUTH_PASSWORD           7.16.1
 CURLSSH_AUTH_PUBLICKEY          7.16.1
-CURLSSLBACKEND_AXTLS            7.38.0
+CURLSSLBACKEND_AXTLS            7.38.0       7.61.0
+CURLSSLBACKEND_BEARSSL          7.68.0
 CURLSSLBACKEND_BORINGSSL        7.49.0
 CURLSSLBACKEND_CYASSL           7.34.0
-CURLSSLBACKEND_DARWINSSL        7.34.0
+CURLSSLBACKEND_DARWINSSL        7.34.0       7.64.1
 CURLSSLBACKEND_GNUTLS           7.34.0
 CURLSSLBACKEND_GSKIT            7.34.0
 CURLSSLBACKEND_LIBRESSL         7.49.0
@@ -715,23 +735,15 @@ CURLSSLBACKEND_OPENSSL          7.34.0
 CURLSSLBACKEND_POLARSSL         7.34.0
 CURLSSLBACKEND_QSOSSL           7.34.0        -           7.38.1
 CURLSSLBACKEND_SCHANNEL         7.34.0
+CURLSSLBACKEND_SECURETRANSPORT  7.64.1
 CURLSSLBACKEND_WOLFSSL          7.49.0
 CURLSSLOPT_ALLOW_BEAST          7.25.0
+CURLSSLOPT_NO_PARTIALCHAIN      7.68.0
 CURLSSLOPT_NO_REVOKE            7.44.0
 CURLSSLSET_NO_BACKENDS          7.56.0
 CURLSSLSET_OK                   7.56.0
 CURLSSLSET_TOO_LATE             7.56.0
 CURLSSLSET_UNKNOWN_BACKEND      7.56.0
-CURLUPART_FRAGMENT              7.62.0
-CURLUPART_HOST                  7.62.0
-CURLUPART_OPTIONS               7.62.0
-CURLUPART_PASSWORD              7.62.0
-CURLUPART_PATH                  7.62.0
-CURLUPART_PORT                  7.62.0
-CURLUPART_QUERY                 7.62.0
-CURLUPART_SCHEME                7.62.0
-CURLUPART_URL                   7.62.0
-CURLUPART_USER                  7.62.0
 CURLUE_BAD_HANDLE               7.62.0
 CURLUE_BAD_PARTPOINTER          7.62.0
 CURLUE_BAD_PORT_NUMBER          7.62.0
@@ -750,16 +762,39 @@ CURLUE_UNKNOWN_PART             7.62.0
 CURLUE_UNSUPPORTED_SCHEME       7.62.0
 CURLUE_URLDECODE                7.62.0
 CURLUE_USER_NOT_ALLOWED         7.62.0
+CURLUPART_FRAGMENT              7.62.0
+CURLUPART_HOST                  7.62.0
+CURLUPART_OPTIONS               7.62.0
+CURLUPART_PASSWORD              7.62.0
+CURLUPART_PATH                  7.62.0
+CURLUPART_PORT                  7.62.0
+CURLUPART_QUERY                 7.62.0
+CURLUPART_SCHEME                7.62.0
+CURLUPART_URL                   7.62.0
+CURLUPART_USER                  7.62.0
+CURLUPART_ZONEID                7.65.0
 CURLUSESSL_ALL                  7.17.0
 CURLUSESSL_CONTROL              7.17.0
 CURLUSESSL_NONE                 7.17.0
 CURLUSESSL_TRY                  7.17.0
+CURLU_APPENDQUERY               7.62.0
+CURLU_DEFAULT_PORT              7.62.0
+CURLU_DEFAULT_SCHEME            7.62.0
+CURLU_DISALLOW_USER             7.62.0
+CURLU_GUESS_SCHEME              7.62.0
+CURLU_NON_SUPPORT_SCHEME        7.62.0
+CURLU_NO_DEFAULT_PORT           7.62.0
+CURLU_NO_AUTHORITY              7.67.0
+CURLU_PATH_AS_IS                7.62.0
+CURLU_URLDECODE                 7.62.0
+CURLU_URLENCODE                 7.62.0
 CURLVERSION_FIFTH               7.57.0
 CURLVERSION_FIRST               7.10
 CURLVERSION_FOURTH              7.16.1
 CURLVERSION_NOW                 7.10
 CURLVERSION_SECOND              7.11.1
 CURLVERSION_THIRD               7.12.0
+CURLVERSION_SIXTH               7.66.0
 CURL_CHUNK_BGN_FUNC_FAIL        7.21.0
 CURL_CHUNK_BGN_FUNC_OK          7.21.0
 CURL_CHUNK_BGN_FUNC_SKIP        7.21.0
@@ -804,6 +839,7 @@ CURL_HTTP_VERSION_2             7.43.0
 CURL_HTTP_VERSION_2TLS          7.47.0
 CURL_HTTP_VERSION_2_0           7.33.0
 CURL_HTTP_VERSION_2_PRIOR_KNOWLEDGE 7.49.0
+CURL_HTTP_VERSION_3             7.66.0
 CURL_HTTP_VERSION_NONE          7.9.1
 CURL_IPRESOLVE_V4               7.10.8
 CURL_IPRESOLVE_V6               7.10.8
@@ -834,6 +870,7 @@ CURL_POLL_INOUT                 7.14.0
 CURL_POLL_NONE                  7.14.0
 CURL_POLL_OUT                   7.14.0
 CURL_POLL_REMOVE                7.14.0
+CURL_PROGRESSFUNC_CONTINUE      7.68.0
 CURL_PROGRESS_BAR               7.1.1         -           7.4.1
 CURL_PROGRESS_STATS             7.1.1         -           7.4.1
 CURL_PUSH_DENY                  7.44.0
@@ -886,15 +923,20 @@ CURL_TIMECOND_LASTMOD           7.9.7
 CURL_TIMECOND_NONE              7.9.7
 CURL_TLSAUTH_NONE               7.21.4
 CURL_TLSAUTH_SRP                7.21.4
+CURL_TRAILERFUNC_ABORT          7.64.0
+CURL_TRAILERFUNC_OK             7.64.0
 CURL_UPKEEP_INTERVAL_DEFAULT    7.62.0
+CURL_VERSION_ALTSVC             7.64.1
 CURL_VERSION_ASYNCHDNS          7.10.7
 CURL_VERSION_BROTLI             7.57.0
 CURL_VERSION_CONV               7.15.4
 CURL_VERSION_CURLDEBUG          7.19.6
 CURL_VERSION_DEBUG              7.10.6
+CURL_VERSION_ESNI               7.67.0
 CURL_VERSION_GSSAPI             7.38.0
 CURL_VERSION_GSSNEGOTIATE       7.10.6        7.38.0
 CURL_VERSION_HTTP2              7.33.0
+CURL_VERSION_HTTP3              7.66.0
 CURL_VERSION_HTTPS_PROXY        7.52.0
 CURL_VERSION_IDN                7.12.0
 CURL_VERSION_IPV6               7.10
index a9cfe56..affbe72 100644 (file)
@@ -89,8 +89,7 @@ build_triplet = @build@
 host_triplet = @host@
 subdir = include
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/ax_code_coverage.m4 \
-       $(top_srcdir)/m4/ax_compile_check_sizeof.m4 \
+am__aclocal_m4_deps = $(top_srcdir)/m4/ax_compile_check_sizeof.m4 \
        $(top_srcdir)/m4/curl-compilers.m4 \
        $(top_srcdir)/m4/curl-confopts.m4 \
        $(top_srcdir)/m4/curl-functions.m4 \
@@ -214,12 +213,6 @@ CC = @CC@
 CCDEPMODE = @CCDEPMODE@
 CFLAGS = @CFLAGS@
 CFLAG_CURL_SYMBOL_HIDING = @CFLAG_CURL_SYMBOL_HIDING@
-CODE_COVERAGE_CFLAGS = @CODE_COVERAGE_CFLAGS@
-CODE_COVERAGE_CPPFLAGS = @CODE_COVERAGE_CPPFLAGS@
-CODE_COVERAGE_CXXFLAGS = @CODE_COVERAGE_CXXFLAGS@
-CODE_COVERAGE_ENABLED = @CODE_COVERAGE_ENABLED@
-CODE_COVERAGE_LDFLAGS = @CODE_COVERAGE_LDFLAGS@
-CODE_COVERAGE_LIBS = @CODE_COVERAGE_LIBS@
 CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
@@ -261,14 +254,15 @@ ENABLE_SHARED = @ENABLE_SHARED@
 ENABLE_STATIC = @ENABLE_STATIC@
 EXEEXT = @EXEEXT@
 FGREP = @FGREP@
+FISH_FUNCTIONS_DIR = @FISH_FUNCTIONS_DIR@
 GCOV = @GCOV@
-GENHTML = @GENHTML@
 GREP = @GREP@
 HAVE_BROTLI = @HAVE_BROTLI@
 HAVE_GNUTLS_SRP = @HAVE_GNUTLS_SRP@
 HAVE_LDAP_SSL = @HAVE_LDAP_SSL@
 HAVE_LIBZ = @HAVE_LIBZ@
 HAVE_OPENSSL_SRP = @HAVE_OPENSSL_SRP@
+HAVE_PROTO_BSDSOCKET_H = @HAVE_PROTO_BSDSOCKET_H@
 IDN_ENABLED = @IDN_ENABLED@
 INSTALL = @INSTALL@
 INSTALL_DATA = @INSTALL_DATA@
@@ -329,9 +323,7 @@ STRIP = @STRIP@
 SUPPORT_FEATURES = @SUPPORT_FEATURES@
 SUPPORT_PROTOCOLS = @SUPPORT_PROTOCOLS@
 USE_ARES = @USE_ARES@
-USE_AXTLS = @USE_AXTLS@
-USE_CYASSL = @USE_CYASSL@
-USE_DARWINSSL = @USE_DARWINSSL@
+USE_BEARSSL = @USE_BEARSSL@
 USE_GNUTLS = @USE_GNUTLS@
 USE_GNUTLS_NETTLE = @USE_GNUTLS_NETTLE@
 USE_LIBRTMP = @USE_LIBRTMP@
@@ -340,12 +332,17 @@ USE_LIBSSH2 = @USE_LIBSSH2@
 USE_MBEDTLS = @USE_MBEDTLS@
 USE_MESALINK = @USE_MESALINK@
 USE_NGHTTP2 = @USE_NGHTTP2@
+USE_NGHTTP3 = @USE_NGHTTP3@
+USE_NGTCP2 = @USE_NGTCP2@
+USE_NGTCP2_CRYPTO_OPENSSL = @USE_NGTCP2_CRYPTO_OPENSSL@
 USE_NSS = @USE_NSS@
 USE_OPENLDAP = @USE_OPENLDAP@
-USE_POLARSSL = @USE_POLARSSL@
+USE_QUICHE = @USE_QUICHE@
 USE_SCHANNEL = @USE_SCHANNEL@
+USE_SECTRANSP = @USE_SECTRANSP@
 USE_UNIX_SOCKETS = @USE_UNIX_SOCKETS@
 USE_WINDOWS_SSPI = @USE_WINDOWS_SSPI@
+USE_WOLFSSL = @USE_WOLFSSL@
 VERSION = @VERSION@
 VERSIONNUM = @VERSIONNUM@
 ZLIB_LIBS = @ZLIB_LIBS@
index 16d97e1..a31f61b 100644 (file)
@@ -5,7 +5,7 @@
 #                            | (__| |_| |  _ <| |___
 #                             \___|\___/|_| \_\_____|
 #
-# Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 #
 # This software is licensed as described in the file COPYING, which
 # you should have received as part of this distribution. The terms
@@ -25,8 +25,13 @@ pkginclude_HEADERS = \
 
 pkgincludedir= $(includedir)/curl
 
+CHECKSRC = $(CS_$(V))
+CS_0 = @echo "  RUN     " $@;
+CS_1 =
+CS_ = $(CS_0)
+
 checksrc:
-       @@PERL@ $(top_srcdir)/lib/checksrc.pl -D$(top_srcdir)/include/curl $(pkginclude_HEADERS)
+       $(CHECKSRC)@PERL@ $(top_srcdir)/lib/checksrc.pl -D$(top_srcdir)/include/curl $(pkginclude_HEADERS)
 
 if CURLDEBUG
 # for debug builds, we scan the sources on all regular make invokes
index 978dde2..9213b6d 100644 (file)
@@ -89,8 +89,7 @@ build_triplet = @build@
 host_triplet = @host@
 subdir = include/curl
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/ax_code_coverage.m4 \
-       $(top_srcdir)/m4/ax_compile_check_sizeof.m4 \
+am__aclocal_m4_deps = $(top_srcdir)/m4/ax_compile_check_sizeof.m4 \
        $(top_srcdir)/m4/curl-compilers.m4 \
        $(top_srcdir)/m4/curl-confopts.m4 \
        $(top_srcdir)/m4/curl-functions.m4 \
@@ -201,12 +200,6 @@ CC = @CC@
 CCDEPMODE = @CCDEPMODE@
 CFLAGS = @CFLAGS@
 CFLAG_CURL_SYMBOL_HIDING = @CFLAG_CURL_SYMBOL_HIDING@
-CODE_COVERAGE_CFLAGS = @CODE_COVERAGE_CFLAGS@
-CODE_COVERAGE_CPPFLAGS = @CODE_COVERAGE_CPPFLAGS@
-CODE_COVERAGE_CXXFLAGS = @CODE_COVERAGE_CXXFLAGS@
-CODE_COVERAGE_ENABLED = @CODE_COVERAGE_ENABLED@
-CODE_COVERAGE_LDFLAGS = @CODE_COVERAGE_LDFLAGS@
-CODE_COVERAGE_LIBS = @CODE_COVERAGE_LIBS@
 CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
@@ -248,14 +241,15 @@ ENABLE_SHARED = @ENABLE_SHARED@
 ENABLE_STATIC = @ENABLE_STATIC@
 EXEEXT = @EXEEXT@
 FGREP = @FGREP@
+FISH_FUNCTIONS_DIR = @FISH_FUNCTIONS_DIR@
 GCOV = @GCOV@
-GENHTML = @GENHTML@
 GREP = @GREP@
 HAVE_BROTLI = @HAVE_BROTLI@
 HAVE_GNUTLS_SRP = @HAVE_GNUTLS_SRP@
 HAVE_LDAP_SSL = @HAVE_LDAP_SSL@
 HAVE_LIBZ = @HAVE_LIBZ@
 HAVE_OPENSSL_SRP = @HAVE_OPENSSL_SRP@
+HAVE_PROTO_BSDSOCKET_H = @HAVE_PROTO_BSDSOCKET_H@
 IDN_ENABLED = @IDN_ENABLED@
 INSTALL = @INSTALL@
 INSTALL_DATA = @INSTALL_DATA@
@@ -316,9 +310,7 @@ STRIP = @STRIP@
 SUPPORT_FEATURES = @SUPPORT_FEATURES@
 SUPPORT_PROTOCOLS = @SUPPORT_PROTOCOLS@
 USE_ARES = @USE_ARES@
-USE_AXTLS = @USE_AXTLS@
-USE_CYASSL = @USE_CYASSL@
-USE_DARWINSSL = @USE_DARWINSSL@
+USE_BEARSSL = @USE_BEARSSL@
 USE_GNUTLS = @USE_GNUTLS@
 USE_GNUTLS_NETTLE = @USE_GNUTLS_NETTLE@
 USE_LIBRTMP = @USE_LIBRTMP@
@@ -327,12 +319,17 @@ USE_LIBSSH2 = @USE_LIBSSH2@
 USE_MBEDTLS = @USE_MBEDTLS@
 USE_MESALINK = @USE_MESALINK@
 USE_NGHTTP2 = @USE_NGHTTP2@
+USE_NGHTTP3 = @USE_NGHTTP3@
+USE_NGTCP2 = @USE_NGTCP2@
+USE_NGTCP2_CRYPTO_OPENSSL = @USE_NGTCP2_CRYPTO_OPENSSL@
 USE_NSS = @USE_NSS@
 USE_OPENLDAP = @USE_OPENLDAP@
-USE_POLARSSL = @USE_POLARSSL@
+USE_QUICHE = @USE_QUICHE@
 USE_SCHANNEL = @USE_SCHANNEL@
+USE_SECTRANSP = @USE_SECTRANSP@
 USE_UNIX_SOCKETS = @USE_UNIX_SOCKETS@
 USE_WINDOWS_SSPI = @USE_WINDOWS_SSPI@
+USE_WOLFSSL = @USE_WOLFSSL@
 VERSION = @VERSION@
 VERSIONNUM = @VERSIONNUM@
 ZLIB_LIBS = @ZLIB_LIBS@
@@ -400,7 +397,7 @@ top_srcdir = @top_srcdir@
 #                            | (__| |_| |  _ <| |___
 #                             \___|\___/|_| \_\_____|
 #
-# Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 #
 # This software is licensed as described in the file COPYING, which
 # you should have received as part of this distribution. The terms
@@ -418,6 +415,10 @@ pkginclude_HEADERS = \
   curl.h curlver.h easy.h mprintf.h stdcheaders.h multi.h \
   typecheck-gcc.h system.h urlapi.h
 
+CHECKSRC = $(CS_$(V))
+CS_0 = @echo "  RUN     " $@;
+CS_1 = 
+CS_ = $(CS_0)
 all: all-am
 
 .SUFFIXES:
@@ -687,7 +688,7 @@ uninstall-am: uninstall-pkgincludeHEADERS
 
 
 checksrc:
-       @@PERL@ $(top_srcdir)/lib/checksrc.pl -D$(top_srcdir)/include/curl $(pkginclude_HEADERS)
+       $(CHECKSRC)@PERL@ $(top_srcdir)/lib/checksrc.pl -D$(top_srcdir)/include/curl $(pkginclude_HEADERS)
 
 # for debug builds, we scan the sources on all regular make invokes
 @CURLDEBUG_TRUE@all-local: checksrc
index cf6f01d..a9754fd 100644 (file)
@@ -1,5 +1,5 @@
-#ifndef __CURL_CURL_H
-#define __CURL_CURL_H
+#ifndef CURLINC_CURL_H
+#define CURLINC_CURL_H
 /***************************************************************************
  *                                  _   _ ____  _
  *  Project                     ___| | | |  _ \| |
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
 #include <support/SupportDefs.h>
 #endif
 
+/* Compatibility for non-Clang compilers */
+#ifndef __has_declspec_attribute
+#  define __has_declspec_attribute(x) 0
+#endif
+
 #ifdef  __cplusplus
 extern "C" {
 #endif
@@ -109,7 +114,9 @@ typedef void CURLSH;
 
 #ifdef CURL_STATICLIB
 #  define CURL_EXTERN
-#elif defined(WIN32) || defined(_WIN32) || defined(__SYMBIAN32__)
+#elif defined(WIN32) || defined(__SYMBIAN32__) || \
+     (__has_declspec_attribute(dllexport) && \
+      __has_declspec_attribute(dllimport))
 #  if defined(BUILDING_LIBCURL)
 #    define CURL_EXTERN  __declspec(dllexport)
 #  else
@@ -144,16 +151,20 @@ typedef enum {
   CURLSSLBACKEND_POLARSSL = 6,
   CURLSSLBACKEND_WOLFSSL = 7,
   CURLSSLBACKEND_SCHANNEL = 8,
-  CURLSSLBACKEND_DARWINSSL = 9,
-  CURLSSLBACKEND_AXTLS = 10,
+  CURLSSLBACKEND_SECURETRANSPORT = 9,
+  CURLSSLBACKEND_AXTLS = 10, /* never used since 7.63.0 */
   CURLSSLBACKEND_MBEDTLS = 11,
-  CURLSSLBACKEND_MESALINK = 12
+  CURLSSLBACKEND_MESALINK = 12,
+  CURLSSLBACKEND_BEARSSL = 13
 } curl_sslbackend;
 
 /* aliases for library clones and renames */
 #define CURLSSLBACKEND_LIBRESSL CURLSSLBACKEND_OPENSSL
 #define CURLSSLBACKEND_BORINGSSL CURLSSLBACKEND_OPENSSL
+
+/* deprecated names: */
 #define CURLSSLBACKEND_CYASSL CURLSSLBACKEND_WOLFSSL
+#define CURLSSLBACKEND_DARWINSSL CURLSSLBACKEND_SECURETRANSPORT
 
 struct curl_httppost {
   struct curl_httppost *next;       /* next entry in the list */
@@ -199,16 +210,22 @@ struct curl_httppost {
                                        set. Added in 7.46.0 */
 };
 
-/* This is the CURLOPT_PROGRESSFUNCTION callback proto. It is now considered
-   deprecated but was the only choice up until 7.31.0 */
+
+/* This is a return code for the progress callback that, when returned, will
+   signal libcurl to continue executing the default progress function */
+#define CURL_PROGRESSFUNC_CONTINUE 0x10000001
+
+/* This is the CURLOPT_PROGRESSFUNCTION callback prototype. It is now
+   considered deprecated but was the only choice up until 7.31.0 */
 typedef int (*curl_progress_callback)(void *clientp,
                                       double dltotal,
                                       double dlnow,
                                       double ultotal,
                                       double ulnow);
 
-/* This is the CURLOPT_XFERINFOFUNCTION callback proto. It was introduced in
-   7.32.0, it avoids floating point and provides more detailed information. */
+/* This is the CURLOPT_XFERINFOFUNCTION callback prototype. It was introduced
+   in 7.32.0, avoids the use of floating point numbers and provides more
+   detailed information. */
 typedef int (*curl_xferinfo_callback)(void *clientp,
                                       curl_off_t dltotal,
                                       curl_off_t dlnow,
@@ -273,14 +290,11 @@ typedef enum {
 #define CURLFINFOFLAG_KNOWN_SIZE        (1<<6)
 #define CURLFINFOFLAG_KNOWN_HLINKCOUNT  (1<<7)
 
-/* Content of this structure depends on information which is known and is
-   achievable (e.g. by FTP LIST parsing). Please see the url_easy_setopt(3) man
-   page for callbacks returning this structure -- some fields are mandatory,
-   some others are optional. The FLAG field has special meaning. */
+/* Information about a single file, used when doing FTP wildcard matching */
 struct curl_fileinfo {
   char *filename;
   curlfiletype filetype;
-  time_t time;
+  time_t time; /* always zero! */
   unsigned int perm;
   int uid;
   int gid;
@@ -355,11 +369,21 @@ typedef int (*curl_seek_callback)(void *instream,
    signal libcurl to pause sending data on the current transfer. */
 #define CURL_READFUNC_PAUSE 0x10000001
 
+/* Return code for when the trailing headers' callback has terminated
+   without any errors*/
+#define CURL_TRAILERFUNC_OK 0
+/* Return code for when was an error in the trailing header's list and we
+  want to abort the request */
+#define CURL_TRAILERFUNC_ABORT 1
+
 typedef size_t (*curl_read_callback)(char *buffer,
                                       size_t size,
                                       size_t nitems,
                                       void *instream);
 
+typedef int (*curl_trailer_callback)(struct curl_slist **list,
+                                      void *userdata);
+
 typedef enum {
   CURLSOCKTYPE_IPCXN,  /* socket created for a specific IP connection */
   CURLSOCKTYPE_ACCEPT, /* socket created by accept() call */
@@ -582,12 +606,12 @@ typedef enum {
                                     */
   CURLE_RECURSIVE_API_CALL,      /* 93 - an api function was called from
                                     inside a callback */
+  CURLE_AUTH_ERROR,              /* 94 - an authentication function returned an
+                                    error */
+  CURLE_HTTP3,                   /* 95 - An HTTP/3 layer problem */
   CURL_LAST /* never use! */
 } CURLcode;
 
-/* added in 7.62.0 */
-#define CURLE_SSL_CACERT CURLE_PEER_FAILED_VERIFICATION
-
 #ifndef CURL_NO_OLDIES /* define this to test if your app builds with all
                           the obsolete stuff removed! */
 
@@ -602,6 +626,9 @@ typedef enum {
 #define CURLOPT_ENCODING CURLOPT_ACCEPT_ENCODING
 #define CURLE_FTP_WEIRD_SERVER_REPLY CURLE_WEIRD_SERVER_REPLY
 
+/* The following were added in 7.62.0 */
+#define CURLE_SSL_CACERT CURLE_PEER_FAILED_VERIFICATION
+
 /* The following were added in 7.21.5, April 2011 */
 #define CURLE_UNKNOWN_TELNET_OPTION CURLE_UNKNOWN_OPTION
 
@@ -665,8 +692,10 @@ typedef enum {
 typedef CURLcode (*curl_conv_callback)(char *buffer, size_t length);
 
 typedef CURLcode (*curl_ssl_ctx_callback)(CURL *curl,    /* easy handle */
-                                          void *ssl_ctx, /* actually an
-                                                            OpenSSL SSL_CTX */
+                                          void *ssl_ctx, /* actually an OpenSSL
+                                                            or WolfSSL SSL_CTX,
+                                                            or an mbedTLS
+                                                          mbedtls_ssl_config */
                                           void *userptr);
 
 typedef enum {
@@ -799,6 +828,10 @@ typedef enum {
    SSL backends where such behavior is present. */
 #define CURLSSLOPT_NO_REVOKE (1<<1)
 
+/* - NO_PARTIALCHAIN tells libcurl to *NOT* accept a partial certificate chain
+   if possible. The OpenSSL backend has this ability. */
+#define CURLSSLOPT_NO_PARTIALCHAIN (1<<2)
+
 /* The default connection attempt delay in milliseconds for happy eyeballs.
    CURLOPT_HAPPY_EYEBALLS_TIMEOUT_MS.3 and happy-eyeballs-timeout-ms.d document
    this value, keep them in sync. */
@@ -861,6 +894,14 @@ typedef enum {
 #define CURLHEADER_UNIFIED  0
 #define CURLHEADER_SEPARATE (1<<0)
 
+/* CURLALTSVC_* are bits for the CURLOPT_ALTSVC_CTRL option */
+#define CURLALTSVC_IMMEDIATELY  (1<<0)
+
+#define CURLALTSVC_READONLYFILE (1<<2)
+#define CURLALTSVC_H1           (1<<3)
+#define CURLALTSVC_H2           (1<<4)
+#define CURLALTSVC_H3           (1<<5)
+
 /* CURLPROTO_ defines are for the CURLOPT_*PROTOCOLS options */
 #define CURLPROTO_HTTP   (1<<0)
 #define CURLPROTO_HTTPS  (1<<1)
@@ -896,7 +937,6 @@ typedef enum {
    but 32 */
 #define CURLOPTTYPE_LONG          0
 #define CURLOPTTYPE_OBJECTPOINT   10000
-#define CURLOPTTYPE_STRINGPOINT   10000
 #define CURLOPTTYPE_FUNCTIONPOINT 20000
 #define CURLOPTTYPE_OFF_T         30000
 
@@ -917,11 +957,16 @@ typedef enum {
 #define LONG          CURLOPTTYPE_LONG
 #define OBJECTPOINT   CURLOPTTYPE_OBJECTPOINT
 #define STRINGPOINT   CURLOPTTYPE_OBJECTPOINT
+#define SLISTPOINT    CURLOPTTYPE_OBJECTPOINT
 #define FUNCTIONPOINT CURLOPTTYPE_FUNCTIONPOINT
 #define OFF_T         CURLOPTTYPE_OFF_T
 #define CINIT(name,type,number) CURLOPT_/**/name = type + number
 #endif
 
+/* handy aliases that make no run-time difference */
+#define CURLOPTTYPE_STRINGPOINT  CURLOPTTYPE_OBJECTPOINT
+#define CURLOPTTYPE_SLISTPOINT  CURLOPTTYPE_OBJECTPOINT
+
 /*
  * This macro-mania below setups the CURLOPT_[what] enum, to be used with
  * curl_easy_setopt(). The first argument in the CINIT() macro is the [what]
@@ -1019,7 +1064,7 @@ typedef enum {
 
   /* This points to a linked list of headers, struct curl_slist kind. This
      list is also used for RTSP (in spite of its name) */
-  CINIT(HTTPHEADER, OBJECTPOINT, 23),
+  CINIT(HTTPHEADER, SLISTPOINT, 23),
 
   /* This points to a linked list of post entries, struct curl_httppost */
   CINIT(HTTPPOST, OBJECTPOINT, 24),
@@ -1034,7 +1079,7 @@ typedef enum {
   CINIT(CRLF, LONG, 27),
 
   /* send linked-list of QUOTE commands */
-  CINIT(QUOTE, OBJECTPOINT, 28),
+  CINIT(QUOTE, SLISTPOINT, 28),
 
   /* send FILE * or void * to store headers to, if you use a callback it
      is simply passed to the callback unmodified */
@@ -1069,7 +1114,7 @@ typedef enum {
   /* 38 is not used */
 
   /* send linked-list of post-transfer QUOTE commands */
-  CINIT(POSTQUOTE, OBJECTPOINT, 39),
+  CINIT(POSTQUOTE, SLISTPOINT, 39),
 
   CINIT(OBSOLETE40, OBJECTPOINT, 40), /* OBSOLETE, do not use! */
 
@@ -1145,7 +1190,7 @@ typedef enum {
   CINIT(FILETIME, LONG, 69),
 
   /* This points to a linked list of telnet options */
-  CINIT(TELNETOPTIONS, OBJECTPOINT, 70),
+  CINIT(TELNETOPTIONS, SLISTPOINT, 70),
 
   /* Max amount of cached alive connections */
   CINIT(MAXCONNECTS, LONG, 71),
@@ -1229,7 +1274,7 @@ typedef enum {
   CINIT(DNS_CACHE_TIMEOUT, LONG, 92),
 
   /* send linked-list of pre-transfer QUOTE commands */
-  CINIT(PREQUOTE, OBJECTPOINT, 93),
+  CINIT(PREQUOTE, SLISTPOINT, 93),
 
   /* set the debug function */
   CINIT(DEBUGFUNCTION, FUNCTIONPOINT, 94),
@@ -1269,7 +1314,7 @@ typedef enum {
   CINIT(PRIVATE, OBJECTPOINT, 103),
 
   /* Set aliases for HTTP 200 in the HTTP Response header */
-  CINIT(HTTP200ALIASES, OBJECTPOINT, 104),
+  CINIT(HTTP200ALIASES, SLISTPOINT, 104),
 
   /* Continue to send authentication (user+password) when following locations,
      even when hostname changed. This can potentially send off the name
@@ -1286,9 +1331,9 @@ typedef enum {
      Note that setting multiple bits may cause extra network round-trips. */
   CINIT(HTTPAUTH, LONG, 107),
 
-  /* Set the ssl context callback function, currently only for OpenSSL ssl_ctx
-     in second argument. The function must be matching the
-     curl_ssl_ctx_callback proto. */
+  /* Set the ssl context callback function, currently only for OpenSSL or
+     WolfSSL ssl_ctx, or mbedTLS mbedtls_ssl_config in the second argument.
+     The function must match the curl_ssl_ctx_callback prototype. */
   CINIT(SSL_CTX_FUNCTION, FUNCTIONPOINT, 108),
 
   /* Set the userdata for the ssl context callback function's third
@@ -1541,8 +1586,7 @@ typedef enum {
 
   /* set the bitmask for the protocols that libcurl is allowed to follow to,
      as a subset of the CURLOPT_PROTOCOLS ones. That means the protocol needs
-     to be set in both bitmasks to be allowed to get redirected to. Defaults
-     to all protocols except FILE and SCP. */
+     to be set in both bitmasks to be allowed to get redirected to. */
   CINIT(REDIR_PROTOCOLS, LONG, 182),
 
   /* set the SSH knownhost file name to use */
@@ -1559,7 +1603,7 @@ typedef enum {
   CINIT(MAIL_FROM, STRINGPOINT, 186),
 
   /* set the list of SMTP mail receiver(s) */
-  CINIT(MAIL_RCPT, OBJECTPOINT, 187),
+  CINIT(MAIL_RCPT, SLISTPOINT, 187),
 
   /* FTP: send PRET before PASV */
   CINIT(FTP_USE_PRET, LONG, 188),
@@ -1609,7 +1653,7 @@ typedef enum {
   CINIT(FNMATCH_DATA, OBJECTPOINT, 202),
 
   /* send linked-list of name:port:address sets */
-  CINIT(RESOLVE, OBJECTPOINT, 203),
+  CINIT(RESOLVE, SLISTPOINT, 203),
 
   /* Set a username for authenticated TLS */
   CINIT(TLSAUTH_USERNAME, STRINGPOINT, 204),
@@ -1699,7 +1743,7 @@ typedef enum {
 
   /* This points to a linked list of headers used for proxy requests only,
      struct curl_slist kind */
-  CINIT(PROXYHEADER, OBJECTPOINT, 228),
+  CINIT(PROXYHEADER, SLISTPOINT, 228),
 
   /* Pass in a bitmask of "header options" */
   CINIT(HEADEROPT, LONG, 229),
@@ -1746,7 +1790,7 @@ typedef enum {
 
   /* Linked-list of host:port:connect-to-host:connect-to-port,
      overrides the URL's host:port (only for the network layer) */
-  CINIT(CONNECT_TO, OBJECTPOINT, 243),
+  CINIT(CONNECT_TO, SLISTPOINT, 243),
 
   /* Set TCP Fast Open */
   CINIT(TCP_FASTOPEN, LONG, 244),
@@ -1872,6 +1916,30 @@ typedef enum {
   /* Time in ms between connection upkeep calls for long-lived connections. */
   CINIT(UPKEEP_INTERVAL_MS, LONG, 281),
 
+  /* Specify URL using CURL URL API. */
+  CINIT(CURLU, OBJECTPOINT, 282),
+
+  /* add trailing data just after no more data is available */
+  CINIT(TRAILERFUNCTION, FUNCTIONPOINT, 283),
+
+  /* pointer to be passed to HTTP_TRAILER_FUNCTION */
+  CINIT(TRAILERDATA, OBJECTPOINT, 284),
+
+  /* set this to 1L to allow HTTP/0.9 responses or 0L to disallow */
+  CINIT(HTTP09_ALLOWED, LONG, 285),
+
+  /* alt-svc control bitmask */
+  CINIT(ALTSVC_CTRL, LONG, 286),
+
+  /* alt-svc cache file name to possibly read from/write to */
+  CINIT(ALTSVC, STRINGPOINT, 287),
+
+  /* maximum age of a connection to consider it for reuse (in seconds) */
+  CINIT(MAXAGE_CONN, LONG, 288),
+
+  /* SASL authorisation identity */
+  CINIT(SASL_AUTHZID, STRINGPOINT, 289),
+
   CURLOPT_LASTENTRY /* the last unused */
 } CURLoption;
 
@@ -1925,7 +1993,8 @@ enum {
   CURL_HTTP_VERSION_2TLS, /* use version 2 for HTTPS, version 1.1 for HTTP */
   CURL_HTTP_VERSION_2_PRIOR_KNOWLEDGE,  /* please use HTTP 2 without HTTP/1.1
                                            Upgrade */
-
+  CURL_HTTP_VERSION_3 = 30, /* Makes use of explicit HTTP/3 without fallback.
+                               Use CURLOPT_ALTSVC to enable HTTP/3 upgrade */
   CURL_HTTP_VERSION_LAST /* *ILLEGAL* http version */
 };
 
@@ -2465,8 +2534,8 @@ CURL_EXTERN void curl_slist_free_all(struct curl_slist *);
  */
 CURL_EXTERN time_t curl_getdate(const char *p, const time_t *unused);
 
-/* info about the certificate chain, only for OpenSSL builds. Asked
-   for with CURLOPT_CERTINFO / CURLINFO_CERTINFO */
+/* info about the certificate chain, only for OpenSSL, GnuTLS, Schannel, NSS
+   and GSKit builds. Asked for with CURLOPT_CERTINFO / CURLINFO_CERTINFO */
 struct curl_certinfo {
   int num_of_certs;             /* number of certificates with information */
   struct curl_slist **certinfo; /* for each index in this array, there's a
@@ -2561,8 +2630,9 @@ typedef enum {
   CURLINFO_STARTTRANSFER_TIME_T = CURLINFO_OFF_T + 54,
   CURLINFO_REDIRECT_TIME_T  = CURLINFO_OFF_T + 55,
   CURLINFO_APPCONNECT_TIME_T = CURLINFO_OFF_T + 56,
+  CURLINFO_RETRY_AFTER      = CURLINFO_OFF_T + 57,
 
-  CURLINFO_LASTONE          = 56
+  CURLINFO_LASTONE          = 57
 } CURLINFO;
 
 /* CURLINFO_RESPONSE_CODE is the new name for the option previously known as
@@ -2661,6 +2731,7 @@ typedef enum {
   CURLVERSION_THIRD,
   CURLVERSION_FOURTH,
   CURLVERSION_FIFTH,
+  CURLVERSION_SIXTH,
   CURLVERSION_LAST /* never actually use this */
 } CURLversion;
 
@@ -2669,7 +2740,7 @@ typedef enum {
    meant to be a built-in version number for what kind of struct the caller
    expects. If the struct ever changes, we redefine the NOW to another enum
    from above. */
-#define CURLVERSION_NOW CURLVERSION_FIFTH
+#define CURLVERSION_NOW CURLVERSION_SIXTH
 
 typedef struct {
   CURLversion age;          /* age of the returned struct */
@@ -2698,11 +2769,16 @@ typedef struct {
   const char *libssh_version; /* human readable string */
 
   /* These fields were added in CURLVERSION_FIFTH */
-
   unsigned int brotli_ver_num; /* Numeric Brotli version
                                   (MAJOR << 24) | (MINOR << 12) | PATCH */
   const char *brotli_version; /* human readable string. */
 
+  /* These fields were added in CURLVERSION_SIXTH */
+  unsigned int nghttp2_ver_num; /* Numeric nghttp2 version
+                                   (MAJOR << 16) | (MINOR << 8) | PATCH */
+  const char *nghttp2_version; /* human readable string. */
+  const char *quic_version;    /* human readable quic (+ HTTP/3) library +
+                                  version or NULL */
 } curl_version_info_data;
 
 #define CURL_VERSION_IPV6         (1<<0)  /* IPv6-enabled */
@@ -2734,6 +2810,10 @@ typedef struct {
 #define CURL_VERSION_HTTPS_PROXY  (1<<21) /* HTTPS-proxy support built-in */
 #define CURL_VERSION_MULTI_SSL    (1<<22) /* Multiple SSL backends available */
 #define CURL_VERSION_BROTLI       (1<<23) /* Brotli features are present. */
+#define CURL_VERSION_ALTSVC       (1<<24) /* Alt-Svc handling built-in */
+#define CURL_VERSION_HTTP3        (1<<25) /* HTTP3 support built-in */
+
+#define CURL_VERSION_ESNI         (1<<26) /* ESNI support */
 
  /*
  * NAME curl_version_info()
@@ -2814,4 +2894,4 @@ CURL_EXTERN CURLcode curl_easy_pause(CURL *handle, int bitmask);
 #endif /* __STDC__ >= 1 */
 #endif /* gcc >= 4.3 && !__cplusplus */
 
-#endif /* __CURL_CURL_H */
+#endif /* CURLINC_CURL_H */
index 2e53f0c..85b9355 100644 (file)
@@ -1,5 +1,5 @@
-#ifndef __CURL_CURLVER_H
-#define __CURL_CURLVER_H
+#ifndef CURLINC_CURLVER_H
+#define CURLINC_CURLVER_H
 /***************************************************************************
  *                                  _   _ ____  _
  *  Project                     ___| | | |  _ \| |
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
    a script at release-time. This was made its own header file in 7.11.2 */
 
 /* This is the global package copyright */
-#define LIBCURL_COPYRIGHT "1996 - 2018 Daniel Stenberg, <daniel@haxx.se>."
+#define LIBCURL_COPYRIGHT "1996 - 2019 Daniel Stenberg, <daniel@haxx.se>."
 
 /* This is the version number of the libcurl package from which this header
    file origins: */
-#define LIBCURL_VERSION "7.62.0"
+#define LIBCURL_VERSION "7.68.0"
 
 /* The numeric version number is also available "in parts" by using these
    defines: */
 #define LIBCURL_VERSION_MAJOR 7
-#define LIBCURL_VERSION_MINOR 62
+#define LIBCURL_VERSION_MINOR 68
 #define LIBCURL_VERSION_PATCH 0
 
 /* This is the numeric version of the libcurl version number, meant for easier
@@ -57,7 +57,7 @@
    CURL_VERSION_BITS() macro since curl's own configure script greps for it
    and needs it to contain the full number.
 */
-#define LIBCURL_VERSION_NUM 0x073e00
+#define LIBCURL_VERSION_NUM 0x074400
 
 /*
  * This is the date and time when the full source package was created. The
  *
  * "2007-11-23"
  */
-#define LIBCURL_TIMESTAMP "2018-10-31"
+#define LIBCURL_TIMESTAMP "2020-01-08"
 
-#define CURL_VERSION_BITS(x,y,z) ((x)<<16|(y)<<8|z)
+#define CURL_VERSION_BITS(x,y,z) ((x)<<16|(y)<<8|(z))
 #define CURL_AT_LEAST_VERSION(x,y,z) \
   (LIBCURL_VERSION_NUM >= CURL_VERSION_BITS(x, y, z))
 
-#endif /* __CURL_CURLVER_H */
+#endif /* CURLINC_CURLVER_H */
index f42a8a9..592f5d3 100644 (file)
@@ -1,5 +1,5 @@
-#ifndef __CURL_EASY_H
-#define __CURL_EASY_H
+#ifndef CURLINC_EASY_H
+#define CURLINC_EASY_H
 /***************************************************************************
  *                                  _   _ ____  _
  *  Project                     ___| | | |  _ \| |
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
index e20f546..f615ed7 100644 (file)
@@ -1,5 +1,5 @@
-#ifndef __CURL_MPRINTF_H
-#define __CURL_MPRINTF_H
+#ifndef CURLINC_MPRINTF_H
+#define CURLINC_MPRINTF_H
 /***************************************************************************
  *                                  _   _ ____  _
  *  Project                     ___| | | |  _ \| |
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -47,4 +47,4 @@ CURL_EXTERN char *curl_mvaprintf(const char *format, va_list args);
 }
 #endif
 
-#endif /* __CURL_MPRINTF_H */
+#endif /* CURLINC_MPRINTF_H */
index b19dbaf..04996ff 100644 (file)
@@ -1,5 +1,5 @@
-#ifndef __CURL_MULTI_H
-#define __CURL_MULTI_H
+#ifndef CURLINC_MULTI_H
+#define CURLINC_MULTI_H
 /***************************************************************************
  *                                  _   _ ____  _
  *  Project                     ___| | | |  _ \| |
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -72,6 +72,7 @@ typedef enum {
                             attempted to get added - again */
   CURLM_RECURSIVE_API_CALL, /* an api function was called from inside a
                                callback */
+  CURLM_WAKEUP_FAILURE, /* wakeup is unavailable or failed */
   CURLM_LAST
 } CURLMcode;
 
@@ -173,6 +174,29 @@ CURL_EXTERN CURLMcode curl_multi_wait(CURLM *multi_handle,
                                       int timeout_ms,
                                       int *ret);
 
+/*
+ * Name:     curl_multi_poll()
+ *
+ * Desc:     Poll on all fds within a CURLM set as well as any
+ *           additional fds passed to the function.
+ *
+ * Returns:  CURLMcode type, general multi error code.
+ */
+CURL_EXTERN CURLMcode curl_multi_poll(CURLM *multi_handle,
+                                      struct curl_waitfd extra_fds[],
+                                      unsigned int extra_nfds,
+                                      int timeout_ms,
+                                      int *ret);
+
+/*
+ * Name:     curl_multi_wakeup()
+ *
+ * Desc:     wakes up a sleeping curl_multi_poll call.
+ *
+ * Returns:  CURLMcode type, general multi error code.
+ */
+CURL_EXTERN CURLMcode curl_multi_wakeup(CURLM *multi_handle);
+
  /*
   * Name:    curl_multi_perform()
   *
@@ -382,6 +406,9 @@ typedef enum {
   /* This is the argument passed to the server push callback */
   CINIT(PUSHDATA, OBJECTPOINT, 15),
 
+  /* maximum number of concurrent streams to support on a connection */
+  CINIT(MAX_CONCURRENT_STREAMS, LONG, 16),
+
   CURLMOPT_LASTENTRY /* the last unused */
 } CURLMoption;
 
index 027b6f4..a6bdc1a 100644 (file)
@@ -1,5 +1,5 @@
-#ifndef __STDC_HEADERS_H
-#define __STDC_HEADERS_H
+#ifndef CURLINC_STDCHEADERS_H
+#define CURLINC_STDCHEADERS_H
 /***************************************************************************
  *                                  _   _ ____  _
  *  Project                     ___| | | |  _ \| |
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -30,4 +30,4 @@ size_t fwrite(const void *, size_t, size_t, FILE *);
 int strcasecmp(const char *, const char *);
 int strncasecmp(const char *, const char *, size_t);
 
-#endif /* __STDC_HEADERS_H */
+#endif /* CURLINC_STDCHEADERS_H */
index 1e555ec..867af61 100644 (file)
@@ -1,5 +1,5 @@
-#ifndef __CURL_SYSTEM_H
-#define __CURL_SYSTEM_H
+#ifndef CURLINC_SYSTEM_H
+#define CURLINC_SYSTEM_H
 /***************************************************************************
  *                                  _   _ ____  _
  *  Project                     ___| | | |  _ \| |
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
 #  define CURL_TYPEOF_CURL_SOCKLEN_T int
 
 #elif defined(__LCC__)
-#  define CURL_TYPEOF_CURL_OFF_T     long
-#  define CURL_FORMAT_CURL_OFF_T     "ld"
-#  define CURL_FORMAT_CURL_OFF_TU    "lu"
-#  define CURL_SUFFIX_CURL_OFF_T     L
-#  define CURL_SUFFIX_CURL_OFF_TU    UL
-#  define CURL_TYPEOF_CURL_SOCKLEN_T int
+#  if defined(__e2k__) /* MCST eLbrus C Compiler */
+#    define CURL_TYPEOF_CURL_OFF_T     long
+#    define CURL_FORMAT_CURL_OFF_T     "ld"
+#    define CURL_FORMAT_CURL_OFF_TU    "lu"
+#    define CURL_SUFFIX_CURL_OFF_T     L
+#    define CURL_SUFFIX_CURL_OFF_TU    UL
+#    define CURL_TYPEOF_CURL_SOCKLEN_T socklen_t
+#    define CURL_PULL_SYS_TYPES_H      1
+#    define CURL_PULL_SYS_SOCKET_H     1
+#  else                /* Local (or Little) C Compiler */
+#    define CURL_TYPEOF_CURL_OFF_T     long
+#    define CURL_FORMAT_CURL_OFF_T     "ld"
+#    define CURL_FORMAT_CURL_OFF_TU    "lu"
+#    define CURL_SUFFIX_CURL_OFF_T     L
+#    define CURL_SUFFIX_CURL_OFF_TU    UL
+#    define CURL_TYPEOF_CURL_SOCKLEN_T int
+#  endif
 
 #elif defined(__SYMBIAN32__)
-#  if defined(__EABI__)  /* Treat all ARM compilers equally */
+#  if defined(__EABI__) /* Treat all ARM compilers equally */
 #    define CURL_TYPEOF_CURL_OFF_T     long long
 #    define CURL_FORMAT_CURL_OFF_T     "lld"
 #    define CURL_FORMAT_CURL_OFF_TU    "llu"
 #  define CURL_TYPEOF_CURL_SOCKLEN_T int
 
 #elif defined(__TINYC__) /* also known as tcc */
-
 #  define CURL_TYPEOF_CURL_OFF_T     long long
 #  define CURL_FORMAT_CURL_OFF_T     "lld"
 #  define CURL_FORMAT_CURL_OFF_TU    "llu"
 #    define CURL_SUFFIX_CURL_OFF_TU    ULL
 #  elif defined(__LP64__) || \
         defined(__x86_64__) || defined(__ppc64__) || defined(__sparc64__) || \
+        defined(__e2k__) || \
         (defined(__SIZEOF_LONG__) && __SIZEOF_LONG__ == 8) || \
         (defined(__LONG_MAX__) && __LONG_MAX__ == 9223372036854775807L)
 #    define CURL_TYPEOF_CURL_OFF_T     long
  */
 
 #if defined(__BORLANDC__) && (__BORLANDC__ == 0x0551)
-#  define __CURL_OFF_T_C_HLPR2(x) x
-#  define __CURL_OFF_T_C_HLPR1(x) __CURL_OFF_T_C_HLPR2(x)
-#  define CURL_OFF_T_C(Val)  __CURL_OFF_T_C_HLPR1(Val) ## \
-                             __CURL_OFF_T_C_HLPR1(CURL_SUFFIX_CURL_OFF_T)
-#  define CURL_OFF_TU_C(Val) __CURL_OFF_T_C_HLPR1(Val) ## \
-                             __CURL_OFF_T_C_HLPR1(CURL_SUFFIX_CURL_OFF_TU)
+#  define CURLINC_OFF_T_C_HLPR2(x) x
+#  define CURLINC_OFF_T_C_HLPR1(x) CURLINC_OFF_T_C_HLPR2(x)
+#  define CURL_OFF_T_C(Val)  CURLINC_OFF_T_C_HLPR1(Val) ## \
+                             CURLINC_OFF_T_C_HLPR1(CURL_SUFFIX_CURL_OFF_T)
+#  define CURL_OFF_TU_C(Val) CURLINC_OFF_T_C_HLPR1(Val) ## \
+                             CURLINC_OFF_T_C_HLPR1(CURL_SUFFIX_CURL_OFF_TU)
 #else
 #  ifdef CURL_ISOCPP
-#    define __CURL_OFF_T_C_HLPR2(Val,Suffix) Val ## Suffix
+#    define CURLINC_OFF_T_C_HLPR2(Val,Suffix) Val ## Suffix
 #  else
-#    define __CURL_OFF_T_C_HLPR2(Val,Suffix) Val/**/Suffix
+#    define CURLINC_OFF_T_C_HLPR2(Val,Suffix) Val/**/Suffix
 #  endif
-#  define __CURL_OFF_T_C_HLPR1(Val,Suffix) __CURL_OFF_T_C_HLPR2(Val,Suffix)
-#  define CURL_OFF_T_C(Val)  __CURL_OFF_T_C_HLPR1(Val,CURL_SUFFIX_CURL_OFF_T)
-#  define CURL_OFF_TU_C(Val) __CURL_OFF_T_C_HLPR1(Val,CURL_SUFFIX_CURL_OFF_TU)
+#  define CURLINC_OFF_T_C_HLPR1(Val,Suffix) CURLINC_OFF_T_C_HLPR2(Val,Suffix)
+#  define CURL_OFF_T_C(Val)  CURLINC_OFF_T_C_HLPR1(Val,CURL_SUFFIX_CURL_OFF_T)
+#  define CURL_OFF_TU_C(Val) CURLINC_OFF_T_C_HLPR1(Val,CURL_SUFFIX_CURL_OFF_TU)
 #endif
 
-#endif /* __CURL_SYSTEM_H */
+#endif /* CURLINC_SYSTEM_H */
index 2443362..03c84fc 100644 (file)
@@ -1,5 +1,5 @@
-#ifndef __CURL_TYPECHECK_GCC_H
-#define __CURL_TYPECHECK_GCC_H
+#ifndef CURLINC_TYPECHECK_GCC_H
+#define CURLINC_TYPECHECK_GCC_H
 /***************************************************************************
  *                                  _   _ ____  _
  *  Project                     ___| | | |  _ \| |
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
 /* wraps curl_easy_setopt() with typechecking */
 
 /* To add a new kind of warning, add an
- *   if(_curl_is_sometype_option(_curl_opt))
- *     if(!_curl_is_sometype(value))
+ *   if(curlcheck_sometype_option(_curl_opt))
+ *     if(!curlcheck_sometype(value))
  *       _curl_easy_setopt_err_sometype();
- * block and define _curl_is_sometype_option, _curl_is_sometype and
+ * block and define curlcheck_sometype_option, curlcheck_sometype and
  * _curl_easy_setopt_err_sometype below
  *
  * NOTE: We use two nested 'if' statements here instead of the && operator, in
  * To add an option that uses the same type as an existing option, you'll just
  * need to extend the appropriate _curl_*_option macro
  */
-#define curl_easy_setopt(handle, option, value)                               \
-__extension__ ({                                                              \
-  __typeof__(option) _curl_opt = option;                                     \
-  if(__builtin_constant_p(_curl_opt)) {                                       \
-    if(_curl_is_long_option(_curl_opt))                                       \
-      if(!_curl_is_long(value))                                               \
-        _curl_easy_setopt_err_long();                                         \
-    if(_curl_is_off_t_option(_curl_opt))                                      \
-      if(!_curl_is_off_t(value))                                              \
-        _curl_easy_setopt_err_curl_off_t();                                   \
-    if(_curl_is_string_option(_curl_opt))                                     \
-      if(!_curl_is_string(value))                                             \
-        _curl_easy_setopt_err_string();                                       \
-    if(_curl_is_write_cb_option(_curl_opt))                                   \
-      if(!_curl_is_write_cb(value))                                           \
-        _curl_easy_setopt_err_write_callback();                               \
-    if((_curl_opt) == CURLOPT_RESOLVER_START_FUNCTION)                        \
-      if(!_curl_is_resolver_start_callback(value))                            \
-        _curl_easy_setopt_err_resolver_start_callback();                      \
-    if((_curl_opt) == CURLOPT_READFUNCTION)                                   \
-      if(!_curl_is_read_cb(value))                                            \
-        _curl_easy_setopt_err_read_cb();                                      \
-    if((_curl_opt) == CURLOPT_IOCTLFUNCTION)                                  \
-      if(!_curl_is_ioctl_cb(value))                                           \
-        _curl_easy_setopt_err_ioctl_cb();                                     \
-    if((_curl_opt) == CURLOPT_SOCKOPTFUNCTION)                                \
-      if(!_curl_is_sockopt_cb(value))                                         \
-        _curl_easy_setopt_err_sockopt_cb();                                   \
-    if((_curl_opt) == CURLOPT_OPENSOCKETFUNCTION)                             \
-      if(!_curl_is_opensocket_cb(value))                                      \
-        _curl_easy_setopt_err_opensocket_cb();                                \
-    if((_curl_opt) == CURLOPT_PROGRESSFUNCTION)                               \
-      if(!_curl_is_progress_cb(value))                                        \
-        _curl_easy_setopt_err_progress_cb();                                  \
-    if((_curl_opt) == CURLOPT_DEBUGFUNCTION)                                  \
-      if(!_curl_is_debug_cb(value))                                           \
-        _curl_easy_setopt_err_debug_cb();                                     \
-    if((_curl_opt) == CURLOPT_SSL_CTX_FUNCTION)                               \
-      if(!_curl_is_ssl_ctx_cb(value))                                         \
-        _curl_easy_setopt_err_ssl_ctx_cb();                                   \
-    if(_curl_is_conv_cb_option(_curl_opt))                                    \
-      if(!_curl_is_conv_cb(value))                                            \
-        _curl_easy_setopt_err_conv_cb();                                      \
-    if((_curl_opt) == CURLOPT_SEEKFUNCTION)                                   \
-      if(!_curl_is_seek_cb(value))                                            \
-        _curl_easy_setopt_err_seek_cb();                                      \
-    if(_curl_is_cb_data_option(_curl_opt))                                    \
-      if(!_curl_is_cb_data(value))                                            \
-        _curl_easy_setopt_err_cb_data();                                      \
-    if((_curl_opt) == CURLOPT_ERRORBUFFER)                                    \
-      if(!_curl_is_error_buffer(value))                                       \
-        _curl_easy_setopt_err_error_buffer();                                 \
-    if((_curl_opt) == CURLOPT_STDERR)                                         \
-      if(!_curl_is_FILE(value))                                               \
-        _curl_easy_setopt_err_FILE();                                         \
-    if(_curl_is_postfields_option(_curl_opt))                                 \
-      if(!_curl_is_postfields(value))                                         \
-        _curl_easy_setopt_err_postfields();                                   \
-    if((_curl_opt) == CURLOPT_HTTPPOST)                                       \
-      if(!_curl_is_arr((value), struct curl_httppost))                        \
-        _curl_easy_setopt_err_curl_httpost();                                 \
-    if((_curl_opt) == CURLOPT_MIMEPOST)                                       \
-      if(!_curl_is_ptr((value), curl_mime))                                   \
-        _curl_easy_setopt_err_curl_mimepost();                                \
-    if(_curl_is_slist_option(_curl_opt))                                      \
-      if(!_curl_is_arr((value), struct curl_slist))                           \
-        _curl_easy_setopt_err_curl_slist();                                   \
-    if((_curl_opt) == CURLOPT_SHARE)                                          \
-      if(!_curl_is_ptr((value), CURLSH))                                      \
-        _curl_easy_setopt_err_CURLSH();                                       \
-  }                                                                           \
-  curl_easy_setopt(handle, _curl_opt, value);                                 \
-})
+#define curl_easy_setopt(handle, option, value)                         \
+  __extension__({                                                       \
+      __typeof__(option) _curl_opt = option;                            \
+      if(__builtin_constant_p(_curl_opt)) {                             \
+        if(curlcheck_long_option(_curl_opt))                            \
+          if(!curlcheck_long(value))                                    \
+            _curl_easy_setopt_err_long();                               \
+        if(curlcheck_off_t_option(_curl_opt))                           \
+          if(!curlcheck_off_t(value))                                   \
+            _curl_easy_setopt_err_curl_off_t();                         \
+        if(curlcheck_string_option(_curl_opt))                          \
+          if(!curlcheck_string(value))                                  \
+            _curl_easy_setopt_err_string();                             \
+        if(curlcheck_write_cb_option(_curl_opt))                        \
+          if(!curlcheck_write_cb(value))                                \
+            _curl_easy_setopt_err_write_callback();                     \
+        if((_curl_opt) == CURLOPT_RESOLVER_START_FUNCTION)              \
+          if(!curlcheck_resolver_start_callback(value))                 \
+            _curl_easy_setopt_err_resolver_start_callback();            \
+        if((_curl_opt) == CURLOPT_READFUNCTION)                         \
+          if(!curlcheck_read_cb(value))                                 \
+            _curl_easy_setopt_err_read_cb();                            \
+        if((_curl_opt) == CURLOPT_IOCTLFUNCTION)                        \
+          if(!curlcheck_ioctl_cb(value))                                \
+            _curl_easy_setopt_err_ioctl_cb();                           \
+        if((_curl_opt) == CURLOPT_SOCKOPTFUNCTION)                      \
+          if(!curlcheck_sockopt_cb(value))                              \
+            _curl_easy_setopt_err_sockopt_cb();                         \
+        if((_curl_opt) == CURLOPT_OPENSOCKETFUNCTION)                   \
+          if(!curlcheck_opensocket_cb(value))                           \
+            _curl_easy_setopt_err_opensocket_cb();                      \
+        if((_curl_opt) == CURLOPT_PROGRESSFUNCTION)                     \
+          if(!curlcheck_progress_cb(value))                             \
+            _curl_easy_setopt_err_progress_cb();                        \
+        if((_curl_opt) == CURLOPT_DEBUGFUNCTION)                        \
+          if(!curlcheck_debug_cb(value))                                \
+            _curl_easy_setopt_err_debug_cb();                           \
+        if((_curl_opt) == CURLOPT_SSL_CTX_FUNCTION)                     \
+          if(!curlcheck_ssl_ctx_cb(value))                              \
+            _curl_easy_setopt_err_ssl_ctx_cb();                         \
+        if(curlcheck_conv_cb_option(_curl_opt))                         \
+          if(!curlcheck_conv_cb(value))                                 \
+            _curl_easy_setopt_err_conv_cb();                            \
+        if((_curl_opt) == CURLOPT_SEEKFUNCTION)                         \
+          if(!curlcheck_seek_cb(value))                                 \
+            _curl_easy_setopt_err_seek_cb();                            \
+        if(curlcheck_cb_data_option(_curl_opt))                         \
+          if(!curlcheck_cb_data(value))                                 \
+            _curl_easy_setopt_err_cb_data();                            \
+        if((_curl_opt) == CURLOPT_ERRORBUFFER)                          \
+          if(!curlcheck_error_buffer(value))                            \
+            _curl_easy_setopt_err_error_buffer();                       \
+        if((_curl_opt) == CURLOPT_STDERR)                               \
+          if(!curlcheck_FILE(value))                                    \
+            _curl_easy_setopt_err_FILE();                               \
+        if(curlcheck_postfields_option(_curl_opt))                      \
+          if(!curlcheck_postfields(value))                              \
+            _curl_easy_setopt_err_postfields();                         \
+        if((_curl_opt) == CURLOPT_HTTPPOST)                             \
+          if(!curlcheck_arr((value), struct curl_httppost))             \
+            _curl_easy_setopt_err_curl_httpost();                       \
+        if((_curl_opt) == CURLOPT_MIMEPOST)                             \
+          if(!curlcheck_ptr((value), curl_mime))                        \
+            _curl_easy_setopt_err_curl_mimepost();                      \
+        if(curlcheck_slist_option(_curl_opt))                           \
+          if(!curlcheck_arr((value), struct curl_slist))                \
+            _curl_easy_setopt_err_curl_slist();                         \
+        if((_curl_opt) == CURLOPT_SHARE)                                \
+          if(!curlcheck_ptr((value), CURLSH))                           \
+            _curl_easy_setopt_err_CURLSH();                             \
+      }                                                                 \
+      curl_easy_setopt(handle, _curl_opt, value);                       \
+    })
 
 /* wraps curl_easy_getinfo() with typechecking */
-/* FIXME: don't allow const pointers */
-#define curl_easy_getinfo(handle, info, arg)                                  \
-__extension__ ({                                                              \
-  __typeof__(info) _curl_info = info;                                         \
-  if(__builtin_constant_p(_curl_info)) {                                      \
-    if(_curl_is_string_info(_curl_info))                                      \
-      if(!_curl_is_arr((arg), char *))                                        \
-        _curl_easy_getinfo_err_string();                                      \
-    if(_curl_is_long_info(_curl_info))                                        \
-      if(!_curl_is_arr((arg), long))                                          \
-        _curl_easy_getinfo_err_long();                                        \
-    if(_curl_is_double_info(_curl_info))                                      \
-      if(!_curl_is_arr((arg), double))                                        \
-        _curl_easy_getinfo_err_double();                                      \
-    if(_curl_is_slist_info(_curl_info))                                       \
-      if(!_curl_is_arr((arg), struct curl_slist *))                           \
-        _curl_easy_getinfo_err_curl_slist();                                  \
-    if(_curl_is_tlssessioninfo_info(_curl_info))                              \
-      if(!_curl_is_arr((arg), struct curl_tlssessioninfo *))                  \
-        _curl_easy_getinfo_err_curl_tlssesssioninfo();                        \
-    if(_curl_is_certinfo_info(_curl_info))                                    \
-      if(!_curl_is_arr((arg), struct curl_certinfo *))                        \
-        _curl_easy_getinfo_err_curl_certinfo();                               \
-    if(_curl_is_socket_info(_curl_info))                                      \
-      if(!_curl_is_arr((arg), curl_socket_t))                                 \
-        _curl_easy_getinfo_err_curl_socket();                                 \
-    if(_curl_is_off_t_info(_curl_info))                                       \
-      if(!_curl_is_arr((arg), curl_off_t))                                    \
-        _curl_easy_getinfo_err_curl_off_t();                                  \
-  }                                                                           \
-  curl_easy_getinfo(handle, _curl_info, arg);                                 \
-})
-
-/* TODO: typechecking for curl_share_setopt() and curl_multi_setopt(),
- * for now just make sure that the functions are called with three
- * arguments
+#define curl_easy_getinfo(handle, info, arg)                            \
+  __extension__({                                                      \
+      __typeof__(info) _curl_info = info;                               \
+      if(__builtin_constant_p(_curl_info)) {                            \
+        if(curlcheck_string_info(_curl_info))                           \
+          if(!curlcheck_arr((arg), char *))                             \
+            _curl_easy_getinfo_err_string();                            \
+        if(curlcheck_long_info(_curl_info))                             \
+          if(!curlcheck_arr((arg), long))                               \
+            _curl_easy_getinfo_err_long();                              \
+        if(curlcheck_double_info(_curl_info))                           \
+          if(!curlcheck_arr((arg), double))                             \
+            _curl_easy_getinfo_err_double();                            \
+        if(curlcheck_slist_info(_curl_info))                            \
+          if(!curlcheck_arr((arg), struct curl_slist *))                \
+            _curl_easy_getinfo_err_curl_slist();                        \
+        if(curlcheck_tlssessioninfo_info(_curl_info))                   \
+          if(!curlcheck_arr((arg), struct curl_tlssessioninfo *))       \
+            _curl_easy_getinfo_err_curl_tlssesssioninfo();              \
+        if(curlcheck_certinfo_info(_curl_info))                         \
+          if(!curlcheck_arr((arg), struct curl_certinfo *))             \
+            _curl_easy_getinfo_err_curl_certinfo();                     \
+        if(curlcheck_socket_info(_curl_info))                           \
+          if(!curlcheck_arr((arg), curl_socket_t))                      \
+            _curl_easy_getinfo_err_curl_socket();                       \
+        if(curlcheck_off_t_info(_curl_info))                            \
+          if(!curlcheck_arr((arg), curl_off_t))                         \
+            _curl_easy_getinfo_err_curl_off_t();                        \
+      }                                                                 \
+      curl_easy_getinfo(handle, _curl_info, arg);                       \
+    })
+
+/*
+ * For now, just make sure that the functions are called with three arguments
  */
 #define curl_share_setopt(share,opt,param) curl_share_setopt(share,opt,param)
 #define curl_multi_setopt(handle,opt,param) curl_multi_setopt(handle,opt,param)
@@ -158,83 +156,83 @@ __extension__ ({                                                              \
  * functions */
 
 /* To define a new warning, use _CURL_WARNING(identifier, "message") */
-#define _CURL_WARNING(id, message)                                            \
-  static void __attribute__((__warning__(message)))                           \
-  __attribute__((__unused__)) __attribute__((__noinline__))                   \
+#define CURLWARNING(id, message)                                        \
+  static void __attribute__((__warning__(message)))                     \
+  __attribute__((__unused__)) __attribute__((__noinline__))             \
   id(void) { __asm__(""); }
 
-_CURL_WARNING(_curl_easy_setopt_err_long,
+CURLWARNING(_curl_easy_setopt_err_long,
   "curl_easy_setopt expects a long argument for this option")
-_CURL_WARNING(_curl_easy_setopt_err_curl_off_t,
+CURLWARNING(_curl_easy_setopt_err_curl_off_t,
   "curl_easy_setopt expects a curl_off_t argument for this option")
-_CURL_WARNING(_curl_easy_setopt_err_string,
+CURLWARNING(_curl_easy_setopt_err_string,
               "curl_easy_setopt expects a "
               "string ('char *' or char[]) argument for this option"
   )
-_CURL_WARNING(_curl_easy_setopt_err_write_callback,
+CURLWARNING(_curl_easy_setopt_err_write_callback,
   "curl_easy_setopt expects a curl_write_callback argument for this option")
-_CURL_WARNING(_curl_easy_setopt_err_resolver_start_callback,
+CURLWARNING(_curl_easy_setopt_err_resolver_start_callback,
               "curl_easy_setopt expects a "
               "curl_resolver_start_callback argument for this option"
   )
-_CURL_WARNING(_curl_easy_setopt_err_read_cb,
+CURLWARNING(_curl_easy_setopt_err_read_cb,
   "curl_easy_setopt expects a curl_read_callback argument for this option")
-_CURL_WARNING(_curl_easy_setopt_err_ioctl_cb,
+CURLWARNING(_curl_easy_setopt_err_ioctl_cb,
   "curl_easy_setopt expects a curl_ioctl_callback argument for this option")
-_CURL_WARNING(_curl_easy_setopt_err_sockopt_cb,
+CURLWARNING(_curl_easy_setopt_err_sockopt_cb,
   "curl_easy_setopt expects a curl_sockopt_callback argument for this option")
-_CURL_WARNING(_curl_easy_setopt_err_opensocket_cb,
+CURLWARNING(_curl_easy_setopt_err_opensocket_cb,
               "curl_easy_setopt expects a "
               "curl_opensocket_callback argument for this option"
   )
-_CURL_WARNING(_curl_easy_setopt_err_progress_cb,
+CURLWARNING(_curl_easy_setopt_err_progress_cb,
   "curl_easy_setopt expects a curl_progress_callback argument for this option")
-_CURL_WARNING(_curl_easy_setopt_err_debug_cb,
+CURLWARNING(_curl_easy_setopt_err_debug_cb,
   "curl_easy_setopt expects a curl_debug_callback argument for this option")
-_CURL_WARNING(_curl_easy_setopt_err_ssl_ctx_cb,
+CURLWARNING(_curl_easy_setopt_err_ssl_ctx_cb,
   "curl_easy_setopt expects a curl_ssl_ctx_callback argument for this option")
-_CURL_WARNING(_curl_easy_setopt_err_conv_cb,
+CURLWARNING(_curl_easy_setopt_err_conv_cb,
   "curl_easy_setopt expects a curl_conv_callback argument for this option")
-_CURL_WARNING(_curl_easy_setopt_err_seek_cb,
+CURLWARNING(_curl_easy_setopt_err_seek_cb,
   "curl_easy_setopt expects a curl_seek_callback argument for this option")
-_CURL_WARNING(_curl_easy_setopt_err_cb_data,
+CURLWARNING(_curl_easy_setopt_err_cb_data,
               "curl_easy_setopt expects a "
               "private data pointer as argument for this option")
-_CURL_WARNING(_curl_easy_setopt_err_error_buffer,
+CURLWARNING(_curl_easy_setopt_err_error_buffer,
               "curl_easy_setopt expects a "
               "char buffer of CURL_ERROR_SIZE as argument for this option")
-_CURL_WARNING(_curl_easy_setopt_err_FILE,
+CURLWARNING(_curl_easy_setopt_err_FILE,
   "curl_easy_setopt expects a 'FILE *' argument for this option")
-_CURL_WARNING(_curl_easy_setopt_err_postfields,
+CURLWARNING(_curl_easy_setopt_err_postfields,
   "curl_easy_setopt expects a 'void *' or 'char *' argument for this option")
-_CURL_WARNING(_curl_easy_setopt_err_curl_httpost,
+CURLWARNING(_curl_easy_setopt_err_curl_httpost,
               "curl_easy_setopt expects a 'struct curl_httppost *' "
               "argument for this option")
-_CURL_WARNING(_curl_easy_setopt_err_curl_mimepost,
+CURLWARNING(_curl_easy_setopt_err_curl_mimepost,
               "curl_easy_setopt expects a 'curl_mime *' "
               "argument for this option")
-_CURL_WARNING(_curl_easy_setopt_err_curl_slist,
+CURLWARNING(_curl_easy_setopt_err_curl_slist,
   "curl_easy_setopt expects a 'struct curl_slist *' argument for this option")
-_CURL_WARNING(_curl_easy_setopt_err_CURLSH,
+CURLWARNING(_curl_easy_setopt_err_CURLSH,
   "curl_easy_setopt expects a CURLSH* argument for this option")
 
-_CURL_WARNING(_curl_easy_getinfo_err_string,
+CURLWARNING(_curl_easy_getinfo_err_string,
   "curl_easy_getinfo expects a pointer to 'char *' for this info")
-_CURL_WARNING(_curl_easy_getinfo_err_long,
+CURLWARNING(_curl_easy_getinfo_err_long,
   "curl_easy_getinfo expects a pointer to long for this info")
-_CURL_WARNING(_curl_easy_getinfo_err_double,
+CURLWARNING(_curl_easy_getinfo_err_double,
   "curl_easy_getinfo expects a pointer to double for this info")
-_CURL_WARNING(_curl_easy_getinfo_err_curl_slist,
+CURLWARNING(_curl_easy_getinfo_err_curl_slist,
   "curl_easy_getinfo expects a pointer to 'struct curl_slist *' for this info")
-_CURL_WARNING(_curl_easy_getinfo_err_curl_tlssesssioninfo,
+CURLWARNING(_curl_easy_getinfo_err_curl_tlssesssioninfo,
               "curl_easy_getinfo expects a pointer to "
               "'struct curl_tlssessioninfo *' for this info")
-_CURL_WARNING(_curl_easy_getinfo_err_curl_certinfo,
+CURLWARNING(_curl_easy_getinfo_err_curl_certinfo,
               "curl_easy_getinfo expects a pointer to "
               "'struct curl_certinfo *' for this info")
-_CURL_WARNING(_curl_easy_getinfo_err_curl_socket,
+CURLWARNING(_curl_easy_getinfo_err_curl_socket,
   "curl_easy_getinfo expects a pointer to curl_socket_t for this info")
-_CURL_WARNING(_curl_easy_getinfo_err_curl_off_t,
+CURLWARNING(_curl_easy_getinfo_err_curl_off_t,
   "curl_easy_getinfo expects a pointer to curl_off_t for this info")
 
 /* groups of curl_easy_setops options that take the same type of argument */
@@ -246,16 +244,17 @@ _CURL_WARNING(_curl_easy_getinfo_err_curl_off_t,
  */
 
 /* evaluates to true if option takes a long argument */
-#define _curl_is_long_option(option)                                          \
+#define curlcheck_long_option(option)                   \
   (0 < (option) && (option) < CURLOPTTYPE_OBJECTPOINT)
 
-#define _curl_is_off_t_option(option)                                         \
+#define curlcheck_off_t_option(option)          \
   ((option) > CURLOPTTYPE_OFF_T)
 
 /* evaluates to true if option takes a char* argument */
-#define _curl_is_string_option(option)                                        \
+#define curlcheck_string_option(option)                                       \
   ((option) == CURLOPT_ABSTRACT_UNIX_SOCKET ||                                \
    (option) == CURLOPT_ACCEPT_ENCODING ||                                     \
+   (option) == CURLOPT_ALTSVC ||                                              \
    (option) == CURLOPT_CAINFO ||                                              \
    (option) == CURLOPT_CAPATH ||                                              \
    (option) == CURLOPT_COOKIE ||                                              \
@@ -301,15 +300,18 @@ _CURL_WARNING(_curl_easy_getinfo_err_curl_off_t,
    (option) == CURLOPT_PROXY_SSLKEY ||                                        \
    (option) == CURLOPT_PROXY_SSLKEYTYPE ||                                    \
    (option) == CURLOPT_PROXY_SSL_CIPHER_LIST ||                               \
+   (option) == CURLOPT_PROXY_TLS13_CIPHERS ||                                 \
    (option) == CURLOPT_PROXY_TLSAUTH_PASSWORD ||                              \
-   (option) == CURLOPT_PROXY_TLSAUTH_USERNAME ||                              \
    (option) == CURLOPT_PROXY_TLSAUTH_TYPE ||                                  \
+   (option) == CURLOPT_PROXY_TLSAUTH_USERNAME ||                              \
    (option) == CURLOPT_RANDOM_FILE ||                                         \
    (option) == CURLOPT_RANGE ||                                               \
    (option) == CURLOPT_REFERER ||                                             \
+   (option) == CURLOPT_REQUEST_TARGET ||                                      \
    (option) == CURLOPT_RTSP_SESSION_ID ||                                     \
    (option) == CURLOPT_RTSP_STREAM_URI ||                                     \
    (option) == CURLOPT_RTSP_TRANSPORT ||                                      \
+   (option) == CURLOPT_SASL_AUTHZID ||                                        \
    (option) == CURLOPT_SERVICE_NAME ||                                        \
    (option) == CURLOPT_SOCKS5_GSSAPI_SERVICE ||                               \
    (option) == CURLOPT_SSH_HOST_PUBLIC_KEY_MD5 ||                             \
@@ -322,6 +324,7 @@ _CURL_WARNING(_curl_easy_getinfo_err_curl_off_t,
    (option) == CURLOPT_SSLKEY ||                                              \
    (option) == CURLOPT_SSLKEYTYPE ||                                          \
    (option) == CURLOPT_SSL_CIPHER_LIST ||                                     \
+   (option) == CURLOPT_TLS13_CIPHERS ||                                       \
    (option) == CURLOPT_TLSAUTH_PASSWORD ||                                    \
    (option) == CURLOPT_TLSAUTH_TYPE ||                                        \
    (option) == CURLOPT_TLSAUTH_USERNAME ||                                    \
@@ -334,18 +337,18 @@ _CURL_WARNING(_curl_easy_getinfo_err_curl_off_t,
    0)
 
 /* evaluates to true if option takes a curl_write_callback argument */
-#define _curl_is_write_cb_option(option)                                      \
-  ((option) == CURLOPT_HEADERFUNCTION ||                                      \
+#define curlcheck_write_cb_option(option)                               \
+  ((option) == CURLOPT_HEADERFUNCTION ||                                \
    (option) == CURLOPT_WRITEFUNCTION)
 
 /* evaluates to true if option takes a curl_conv_callback argument */
-#define _curl_is_conv_cb_option(option)                                       \
-  ((option) == CURLOPT_CONV_TO_NETWORK_FUNCTION ||                            \
-   (option) == CURLOPT_CONV_FROM_NETWORK_FUNCTION ||                          \
+#define curlcheck_conv_cb_option(option)                                \
+  ((option) == CURLOPT_CONV_TO_NETWORK_FUNCTION ||                      \
+   (option) == CURLOPT_CONV_FROM_NETWORK_FUNCTION ||                    \
    (option) == CURLOPT_CONV_FROM_UTF8_FUNCTION)
 
 /* evaluates to true if option takes a data argument to pass to a callback */
-#define _curl_is_cb_data_option(option)                                       \
+#define curlcheck_cb_data_option(option)                                      \
   ((option) == CURLOPT_CHUNK_DATA ||                                          \
    (option) == CURLOPT_CLOSESOCKETDATA ||                                     \
    (option) == CURLOPT_DEBUGDATA ||                                           \
@@ -363,16 +366,17 @@ _CURL_WARNING(_curl_easy_getinfo_err_curl_off_t,
    (option) == CURLOPT_SSL_CTX_DATA ||                                        \
    (option) == CURLOPT_WRITEDATA ||                                           \
    (option) == CURLOPT_RESOLVER_START_DATA ||                                 \
+   (option) == CURLOPT_TRAILERDATA ||                                         \
    0)
 
 /* evaluates to true if option takes a POST data argument (void* or char*) */
-#define _curl_is_postfields_option(option)                                    \
+#define curlcheck_postfields_option(option)                                   \
   ((option) == CURLOPT_POSTFIELDS ||                                          \
    (option) == CURLOPT_COPYPOSTFIELDS ||                                      \
    0)
 
 /* evaluates to true if option takes a struct curl_slist * argument */
-#define _curl_is_slist_option(option)                                         \
+#define curlcheck_slist_option(option)                                        \
   ((option) == CURLOPT_HTTP200ALIASES ||                                      \
    (option) == CURLOPT_HTTPHEADER ||                                          \
    (option) == CURLOPT_MAIL_RCPT ||                                           \
@@ -382,45 +386,46 @@ _CURL_WARNING(_curl_easy_getinfo_err_curl_off_t,
    (option) == CURLOPT_QUOTE ||                                               \
    (option) == CURLOPT_RESOLVE ||                                             \
    (option) == CURLOPT_TELNETOPTIONS ||                                       \
+   (option) == CURLOPT_CONNECT_TO ||                                          \
    0)
 
 /* groups of curl_easy_getinfo infos that take the same type of argument */
 
 /* evaluates to true if info expects a pointer to char * argument */
-#define _curl_is_string_info(info)                                            \
+#define curlcheck_string_info(info)                     \
   (CURLINFO_STRING < (info) && (info) < CURLINFO_LONG)
 
 /* evaluates to true if info expects a pointer to long argument */
-#define _curl_is_long_info(info)                                              \
+#define curlcheck_long_info(info)                       \
   (CURLINFO_LONG < (info) && (info) < CURLINFO_DOUBLE)
 
 /* evaluates to true if info expects a pointer to double argument */
-#define _curl_is_double_info(info)                                            \
+#define curlcheck_double_info(info)                     \
   (CURLINFO_DOUBLE < (info) && (info) < CURLINFO_SLIST)
 
 /* true if info expects a pointer to struct curl_slist * argument */
-#define _curl_is_slist_info(info)                                       \
+#define curlcheck_slist_info(info)                                      \
   (((info) == CURLINFO_SSL_ENGINES) || ((info) == CURLINFO_COOKIELIST))
 
 /* true if info expects a pointer to struct curl_tlssessioninfo * argument */
-#define _curl_is_tlssessioninfo_info(info)                              \
+#define curlcheck_tlssessioninfo_info(info)                              \
   (((info) == CURLINFO_TLS_SSL_PTR) || ((info) == CURLINFO_TLS_SESSION))
 
 /* true if info expects a pointer to struct curl_certinfo * argument */
-#define _curl_is_certinfo_info(info) ((info) == CURLINFO_CERTINFO)
+#define curlcheck_certinfo_info(info) ((info) == CURLINFO_CERTINFO)
 
 /* true if info expects a pointer to struct curl_socket_t argument */
-#define _curl_is_socket_info(info)                                            \
+#define curlcheck_socket_info(info)                     \
   (CURLINFO_SOCKET < (info) && (info) < CURLINFO_OFF_T)
 
 /* true if info expects a pointer to curl_off_t argument */
-#define _curl_is_off_t_info(info)                                             \
+#define curlcheck_off_t_info(info)              \
   (CURLINFO_OFF_T < (info))
 
 
 /* typecheck helpers -- check whether given expression has requested type*/
 
-/* For pointers, you can use the _curl_is_ptr/_curl_is_arr macros,
+/* For pointers, you can use the curlcheck_ptr/curlcheck_arr macros,
  * otherwise define a new macro. Search for __builtin_types_compatible_p
  * in the GCC manual.
  * NOTE: these macros MUST NOT EVALUATE their arguments! The argument is
@@ -430,35 +435,35 @@ _CURL_WARNING(_curl_easy_getinfo_err_curl_off_t,
  */
 
 /* XXX: should evaluate to true if expr is a pointer */
-#define _curl_is_any_ptr(expr)                                                \
+#define curlcheck_any_ptr(expr)                 \
   (sizeof(expr) == sizeof(void *))
 
 /* evaluates to true if expr is NULL */
 /* XXX: must not evaluate expr, so this check is not accurate */
-#define _curl_is_NULL(expr)                                                   \
+#define curlcheck_NULL(expr)                                            \
   (__builtin_types_compatible_p(__typeof__(expr), __typeof__(NULL)))
 
 /* evaluates to true if expr is type*, const type* or NULL */
-#define _curl_is_ptr(expr, type)                                              \
-  (_curl_is_NULL(expr) ||                                                     \
-   __builtin_types_compatible_p(__typeof__(expr), type *) ||                  \
+#define curlcheck_ptr(expr, type)                                       \
+  (curlcheck_NULL(expr) ||                                              \
+   __builtin_types_compatible_p(__typeof__(expr), type *) ||            \
    __builtin_types_compatible_p(__typeof__(expr), const type *))
 
 /* evaluates to true if expr is one of type[], type*, NULL or const type* */
-#define _curl_is_arr(expr, type)                                              \
-  (_curl_is_ptr((expr), type) ||                                              \
+#define curlcheck_arr(expr, type)                                       \
+  (curlcheck_ptr((expr), type) ||                                       \
    __builtin_types_compatible_p(__typeof__(expr), type []))
 
 /* evaluates to true if expr is a string */
-#define _curl_is_string(expr)                                                 \
-  (_curl_is_arr((expr), char) ||                                              \
-   _curl_is_arr((expr), signed char) ||                                       \
-   _curl_is_arr((expr), unsigned char))
+#define curlcheck_string(expr)                                          \
+  (curlcheck_arr((expr), char) ||                                       \
+   curlcheck_arr((expr), signed char) ||                                \
+   curlcheck_arr((expr), unsigned char))
 
 /* evaluates to true if expr is a long (no matter the signedness)
  * XXX: for now, int is also accepted (and therefore short and char, which
  * are promoted to int when passed to a variadic function) */
-#define _curl_is_long(expr)                                                   \
+#define curlcheck_long(expr)                                                  \
   (__builtin_types_compatible_p(__typeof__(expr), long) ||                    \
    __builtin_types_compatible_p(__typeof__(expr), signed long) ||             \
    __builtin_types_compatible_p(__typeof__(expr), unsigned long) ||           \
@@ -473,63 +478,59 @@ _CURL_WARNING(_curl_easy_getinfo_err_curl_off_t,
    __builtin_types_compatible_p(__typeof__(expr), unsigned char))
 
 /* evaluates to true if expr is of type curl_off_t */
-#define _curl_is_off_t(expr)                                                  \
+#define curlcheck_off_t(expr)                                   \
   (__builtin_types_compatible_p(__typeof__(expr), curl_off_t))
 
 /* evaluates to true if expr is abuffer suitable for CURLOPT_ERRORBUFFER */
 /* XXX: also check size of an char[] array? */
-#define _curl_is_error_buffer(expr)                                           \
-  (_curl_is_NULL(expr) ||                                                     \
-   __builtin_types_compatible_p(__typeof__(expr), char *) ||                  \
+#define curlcheck_error_buffer(expr)                                    \
+  (curlcheck_NULL(expr) ||                                              \
+   __builtin_types_compatible_p(__typeof__(expr), char *) ||            \
    __builtin_types_compatible_p(__typeof__(expr), char[]))
 
 /* evaluates to true if expr is of type (const) void* or (const) FILE* */
 #if 0
-#define _curl_is_cb_data(expr)                                                \
-  (_curl_is_ptr((expr), void) ||                                              \
-   _curl_is_ptr((expr), FILE))
+#define curlcheck_cb_data(expr)                                         \
+  (curlcheck_ptr((expr), void) ||                                       \
+   curlcheck_ptr((expr), FILE))
 #else /* be less strict */
-#define _curl_is_cb_data(expr)                                                \
-  _curl_is_any_ptr(expr)
+#define curlcheck_cb_data(expr)                 \
+  curlcheck_any_ptr(expr)
 #endif
 
 /* evaluates to true if expr is of type FILE* */
-#define _curl_is_FILE(expr)                                             \
-  (_curl_is_NULL(expr) ||                                              \
+#define curlcheck_FILE(expr)                                            \
+  (curlcheck_NULL(expr) ||                                              \
    (__builtin_types_compatible_p(__typeof__(expr), FILE *)))
 
 /* evaluates to true if expr can be passed as POST data (void* or char*) */
-#define _curl_is_postfields(expr)                                             \
-  (_curl_is_ptr((expr), void) ||                                              \
-   _curl_is_arr((expr), char) ||                                              \
-   _curl_is_arr((expr), unsigned char))
-
-/* FIXME: the whole callback checking is messy...
- * The idea is to tolerate char vs. void and const vs. not const
- * pointers in arguments at least
- */
+#define curlcheck_postfields(expr)                                      \
+  (curlcheck_ptr((expr), void) ||                                       \
+   curlcheck_arr((expr), char) ||                                       \
+   curlcheck_arr((expr), unsigned char))
+
 /* helper: __builtin_types_compatible_p distinguishes between functions and
  * function pointers, hide it */
-#define _curl_callback_compatible(func, type)                                 \
-  (__builtin_types_compatible_p(__typeof__(func), type) ||                    \
+#define curlcheck_cb_compatible(func, type)                             \
+  (__builtin_types_compatible_p(__typeof__(func), type) ||              \
    __builtin_types_compatible_p(__typeof__(func) *, type))
 
 /* evaluates to true if expr is of type curl_resolver_start_callback */
-#define _curl_is_resolver_start_callback(expr)       \
-  (_curl_is_NULL(expr) || \
-   _curl_callback_compatible((expr), curl_resolver_start_callback))
+#define curlcheck_resolver_start_callback(expr)       \
+  (curlcheck_NULL(expr) || \
+   curlcheck_cb_compatible((expr), curl_resolver_start_callback))
 
 /* evaluates to true if expr is of type curl_read_callback or "similar" */
-#define _curl_is_read_cb(expr)                                          \
-  (_curl_is_NULL(expr) ||                                                     \
-   _curl_callback_compatible((expr), __typeof__(fread) *) ||                  \
-   _curl_callback_compatible((expr), curl_read_callback) ||                   \
-   _curl_callback_compatible((expr), _curl_read_callback1) ||                 \
-   _curl_callback_compatible((expr), _curl_read_callback2) ||                 \
-   _curl_callback_compatible((expr), _curl_read_callback3) ||                 \
-   _curl_callback_compatible((expr), _curl_read_callback4) ||                 \
-   _curl_callback_compatible((expr), _curl_read_callback5) ||                 \
-   _curl_callback_compatible((expr), _curl_read_callback6))
+#define curlcheck_read_cb(expr)                                         \
+  (curlcheck_NULL(expr) ||                                              \
+   curlcheck_cb_compatible((expr), __typeof__(fread) *) ||              \
+   curlcheck_cb_compatible((expr), curl_read_callback) ||               \
+   curlcheck_cb_compatible((expr), _curl_read_callback1) ||             \
+   curlcheck_cb_compatible((expr), _curl_read_callback2) ||             \
+   curlcheck_cb_compatible((expr), _curl_read_callback3) ||             \
+   curlcheck_cb_compatible((expr), _curl_read_callback4) ||             \
+   curlcheck_cb_compatible((expr), _curl_read_callback5) ||             \
+   curlcheck_cb_compatible((expr), _curl_read_callback6))
 typedef size_t (*_curl_read_callback1)(char *, size_t, size_t, void *);
 typedef size_t (*_curl_read_callback2)(char *, size_t, size_t, const void *);
 typedef size_t (*_curl_read_callback3)(char *, size_t, size_t, FILE *);
@@ -538,16 +539,16 @@ typedef size_t (*_curl_read_callback5)(void *, size_t, size_t, const void *);
 typedef size_t (*_curl_read_callback6)(void *, size_t, size_t, FILE *);
 
 /* evaluates to true if expr is of type curl_write_callback or "similar" */
-#define _curl_is_write_cb(expr)                                               \
-  (_curl_is_read_cb(expr) ||                                            \
-   _curl_callback_compatible((expr), __typeof__(fwrite) *) ||                 \
-   _curl_callback_compatible((expr), curl_write_callback) ||                  \
-   _curl_callback_compatible((expr), _curl_write_callback1) ||                \
-   _curl_callback_compatible((expr), _curl_write_callback2) ||                \
-   _curl_callback_compatible((expr), _curl_write_callback3) ||                \
-   _curl_callback_compatible((expr), _curl_write_callback4) ||                \
-   _curl_callback_compatible((expr), _curl_write_callback5) ||                \
-   _curl_callback_compatible((expr), _curl_write_callback6))
+#define curlcheck_write_cb(expr)                                        \
+  (curlcheck_read_cb(expr) ||                                           \
+   curlcheck_cb_compatible((expr), __typeof__(fwrite) *) ||             \
+   curlcheck_cb_compatible((expr), curl_write_callback) ||              \
+   curlcheck_cb_compatible((expr), _curl_write_callback1) ||            \
+   curlcheck_cb_compatible((expr), _curl_write_callback2) ||            \
+   curlcheck_cb_compatible((expr), _curl_write_callback3) ||            \
+   curlcheck_cb_compatible((expr), _curl_write_callback4) ||            \
+   curlcheck_cb_compatible((expr), _curl_write_callback5) ||            \
+   curlcheck_cb_compatible((expr), _curl_write_callback6))
 typedef size_t (*_curl_write_callback1)(const char *, size_t, size_t, void *);
 typedef size_t (*_curl_write_callback2)(const char *, size_t, size_t,
                                        const void *);
@@ -558,37 +559,37 @@ typedef size_t (*_curl_write_callback5)(const void *, size_t, size_t,
 typedef size_t (*_curl_write_callback6)(const void *, size_t, size_t, FILE *);
 
 /* evaluates to true if expr is of type curl_ioctl_callback or "similar" */
-#define _curl_is_ioctl_cb(expr)                                         \
-  (_curl_is_NULL(expr) ||                                                     \
-   _curl_callback_compatible((expr), curl_ioctl_callback) ||                  \
-   _curl_callback_compatible((expr), _curl_ioctl_callback1) ||                \
-   _curl_callback_compatible((expr), _curl_ioctl_callback2) ||                \
-   _curl_callback_compatible((expr), _curl_ioctl_callback3) ||                \
-   _curl_callback_compatible((expr), _curl_ioctl_callback4))
+#define curlcheck_ioctl_cb(expr)                                        \
+  (curlcheck_NULL(expr) ||                                              \
+   curlcheck_cb_compatible((expr), curl_ioctl_callback) ||              \
+   curlcheck_cb_compatible((expr), _curl_ioctl_callback1) ||            \
+   curlcheck_cb_compatible((expr), _curl_ioctl_callback2) ||            \
+   curlcheck_cb_compatible((expr), _curl_ioctl_callback3) ||            \
+   curlcheck_cb_compatible((expr), _curl_ioctl_callback4))
 typedef curlioerr (*_curl_ioctl_callback1)(CURL *, int, void *);
 typedef curlioerr (*_curl_ioctl_callback2)(CURL *, int, const void *);
 typedef curlioerr (*_curl_ioctl_callback3)(CURL *, curliocmd, void *);
 typedef curlioerr (*_curl_ioctl_callback4)(CURL *, curliocmd, const void *);
 
 /* evaluates to true if expr is of type curl_sockopt_callback or "similar" */
-#define _curl_is_sockopt_cb(expr)                                       \
-  (_curl_is_NULL(expr) ||                                                     \
-   _curl_callback_compatible((expr), curl_sockopt_callback) ||                \
-   _curl_callback_compatible((expr), _curl_sockopt_callback1) ||              \
-   _curl_callback_compatible((expr), _curl_sockopt_callback2))
+#define curlcheck_sockopt_cb(expr)                                      \
+  (curlcheck_NULL(expr) ||                                              \
+   curlcheck_cb_compatible((expr), curl_sockopt_callback) ||            \
+   curlcheck_cb_compatible((expr), _curl_sockopt_callback1) ||          \
+   curlcheck_cb_compatible((expr), _curl_sockopt_callback2))
 typedef int (*_curl_sockopt_callback1)(void *, curl_socket_t, curlsocktype);
 typedef int (*_curl_sockopt_callback2)(const void *, curl_socket_t,
                                       curlsocktype);
 
 /* evaluates to true if expr is of type curl_opensocket_callback or
    "similar" */
-#define _curl_is_opensocket_cb(expr)                                    \
-  (_curl_is_NULL(expr) ||                                                     \
-   _curl_callback_compatible((expr), curl_opensocket_callback) ||             \
-   _curl_callback_compatible((expr), _curl_opensocket_callback1) ||           \
-   _curl_callback_compatible((expr), _curl_opensocket_callback2) ||           \
-   _curl_callback_compatible((expr), _curl_opensocket_callback3) ||           \
-   _curl_callback_compatible((expr), _curl_opensocket_callback4))
+#define curlcheck_opensocket_cb(expr)                                   \
+  (curlcheck_NULL(expr) ||                                              \
+   curlcheck_cb_compatible((expr), curl_opensocket_callback) ||         \
+   curlcheck_cb_compatible((expr), _curl_opensocket_callback1) ||       \
+   curlcheck_cb_compatible((expr), _curl_opensocket_callback2) ||       \
+   curlcheck_cb_compatible((expr), _curl_opensocket_callback3) ||       \
+   curlcheck_cb_compatible((expr), _curl_opensocket_callback4))
 typedef curl_socket_t (*_curl_opensocket_callback1)
   (void *, curlsocktype, struct curl_sockaddr *);
 typedef curl_socket_t (*_curl_opensocket_callback2)
@@ -599,28 +600,28 @@ typedef curl_socket_t (*_curl_opensocket_callback4)
   (const void *, curlsocktype, const struct curl_sockaddr *);
 
 /* evaluates to true if expr is of type curl_progress_callback or "similar" */
-#define _curl_is_progress_cb(expr)                                      \
-  (_curl_is_NULL(expr) ||                                                     \
-   _curl_callback_compatible((expr), curl_progress_callback) ||               \
-   _curl_callback_compatible((expr), _curl_progress_callback1) ||             \
-   _curl_callback_compatible((expr), _curl_progress_callback2))
+#define curlcheck_progress_cb(expr)                                     \
+  (curlcheck_NULL(expr) ||                                              \
+   curlcheck_cb_compatible((expr), curl_progress_callback) ||           \
+   curlcheck_cb_compatible((expr), _curl_progress_callback1) ||         \
+   curlcheck_cb_compatible((expr), _curl_progress_callback2))
 typedef int (*_curl_progress_callback1)(void *,
     double, double, double, double);
 typedef int (*_curl_progress_callback2)(const void *,
     double, double, double, double);
 
 /* evaluates to true if expr is of type curl_debug_callback or "similar" */
-#define _curl_is_debug_cb(expr)                                         \
-  (_curl_is_NULL(expr) ||                                                     \
-   _curl_callback_compatible((expr), curl_debug_callback) ||                  \
-   _curl_callback_compatible((expr), _curl_debug_callback1) ||                \
-   _curl_callback_compatible((expr), _curl_debug_callback2) ||                \
-   _curl_callback_compatible((expr), _curl_debug_callback3) ||                \
-   _curl_callback_compatible((expr), _curl_debug_callback4) ||                \
-   _curl_callback_compatible((expr), _curl_debug_callback5) ||                \
-   _curl_callback_compatible((expr), _curl_debug_callback6) ||                \
-   _curl_callback_compatible((expr), _curl_debug_callback7) ||                \
-   _curl_callback_compatible((expr), _curl_debug_callback8))
+#define curlcheck_debug_cb(expr)                                        \
+  (curlcheck_NULL(expr) ||                                              \
+   curlcheck_cb_compatible((expr), curl_debug_callback) ||              \
+   curlcheck_cb_compatible((expr), _curl_debug_callback1) ||            \
+   curlcheck_cb_compatible((expr), _curl_debug_callback2) ||            \
+   curlcheck_cb_compatible((expr), _curl_debug_callback3) ||            \
+   curlcheck_cb_compatible((expr), _curl_debug_callback4) ||            \
+   curlcheck_cb_compatible((expr), _curl_debug_callback5) ||            \
+   curlcheck_cb_compatible((expr), _curl_debug_callback6) ||            \
+   curlcheck_cb_compatible((expr), _curl_debug_callback7) ||            \
+   curlcheck_cb_compatible((expr), _curl_debug_callback8))
 typedef int (*_curl_debug_callback1) (CURL *,
     curl_infotype, char *, size_t, void *);
 typedef int (*_curl_debug_callback2) (CURL *,
@@ -640,17 +641,17 @@ typedef int (*_curl_debug_callback8) (CURL *,
 
 /* evaluates to true if expr is of type curl_ssl_ctx_callback or "similar" */
 /* this is getting even messier... */
-#define _curl_is_ssl_ctx_cb(expr)                                       \
-  (_curl_is_NULL(expr) ||                                                     \
-   _curl_callback_compatible((expr), curl_ssl_ctx_callback) ||                \
-   _curl_callback_compatible((expr), _curl_ssl_ctx_callback1) ||              \
-   _curl_callback_compatible((expr), _curl_ssl_ctx_callback2) ||              \
-   _curl_callback_compatible((expr), _curl_ssl_ctx_callback3) ||              \
-   _curl_callback_compatible((expr), _curl_ssl_ctx_callback4) ||              \
-   _curl_callback_compatible((expr), _curl_ssl_ctx_callback5) ||              \
-   _curl_callback_compatible((expr), _curl_ssl_ctx_callback6) ||              \
-   _curl_callback_compatible((expr), _curl_ssl_ctx_callback7) ||              \
-   _curl_callback_compatible((expr), _curl_ssl_ctx_callback8))
+#define curlcheck_ssl_ctx_cb(expr)                                      \
+  (curlcheck_NULL(expr) ||                                              \
+   curlcheck_cb_compatible((expr), curl_ssl_ctx_callback) ||            \
+   curlcheck_cb_compatible((expr), _curl_ssl_ctx_callback1) ||          \
+   curlcheck_cb_compatible((expr), _curl_ssl_ctx_callback2) ||          \
+   curlcheck_cb_compatible((expr), _curl_ssl_ctx_callback3) ||          \
+   curlcheck_cb_compatible((expr), _curl_ssl_ctx_callback4) ||          \
+   curlcheck_cb_compatible((expr), _curl_ssl_ctx_callback5) ||          \
+   curlcheck_cb_compatible((expr), _curl_ssl_ctx_callback6) ||          \
+   curlcheck_cb_compatible((expr), _curl_ssl_ctx_callback7) ||          \
+   curlcheck_cb_compatible((expr), _curl_ssl_ctx_callback8))
 typedef CURLcode (*_curl_ssl_ctx_callback1)(CURL *, void *, void *);
 typedef CURLcode (*_curl_ssl_ctx_callback2)(CURL *, void *, const void *);
 typedef CURLcode (*_curl_ssl_ctx_callback3)(CURL *, const void *, void *);
@@ -673,26 +674,26 @@ typedef _curl_ssl_ctx_callback1 _curl_ssl_ctx_callback8;
 #endif
 
 /* evaluates to true if expr is of type curl_conv_callback or "similar" */
-#define _curl_is_conv_cb(expr)                                          \
-  (_curl_is_NULL(expr) ||                                                     \
-   _curl_callback_compatible((expr), curl_conv_callback) ||                   \
-   _curl_callback_compatible((expr), _curl_conv_callback1) ||                 \
-   _curl_callback_compatible((expr), _curl_conv_callback2) ||                 \
-   _curl_callback_compatible((expr), _curl_conv_callback3) ||                 \
-   _curl_callback_compatible((expr), _curl_conv_callback4))
+#define curlcheck_conv_cb(expr)                                         \
+  (curlcheck_NULL(expr) ||                                              \
+   curlcheck_cb_compatible((expr), curl_conv_callback) ||               \
+   curlcheck_cb_compatible((expr), _curl_conv_callback1) ||             \
+   curlcheck_cb_compatible((expr), _curl_conv_callback2) ||             \
+   curlcheck_cb_compatible((expr), _curl_conv_callback3) ||             \
+   curlcheck_cb_compatible((expr), _curl_conv_callback4))
 typedef CURLcode (*_curl_conv_callback1)(char *, size_t length);
 typedef CURLcode (*_curl_conv_callback2)(const char *, size_t length);
 typedef CURLcode (*_curl_conv_callback3)(void *, size_t length);
 typedef CURLcode (*_curl_conv_callback4)(const void *, size_t length);
 
 /* evaluates to true if expr is of type curl_seek_callback or "similar" */
-#define _curl_is_seek_cb(expr)                                          \
-  (_curl_is_NULL(expr) ||                                                     \
-   _curl_callback_compatible((expr), curl_seek_callback) ||                   \
-   _curl_callback_compatible((expr), _curl_seek_callback1) ||                 \
-   _curl_callback_compatible((expr), _curl_seek_callback2))
+#define curlcheck_seek_cb(expr)                                         \
+  (curlcheck_NULL(expr) ||                                              \
+   curlcheck_cb_compatible((expr), curl_seek_callback) ||               \
+   curlcheck_cb_compatible((expr), _curl_seek_callback1) ||             \
+   curlcheck_cb_compatible((expr), _curl_seek_callback2))
 typedef CURLcode (*_curl_seek_callback1)(void *, curl_off_t, int);
 typedef CURLcode (*_curl_seek_callback2)(const void *, curl_off_t, int);
 
 
-#endif /* __CURL_TYPECHECK_GCC_H */
+#endif /* CURLINC_TYPECHECK_GCC_H */
index 90dd56c..f2d0677 100644 (file)
@@ -1,5 +1,5 @@
-#ifndef __CURL_URLAPI_H
-#define __CURL_URLAPI_H
+#ifndef CURLINC_URLAPI_H
+#define CURLINC_URLAPI_H
 /***************************************************************************
  *                                  _   _ ____  _
  *  Project                     ___| | | |  _ \| |
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 2018 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -22,6 +22,8 @@
  *
  ***************************************************************************/
 
+#include "curl.h"
+
 #ifdef  __cplusplus
 extern "C" {
 #endif
@@ -58,7 +60,8 @@ typedef enum {
   CURLUPART_PORT,
   CURLUPART_PATH,
   CURLUPART_QUERY,
-  CURLUPART_FRAGMENT
+  CURLUPART_FRAGMENT,
+  CURLUPART_ZONEID /* added in 7.65.0 */
 } CURLUPart;
 
 #define CURLU_DEFAULT_PORT (1<<0)       /* return default port number */
@@ -74,6 +77,8 @@ typedef enum {
 #define CURLU_URLENCODE (1<<7)          /* URL encode on set */
 #define CURLU_APPENDQUERY (1<<8)        /* append a form style part */
 #define CURLU_GUESS_SCHEME (1<<9)       /* legacy curl-style guessing */
+#define CURLU_NO_AUTHORITY (1<<10)      /* Allow empty authority when the
+                                           scheme is unknown. */
 
 typedef struct Curl_URL CURLU;
 
@@ -117,4 +122,4 @@ CURL_EXTERN CURLUcode curl_url_set(CURLU *handle, CURLUPart what,
 } /* end of extern "C" */
 #endif
 
-#endif
+#endif /* CURLINC_URLAPI_H */
index eca9a8a..a9c90b6 100644 (file)
@@ -20,7 +20,6 @@ list(APPEND HHEADERS
 
 if(MSVC)
   list(APPEND CSOURCES libcurl.rc)
-  set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /wd4127")
 endif()
 
 # SET(CSOURCES
index 5f335ce..942cd0c 100644 (file)
@@ -157,7 +157,7 @@ CFLAGS += -DUSE_LIBSSH2 -DHAVE_LIBSSH2_H -I"$(LIBSSH2_ROOT)/include" -I"$(LIBSSH
 !endif
 
 !ifdef %use_ssl
-CFLAGS += -wcd=138 -dUSE_OPENSSL -dUSE_SSLEAY -I"$(OPENSSL_ROOT)/inc32"
+CFLAGS += -wcd=138 -dUSE_OPENSSL -I"$(OPENSSL_ROOT)/inc32"
 !endif
 
 !ifdef %use_ares
index a7b5262..516a239 100644 (file)
@@ -5,7 +5,7 @@
 #                            | (__| |_| |  _ <| |___
 #                             \___|\___/|_| \_\_____|
 #
-# Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 #
 # This software is licensed as described in the file COPYING, which
 # you should have received as part of this distribution. The terms
@@ -23,14 +23,13 @@ AUTOMAKE_OPTIONS = foreign nostdinc
 
 CMAKE_DIST = CMakeLists.txt curl_config.h.cmake
 
-EXTRA_DIST = Makefile.m32 config-win32.h                            \
- config-win32ce.h config-riscos.h config-mac.h curl_config.h.in     \
+EXTRA_DIST = Makefile.m32 config-win32.h config-win32ce.h           \
+ config-plan9.h config-riscos.h config-mac.h curl_config.h.in       \
  makefile.dj config-dos.h libcurl.plist libcurl.rc config-amigaos.h \
  makefile.amiga Makefile.netware nwlib.c nwos.c config-win32ce.h    \
  config-os400.h setup-os400.h config-symbian.h Makefile.Watcom      \
  config-tpf.h mk-ca-bundle.pl mk-ca-bundle.vbs $(CMAKE_DIST)        \
- firefox-db2pem.sh config-vxworks.h Makefile.vxworks checksrc.pl    \
- objnames-test08.sh objnames-test10.sh objnames.inc
+ firefox-db2pem.sh config-vxworks.h Makefile.vxworks checksrc.pl
 
 lib_LTLIBRARIES = libcurl.la
 
@@ -66,7 +65,7 @@ endif
 # Prevent LIBS from being used for all link targets
 LIBS = $(BLANK_AT_MAKETIME)
 
-VERSIONINFO=-version-info 9:0:5
+VERSIONINFO=-version-info 10:0:6
 # This flag accepts an argument of the form current[:revision[:age]]. So,
 # passing -version-info 3:12:1 sets current to 3, revision to 12, and age to
 # 1.
@@ -88,10 +87,6 @@ libcurl_la_CPPFLAGS_EXTRA =
 libcurl_la_LDFLAGS_EXTRA =
 libcurl_la_CFLAGS_EXTRA =
 
-@CODE_COVERAGE_RULES@
-libcurl_la_LDFLAGS_EXTRA += $(CODE_COVERAGE_LDFLAGS)
-libcurl_la_CFLAGS_EXTRA += $(CODE_COVERAGE_CFLAGS)
-
 if CURL_LT_SHLIB_USE_VERSION_INFO
 libcurl_la_LDFLAGS_EXTRA += $(VERSIONINFO)
 endif
@@ -136,9 +131,14 @@ include Makefile.inc
 libcurl_la_SOURCES = $(CSOURCES) $(HHEADERS)
 libcurlu_la_SOURCES = $(CSOURCES) $(HHEADERS)
 
+CHECKSRC = $(CS_$(V))
+CS_0 = @echo "  RUN     " $@;
+CS_1 =
+CS_ = $(CS_0)
+
 checksrc:
-       @PERL@ $(srcdir)/checksrc.pl -D$(srcdir) -W$(srcdir)/curl_config.h      \
-       $(srcdir)/*.[ch] $(srcdir)/vauth/*.[ch] $(srcdir)/vtls/*.[ch]
+       $(CHECKSRC)(@PERL@ $(srcdir)/checksrc.pl -D$(srcdir) -W$(srcdir)/curl_config.h \
+       $(srcdir)/*.[ch] $(srcdir)/vauth/*.[ch] $(srcdir)/vtls/*.[ch] $(srcdir)/vquic/*.[ch] $(srcdir)/vssh/*.[ch])
 
 if CURLDEBUG
 # for debug builds, we scan the sources on all regular make invokes
index c93fec8..9259841 100644 (file)
@@ -21,7 +21,7 @@
 #                            | (__| |_| |  _ <| |___
 #                             \___|\___/|_| \_\_____|
 #
-# Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 #
 # This software is licensed as described in the file COPYING, which
 # you should have received as part of this distribution. The terms
@@ -124,8 +124,7 @@ host_triplet = @host@
 @DOING_CURL_SYMBOL_HIDING_TRUE@am__append_9 = $(CFLAG_CURL_SYMBOL_HIDING)
 subdir = lib
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/ax_code_coverage.m4 \
-       $(top_srcdir)/m4/ax_compile_check_sizeof.m4 \
+am__aclocal_m4_deps = $(top_srcdir)/m4/ax_compile_check_sizeof.m4 \
        $(top_srcdir)/m4/curl-compilers.m4 \
        $(top_srcdir)/m4/curl-confopts.m4 \
        $(top_srcdir)/m4/curl-functions.m4 \
@@ -206,31 +205,31 @@ am__objects_1 = libcurl_la-file.lo libcurl_la-timeval.lo \
        libcurl_la-hostsyn.lo libcurl_la-inet_ntop.lo \
        libcurl_la-parsedate.lo libcurl_la-select.lo \
        libcurl_la-tftp.lo libcurl_la-splay.lo libcurl_la-strdup.lo \
-       libcurl_la-socks.lo libcurl_la-ssh.lo libcurl_la-ssh-libssh.lo \
-       libcurl_la-curl_addrinfo.lo libcurl_la-socks_gssapi.lo \
-       libcurl_la-socks_sspi.lo libcurl_la-curl_sspi.lo \
-       libcurl_la-slist.lo libcurl_la-nonblock.lo \
-       libcurl_la-curl_memrchr.lo libcurl_la-imap.lo \
-       libcurl_la-pop3.lo libcurl_la-smtp.lo libcurl_la-pingpong.lo \
-       libcurl_la-rtsp.lo libcurl_la-curl_threads.lo \
-       libcurl_la-warnless.lo libcurl_la-hmac.lo \
-       libcurl_la-curl_rtmp.lo libcurl_la-openldap.lo \
-       libcurl_la-curl_gethostname.lo libcurl_la-gopher.lo \
-       libcurl_la-idn_win32.lo libcurl_la-http_proxy.lo \
-       libcurl_la-non-ascii.lo libcurl_la-asyn-ares.lo \
-       libcurl_la-asyn-thread.lo libcurl_la-curl_gssapi.lo \
-       libcurl_la-http_ntlm.lo libcurl_la-curl_ntlm_wb.lo \
-       libcurl_la-curl_ntlm_core.lo libcurl_la-curl_sasl.lo \
-       libcurl_la-rand.lo libcurl_la-curl_multibyte.lo \
-       libcurl_la-hostcheck.lo libcurl_la-conncache.lo \
-       libcurl_la-pipeline.lo libcurl_la-dotdot.lo \
+       libcurl_la-socks.lo libcurl_la-curl_addrinfo.lo \
+       libcurl_la-socks_gssapi.lo libcurl_la-socks_sspi.lo \
+       libcurl_la-curl_sspi.lo libcurl_la-slist.lo \
+       libcurl_la-nonblock.lo libcurl_la-curl_memrchr.lo \
+       libcurl_la-imap.lo libcurl_la-pop3.lo libcurl_la-smtp.lo \
+       libcurl_la-pingpong.lo libcurl_la-rtsp.lo \
+       libcurl_la-curl_threads.lo libcurl_la-warnless.lo \
+       libcurl_la-hmac.lo libcurl_la-curl_rtmp.lo \
+       libcurl_la-openldap.lo libcurl_la-curl_gethostname.lo \
+       libcurl_la-gopher.lo libcurl_la-idn_win32.lo \
+       libcurl_la-http_proxy.lo libcurl_la-non-ascii.lo \
+       libcurl_la-asyn-ares.lo libcurl_la-asyn-thread.lo \
+       libcurl_la-curl_gssapi.lo libcurl_la-http_ntlm.lo \
+       libcurl_la-curl_ntlm_wb.lo libcurl_la-curl_ntlm_core.lo \
+       libcurl_la-curl_sasl.lo libcurl_la-rand.lo \
+       libcurl_la-curl_multibyte.lo libcurl_la-hostcheck.lo \
+       libcurl_la-conncache.lo libcurl_la-dotdot.lo \
        libcurl_la-x509asn1.lo libcurl_la-http2.lo libcurl_la-smb.lo \
        libcurl_la-curl_endian.lo libcurl_la-curl_des.lo \
        libcurl_la-system_win32.lo libcurl_la-mime.lo \
        libcurl_la-sha256.lo libcurl_la-setopt.lo \
        libcurl_la-curl_path.lo libcurl_la-curl_ctype.lo \
        libcurl_la-curl_range.lo libcurl_la-psl.lo libcurl_la-doh.lo \
-       libcurl_la-urlapi.lo
+       libcurl_la-urlapi.lo libcurl_la-curl_get_line.lo \
+       libcurl_la-altsvc.lo libcurl_la-socketpair.lo
 am__dirstamp = $(am__leading_dot)dirstamp
 am__objects_2 = vauth/libcurl_la-vauth.lo \
        vauth/libcurl_la-cleartext.lo vauth/libcurl_la-cram.lo \
@@ -243,14 +242,19 @@ am__objects_3 = vtls/libcurl_la-openssl.lo vtls/libcurl_la-gtls.lo \
        vtls/libcurl_la-vtls.lo vtls/libcurl_la-nss.lo \
        vtls/libcurl_la-polarssl.lo \
        vtls/libcurl_la-polarssl_threadlock.lo \
-       vtls/libcurl_la-axtls.lo vtls/libcurl_la-cyassl.lo \
-       vtls/libcurl_la-schannel.lo vtls/libcurl_la-schannel_verify.lo \
-       vtls/libcurl_la-darwinssl.lo vtls/libcurl_la-gskit.lo \
-       vtls/libcurl_la-mbedtls.lo vtls/libcurl_la-mesalink.lo
-am__objects_4 = $(am__objects_1) $(am__objects_2) $(am__objects_3)
-am__objects_5 =
-am__objects_6 = $(am__objects_5) $(am__objects_5) $(am__objects_5)
-am_libcurl_la_OBJECTS = $(am__objects_4) $(am__objects_6)
+       vtls/libcurl_la-wolfssl.lo vtls/libcurl_la-schannel.lo \
+       vtls/libcurl_la-schannel_verify.lo \
+       vtls/libcurl_la-sectransp.lo vtls/libcurl_la-gskit.lo \
+       vtls/libcurl_la-mbedtls.lo vtls/libcurl_la-mesalink.lo \
+       vtls/libcurl_la-bearssl.lo
+am__objects_4 = vquic/libcurl_la-ngtcp2.lo vquic/libcurl_la-quiche.lo
+am__objects_5 = vssh/libcurl_la-libssh2.lo vssh/libcurl_la-libssh.lo
+am__objects_6 = $(am__objects_1) $(am__objects_2) $(am__objects_3) \
+       $(am__objects_4) $(am__objects_5)
+am__objects_7 =
+am__objects_8 = $(am__objects_7) $(am__objects_7) $(am__objects_7) \
+       $(am__objects_7) $(am__objects_7)
+am_libcurl_la_OBJECTS = $(am__objects_6) $(am__objects_8)
 libcurl_la_OBJECTS = $(am_libcurl_la_OBJECTS)
 AM_V_lt = $(am__v_lt_@AM_V@)
 am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
@@ -260,7 +264,7 @@ libcurl_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
        $(LIBTOOLFLAGS) --mode=link $(CCLD) $(libcurl_la_CFLAGS) \
        $(CFLAGS) $(libcurl_la_LDFLAGS) $(LDFLAGS) -o $@
 libcurlu_la_LIBADD =
-am__objects_7 = libcurlu_la-file.lo libcurlu_la-timeval.lo \
+am__objects_9 = libcurlu_la-file.lo libcurlu_la-timeval.lo \
        libcurlu_la-base64.lo libcurlu_la-hostip.lo \
        libcurlu_la-progress.lo libcurlu_la-formdata.lo \
        libcurlu_la-cookie.lo libcurlu_la-http.lo libcurlu_la-sendf.lo \
@@ -287,12 +291,12 @@ am__objects_7 = libcurlu_la-file.lo libcurlu_la-timeval.lo \
        libcurlu_la-hostip6.lo libcurlu_la-hostsyn.lo \
        libcurlu_la-inet_ntop.lo libcurlu_la-parsedate.lo \
        libcurlu_la-select.lo libcurlu_la-tftp.lo libcurlu_la-splay.lo \
-       libcurlu_la-strdup.lo libcurlu_la-socks.lo libcurlu_la-ssh.lo \
-       libcurlu_la-ssh-libssh.lo libcurlu_la-curl_addrinfo.lo \
-       libcurlu_la-socks_gssapi.lo libcurlu_la-socks_sspi.lo \
-       libcurlu_la-curl_sspi.lo libcurlu_la-slist.lo \
-       libcurlu_la-nonblock.lo libcurlu_la-curl_memrchr.lo \
-       libcurlu_la-imap.lo libcurlu_la-pop3.lo libcurlu_la-smtp.lo \
+       libcurlu_la-strdup.lo libcurlu_la-socks.lo \
+       libcurlu_la-curl_addrinfo.lo libcurlu_la-socks_gssapi.lo \
+       libcurlu_la-socks_sspi.lo libcurlu_la-curl_sspi.lo \
+       libcurlu_la-slist.lo libcurlu_la-nonblock.lo \
+       libcurlu_la-curl_memrchr.lo libcurlu_la-imap.lo \
+       libcurlu_la-pop3.lo libcurlu_la-smtp.lo \
        libcurlu_la-pingpong.lo libcurlu_la-rtsp.lo \
        libcurlu_la-curl_threads.lo libcurlu_la-warnless.lo \
        libcurlu_la-hmac.lo libcurlu_la-curl_rtmp.lo \
@@ -304,16 +308,17 @@ am__objects_7 = libcurlu_la-file.lo libcurlu_la-timeval.lo \
        libcurlu_la-curl_ntlm_wb.lo libcurlu_la-curl_ntlm_core.lo \
        libcurlu_la-curl_sasl.lo libcurlu_la-rand.lo \
        libcurlu_la-curl_multibyte.lo libcurlu_la-hostcheck.lo \
-       libcurlu_la-conncache.lo libcurlu_la-pipeline.lo \
-       libcurlu_la-dotdot.lo libcurlu_la-x509asn1.lo \
-       libcurlu_la-http2.lo libcurlu_la-smb.lo \
-       libcurlu_la-curl_endian.lo libcurlu_la-curl_des.lo \
-       libcurlu_la-system_win32.lo libcurlu_la-mime.lo \
-       libcurlu_la-sha256.lo libcurlu_la-setopt.lo \
-       libcurlu_la-curl_path.lo libcurlu_la-curl_ctype.lo \
-       libcurlu_la-curl_range.lo libcurlu_la-psl.lo \
-       libcurlu_la-doh.lo libcurlu_la-urlapi.lo
-am__objects_8 = vauth/libcurlu_la-vauth.lo \
+       libcurlu_la-conncache.lo libcurlu_la-dotdot.lo \
+       libcurlu_la-x509asn1.lo libcurlu_la-http2.lo \
+       libcurlu_la-smb.lo libcurlu_la-curl_endian.lo \
+       libcurlu_la-curl_des.lo libcurlu_la-system_win32.lo \
+       libcurlu_la-mime.lo libcurlu_la-sha256.lo \
+       libcurlu_la-setopt.lo libcurlu_la-curl_path.lo \
+       libcurlu_la-curl_ctype.lo libcurlu_la-curl_range.lo \
+       libcurlu_la-psl.lo libcurlu_la-doh.lo libcurlu_la-urlapi.lo \
+       libcurlu_la-curl_get_line.lo libcurlu_la-altsvc.lo \
+       libcurlu_la-socketpair.lo
+am__objects_10 = vauth/libcurlu_la-vauth.lo \
        vauth/libcurlu_la-cleartext.lo vauth/libcurlu_la-cram.lo \
        vauth/libcurlu_la-digest.lo vauth/libcurlu_la-digest_sspi.lo \
        vauth/libcurlu_la-krb5_gssapi.lo \
@@ -321,17 +326,22 @@ am__objects_8 = vauth/libcurlu_la-vauth.lo \
        vauth/libcurlu_la-ntlm_sspi.lo vauth/libcurlu_la-oauth2.lo \
        vauth/libcurlu_la-spnego_gssapi.lo \
        vauth/libcurlu_la-spnego_sspi.lo
-am__objects_9 = vtls/libcurlu_la-openssl.lo vtls/libcurlu_la-gtls.lo \
+am__objects_11 = vtls/libcurlu_la-openssl.lo vtls/libcurlu_la-gtls.lo \
        vtls/libcurlu_la-vtls.lo vtls/libcurlu_la-nss.lo \
        vtls/libcurlu_la-polarssl.lo \
        vtls/libcurlu_la-polarssl_threadlock.lo \
-       vtls/libcurlu_la-axtls.lo vtls/libcurlu_la-cyassl.lo \
-       vtls/libcurlu_la-schannel.lo \
+       vtls/libcurlu_la-wolfssl.lo vtls/libcurlu_la-schannel.lo \
        vtls/libcurlu_la-schannel_verify.lo \
-       vtls/libcurlu_la-darwinssl.lo vtls/libcurlu_la-gskit.lo \
-       vtls/libcurlu_la-mbedtls.lo vtls/libcurlu_la-mesalink.lo
-am__objects_10 = $(am__objects_7) $(am__objects_8) $(am__objects_9)
-am_libcurlu_la_OBJECTS = $(am__objects_10) $(am__objects_6)
+       vtls/libcurlu_la-sectransp.lo vtls/libcurlu_la-gskit.lo \
+       vtls/libcurlu_la-mbedtls.lo vtls/libcurlu_la-mesalink.lo \
+       vtls/libcurlu_la-bearssl.lo
+am__objects_12 = vquic/libcurlu_la-ngtcp2.lo \
+       vquic/libcurlu_la-quiche.lo
+am__objects_13 = vssh/libcurlu_la-libssh2.lo \
+       vssh/libcurlu_la-libssh.lo
+am__objects_14 = $(am__objects_9) $(am__objects_10) $(am__objects_11) \
+       $(am__objects_12) $(am__objects_13)
+am_libcurlu_la_OBJECTS = $(am__objects_14) $(am__objects_8)
 libcurlu_la_OBJECTS = $(am_libcurlu_la_OBJECTS)
 libcurlu_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
        $(LIBTOOLFLAGS) --mode=link $(CCLD) $(libcurlu_la_CFLAGS) \
@@ -352,7 +362,8 @@ am__v_at_1 =
 DEFAULT_INCLUDES = 
 depcomp = $(SHELL) $(top_srcdir)/depcomp
 am__maybe_remake_depfiles = depfiles
-am__depfiles_remade = ./$(DEPDIR)/libcurl_la-amigaos.Plo \
+am__depfiles_remade = ./$(DEPDIR)/libcurl_la-altsvc.Plo \
+       ./$(DEPDIR)/libcurl_la-amigaos.Plo \
        ./$(DEPDIR)/libcurl_la-asyn-ares.Plo \
        ./$(DEPDIR)/libcurl_la-asyn-thread.Plo \
        ./$(DEPDIR)/libcurl_la-base64.Plo \
@@ -365,6 +376,7 @@ am__depfiles_remade = ./$(DEPDIR)/libcurl_la-amigaos.Plo \
        ./$(DEPDIR)/libcurl_la-curl_des.Plo \
        ./$(DEPDIR)/libcurl_la-curl_endian.Plo \
        ./$(DEPDIR)/libcurl_la-curl_fnmatch.Plo \
+       ./$(DEPDIR)/libcurl_la-curl_get_line.Plo \
        ./$(DEPDIR)/libcurl_la-curl_gethostname.Plo \
        ./$(DEPDIR)/libcurl_la-curl_gssapi.Plo \
        ./$(DEPDIR)/libcurl_la-curl_memrchr.Plo \
@@ -423,7 +435,6 @@ am__depfiles_remade = ./$(DEPDIR)/libcurl_la-amigaos.Plo \
        ./$(DEPDIR)/libcurl_la-openldap.Plo \
        ./$(DEPDIR)/libcurl_la-parsedate.Plo \
        ./$(DEPDIR)/libcurl_la-pingpong.Plo \
-       ./$(DEPDIR)/libcurl_la-pipeline.Plo \
        ./$(DEPDIR)/libcurl_la-pop3.Plo \
        ./$(DEPDIR)/libcurl_la-progress.Plo \
        ./$(DEPDIR)/libcurl_la-psl.Plo ./$(DEPDIR)/libcurl_la-rand.Plo \
@@ -436,13 +447,12 @@ am__depfiles_remade = ./$(DEPDIR)/libcurl_la-amigaos.Plo \
        ./$(DEPDIR)/libcurl_la-share.Plo \
        ./$(DEPDIR)/libcurl_la-slist.Plo \
        ./$(DEPDIR)/libcurl_la-smb.Plo ./$(DEPDIR)/libcurl_la-smtp.Plo \
+       ./$(DEPDIR)/libcurl_la-socketpair.Plo \
        ./$(DEPDIR)/libcurl_la-socks.Plo \
        ./$(DEPDIR)/libcurl_la-socks_gssapi.Plo \
        ./$(DEPDIR)/libcurl_la-socks_sspi.Plo \
        ./$(DEPDIR)/libcurl_la-speedcheck.Plo \
        ./$(DEPDIR)/libcurl_la-splay.Plo \
-       ./$(DEPDIR)/libcurl_la-ssh-libssh.Plo \
-       ./$(DEPDIR)/libcurl_la-ssh.Plo \
        ./$(DEPDIR)/libcurl_la-strcase.Plo \
        ./$(DEPDIR)/libcurl_la-strdup.Plo \
        ./$(DEPDIR)/libcurl_la-strerror.Plo \
@@ -459,6 +469,7 @@ am__depfiles_remade = ./$(DEPDIR)/libcurl_la-amigaos.Plo \
        ./$(DEPDIR)/libcurl_la-warnless.Plo \
        ./$(DEPDIR)/libcurl_la-wildcard.Plo \
        ./$(DEPDIR)/libcurl_la-x509asn1.Plo \
+       ./$(DEPDIR)/libcurlu_la-altsvc.Plo \
        ./$(DEPDIR)/libcurlu_la-amigaos.Plo \
        ./$(DEPDIR)/libcurlu_la-asyn-ares.Plo \
        ./$(DEPDIR)/libcurlu_la-asyn-thread.Plo \
@@ -472,6 +483,7 @@ am__depfiles_remade = ./$(DEPDIR)/libcurl_la-amigaos.Plo \
        ./$(DEPDIR)/libcurlu_la-curl_des.Plo \
        ./$(DEPDIR)/libcurlu_la-curl_endian.Plo \
        ./$(DEPDIR)/libcurlu_la-curl_fnmatch.Plo \
+       ./$(DEPDIR)/libcurlu_la-curl_get_line.Plo \
        ./$(DEPDIR)/libcurlu_la-curl_gethostname.Plo \
        ./$(DEPDIR)/libcurlu_la-curl_gssapi.Plo \
        ./$(DEPDIR)/libcurlu_la-curl_memrchr.Plo \
@@ -532,7 +544,6 @@ am__depfiles_remade = ./$(DEPDIR)/libcurl_la-amigaos.Plo \
        ./$(DEPDIR)/libcurlu_la-openldap.Plo \
        ./$(DEPDIR)/libcurlu_la-parsedate.Plo \
        ./$(DEPDIR)/libcurlu_la-pingpong.Plo \
-       ./$(DEPDIR)/libcurlu_la-pipeline.Plo \
        ./$(DEPDIR)/libcurlu_la-pop3.Plo \
        ./$(DEPDIR)/libcurlu_la-progress.Plo \
        ./$(DEPDIR)/libcurlu_la-psl.Plo \
@@ -547,13 +558,12 @@ am__depfiles_remade = ./$(DEPDIR)/libcurl_la-amigaos.Plo \
        ./$(DEPDIR)/libcurlu_la-slist.Plo \
        ./$(DEPDIR)/libcurlu_la-smb.Plo \
        ./$(DEPDIR)/libcurlu_la-smtp.Plo \
+       ./$(DEPDIR)/libcurlu_la-socketpair.Plo \
        ./$(DEPDIR)/libcurlu_la-socks.Plo \
        ./$(DEPDIR)/libcurlu_la-socks_gssapi.Plo \
        ./$(DEPDIR)/libcurlu_la-socks_sspi.Plo \
        ./$(DEPDIR)/libcurlu_la-speedcheck.Plo \
        ./$(DEPDIR)/libcurlu_la-splay.Plo \
-       ./$(DEPDIR)/libcurlu_la-ssh-libssh.Plo \
-       ./$(DEPDIR)/libcurlu_la-ssh.Plo \
        ./$(DEPDIR)/libcurlu_la-strcase.Plo \
        ./$(DEPDIR)/libcurlu_la-strdup.Plo \
        ./$(DEPDIR)/libcurlu_la-strerror.Plo \
@@ -594,9 +604,15 @@ am__depfiles_remade = ./$(DEPDIR)/libcurl_la-amigaos.Plo \
        vauth/$(DEPDIR)/libcurlu_la-spnego_gssapi.Plo \
        vauth/$(DEPDIR)/libcurlu_la-spnego_sspi.Plo \
        vauth/$(DEPDIR)/libcurlu_la-vauth.Plo \
-       vtls/$(DEPDIR)/libcurl_la-axtls.Plo \
-       vtls/$(DEPDIR)/libcurl_la-cyassl.Plo \
-       vtls/$(DEPDIR)/libcurl_la-darwinssl.Plo \
+       vquic/$(DEPDIR)/libcurl_la-ngtcp2.Plo \
+       vquic/$(DEPDIR)/libcurl_la-quiche.Plo \
+       vquic/$(DEPDIR)/libcurlu_la-ngtcp2.Plo \
+       vquic/$(DEPDIR)/libcurlu_la-quiche.Plo \
+       vssh/$(DEPDIR)/libcurl_la-libssh.Plo \
+       vssh/$(DEPDIR)/libcurl_la-libssh2.Plo \
+       vssh/$(DEPDIR)/libcurlu_la-libssh.Plo \
+       vssh/$(DEPDIR)/libcurlu_la-libssh2.Plo \
+       vtls/$(DEPDIR)/libcurl_la-bearssl.Plo \
        vtls/$(DEPDIR)/libcurl_la-gskit.Plo \
        vtls/$(DEPDIR)/libcurl_la-gtls.Plo \
        vtls/$(DEPDIR)/libcurl_la-mbedtls.Plo \
@@ -607,10 +623,10 @@ am__depfiles_remade = ./$(DEPDIR)/libcurl_la-amigaos.Plo \
        vtls/$(DEPDIR)/libcurl_la-polarssl_threadlock.Plo \
        vtls/$(DEPDIR)/libcurl_la-schannel.Plo \
        vtls/$(DEPDIR)/libcurl_la-schannel_verify.Plo \
+       vtls/$(DEPDIR)/libcurl_la-sectransp.Plo \
        vtls/$(DEPDIR)/libcurl_la-vtls.Plo \
-       vtls/$(DEPDIR)/libcurlu_la-axtls.Plo \
-       vtls/$(DEPDIR)/libcurlu_la-cyassl.Plo \
-       vtls/$(DEPDIR)/libcurlu_la-darwinssl.Plo \
+       vtls/$(DEPDIR)/libcurl_la-wolfssl.Plo \
+       vtls/$(DEPDIR)/libcurlu_la-bearssl.Plo \
        vtls/$(DEPDIR)/libcurlu_la-gskit.Plo \
        vtls/$(DEPDIR)/libcurlu_la-gtls.Plo \
        vtls/$(DEPDIR)/libcurlu_la-mbedtls.Plo \
@@ -621,7 +637,9 @@ am__depfiles_remade = ./$(DEPDIR)/libcurl_la-amigaos.Plo \
        vtls/$(DEPDIR)/libcurlu_la-polarssl_threadlock.Plo \
        vtls/$(DEPDIR)/libcurlu_la-schannel.Plo \
        vtls/$(DEPDIR)/libcurlu_la-schannel_verify.Plo \
-       vtls/$(DEPDIR)/libcurlu_la-vtls.Plo
+       vtls/$(DEPDIR)/libcurlu_la-sectransp.Plo \
+       vtls/$(DEPDIR)/libcurlu_la-vtls.Plo \
+       vtls/$(DEPDIR)/libcurlu_la-wolfssl.Plo
 am__mv = mv -f
 COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
        $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
@@ -689,12 +707,6 @@ CCDEPMODE = @CCDEPMODE@
 # This might hold -Werror
 CFLAGS = @CFLAGS@ @CURL_CFLAG_EXTRAS@
 CFLAG_CURL_SYMBOL_HIDING = @CFLAG_CURL_SYMBOL_HIDING@
-CODE_COVERAGE_CFLAGS = @CODE_COVERAGE_CFLAGS@
-CODE_COVERAGE_CPPFLAGS = @CODE_COVERAGE_CPPFLAGS@
-CODE_COVERAGE_CXXFLAGS = @CODE_COVERAGE_CXXFLAGS@
-CODE_COVERAGE_ENABLED = @CODE_COVERAGE_ENABLED@
-CODE_COVERAGE_LDFLAGS = @CODE_COVERAGE_LDFLAGS@
-CODE_COVERAGE_LIBS = @CODE_COVERAGE_LIBS@
 CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
@@ -736,14 +748,15 @@ ENABLE_SHARED = @ENABLE_SHARED@
 ENABLE_STATIC = @ENABLE_STATIC@
 EXEEXT = @EXEEXT@
 FGREP = @FGREP@
+FISH_FUNCTIONS_DIR = @FISH_FUNCTIONS_DIR@
 GCOV = @GCOV@
-GENHTML = @GENHTML@
 GREP = @GREP@
 HAVE_BROTLI = @HAVE_BROTLI@
 HAVE_GNUTLS_SRP = @HAVE_GNUTLS_SRP@
 HAVE_LDAP_SSL = @HAVE_LDAP_SSL@
 HAVE_LIBZ = @HAVE_LIBZ@
 HAVE_OPENSSL_SRP = @HAVE_OPENSSL_SRP@
+HAVE_PROTO_BSDSOCKET_H = @HAVE_PROTO_BSDSOCKET_H@
 IDN_ENABLED = @IDN_ENABLED@
 INSTALL = @INSTALL@
 INSTALL_DATA = @INSTALL_DATA@
@@ -806,9 +819,7 @@ STRIP = @STRIP@
 SUPPORT_FEATURES = @SUPPORT_FEATURES@
 SUPPORT_PROTOCOLS = @SUPPORT_PROTOCOLS@
 USE_ARES = @USE_ARES@
-USE_AXTLS = @USE_AXTLS@
-USE_CYASSL = @USE_CYASSL@
-USE_DARWINSSL = @USE_DARWINSSL@
+USE_BEARSSL = @USE_BEARSSL@
 USE_GNUTLS = @USE_GNUTLS@
 USE_GNUTLS_NETTLE = @USE_GNUTLS_NETTLE@
 USE_LIBRTMP = @USE_LIBRTMP@
@@ -817,12 +828,17 @@ USE_LIBSSH2 = @USE_LIBSSH2@
 USE_MBEDTLS = @USE_MBEDTLS@
 USE_MESALINK = @USE_MESALINK@
 USE_NGHTTP2 = @USE_NGHTTP2@
+USE_NGHTTP3 = @USE_NGHTTP3@
+USE_NGTCP2 = @USE_NGTCP2@
+USE_NGTCP2_CRYPTO_OPENSSL = @USE_NGTCP2_CRYPTO_OPENSSL@
 USE_NSS = @USE_NSS@
 USE_OPENLDAP = @USE_OPENLDAP@
-USE_POLARSSL = @USE_POLARSSL@
+USE_QUICHE = @USE_QUICHE@
 USE_SCHANNEL = @USE_SCHANNEL@
+USE_SECTRANSP = @USE_SECTRANSP@
 USE_UNIX_SOCKETS = @USE_UNIX_SOCKETS@
 USE_WINDOWS_SSPI = @USE_WINDOWS_SSPI@
+USE_WOLFSSL = @USE_WOLFSSL@
 VERSION = @VERSION@
 VERSIONNUM = @VERSIONNUM@
 ZLIB_LIBS = @ZLIB_LIBS@
@@ -890,7 +906,7 @@ top_srcdir = @top_srcdir@
 #                            | (__| |_| |  _ <| |___
 #                             \___|\___/|_| \_\_____|
 #
-# Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 #
 # This software is licensed as described in the file COPYING, which
 # you should have received as part of this distribution. The terms
@@ -906,14 +922,13 @@ top_srcdir = @top_srcdir@
 ###########################################################################
 AUTOMAKE_OPTIONS = foreign nostdinc
 CMAKE_DIST = CMakeLists.txt curl_config.h.cmake
-EXTRA_DIST = Makefile.m32 config-win32.h                            \
- config-win32ce.h config-riscos.h config-mac.h curl_config.h.in     \
+EXTRA_DIST = Makefile.m32 config-win32.h config-win32ce.h           \
+ config-plan9.h config-riscos.h config-mac.h curl_config.h.in       \
  makefile.dj config-dos.h libcurl.plist libcurl.rc config-amigaos.h \
  makefile.amiga Makefile.netware nwlib.c nwos.c config-win32ce.h    \
  config-os400.h setup-os400.h config-symbian.h Makefile.Watcom      \
  config-tpf.h mk-ca-bundle.pl mk-ca-bundle.vbs $(CMAKE_DIST)        \
- firefox-db2pem.sh config-vxworks.h Makefile.vxworks checksrc.pl    \
- objnames-test08.sh objnames-test10.sh objnames.inc
+ firefox-db2pem.sh config-vxworks.h Makefile.vxworks checksrc.pl
 
 lib_LTLIBRARIES = libcurl.la
 @BUILD_UNITTESTS_FALSE@noinst_LTLIBRARIES = 
@@ -943,14 +958,13 @@ lib_LTLIBRARIES = libcurl.la
 # For the full guide on libcurl ABI rules, see docs/libcurl/ABI
 AM_CPPFLAGS = -I$(top_srcdir)/include -I$(top_builddir)/lib \
        -I$(top_srcdir)/lib $(am__append_1) -DBUILDING_LIBCURL
-VERSIONINFO = -version-info 9:0:5
+VERSIONINFO = -version-info 10:0:6
 AM_LDFLAGS = 
 AM_CFLAGS = 
 libcurl_la_CPPFLAGS_EXTRA = $(am__append_7) $(am__append_8)
-libcurl_la_LDFLAGS_EXTRA = $(CODE_COVERAGE_LDFLAGS) $(am__append_2) \
-       $(am__append_3) $(am__append_4) $(am__append_5) \
-       $(am__append_6)
-libcurl_la_CFLAGS_EXTRA = $(CODE_COVERAGE_CFLAGS) $(am__append_9)
+libcurl_la_LDFLAGS_EXTRA = $(am__append_2) $(am__append_3) \
+       $(am__append_4) $(am__append_5) $(am__append_6)
+libcurl_la_CFLAGS_EXTRA = $(am__append_9)
 libcurl_la_CPPFLAGS = $(AM_CPPFLAGS) $(libcurl_la_CPPFLAGS_EXTRA)
 libcurl_la_LDFLAGS = $(AM_LDFLAGS) $(libcurl_la_LDFLAGS_EXTRA) $(LDFLAGS) $(LIBCURL_LIBS)
 libcurl_la_CFLAGS = $(AM_CFLAGS) $(libcurl_la_CFLAGS_EXTRA)
@@ -964,15 +978,20 @@ LIB_VAUTH_CFILES = vauth/vauth.c vauth/cleartext.c vauth/cram.c         \
 
 LIB_VAUTH_HFILES = vauth/vauth.h vauth/digest.h vauth/ntlm.h
 LIB_VTLS_CFILES = vtls/openssl.c vtls/gtls.c vtls/vtls.c vtls/nss.c     \
-  vtls/polarssl.c vtls/polarssl_threadlock.c vtls/axtls.c               \
-  vtls/cyassl.c vtls/schannel.c vtls/schannel_verify.c                  \
-  vtls/darwinssl.c vtls/gskit.c vtls/mbedtls.c vtls/mesalink.c
+  vtls/polarssl.c vtls/polarssl_threadlock.c                            \
+  vtls/wolfssl.c vtls/schannel.c vtls/schannel_verify.c                 \
+  vtls/sectransp.c vtls/gskit.c vtls/mbedtls.c vtls/mesalink.c          \
+  vtls/bearssl.c
 
 LIB_VTLS_HFILES = vtls/openssl.h vtls/vtls.h vtls/gtls.h                \
-  vtls/nssg.h vtls/polarssl.h vtls/polarssl_threadlock.h vtls/axtls.h   \
-  vtls/cyassl.h vtls/schannel.h vtls/darwinssl.h vtls/gskit.h           \
-  vtls/mbedtls.h vtls/mesalink.h
-
+  vtls/nssg.h vtls/polarssl.h vtls/polarssl_threadlock.h                \
+  vtls/wolfssl.h vtls/schannel.h vtls/sectransp.h vtls/gskit.h          \
+  vtls/mbedtls.h vtls/mesalink.h vtls/bearssl.h
+
+LIB_VQUIC_CFILES = vquic/ngtcp2.c vquic/quiche.c
+LIB_VQUIC_HFILES = vquic/ngtcp2.h vquic/quiche.h
+LIB_VSSH_CFILES = vssh/libssh2.c vssh/libssh.c
+LIB_VSSH_HFILES = vssh/ssh.h
 LIB_CFILES = file.c timeval.c base64.c hostip.c progress.c formdata.c   \
   cookie.c http.c sendf.c ftp.c url.c dict.c if2ip.c speedcheck.c       \
   ldap.c version.c getenv.c escape.c mprintf.c telnet.c netrc.c         \
@@ -982,16 +1001,16 @@ LIB_CFILES = file.c timeval.c base64.c hostip.c progress.c formdata.c   \
   http_digest.c md4.c md5.c http_negotiate.c inet_pton.c strtoofft.c    \
   strerror.c amigaos.c hostasyn.c hostip4.c hostip6.c hostsyn.c         \
   inet_ntop.c parsedate.c select.c tftp.c splay.c strdup.c socks.c      \
-  ssh.c ssh-libssh.c curl_addrinfo.c socks_gssapi.c socks_sspi.c        \
+  curl_addrinfo.c socks_gssapi.c socks_sspi.c                           \
   curl_sspi.c slist.c nonblock.c curl_memrchr.c imap.c pop3.c smtp.c    \
   pingpong.c rtsp.c curl_threads.c warnless.c hmac.c curl_rtmp.c        \
   openldap.c curl_gethostname.c gopher.c idn_win32.c                    \
   http_proxy.c non-ascii.c asyn-ares.c asyn-thread.c curl_gssapi.c      \
   http_ntlm.c curl_ntlm_wb.c curl_ntlm_core.c curl_sasl.c rand.c        \
-  curl_multibyte.c hostcheck.c conncache.c pipeline.c dotdot.c          \
+  curl_multibyte.c hostcheck.c conncache.c dotdot.c                     \
   x509asn1.c http2.c smb.c curl_endian.c curl_des.c system_win32.c      \
   mime.c sha256.c setopt.c curl_path.c curl_ctype.c curl_range.c psl.c  \
-  doh.c urlapi.c
+  doh.c urlapi.c curl_get_line.c altsvc.c socketpair.c
 
 LIB_HFILES = arpa_telnet.h netrc.h file.h timeval.h hostip.h progress.h \
   formdata.h cookie.h http.h sendf.h ftp.h url.h dict.h if2ip.h         \
@@ -1002,24 +1021,33 @@ LIB_HFILES = arpa_telnet.h netrc.h file.h timeval.h hostip.h progress.h \
   http_negotiate.h inet_pton.h amigaos.h strtoofft.h strerror.h         \
   inet_ntop.h curlx.h curl_memory.h curl_setup.h transfer.h select.h    \
   easyif.h multiif.h parsedate.h tftp.h sockaddr.h splay.h strdup.h     \
-  socks.h ssh.h curl_base64.h curl_addrinfo.h curl_sspi.h      \
+  socks.h curl_base64.h curl_addrinfo.h curl_sspi.h                     \
   slist.h nonblock.h curl_memrchr.h imap.h pop3.h smtp.h pingpong.h     \
   rtsp.h curl_threads.h warnless.h curl_hmac.h curl_rtmp.h              \
   curl_gethostname.h gopher.h http_proxy.h non-ascii.h asyn.h           \
   http_ntlm.h curl_gssapi.h curl_ntlm_wb.h curl_ntlm_core.h             \
   curl_sasl.h curl_multibyte.h hostcheck.h conncache.h                  \
-  curl_setup_once.h multihandle.h setup-vms.h pipeline.h dotdot.h       \
+  curl_setup_once.h multihandle.h setup-vms.h dotdot.h                  \
   x509asn1.h http2.h sigpipe.h smb.h curl_endian.h curl_des.h           \
   curl_printf.h system_win32.h rand.h mime.h curl_sha256.h setopt.h     \
-  curl_path.h curl_ctype.h curl_range.h psl.h doh.h urlapi-int.h
+  curl_path.h curl_ctype.h curl_range.h psl.h doh.h urlapi-int.h        \
+  curl_get_line.h altsvc.h quic.h socketpair.h
 
 LIB_RCFILES = libcurl.rc
-CSOURCES = $(LIB_CFILES) $(LIB_VAUTH_CFILES) $(LIB_VTLS_CFILES)
-HHEADERS = $(LIB_HFILES) $(LIB_VAUTH_HFILES) $(LIB_VTLS_HFILES)
+CSOURCES = $(LIB_CFILES) $(LIB_VAUTH_CFILES) $(LIB_VTLS_CFILES) \
+  $(LIB_VQUIC_CFILES) $(LIB_VSSH_CFILES)
+
+HHEADERS = $(LIB_HFILES) $(LIB_VAUTH_HFILES) $(LIB_VTLS_HFILES) \
+  $(LIB_VQUIC_HFILES) $(LIB_VSSH_HFILES)
+
 
 # Makefile.inc provides the CSOURCES and HHEADERS defines
 libcurl_la_SOURCES = $(CSOURCES) $(HHEADERS)
 libcurlu_la_SOURCES = $(CSOURCES) $(HHEADERS)
+CHECKSRC = $(CS_$(V))
+CS_0 = @echo "  RUN     " $@;
+CS_1 = 
+CS_ = $(CS_0)
 
 # disable the tests that are mostly causing false positives
 TIDYFLAGS = -checks=-clang-analyzer-security.insecureAPI.strcpy,-clang-analyzer-optin.performance.Padding,-clang-analyzer-valist.Uninitialized,-clang-analyzer-core.NonNullParamChecker,-clang-analyzer-core.NullDereference -quiet
@@ -1170,15 +1198,13 @@ vtls/libcurl_la-polarssl.lo: vtls/$(am__dirstamp) \
        vtls/$(DEPDIR)/$(am__dirstamp)
 vtls/libcurl_la-polarssl_threadlock.lo: vtls/$(am__dirstamp) \
        vtls/$(DEPDIR)/$(am__dirstamp)
-vtls/libcurl_la-axtls.lo: vtls/$(am__dirstamp) \
-       vtls/$(DEPDIR)/$(am__dirstamp)
-vtls/libcurl_la-cyassl.lo: vtls/$(am__dirstamp) \
+vtls/libcurl_la-wolfssl.lo: vtls/$(am__dirstamp) \
        vtls/$(DEPDIR)/$(am__dirstamp)
 vtls/libcurl_la-schannel.lo: vtls/$(am__dirstamp) \
        vtls/$(DEPDIR)/$(am__dirstamp)
 vtls/libcurl_la-schannel_verify.lo: vtls/$(am__dirstamp) \
        vtls/$(DEPDIR)/$(am__dirstamp)
-vtls/libcurl_la-darwinssl.lo: vtls/$(am__dirstamp) \
+vtls/libcurl_la-sectransp.lo: vtls/$(am__dirstamp) \
        vtls/$(DEPDIR)/$(am__dirstamp)
 vtls/libcurl_la-gskit.lo: vtls/$(am__dirstamp) \
        vtls/$(DEPDIR)/$(am__dirstamp)
@@ -1186,6 +1212,28 @@ vtls/libcurl_la-mbedtls.lo: vtls/$(am__dirstamp) \
        vtls/$(DEPDIR)/$(am__dirstamp)
 vtls/libcurl_la-mesalink.lo: vtls/$(am__dirstamp) \
        vtls/$(DEPDIR)/$(am__dirstamp)
+vtls/libcurl_la-bearssl.lo: vtls/$(am__dirstamp) \
+       vtls/$(DEPDIR)/$(am__dirstamp)
+vquic/$(am__dirstamp):
+       @$(MKDIR_P) vquic
+       @: > vquic/$(am__dirstamp)
+vquic/$(DEPDIR)/$(am__dirstamp):
+       @$(MKDIR_P) vquic/$(DEPDIR)
+       @: > vquic/$(DEPDIR)/$(am__dirstamp)
+vquic/libcurl_la-ngtcp2.lo: vquic/$(am__dirstamp) \
+       vquic/$(DEPDIR)/$(am__dirstamp)
+vquic/libcurl_la-quiche.lo: vquic/$(am__dirstamp) \
+       vquic/$(DEPDIR)/$(am__dirstamp)
+vssh/$(am__dirstamp):
+       @$(MKDIR_P) vssh
+       @: > vssh/$(am__dirstamp)
+vssh/$(DEPDIR)/$(am__dirstamp):
+       @$(MKDIR_P) vssh/$(DEPDIR)
+       @: > vssh/$(DEPDIR)/$(am__dirstamp)
+vssh/libcurl_la-libssh2.lo: vssh/$(am__dirstamp) \
+       vssh/$(DEPDIR)/$(am__dirstamp)
+vssh/libcurl_la-libssh.lo: vssh/$(am__dirstamp) \
+       vssh/$(DEPDIR)/$(am__dirstamp)
 
 libcurl.la: $(libcurl_la_OBJECTS) $(libcurl_la_DEPENDENCIES) $(EXTRA_libcurl_la_DEPENDENCIES) 
        $(AM_V_CCLD)$(libcurl_la_LINK) -rpath $(libdir) $(libcurl_la_OBJECTS) $(libcurl_la_LIBADD) $(LIBS)
@@ -1225,15 +1273,13 @@ vtls/libcurlu_la-polarssl.lo: vtls/$(am__dirstamp) \
        vtls/$(DEPDIR)/$(am__dirstamp)
 vtls/libcurlu_la-polarssl_threadlock.lo: vtls/$(am__dirstamp) \
        vtls/$(DEPDIR)/$(am__dirstamp)
-vtls/libcurlu_la-axtls.lo: vtls/$(am__dirstamp) \
-       vtls/$(DEPDIR)/$(am__dirstamp)
-vtls/libcurlu_la-cyassl.lo: vtls/$(am__dirstamp) \
+vtls/libcurlu_la-wolfssl.lo: vtls/$(am__dirstamp) \
        vtls/$(DEPDIR)/$(am__dirstamp)
 vtls/libcurlu_la-schannel.lo: vtls/$(am__dirstamp) \
        vtls/$(DEPDIR)/$(am__dirstamp)
 vtls/libcurlu_la-schannel_verify.lo: vtls/$(am__dirstamp) \
        vtls/$(DEPDIR)/$(am__dirstamp)
-vtls/libcurlu_la-darwinssl.lo: vtls/$(am__dirstamp) \
+vtls/libcurlu_la-sectransp.lo: vtls/$(am__dirstamp) \
        vtls/$(DEPDIR)/$(am__dirstamp)
 vtls/libcurlu_la-gskit.lo: vtls/$(am__dirstamp) \
        vtls/$(DEPDIR)/$(am__dirstamp)
@@ -1241,6 +1287,16 @@ vtls/libcurlu_la-mbedtls.lo: vtls/$(am__dirstamp) \
        vtls/$(DEPDIR)/$(am__dirstamp)
 vtls/libcurlu_la-mesalink.lo: vtls/$(am__dirstamp) \
        vtls/$(DEPDIR)/$(am__dirstamp)
+vtls/libcurlu_la-bearssl.lo: vtls/$(am__dirstamp) \
+       vtls/$(DEPDIR)/$(am__dirstamp)
+vquic/libcurlu_la-ngtcp2.lo: vquic/$(am__dirstamp) \
+       vquic/$(DEPDIR)/$(am__dirstamp)
+vquic/libcurlu_la-quiche.lo: vquic/$(am__dirstamp) \
+       vquic/$(DEPDIR)/$(am__dirstamp)
+vssh/libcurlu_la-libssh2.lo: vssh/$(am__dirstamp) \
+       vssh/$(DEPDIR)/$(am__dirstamp)
+vssh/libcurlu_la-libssh.lo: vssh/$(am__dirstamp) \
+       vssh/$(DEPDIR)/$(am__dirstamp)
 
 libcurlu.la: $(libcurlu_la_OBJECTS) $(libcurlu_la_DEPENDENCIES) $(EXTRA_libcurlu_la_DEPENDENCIES) 
        $(AM_V_CCLD)$(libcurlu_la_LINK) $(am_libcurlu_la_rpath) $(libcurlu_la_OBJECTS) $(libcurlu_la_LIBADD) $(LIBS)
@@ -1249,12 +1305,17 @@ mostlyclean-compile:
        -rm -f *.$(OBJEXT)
        -rm -f vauth/*.$(OBJEXT)
        -rm -f vauth/*.lo
+       -rm -f vquic/*.$(OBJEXT)
+       -rm -f vquic/*.lo
+       -rm -f vssh/*.$(OBJEXT)
+       -rm -f vssh/*.lo
        -rm -f vtls/*.$(OBJEXT)
        -rm -f vtls/*.lo
 
 distclean-compile:
        -rm -f *.tab.c
 
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-altsvc.Plo@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-amigaos.Plo@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-asyn-ares.Plo@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-asyn-thread.Plo@am__quote@ # am--include-marker
@@ -1268,6 +1329,7 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-curl_des.Plo@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-curl_endian.Plo@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-curl_fnmatch.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-curl_get_line.Plo@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-curl_gethostname.Plo@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-curl_gssapi.Plo@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-curl_memrchr.Plo@am__quote@ # am--include-marker
@@ -1328,7 +1390,6 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-openldap.Plo@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-parsedate.Plo@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-pingpong.Plo@am__quote@ # am--include-marker
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-pipeline.Plo@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-pop3.Plo@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-progress.Plo@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-psl.Plo@am__quote@ # am--include-marker
@@ -1343,13 +1404,12 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-slist.Plo@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-smb.Plo@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-smtp.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-socketpair.Plo@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-socks.Plo@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-socks_gssapi.Plo@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-socks_sspi.Plo@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-speedcheck.Plo@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-splay.Plo@am__quote@ # am--include-marker
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-ssh-libssh.Plo@am__quote@ # am--include-marker
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-ssh.Plo@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-strcase.Plo@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-strdup.Plo@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-strerror.Plo@am__quote@ # am--include-marker
@@ -1366,6 +1426,7 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-warnless.Plo@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-wildcard.Plo@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-x509asn1.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-altsvc.Plo@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-amigaos.Plo@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-asyn-ares.Plo@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-asyn-thread.Plo@am__quote@ # am--include-marker
@@ -1379,6 +1440,7 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-curl_des.Plo@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-curl_endian.Plo@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-curl_fnmatch.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-curl_get_line.Plo@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-curl_gethostname.Plo@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-curl_gssapi.Plo@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-curl_memrchr.Plo@am__quote@ # am--include-marker
@@ -1439,7 +1501,6 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-openldap.Plo@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-parsedate.Plo@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-pingpong.Plo@am__quote@ # am--include-marker
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-pipeline.Plo@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-pop3.Plo@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-progress.Plo@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-psl.Plo@am__quote@ # am--include-marker
@@ -1454,13 +1515,12 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-slist.Plo@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-smb.Plo@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-smtp.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-socketpair.Plo@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-socks.Plo@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-socks_gssapi.Plo@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-socks_sspi.Plo@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-speedcheck.Plo@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-splay.Plo@am__quote@ # am--include-marker
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-ssh-libssh.Plo@am__quote@ # am--include-marker
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-ssh.Plo@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-strcase.Plo@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-strdup.Plo@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-strerror.Plo@am__quote@ # am--include-marker
@@ -1501,9 +1561,15 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@vauth/$(DEPDIR)/libcurlu_la-spnego_gssapi.Plo@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@vauth/$(DEPDIR)/libcurlu_la-spnego_sspi.Plo@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@vauth/$(DEPDIR)/libcurlu_la-vauth.Plo@am__quote@ # am--include-marker
-@AMDEP_TRUE@@am__include@ @am__quote@vtls/$(DEPDIR)/libcurl_la-axtls.Plo@am__quote@ # am--include-marker
-@AMDEP_TRUE@@am__include@ @am__quote@vtls/$(DEPDIR)/libcurl_la-cyassl.Plo@am__quote@ # am--include-marker
-@AMDEP_TRUE@@am__include@ @am__quote@vtls/$(DEPDIR)/libcurl_la-darwinssl.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@vquic/$(DEPDIR)/libcurl_la-ngtcp2.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@vquic/$(DEPDIR)/libcurl_la-quiche.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@vquic/$(DEPDIR)/libcurlu_la-ngtcp2.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@vquic/$(DEPDIR)/libcurlu_la-quiche.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@vssh/$(DEPDIR)/libcurl_la-libssh.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@vssh/$(DEPDIR)/libcurl_la-libssh2.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@vssh/$(DEPDIR)/libcurlu_la-libssh.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@vssh/$(DEPDIR)/libcurlu_la-libssh2.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@vtls/$(DEPDIR)/libcurl_la-bearssl.Plo@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@vtls/$(DEPDIR)/libcurl_la-gskit.Plo@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@vtls/$(DEPDIR)/libcurl_la-gtls.Plo@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@vtls/$(DEPDIR)/libcurl_la-mbedtls.Plo@am__quote@ # am--include-marker
@@ -1514,10 +1580,10 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@vtls/$(DEPDIR)/libcurl_la-polarssl_threadlock.Plo@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@vtls/$(DEPDIR)/libcurl_la-schannel.Plo@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@vtls/$(DEPDIR)/libcurl_la-schannel_verify.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@vtls/$(DEPDIR)/libcurl_la-sectransp.Plo@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@vtls/$(DEPDIR)/libcurl_la-vtls.Plo@am__quote@ # am--include-marker
-@AMDEP_TRUE@@am__include@ @am__quote@vtls/$(DEPDIR)/libcurlu_la-axtls.Plo@am__quote@ # am--include-marker
-@AMDEP_TRUE@@am__include@ @am__quote@vtls/$(DEPDIR)/libcurlu_la-cyassl.Plo@am__quote@ # am--include-marker
-@AMDEP_TRUE@@am__include@ @am__quote@vtls/$(DEPDIR)/libcurlu_la-darwinssl.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@vtls/$(DEPDIR)/libcurl_la-wolfssl.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@vtls/$(DEPDIR)/libcurlu_la-bearssl.Plo@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@vtls/$(DEPDIR)/libcurlu_la-gskit.Plo@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@vtls/$(DEPDIR)/libcurlu_la-gtls.Plo@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@vtls/$(DEPDIR)/libcurlu_la-mbedtls.Plo@am__quote@ # am--include-marker
@@ -1528,7 +1594,9 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@vtls/$(DEPDIR)/libcurlu_la-polarssl_threadlock.Plo@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@vtls/$(DEPDIR)/libcurlu_la-schannel.Plo@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@vtls/$(DEPDIR)/libcurlu_la-schannel_verify.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@vtls/$(DEPDIR)/libcurlu_la-sectransp.Plo@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@vtls/$(DEPDIR)/libcurlu_la-vtls.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@vtls/$(DEPDIR)/libcurlu_la-wolfssl.Plo@am__quote@ # am--include-marker
 
 $(am__depfiles_remade):
        @$(MKDIR_P) $(@D)
@@ -1973,20 +2041,6 @@ libcurl_la-socks.lo: socks.c
 @AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -c -o libcurl_la-socks.lo `test -f 'socks.c' || echo '$(srcdir)/'`socks.c
 
-libcurl_la-ssh.lo: ssh.c
-@am__fastdepCC_TRUE@   $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -MT libcurl_la-ssh.lo -MD -MP -MF $(DEPDIR)/libcurl_la-ssh.Tpo -c -o libcurl_la-ssh.lo `test -f 'ssh.c' || echo '$(srcdir)/'`ssh.c
-@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/libcurl_la-ssh.Tpo $(DEPDIR)/libcurl_la-ssh.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='ssh.c' object='libcurl_la-ssh.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -c -o libcurl_la-ssh.lo `test -f 'ssh.c' || echo '$(srcdir)/'`ssh.c
-
-libcurl_la-ssh-libssh.lo: ssh-libssh.c
-@am__fastdepCC_TRUE@   $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -MT libcurl_la-ssh-libssh.lo -MD -MP -MF $(DEPDIR)/libcurl_la-ssh-libssh.Tpo -c -o libcurl_la-ssh-libssh.lo `test -f 'ssh-libssh.c' || echo '$(srcdir)/'`ssh-libssh.c
-@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/libcurl_la-ssh-libssh.Tpo $(DEPDIR)/libcurl_la-ssh-libssh.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='ssh-libssh.c' object='libcurl_la-ssh-libssh.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -c -o libcurl_la-ssh-libssh.lo `test -f 'ssh-libssh.c' || echo '$(srcdir)/'`ssh-libssh.c
-
 libcurl_la-curl_addrinfo.lo: curl_addrinfo.c
 @am__fastdepCC_TRUE@   $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -MT libcurl_la-curl_addrinfo.lo -MD -MP -MF $(DEPDIR)/libcurl_la-curl_addrinfo.Tpo -c -o libcurl_la-curl_addrinfo.lo `test -f 'curl_addrinfo.c' || echo '$(srcdir)/'`curl_addrinfo.c
 @am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/libcurl_la-curl_addrinfo.Tpo $(DEPDIR)/libcurl_la-curl_addrinfo.Plo
@@ -2218,13 +2272,6 @@ libcurl_la-conncache.lo: conncache.c
 @AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -c -o libcurl_la-conncache.lo `test -f 'conncache.c' || echo '$(srcdir)/'`conncache.c
 
-libcurl_la-pipeline.lo: pipeline.c
-@am__fastdepCC_TRUE@   $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -MT libcurl_la-pipeline.lo -MD -MP -MF $(DEPDIR)/libcurl_la-pipeline.Tpo -c -o libcurl_la-pipeline.lo `test -f 'pipeline.c' || echo '$(srcdir)/'`pipeline.c
-@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/libcurl_la-pipeline.Tpo $(DEPDIR)/libcurl_la-pipeline.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='pipeline.c' object='libcurl_la-pipeline.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -c -o libcurl_la-pipeline.lo `test -f 'pipeline.c' || echo '$(srcdir)/'`pipeline.c
-
 libcurl_la-dotdot.lo: dotdot.c
 @am__fastdepCC_TRUE@   $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -MT libcurl_la-dotdot.lo -MD -MP -MF $(DEPDIR)/libcurl_la-dotdot.Tpo -c -o libcurl_la-dotdot.lo `test -f 'dotdot.c' || echo '$(srcdir)/'`dotdot.c
 @am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/libcurl_la-dotdot.Tpo $(DEPDIR)/libcurl_la-dotdot.Plo
@@ -2337,6 +2384,27 @@ libcurl_la-urlapi.lo: urlapi.c
 @AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -c -o libcurl_la-urlapi.lo `test -f 'urlapi.c' || echo '$(srcdir)/'`urlapi.c
 
+libcurl_la-curl_get_line.lo: curl_get_line.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -MT libcurl_la-curl_get_line.lo -MD -MP -MF $(DEPDIR)/libcurl_la-curl_get_line.Tpo -c -o libcurl_la-curl_get_line.lo `test -f 'curl_get_line.c' || echo '$(srcdir)/'`curl_get_line.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/libcurl_la-curl_get_line.Tpo $(DEPDIR)/libcurl_la-curl_get_line.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='curl_get_line.c' object='libcurl_la-curl_get_line.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -c -o libcurl_la-curl_get_line.lo `test -f 'curl_get_line.c' || echo '$(srcdir)/'`curl_get_line.c
+
+libcurl_la-altsvc.lo: altsvc.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -MT libcurl_la-altsvc.lo -MD -MP -MF $(DEPDIR)/libcurl_la-altsvc.Tpo -c -o libcurl_la-altsvc.lo `test -f 'altsvc.c' || echo '$(srcdir)/'`altsvc.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/libcurl_la-altsvc.Tpo $(DEPDIR)/libcurl_la-altsvc.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='altsvc.c' object='libcurl_la-altsvc.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -c -o libcurl_la-altsvc.lo `test -f 'altsvc.c' || echo '$(srcdir)/'`altsvc.c
+
+libcurl_la-socketpair.lo: socketpair.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -MT libcurl_la-socketpair.lo -MD -MP -MF $(DEPDIR)/libcurl_la-socketpair.Tpo -c -o libcurl_la-socketpair.lo `test -f 'socketpair.c' || echo '$(srcdir)/'`socketpair.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/libcurl_la-socketpair.Tpo $(DEPDIR)/libcurl_la-socketpair.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='socketpair.c' object='libcurl_la-socketpair.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -c -o libcurl_la-socketpair.lo `test -f 'socketpair.c' || echo '$(srcdir)/'`socketpair.c
+
 vauth/libcurl_la-vauth.lo: vauth/vauth.c
 @am__fastdepCC_TRUE@   $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -MT vauth/libcurl_la-vauth.lo -MD -MP -MF vauth/$(DEPDIR)/libcurl_la-vauth.Tpo -c -o vauth/libcurl_la-vauth.lo `test -f 'vauth/vauth.c' || echo '$(srcdir)/'`vauth/vauth.c
 @am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) vauth/$(DEPDIR)/libcurl_la-vauth.Tpo vauth/$(DEPDIR)/libcurl_la-vauth.Plo
@@ -2463,19 +2531,12 @@ vtls/libcurl_la-polarssl_threadlock.lo: vtls/polarssl_threadlock.c
 @AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -c -o vtls/libcurl_la-polarssl_threadlock.lo `test -f 'vtls/polarssl_threadlock.c' || echo '$(srcdir)/'`vtls/polarssl_threadlock.c
 
-vtls/libcurl_la-axtls.lo: vtls/axtls.c
-@am__fastdepCC_TRUE@   $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -MT vtls/libcurl_la-axtls.lo -MD -MP -MF vtls/$(DEPDIR)/libcurl_la-axtls.Tpo -c -o vtls/libcurl_la-axtls.lo `test -f 'vtls/axtls.c' || echo '$(srcdir)/'`vtls/axtls.c
-@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) vtls/$(DEPDIR)/libcurl_la-axtls.Tpo vtls/$(DEPDIR)/libcurl_la-axtls.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='vtls/axtls.c' object='vtls/libcurl_la-axtls.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -c -o vtls/libcurl_la-axtls.lo `test -f 'vtls/axtls.c' || echo '$(srcdir)/'`vtls/axtls.c
-
-vtls/libcurl_la-cyassl.lo: vtls/cyassl.c
-@am__fastdepCC_TRUE@   $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -MT vtls/libcurl_la-cyassl.lo -MD -MP -MF vtls/$(DEPDIR)/libcurl_la-cyassl.Tpo -c -o vtls/libcurl_la-cyassl.lo `test -f 'vtls/cyassl.c' || echo '$(srcdir)/'`vtls/cyassl.c
-@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) vtls/$(DEPDIR)/libcurl_la-cyassl.Tpo vtls/$(DEPDIR)/libcurl_la-cyassl.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='vtls/cyassl.c' object='vtls/libcurl_la-cyassl.lo' libtool=yes @AMDEPBACKSLASH@
+vtls/libcurl_la-wolfssl.lo: vtls/wolfssl.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -MT vtls/libcurl_la-wolfssl.lo -MD -MP -MF vtls/$(DEPDIR)/libcurl_la-wolfssl.Tpo -c -o vtls/libcurl_la-wolfssl.lo `test -f 'vtls/wolfssl.c' || echo '$(srcdir)/'`vtls/wolfssl.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) vtls/$(DEPDIR)/libcurl_la-wolfssl.Tpo vtls/$(DEPDIR)/libcurl_la-wolfssl.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='vtls/wolfssl.c' object='vtls/libcurl_la-wolfssl.lo' libtool=yes @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -c -o vtls/libcurl_la-cyassl.lo `test -f 'vtls/cyassl.c' || echo '$(srcdir)/'`vtls/cyassl.c
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -c -o vtls/libcurl_la-wolfssl.lo `test -f 'vtls/wolfssl.c' || echo '$(srcdir)/'`vtls/wolfssl.c
 
 vtls/libcurl_la-schannel.lo: vtls/schannel.c
 @am__fastdepCC_TRUE@   $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -MT vtls/libcurl_la-schannel.lo -MD -MP -MF vtls/$(DEPDIR)/libcurl_la-schannel.Tpo -c -o vtls/libcurl_la-schannel.lo `test -f 'vtls/schannel.c' || echo '$(srcdir)/'`vtls/schannel.c
@@ -2491,12 +2552,12 @@ vtls/libcurl_la-schannel_verify.lo: vtls/schannel_verify.c
 @AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -c -o vtls/libcurl_la-schannel_verify.lo `test -f 'vtls/schannel_verify.c' || echo '$(srcdir)/'`vtls/schannel_verify.c
 
-vtls/libcurl_la-darwinssl.lo: vtls/darwinssl.c
-@am__fastdepCC_TRUE@   $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -MT vtls/libcurl_la-darwinssl.lo -MD -MP -MF vtls/$(DEPDIR)/libcurl_la-darwinssl.Tpo -c -o vtls/libcurl_la-darwinssl.lo `test -f 'vtls/darwinssl.c' || echo '$(srcdir)/'`vtls/darwinssl.c
-@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) vtls/$(DEPDIR)/libcurl_la-darwinssl.Tpo vtls/$(DEPDIR)/libcurl_la-darwinssl.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='vtls/darwinssl.c' object='vtls/libcurl_la-darwinssl.lo' libtool=yes @AMDEPBACKSLASH@
+vtls/libcurl_la-sectransp.lo: vtls/sectransp.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -MT vtls/libcurl_la-sectransp.lo -MD -MP -MF vtls/$(DEPDIR)/libcurl_la-sectransp.Tpo -c -o vtls/libcurl_la-sectransp.lo `test -f 'vtls/sectransp.c' || echo '$(srcdir)/'`vtls/sectransp.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) vtls/$(DEPDIR)/libcurl_la-sectransp.Tpo vtls/$(DEPDIR)/libcurl_la-sectransp.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='vtls/sectransp.c' object='vtls/libcurl_la-sectransp.lo' libtool=yes @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -c -o vtls/libcurl_la-darwinssl.lo `test -f 'vtls/darwinssl.c' || echo '$(srcdir)/'`vtls/darwinssl.c
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -c -o vtls/libcurl_la-sectransp.lo `test -f 'vtls/sectransp.c' || echo '$(srcdir)/'`vtls/sectransp.c
 
 vtls/libcurl_la-gskit.lo: vtls/gskit.c
 @am__fastdepCC_TRUE@   $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -MT vtls/libcurl_la-gskit.lo -MD -MP -MF vtls/$(DEPDIR)/libcurl_la-gskit.Tpo -c -o vtls/libcurl_la-gskit.lo `test -f 'vtls/gskit.c' || echo '$(srcdir)/'`vtls/gskit.c
@@ -2519,6 +2580,41 @@ vtls/libcurl_la-mesalink.lo: vtls/mesalink.c
 @AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -c -o vtls/libcurl_la-mesalink.lo `test -f 'vtls/mesalink.c' || echo '$(srcdir)/'`vtls/mesalink.c
 
+vtls/libcurl_la-bearssl.lo: vtls/bearssl.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -MT vtls/libcurl_la-bearssl.lo -MD -MP -MF vtls/$(DEPDIR)/libcurl_la-bearssl.Tpo -c -o vtls/libcurl_la-bearssl.lo `test -f 'vtls/bearssl.c' || echo '$(srcdir)/'`vtls/bearssl.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) vtls/$(DEPDIR)/libcurl_la-bearssl.Tpo vtls/$(DEPDIR)/libcurl_la-bearssl.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='vtls/bearssl.c' object='vtls/libcurl_la-bearssl.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -c -o vtls/libcurl_la-bearssl.lo `test -f 'vtls/bearssl.c' || echo '$(srcdir)/'`vtls/bearssl.c
+
+vquic/libcurl_la-ngtcp2.lo: vquic/ngtcp2.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -MT vquic/libcurl_la-ngtcp2.lo -MD -MP -MF vquic/$(DEPDIR)/libcurl_la-ngtcp2.Tpo -c -o vquic/libcurl_la-ngtcp2.lo `test -f 'vquic/ngtcp2.c' || echo '$(srcdir)/'`vquic/ngtcp2.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) vquic/$(DEPDIR)/libcurl_la-ngtcp2.Tpo vquic/$(DEPDIR)/libcurl_la-ngtcp2.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='vquic/ngtcp2.c' object='vquic/libcurl_la-ngtcp2.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -c -o vquic/libcurl_la-ngtcp2.lo `test -f 'vquic/ngtcp2.c' || echo '$(srcdir)/'`vquic/ngtcp2.c
+
+vquic/libcurl_la-quiche.lo: vquic/quiche.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -MT vquic/libcurl_la-quiche.lo -MD -MP -MF vquic/$(DEPDIR)/libcurl_la-quiche.Tpo -c -o vquic/libcurl_la-quiche.lo `test -f 'vquic/quiche.c' || echo '$(srcdir)/'`vquic/quiche.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) vquic/$(DEPDIR)/libcurl_la-quiche.Tpo vquic/$(DEPDIR)/libcurl_la-quiche.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='vquic/quiche.c' object='vquic/libcurl_la-quiche.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -c -o vquic/libcurl_la-quiche.lo `test -f 'vquic/quiche.c' || echo '$(srcdir)/'`vquic/quiche.c
+
+vssh/libcurl_la-libssh2.lo: vssh/libssh2.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -MT vssh/libcurl_la-libssh2.lo -MD -MP -MF vssh/$(DEPDIR)/libcurl_la-libssh2.Tpo -c -o vssh/libcurl_la-libssh2.lo `test -f 'vssh/libssh2.c' || echo '$(srcdir)/'`vssh/libssh2.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) vssh/$(DEPDIR)/libcurl_la-libssh2.Tpo vssh/$(DEPDIR)/libcurl_la-libssh2.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='vssh/libssh2.c' object='vssh/libcurl_la-libssh2.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -c -o vssh/libcurl_la-libssh2.lo `test -f 'vssh/libssh2.c' || echo '$(srcdir)/'`vssh/libssh2.c
+
+vssh/libcurl_la-libssh.lo: vssh/libssh.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -MT vssh/libcurl_la-libssh.lo -MD -MP -MF vssh/$(DEPDIR)/libcurl_la-libssh.Tpo -c -o vssh/libcurl_la-libssh.lo `test -f 'vssh/libssh.c' || echo '$(srcdir)/'`vssh/libssh.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) vssh/$(DEPDIR)/libcurl_la-libssh.Tpo vssh/$(DEPDIR)/libcurl_la-libssh.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='vssh/libssh.c' object='vssh/libcurl_la-libssh.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -c -o vssh/libcurl_la-libssh.lo `test -f 'vssh/libssh.c' || echo '$(srcdir)/'`vssh/libssh.c
+
 libcurlu_la-file.lo: file.c
 @am__fastdepCC_TRUE@   $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -MT libcurlu_la-file.lo -MD -MP -MF $(DEPDIR)/libcurlu_la-file.Tpo -c -o libcurlu_la-file.lo `test -f 'file.c' || echo '$(srcdir)/'`file.c
 @am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/libcurlu_la-file.Tpo $(DEPDIR)/libcurlu_la-file.Plo
@@ -2932,20 +3028,6 @@ libcurlu_la-socks.lo: socks.c
 @AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -c -o libcurlu_la-socks.lo `test -f 'socks.c' || echo '$(srcdir)/'`socks.c
 
-libcurlu_la-ssh.lo: ssh.c
-@am__fastdepCC_TRUE@   $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -MT libcurlu_la-ssh.lo -MD -MP -MF $(DEPDIR)/libcurlu_la-ssh.Tpo -c -o libcurlu_la-ssh.lo `test -f 'ssh.c' || echo '$(srcdir)/'`ssh.c
-@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/libcurlu_la-ssh.Tpo $(DEPDIR)/libcurlu_la-ssh.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='ssh.c' object='libcurlu_la-ssh.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -c -o libcurlu_la-ssh.lo `test -f 'ssh.c' || echo '$(srcdir)/'`ssh.c
-
-libcurlu_la-ssh-libssh.lo: ssh-libssh.c
-@am__fastdepCC_TRUE@   $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -MT libcurlu_la-ssh-libssh.lo -MD -MP -MF $(DEPDIR)/libcurlu_la-ssh-libssh.Tpo -c -o libcurlu_la-ssh-libssh.lo `test -f 'ssh-libssh.c' || echo '$(srcdir)/'`ssh-libssh.c
-@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/libcurlu_la-ssh-libssh.Tpo $(DEPDIR)/libcurlu_la-ssh-libssh.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='ssh-libssh.c' object='libcurlu_la-ssh-libssh.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -c -o libcurlu_la-ssh-libssh.lo `test -f 'ssh-libssh.c' || echo '$(srcdir)/'`ssh-libssh.c
-
 libcurlu_la-curl_addrinfo.lo: curl_addrinfo.c
 @am__fastdepCC_TRUE@   $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -MT libcurlu_la-curl_addrinfo.lo -MD -MP -MF $(DEPDIR)/libcurlu_la-curl_addrinfo.Tpo -c -o libcurlu_la-curl_addrinfo.lo `test -f 'curl_addrinfo.c' || echo '$(srcdir)/'`curl_addrinfo.c
 @am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/libcurlu_la-curl_addrinfo.Tpo $(DEPDIR)/libcurlu_la-curl_addrinfo.Plo
@@ -3177,13 +3259,6 @@ libcurlu_la-conncache.lo: conncache.c
 @AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -c -o libcurlu_la-conncache.lo `test -f 'conncache.c' || echo '$(srcdir)/'`conncache.c
 
-libcurlu_la-pipeline.lo: pipeline.c
-@am__fastdepCC_TRUE@   $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -MT libcurlu_la-pipeline.lo -MD -MP -MF $(DEPDIR)/libcurlu_la-pipeline.Tpo -c -o libcurlu_la-pipeline.lo `test -f 'pipeline.c' || echo '$(srcdir)/'`pipeline.c
-@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/libcurlu_la-pipeline.Tpo $(DEPDIR)/libcurlu_la-pipeline.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='pipeline.c' object='libcurlu_la-pipeline.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -c -o libcurlu_la-pipeline.lo `test -f 'pipeline.c' || echo '$(srcdir)/'`pipeline.c
-
 libcurlu_la-dotdot.lo: dotdot.c
 @am__fastdepCC_TRUE@   $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -MT libcurlu_la-dotdot.lo -MD -MP -MF $(DEPDIR)/libcurlu_la-dotdot.Tpo -c -o libcurlu_la-dotdot.lo `test -f 'dotdot.c' || echo '$(srcdir)/'`dotdot.c
 @am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/libcurlu_la-dotdot.Tpo $(DEPDIR)/libcurlu_la-dotdot.Plo
@@ -3296,6 +3371,27 @@ libcurlu_la-urlapi.lo: urlapi.c
 @AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -c -o libcurlu_la-urlapi.lo `test -f 'urlapi.c' || echo '$(srcdir)/'`urlapi.c
 
+libcurlu_la-curl_get_line.lo: curl_get_line.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -MT libcurlu_la-curl_get_line.lo -MD -MP -MF $(DEPDIR)/libcurlu_la-curl_get_line.Tpo -c -o libcurlu_la-curl_get_line.lo `test -f 'curl_get_line.c' || echo '$(srcdir)/'`curl_get_line.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/libcurlu_la-curl_get_line.Tpo $(DEPDIR)/libcurlu_la-curl_get_line.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='curl_get_line.c' object='libcurlu_la-curl_get_line.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -c -o libcurlu_la-curl_get_line.lo `test -f 'curl_get_line.c' || echo '$(srcdir)/'`curl_get_line.c
+
+libcurlu_la-altsvc.lo: altsvc.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -MT libcurlu_la-altsvc.lo -MD -MP -MF $(DEPDIR)/libcurlu_la-altsvc.Tpo -c -o libcurlu_la-altsvc.lo `test -f 'altsvc.c' || echo '$(srcdir)/'`altsvc.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/libcurlu_la-altsvc.Tpo $(DEPDIR)/libcurlu_la-altsvc.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='altsvc.c' object='libcurlu_la-altsvc.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -c -o libcurlu_la-altsvc.lo `test -f 'altsvc.c' || echo '$(srcdir)/'`altsvc.c
+
+libcurlu_la-socketpair.lo: socketpair.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -MT libcurlu_la-socketpair.lo -MD -MP -MF $(DEPDIR)/libcurlu_la-socketpair.Tpo -c -o libcurlu_la-socketpair.lo `test -f 'socketpair.c' || echo '$(srcdir)/'`socketpair.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/libcurlu_la-socketpair.Tpo $(DEPDIR)/libcurlu_la-socketpair.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='socketpair.c' object='libcurlu_la-socketpair.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -c -o libcurlu_la-socketpair.lo `test -f 'socketpair.c' || echo '$(srcdir)/'`socketpair.c
+
 vauth/libcurlu_la-vauth.lo: vauth/vauth.c
 @am__fastdepCC_TRUE@   $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -MT vauth/libcurlu_la-vauth.lo -MD -MP -MF vauth/$(DEPDIR)/libcurlu_la-vauth.Tpo -c -o vauth/libcurlu_la-vauth.lo `test -f 'vauth/vauth.c' || echo '$(srcdir)/'`vauth/vauth.c
 @am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) vauth/$(DEPDIR)/libcurlu_la-vauth.Tpo vauth/$(DEPDIR)/libcurlu_la-vauth.Plo
@@ -3422,19 +3518,12 @@ vtls/libcurlu_la-polarssl_threadlock.lo: vtls/polarssl_threadlock.c
 @AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -c -o vtls/libcurlu_la-polarssl_threadlock.lo `test -f 'vtls/polarssl_threadlock.c' || echo '$(srcdir)/'`vtls/polarssl_threadlock.c
 
-vtls/libcurlu_la-axtls.lo: vtls/axtls.c
-@am__fastdepCC_TRUE@   $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -MT vtls/libcurlu_la-axtls.lo -MD -MP -MF vtls/$(DEPDIR)/libcurlu_la-axtls.Tpo -c -o vtls/libcurlu_la-axtls.lo `test -f 'vtls/axtls.c' || echo '$(srcdir)/'`vtls/axtls.c
-@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) vtls/$(DEPDIR)/libcurlu_la-axtls.Tpo vtls/$(DEPDIR)/libcurlu_la-axtls.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='vtls/axtls.c' object='vtls/libcurlu_la-axtls.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -c -o vtls/libcurlu_la-axtls.lo `test -f 'vtls/axtls.c' || echo '$(srcdir)/'`vtls/axtls.c
-
-vtls/libcurlu_la-cyassl.lo: vtls/cyassl.c
-@am__fastdepCC_TRUE@   $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -MT vtls/libcurlu_la-cyassl.lo -MD -MP -MF vtls/$(DEPDIR)/libcurlu_la-cyassl.Tpo -c -o vtls/libcurlu_la-cyassl.lo `test -f 'vtls/cyassl.c' || echo '$(srcdir)/'`vtls/cyassl.c
-@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) vtls/$(DEPDIR)/libcurlu_la-cyassl.Tpo vtls/$(DEPDIR)/libcurlu_la-cyassl.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='vtls/cyassl.c' object='vtls/libcurlu_la-cyassl.lo' libtool=yes @AMDEPBACKSLASH@
+vtls/libcurlu_la-wolfssl.lo: vtls/wolfssl.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -MT vtls/libcurlu_la-wolfssl.lo -MD -MP -MF vtls/$(DEPDIR)/libcurlu_la-wolfssl.Tpo -c -o vtls/libcurlu_la-wolfssl.lo `test -f 'vtls/wolfssl.c' || echo '$(srcdir)/'`vtls/wolfssl.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) vtls/$(DEPDIR)/libcurlu_la-wolfssl.Tpo vtls/$(DEPDIR)/libcurlu_la-wolfssl.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='vtls/wolfssl.c' object='vtls/libcurlu_la-wolfssl.lo' libtool=yes @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -c -o vtls/libcurlu_la-cyassl.lo `test -f 'vtls/cyassl.c' || echo '$(srcdir)/'`vtls/cyassl.c
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -c -o vtls/libcurlu_la-wolfssl.lo `test -f 'vtls/wolfssl.c' || echo '$(srcdir)/'`vtls/wolfssl.c
 
 vtls/libcurlu_la-schannel.lo: vtls/schannel.c
 @am__fastdepCC_TRUE@   $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -MT vtls/libcurlu_la-schannel.lo -MD -MP -MF vtls/$(DEPDIR)/libcurlu_la-schannel.Tpo -c -o vtls/libcurlu_la-schannel.lo `test -f 'vtls/schannel.c' || echo '$(srcdir)/'`vtls/schannel.c
@@ -3450,12 +3539,12 @@ vtls/libcurlu_la-schannel_verify.lo: vtls/schannel_verify.c
 @AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -c -o vtls/libcurlu_la-schannel_verify.lo `test -f 'vtls/schannel_verify.c' || echo '$(srcdir)/'`vtls/schannel_verify.c
 
-vtls/libcurlu_la-darwinssl.lo: vtls/darwinssl.c
-@am__fastdepCC_TRUE@   $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -MT vtls/libcurlu_la-darwinssl.lo -MD -MP -MF vtls/$(DEPDIR)/libcurlu_la-darwinssl.Tpo -c -o vtls/libcurlu_la-darwinssl.lo `test -f 'vtls/darwinssl.c' || echo '$(srcdir)/'`vtls/darwinssl.c
-@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) vtls/$(DEPDIR)/libcurlu_la-darwinssl.Tpo vtls/$(DEPDIR)/libcurlu_la-darwinssl.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='vtls/darwinssl.c' object='vtls/libcurlu_la-darwinssl.lo' libtool=yes @AMDEPBACKSLASH@
+vtls/libcurlu_la-sectransp.lo: vtls/sectransp.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -MT vtls/libcurlu_la-sectransp.lo -MD -MP -MF vtls/$(DEPDIR)/libcurlu_la-sectransp.Tpo -c -o vtls/libcurlu_la-sectransp.lo `test -f 'vtls/sectransp.c' || echo '$(srcdir)/'`vtls/sectransp.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) vtls/$(DEPDIR)/libcurlu_la-sectransp.Tpo vtls/$(DEPDIR)/libcurlu_la-sectransp.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='vtls/sectransp.c' object='vtls/libcurlu_la-sectransp.lo' libtool=yes @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -c -o vtls/libcurlu_la-darwinssl.lo `test -f 'vtls/darwinssl.c' || echo '$(srcdir)/'`vtls/darwinssl.c
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -c -o vtls/libcurlu_la-sectransp.lo `test -f 'vtls/sectransp.c' || echo '$(srcdir)/'`vtls/sectransp.c
 
 vtls/libcurlu_la-gskit.lo: vtls/gskit.c
 @am__fastdepCC_TRUE@   $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -MT vtls/libcurlu_la-gskit.lo -MD -MP -MF vtls/$(DEPDIR)/libcurlu_la-gskit.Tpo -c -o vtls/libcurlu_la-gskit.lo `test -f 'vtls/gskit.c' || echo '$(srcdir)/'`vtls/gskit.c
@@ -3478,12 +3567,49 @@ vtls/libcurlu_la-mesalink.lo: vtls/mesalink.c
 @AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -c -o vtls/libcurlu_la-mesalink.lo `test -f 'vtls/mesalink.c' || echo '$(srcdir)/'`vtls/mesalink.c
 
+vtls/libcurlu_la-bearssl.lo: vtls/bearssl.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -MT vtls/libcurlu_la-bearssl.lo -MD -MP -MF vtls/$(DEPDIR)/libcurlu_la-bearssl.Tpo -c -o vtls/libcurlu_la-bearssl.lo `test -f 'vtls/bearssl.c' || echo '$(srcdir)/'`vtls/bearssl.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) vtls/$(DEPDIR)/libcurlu_la-bearssl.Tpo vtls/$(DEPDIR)/libcurlu_la-bearssl.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='vtls/bearssl.c' object='vtls/libcurlu_la-bearssl.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -c -o vtls/libcurlu_la-bearssl.lo `test -f 'vtls/bearssl.c' || echo '$(srcdir)/'`vtls/bearssl.c
+
+vquic/libcurlu_la-ngtcp2.lo: vquic/ngtcp2.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -MT vquic/libcurlu_la-ngtcp2.lo -MD -MP -MF vquic/$(DEPDIR)/libcurlu_la-ngtcp2.Tpo -c -o vquic/libcurlu_la-ngtcp2.lo `test -f 'vquic/ngtcp2.c' || echo '$(srcdir)/'`vquic/ngtcp2.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) vquic/$(DEPDIR)/libcurlu_la-ngtcp2.Tpo vquic/$(DEPDIR)/libcurlu_la-ngtcp2.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='vquic/ngtcp2.c' object='vquic/libcurlu_la-ngtcp2.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -c -o vquic/libcurlu_la-ngtcp2.lo `test -f 'vquic/ngtcp2.c' || echo '$(srcdir)/'`vquic/ngtcp2.c
+
+vquic/libcurlu_la-quiche.lo: vquic/quiche.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -MT vquic/libcurlu_la-quiche.lo -MD -MP -MF vquic/$(DEPDIR)/libcurlu_la-quiche.Tpo -c -o vquic/libcurlu_la-quiche.lo `test -f 'vquic/quiche.c' || echo '$(srcdir)/'`vquic/quiche.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) vquic/$(DEPDIR)/libcurlu_la-quiche.Tpo vquic/$(DEPDIR)/libcurlu_la-quiche.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='vquic/quiche.c' object='vquic/libcurlu_la-quiche.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -c -o vquic/libcurlu_la-quiche.lo `test -f 'vquic/quiche.c' || echo '$(srcdir)/'`vquic/quiche.c
+
+vssh/libcurlu_la-libssh2.lo: vssh/libssh2.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -MT vssh/libcurlu_la-libssh2.lo -MD -MP -MF vssh/$(DEPDIR)/libcurlu_la-libssh2.Tpo -c -o vssh/libcurlu_la-libssh2.lo `test -f 'vssh/libssh2.c' || echo '$(srcdir)/'`vssh/libssh2.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) vssh/$(DEPDIR)/libcurlu_la-libssh2.Tpo vssh/$(DEPDIR)/libcurlu_la-libssh2.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='vssh/libssh2.c' object='vssh/libcurlu_la-libssh2.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -c -o vssh/libcurlu_la-libssh2.lo `test -f 'vssh/libssh2.c' || echo '$(srcdir)/'`vssh/libssh2.c
+
+vssh/libcurlu_la-libssh.lo: vssh/libssh.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -MT vssh/libcurlu_la-libssh.lo -MD -MP -MF vssh/$(DEPDIR)/libcurlu_la-libssh.Tpo -c -o vssh/libcurlu_la-libssh.lo `test -f 'vssh/libssh.c' || echo '$(srcdir)/'`vssh/libssh.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) vssh/$(DEPDIR)/libcurlu_la-libssh.Tpo vssh/$(DEPDIR)/libcurlu_la-libssh.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='vssh/libssh.c' object='vssh/libcurlu_la-libssh.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -c -o vssh/libcurlu_la-libssh.lo `test -f 'vssh/libssh.c' || echo '$(srcdir)/'`vssh/libssh.c
+
 mostlyclean-libtool:
        -rm -f *.lo
 
 clean-libtool:
        -rm -rf .libs _libs
        -rm -rf vauth/.libs vauth/_libs
+       -rm -rf vquic/.libs vquic/_libs
+       -rm -rf vssh/.libs vssh/_libs
        -rm -rf vtls/.libs vtls/_libs
 
 ID: $(am__tagged_files)
@@ -3607,6 +3733,10 @@ distclean-generic:
        -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
        -rm -f vauth/$(DEPDIR)/$(am__dirstamp)
        -rm -f vauth/$(am__dirstamp)
+       -rm -f vquic/$(DEPDIR)/$(am__dirstamp)
+       -rm -f vquic/$(am__dirstamp)
+       -rm -f vssh/$(DEPDIR)/$(am__dirstamp)
+       -rm -f vssh/$(am__dirstamp)
        -rm -f vtls/$(DEPDIR)/$(am__dirstamp)
        -rm -f vtls/$(am__dirstamp)
 
@@ -3619,7 +3749,8 @@ clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \
        clean-noinstLTLIBRARIES mostlyclean-am
 
 distclean: distclean-am
-               -rm -f ./$(DEPDIR)/libcurl_la-amigaos.Plo
+               -rm -f ./$(DEPDIR)/libcurl_la-altsvc.Plo
+       -rm -f ./$(DEPDIR)/libcurl_la-amigaos.Plo
        -rm -f ./$(DEPDIR)/libcurl_la-asyn-ares.Plo
        -rm -f ./$(DEPDIR)/libcurl_la-asyn-thread.Plo
        -rm -f ./$(DEPDIR)/libcurl_la-base64.Plo
@@ -3632,6 +3763,7 @@ distclean: distclean-am
        -rm -f ./$(DEPDIR)/libcurl_la-curl_des.Plo
        -rm -f ./$(DEPDIR)/libcurl_la-curl_endian.Plo
        -rm -f ./$(DEPDIR)/libcurl_la-curl_fnmatch.Plo
+       -rm -f ./$(DEPDIR)/libcurl_la-curl_get_line.Plo
        -rm -f ./$(DEPDIR)/libcurl_la-curl_gethostname.Plo
        -rm -f ./$(DEPDIR)/libcurl_la-curl_gssapi.Plo
        -rm -f ./$(DEPDIR)/libcurl_la-curl_memrchr.Plo
@@ -3692,7 +3824,6 @@ distclean: distclean-am
        -rm -f ./$(DEPDIR)/libcurl_la-openldap.Plo
        -rm -f ./$(DEPDIR)/libcurl_la-parsedate.Plo
        -rm -f ./$(DEPDIR)/libcurl_la-pingpong.Plo
-       -rm -f ./$(DEPDIR)/libcurl_la-pipeline.Plo
        -rm -f ./$(DEPDIR)/libcurl_la-pop3.Plo
        -rm -f ./$(DEPDIR)/libcurl_la-progress.Plo
        -rm -f ./$(DEPDIR)/libcurl_la-psl.Plo
@@ -3707,13 +3838,12 @@ distclean: distclean-am
        -rm -f ./$(DEPDIR)/libcurl_la-slist.Plo
        -rm -f ./$(DEPDIR)/libcurl_la-smb.Plo
        -rm -f ./$(DEPDIR)/libcurl_la-smtp.Plo
+       -rm -f ./$(DEPDIR)/libcurl_la-socketpair.Plo
        -rm -f ./$(DEPDIR)/libcurl_la-socks.Plo
        -rm -f ./$(DEPDIR)/libcurl_la-socks_gssapi.Plo
        -rm -f ./$(DEPDIR)/libcurl_la-socks_sspi.Plo
        -rm -f ./$(DEPDIR)/libcurl_la-speedcheck.Plo
        -rm -f ./$(DEPDIR)/libcurl_la-splay.Plo
-       -rm -f ./$(DEPDIR)/libcurl_la-ssh-libssh.Plo
-       -rm -f ./$(DEPDIR)/libcurl_la-ssh.Plo
        -rm -f ./$(DEPDIR)/libcurl_la-strcase.Plo
        -rm -f ./$(DEPDIR)/libcurl_la-strdup.Plo
        -rm -f ./$(DEPDIR)/libcurl_la-strerror.Plo
@@ -3730,6 +3860,7 @@ distclean: distclean-am
        -rm -f ./$(DEPDIR)/libcurl_la-warnless.Plo
        -rm -f ./$(DEPDIR)/libcurl_la-wildcard.Plo
        -rm -f ./$(DEPDIR)/libcurl_la-x509asn1.Plo
+       -rm -f ./$(DEPDIR)/libcurlu_la-altsvc.Plo
        -rm -f ./$(DEPDIR)/libcurlu_la-amigaos.Plo
        -rm -f ./$(DEPDIR)/libcurlu_la-asyn-ares.Plo
        -rm -f ./$(DEPDIR)/libcurlu_la-asyn-thread.Plo
@@ -3743,6 +3874,7 @@ distclean: distclean-am
        -rm -f ./$(DEPDIR)/libcurlu_la-curl_des.Plo
        -rm -f ./$(DEPDIR)/libcurlu_la-curl_endian.Plo
        -rm -f ./$(DEPDIR)/libcurlu_la-curl_fnmatch.Plo
+       -rm -f ./$(DEPDIR)/libcurlu_la-curl_get_line.Plo
        -rm -f ./$(DEPDIR)/libcurlu_la-curl_gethostname.Plo
        -rm -f ./$(DEPDIR)/libcurlu_la-curl_gssapi.Plo
        -rm -f ./$(DEPDIR)/libcurlu_la-curl_memrchr.Plo
@@ -3803,7 +3935,6 @@ distclean: distclean-am
        -rm -f ./$(DEPDIR)/libcurlu_la-openldap.Plo
        -rm -f ./$(DEPDIR)/libcurlu_la-parsedate.Plo
        -rm -f ./$(DEPDIR)/libcurlu_la-pingpong.Plo
-       -rm -f ./$(DEPDIR)/libcurlu_la-pipeline.Plo
        -rm -f ./$(DEPDIR)/libcurlu_la-pop3.Plo
        -rm -f ./$(DEPDIR)/libcurlu_la-progress.Plo
        -rm -f ./$(DEPDIR)/libcurlu_la-psl.Plo
@@ -3818,13 +3949,12 @@ distclean: distclean-am
        -rm -f ./$(DEPDIR)/libcurlu_la-slist.Plo
        -rm -f ./$(DEPDIR)/libcurlu_la-smb.Plo
        -rm -f ./$(DEPDIR)/libcurlu_la-smtp.Plo
+       -rm -f ./$(DEPDIR)/libcurlu_la-socketpair.Plo
        -rm -f ./$(DEPDIR)/libcurlu_la-socks.Plo
        -rm -f ./$(DEPDIR)/libcurlu_la-socks_gssapi.Plo
        -rm -f ./$(DEPDIR)/libcurlu_la-socks_sspi.Plo
        -rm -f ./$(DEPDIR)/libcurlu_la-speedcheck.Plo
        -rm -f ./$(DEPDIR)/libcurlu_la-splay.Plo
-       -rm -f ./$(DEPDIR)/libcurlu_la-ssh-libssh.Plo
-       -rm -f ./$(DEPDIR)/libcurlu_la-ssh.Plo
        -rm -f ./$(DEPDIR)/libcurlu_la-strcase.Plo
        -rm -f ./$(DEPDIR)/libcurlu_la-strdup.Plo
        -rm -f ./$(DEPDIR)/libcurlu_la-strerror.Plo
@@ -3865,9 +3995,15 @@ distclean: distclean-am
        -rm -f vauth/$(DEPDIR)/libcurlu_la-spnego_gssapi.Plo
        -rm -f vauth/$(DEPDIR)/libcurlu_la-spnego_sspi.Plo
        -rm -f vauth/$(DEPDIR)/libcurlu_la-vauth.Plo
-       -rm -f vtls/$(DEPDIR)/libcurl_la-axtls.Plo
-       -rm -f vtls/$(DEPDIR)/libcurl_la-cyassl.Plo
-       -rm -f vtls/$(DEPDIR)/libcurl_la-darwinssl.Plo
+       -rm -f vquic/$(DEPDIR)/libcurl_la-ngtcp2.Plo
+       -rm -f vquic/$(DEPDIR)/libcurl_la-quiche.Plo
+       -rm -f vquic/$(DEPDIR)/libcurlu_la-ngtcp2.Plo
+       -rm -f vquic/$(DEPDIR)/libcurlu_la-quiche.Plo
+       -rm -f vssh/$(DEPDIR)/libcurl_la-libssh.Plo
+       -rm -f vssh/$(DEPDIR)/libcurl_la-libssh2.Plo
+       -rm -f vssh/$(DEPDIR)/libcurlu_la-libssh.Plo
+       -rm -f vssh/$(DEPDIR)/libcurlu_la-libssh2.Plo
+       -rm -f vtls/$(DEPDIR)/libcurl_la-bearssl.Plo
        -rm -f vtls/$(DEPDIR)/libcurl_la-gskit.Plo
        -rm -f vtls/$(DEPDIR)/libcurl_la-gtls.Plo
        -rm -f vtls/$(DEPDIR)/libcurl_la-mbedtls.Plo
@@ -3878,10 +4014,10 @@ distclean: distclean-am
        -rm -f vtls/$(DEPDIR)/libcurl_la-polarssl_threadlock.Plo
        -rm -f vtls/$(DEPDIR)/libcurl_la-schannel.Plo
        -rm -f vtls/$(DEPDIR)/libcurl_la-schannel_verify.Plo
+       -rm -f vtls/$(DEPDIR)/libcurl_la-sectransp.Plo
        -rm -f vtls/$(DEPDIR)/libcurl_la-vtls.Plo
-       -rm -f vtls/$(DEPDIR)/libcurlu_la-axtls.Plo
-       -rm -f vtls/$(DEPDIR)/libcurlu_la-cyassl.Plo
-       -rm -f vtls/$(DEPDIR)/libcurlu_la-darwinssl.Plo
+       -rm -f vtls/$(DEPDIR)/libcurl_la-wolfssl.Plo
+       -rm -f vtls/$(DEPDIR)/libcurlu_la-bearssl.Plo
        -rm -f vtls/$(DEPDIR)/libcurlu_la-gskit.Plo
        -rm -f vtls/$(DEPDIR)/libcurlu_la-gtls.Plo
        -rm -f vtls/$(DEPDIR)/libcurlu_la-mbedtls.Plo
@@ -3892,7 +4028,9 @@ distclean: distclean-am
        -rm -f vtls/$(DEPDIR)/libcurlu_la-polarssl_threadlock.Plo
        -rm -f vtls/$(DEPDIR)/libcurlu_la-schannel.Plo
        -rm -f vtls/$(DEPDIR)/libcurlu_la-schannel_verify.Plo
+       -rm -f vtls/$(DEPDIR)/libcurlu_la-sectransp.Plo
        -rm -f vtls/$(DEPDIR)/libcurlu_la-vtls.Plo
+       -rm -f vtls/$(DEPDIR)/libcurlu_la-wolfssl.Plo
        -rm -f Makefile
 distclean-am: clean-am distclean-compile distclean-generic \
        distclean-hdr distclean-tags
@@ -3938,7 +4076,8 @@ install-ps-am:
 installcheck-am:
 
 maintainer-clean: maintainer-clean-am
-               -rm -f ./$(DEPDIR)/libcurl_la-amigaos.Plo
+               -rm -f ./$(DEPDIR)/libcurl_la-altsvc.Plo
+       -rm -f ./$(DEPDIR)/libcurl_la-amigaos.Plo
        -rm -f ./$(DEPDIR)/libcurl_la-asyn-ares.Plo
        -rm -f ./$(DEPDIR)/libcurl_la-asyn-thread.Plo
        -rm -f ./$(DEPDIR)/libcurl_la-base64.Plo
@@ -3951,6 +4090,7 @@ maintainer-clean: maintainer-clean-am
        -rm -f ./$(DEPDIR)/libcurl_la-curl_des.Plo
        -rm -f ./$(DEPDIR)/libcurl_la-curl_endian.Plo
        -rm -f ./$(DEPDIR)/libcurl_la-curl_fnmatch.Plo
+       -rm -f ./$(DEPDIR)/libcurl_la-curl_get_line.Plo
        -rm -f ./$(DEPDIR)/libcurl_la-curl_gethostname.Plo
        -rm -f ./$(DEPDIR)/libcurl_la-curl_gssapi.Plo
        -rm -f ./$(DEPDIR)/libcurl_la-curl_memrchr.Plo
@@ -4011,7 +4151,6 @@ maintainer-clean: maintainer-clean-am
        -rm -f ./$(DEPDIR)/libcurl_la-openldap.Plo
        -rm -f ./$(DEPDIR)/libcurl_la-parsedate.Plo
        -rm -f ./$(DEPDIR)/libcurl_la-pingpong.Plo
-       -rm -f ./$(DEPDIR)/libcurl_la-pipeline.Plo
        -rm -f ./$(DEPDIR)/libcurl_la-pop3.Plo
        -rm -f ./$(DEPDIR)/libcurl_la-progress.Plo
        -rm -f ./$(DEPDIR)/libcurl_la-psl.Plo
@@ -4026,13 +4165,12 @@ maintainer-clean: maintainer-clean-am
        -rm -f ./$(DEPDIR)/libcurl_la-slist.Plo
        -rm -f ./$(DEPDIR)/libcurl_la-smb.Plo
        -rm -f ./$(DEPDIR)/libcurl_la-smtp.Plo
+       -rm -f ./$(DEPDIR)/libcurl_la-socketpair.Plo
        -rm -f ./$(DEPDIR)/libcurl_la-socks.Plo
        -rm -f ./$(DEPDIR)/libcurl_la-socks_gssapi.Plo
        -rm -f ./$(DEPDIR)/libcurl_la-socks_sspi.Plo
        -rm -f ./$(DEPDIR)/libcurl_la-speedcheck.Plo
        -rm -f ./$(DEPDIR)/libcurl_la-splay.Plo
-       -rm -f ./$(DEPDIR)/libcurl_la-ssh-libssh.Plo
-       -rm -f ./$(DEPDIR)/libcurl_la-ssh.Plo
        -rm -f ./$(DEPDIR)/libcurl_la-strcase.Plo
        -rm -f ./$(DEPDIR)/libcurl_la-strdup.Plo
        -rm -f ./$(DEPDIR)/libcurl_la-strerror.Plo
@@ -4049,6 +4187,7 @@ maintainer-clean: maintainer-clean-am
        -rm -f ./$(DEPDIR)/libcurl_la-warnless.Plo
        -rm -f ./$(DEPDIR)/libcurl_la-wildcard.Plo
        -rm -f ./$(DEPDIR)/libcurl_la-x509asn1.Plo
+       -rm -f ./$(DEPDIR)/libcurlu_la-altsvc.Plo
        -rm -f ./$(DEPDIR)/libcurlu_la-amigaos.Plo
        -rm -f ./$(DEPDIR)/libcurlu_la-asyn-ares.Plo
        -rm -f ./$(DEPDIR)/libcurlu_la-asyn-thread.Plo
@@ -4062,6 +4201,7 @@ maintainer-clean: maintainer-clean-am
        -rm -f ./$(DEPDIR)/libcurlu_la-curl_des.Plo
        -rm -f ./$(DEPDIR)/libcurlu_la-curl_endian.Plo
        -rm -f ./$(DEPDIR)/libcurlu_la-curl_fnmatch.Plo
+       -rm -f ./$(DEPDIR)/libcurlu_la-curl_get_line.Plo
        -rm -f ./$(DEPDIR)/libcurlu_la-curl_gethostname.Plo
        -rm -f ./$(DEPDIR)/libcurlu_la-curl_gssapi.Plo
        -rm -f ./$(DEPDIR)/libcurlu_la-curl_memrchr.Plo
@@ -4122,7 +4262,6 @@ maintainer-clean: maintainer-clean-am
        -rm -f ./$(DEPDIR)/libcurlu_la-openldap.Plo
        -rm -f ./$(DEPDIR)/libcurlu_la-parsedate.Plo
        -rm -f ./$(DEPDIR)/libcurlu_la-pingpong.Plo
-       -rm -f ./$(DEPDIR)/libcurlu_la-pipeline.Plo
        -rm -f ./$(DEPDIR)/libcurlu_la-pop3.Plo
        -rm -f ./$(DEPDIR)/libcurlu_la-progress.Plo
        -rm -f ./$(DEPDIR)/libcurlu_la-psl.Plo
@@ -4137,13 +4276,12 @@ maintainer-clean: maintainer-clean-am
        -rm -f ./$(DEPDIR)/libcurlu_la-slist.Plo
        -rm -f ./$(DEPDIR)/libcurlu_la-smb.Plo
        -rm -f ./$(DEPDIR)/libcurlu_la-smtp.Plo
+       -rm -f ./$(DEPDIR)/libcurlu_la-socketpair.Plo
        -rm -f ./$(DEPDIR)/libcurlu_la-socks.Plo
        -rm -f ./$(DEPDIR)/libcurlu_la-socks_gssapi.Plo
        -rm -f ./$(DEPDIR)/libcurlu_la-socks_sspi.Plo
        -rm -f ./$(DEPDIR)/libcurlu_la-speedcheck.Plo
        -rm -f ./$(DEPDIR)/libcurlu_la-splay.Plo
-       -rm -f ./$(DEPDIR)/libcurlu_la-ssh-libssh.Plo
-       -rm -f ./$(DEPDIR)/libcurlu_la-ssh.Plo
        -rm -f ./$(DEPDIR)/libcurlu_la-strcase.Plo
        -rm -f ./$(DEPDIR)/libcurlu_la-strdup.Plo
        -rm -f ./$(DEPDIR)/libcurlu_la-strerror.Plo
@@ -4184,9 +4322,15 @@ maintainer-clean: maintainer-clean-am
        -rm -f vauth/$(DEPDIR)/libcurlu_la-spnego_gssapi.Plo
        -rm -f vauth/$(DEPDIR)/libcurlu_la-spnego_sspi.Plo
        -rm -f vauth/$(DEPDIR)/libcurlu_la-vauth.Plo
-       -rm -f vtls/$(DEPDIR)/libcurl_la-axtls.Plo
-       -rm -f vtls/$(DEPDIR)/libcurl_la-cyassl.Plo
-       -rm -f vtls/$(DEPDIR)/libcurl_la-darwinssl.Plo
+       -rm -f vquic/$(DEPDIR)/libcurl_la-ngtcp2.Plo
+       -rm -f vquic/$(DEPDIR)/libcurl_la-quiche.Plo
+       -rm -f vquic/$(DEPDIR)/libcurlu_la-ngtcp2.Plo
+       -rm -f vquic/$(DEPDIR)/libcurlu_la-quiche.Plo
+       -rm -f vssh/$(DEPDIR)/libcurl_la-libssh.Plo
+       -rm -f vssh/$(DEPDIR)/libcurl_la-libssh2.Plo
+       -rm -f vssh/$(DEPDIR)/libcurlu_la-libssh.Plo
+       -rm -f vssh/$(DEPDIR)/libcurlu_la-libssh2.Plo
+       -rm -f vtls/$(DEPDIR)/libcurl_la-bearssl.Plo
        -rm -f vtls/$(DEPDIR)/libcurl_la-gskit.Plo
        -rm -f vtls/$(DEPDIR)/libcurl_la-gtls.Plo
        -rm -f vtls/$(DEPDIR)/libcurl_la-mbedtls.Plo
@@ -4197,10 +4341,10 @@ maintainer-clean: maintainer-clean-am
        -rm -f vtls/$(DEPDIR)/libcurl_la-polarssl_threadlock.Plo
        -rm -f vtls/$(DEPDIR)/libcurl_la-schannel.Plo
        -rm -f vtls/$(DEPDIR)/libcurl_la-schannel_verify.Plo
+       -rm -f vtls/$(DEPDIR)/libcurl_la-sectransp.Plo
        -rm -f vtls/$(DEPDIR)/libcurl_la-vtls.Plo
-       -rm -f vtls/$(DEPDIR)/libcurlu_la-axtls.Plo
-       -rm -f vtls/$(DEPDIR)/libcurlu_la-cyassl.Plo
-       -rm -f vtls/$(DEPDIR)/libcurlu_la-darwinssl.Plo
+       -rm -f vtls/$(DEPDIR)/libcurl_la-wolfssl.Plo
+       -rm -f vtls/$(DEPDIR)/libcurlu_la-bearssl.Plo
        -rm -f vtls/$(DEPDIR)/libcurlu_la-gskit.Plo
        -rm -f vtls/$(DEPDIR)/libcurlu_la-gtls.Plo
        -rm -f vtls/$(DEPDIR)/libcurlu_la-mbedtls.Plo
@@ -4211,7 +4355,9 @@ maintainer-clean: maintainer-clean-am
        -rm -f vtls/$(DEPDIR)/libcurlu_la-polarssl_threadlock.Plo
        -rm -f vtls/$(DEPDIR)/libcurlu_la-schannel.Plo
        -rm -f vtls/$(DEPDIR)/libcurlu_la-schannel_verify.Plo
+       -rm -f vtls/$(DEPDIR)/libcurlu_la-sectransp.Plo
        -rm -f vtls/$(DEPDIR)/libcurlu_la-vtls.Plo
+       -rm -f vtls/$(DEPDIR)/libcurlu_la-wolfssl.Plo
        -rm -f Makefile
 maintainer-clean-am: distclean-am maintainer-clean-generic
 
@@ -4251,11 +4397,9 @@ uninstall-am: uninstall-libLTLIBRARIES
 .PRECIOUS: Makefile
 
 
-@CODE_COVERAGE_RULES@
-
 checksrc:
-       @PERL@ $(srcdir)/checksrc.pl -D$(srcdir) -W$(srcdir)/curl_config.h      \
-       $(srcdir)/*.[ch] $(srcdir)/vauth/*.[ch] $(srcdir)/vtls/*.[ch]
+       $(CHECKSRC)(@PERL@ $(srcdir)/checksrc.pl -D$(srcdir) -W$(srcdir)/curl_config.h \
+       $(srcdir)/*.[ch] $(srcdir)/vauth/*.[ch] $(srcdir)/vtls/*.[ch] $(srcdir)/vquic/*.[ch] $(srcdir)/vssh/*.[ch])
 
 # for debug builds, we scan the sources on all regular make invokes
 @CURLDEBUG_TRUE@all-local: checksrc
index 4aa0422..6c90c26 100644 (file)
@@ -5,7 +5,7 @@
 #                            | (__| |_| |  _ <| |___
 #                             \___|\___/|_| \_\_____|
 #
-# Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 #
 # This software is licensed as described in the file COPYING, which
 # you should have received as part of this distribution. The terms
@@ -28,14 +28,23 @@ LIB_VAUTH_CFILES = vauth/vauth.c vauth/cleartext.c vauth/cram.c         \
 LIB_VAUTH_HFILES = vauth/vauth.h vauth/digest.h vauth/ntlm.h
 
 LIB_VTLS_CFILES = vtls/openssl.c vtls/gtls.c vtls/vtls.c vtls/nss.c     \
-  vtls/polarssl.c vtls/polarssl_threadlock.c vtls/axtls.c               \
-  vtls/cyassl.c vtls/schannel.c vtls/schannel_verify.c                  \
-  vtls/darwinssl.c vtls/gskit.c vtls/mbedtls.c vtls/mesalink.c
+  vtls/polarssl.c vtls/polarssl_threadlock.c                            \
+  vtls/wolfssl.c vtls/schannel.c vtls/schannel_verify.c                 \
+  vtls/sectransp.c vtls/gskit.c vtls/mbedtls.c vtls/mesalink.c          \
+  vtls/bearssl.c
 
 LIB_VTLS_HFILES = vtls/openssl.h vtls/vtls.h vtls/gtls.h                \
-  vtls/nssg.h vtls/polarssl.h vtls/polarssl_threadlock.h vtls/axtls.h   \
-  vtls/cyassl.h vtls/schannel.h vtls/darwinssl.h vtls/gskit.h           \
-  vtls/mbedtls.h vtls/mesalink.h
+  vtls/nssg.h vtls/polarssl.h vtls/polarssl_threadlock.h                \
+  vtls/wolfssl.h vtls/schannel.h vtls/sectransp.h vtls/gskit.h          \
+  vtls/mbedtls.h vtls/mesalink.h vtls/bearssl.h
+
+LIB_VQUIC_CFILES = vquic/ngtcp2.c vquic/quiche.c
+
+LIB_VQUIC_HFILES = vquic/ngtcp2.h vquic/quiche.h
+
+LIB_VSSH_CFILES = vssh/libssh2.c vssh/libssh.c
+
+LIB_VSSH_HFILES = vssh/ssh.h
 
 LIB_CFILES = file.c timeval.c base64.c hostip.c progress.c formdata.c   \
   cookie.c http.c sendf.c ftp.c url.c dict.c if2ip.c speedcheck.c       \
@@ -46,16 +55,16 @@ LIB_CFILES = file.c timeval.c base64.c hostip.c progress.c formdata.c   \
   http_digest.c md4.c md5.c http_negotiate.c inet_pton.c strtoofft.c    \
   strerror.c amigaos.c hostasyn.c hostip4.c hostip6.c hostsyn.c         \
   inet_ntop.c parsedate.c select.c tftp.c splay.c strdup.c socks.c      \
-  ssh.c ssh-libssh.c curl_addrinfo.c socks_gssapi.c socks_sspi.c        \
+  curl_addrinfo.c socks_gssapi.c socks_sspi.c                           \
   curl_sspi.c slist.c nonblock.c curl_memrchr.c imap.c pop3.c smtp.c    \
   pingpong.c rtsp.c curl_threads.c warnless.c hmac.c curl_rtmp.c        \
   openldap.c curl_gethostname.c gopher.c idn_win32.c                    \
   http_proxy.c non-ascii.c asyn-ares.c asyn-thread.c curl_gssapi.c      \
   http_ntlm.c curl_ntlm_wb.c curl_ntlm_core.c curl_sasl.c rand.c        \
-  curl_multibyte.c hostcheck.c conncache.c pipeline.c dotdot.c          \
+  curl_multibyte.c hostcheck.c conncache.c dotdot.c                     \
   x509asn1.c http2.c smb.c curl_endian.c curl_des.c system_win32.c      \
   mime.c sha256.c setopt.c curl_path.c curl_ctype.c curl_range.c psl.c  \
-  doh.c urlapi.c
+  doh.c urlapi.c curl_get_line.c altsvc.c socketpair.c
 
 LIB_HFILES = arpa_telnet.h netrc.h file.h timeval.h hostip.h progress.h \
   formdata.h cookie.h http.h sendf.h ftp.h url.h dict.h if2ip.h         \
@@ -66,18 +75,21 @@ LIB_HFILES = arpa_telnet.h netrc.h file.h timeval.h hostip.h progress.h \
   http_negotiate.h inet_pton.h amigaos.h strtoofft.h strerror.h         \
   inet_ntop.h curlx.h curl_memory.h curl_setup.h transfer.h select.h    \
   easyif.h multiif.h parsedate.h tftp.h sockaddr.h splay.h strdup.h     \
-  socks.h ssh.h curl_base64.h curl_addrinfo.h curl_sspi.h      \
+  socks.h curl_base64.h curl_addrinfo.h curl_sspi.h                     \
   slist.h nonblock.h curl_memrchr.h imap.h pop3.h smtp.h pingpong.h     \
   rtsp.h curl_threads.h warnless.h curl_hmac.h curl_rtmp.h              \
   curl_gethostname.h gopher.h http_proxy.h non-ascii.h asyn.h           \
   http_ntlm.h curl_gssapi.h curl_ntlm_wb.h curl_ntlm_core.h             \
   curl_sasl.h curl_multibyte.h hostcheck.h conncache.h                  \
-  curl_setup_once.h multihandle.h setup-vms.h pipeline.h dotdot.h       \
+  curl_setup_once.h multihandle.h setup-vms.h dotdot.h                  \
   x509asn1.h http2.h sigpipe.h smb.h curl_endian.h curl_des.h           \
   curl_printf.h system_win32.h rand.h mime.h curl_sha256.h setopt.h     \
-  curl_path.h curl_ctype.h curl_range.h psl.h doh.h urlapi-int.h
+  curl_path.h curl_ctype.h curl_range.h psl.h doh.h urlapi-int.h        \
+  curl_get_line.h altsvc.h quic.h socketpair.h
 
 LIB_RCFILES = libcurl.rc
 
-CSOURCES = $(LIB_CFILES) $(LIB_VAUTH_CFILES) $(LIB_VTLS_CFILES)
-HHEADERS = $(LIB_HFILES) $(LIB_VAUTH_HFILES) $(LIB_VTLS_HFILES)
+CSOURCES = $(LIB_CFILES) $(LIB_VAUTH_CFILES) $(LIB_VTLS_CFILES) \
+  $(LIB_VQUIC_CFILES) $(LIB_VSSH_CFILES)
+HHEADERS = $(LIB_HFILES) $(LIB_VAUTH_HFILES) $(LIB_VTLS_HFILES) \
+  $(LIB_VQUIC_HFILES) $(LIB_VSSH_HFILES)
index ae88f4d..b6ef0a5 100644 (file)
@@ -5,7 +5,7 @@
 #                            | (__| |_| |  _ <| |___
 #                             \___|\___/|_| \_\_____|
 #
-# Copyright (C) 1999 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 1999 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 #
 # This software is licensed as described in the file COPYING, which
 # you should have received as part of this distribution. The terms
@@ -271,7 +271,7 @@ ifdef SSL
   endif
   INCLUDES += -I"$(OPENSSL_INCLUDE)"
   CFLAGS += -DUSE_OPENSSL -DHAVE_OPENSSL_ENGINE_H -DHAVE_OPENSSL_PKCS12_H \
-            -DHAVE_ENGINE_LOAD_BUILTIN_ENGINES -DOPENSSL_NO_KRB5
+            -DOPENSSL_NO_KRB5
   DLL_LIBS += -L"$(OPENSSL_LIBPATH)" $(OPENSSL_LIBS)
   ifdef SRP
     ifeq "$(wildcard $(OPENSSL_INCLUDE)/openssl/srp.h)" "$(OPENSSL_INCLUDE)/openssl/srp.h"
index fa6beec..a405346 100644 (file)
@@ -6,7 +6,7 @@
 #                             \___|\___/|_| \_\_____|
 #
 # Copyright (C) 2004 - 2015, Guenter Knauf
-# Copyright (C) 2001 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 2001 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
 #
 # This software is licensed as described in the file COPYING, which
 # you should have received as part of this distribution. The terms
@@ -49,11 +49,6 @@ ifndef LIBSSH2_PATH
 LIBSSH2_PATH = ../../libssh2-1.5.0
 endif
 
-# Edit the path below to point to the base of your axTLS package.
-ifndef AXTLS_PATH
-AXTLS_PATH = ../../axTLS-1.2.7
-endif
-
 # Edit the path below to point to the base of your libidn package.
 ifndef LIBIDN_PATH
 LIBIDN_PATH = ../../libidn-1.18
@@ -230,10 +225,6 @@ WITH_SSH2 = 1
 WITH_SSL = 1
 WITH_ZLIB = 1
 endif
-ifeq ($(findstring -axtls,$(CFG)),-axtls)
-WITH_AXTLS = 1
-WITH_SSL =
-else
 ifeq ($(findstring -ssl,$(CFG)),-ssl)
 WITH_SSL = 1
 ifeq ($(findstring -srp,$(CFG)),-srp)
@@ -242,7 +233,6 @@ WITH_SRP = 1
 endif
 endif
 endif
-endif
 ifeq ($(findstring -zlib,$(CFG)),-zlib)
 WITH_ZLIB = 1
 endif
@@ -280,16 +270,6 @@ ifdef WITH_SSL
   IMPORTS += GetProcessSwitchCount RunningProcess
   INSTDEP += ca-bundle.crt
 else
-ifdef WITH_AXTLS
-  INCLUDES += -I$(AXTLS_PATH)/inc
-  ifdef LINK_STATIC
-    LDLIBS += $(AXTLS_PATH)/lib/libaxtls.$(LIBEXT)
-  else
-    MODULES += libaxtls.nlm
-    IMPORTS += $(AXTLS_PATH)/lib/libaxtls.imp
-  endif
-  INSTDEP += ca-bundle.crt
-endif
 endif
 ifdef WITH_ZLIB
   INCLUDES += -I$(ZLIB_PATH)
@@ -652,7 +632,6 @@ ifdef WITH_ZLIB
        @echo $(DL)#define HAVE_LIBZ 1$(DL) >> $@
 endif
 ifdef WITH_SSL
-       @echo $(DL)#define USE_SSLEAY 1$(DL) >> $@
        @echo $(DL)#define USE_OPENSSL 1$(DL) >> $@
        @echo $(DL)#define HAVE_OPENSSL_X509_H 1$(DL) >> $@
        @echo $(DL)#define HAVE_OPENSSL_SSL_H 1$(DL) >> $@
@@ -661,20 +640,14 @@ ifdef WITH_SSL
        @echo $(DL)#define HAVE_OPENSSL_ERR_H 1$(DL) >> $@
        @echo $(DL)#define HAVE_OPENSSL_CRYPTO_H 1$(DL) >> $@
        @echo $(DL)#define HAVE_OPENSSL_ENGINE_H 1$(DL) >> $@
-       @echo $(DL)#define HAVE_LIBSSL 1$(DL) >> $@
-       @echo $(DL)#define HAVE_LIBCRYPTO 1$(DL) >> $@
        @echo $(DL)#define OPENSSL_NO_KRB5 1$(DL) >> $@
 ifdef WITH_SRP
-       @echo $(DL)#define HAVE_SSLEAY_SRP 1$(DL) >> $@
        @echo $(DL)#define USE_TLS_SRP 1$(DL) >> $@
 endif
 ifdef WITH_SPNEGO
        @echo $(DL)#define HAVE_SPNEGO 1$(DL) >> $@
 endif
 else
-ifdef WITH_AXTLS
-       @echo $(DL)#define USE_AXTLS 1$(DL) >> $@
-endif
 endif
 ifdef WITH_SSH2
        @echo $(DL)#define USE_LIBSSH2 1$(DL) >> $@
diff --git a/lib/altsvc.c b/lib/altsvc.c
new file mode 100644 (file)
index 0000000..bf869c3
--- /dev/null
@@ -0,0 +1,584 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+/*
+ * The Alt-Svc: header is defined in RFC 7838:
+ * https://tools.ietf.org/html/rfc7838
+ */
+#include "curl_setup.h"
+
+#if !defined(CURL_DISABLE_HTTP) && defined(USE_ALTSVC)
+#include <curl/curl.h>
+#include "urldata.h"
+#include "altsvc.h"
+#include "curl_get_line.h"
+#include "strcase.h"
+#include "parsedate.h"
+#include "sendf.h"
+#include "warnless.h"
+
+/* The last 3 #include files should be in this order */
+#include "curl_printf.h"
+#include "curl_memory.h"
+#include "memdebug.h"
+
+#define MAX_ALTSVC_LINE 4095
+#define MAX_ALTSVC_DATELENSTR "64"
+#define MAX_ALTSVC_DATELEN 64
+#define MAX_ALTSVC_HOSTLENSTR "512"
+#define MAX_ALTSVC_HOSTLEN 512
+#define MAX_ALTSVC_ALPNLENSTR "10"
+#define MAX_ALTSVC_ALPNLEN 10
+
+static enum alpnid alpn2alpnid(char *name)
+{
+  if(strcasecompare(name, "h1"))
+    return ALPN_h1;
+  if(strcasecompare(name, "h2"))
+    return ALPN_h2;
+#if (defined(USE_QUICHE) || defined(USE_NGTCP2)) && !defined(UNITTESTS)
+  if(strcasecompare(name, "h3-24"))
+    return ALPN_h3;
+#else
+  if(strcasecompare(name, "h3"))
+    return ALPN_h3;
+#endif
+  return ALPN_none; /* unknown, probably rubbish input */
+}
+
+/* Given the ALPN ID, return the name */
+const char *Curl_alpnid2str(enum alpnid id)
+{
+  switch(id) {
+  case ALPN_h1:
+    return "h1";
+  case ALPN_h2:
+    return "h2";
+  case ALPN_h3:
+#if (defined(USE_QUICHE) || defined(USE_NGTCP2)) && !defined(UNITTESTS)
+    return "h3-24";
+#else
+    return "h3";
+#endif
+  default:
+    return ""; /* bad */
+  }
+}
+
+
+static void altsvc_free(struct altsvc *as)
+{
+  free(as->src.host);
+  free(as->dst.host);
+  free(as);
+}
+
+static struct altsvc *altsvc_createid(const char *srchost,
+                                      const char *dsthost,
+                                      enum alpnid srcalpnid,
+                                      enum alpnid dstalpnid,
+                                      unsigned int srcport,
+                                      unsigned int dstport)
+{
+  struct altsvc *as = calloc(sizeof(struct altsvc), 1);
+  if(!as)
+    return NULL;
+
+  as->src.host = strdup(srchost);
+  if(!as->src.host)
+    goto error;
+  as->dst.host = strdup(dsthost);
+  if(!as->dst.host)
+    goto error;
+
+  as->src.alpnid = srcalpnid;
+  as->dst.alpnid = dstalpnid;
+  as->src.port = curlx_ultous(srcport);
+  as->dst.port = curlx_ultous(dstport);
+
+  return as;
+  error:
+  altsvc_free(as);
+  return NULL;
+}
+
+static struct altsvc *altsvc_create(char *srchost,
+                                    char *dsthost,
+                                    char *srcalpn,
+                                    char *dstalpn,
+                                    unsigned int srcport,
+                                    unsigned int dstport)
+{
+  enum alpnid dstalpnid = alpn2alpnid(dstalpn);
+  enum alpnid srcalpnid = alpn2alpnid(srcalpn);
+  if(!srcalpnid || !dstalpnid)
+    return NULL;
+  return altsvc_createid(srchost, dsthost, srcalpnid, dstalpnid,
+                         srcport, dstport);
+}
+
+/* only returns SERIOUS errors */
+static CURLcode altsvc_add(struct altsvcinfo *asi, char *line)
+{
+  /* Example line:
+     h2 example.com 443 h3 shiny.example.com 8443 "20191231 10:00:00" 1
+   */
+  char srchost[MAX_ALTSVC_HOSTLEN + 1];
+  char dsthost[MAX_ALTSVC_HOSTLEN + 1];
+  char srcalpn[MAX_ALTSVC_ALPNLEN + 1];
+  char dstalpn[MAX_ALTSVC_ALPNLEN + 1];
+  char date[MAX_ALTSVC_DATELEN + 1];
+  unsigned int srcport;
+  unsigned int dstport;
+  unsigned int prio;
+  unsigned int persist;
+  int rc;
+
+  rc = sscanf(line,
+              "%" MAX_ALTSVC_ALPNLENSTR "s %" MAX_ALTSVC_HOSTLENSTR "s %u "
+              "%" MAX_ALTSVC_ALPNLENSTR "s %" MAX_ALTSVC_HOSTLENSTR "s %u "
+              "\"%" MAX_ALTSVC_DATELENSTR "[^\"]\" %u %u",
+              srcalpn, srchost, &srcport,
+              dstalpn, dsthost, &dstport,
+              date, &persist, &prio);
+  if(9 == rc) {
+    struct altsvc *as;
+    time_t expires = Curl_getdate_capped(date);
+    as = altsvc_create(srchost, dsthost, srcalpn, dstalpn, srcport, dstport);
+    if(as) {
+      as->expires = expires;
+      as->prio = prio;
+      as->persist = persist ? 1 : 0;
+      Curl_llist_insert_next(&asi->list, asi->list.tail, as, &as->node);
+      asi->num++; /* one more entry */
+    }
+  }
+
+  return CURLE_OK;
+}
+
+/*
+ * Load alt-svc entries from the given file. The text based line-oriented file
+ * format is documented here:
+ * https://github.com/curl/curl/wiki/QUIC-implementation
+ *
+ * This function only returns error on major problems that prevents alt-svc
+ * handling to work completely. It will ignore individual syntactical errors
+ * etc.
+ */
+static CURLcode altsvc_load(struct altsvcinfo *asi, const char *file)
+{
+  CURLcode result = CURLE_OK;
+  char *line = NULL;
+  FILE *fp = fopen(file, FOPEN_READTEXT);
+  if(fp) {
+    line = malloc(MAX_ALTSVC_LINE);
+    if(!line)
+      goto fail;
+    while(Curl_get_line(line, MAX_ALTSVC_LINE, fp)) {
+      char *lineptr = line;
+      while(*lineptr && ISBLANK(*lineptr))
+        lineptr++;
+      if(*lineptr == '#')
+        /* skip commented lines */
+        continue;
+
+      altsvc_add(asi, lineptr);
+    }
+    free(line); /* free the line buffer */
+    fclose(fp);
+  }
+  return result;
+
+  fail:
+  free(line);
+  fclose(fp);
+  return CURLE_OUT_OF_MEMORY;
+}
+
+/*
+ * Write this single altsvc entry to a single output line
+ */
+
+static CURLcode altsvc_out(struct altsvc *as, FILE *fp)
+{
+  struct tm stamp;
+  CURLcode result = Curl_gmtime(as->expires, &stamp);
+  if(result)
+    return result;
+
+  fprintf(fp,
+          "%s %s %u "
+          "%s %s %u "
+          "\"%d%02d%02d "
+          "%02d:%02d:%02d\" "
+          "%u %d\n",
+          Curl_alpnid2str(as->src.alpnid), as->src.host, as->src.port,
+          Curl_alpnid2str(as->dst.alpnid), as->dst.host, as->dst.port,
+          stamp.tm_year + 1900, stamp.tm_mon + 1, stamp.tm_mday,
+          stamp.tm_hour, stamp.tm_min, stamp.tm_sec,
+          as->persist, as->prio);
+  return CURLE_OK;
+}
+
+/* ---- library-wide functions below ---- */
+
+/*
+ * Curl_altsvc_init() creates a new altsvc cache.
+ * It returns the new instance or NULL if something goes wrong.
+ */
+struct altsvcinfo *Curl_altsvc_init(void)
+{
+  struct altsvcinfo *asi = calloc(sizeof(struct altsvcinfo), 1);
+  if(!asi)
+    return NULL;
+  Curl_llist_init(&asi->list, NULL);
+
+  /* set default behavior */
+  asi->flags = CURLALTSVC_H1
+#ifdef USE_NGHTTP2
+    | CURLALTSVC_H2
+#endif
+#ifdef ENABLE_QUIC
+    | CURLALTSVC_H3
+#endif
+    ;
+  return asi;
+}
+
+/*
+ * Curl_altsvc_load() loads alt-svc from file.
+ */
+CURLcode Curl_altsvc_load(struct altsvcinfo *asi, const char *file)
+{
+  CURLcode result;
+  DEBUGASSERT(asi);
+  result = altsvc_load(asi, file);
+  return result;
+}
+
+/*
+ * Curl_altsvc_ctrl() passes on the external bitmask.
+ */
+CURLcode Curl_altsvc_ctrl(struct altsvcinfo *asi, const long ctrl)
+{
+  DEBUGASSERT(asi);
+  if(!ctrl)
+    /* unexpected */
+    return CURLE_BAD_FUNCTION_ARGUMENT;
+  asi->flags = ctrl;
+  return CURLE_OK;
+}
+
+/*
+ * Curl_altsvc_cleanup() frees an altsvc cache instance and all associated
+ * resources.
+ */
+void Curl_altsvc_cleanup(struct altsvcinfo *altsvc)
+{
+  struct curl_llist_element *e;
+  struct curl_llist_element *n;
+  if(altsvc) {
+    for(e = altsvc->list.head; e; e = n) {
+      struct altsvc *as = e->ptr;
+      n = e->next;
+      altsvc_free(as);
+    }
+    free(altsvc);
+  }
+}
+
+/*
+ * Curl_altsvc_save() writes the altsvc cache to a file.
+ */
+CURLcode Curl_altsvc_save(struct altsvcinfo *altsvc, const char *file)
+{
+  struct curl_llist_element *e;
+  struct curl_llist_element *n;
+  CURLcode result = CURLE_OK;
+  FILE *out;
+
+  if(!altsvc)
+    /* no cache activated */
+    return CURLE_OK;
+
+  if((altsvc->flags & CURLALTSVC_READONLYFILE) || !file || !file[0])
+    /* marked as read-only, no file or zero length file name */
+    return CURLE_OK;
+  out = fopen(file, FOPEN_WRITETEXT);
+  if(!out)
+    return CURLE_WRITE_ERROR;
+  fputs("# Your alt-svc cache. https://curl.haxx.se/docs/alt-svc.html\n"
+        "# This file was generated by libcurl! Edit at your own risk.\n",
+        out);
+  for(e = altsvc->list.head; e; e = n) {
+    struct altsvc *as = e->ptr;
+    n = e->next;
+    result = altsvc_out(as, out);
+    if(result)
+      break;
+  }
+  fclose(out);
+  return result;
+}
+
+static CURLcode getalnum(const char **ptr, char *alpnbuf, size_t buflen)
+{
+  size_t len;
+  const char *protop;
+  const char *p = *ptr;
+  while(*p && ISBLANK(*p))
+    p++;
+  protop = p;
+  while(*p && !ISBLANK(*p) && (*p != ';') && (*p != '='))
+    p++;
+  len = p - protop;
+
+  if(!len || (len >= buflen))
+    return CURLE_BAD_FUNCTION_ARGUMENT;
+  memcpy(alpnbuf, protop, len);
+  alpnbuf[len] = 0;
+  *ptr = p;
+  return CURLE_OK;
+}
+
+/* altsvc_flush() removes all alternatives for this source origin from the
+   list */
+static void altsvc_flush(struct altsvcinfo *asi, enum alpnid srcalpnid,
+                         const char *srchost, unsigned short srcport)
+{
+  struct curl_llist_element *e;
+  struct curl_llist_element *n;
+  for(e = asi->list.head; e; e = n) {
+    struct altsvc *as = e->ptr;
+    n = e->next;
+    if((srcalpnid == as->src.alpnid) &&
+       (srcport == as->src.port) &&
+       strcasecompare(srchost, as->src.host)) {
+      Curl_llist_remove(&asi->list, e, NULL);
+      altsvc_free(as);
+      asi->num--;
+    }
+  }
+}
+
+#ifdef DEBUGBUILD
+/* to play well with debug builds, we can *set* a fixed time this will
+   return */
+static time_t debugtime(void *unused)
+{
+  char *timestr = getenv("CURL_TIME");
+  (void)unused;
+  if(timestr) {
+    unsigned long val = strtol(timestr, NULL, 10);
+    return (time_t)val;
+  }
+  return time(NULL);
+}
+#define time(x) debugtime(x)
+#endif
+
+/*
+ * Curl_altsvc_parse() takes an incoming alt-svc response header and stores
+ * the data correctly in the cache.
+ *
+ * 'value' points to the header *value*. That's contents to the right of the
+ * header name.
+ */
+CURLcode Curl_altsvc_parse(struct Curl_easy *data,
+                           struct altsvcinfo *asi, const char *value,
+                           enum alpnid srcalpnid, const char *srchost,
+                           unsigned short srcport)
+{
+  const char *p = value;
+  size_t len;
+  enum alpnid dstalpnid = srcalpnid; /* the same by default */
+  char namebuf[MAX_ALTSVC_HOSTLEN] = "";
+  char alpnbuf[MAX_ALTSVC_ALPNLEN] = "";
+  struct altsvc *as;
+  unsigned short dstport = srcport; /* the same by default */
+  const char *semip;
+  time_t maxage = 24 * 3600; /* default is 24 hours */
+  bool persist = FALSE;
+  CURLcode result = getalnum(&p, alpnbuf, sizeof(alpnbuf));
+  if(result)
+    return result;
+
+  DEBUGASSERT(asi);
+
+  /* Flush all cached alternatives for this source origin, if any */
+  altsvc_flush(asi, srcalpnid, srchost, srcport);
+
+  /* "clear" is a magic keyword */
+  if(strcasecompare(alpnbuf, "clear")) {
+    return CURLE_OK;
+  }
+
+  /* The 'ma' and 'persist' flags are annoyingly meant for all alternatives
+     but are set after the list on the line. Scan for the semicolons and get
+     those fields first! */
+  semip = p;
+  do {
+    semip = strchr(semip, ';');
+    if(semip) {
+      char option[32];
+      unsigned long num;
+      char *end_ptr;
+      bool quoted = FALSE;
+      semip++; /* pass the semicolon */
+      result = getalnum(&semip, option, sizeof(option));
+      if(result)
+        break;
+      while(*semip && ISBLANK(*semip))
+        semip++;
+      if(*semip != '=')
+        continue;
+      semip++;
+      while(*semip && ISBLANK(*semip))
+        semip++;
+      if(*semip == '\"') {
+        /* quoted value */
+        semip++;
+        quoted = TRUE;
+      }
+      num = strtoul(semip, &end_ptr, 10);
+      if((end_ptr != semip) && num && (num < ULONG_MAX)) {
+        if(strcasecompare("ma", option))
+          maxage = num;
+        else if(strcasecompare("persist", option) && (num == 1))
+          persist = TRUE;
+        if(quoted && (*end_ptr == '\"'))
+          end_ptr++;
+      }
+      semip = end_ptr;
+    }
+  } while(semip);
+
+  do {
+    if(*p == '=') {
+      /* [protocol]="[host][:port]" */
+      dstalpnid = alpn2alpnid(alpnbuf);
+      if(!dstalpnid) {
+        infof(data, "Unknown alt-svc protocol \"%s\", ignoring...\n", alpnbuf);
+        return CURLE_OK;
+      }
+      p++;
+      if(*p == '\"') {
+        const char *dsthost;
+        p++;
+        if(*p != ':') {
+          /* host name starts here */
+          const char *hostp = p;
+          while(*p && (ISALNUM(*p) || (*p == '.') || (*p == '-')))
+            p++;
+          len = p - hostp;
+          if(!len || (len >= MAX_ALTSVC_HOSTLEN))
+            return CURLE_BAD_FUNCTION_ARGUMENT;
+          memcpy(namebuf, hostp, len);
+          namebuf[len] = 0;
+          dsthost = namebuf;
+        }
+        else {
+          /* no destination name, use source host */
+          dsthost = srchost;
+        }
+        if(*p == ':') {
+          /* a port number */
+          char *end_ptr;
+          unsigned long port = strtoul(++p, &end_ptr, 10);
+          if(port > USHRT_MAX || end_ptr == p || *end_ptr != '\"') {
+            infof(data, "Unknown alt-svc port number, ignoring...\n");
+            return CURLE_OK;
+          }
+          p = end_ptr;
+          dstport = curlx_ultous(port);
+        }
+        if(*p++ != '\"')
+          return CURLE_BAD_FUNCTION_ARGUMENT;
+        as = altsvc_createid(srchost, dsthost,
+                             srcalpnid, dstalpnid,
+                             srcport, dstport);
+        if(as) {
+          /* The expires time also needs to take the Age: value (if any) into
+             account. [See RFC 7838 section 3.1] */
+          as->expires = maxage + time(NULL);
+          as->persist = persist;
+          Curl_llist_insert_next(&asi->list, asi->list.tail, as, &as->node);
+          asi->num++; /* one more entry */
+          infof(data, "Added alt-svc: %s:%d over %s\n", dsthost, dstport,
+                Curl_alpnid2str(dstalpnid));
+        }
+      }
+      /* after the double quote there can be a comma if there's another
+         string or a semicolon if no more */
+      if(*p == ',') {
+        /* comma means another alternative is presented */
+        p++;
+        result = getalnum(&p, alpnbuf, sizeof(alpnbuf));
+        if(result)
+          /* failed to parse, but since we already did at least one host we
+             return OK */
+          return CURLE_OK;
+      }
+    }
+  } while(*p && (*p != ';') && (*p != '\n') && (*p != '\r'));
+
+  return CURLE_OK;
+}
+
+/*
+ * Return TRUE on a match
+ */
+bool Curl_altsvc_lookup(struct altsvcinfo *asi,
+                        enum alpnid srcalpnid, const char *srchost,
+                        int srcport,
+                        struct altsvc **dstentry,
+                        const int versions) /* one or more bits */
+{
+  struct curl_llist_element *e;
+  struct curl_llist_element *n;
+  time_t now = time(NULL);
+  DEBUGASSERT(asi);
+  DEBUGASSERT(srchost);
+  DEBUGASSERT(dstentry);
+
+  for(e = asi->list.head; e; e = n) {
+    struct altsvc *as = e->ptr;
+    n = e->next;
+    if(as->expires < now) {
+      /* an expired entry, remove */
+      Curl_llist_remove(&asi->list, e, NULL);
+      altsvc_free(as);
+      continue;
+    }
+    if((as->src.alpnid == srcalpnid) &&
+       strcasecompare(as->src.host, srchost) &&
+       (as->src.port == srcport) &&
+       (versions & as->dst.alpnid)) {
+      /* match */
+      *dstentry = as;
+      return TRUE;
+    }
+  }
+  return FALSE;
+}
+
+#endif /* CURL_DISABLE_HTTP || USE_ALTSVC */
diff --git a/lib/altsvc.h b/lib/altsvc.h
new file mode 100644 (file)
index 0000000..99d0499
--- /dev/null
@@ -0,0 +1,78 @@
+#ifndef HEADER_CURL_ALTSVC_H
+#define HEADER_CURL_ALTSVC_H
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+#include "curl_setup.h"
+
+#if !defined(CURL_DISABLE_HTTP) && defined(USE_ALTSVC)
+#include <curl/curl.h>
+#include "llist.h"
+
+enum alpnid {
+  ALPN_none = 0,
+  ALPN_h1 = CURLALTSVC_H1,
+  ALPN_h2 = CURLALTSVC_H2,
+  ALPN_h3 = CURLALTSVC_H3
+};
+
+struct althost {
+  char *host;
+  unsigned short port;
+  enum alpnid alpnid;
+};
+
+struct altsvc {
+  struct althost src;
+  struct althost dst;
+  time_t expires;
+  bool persist;
+  int prio;
+  struct curl_llist_element node;
+};
+
+struct altsvcinfo {
+  char *filename;
+  struct curl_llist list; /* list of entries */
+  size_t num; /* number of alt-svc entries */
+  long flags; /* the publicly set bitmask */
+};
+
+const char *Curl_alpnid2str(enum alpnid id);
+struct altsvcinfo *Curl_altsvc_init(void);
+CURLcode Curl_altsvc_load(struct altsvcinfo *asi, const char *file);
+CURLcode Curl_altsvc_save(struct altsvcinfo *asi, const char *file);
+CURLcode Curl_altsvc_ctrl(struct altsvcinfo *asi, const long ctrl);
+void Curl_altsvc_cleanup(struct altsvcinfo *altsvc);
+CURLcode Curl_altsvc_parse(struct Curl_easy *data,
+                           struct altsvcinfo *altsvc, const char *value,
+                           enum alpnid srcalpn, const char *srchost,
+                           unsigned short srcport);
+bool Curl_altsvc_lookup(struct altsvcinfo *asi,
+                        enum alpnid srcalpnid, const char *srchost,
+                        int srcport,
+                        struct altsvc **dstentry,
+                        int versions); /* one or more CURLALTSVC_H* bits */
+#else
+/* disabled */
+#define Curl_altsvc_save(a,b)
+#endif /* CURL_DISABLE_HTTP || USE_ALTSVC */
+#endif /* HEADER_CURL_ALTSVC_H */
index 4f55b30..cf44bdc 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
 
 #include "curl_setup.h"
 
-#if defined(__AMIGA__) && !defined(__ixemul__)
-
-#include <amitcp/socketbasetags.h>
+#ifdef __AMIGA__
+#  include "amigaos.h"
+#  if defined(HAVE_PROTO_BSDSOCKET_H) && !defined(USE_AMISSL)
+#    include <amitcp/socketbasetags.h>
+#  endif
+#  ifdef __libnix__
+#    include <stabs.h>
+#  endif
+#endif
 
-#include "amigaos.h"
+/* The last #include files should be: */
+#include "curl_memory.h"
+#include "memdebug.h"
 
+#ifdef __AMIGA__
+#if defined(HAVE_PROTO_BSDSOCKET_H) && !defined(USE_AMISSL)
 struct Library *SocketBase = NULL;
 extern int errno, h_errno;
 
 #ifdef __libnix__
-#include <stabs.h>
 void __request(const char *msg);
 #else
 # define __request(msg)       Printf(msg "\n\a")
@@ -74,4 +83,13 @@ bool Curl_amiga_init()
 ADD2EXIT(Curl_amiga_cleanup, -50);
 #endif
 
-#endif /* __AMIGA__ && ! __ixemul__ */
+#endif /* HAVE_PROTO_BSDSOCKET_H */
+
+#ifdef USE_AMISSL
+void Curl_amiga_X509_free(X509 *a)
+{
+  X509_free(a);
+}
+#endif /* USE_AMISSL */
+#endif /* __AMIGA__ */
+
index 7c0926c..c776c9c 100644 (file)
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -23,7 +23,7 @@
  ***************************************************************************/
 #include "curl_setup.h"
 
-#if defined(__AMIGA__) && !defined(__ixemul__)
+#if defined(__AMIGA__) && defined(HAVE_BSDSOCKET_H) && !defined(USE_AMISSL)
 
 bool Curl_amiga_init();
 void Curl_amiga_cleanup();
@@ -35,4 +35,10 @@ void Curl_amiga_cleanup();
 
 #endif
 
+#ifdef USE_AMISSL
+#include <openssl/x509v3.h>
+void Curl_amiga_X509_free(X509 *a);
+#endif /* USE_AMISSL */
+
 #endif /* HEADER_CURL_AMIGAOS_H */
+
index 5cfb260..835cfa4 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -68,7 +68,7 @@
 #include "progress.h"
 
 #  if defined(CURL_STATICLIB) && !defined(CARES_STATICLIB) && \
-     (defined(WIN32) || defined(_WIN32) || defined(__SYMBIAN32__))
+     (defined(WIN32) || defined(__SYMBIAN32__))
 #    define CARES_STATICLIB
 #  endif
 #  include <ares.h>
@@ -89,8 +89,20 @@ struct ResolverResults {
   int num_pending; /* number of ares_gethostbyname() requests */
   Curl_addrinfo *temp_ai; /* intermediary result while fetching c-ares parts */
   int last_status;
+  struct curltime happy_eyeballs_dns_time; /* when this timer started, or 0 */
 };
 
+/* How long we are willing to wait for additional parallel responses after
+   obtaining a "definitive" one.
+
+   This is intended to equal the c-ares default timeout.  cURL always uses that
+   default value.  Unfortunately, c-ares doesn't expose its default timeout in
+   its API, but it is officially documented as 5 seconds.
+
+   See query_completed_cb() for an explanation of how this is used.
+ */
+#define HAPPY_EYEBALLS_DNS_TIMEOUT 5000
+
 /*
  * Curl_resolver_global_init() - the generic low-level asynchronous name
  * resolve API.  Called from curl_global_init() to initialize global resolver
@@ -119,6 +131,17 @@ void Curl_resolver_global_cleanup(void)
 #endif
 }
 
+
+static void Curl_ares_sock_state_cb(void *data, ares_socket_t socket_fd,
+                                    int readable, int writable)
+{
+  struct Curl_easy *easy = data;
+  if(!readable && !writable) {
+    DEBUGASSERT(easy);
+    Curl_multi_closed(easy, socket_fd);
+  }
+}
+
 /*
  * Curl_resolver_init()
  *
@@ -126,9 +149,14 @@ void Curl_resolver_global_cleanup(void)
  * URL-state specific environment ('resolver' member of the UrlState
  * structure).  Fills the passed pointer by the initialized ares_channel.
  */
-CURLcode Curl_resolver_init(void **resolver)
+CURLcode Curl_resolver_init(struct Curl_easy *easy, void **resolver)
 {
-  int status = ares_init((ares_channel*)resolver);
+  int status;
+  struct ares_options options;
+  int optmask = ARES_OPT_SOCK_STATE_CB;
+  options.sock_state_cb = Curl_ares_sock_state_cb;
+  options.sock_state_cb_data = easy;
+  status = ares_init_options((ares_channel*)resolver, &options, optmask);
   if(status != ARES_SUCCESS) {
     if(status == ARES_ENOMEM)
       return CURLE_OUT_OF_MEMORY;
@@ -159,12 +187,15 @@ void Curl_resolver_cleanup(void *resolver)
  * environment ('resolver' member of the UrlState structure).  Duplicates the
  * 'from' ares channel and passes the resulting channel to the 'to' pointer.
  */
-int Curl_resolver_duphandle(void **to, void *from)
+CURLcode Curl_resolver_duphandle(struct Curl_easy *easy, void **to, void *from)
 {
-  /* Clone the ares channel for the new handle */
-  if(ARES_SUCCESS != ares_dup((ares_channel*)to, (ares_channel)from))
-    return CURLE_FAILED_INIT;
-  return CURLE_OK;
+  (void)from;
+  /*
+   * it would be better to call ares_dup instead, but right now
+   * it is not possible to set 'sock_state_cb_data' outside of
+   * ares_init_options
+   */
+  return Curl_resolver_init(easy, to);
 }
 
 static void destroy_async_data(struct Curl_async *async);
@@ -180,6 +211,17 @@ void Curl_resolver_cancel(struct connectdata *conn)
 }
 
 /*
+ * We're equivalent to Curl_resolver_cancel() for the c-ares resolver.  We
+ * never block.
+ */
+void Curl_resolver_kill(struct connectdata *conn)
+{
+  /* We don't need to check the resolver state because we can be called safely
+     at any time and we always do the same thing. */
+  Curl_resolver_cancel(conn);
+}
+
+/*
  * destroy_async_data() cleans up async resolver data.
  */
 static void destroy_async_data(struct Curl_async *async)
@@ -211,16 +253,14 @@ static void destroy_async_data(struct Curl_async *async)
  */
 
 int Curl_resolver_getsock(struct connectdata *conn,
-                          curl_socket_t *socks,
-                          int numsocks)
-
+                          curl_socket_t *socks)
 {
   struct timeval maxtime;
   struct timeval timebuf;
   struct timeval *timeout;
   long milli;
   int max = ares_getsock((ares_channel)conn->data->state.resolver,
-                         (ares_socket_t *)socks, numsocks);
+                         (ares_socket_t *)socks, MAX_SOCKSPEREASYHANDLE);
 
   maxtime.tv_sec = CURL_TIMEOUT_RESOLVE;
   maxtime.tv_usec = 0;
@@ -289,9 +329,9 @@ static int waitperform(struct connectdata *conn, int timeout_ms)
     /* move through the descriptors and ask for processing on them */
     for(i = 0; i < num; i++)
       ares_process_fd((ares_channel)data->state.resolver,
-                      pfd[i].revents & (POLLRDNORM|POLLIN)?
+                      (pfd[i].revents & (POLLRDNORM|POLLIN))?
                       pfd[i].fd:ARES_SOCKET_BAD,
-                      pfd[i].revents & (POLLWRNORM|POLLOUT)?
+                      (pfd[i].revents & (POLLWRNORM|POLLOUT))?
                       pfd[i].fd:ARES_SOCKET_BAD);
   }
   return nfds;
@@ -317,6 +357,29 @@ CURLcode Curl_resolver_is_resolved(struct connectdata *conn,
 
   waitperform(conn, 0);
 
+  /* Now that we've checked for any last minute results above, see if there are
+     any responses still pending when the EXPIRE_HAPPY_EYEBALLS_DNS timer
+     expires. */
+  if(res
+     && res->num_pending
+     /* This is only set to non-zero if the timer was started. */
+     && (res->happy_eyeballs_dns_time.tv_sec
+         || res->happy_eyeballs_dns_time.tv_usec)
+     && (Curl_timediff(Curl_now(), res->happy_eyeballs_dns_time)
+         >= HAPPY_EYEBALLS_DNS_TIMEOUT)) {
+    /* Remember that the EXPIRE_HAPPY_EYEBALLS_DNS timer is no longer
+       running. */
+    memset(
+      &res->happy_eyeballs_dns_time, 0, sizeof(res->happy_eyeballs_dns_time));
+
+    /* Cancel the raw c-ares request, which will fire query_completed_cb() with
+       ARES_ECANCELLED synchronously for all pending responses.  This will
+       leave us with res->num_pending == 0, which is perfect for the next
+       block. */
+    ares_cancel((ares_channel)data->state.resolver);
+    DEBUGASSERT(res->num_pending == 0);
+  }
+
   if(res && !res->num_pending) {
     if(dns) {
       (void)Curl_addrinfo_callback(conn, res->last_status, res->temp_ai);
@@ -342,13 +405,13 @@ CURLcode Curl_resolver_is_resolved(struct connectdata *conn,
 /*
  * Curl_resolver_wait_resolv()
  *
- * waits for a resolve to finish. This function should be avoided since using
+ * Waits for a resolve to finish. This function should be avoided since using
  * this risk getting the multi interface to "hang".
  *
  * If 'entry' is non-NULL, make it point to the resolved dns entry
  *
- * Returns CURLE_COULDNT_RESOLVE_HOST if the host was not resolved, and
- * CURLE_OPERATION_TIMEDOUT if a time-out occurred.
+ * Returns CURLE_COULDNT_RESOLVE_HOST if the host was not resolved,
+ * CURLE_OPERATION_TIMEDOUT if a time-out occurred, or other errors.
  */
 CURLcode Curl_resolver_wait_resolv(struct connectdata *conn,
                                    struct Curl_dns_entry **entry)
@@ -425,9 +488,7 @@ CURLcode Curl_resolver_wait_resolv(struct connectdata *conn,
 
   if(result)
     /* close the connection, since we can't return failure here without
-       cleaning up this connection properly.
-       TODO: remove this action from here, it is not a name resolver decision.
-    */
+       cleaning up this connection properly. */
     connclose(conn, "c-ares resolve failed");
 
   return result;
@@ -487,6 +548,66 @@ static void query_completed_cb(void *arg,  /* (struct connectdata *) */
     /* A successful result overwrites any previous error */
     if(res->last_status != ARES_SUCCESS)
       res->last_status = status;
+
+    /* If there are responses still pending, we presume they must be the
+       complementary IPv4 or IPv6 lookups that we started in parallel in
+       Curl_resolver_getaddrinfo() (for Happy Eyeballs).  If we've got a
+       "definitive" response from one of a set of parallel queries, we need to
+       think about how long we're willing to wait for more responses. */
+    if(res->num_pending
+       /* Only these c-ares status values count as "definitive" for these
+          purposes.  For example, ARES_ENODATA is what we expect when there is
+          no IPv6 entry for a domain name, and that's not a reason to get more
+          aggressive in our timeouts for the other response.  Other errors are
+          either a result of bad input (which should affect all parallel
+          requests), local or network conditions, non-definitive server
+          responses, or us cancelling the request. */
+       && (status == ARES_SUCCESS || status == ARES_ENOTFOUND)) {
+      /* Right now, there can only be up to two parallel queries, so don't
+         bother handling any other cases. */
+      DEBUGASSERT(res->num_pending == 1);
+
+      /* It's possible that one of these parallel queries could succeed
+         quickly, but the other could always fail or timeout (when we're
+         talking to a pool of DNS servers that can only successfully resolve
+         IPv4 address, for example).
+
+         It's also possible that the other request could always just take
+         longer because it needs more time or only the second DNS server can
+         fulfill it successfully.  But, to align with the philosophy of Happy
+         Eyeballs, we don't want to wait _too_ long or users will think
+         requests are slow when IPv6 lookups don't actually work (but IPv4 ones
+         do).
+
+         So, now that we have a usable answer (some IPv4 addresses, some IPv6
+         addresses, or "no such domain"), we start a timeout for the remaining
+         pending responses.  Even though it is typical that this resolved
+         request came back quickly, that needn't be the case.  It might be that
+         this completing request didn't get a result from the first DNS server
+         or even the first round of the whole DNS server pool.  So it could
+         already be quite some time after we issued the DNS queries in the
+         first place.  Without modifying c-ares, we can't know exactly where in
+         its retry cycle we are.  We could guess based on how much time has
+         gone by, but it doesn't really matter.  Happy Eyeballs tells us that,
+         given usable information in hand, we simply don't want to wait "too
+         much longer" after we get a result.
+
+         We simply wait an additional amount of time equal to the default
+         c-ares query timeout.  That is enough time for a typical parallel
+         response to arrive without being "too long".  Even on a network
+         where one of the two types of queries is failing or timing out
+         constantly, this will usually mean we wait a total of the default
+         c-ares timeout (5 seconds) plus the round trip time for the successful
+         request, which seems bearable.  The downside is that c-ares might race
+         with us to issue one more retry just before we give up, but it seems
+         better to "waste" that request instead of trying to guess the perfect
+         timeout to prevent it.  After all, we don't even know where in the
+         c-ares retry cycle each request is.
+      */
+      res->happy_eyeballs_dns_time = Curl_now();
+      Curl_expire(
+        conn->data, HAPPY_EYEBALLS_DNS_TIMEOUT, EXPIRE_HAPPY_EYEBALLS_DNS);
+    }
   }
 }
 
@@ -611,7 +732,11 @@ CURLcode Curl_set_dns_servers(struct Curl_easy *data,
     return CURLE_OK;
 
 #if (ARES_VERSION >= 0x010704)
+#if (ARES_VERSION >= 0x010b00)
+  ares_result = ares_set_servers_ports_csv(data->state.resolver, servers);
+#else
   ares_result = ares_set_servers_csv(data->state.resolver, servers);
+#endif
   switch(ares_result) {
   case ARES_SUCCESS:
     result = CURLE_OK;
index 2a59294..b08497a 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -21,6 +21,7 @@
  ***************************************************************************/
 
 #include "curl_setup.h"
+#include "socketpair.h"
 
 /***********************************************************************
  * Only for threaded name resolves builds
@@ -74,6 +75,7 @@
 #include "inet_ntop.h"
 #include "curl_threads.h"
 #include "connect.h"
+#include "socketpair.h"
 /* The last 3 #include files should be in this order */
 #include "curl_printf.h"
 #include "curl_memory.h"
@@ -108,8 +110,9 @@ void Curl_resolver_global_cleanup(void)
  * URL-state specific environment ('resolver' member of the UrlState
  * structure).
  */
-CURLcode Curl_resolver_init(void **resolver)
+CURLcode Curl_resolver_init(struct Curl_easy *easy, void **resolver)
 {
+  (void)easy;
   *resolver = calloc(1, sizeof(struct resdata));
   if(!*resolver)
     return CURLE_OUT_OF_MEMORY;
@@ -132,10 +135,10 @@ void Curl_resolver_cleanup(void *resolver)
  * Called from curl_easy_duphandle() to duplicate resolver URL state-specific
  * environment ('resolver' member of the UrlState structure).
  */
-int Curl_resolver_duphandle(void **to, void *from)
+CURLcode Curl_resolver_duphandle(struct Curl_easy *easy, void **to, void *from)
 {
   (void)from;
-  return Curl_resolver_init(to);
+  return Curl_resolver_init(easy, to);
 }
 
 static void destroy_async_data(struct Curl_async *);
@@ -162,6 +165,10 @@ struct thread_sync_data {
   char *hostname;        /* hostname to resolve, Curl_async.hostname
                             duplicate */
   int port;
+#ifdef USE_SOCKETPAIR
+  struct connectdata *conn;
+  curl_socket_t sock_pair[2]; /* socket pair */
+#endif
   int sock_error;
   Curl_addrinfo *res;
 #ifdef HAVE_GETADDRINFO
@@ -196,6 +203,15 @@ void destroy_thread_sync_data(struct thread_sync_data * tsd)
   if(tsd->res)
     Curl_freeaddrinfo(tsd->res);
 
+#ifdef USE_SOCKETPAIR
+  /*
+   * close one end of the socket pair (may be done in resolver thread);
+   * the other end (for reading) is always closed in the parent thread.
+   */
+  if(tsd->sock_pair[1] != CURL_SOCKET_BAD) {
+    sclose(tsd->sock_pair[1]);
+  }
+#endif
   memset(tsd, 0, sizeof(*tsd));
 }
 
@@ -229,6 +245,14 @@ int init_thread_sync_data(struct thread_data * td,
 
   Curl_mutex_init(tsd->mtx);
 
+#ifdef USE_SOCKETPAIR
+  /* create socket pair, avoid AF_LOCAL since it doesn't build on Solaris */
+  if(Curl_socketpair(AF_UNIX, SOCK_STREAM, 0, &tsd->sock_pair[0]) < 0) {
+    tsd->sock_pair[0] = CURL_SOCKET_BAD;
+    tsd->sock_pair[1] = CURL_SOCKET_BAD;
+    goto err_exit;
+  }
+#endif
   tsd->sock_error = CURL_ASYNC_SUCCESS;
 
   /* Copying hostname string because original can be destroyed by parent
@@ -275,8 +299,11 @@ static unsigned int CURL_STDCALL getaddrinfo_thread(void *arg)
   struct thread_data *td = tsd->td;
   char service[12];
   int rc;
+#ifdef USE_SOCKETPAIR
+  char buf[1];
+#endif
 
-  snprintf(service, sizeof(service), "%d", tsd->port);
+  msnprintf(service, sizeof(service), "%d", tsd->port);
 
   rc = Curl_getaddrinfo_ex(tsd->hostname, service, &tsd->hints, &tsd->res);
 
@@ -297,6 +324,16 @@ static unsigned int CURL_STDCALL getaddrinfo_thread(void *arg)
     free(td);
   }
   else {
+#ifdef USE_SOCKETPAIR
+    if(tsd->sock_pair[1] != CURL_SOCKET_BAD) {
+      /* DNS has been resolved, signal client task */
+      buf[0] = 1;
+      if(swrite(tsd->sock_pair[1],  buf, sizeof(buf)) < 0) {
+        /* update sock_erro to errno */
+        tsd->sock_error = SOCKERRNO;
+      }
+    }
+#endif
     tsd->done = 1;
     Curl_mutex_release(tsd->mtx);
   }
@@ -347,6 +384,10 @@ static void destroy_async_data(struct Curl_async *async)
   if(async->os_specific) {
     struct thread_data *td = (struct thread_data*) async->os_specific;
     int done;
+#ifdef USE_SOCKETPAIR
+    curl_socket_t sock_rd = td->tsd.sock_pair[0];
+    struct connectdata *conn = td->tsd.conn;
+#endif
 
     /*
      * if the thread is still blocking in the resolve syscall, detach it and
@@ -368,6 +409,15 @@ static void destroy_async_data(struct Curl_async *async)
 
       free(async->os_specific);
     }
+#ifdef USE_SOCKETPAIR
+    /*
+     * ensure CURLMOPT_SOCKETFUNCTION fires CURL_POLL_REMOVE
+     * before the FD is invalidated to avoid EBADF on EPOLL_CTL_DEL
+     */
+    if(conn)
+      Curl_multi_closed(conn->data, sock_rd);
+    sclose(sock_rd);
+#endif
   }
   async->os_specific = NULL;
 
@@ -460,23 +510,15 @@ static CURLcode resolver_error(struct connectdata *conn)
   return result;
 }
 
-/*
- * Curl_resolver_wait_resolv()
- *
- * waits for a resolve to finish. This function should be avoided since using
- * this risk getting the multi interface to "hang".
- *
- * If 'entry' is non-NULL, make it point to the resolved dns entry
- *
- * This is the version for resolves-in-a-thread.
- */
-CURLcode Curl_resolver_wait_resolv(struct connectdata *conn,
-                                   struct Curl_dns_entry **entry)
+static CURLcode thread_wait_resolv(struct connectdata *conn,
+                                   struct Curl_dns_entry **entry,
+                                   bool report)
 {
   struct thread_data   *td = (struct thread_data*) conn->async.os_specific;
   CURLcode result = CURLE_OK;
 
   DEBUGASSERT(conn && td);
+  DEBUGASSERT(td->thread_hnd != curl_thread_t_null);
 
   /* wait for the thread to resolve the name */
   if(Curl_thread_join(&td->thread_hnd)) {
@@ -491,18 +533,55 @@ CURLcode Curl_resolver_wait_resolv(struct connectdata *conn,
   if(entry)
     *entry = conn->async.dns;
 
-  if(!conn->async.dns)
+  if(!conn->async.dns && report)
     /* a name was not resolved, report error */
     result = resolver_error(conn);
 
   destroy_async_data(&conn->async);
 
-  if(!conn->async.dns)
+  if(!conn->async.dns && report)
     connclose(conn, "asynch resolve failed");
 
   return result;
 }
 
+
+/*
+ * Until we gain a way to signal the resolver threads to stop early, we must
+ * simply wait for them and ignore their results.
+ */
+void Curl_resolver_kill(struct connectdata *conn)
+{
+  struct thread_data *td = (struct thread_data*) conn->async.os_specific;
+
+  /* If we're still resolving, we must wait for the threads to fully clean up,
+     unfortunately.  Otherwise, we can simply cancel to clean up any resolver
+     data. */
+  if(td && td->thread_hnd != curl_thread_t_null)
+    (void)thread_wait_resolv(conn, NULL, FALSE);
+  else
+    Curl_resolver_cancel(conn);
+}
+
+/*
+ * Curl_resolver_wait_resolv()
+ *
+ * Waits for a resolve to finish. This function should be avoided since using
+ * this risk getting the multi interface to "hang".
+ *
+ * If 'entry' is non-NULL, make it point to the resolved dns entry
+ *
+ * Returns CURLE_COULDNT_RESOLVE_HOST if the host was not resolved,
+ * CURLE_OPERATION_TIMEDOUT if a time-out occurred, or other errors.
+ *
+ * This is the version for resolves-in-a-thread.
+ */
+CURLcode Curl_resolver_wait_resolv(struct connectdata *conn,
+                                   struct Curl_dns_entry **entry)
+{
+  return thread_wait_resolv(conn, entry, TRUE);
+}
+
 /*
  * Curl_resolver_is_resolved() is called repeatedly to check if a previous
  * name resolve request has completed. It should also make sure to time-out if
@@ -539,8 +618,9 @@ CURLcode Curl_resolver_is_resolved(struct connectdata *conn,
   }
   else {
     /* poll for name lookup done with exponential backoff up to 250ms */
-    timediff_t elapsed = Curl_timediff(Curl_now(),
-                                       data->progress.t_startsingle);
+    /* should be fine even if this converts to 32 bit */
+    time_t elapsed = (time_t)Curl_timediff(Curl_now(),
+                                           data->progress.t_startsingle);
     if(elapsed < 0)
       elapsed = 0;
 
@@ -562,26 +642,45 @@ CURLcode Curl_resolver_is_resolved(struct connectdata *conn,
 }
 
 int Curl_resolver_getsock(struct connectdata *conn,
-                          curl_socket_t *socks,
-                          int numsocks)
+                          curl_socket_t *socks)
 {
+  int ret_val = 0;
   time_t milli;
   timediff_t ms;
   struct Curl_easy *data = conn->data;
   struct resdata *reslv = (struct resdata *)data->state.resolver;
+#ifdef USE_SOCKETPAIR
+  struct thread_data *td = (struct thread_data*)conn->async.os_specific;
+#else
   (void)socks;
-  (void)numsocks;
-  ms = Curl_timediff(Curl_now(), reslv->start);
-  if(ms < 3)
-    milli = 0;
-  else if(ms <= 50)
-    milli = ms/3;
-  else if(ms <= 250)
-    milli = 50;
-  else
-    milli = 200;
-  Curl_expire(data, milli, EXPIRE_ASYNC_NAME);
-  return 0;
+#endif
+
+#ifdef USE_SOCKETPAIR
+  if(td) {
+    /* return read fd to client for polling the DNS resolution status */
+    socks[0] = td->tsd.sock_pair[0];
+    DEBUGASSERT(td->tsd.conn == conn || !td->tsd.conn);
+    td->tsd.conn = conn;
+    ret_val = GETSOCK_READSOCK(0);
+  }
+  else {
+#endif
+    ms = Curl_timediff(Curl_now(), reslv->start);
+    if(ms < 3)
+      milli = 0;
+    else if(ms <= 50)
+      milli = (time_t)ms/3;
+    else if(ms <= 250)
+      milli = 50;
+    else
+      milli = 200;
+    Curl_expire(data, milli, EXPIRE_ASYNC_NAME);
+#ifdef USE_SOCKETPAIR
+  }
+#endif
+
+
+  return ret_val;
 }
 
 #ifndef HAVE_GETADDRINFO
@@ -599,6 +698,16 @@ Curl_addrinfo *Curl_resolver_getaddrinfo(struct connectdata *conn,
 
   *waitp = 0; /* default to synchronous response */
 
+#ifdef ENABLE_IPV6
+  {
+    struct in6_addr in6;
+    /* check if this is an IPv6 address string */
+    if(Curl_inet_pton(AF_INET6, hostname, &in6) > 0)
+      /* This is an IPv6 address literal */
+      return Curl_ip2addr(AF_INET6, &in6, hostname, port);
+  }
+#endif /* ENABLE_IPV6 */
+
   if(Curl_inet_pton(AF_INET, hostname, &in) > 0)
     /* This is a dotted IP address 123.123.123.123-style */
     return Curl_ip2addr(AF_INET, &in, hostname, port);
@@ -642,7 +751,7 @@ Curl_addrinfo *Curl_resolver_getaddrinfo(struct connectdata *conn,
       /* This is a dotted IP address 123.123.123.123-style */
       return Curl_ip2addr(AF_INET, &in, hostname, port);
   }
-#ifdef CURLRES_IPV6
+#ifdef ENABLE_IPV6
   {
     struct in6_addr in6;
     /* check if this is an IPv6 address string */
@@ -650,7 +759,7 @@ Curl_addrinfo *Curl_resolver_getaddrinfo(struct connectdata *conn,
       /* This is an IPv6 address literal */
       return Curl_ip2addr(AF_INET6, &in6, hostname, port);
   }
-#endif /* CURLRES_IPV6 */
+#endif /* ENABLE_IPV6 */
 #endif /* !USE_RESOLVE_ON_IPS */
 
 #ifdef CURLRES_IPV6
@@ -676,9 +785,10 @@ Curl_addrinfo *Curl_resolver_getaddrinfo(struct connectdata *conn,
 
   memset(&hints, 0, sizeof(hints));
   hints.ai_family = pf;
-  hints.ai_socktype = conn->socktype;
+  hints.ai_socktype = (conn->transport == TRNSPRT_TCP)?
+    SOCK_STREAM : SOCK_DGRAM;
 
-  snprintf(sbuf, sizeof(sbuf), "%d", port);
+  msnprintf(sbuf, sizeof(sbuf), "%d", port);
 
   reslv->start = Curl_now();
   /* fire up a new resolver thread! */
index 3adc366..081c3fe 100644 (file)
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -60,7 +60,7 @@ void Curl_resolver_global_cleanup(void);
  * Returning anything else than CURLE_OK fails curl_easy_init() with the
  * correspondent code.
  */
-CURLcode Curl_resolver_init(void **resolver);
+CURLcode Curl_resolver_init(struct Curl_easy *easy, void **resolver);
 
 /*
  * Curl_resolver_cleanup()
@@ -79,17 +79,33 @@ void Curl_resolver_cleanup(void *resolver);
  * pointer.  Returning anything else than CURLE_OK causes failed
  * curl_easy_duphandle() call.
  */
-int Curl_resolver_duphandle(void **to, void *from);
+CURLcode Curl_resolver_duphandle(struct Curl_easy *easy, void **to,
+                                 void *from);
 
 /*
  * Curl_resolver_cancel().
  *
  * It is called from inside other functions to cancel currently performing
  * resolver request. Should also free any temporary resources allocated to
- * perform a request.
+ * perform a request.  This never waits for resolver threads to complete.
+ *
+ * It is safe to call this when conn is in any state.
  */
 void Curl_resolver_cancel(struct connectdata *conn);
 
+/*
+ * Curl_resolver_kill().
+ *
+ * This acts like Curl_resolver_cancel() except it will block until any threads
+ * associated with the resolver are complete.  This never blocks for resolvers
+ * that do not use threads.  This is intended to be the "last chance" function
+ * that cleans up an in-progress resolver completely (before its owner is about
+ * to die).
+ *
+ * It is safe to call this when conn is in any state.
+ */
+void Curl_resolver_kill(struct connectdata *conn);
+
 /* Curl_resolver_getsock()
  *
  * This function is called from the multi_getsock() function.  'sock' is a
@@ -98,8 +114,7 @@ void Curl_resolver_cancel(struct connectdata *conn);
  * return bitmask indicating what file descriptors (referring to array indexes
  * in the 'sock' array) to wait for, read/write.
  */
-int Curl_resolver_getsock(struct connectdata *conn, curl_socket_t *sock,
-                          int numsocks);
+int Curl_resolver_getsock(struct connectdata *conn, curl_socket_t *sock);
 
 /*
  * Curl_resolver_is_resolved()
@@ -116,14 +131,13 @@ CURLcode Curl_resolver_is_resolved(struct connectdata *conn,
 /*
  * Curl_resolver_wait_resolv()
  *
- * waits for a resolve to finish. This function should be avoided since using
+ * Waits for a resolve to finish. This function should be avoided since using
  * this risk getting the multi interface to "hang".
  *
  * If 'entry' is non-NULL, make it point to the resolved dns entry
  *
- * Returns CURLE_COULDNT_RESOLVE_HOST if the host was not resolved, and
- * CURLE_OPERATION_TIMEDOUT if a time-out occurred.
-
+ * Returns CURLE_COULDNT_RESOLVE_HOST if the host was not resolved,
+ * CURLE_OPERATION_TIMEDOUT if a time-out occurred, or other errors.
  */
 CURLcode Curl_resolver_wait_resolv(struct connectdata *conn,
                                    struct Curl_dns_entry **dnsentry);
@@ -147,11 +161,12 @@ Curl_addrinfo *Curl_resolver_getaddrinfo(struct connectdata *conn,
 #ifndef CURLRES_ASYNCH
 /* convert these functions if an asynch resolver isn't used */
 #define Curl_resolver_cancel(x) Curl_nop_stmt
+#define Curl_resolver_kill(x) Curl_nop_stmt
 #define Curl_resolver_is_resolved(x,y) CURLE_COULDNT_RESOLVE_HOST
 #define Curl_resolver_wait_resolv(x,y) CURLE_COULDNT_RESOLVE_HOST
 #define Curl_resolver_getsock(x,y,z) 0
-#define Curl_resolver_duphandle(x,y) CURLE_OK
-#define Curl_resolver_init(x) CURLE_OK
+#define Curl_resolver_duphandle(x,y,z) CURLE_OK
+#define Curl_resolver_init(x,y) CURLE_OK
 #define Curl_resolver_global_init() CURLE_OK
 #define Curl_resolver_global_cleanup() Curl_nop_stmt
 #define Curl_resolver_cleanup(x) Curl_nop_stmt
index 6370e4c..643cef6 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
 /* Base64 encoding/decoding */
 
 #include "curl_setup.h"
+
+#if !defined(CURL_DISABLE_HTTP_AUTH) || defined(USE_SSH) || \
+  !defined(CURL_DISABLE_LDAP) || \
+  !defined(CURL_DISABLE_DOH) || defined(USE_SSL)
+
 #include "urldata.h" /* for the Curl_easy definition */
 #include "warnless.h"
 #include "curl_base64.h"
@@ -233,24 +238,24 @@ static CURLcode base64_encode(const char *table64,
 
     switch(inputparts) {
     case 1: /* only one byte read */
-      snprintf(output, 5, "%c%c==",
-               table64[obuf[0]],
-               table64[obuf[1]]);
+      msnprintf(output, 5, "%c%c==",
+                table64[obuf[0]],
+                table64[obuf[1]]);
       break;
 
     case 2: /* two bytes read */
-      snprintf(output, 5, "%c%c%c=",
-               table64[obuf[0]],
-               table64[obuf[1]],
-               table64[obuf[2]]);
+      msnprintf(output, 5, "%c%c%c=",
+                table64[obuf[0]],
+                table64[obuf[1]],
+                table64[obuf[2]]);
       break;
 
     default:
-      snprintf(output, 5, "%c%c%c%c",
-               table64[obuf[0]],
-               table64[obuf[1]],
-               table64[obuf[2]],
-               table64[obuf[3]]);
+      msnprintf(output, 5, "%c%c%c%c",
+                table64[obuf[0]],
+                table64[obuf[1]],
+                table64[obuf[2]],
+                table64[obuf[3]]);
       break;
     }
     output += 4;
@@ -317,3 +322,5 @@ CURLcode Curl_base64url_encode(struct Curl_easy *data,
 {
   return base64_encode(base64url, data, inputbuff, insize, outptr, outlen);
 }
+
+#endif /* no users so disabled */
index 15e9aff..8343645 100755 (executable)
@@ -6,7 +6,7 @@
 #                            | (__| |_| |  _ <| |___
 #                             \___|\___/|_| \_\_____|
 #
-# Copyright (C) 2011 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 2011 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 #
 # This software is licensed as described in the file COPYING, which
 # you should have received as part of this distribution. The terms
@@ -35,6 +35,7 @@ my $suppressed; # whitelisted problems
 my $file;
 my $dir=".";
 my $wlist="";
+my @alist;
 my $windows_os = $^O eq 'MSWin32' || $^O eq 'msys' || $^O eq 'cygwin';
 my $verbose;
 my %whitelist;
@@ -44,6 +45,10 @@ my %ignore_set;
 my %ignore_used;
 my @ignore_line;
 
+my %warnings_extended = (
+    'COPYRIGHTYEAR'    => 'copyright year incorrect',
+    );
+
 my %warnings = (
     'LONGLINE'         => "Line longer than $max_column",
     'TABS'             => 'TAB characters not allowed',
@@ -74,6 +79,7 @@ my %warnings = (
     'SEMINOSPACE'      => 'semicolon without following space',
     'MULTISPACE'       => 'multiple spaces used when not suitable',
     'SIZEOFNOPAREN'    => 'use of sizeof without parentheses',
+    'SNPRINTF'         => 'use of snprintf',
     );
 
 sub readwhitelist {
@@ -86,6 +92,35 @@ sub readwhitelist {
     close(W);
 }
 
+# Reads the .checksrc in $dir for any extended warnings to enable locally.
+# Currently there is no support for disabling warnings from the standard set,
+# and since that's already handled via !checksrc! commands there is probably
+# little use to add it.
+sub readlocalfile {
+    my $i = 0;
+
+    open(my $rcfile, "<", "$dir/.checksrc") or return;
+
+    while(<$rcfile>) {
+        $i++;
+
+        # Lines starting with '#' are considered comments
+        if (/^\s*(#.*)/) {
+            next;
+        }
+        elsif (/^\s*enable ([A-Z]+)$/) {
+            if(!defined($warnings_extended{$1})) {
+                print STDERR "invalid warning specified in .checksrc: \"$1\"\n";
+                next;
+            }
+            $warnings{$1} = $warnings_extended{$1};
+        }
+        else {
+            die "Invalid format in $dir/.checksrc on line $i\n";
+        }
+    }
+}
+
 sub checkwarn {
     my ($name, $num, $col, $file, $line, $msg, $error) = @_;
 
@@ -141,7 +176,7 @@ sub checkwarn {
 
 $file = shift @ARGV;
 
-while(1) {
+while(defined $file) {
 
     if($file =~ /-D(.*)/) {
         $dir = $1;
@@ -153,6 +188,11 @@ while(1) {
         $file = shift @ARGV;
         next;
     }
+    elsif($file =~ /-A(.+)/) {
+        push @alist, $1;
+        $file = shift @ARGV;
+        next;
+    }
     elsif($file =~ /-i([1-9])/) {
         $indent = $1 + 0;
         $file = shift @ARGV;
@@ -174,6 +214,7 @@ while(1) {
 if(!$file) {
     print "checksrc.pl [option] <file1> [file2] ...\n";
     print " Options:\n";
+    print "  -A[rule]  Accept this violation, can be used multiple times\n";
     print "  -D[DIR]   Directory to prepend file names\n";
     print "  -h        Show help output\n";
     print "  -W[file]  Whitelist the given file - ignore all its flaws\n";
@@ -187,6 +228,7 @@ if(!$file) {
 }
 
 readwhitelist();
+readlocalfile();
 
 do {
     if("$wlist" !~ / $file /) {
@@ -198,6 +240,17 @@ do {
 
 } while($file);
 
+sub accept_violations {
+    for my $r (@alist) {
+        if(!$warnings{$r}) {
+            print "'$r' is not a warning to accept!\n";
+            exit;
+        }
+        $ignore{$r}=999999;
+        $ignore_used{$r}=0;
+    }
+}
+
 sub checksrc_clear {
     undef %ignore;
     undef %ignore_set;
@@ -295,8 +348,9 @@ sub scanfile {
     open(R, "<$file") || die "failed to open $file";
 
     my $incomment=0;
-    my $copyright=0;
+    my @copyright=();
     checksrc_clear(); # for file based ignores
+    accept_violations();
 
     while(<R>) {
         $windows_os ? $_ =~ s/\r?\n$// : chomp;
@@ -310,9 +364,16 @@ sub scanfile {
             checksrc($cmd, $line, $file, $l)
         }
 
-        # check for a copyright statement
-        if(!$copyright && ($l =~ /copyright .* \d\d\d\d/i)) {
-            $copyright=1;
+        # check for a copyright statement and save the years
+        if($l =~ /\* +copyright .* \d\d\d\d/i) {
+            while($l =~ /([\d]{4})/g) {
+                push @copyright, {
+                  year => $1,
+                  line => $line,
+                  col => index($l, $1),
+                  code => $l
+                };
+            }
         }
 
         # detect long lines
@@ -511,6 +572,13 @@ sub scanfile {
                       "use of $2 is banned");
         }
 
+        # scan for use of snprintf for curl-internals reasons
+        if($l =~ /^(.*\W)(v?snprintf)\s*\(/x) {
+            checkwarn("SNPRINTF",
+                      $line, length($1), $file, $ol,
+                      "use of $2 is banned");
+        }
+
         # scan for use of non-binary fopen without the macro
         if($l =~ /^(.*\W)fopen\s*\([^,]*, *\"([^"]*)/) {
             my $mode = $2;
@@ -623,9 +691,54 @@ sub scanfile {
         $prevl = $ol;
     }
 
-    if(!$copyright) {
+    if(!scalar(@copyright)) {
         checkwarn("COPYRIGHT", 1, 0, $file, "", "Missing copyright statement", 1);
     }
+
+    # COPYRIGHTYEAR is a extended warning so we must first see if it has been
+    # enabled in .checksrc
+    if(defined($warnings{"COPYRIGHTYEAR"})) {
+        # The check for updated copyrightyear is overly complicated in order to
+        # not punish current hacking for past sins. The copyright years are
+        # right now a bit behind, so enforcing copyright year checking on all
+        # files would cause hundreds of errors. Instead we only look at files
+        # which are tracked in the Git repo and edited in the workdir, or
+        # committed locally on the branch without being in upstream master.
+        #
+        # The simple and naive test is to simply check for the current year,
+        # but updating the year even without an edit is against project policy
+        # (and it would fail every file on January 1st).
+        #
+        # A rather more interesting, and correct, check would be to not test
+        # only locally committed files but inspect all files wrt the year of
+        # their last commit. Removing the `git rev-list origin/master..HEAD`
+        # condition below will enfore copyright year checks against the year
+        # the file was last committed (and thus edited to some degree).
+        my $commityear = undef;
+        @copyright = sort {$$b{year} cmp $$a{year}} @copyright;
+
+        # if the file is modified, assume commit year this year
+        if(`git status -s -- $file` =~ /^ [MARCU]/) {
+            $commityear = (localtime(time))[5] + 1900;
+        }
+        else {
+            # min-parents=1 to ignore wrong initial commit in truncated repos
+            my $grl = `git rev-list --max-count=1 --min-parents=1 --timestamp HEAD -- $file`;
+            if($grl) {
+                chomp $grl;
+                $commityear = (localtime((split(/ /, $grl))[0]))[5] + 1900;
+            }
+        }
+
+        if(defined($commityear) && scalar(@copyright) &&
+           $copyright[0]{year} != $commityear) {
+            checkwarn("COPYRIGHTYEAR", $copyright[0]{line}, $copyright[0]{col},
+                      $file, $copyright[0]{code},
+                      "Copyright year out of date, should be $commityear, " .
+                      "is $copyright[0]{year}", 1);
+        }
+    }
+
     if($incomment) {
         checkwarn("OPENCOMMENT", 1, 0, $file, "", "Missing closing comment", 1);
     }
index 31cfc3a..12a87cf 100644 (file)
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -36,8 +36,6 @@
 #define HAVE_INTTYPES_H 1
 #define HAVE_IOCTLSOCKET_CAMEL 1
 #define HAVE_IOCTLSOCKET_CAMEL_FIONBIO 1
-#define HAVE_LIBCRYPTO 1
-#define HAVE_LIBSSL 1
 #define HAVE_LIBZ 1
 #define HAVE_LONGLONG 1
 #define HAVE_MALLOC_H 1
index 3e973de..25f751e 100644 (file)
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
index 3c12bdf..14b98fe 100644 (file)
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
index 7844444..a302828 100644 (file)
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
 /* Define if you have the `getpass_r' function. */
 #undef HAVE_GETPASS_R
 
+/* Define to 1 if you have the getpeername function. */
+#define HAVE_GETPEERNAME 1
+
 /* Define if you have the `getpwuid' function. */
 #define HAVE_GETPWUID
 
 /* Define if you have the `getservbyname' function. */
 #define HAVE_GETSERVBYNAME
 
+/* Define to 1 if you have the getsockname function. */
+#define HAVE_GETSOCKNAME 1
+
 /* Define if you have the `gettimeofday' function. */
 #define HAVE_GETTIMEOFDAY
 
 /* Define if you have the <krb.h> header file. */
 #undef HAVE_KRB_H
 
-/* Define if you have the `crypto' library (-lcrypto). */
-#undef HAVE_LIBCRYPTO
-
 /* Define if you have the `nsl' library (-lnsl). */
 #undef HAVE_LIBNSL
 
 /* Define if you have the `socket' library (-lsocket). */
 #undef HAVE_LIBSOCKET
 
-/* Define if you have the `ssl' library (-lssl). */
-#undef HAVE_LIBSSL
-
 /* Define if you have GSS API. */
 #define HAVE_GSSAPI
 
 /* Define if you can safely include both <sys/time.h> and <time.h>. */
 #define TIME_WITH_SYS_TIME
 
+/* Define to enable alt-svc support (experimental) */
+#undef USE_ALTSVC
+
+/* Define to enable HTTP3 support (experimental, requires NGTCP2 or QUICHE) */
+#undef ENABLE_QUIC
+
 /* Version number of package */
 #undef VERSION
 
diff --git a/lib/config-plan9.h b/lib/config-plan9.h
new file mode 100644 (file)
index 0000000..4063d4b
--- /dev/null
@@ -0,0 +1,215 @@
+#ifndef HEADER_CURL_CONFIG_PLAN9_H
+#define HEADER_CURL_CONFIG_PLAN9_H
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+
+#define BUILDING_LIBCURL 1
+#define CURL_CA_BUNDLE "/sys/lib/tls/ca.pem"
+#define CURL_CA_PATH "/sys/lib/tls"
+#define CURL_STATICLIB 1
+#define ENABLE_IPV6 1
+#define CURL_DISABLE_LDAP 1
+
+#define NEED_REENTRANT 1
+#define OS "plan9"
+#define PACKAGE "curl"
+#define PACKAGE_NAME "curl"
+#define PACKAGE_BUGREPORT "a suitable mailing list: https://curl.haxx.se/mail/"
+#define PACKAGE_STRING "curl -"
+#define PACKAGE_TARNAME "curl"
+#define PACKAGE_VERSION "-"
+#define RANDOM_FILE "/dev/random"
+#define VERSION "0.0.0" /* TODO */
+
+#define RETSIGTYPE void
+
+#define STDC_HEADERS 1
+
+#ifdef _BITS64
+#error not implement
+#else
+#define SIZEOF_INT 4
+#define SIZEOF_SHORT 2
+#define SIZEOF_LONG 4
+#define SIZEOF_OFF_T 8
+#define SIZEOF_CURL_OFF_T 4 /* curl_off_t = timediff_t = int */
+#define SIZEOF_SIZE_T 4
+#define SIZEOF_TIME_T 4
+#endif
+
+#define HAVE_GETNAMEINFO 1
+#define GETNAMEINFO_QUAL_ARG1 const
+#define GETNAMEINFO_TYPE_ARG1 struct sockaddr *
+#define GETNAMEINFO_TYPE_ARG2 int
+#define GETNAMEINFO_TYPE_ARG46 long
+#define GETNAMEINFO_TYPE_ARG7 int
+
+#define HAVE_RECV 1
+#define RECV_TYPE_ARG1 int
+#define RECV_TYPE_ARG2 void *
+#define RECV_TYPE_ARG3 int
+#define RECV_TYPE_ARG4 int
+#define RECV_TYPE_RETV int
+
+#define HAVE_RECVFROM 1
+#define RECVFROM_TYPE_ARG1 int
+#define RECVFROM_TYPE_ARG2 void
+#define RECVFROM_TYPE_ARG2_IS_VOID 1
+#define RECVFROM_TYPE_ARG3 int
+#define RECVFROM_TYPE_ARG4 int
+#define RECVFROM_TYPE_ARG5 void
+#define RECVFROM_TYPE_ARG5_IS_VOID 1
+#define RECVFROM_TYPE_ARG6 int
+#define RECVFROM_TYPE_ARG6_IS_VOID 1
+#define RECVFROM_TYPE_RETV int
+
+#define HAVE_SELECT 1
+#define SELECT_TYPE_ARG1 int
+#define SELECT_TYPE_ARG234 fd_set *
+#define SELECT_TYPE_ARG5 struct timeval *
+#define SELECT_TYPE_RETV int
+
+#define HAVE_SEND 1
+#define SEND_TYPE_ARG1 int
+#define SEND_TYPE_ARG2 void *
+#define SEND_QUAL_ARG2
+#define SEND_TYPE_ARG3 int
+#define SEND_TYPE_ARG4 int
+#define SEND_TYPE_RETV int
+
+#define HAVE_ALARM 1
+#define HAVE_ARPA_INET_H 1
+#define HAVE_ASSERT_H 1
+#define HAVE_BASENAME 1
+#define HAVE_BOOL_T 1
+#define HAVE_CRYPTO_CLEANUP_ALL_EX_DATA 1
+#define HAVE_ERRNO_H 1
+#define HAVE_FCNTL 1
+#define HAVE_FCNTL_H 1
+#define HAVE_FDOPEN 1
+#define HAVE_FORK 1
+#define HAVE_FREEADDRINFO 1
+#define HAVE_FTRUNCATE 1
+#define HAVE_GETADDRINFO 1
+#define HAVE_GETEUID 1
+#define HAVE_GETHOSTBYADDR 1
+#define HAVE_GETHOSTBYNAME 1
+#define HAVE_GETHOSTNAME 1
+#define HAVE_GETPPID 1
+#define HAVE_GETPROTOBYNAME 1
+#define HAVE_GETPWUID 1
+#define HAVE_GETTIMEOFDAY 1
+#define HAVE_GMTIME_R 1
+#define HAVE_INET_ADDR 1
+#define HAVE_INET_NTOP 1
+#define HAVE_INET_PTON 1
+#define HAVE_INTTYPES_H 1
+#define HAVE_IOCTL 1
+#define HAVE_LIBGEN_H 1
+#define HAVE_LIBZ 1
+#define HAVE_LL 1
+#define HAVE_LOCALE_H 1
+#define HAVE_LOCALTIME_R 1
+#define HAVE_LONGLONG 1
+#define HAVE_NETDB_H 1
+#define HAVE_NETINET_IN_H 1
+#define HAVE_NETINET_TCP_H 1
+#define HAVE_PWD_H 1
+#define HAVE_SYS_SELECT_H 1
+
+#define USE_OPENSSL 1
+#define HAVE_OPENSSL_CRYPTO_H 1
+#define HAVE_OPENSSL_ENGINE_H 1
+#define HAVE_OPENSSL_ERR_H 1
+#define HAVE_OPENSSL_PEM_H 1
+#define HAVE_OPENSSL_PKCS12_H 1
+#define HAVE_OPENSSL_RSA_H 1
+#define HAVE_OPENSSL_SSL_H 1
+#define HAVE_OPENSSL_X509_H 1
+
+#define HAVE_PERROR 1
+#define HAVE_PIPE 1
+#define HAVE_POLL 1
+#define HAVE_POLL_FINE 1
+#define HAVE_POLL_H 1
+#define HAVE_PTHREAD_H 1
+#define HAVE_RAND_STATUS 1
+#define HAVE_SETJMP_H 1
+#define HAVE_SETLOCALE 1
+
+#define HAVE_SETSOCKOPT 1
+#define HAVE_SOCK_OPTS 1 /* for /sys/include/ape/sys/socket.h */
+
+#define HAVE_SIGACTION 1
+#define HAVE_SIGNAL 1
+#define HAVE_SIGNAL_H 1
+#define HAVE_SIGSETJMP 1
+#define HAVE_SIG_ATOMIC_T 1
+#define HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID 1
+#define HAVE_SOCKET 1
+#define HAVE_SSL_GET_SHUTDOWN 1
+#define HAVE_STDBOOL_H 1
+#define HAVE_STDINT_H 1
+#define HAVE_STDIO_H 1
+#define HAVE_STDLIB_H 1
+#define HAVE_STRCASECMP 1
+#define HAVE_STRDUP 1
+#define HAVE_STRING_H 1
+#define HAVE_STRNCASECMP 1
+#define HAVE_STRSTR 1
+#define HAVE_STRTOK_R 1
+#define HAVE_STRTOLL 1
+#define HAVE_STRUCT_TIMEVAL 1
+#define HAVE_SYS_IOCTL_H 1
+#define HAVE_SYS_PARAM_H 1
+#define HAVE_SYS_RESOURCE_H 1
+#define HAVE_SYS_SOCKET_H 1
+#define HAVE_SYS_STAT_H 1
+#define HAVE_SYS_TIME_H 1
+#define HAVE_SYS_TYPES_H 1
+#define HAVE_SYS_UIO_H 1
+#define HAVE_SYS_UN_H 1
+#define HAVE_TERMIOS_H 1
+#define HAVE_TIME_H 1
+#define HAVE_UNAME 1
+#define HAVE_UNISTD_H 1
+#define HAVE_UTIME 1
+#define HAVE_UTIME_H 1
+#define HAVE_WRITEV 1
+
+#define HAVE_ZLIB_H 1
+
+#define HAVE_POSIX_STRERROR_R 1
+#define HAVE_STRERROR_R 1
+#define STRERROR_R_TYPE_ARG3 int
+
+#define TIME_WITH_SYS_TIME 1
+#define USE_BLOCKING_SOCKETS 1
+#define USE_MANUAL 1
+
+#define __attribute__(x)
+
+#ifndef __cplusplus
+#undef inline
+#endif
+
+#endif /* HEADER_CURL_CONFIG_PLAN9_H */
index 0379524..4af9498 100644 (file)
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2013, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
 /* Define if you have the <krb.h> header file. */
 #undef HAVE_KRB_H
 
-/* Define if you have the `crypto' library (-lcrypto). */
-#undef HAVE_LIBCRYPTO
-
 /* Define if you have the `nsl' library (-lnsl). */
 #undef HAVE_LIBNSL
 
 /* Define if you have the `socket' library (-lsocket). */
 #undef HAVE_LIBSOCKET
 
-/* Define if you have the `ssl' library (-lssl). */
-#undef HAVE_LIBSSL
-
 /* Define if you have the `ucb' library (-lucb). */
 #undef HAVE_LIBUCB
 
index d23de33..c01e1bf 100644 (file)
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
 /* Define to 1 if you have the <dlfcn.h> header file. */
 #define HAVE_DLFCN_H 1
 
-/* Define to 1 if you have the `ENGINE_load_builtin_engines' function. */
-/*#define HAVE_ENGINE_LOAD_BUILTIN_ENGINES 1*/
-
 /* Define to 1 if you have the <errno.h> header file. */
 #define HAVE_ERRNO_H 1
 
 /* Define to 1 if you have the <libssh2.h> header file. */
 /*#define HAVE_LIBSSH2_H 1*/
 
-/* Define to 1 if you have the `ssl' library (-lssl). */
-/*#define HAVE_LIBSSL 1*/
-
 /* if your compiler supports LL */
 #define HAVE_LL 1
 
 /* Define to 1 if you have the `socket' function. */
 #define HAVE_SOCKET 1
 
-/* Define to 1 if you have the `SSL_get_shutdown' function. */
-/*#define HAVE_SSL_GET_SHUTDOWN 1*/
-
 /* Define to 1 if you have the <ssl.h> header file. */
 /* #undef HAVE_SSL_H */
 
index 778d983..85b634f 100644 (file)
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
 /* #undef HAVE_DES_H */
 #define HAVE_DES_H 1
 
-/* Define to 1 if you have the `ENGINE_load_builtin_engines' function. */
-/* #undef HAVE_ENGINE_LOAD_BUILTIN_ENGINES */
-#define HAVE_ENGINE_LOAD_BUILTIN_ENGINES 1
-
 /* Define to 1 if you have the <errno.h> header file. */
 #define HAVE_ERRNO_H 1
 
 /* Define to 1 if you have the `socket' library (-lsocket). */
 /* #undef HAVE_LIBSOCKET */
 
-/* Define to 1 if you have the `ssl' library (-lssl). */
-/* #undef HAVE_LIBSSL */
-#define HAVE_LIBSSL 1
-
 /* if zlib is available */
 /* #undef HAVE_LIBZ */
 
index a03e341..004fd4e 100644 (file)
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
 /* Define to 1 if you have the <dlfcn.h> header file. */
 #define HAVE_DLFCN_H 1
 
-/* Define to 1 if you have the `ENGINE_load_builtin_engines' function. */
-#define HAVE_ENGINE_LOAD_BUILTIN_ENGINES 1
-
 /* Define to 1 if you have the <errno.h> header file. */
 #define HAVE_ERRNO_H 1
 
 /* Define to 1 if you have a working fcntl O_NONBLOCK function. */
 #define HAVE_FCNTL_O_NONBLOCK 1
 
-/* Define to 1 if you have the fdopen function. */
-#define HAVE_FDOPEN 1
-
 /* Define to 1 if you have the `fork' function. */
 #define HAVE_FORK 1
 
 /* Define to 1 if you have the `libssh2_version' function. */
 /* #undef HAVE_LIBSSH2_VERSION */
 
-/* Define to 1 if you have the `ssl' library (-lssl). */
-#define HAVE_LIBSSL 1
-
 /* if zlib is available */
 #define HAVE_LIBZ 1
 
 /* Define to 1 if you have the `socket' function. */
 #define HAVE_SOCKET 1
 
-/* Define to 1 if you have the `SSL_get_shutdown' function. */
-#define HAVE_SSL_GET_SHUTDOWN 1
-
 /* Define to 1 if you have the <ssl.h> header file. */
 /* #undef HAVE_SSL_H */
 
index 76b00b9..1dcce0d 100644 (file)
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
 /* Define if you have the ftruncate function. */
 #define HAVE_FTRUNCATE 1
 
+/* Define to 1 if you have the `getpeername' function. */
+#define HAVE_GETPEERNAME 1
+
+/* Define to 1 if you have the getsockname function. */
+#define HAVE_GETSOCKNAME 1
+
 /* Define if you have the gethostbyaddr function. */
 #define HAVE_GETHOSTBYADDR 1
 
@@ -579,8 +585,9 @@ Vista
 #  endif
 #endif
 
-/* Availability of freeaddrinfo, getaddrinfo and getnameinfo functions is
-   quite convoluted, compiler dependent and even build target dependent. */
+/* Availability of freeaddrinfo, getaddrinfo, getnameinfo and if_nametoindex
+   functions is quite convoluted, compiler dependent and even build target
+   dependent. */
 #if defined(HAVE_WS2TCPIP_H)
 #  if defined(__POCC__)
 #    define HAVE_FREEADDRINFO           1
@@ -710,8 +717,12 @@ Vista
 #define USE_WIN32_CRYPTO
 
 /* Define to use Unix sockets. */
-#if defined(_MSC_VER) && _MSC_VER >= 1900
-/* #define USE_UNIX_SOCKETS */
+#if defined(_MSC_VER) && (_MSC_VER >= 1500)
+/* sdkddkver.h first shipped with Platform SDK v6.0A included with VS2008 */
+#include <sdkddkver.h>
+#if defined(NTDDI_WIN10_RS4)
+#define USE_UNIX_SOCKETS
+#endif
 #endif
 
 /* ---------------------------------------------------------------- */
@@ -724,8 +735,12 @@ Vista
 #define OS "i386-pc-win32"
 #elif defined(_M_X64) || defined(__x86_64__) /* x86_64 (MSVC >=2005 or gcc) */
 #define OS "x86_64-pc-win32"
-#elif defined(_M_IA64) /* Itanium */
+#elif defined(_M_IA64) || defined(__ia64__) /* Itanium */
 #define OS "ia64-pc-win32"
+#elif defined(_M_ARM_NT) || defined(__arm__) /* ARMv7-Thumb2 (Windows RT) */
+#define OS "thumbv7a-pc-win32"
+#elif defined(_M_ARM64) || defined(__aarch64__) /* ARM64 (Windows 10) */
+#define OS "aarch64-pc-win32"
 #else
 #define OS "unknown-pc-win32"
 #endif
index 1820522..5eb1c18 100644 (file)
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
index 6fbf3b1..2804464 100644 (file)
@@ -6,7 +6,7 @@
  *                             \___|\___/|_| \_\_____|
  *
  * Copyright (C) 2012 - 2016, Linus Nielsen Feltzing, <linus@haxx.se>
- * Copyright (C) 2012 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 2012 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
 #include "curl_memory.h"
 #include "memdebug.h"
 
-#ifdef CURLDEBUG
-/* the debug versions of these macros make extra certain that the lock is
-   never doubly locked or unlocked */
-#define CONN_LOCK(x) if((x)->share) {                                   \
-    Curl_share_lock((x), CURL_LOCK_DATA_CONNECT, CURL_LOCK_ACCESS_SINGLE); \
-    DEBUGASSERT(!(x)->state.conncache_lock);                            \
-    (x)->state.conncache_lock = TRUE;                                   \
-  }
-
-#define CONN_UNLOCK(x) if((x)->share) {                                 \
-    DEBUGASSERT((x)->state.conncache_lock);                             \
-    (x)->state.conncache_lock = FALSE;                                  \
-    Curl_share_unlock((x), CURL_LOCK_DATA_CONNECT);                     \
-  }
-#else
-#define CONN_LOCK(x) if((x)->share)                                     \
-    Curl_share_lock((x), CURL_LOCK_DATA_CONNECT, CURL_LOCK_ACCESS_SINGLE)
-#define CONN_UNLOCK(x) if((x)->share)                   \
-    Curl_share_unlock((x), CURL_LOCK_DATA_CONNECT)
-#endif
+#define HASHKEY_SIZE 128
 
 static void conn_llist_dtor(void *user, void *element)
 {
@@ -120,6 +101,7 @@ static int bundle_remove_conn(struct connectbundle *cb_ptr,
     }
     curr = curr->next;
   }
+  DEBUGASSERT(0);
   return 0;
 }
 
@@ -141,10 +123,8 @@ int Curl_conncache_init(struct conncache *connc, int size)
 
   rc = Curl_hash_init(&connc->hash, size, Curl_hash_str,
                       Curl_str_key_compare, free_bundle_hash_entry);
-  if(rc) {
-    Curl_close(connc->closure_handle);
-    connc->closure_handle = NULL;
-  }
+  if(rc)
+    Curl_close(&connc->closure_handle);
   else
     connc->closure_handle->state.conn_cache = connc;
 
@@ -159,28 +139,32 @@ void Curl_conncache_destroy(struct conncache *connc)
 
 /* creates a key to find a bundle for this connection */
 static void hashkey(struct connectdata *conn, char *buf,
-                    size_t len) /* something like 128 is fine */
+                    size_t len,  /* something like 128 is fine */
+                    const char **hostp)
 {
   const char *hostname;
+  long port = conn->remote_port;
 
-  if(conn->bits.socksproxy)
-    hostname = conn->socks_proxy.host.name;
-  else if(conn->bits.httpproxy)
+  if(conn->bits.httpproxy && !conn->bits.tunnel_proxy) {
     hostname = conn->http_proxy.host.name;
+    port = conn->port;
+  }
   else if(conn->bits.conn_to_host)
     hostname = conn->conn_to_host.name;
   else
     hostname = conn->host.name;
 
-  DEBUGASSERT(len > 32);
+  if(hostp)
+    /* report back which name we used */
+    *hostp = hostname;
 
   /* put the number first so that the hostname gets cut off if too long */
-  snprintf(buf, len, "%ld%s", conn->port, hostname);
+  msnprintf(buf, len, "%ld%s", port, hostname);
 }
 
-void Curl_conncache_unlock(struct connectdata *conn)
+void Curl_conncache_unlock(struct Curl_easy *data)
 {
-  CONN_UNLOCK(conn->data);
+  CONN_UNLOCK(data);
 }
 
 /* Returns number of connections currently held in the connection cache.
@@ -212,13 +196,14 @@ size_t Curl_conncache_bundle_size(struct connectdata *conn)
 
    **NOTE**: When it returns, it holds the connection cache lock! */
 struct connectbundle *Curl_conncache_find_bundle(struct connectdata *conn,
-                                                 struct conncache *connc)
+                                                 struct conncache *connc,
+                                                 const char **hostp)
 {
   struct connectbundle *bundle = NULL;
   CONN_LOCK(conn->data);
   if(connc) {
-    char key[128];
-    hashkey(conn, key, sizeof(key));
+    char key[HASHKEY_SIZE];
+    hashkey(conn, key, sizeof(key), hostp);
     bundle = Curl_hash_pick(&connc->hash, key, strlen(key));
   }
 
@@ -267,17 +252,17 @@ CURLcode Curl_conncache_add_conn(struct conncache *connc,
   struct Curl_easy *data = conn->data;
 
   /* *find_bundle() locks the connection cache */
-  bundle = Curl_conncache_find_bundle(conn, data->state.conn_cache);
+  bundle = Curl_conncache_find_bundle(conn, data->state.conn_cache, NULL);
   if(!bundle) {
     int rc;
-    char key[128];
+    char key[HASHKEY_SIZE];
 
     result = bundle_create(data, &new_bundle);
     if(result) {
       goto unlock;
     }
 
-    hashkey(conn, key, sizeof(key));
+    hashkey(conn, key, sizeof(key), NULL);
     rc = conncache_add_bundle(data->state.conn_cache, key, new_bundle);
 
     if(!rc) {
@@ -302,9 +287,14 @@ CURLcode Curl_conncache_add_conn(struct conncache *connc,
   return result;
 }
 
-void Curl_conncache_remove_conn(struct connectdata *conn, bool lock)
+/*
+ * Removes the connectdata object from the connection cache *and* clears the
+ * ->data pointer association. Pass TRUE/FALSE in the 'lock' argument
+ * depending on if the parent function already holds the lock or not.
+ */
+void Curl_conncache_remove_conn(struct Curl_easy *data,
+                                struct connectdata *conn, bool lock)
 {
-  struct Curl_easy *data = conn->data;
   struct connectbundle *bundle = conn->bundle;
   struct conncache *connc = data->state.conn_cache;
 
@@ -323,6 +313,7 @@ void Curl_conncache_remove_conn(struct connectdata *conn, bool lock)
       DEBUGF(infof(data, "The cache now contains %zu members\n",
                    connc->num_conn));
     }
+    conn->data = NULL; /* clear the association */
     if(lock) {
       CONN_UNLOCK(data);
     }
@@ -386,8 +377,8 @@ bool Curl_conncache_foreach(struct Curl_easy *data,
    NOTE: no locking is done here as this is presumably only done when cleaning
    up a cache!
 */
-struct connectdata *
-Curl_conncache_find_first_connection(struct conncache *connc)
+static struct connectdata *
+conncache_find_first_connection(struct conncache *connc)
 {
   struct curl_hash_iterator iter;
   struct curl_hash_element *he;
@@ -417,16 +408,16 @@ Curl_conncache_find_first_connection(struct conncache *connc)
  *
  * Return TRUE if stored, FALSE if closed.
  */
-bool Curl_conncache_return_conn(struct connectdata *conn)
+bool Curl_conncache_return_conn(struct Curl_easy *data,
+                                struct connectdata *conn)
 {
-  struct Curl_easy *data = conn->data;
-
   /* data->multi->maxconnects can be negative, deal with it. */
   size_t maxconnects =
     (data->multi->maxconnects < 0) ? data->multi->num_easy * 4:
     data->multi->maxconnects;
   struct connectdata *conn_candidate = NULL;
 
+  conn->lastused = Curl_now(); /* it was used up until now */
   if(maxconnects > 0 &&
      Curl_conncache_size(data) > maxconnects) {
     infof(data, "Connection cache is full, closing the oldest one.\n");
@@ -470,9 +461,9 @@ Curl_conncache_extract_bundle(struct Curl_easy *data,
   while(curr) {
     conn = curr->ptr;
 
-    if(!CONN_INUSE(conn)) {
+    if(!CONN_INUSE(conn) && !conn->data) {
       /* Set higher score for the age passed since the connection was used */
-      score = Curl_timediff(now, conn->now);
+      score = Curl_timediff(now, conn->lastused);
 
       if(score > highscore) {
         highscore = score;
@@ -528,9 +519,10 @@ Curl_conncache_extract_oldest(struct Curl_easy *data)
     while(curr) {
       conn = curr->ptr;
 
-      if(!CONN_INUSE(conn)) {
+      if(!CONN_INUSE(conn) && !conn->data && !conn->bits.close &&
+         !conn->bits.connect_only) {
         /* Set higher score for the age passed since the connection was used */
-        score = Curl_timediff(now, conn->now);
+        score = Curl_timediff(now, conn->lastused);
 
         if(score > highscore) {
           highscore = score;
@@ -560,20 +552,18 @@ void Curl_conncache_close_all_connections(struct conncache *connc)
 {
   struct connectdata *conn;
 
-  conn = Curl_conncache_find_first_connection(connc);
+  conn = conncache_find_first_connection(connc);
   while(conn) {
     SIGPIPE_VARIABLE(pipe_st);
     conn->data = connc->closure_handle;
 
     sigpipe_ignore(conn->data, &pipe_st);
-    conn->data->easy_conn = NULL; /* clear the easy handle's connection
-                                     pointer */
     /* This will remove the connection from the cache */
     connclose(conn, "kill all");
     (void)Curl_disconnect(connc->closure_handle, conn, FALSE);
     sigpipe_restore(&pipe_st);
 
-    conn = Curl_conncache_find_first_connection(connc);
+    conn = conncache_find_first_connection(connc);
   }
 
   if(connc->closure_handle) {
@@ -582,7 +572,7 @@ void Curl_conncache_close_all_connections(struct conncache *connc)
 
     Curl_hostcache_clean(connc->closure_handle,
                          connc->closure_handle->dns.hostcache);
-    Curl_close(connc->closure_handle);
+    Curl_close(&connc->closure_handle);
     sigpipe_restore(&pipe_st);
   }
 }
index eedd7a8..5fe80b4 100644 (file)
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 2015 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 2015 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  * Copyright (C) 2012 - 2014, Linus Nielsen Feltzing, <linus@haxx.se>
  *
  * This software is licensed as described in the file COPYING, which
@@ -40,9 +40,29 @@ struct conncache {
 
 #define BUNDLE_NO_MULTIUSE -1
 #define BUNDLE_UNKNOWN     0  /* initial value */
-#define BUNDLE_PIPELINING  1
 #define BUNDLE_MULTIPLEX   2
 
+#ifdef CURLDEBUG
+/* the debug versions of these macros make extra certain that the lock is
+   never doubly locked or unlocked */
+#define CONN_LOCK(x) if((x)->share) {                                   \
+    Curl_share_lock((x), CURL_LOCK_DATA_CONNECT, CURL_LOCK_ACCESS_SINGLE); \
+    DEBUGASSERT(!(x)->state.conncache_lock);                            \
+    (x)->state.conncache_lock = TRUE;                                   \
+  }
+
+#define CONN_UNLOCK(x) if((x)->share) {                                 \
+    DEBUGASSERT((x)->state.conncache_lock);                             \
+    (x)->state.conncache_lock = FALSE;                                  \
+    Curl_share_unlock((x), CURL_LOCK_DATA_CONNECT);                     \
+  }
+#else
+#define CONN_LOCK(x) if((x)->share)                                     \
+    Curl_share_lock((x), CURL_LOCK_DATA_CONNECT, CURL_LOCK_ACCESS_SINGLE)
+#define CONN_UNLOCK(x) if((x)->share)                   \
+    Curl_share_unlock((x), CURL_LOCK_DATA_CONNECT)
+#endif
+
 struct connectbundle {
   int multiuse;                 /* supports multi-use */
   size_t num_connections;       /* Number of connections in the bundle */
@@ -55,16 +75,19 @@ void Curl_conncache_destroy(struct conncache *connc);
 
 /* return the correct bundle, to a host or a proxy */
 struct connectbundle *Curl_conncache_find_bundle(struct connectdata *conn,
-                                                 struct conncache *connc);
-void Curl_conncache_unlock(struct connectdata *conn);
+                                                 struct conncache *connc,
+                                                 const char **hostp);
+void Curl_conncache_unlock(struct Curl_easy *data);
 /* returns number of connections currently held in the connection cache */
 size_t Curl_conncache_size(struct Curl_easy *data);
 size_t Curl_conncache_bundle_size(struct connectdata *conn);
 
-bool Curl_conncache_return_conn(struct connectdata *conn);
+bool Curl_conncache_return_conn(struct Curl_easy *data,
+                                struct connectdata *conn);
 CURLcode Curl_conncache_add_conn(struct conncache *connc,
                                  struct connectdata *conn) WARN_UNUSED_RESULT;
-void Curl_conncache_remove_conn(struct connectdata *conn,
+void Curl_conncache_remove_conn(struct Curl_easy *data,
+                                struct connectdata *conn,
                                 bool lock);
 bool Curl_conncache_foreach(struct Curl_easy *data,
                             struct conncache *connc,
index 41f2202..611d6d2 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -75,6 +75,8 @@
 #include "conncache.h"
 #include "multihandle.h"
 #include "system_win32.h"
+#include "quic.h"
+#include "socks.h"
 
 /* The last 3 #include files should be in this order */
 #include "curl_printf.h"
@@ -165,7 +167,7 @@ tcpkeepalive(struct Curl_easy *data,
 static CURLcode
 singleipconnect(struct connectdata *conn,
                 const Curl_addrinfo *ai, /* start connecting to this */
-                curl_socket_t *sock);
+                int sockindex);          /* 0 or 1 among the temp ones */
 
 /*
  * Curl_timeleft() returns the amount of milliseconds left allowed for the
@@ -357,7 +359,7 @@ static CURLcode bindlocal(struct connectdata *conn,
         conn->ip_version = CURL_IPRESOLVE_V6;
 #endif
 
-      rc = Curl_resolv(conn, dev, 0, &h);
+      rc = Curl_resolv(conn, dev, 0, FALSE, &h);
       if(rc == CURLRESOLV_PENDING)
         (void)Curl_resolver_wait_resolv(conn, &h);
       conn->ip_version = ipver;
@@ -368,6 +370,11 @@ static CURLcode bindlocal(struct connectdata *conn,
         infof(data, "Name '%s' family %i resolved to '%s' family %i\n",
               dev, af, myhost, h->addr->ai_family);
         Curl_resolv_unlock(data, h);
+        if(af != h->addr->ai_family) {
+          /* bad IP version combo, signal the caller to try another address
+             family if available */
+          return CURLE_UNSUPPORTED_PROTOCOL;
+        }
         done = 1;
       }
       else {
@@ -446,9 +453,10 @@ static CURLcode bindlocal(struct connectdata *conn,
       curl_socklen_t size = sizeof(add);
       memset(&add, 0, sizeof(struct Curl_sockaddr_storage));
       if(getsockname(sockfd, (struct sockaddr *) &add, &size) < 0) {
+        char buffer[STRERROR_LEN];
         data->state.os_errno = error = SOCKERRNO;
         failf(data, "getsockname() failed with errno %d: %s",
-              error, Curl_strerror(conn, error));
+              error, Curl_strerror(error, buffer, sizeof(buffer)));
         return CURLE_INTERFACE_FAILED;
       }
       infof(data, "Local port: %hu\n", port);
@@ -470,10 +478,12 @@ static CURLcode bindlocal(struct connectdata *conn,
     else
       break;
   }
-
-  data->state.os_errno = error = SOCKERRNO;
-  failf(data, "bind failed with errno %d: %s",
-        error, Curl_strerror(conn, error));
+  {
+    char buffer[STRERROR_LEN];
+    data->state.os_errno = error = SOCKERRNO;
+    failf(data, "bind failed with errno %d: %s",
+          error, Curl_strerror(error, buffer, sizeof(buffer)));
+  }
 
   return CURLE_INTERFACE_FAILED;
 }
@@ -522,7 +532,7 @@ static bool verifyconnect(curl_socket_t sockfd, int *error)
     err = 0;
   }
 #endif
-#ifdef __minix
+#if defined(EBADIOCTL) && defined(__minix)
   /* Minix 3.1.x doesn't support getsockopt on UDP sockets */
   if(EBADIOCTL == err) {
     SET_SOCKERRNO(0);
@@ -587,7 +597,7 @@ static CURLcode trynextip(struct connectdata *conn,
       }
 
       if(ai) {
-        result = singleipconnect(conn, ai, &conn->tempsock[tempindex]);
+        result = singleipconnect(conn, ai, tempindex);
         if(result == CURLE_COULDNT_CONNECT) {
           ai = ai->ai_next;
           continue;
@@ -619,16 +629,17 @@ void Curl_persistconninfo(struct connectdata *conn)
 
 /* retrieves ip address and port from a sockaddr structure.
    note it calls Curl_inet_ntop which sets errno on fail, not SOCKERRNO. */
-bool Curl_getaddressinfo(struct sockaddr *sa, char *addr,
-                         long *port)
+bool Curl_addr2string(struct sockaddr *sa, curl_socklen_t salen,
+                      char *addr, long *port)
 {
-  unsigned short us_port;
   struct sockaddr_in *si = NULL;
 #ifdef ENABLE_IPV6
   struct sockaddr_in6 *si6 = NULL;
 #endif
 #if defined(HAVE_SYS_UN_H) && defined(AF_UNIX)
   struct sockaddr_un *su = NULL;
+#else
+  (void)salen;
 #endif
 
   switch(sa->sa_family) {
@@ -636,7 +647,7 @@ bool Curl_getaddressinfo(struct sockaddr *sa, char *addr,
       si = (struct sockaddr_in *)(void *) sa;
       if(Curl_inet_ntop(sa->sa_family, &si->sin_addr,
                         addr, MAX_IPADR_LEN)) {
-        us_port = ntohs(si->sin_port);
+        unsigned short us_port = ntohs(si->sin_port);
         *port = us_port;
         return TRUE;
       }
@@ -646,7 +657,7 @@ bool Curl_getaddressinfo(struct sockaddr *sa, char *addr,
       si6 = (struct sockaddr_in6 *)(void *) sa;
       if(Curl_inet_ntop(sa->sa_family, &si6->sin6_addr,
                         addr, MAX_IPADR_LEN)) {
-        us_port = ntohs(si6->sin6_port);
+        unsigned short us_port = ntohs(si6->sin6_port);
         *port = us_port;
         return TRUE;
       }
@@ -654,8 +665,12 @@ bool Curl_getaddressinfo(struct sockaddr *sa, char *addr,
 #endif
 #if defined(HAVE_SYS_UN_H) && defined(AF_UNIX)
     case AF_UNIX:
-      su = (struct sockaddr_un*)sa;
-      snprintf(addr, MAX_IPADR_LEN, "%s", su->sun_path);
+      if(salen > (curl_socklen_t)sizeof(sa_family_t)) {
+        su = (struct sockaddr_un*)sa;
+        msnprintf(addr, MAX_IPADR_LEN, "%s", su->sun_path);
+      }
+      else
+        addr[0] = 0; /* socket with no name */
       *port = 0;
       return TRUE;
 #endif
@@ -673,54 +688,115 @@ bool Curl_getaddressinfo(struct sockaddr *sa, char *addr,
    connection */
 void Curl_updateconninfo(struct connectdata *conn, curl_socket_t sockfd)
 {
-  curl_socklen_t len;
-  struct Curl_sockaddr_storage ssrem;
-  struct Curl_sockaddr_storage ssloc;
-  struct Curl_easy *data = conn->data;
-
-  if(conn->socktype == SOCK_DGRAM)
-    /* there's no connection! */
+  if(conn->transport != TRNSPRT_TCP)
+    /* there's no TCP connection! */
     return;
 
+#if defined(HAVE_GETPEERNAME) || defined(HAVE_GETSOCKNAME)
   if(!conn->bits.reuse && !conn->bits.tcp_fastopen) {
-    len = sizeof(struct Curl_sockaddr_storage);
-    if(getpeername(sockfd, (struct sockaddr*) &ssrem, &len)) {
+    struct Curl_easy *data = conn->data;
+    char buffer[STRERROR_LEN];
+    struct Curl_sockaddr_storage ssrem;
+    struct Curl_sockaddr_storage ssloc;
+    curl_socklen_t plen;
+    curl_socklen_t slen;
+#ifdef HAVE_GETPEERNAME
+    plen = sizeof(struct Curl_sockaddr_storage);
+    if(getpeername(sockfd, (struct sockaddr*) &ssrem, &plen)) {
       int error = SOCKERRNO;
       failf(data, "getpeername() failed with errno %d: %s",
-            error, Curl_strerror(conn, error));
+            error, Curl_strerror(error, buffer, sizeof(buffer)));
       return;
     }
-
-    len = sizeof(struct Curl_sockaddr_storage);
+#endif
+#ifdef HAVE_GETSOCKNAME
+    slen = sizeof(struct Curl_sockaddr_storage);
     memset(&ssloc, 0, sizeof(ssloc));
-    if(getsockname(sockfd, (struct sockaddr*) &ssloc, &len)) {
+    if(getsockname(sockfd, (struct sockaddr*) &ssloc, &slen)) {
       int error = SOCKERRNO;
       failf(data, "getsockname() failed with errno %d: %s",
-            error, Curl_strerror(conn, error));
+            error, Curl_strerror(error, buffer, sizeof(buffer)));
       return;
     }
-
-    if(!Curl_getaddressinfo((struct sockaddr*)&ssrem,
-                            conn->primary_ip, &conn->primary_port)) {
+#endif
+#ifdef HAVE_GETPEERNAME
+    if(!Curl_addr2string((struct sockaddr*)&ssrem, plen,
+                         conn->primary_ip, &conn->primary_port)) {
       failf(data, "ssrem inet_ntop() failed with errno %d: %s",
-            errno, Curl_strerror(conn, errno));
+            errno, Curl_strerror(errno, buffer, sizeof(buffer)));
       return;
     }
     memcpy(conn->ip_addr_str, conn->primary_ip, MAX_IPADR_LEN);
-
-    if(!Curl_getaddressinfo((struct sockaddr*)&ssloc,
-                            conn->local_ip, &conn->local_port)) {
+#endif
+#ifdef HAVE_GETSOCKNAME
+    if(!Curl_addr2string((struct sockaddr*)&ssloc, slen,
+                         conn->local_ip, &conn->local_port)) {
       failf(data, "ssloc inet_ntop() failed with errno %d: %s",
-            errno, Curl_strerror(conn, errno));
+            errno, Curl_strerror(errno, buffer, sizeof(buffer)));
       return;
     }
-
+#endif
   }
+#else /* !HAVE_GETSOCKNAME && !HAVE_GETPEERNAME */
+  (void)sockfd; /* unused */
+#endif
 
   /* persist connection info in session handle */
   Curl_persistconninfo(conn);
 }
 
+/* after a TCP connection to the proxy has been verified, this function does
+   the next magic step.
+
+   Note: this function's sub-functions call failf()
+
+*/
+static CURLcode connected_proxy(struct connectdata *conn, int sockindex)
+{
+  CURLcode result = CURLE_OK;
+
+  if(conn->bits.socksproxy) {
+#ifndef CURL_DISABLE_PROXY
+    /* for the secondary socket (FTP), use the "connect to host"
+     * but ignore the "connect to port" (use the secondary port)
+     */
+    const char * const host = conn->bits.httpproxy ?
+                              conn->http_proxy.host.name :
+                              conn->bits.conn_to_host ?
+                              conn->conn_to_host.name :
+                              sockindex == SECONDARYSOCKET ?
+                              conn->secondaryhostname : conn->host.name;
+    const int port = conn->bits.httpproxy ? (int)conn->http_proxy.port :
+                     sockindex == SECONDARYSOCKET ? conn->secondary_port :
+                     conn->bits.conn_to_port ? conn->conn_to_port :
+                     conn->remote_port;
+    conn->bits.socksproxy_connecting = TRUE;
+    switch(conn->socks_proxy.proxytype) {
+    case CURLPROXY_SOCKS5:
+    case CURLPROXY_SOCKS5_HOSTNAME:
+      result = Curl_SOCKS5(conn->socks_proxy.user, conn->socks_proxy.passwd,
+                         host, port, sockindex, conn);
+      break;
+
+    case CURLPROXY_SOCKS4:
+    case CURLPROXY_SOCKS4A:
+      result = Curl_SOCKS4(conn->socks_proxy.user, host, port, sockindex,
+                           conn);
+      break;
+
+    default:
+      failf(conn->data, "unknown proxytype option given");
+      result = CURLE_COULDNT_CONNECT;
+    } /* switch proxytype */
+    conn->bits.socksproxy_connecting = FALSE;
+#else
+  (void)sockindex;
+#endif /* CURL_DISABLE_PROXY */
+  }
+
+  return result;
+}
+
 /*
  * Curl_is_connected() checks if the socket has connected.
  */
@@ -763,6 +839,24 @@ CURLcode Curl_is_connected(struct connectdata *conn,
     if(conn->tempsock[i] == CURL_SOCKET_BAD)
       continue;
 
+#ifdef ENABLE_QUIC
+    if(conn->transport == TRNSPRT_QUIC) {
+      result = Curl_quic_is_connected(conn, i, connected);
+      if(result) {
+        error = SOCKERRNO;
+        goto error;
+      }
+      if(*connected) {
+        /* use this socket from now on */
+        conn->sock[sockindex] = conn->tempsock[i];
+        conn->ip_addr = conn->tempaddr[i];
+        conn->tempsock[i] = CURL_SOCKET_BAD;
+        connkeep(conn, "HTTP/3 default");
+      }
+      return result;
+    }
+#endif
+
 #ifdef mpeix
     /* Call this function once now, and ignore the results. We do this to
        "clear" the error state on the socket so that we can later read it
@@ -776,8 +870,8 @@ CURLcode Curl_is_connected(struct connectdata *conn,
     if(rc == 0) { /* no connection yet */
       error = 0;
       if(Curl_timediff(now, conn->connecttime) >= conn->timeoutms_per_addr) {
-        infof(data, "After %ldms connect time, move on!\n",
-              conn->timeoutms_per_addr);
+        infof(data, "After %" CURL_FORMAT_TIMEDIFF_T
+              "ms connect time, move on!\n", conn->timeoutms_per_addr);
         error = ETIMEDOUT;
       }
 
@@ -807,7 +901,7 @@ CURLcode Curl_is_connected(struct connectdata *conn,
         }
 
         /* see if we need to do any proxy magic first once we connected */
-        result = Curl_connected_proxy(conn, sockindex);
+        result = connected_proxy(conn, sockindex);
         if(result)
           return result;
 
@@ -826,6 +920,9 @@ CURLcode Curl_is_connected(struct connectdata *conn,
     else if(rc & CURL_CSELECT_ERR)
       (void)verifyconnect(conn->tempsock[i], &error);
 
+#ifdef ENABLE_QUIC
+    error:
+#endif
     /*
      * The connection failed here, we should attempt to connect to the "next
      * address" for the given host. But first remember the latest error.
@@ -835,17 +932,21 @@ CURLcode Curl_is_connected(struct connectdata *conn,
       SET_SOCKERRNO(error);
       if(conn->tempaddr[i]) {
         CURLcode status;
+#ifndef CURL_DISABLE_VERBOSE_STRINGS
         char ipaddress[MAX_IPADR_LEN];
+        char buffer[STRERROR_LEN];
         Curl_printable_address(conn->tempaddr[i], ipaddress, MAX_IPADR_LEN);
+#endif
         infof(data, "connect to %s port %ld failed: %s\n",
-              ipaddress, conn->port, Curl_strerror(conn, error));
+              ipaddress, conn->port,
+              Curl_strerror(error, buffer, sizeof(buffer)));
 
         conn->timeoutms_per_addr = conn->tempaddr[i]->ai_next == NULL ?
-                                   allow : allow / 2;
+          allow : allow / 2;
 
         status = trynextip(conn, sockindex, i);
-        if(status != CURLE_COULDNT_CONNECT
-            || conn->tempsock[other] == CURL_SOCKET_BAD)
+        if((status != CURLE_COULDNT_CONNECT) ||
+           conn->tempsock[other] == CURL_SOCKET_BAD)
           /* the last attempt failed and no other sockets remain open */
           result = status;
       }
@@ -854,8 +955,8 @@ CURLcode Curl_is_connected(struct connectdata *conn,
 
   if(result) {
     /* no more addresses to try */
-
     const char *hostname;
+    char buffer[STRERROR_LEN];
 
     /* if the first address family runs out of addresses to try before
        the happy eyeball timeout, go ahead and try the next family now */
@@ -875,29 +976,37 @@ CURLcode Curl_is_connected(struct connectdata *conn,
       hostname = conn->host.name;
 
     failf(data, "Failed to connect to %s port %ld: %s",
-        hostname, conn->port, Curl_strerror(conn, error));
+          hostname, conn->port,
+          Curl_strerror(error, buffer, sizeof(buffer)));
+
+#ifdef WSAETIMEDOUT
+    if(WSAETIMEDOUT == data->state.os_errno)
+      result = CURLE_OPERATION_TIMEDOUT;
+#elif defined(ETIMEDOUT)
+    if(ETIMEDOUT == data->state.os_errno)
+      result = CURLE_OPERATION_TIMEDOUT;
+#endif
   }
 
   return result;
 }
 
-void Curl_tcpnodelay(struct connectdata *conn, curl_socket_t sockfd)
+static void tcpnodelay(struct connectdata *conn, curl_socket_t sockfd)
 {
 #if defined(TCP_NODELAY)
-#if !defined(CURL_DISABLE_VERBOSE_STRINGS)
-  struct Curl_easy *data = conn->data;
-#endif
   curl_socklen_t onoff = (curl_socklen_t) 1;
   int level = IPPROTO_TCP;
-
-#if defined(CURL_DISABLE_VERBOSE_STRINGS)
+#if !defined(CURL_DISABLE_VERBOSE_STRINGS)
+  struct Curl_easy *data = conn->data;
+  char buffer[STRERROR_LEN];
+#else
   (void) conn;
 #endif
 
   if(setsockopt(sockfd, level, TCP_NODELAY, (void *)&onoff,
                 sizeof(onoff)) < 0)
     infof(data, "Could not set TCP_NODELAY: %s\n",
-          Curl_strerror(conn, SOCKERRNO));
+          Curl_strerror(SOCKERRNO, buffer, sizeof(buffer)));
   else
     infof(data, "TCP_NODELAY set\n");
 #else
@@ -917,9 +1026,11 @@ static void nosigpipe(struct connectdata *conn,
   struct Curl_easy *data = conn->data;
   int onoff = 1;
   if(setsockopt(sockfd, SOL_SOCKET, SO_NOSIGPIPE, (void *)&onoff,
-                sizeof(onoff)) < 0)
+                sizeof(onoff)) < 0) {
+    char buffer[STRERROR_LEN];
     infof(data, "Could not set SO_NOSIGPIPE: %s\n",
-          Curl_strerror(conn, SOCKERRNO));
+          Curl_strerror(SOCKERRNO, buffer, sizeof(buffer)));
+  }
 }
 #else
 #define nosigpipe(x,y) Curl_nop_stmt
@@ -980,7 +1091,7 @@ void Curl_sndbufset(curl_socket_t sockfd)
  */
 static CURLcode singleipconnect(struct connectdata *conn,
                                 const Curl_addrinfo *ai,
-                                curl_socket_t *sockp)
+                                int sockindex)
 {
   struct Curl_sockaddr_ex addr;
   int rc = -1;
@@ -995,7 +1106,8 @@ static CURLcode singleipconnect(struct connectdata *conn,
 #ifdef TCP_FASTOPEN_CONNECT
   int optval = 1;
 #endif
-
+  char buffer[STRERROR_LEN];
+  curl_socket_t *sockp = &conn->tempsock[sockindex];
   *sockp = CURL_SOCKET_BAD;
 
   result = Curl_socket(conn, ai, &addr, &sockfd);
@@ -1006,15 +1118,15 @@ static CURLcode singleipconnect(struct connectdata *conn,
     return CURLE_OK;
 
   /* store remote address and port used in this connection attempt */
-  if(!Curl_getaddressinfo((struct sockaddr*)&addr.sa_addr,
-                          ipaddress, &port)) {
+  if(!Curl_addr2string((struct sockaddr*)&addr.sa_addr, addr.addrlen,
+                       ipaddress, &port)) {
     /* malformed address or bug in inet_ntop, try next address */
     failf(data, "sa_addr inet_ntop() failed with errno %d: %s",
-          errno, Curl_strerror(conn, errno));
+          errno, Curl_strerror(errno, buffer, sizeof(buffer)));
     Curl_closesocket(conn, sockfd);
     return CURLE_OK;
   }
-  infof(data, "  Trying %s...\n", ipaddress);
+  infof(data, "  Trying %s:%ld...\n", ipaddress, port);
 
 #ifdef ENABLE_IPV6
   is_tcp = (addr.family == AF_INET || addr.family == AF_INET6) &&
@@ -1023,7 +1135,7 @@ static CURLcode singleipconnect(struct connectdata *conn,
   is_tcp = (addr.family == AF_INET) && addr.socktype == SOCK_STREAM;
 #endif
   if(is_tcp && data->set.tcp_nodelay)
-    Curl_tcpnodelay(conn, sockfd);
+    tcpnodelay(conn, sockfd);
 
   nosigpipe(conn, sockfd);
 
@@ -1074,8 +1186,8 @@ static CURLcode singleipconnect(struct connectdata *conn,
   if(conn->num_addr > 1)
     Curl_expire(data, conn->timeoutms_per_addr, EXPIRE_DNS_PER_NAME);
 
-  /* Connect TCP sockets, bind UDP */
-  if(!isconnected && (conn->socktype == SOCK_STREAM)) {
+  /* Connect TCP and QUIC sockets */
+  if(!isconnected && (conn->transport != TRNSPRT_UDP)) {
     if(conn->bits.tcp_fastopen) {
 #if defined(CONNECT_DATA_IDEMPOTENT) /* Darwin */
 #  if defined(HAVE_BUILTIN_AVAILABLE)
@@ -1121,6 +1233,16 @@ static CURLcode singleipconnect(struct connectdata *conn,
 
     if(-1 == rc)
       error = SOCKERRNO;
+#ifdef ENABLE_QUIC
+    else if(conn->transport == TRNSPRT_QUIC) {
+      /* pass in 'sockfd' separately since it hasn't been put into the
+         tempsock array at this point */
+      result = Curl_quic_connect(conn, sockfd, sockindex,
+                                 &addr.sa_addr, addr.addrlen);
+      if(result)
+        error = SOCKERRNO;
+    }
+#endif
   }
   else {
     *sockp = sockfd;
@@ -1146,7 +1268,7 @@ static CURLcode singleipconnect(struct connectdata *conn,
     default:
       /* unknown error, fallthrough and try another address! */
       infof(data, "Immediate connect fail for %s: %s\n",
-            ipaddress, Curl_strerror(conn, error));
+            ipaddress, Curl_strerror(error, buffer, sizeof(buffer)));
       data->state.os_errno = error;
 
       /* connect failed */
@@ -1194,7 +1316,7 @@ CURLcode Curl_connecthost(struct connectdata *conn,  /* context */
 
   /* start connecting to first IP */
   while(conn->tempaddr[0]) {
-    result = singleipconnect(conn, conn->tempaddr[0], &(conn->tempsock[0]));
+    result = singleipconnect(conn, conn->tempaddr[0], 0);
     if(!result)
       break;
     conn->tempaddr[0] = conn->tempaddr[0]->ai_next;
@@ -1314,7 +1436,7 @@ int Curl_closesocket(struct connectdata *conn,
       conn->sock_accepted[SECONDARYSOCKET] = FALSE;
     else {
       int rc;
-      Curl_multi_closed(conn, sock);
+      Curl_multi_closed(conn->data, sock);
       Curl_set_in_callback(conn->data, true);
       rc = conn->fclosesocket(conn->closesocket_client, sock);
       Curl_set_in_callback(conn->data, false);
@@ -1324,7 +1446,7 @@ int Curl_closesocket(struct connectdata *conn,
 
   if(conn)
     /* tell the multi-socket code about this */
-    Curl_multi_closed(conn, sock);
+    Curl_multi_closed(conn->data, sock);
 
   sclose(sock);
 
@@ -1361,8 +1483,9 @@ CURLcode Curl_socket(struct connectdata *conn,
    */
 
   addr->family = ai->ai_family;
-  addr->socktype = conn->socktype;
-  addr->protocol = conn->socktype == SOCK_DGRAM?IPPROTO_UDP:ai->ai_protocol;
+  addr->socktype = (conn->transport == TRNSPRT_TCP) ? SOCK_STREAM : SOCK_DGRAM;
+  addr->protocol = conn->transport != TRNSPRT_TCP ? IPPROTO_UDP :
+    ai->ai_protocol;
   addr->addrlen = ai->ai_addrlen;
 
   if(addr->addrlen > sizeof(struct Curl_sockaddr_storage))
@@ -1393,6 +1516,11 @@ CURLcode Curl_socket(struct connectdata *conn,
     /* no socket, no connection */
     return CURLE_COULDNT_CONNECT;
 
+  if(conn->transport == TRNSPRT_QUIC) {
+    /* QUIC sockets need to be nonblocking */
+    (void)curlx_nonblock(*sockfd, TRUE);
+  }
+
 #if defined(ENABLE_IPV6) && defined(HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID)
   if(conn->scope_id && (addr->family == AF_INET6)) {
     struct sockaddr_in6 * const sa6 = (void *)&addr->sa_addr;
@@ -1420,7 +1548,7 @@ void Curl_conncontrol(struct connectdata *conn,
   if((ctrl == CONNCTRL_STREAM) &&
      (conn->handler->flags & PROTOPT_STREAM))
     DEBUGF(infof(conn->data, "Kill stream: %s\n", reason));
-  else if(closeit != conn->bits.close) {
+  else if((bit)closeit != conn->bits.close) {
     DEBUGF(infof(conn->data, "Marked for [%s]: %s\n",
                  closeit?"closure":"keep alive", reason));
     conn->bits.close = closeit; /* the only place in the source code that
index 193dc63..b23085a 100644 (file)
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -51,6 +51,9 @@ timediff_t Curl_timeleft(struct Curl_easy *data,
 curl_socket_t Curl_getconnectinfo(struct Curl_easy *data,
                                   struct connectdata **connp);
 
+bool Curl_addr2string(struct sockaddr *sa, curl_socklen_t salen,
+                      char *addr, long *port);
+
 /*
  * Check if a connection seems to be alive.
  */
@@ -76,11 +79,6 @@ void Curl_persistconninfo(struct connectdata *conn);
 int Curl_closesocket(struct connectdata *conn, curl_socket_t sock);
 
 /*
- * Get presentation format IP address and port from a sockaddr.
- */
-bool Curl_getaddressinfo(struct sockaddr *sa, char *addr, long *port);
-
-/*
  * The Curl_sockaddr_ex structure is basically libcurl's external API
  * curl_sockaddr structure with enough space available to directly hold any
  * protocol-specific address structures. The variable declared here will be
@@ -111,8 +109,6 @@ CURLcode Curl_socket(struct connectdata *conn,
                      struct Curl_sockaddr_ex *addr,
                      curl_socket_t *sockfd);
 
-void Curl_tcpnodelay(struct connectdata *conn, curl_socket_t sockfd);
-
 /*
  * Curl_conncontrol() marks the end of a connection/stream. The 'closeit'
  * argument specifies if it is the end of a connection or a stream.
index 5b7ab66..0091132 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -93,8 +93,10 @@ Example set of cookies:
 #include "share.h"
 #include "strtoofft.h"
 #include "strcase.h"
+#include "curl_get_line.h"
 #include "curl_memrchr.h"
 #include "inet_pton.h"
+#include "parsedate.h"
 
 /* The last 3 #include files should be in this order */
 #include "curl_printf.h"
@@ -223,7 +225,7 @@ static bool pathmatch(const char *cookie_path, const char *request_uri)
     goto pathmatched;
   }
 
-  /* here, cookie_path_len < url_path_len */
+  /* here, cookie_path_len < uri_path_len */
   if(uri_path[cookie_path_len] == '/') {
     ret = TRUE;
     goto pathmatched;
@@ -433,9 +435,10 @@ Curl_cookie_add(struct Curl_easy *data,
                 bool noexpire, /* if TRUE, skip remove_expired() */
                 char *lineptr,   /* first character of the line */
                 const char *domain, /* default domain */
-                const char *path)   /* full path used when this cookie is set,
+                const char *path,   /* full path used when this cookie is set,
                                        used to get default path for the cookie
                                        unless set */
+                bool secure)  /* TRUE if connection is over secure origin */
 {
   struct Cookie *clist;
   struct Cookie *co;
@@ -527,6 +530,19 @@ Curl_cookie_add(struct Curl_easy *data,
         while(*whatptr && ISBLANK(*whatptr))
           whatptr++;
 
+        /*
+         * Check if we have a reserved prefix set before anything else, as we
+         * otherwise have to test for the prefix in both the cookie name and
+         * "the rest". Prefixes must start with '__' and end with a '-', so
+         * only test for names where that can possibly be true.
+         */
+        if(nlen > 3 && name[0] == '_' && name[1] == '_') {
+          if(strncasecompare("__Secure-", name, 9))
+            co->prefix |= COOKIE_PREFIX__SECURE;
+          else if(strncasecompare("__Host-", name, 7))
+            co->prefix |= COOKIE_PREFIX__HOST;
+        }
+
         if(!co->name) {
           /* The very first name/value pair is the actual cookie name */
           if(!sep) {
@@ -546,8 +562,20 @@ Curl_cookie_add(struct Curl_easy *data,
           /* this was a "<name>=" with no content, and we must allow
              'secure' and 'httponly' specified this weirdly */
           done = TRUE;
-          if(strcasecompare("secure", name))
-            co->secure = TRUE;
+          /*
+           * secure cookies are only allowed to be set when the connection is
+           * using a secure protocol, or when the cookie is being set by
+           * reading from file
+           */
+          if(strcasecompare("secure", name)) {
+            if(secure || !c->running) {
+              co->secure = TRUE;
+            }
+            else {
+              badcookie = TRUE;
+              break;
+            }
+          }
           else if(strcasecompare("httponly", name))
             co->httponly = TRUE;
           else if(sep)
@@ -675,7 +703,10 @@ Curl_cookie_add(struct Curl_easy *data,
         /* overflow, used max value */
         co->expires = CURL_OFF_T_MAX;
       else if(!offt) {
-        if(CURL_OFF_T_MAX - now < co->expires)
+        if(!co->expires)
+          /* already expired */
+          co->expires = 1;
+        else if(CURL_OFF_T_MAX - now < co->expires)
           /* would overflow */
           co->expires = CURL_OFF_T_MAX;
         else
@@ -685,7 +716,7 @@ Curl_cookie_add(struct Curl_easy *data,
     else if(co->expirestr) {
       /* Note that if the date couldn't get parsed for whatever reason,
          the cookie will be treated as a session cookie */
-      co->expires = curl_getdate(co->expirestr, NULL);
+      co->expires = Curl_getdate_capped(co->expirestr);
 
       /* Session cookies have expires set to 0 so if we get that back
          from the date parser let's add a second to make it a
@@ -789,22 +820,14 @@ Curl_cookie_add(struct Curl_easy *data,
           badcookie = TRUE;
         break;
       case 1:
-        /* This field got its explanation on the 23rd of May 2001 by
-           Andrés García:
-
-           flag: A TRUE/FALSE value indicating if all machines within a given
-           domain can access the variable. This value is set automatically by
-           the browser, depending on the value you set for the domain.
-
-           As far as I can see, it is set to true when the cookie says
+        /* flag: A TRUE/FALSE value indicating if all machines within a given
+           domain can access the variable. Set TRUE when the cookie says
            .domain.com and to false when the domain is complete www.domain.com
         */
         co->tailmatch = strcasecompare(ptr, "TRUE")?TRUE:FALSE;
         break;
       case 2:
-        /* It turns out, that sometimes the file format allows the path
-           field to remain not filled in, we try to detect this and work
-           around it! Andrés García made us aware of this... */
+        /* The file format allows the path field to remain not filled in */
         if(strcmp("TRUE", ptr) && strcmp("FALSE", ptr)) {
           /* only if the path doesn't look like a boolean option! */
           co->path = strdup(ptr);
@@ -828,7 +851,13 @@ Curl_cookie_add(struct Curl_easy *data,
         fields++; /* add a field and fall down to secure */
         /* FALLTHROUGH */
       case 3:
-        co->secure = strcasecompare(ptr, "TRUE")?TRUE:FALSE;
+        co->secure = FALSE;
+        if(strcasecompare(ptr, "TRUE")) {
+          if(secure || c->running)
+            co->secure = TRUE;
+          else
+            badcookie = TRUE;
+        }
         break;
       case 4:
         if(curlx_strtoofft(ptr, NULL, 10, &co->expires))
@@ -838,6 +867,13 @@ Curl_cookie_add(struct Curl_easy *data,
         co->name = strdup(ptr);
         if(!co->name)
           badcookie = TRUE;
+        else {
+          /* For Netscape file format cookies we check prefix on the name */
+          if(strncasecompare("__Secure-", co->name, 9))
+            co->prefix |= COOKIE_PREFIX__SECURE;
+          else if(strncasecompare("__Host-", co->name, 7))
+            co->prefix |= COOKIE_PREFIX__HOST;
+        }
         break;
       case 6:
         co->value = strdup(ptr);
@@ -866,6 +902,26 @@ Curl_cookie_add(struct Curl_easy *data,
 
   }
 
+  if(co->prefix & COOKIE_PREFIX__SECURE) {
+    /* The __Secure- prefix only requires that the cookie be set secure */
+    if(!co->secure) {
+      freecookie(co);
+      return NULL;
+    }
+  }
+  if(co->prefix & COOKIE_PREFIX__HOST) {
+    /*
+     * The __Host- prefix requires the cookie to be secure, have a "/" path
+     * and not have a domain set.
+     */
+    if(co->secure && co->path && strcmp(co->path, "/") == 0 && !co->tailmatch)
+      ;
+    else {
+      freecookie(co);
+      return NULL;
+    }
+  }
+
   if(!c->running &&    /* read from a file */
      c->newsession &&  /* clean session cookies */
      !co->expires) {   /* this is a session cookie since it doesn't expire! */
@@ -926,9 +982,31 @@ Curl_cookie_add(struct Curl_easy *data,
         /* the domains were identical */
 
         if(clist->spath && co->spath) {
-          if(strcasecompare(clist->spath, co->spath)) {
-            replace_old = TRUE;
+          if(clist->secure && !co->secure && !secure) {
+            size_t cllen;
+            const char *sep;
+
+            /*
+             * A non-secure cookie may not overlay an existing secure cookie.
+             * For an existing cookie "a" with path "/login", refuse a new
+             * cookie "a" with for example path "/login/en", while the path
+             * "/loginhelper" is ok.
+             */
+
+            sep = strchr(clist->spath + 1, '/');
+
+            if(sep)
+              cllen = sep - clist->spath;
+            else
+              cllen = strlen(clist->spath);
+
+            if(strncasecompare(clist->spath, co->spath, cllen)) {
+              freecookie(co);
+              return NULL;
+            }
           }
+          else if(strcasecompare(clist->spath, co->spath))
+            replace_old = TRUE;
           else
             replace_old = FALSE;
         }
@@ -1003,33 +1081,6 @@ Curl_cookie_add(struct Curl_easy *data,
   return co;
 }
 
-/*
- * get_line() makes sure to only return complete whole lines that fit in 'len'
- * bytes and end with a newline.
- */
-static char *get_line(char *buf, int len, FILE *input)
-{
-  bool partial = FALSE;
-  while(1) {
-    char *b = fgets(buf, len, input);
-    if(b) {
-      size_t rlen = strlen(b);
-      if(rlen && (b[rlen-1] == '\n')) {
-        if(partial) {
-          partial = FALSE;
-          continue;
-        }
-        return b;
-      }
-      /* read a partial, discard the next piece that ends with newline */
-      partial = TRUE;
-    }
-    else
-      break;
-  }
-  return NULL;
-}
-
 
 /*****************************************************************************
  *
@@ -1040,6 +1091,8 @@ static char *get_line(char *buf, int len, FILE *input)
  *
  * If 'newsession' is TRUE, discard all "session cookies" on read from file.
  *
+ * Note that 'data' might be called as NULL pointer.
+ *
  * Returns NULL on out of memory. Invalid cookies are ignored.
  ****************************************************************************/
 struct CookieInfo *Curl_cookie_init(struct Curl_easy *data,
@@ -1087,7 +1140,7 @@ struct CookieInfo *Curl_cookie_init(struct Curl_easy *data,
     line = malloc(MAX_COOKIE_LINE);
     if(!line)
       goto fail;
-    while(get_line(line, MAX_COOKIE_LINE, fp)) {
+    while(Curl_get_line(line, MAX_COOKIE_LINE, fp)) {
       if(checkprefix("Set-Cookie:", line)) {
         /* This is a cookie line, get it! */
         lineptr = &line[11];
@@ -1100,7 +1153,7 @@ struct CookieInfo *Curl_cookie_init(struct Curl_easy *data,
       while(*lineptr && ISBLANK(*lineptr))
         lineptr++;
 
-      Curl_cookie_add(data, c, headerline, TRUE, lineptr, NULL, NULL);
+      Curl_cookie_add(data, c, headerline, TRUE, lineptr, NULL, NULL, TRUE);
     }
     free(line); /* free the line buffer */
     remove_expired(c); /* run this once, not on every cookie */
@@ -1110,6 +1163,8 @@ struct CookieInfo *Curl_cookie_init(struct Curl_easy *data,
   }
 
   c->running = TRUE;          /* now, we're running */
+  if(data)
+    data->state.cookie_engine = TRUE;
 
   return c;
 
@@ -1451,27 +1506,14 @@ static int cookie_output(struct CookieInfo *c, const char *dumphere)
   struct Cookie *co;
   FILE *out;
   bool use_stdout = FALSE;
-  char *format_ptr;
-  unsigned int i;
-  unsigned int j;
-  struct Cookie **array;
 
-  if((NULL == c) || (0 == c->numcookies))
-    /* If there are no known cookies, we don't write or even create any
-       destination file */
+  if(!c)
+    /* no cookie engine alive */
     return 0;
 
   /* at first, remove expired cookies */
   remove_expired(c);
 
-  /* make sure we still have cookies after expiration */
-  if(0 == c->numcookies)
-    return 0;
-
-  array = malloc(sizeof(struct Cookie *) * c->numcookies);
-  if(!array)
-    return 1;
-
   if(!strcmp("-", dumphere)) {
     /* use stdout */
     out = stdout;
@@ -1480,7 +1522,6 @@ static int cookie_output(struct CookieInfo *c, const char *dumphere)
   else {
     out = fopen(dumphere, FOPEN_WRITETEXT);
     if(!out) {
-      free(array);
       return 1; /* failure */
     }
   }
@@ -1490,32 +1531,44 @@ static int cookie_output(struct CookieInfo *c, const char *dumphere)
         "# This file was generated by libcurl! Edit at your own risk.\n\n",
         out);
 
-  j = 0;
-  for(i = 0; i < COOKIE_HASH_SIZE; i++) {
-    for(co = c->cookies[i]; co; co = co->next) {
-      if(!co->domain)
-        continue;
-      array[j++] = co;
-    }
-  }
-
-  qsort(array, c->numcookies, sizeof(struct Cookie *), cookie_sort_ct);
+  if(c->numcookies) {
+    unsigned int i;
+    size_t nvalid = 0;
+    struct Cookie **array;
 
-  for(i = 0; i < j; i++) {
-    format_ptr = get_netscape_format(array[i]);
-    if(format_ptr == NULL) {
-      fprintf(out, "#\n# Fatal libcurl error\n");
-      free(array);
+    array = calloc(1, sizeof(struct Cookie *) * c->numcookies);
+    if(!array) {
       if(!use_stdout)
         fclose(out);
       return 1;
     }
-    fprintf(out, "%s\n", format_ptr);
-    free(format_ptr);
-  }
 
-  free(array);
+    /* only sort the cookies with a domain property */
+    for(i = 0; i < COOKIE_HASH_SIZE; i++) {
+      for(co = c->cookies[i]; co; co = co->next) {
+        if(!co->domain)
+          continue;
+        array[nvalid++] = co;
+      }
+    }
+
+    qsort(array, nvalid, sizeof(struct Cookie *), cookie_sort_ct);
 
+    for(i = 0; i < nvalid; i++) {
+      char *format_ptr = get_netscape_format(array[i]);
+      if(format_ptr == NULL) {
+        fprintf(out, "#\n# Fatal libcurl error\n");
+        free(array);
+        if(!use_stdout)
+          fclose(out);
+        return 1;
+      }
+      fprintf(out, "%s\n", format_ptr);
+      free(format_ptr);
+    }
+
+    free(array);
+  }
   if(!use_stdout)
     fclose(out);
 
@@ -1565,7 +1618,7 @@ struct curl_slist *Curl_cookie_list(struct Curl_easy *data)
   return list;
 }
 
-void Curl_flush_cookies(struct Curl_easy *data, int cleanup)
+void Curl_flush_cookies(struct Curl_easy *data, bool cleanup)
 {
   if(data->set.str[STRING_COOKIEJAR]) {
     if(data->change.cookielist) {
@@ -1594,6 +1647,7 @@ void Curl_flush_cookies(struct Curl_easy *data, int cleanup)
 
   if(cleanup && (!data->share || (data->cookies != data->share->cookies))) {
     Curl_cookie_cleanup(data->cookies);
+    data->cookies = NULL;
   }
   Curl_share_unlock(data, CURL_LOCK_DATA_COOKIE);
 }
index a9f90ca..b3865e6 100644 (file)
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -44,8 +44,16 @@ struct Cookie {
   bool livecookie;   /* updated from a server, not a stored file */
   bool httponly;     /* true if the httponly directive is present */
   int creationtime;  /* time when the cookie was written */
+  unsigned char prefix; /* bitmap fields indicating which prefix are set */
 };
 
+/*
+ * Available cookie prefixes, as defined in
+ * draft-ietf-httpbis-rfc6265bis-02
+ */
+#define COOKIE_PREFIX__SECURE (1<<0)
+#define COOKIE_PREFIX__HOST (1<<1)
+
 #define COOKIE_HASH_SIZE 256
 
 struct CookieInfo {
@@ -85,7 +93,8 @@ struct Curl_easy;
 struct Cookie *Curl_cookie_add(struct Curl_easy *data,
                                struct CookieInfo *, bool header, bool noexpiry,
                                char *lineptr,
-                               const char *domain, const char *path);
+                               const char *domain, const char *path,
+                               bool secure);
 
 struct Cookie *Curl_cookie_getlist(struct CookieInfo *, const char *,
                                    const char *, bool);
@@ -100,7 +109,7 @@ void Curl_cookie_clearsess(struct CookieInfo *cookies);
 #define Curl_cookie_cleanup(x) Curl_nop_stmt
 #define Curl_flush_cookies(x,y) Curl_nop_stmt
 #else
-void Curl_flush_cookies(struct Curl_easy *data, int cleanup);
+void Curl_flush_cookies(struct Curl_easy *data, bool cleanup);
 void Curl_cookie_cleanup(struct CookieInfo *);
 struct CookieInfo *Curl_cookie_init(struct Curl_easy *data,
                                     const char *, struct CookieInfo *, bool);
index fd49679..16c4779 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -539,7 +539,7 @@ Curl_addrinfo *Curl_unix2addr(const char *path, bool *longpath, bool abstract)
 #if defined(CURLDEBUG) && defined(HAVE_GETADDRINFO) &&  \
   defined(HAVE_FREEADDRINFO)
 /*
- * curl_dofreeaddrinfo()
+ * curl_dbg_freeaddrinfo()
  *
  * This is strictly for memory tracing and are using the same style as the
  * family otherwise present in memdebug.c. I put these ones here since they
@@ -547,23 +547,23 @@ Curl_addrinfo *Curl_unix2addr(const char *path, bool *longpath, bool abstract)
  */
 
 void
-curl_dofreeaddrinfo(struct addrinfo *freethis,
-                    int line, const char *source)
+curl_dbg_freeaddrinfo(struct addrinfo *freethis,
+                      int line, const char *source)
 {
+  curl_dbg_log("ADDR %s:%d freeaddrinfo(%p)\n",
+               source, line, (void *)freethis);
 #ifdef USE_LWIPSOCK
   lwip_freeaddrinfo(freethis);
 #else
   (freeaddrinfo)(freethis);
 #endif
-  curl_memlog("ADDR %s:%d freeaddrinfo(%p)\n",
-              source, line, (void *)freethis);
 }
 #endif /* defined(CURLDEBUG) && defined(HAVE_FREEADDRINFO) */
 
 
 #if defined(CURLDEBUG) && defined(HAVE_GETADDRINFO)
 /*
- * curl_dogetaddrinfo()
+ * curl_dbg_getaddrinfo()
  *
  * This is strictly for memory tracing and are using the same style as the
  * family otherwise present in memdebug.c. I put these ones here since they
@@ -571,11 +571,11 @@ curl_dofreeaddrinfo(struct addrinfo *freethis,
  */
 
 int
-curl_dogetaddrinfo(const char *hostname,
-                   const char *service,
-                   const struct addrinfo *hints,
-                   struct addrinfo **result,
-                   int line, const char *source)
+curl_dbg_getaddrinfo(const char *hostname,
+                    const char *service,
+                    const struct addrinfo *hints,
+                    struct addrinfo **result,
+                    int line, const char *source)
 {
 #ifdef USE_LWIPSOCK
   int res = lwip_getaddrinfo(hostname, service, hints, result);
@@ -584,11 +584,11 @@ curl_dogetaddrinfo(const char *hostname,
 #endif
   if(0 == res)
     /* success */
-    curl_memlog("ADDR %s:%d getaddrinfo() = %p\n",
-                source, line, (void *)*result);
+    curl_dbg_log("ADDR %s:%d getaddrinfo() = %p\n",
+                 source, line, (void *)*result);
   else
-    curl_memlog("ADDR %s:%d getaddrinfo() failed\n",
-                source, line);
+    curl_dbg_log("ADDR %s:%d getaddrinfo() failed\n",
+                 source, line);
   return res;
 }
 #endif /* defined(CURLDEBUG) && defined(HAVE_GETADDRINFO) */
index 8f6f3d1..205e121 100644 (file)
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -86,17 +86,14 @@ Curl_addrinfo *Curl_unix2addr(const char *path, bool *longpath, bool abstract);
 #if defined(CURLDEBUG) && defined(HAVE_GETADDRINFO) && \
     defined(HAVE_FREEADDRINFO)
 void
-curl_dofreeaddrinfo(struct addrinfo *freethis,
-                    int line, const char *source);
+curl_dbg_freeaddrinfo(struct addrinfo *freethis, int line, const char *source);
 #endif
 
 #if defined(CURLDEBUG) && defined(HAVE_GETADDRINFO)
 int
-curl_dogetaddrinfo(const char *hostname,
-                   const char *service,
-                   const struct addrinfo *hints,
-                   struct addrinfo **result,
-                   int line, const char *source);
+curl_dbg_getaddrinfo(const char *hostname, const char *service,
+                     const struct addrinfo *hints, struct addrinfo **result,
+                     int line, const char *source);
 #endif
 
 #ifdef HAVE_GETADDRINFO
index 7e9fc26..cfb6ee7 100644 (file)
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
index 5308eb5..2c3b656 100644 (file)
 /* Define to 1 if you have the <dlfcn.h> header file. */
 #cmakedefine HAVE_DLFCN_H 1
 
-/* Define to 1 if you have the `ENGINE_load_builtin_engines' function. */
-#cmakedefine HAVE_ENGINE_LOAD_BUILTIN_ENGINES 1
-
 /* Define to 1 if you have the <errno.h> header file. */
 #cmakedefine HAVE_ERRNO_H 1
 
 /* Define to 1 if you have the `getprotobyname' function. */
 #cmakedefine HAVE_GETPROTOBYNAME 1
 
+/* Define to 1 if you have the `getpeername' function. */
+#cmakedefine HAVE_GETPEERNAME 1
+
+/* Define to 1 if you have the `getsockname' function. */
+#cmakedefine HAVE_GETSOCKNAME 1
+
+/* Define to 1 if you have the `if_nametoindex' function. */
+#cmakedefine HAVE_IF_NAMETOINDEX 1
+
 /* Define to 1 if you have the `getpwuid' function. */
 #cmakedefine HAVE_GETPWUID 1
 
 /* Define to 1 if you have the <libssh2.h> header file. */
 #cmakedefine HAVE_LIBSSH2_H 1
 
-/* Define to 1 if you have the `ssl' library (-lssl). */
-#cmakedefine HAVE_LIBSSL 1
-
 /* if zlib is available */
 #cmakedefine HAVE_LIBZ 1
 
 /* Define to 1 if you have the `socket' function. */
 #cmakedefine HAVE_SOCKET 1
 
-/* Define to 1 if you have the `SSL_get_shutdown' function. */
-#cmakedefine HAVE_SSL_GET_SHUTDOWN 1
-
 /* Define to 1 if you have the <ssl.h> header file. */
 #cmakedefine HAVE_SSL_H 1
 
 /* Define to the function return type for send. */
 #cmakedefine SEND_TYPE_RETV ${SEND_TYPE_RETV}
 
+/*
+ Note: SIZEOF_* variables are fetched with CMake through check_type_size().
+ As per CMake documentation on CheckTypeSize, C preprocessor code is
+ generated by CMake into SIZEOF_*_CODE. This is what we use in the
+ following statements.
+
+ Reference: https://cmake.org/cmake/help/latest/module/CheckTypeSize.html
+*/
+
 /* The size of `int', as computed by sizeof. */
-#cmakedefine SIZEOF_INT ${SIZEOF_INT}
+${SIZEOF_INT_CODE}
 
 /* The size of `short', as computed by sizeof. */
-#cmakedefine SIZEOF_SHORT ${SIZEOF_SHORT}
+${SIZEOF_SHORT_CODE}
 
 /* The size of `long', as computed by sizeof. */
-#cmakedefine SIZEOF_LONG ${SIZEOF_LONG}
+${SIZEOF_LONG_CODE}
 
 /* The size of `off_t', as computed by sizeof. */
-#cmakedefine SIZEOF_OFF_T ${SIZEOF_OFF_T}
+${SIZEOF_OFF_T_CODE}
 
 /* The size of `curl_off_t', as computed by sizeof. */
-#cmakedefine SIZEOF_CURL_OFF_T ${SIZEOF_CURL_OFF_T}
+${SIZEOF_CURL_OFF_T_CODE}
 
 /* The size of `size_t', as computed by sizeof. */
-#cmakedefine SIZEOF_SIZE_T ${SIZEOF_SIZE_T}
+${SIZEOF_SIZE_T_CODE}
 
 /* The size of `time_t', as computed by sizeof. */
-#cmakedefine SIZEOF_TIME_T ${SIZEOF_TIME_T}
+${SIZEOF_TIME_T_CODE}
 
 /* Define to 1 if you have the ANSI C header files. */
 #cmakedefine STDC_HEADERS 1
 /* if PolarSSL is enabled */
 #cmakedefine USE_POLARSSL 1
 
-/* if DarwinSSL is enabled */
-#cmakedefine USE_DARWINSSL 1
+/* if Secure Transport is enabled */
+#cmakedefine USE_SECTRANSP 1
 
 /* if mbedTLS is enabled */
 #cmakedefine USE_MBEDTLS 1
 
+/* if BearSSL is enabled */
+#cmakedefine USE_BEARSSL 1
+
 /* if libSSH2 is in use */
 #cmakedefine USE_LIBSSH2 1
 
 /* if NSS is enabled */
 #cmakedefine USE_NSS 1
 
+/* if you have the PK11_CreateManagedGenericObject function */
+#cmakedefine HAVE_PK11_CREATEMANAGEDGENERICOBJECT 1
+
 /* if you want to use OpenLDAP code instead of legacy ldap implementation */
 #cmakedefine USE_OPENLDAP 1
 
index 477d61e..bb7f4e3 100644 (file)
@@ -24,6 +24,9 @@
 /* to disable DICT */
 #undef CURL_DISABLE_DICT
 
+/* disable DoH */
+#undef CURL_DISABLE_DOH
+
 /* to disable FILE */
 #undef CURL_DISABLE_FILE
 
@@ -36,6 +39,9 @@
 /* to disable HTTP */
 #undef CURL_DISABLE_HTTP
 
+/* disable HTTP authentication */
+#undef CURL_DISABLE_HTTP_AUTH
+
 /* to disable IMAP */
 #undef CURL_DISABLE_IMAP
 
 /* to disable --libcurl C code generation option */
 #undef CURL_DISABLE_LIBCURL_OPTION
 
+/* disable mime API */
+#undef CURL_DISABLE_MIME
+
+/* disable netrc parsing */
+#undef CURL_DISABLE_NETRC
+
 /* if the OpenSSL configuration won't be loaded automatically */
 #undef CURL_DISABLE_OPENSSL_AUTO_LOAD_CONFIG
 
+/* disable date parsing */
+#undef CURL_DISABLE_PARSEDATE
+
 /* to disable POP3 */
 #undef CURL_DISABLE_POP3
 
+/* disable progress-meter */
+#undef CURL_DISABLE_PROGRESS_METER
+
 /* to disable proxies */
 #undef CURL_DISABLE_PROXY
 
 /* to disable RTSP */
 #undef CURL_DISABLE_RTSP
 
+/* disable DNS shuffling */
+#undef CURL_DISABLE_SHUFFLE_DNS
+
 /* to disable SMB/CIFS */
 #undef CURL_DISABLE_SMB
 
@@ -72,9 +93,6 @@
 /* to disable TFTP */
 #undef CURL_DISABLE_TFTP
 
-/* to disable TLS-SRP authentication */
-#undef CURL_DISABLE_TLS_SRP
-
 /* to disable verbose strings */
 #undef CURL_DISABLE_VERBOSE_STRINGS
 
 /* Define to 1 if you have the <crypto.h> header file. */
 #undef HAVE_CRYPTO_H
 
-/* Define to 1 if you have the `CyaSSL_CTX_UseSupportedCurve' function. */
-#undef HAVE_CYASSL_CTX_USESUPPORTEDCURVE
-
-/* Define to 1 if you have the <cyassl/error-ssl.h> header file. */
-#undef HAVE_CYASSL_ERROR_SSL_H
-
-/* Define to 1 if you have the `CyaSSL_get_peer_certificate' function. */
-#undef HAVE_CYASSL_GET_PEER_CERTIFICATE
-
-/* Define to 1 if you have the <cyassl/options.h> header file. */
-#undef HAVE_CYASSL_OPTIONS_H
-
 /* Define to 1 if you have the declaration of `getpwuid_r', and to 0 if you
    don't. */
 #undef HAVE_DECL_GETPWUID_R
 /* Define to 1 if you have the <dlfcn.h> header file. */
 #undef HAVE_DLFCN_H
 
-/* Define to 1 if you have the `ENGINE_cleanup' function. */
-#undef HAVE_ENGINE_CLEANUP
-
 /* Define to 1 if you have the <errno.h> header file. */
 #undef HAVE_ERRNO_H
 
 /* Define to 1 if you have a working fcntl O_NONBLOCK function. */
 #undef HAVE_FCNTL_O_NONBLOCK
 
-/* Define to 1 if you have the fdopen function. */
-#undef HAVE_FDOPEN
-
 /* Define to 1 if you have the `fnmatch' function. */
 #undef HAVE_FNMATCH
 
 /* Define to 1 if you have the `getpass_r' function. */
 #undef HAVE_GETPASS_R
 
+/* Define to 1 if you have the getpeername function. */
+#undef HAVE_GETPEERNAME
+
 /* Define to 1 if you have the `getppid' function. */
 #undef HAVE_GETPPID
 
 /* Define to 1 if you have the getservbyport_r function. */
 #undef HAVE_GETSERVBYPORT_R
 
+/* Define to 1 if you have the getsockname function. */
+#undef HAVE_GETSOCKNAME
+
 /* Define to 1 if you have the `gettimeofday' function. */
 #undef HAVE_GETTIMEOFDAY
 
 /* Define to 1 if you have the <nghttp2/nghttp2.h> header file. */
 #undef HAVE_NGHTTP2_NGHTTP2_H
 
+/* Define to 1 if you have the <nghttp3/nghttp3.h> header file. */
+#undef HAVE_NGHTTP3_NGHTTP3_H
+
+/* Define to 1 if you have the <ngtcp2/ngtcp2_crypto.h> header file. */
+#undef HAVE_NGTCP2_NGTCP2_CRYPTO_H
+
+/* Define to 1 if you have the <ngtcp2/ngtcp2.h> header file. */
+#undef HAVE_NGTCP2_NGTCP2_H
+
 /* if you have an old MIT Kerberos version, lacking GSS_C_NT_HOSTBASED_SERVICE
    */
 #undef HAVE_OLD_GSSMIT
 /* Define to 1 if you have the <openssl/ssl.h> header file. */
 #undef HAVE_OPENSSL_SSL_H
 
+/* Define to 1 if you have the `OpenSSL_version' function. */
+#undef HAVE_OPENSSL_VERSION
+
 /* Define to 1 if you have the <openssl/x509.h> header file. */
 #undef HAVE_OPENSSL_X509_H
 
 /* Define to 1 if you have a working POSIX-style strerror_r function. */
 #undef HAVE_POSIX_STRERROR_R
 
+/* Define to 1 if you have the <proto/bsdsocket.h> header file. */
+#undef HAVE_PROTO_BSDSOCKET_H
+
 /* if you have <pthread.h> */
 #undef HAVE_PTHREAD_H
 
 /* Define to 1 if you have the <pwd.h> header file. */
 #undef HAVE_PWD_H
 
+/* Define to 1 if you have the <quiche.h> header file. */
+#undef HAVE_QUICHE_H
+
 /* Define to 1 if you have the `RAND_egd' function. */
 #undef HAVE_RAND_EGD
 
 /* Define to 1 if you have the `SSLv2_client_method' function. */
 #undef HAVE_SSLV2_CLIENT_METHOD
 
-/* Define to 1 if you have the `SSL_get_shutdown' function. */
-#undef HAVE_SSL_GET_SHUTDOWN
+/* Define to 1 if you have the `SSL_get_esni_status' function. */
+#undef HAVE_SSL_GET_ESNI_STATUS
 
 /* Define to 1 if you have the <ssl.h> header file. */
 #undef HAVE_SSL_H
 /* Define to 1 if you have the <stdint.h> header file. */
 #undef HAVE_STDINT_H
 
-/* Define to 1 if you have the <stdio.h> header file. */
-#undef HAVE_STDIO_H
-
 /* Define to 1 if you have the <stdlib.h> header file. */
 #undef HAVE_STDLIB_H
 
 /* Define to 1 if you have the <unistd.h> header file. */
 #undef HAVE_UNISTD_H
 
+/* Define to 1 if you have the `usleep' function. */
+#undef HAVE_USLEEP
+
 /* Define to 1 if you have the `utime' function. */
 #undef HAVE_UTIME
 
 /* Define to 1 if you have the `wolfSSLv3_client_method' function. */
 #undef HAVE_WOLFSSLV3_CLIENT_METHOD
 
-/* Define to 1 if you have the `wolfSSL_CTX_UseSupportedCurve' function. */
-#undef HAVE_WOLFSSL_CTX_USESUPPORTEDCURVE
-
 /* Define to 1 if you have the `wolfSSL_get_peer_certificate' function. */
 #undef HAVE_WOLFSSL_GET_PEER_CERTIFICATE
 
 /* Define to 1 if you can safely include both <sys/time.h> and <time.h>. */
 #undef TIME_WITH_SYS_TIME
 
+/* to enable alt-svc */
+#undef USE_ALTSVC
+
+/* if AmiSSL is in use */
+#undef USE_AMISSL
+
 /* Define to enable c-ares support */
 #undef USE_ARES
 
-/* if axTLS is enabled */
-#undef USE_AXTLS
+/* if BearSSL is enabled */
+#undef USE_BEARSSL
 
-/* if CyaSSL/WolfSSL is enabled */
-#undef USE_CYASSL
-
-/* to enable Apple OS native SSL/TLS support */
-#undef USE_DARWINSSL
+/* if ESNI support is available */
+#undef USE_ESNI
 
 /* if GnuTLS is enabled */
 #undef USE_GNUTLS
 /* if nghttp2 is in use */
 #undef USE_NGHTTP2
 
+/* if nghttp3 is in use */
+#undef USE_NGHTTP3
+
+/* if ngtcp2 is in use */
+#undef USE_NGTCP2
+
+/* if ngtcp2_crypto_openssl is in use */
+#undef USE_NGTCP2_CRYPTO_OPENSSL
+
 /* if NSS is enabled */
 #undef USE_NSS
 
 /* if OpenSSL is in use */
 #undef USE_OPENSSL
 
-/* if PolarSSL is enabled */
-#undef USE_POLARSSL
+/* if quiche is in use */
+#undef USE_QUICHE
 
 /* to enable Windows native SSL/TLS support */
 #undef USE_SCHANNEL
 
+/* enable Secure Transport */
+#undef USE_SECTRANSP
+
 /* if you want POSIX threaded DNS lookup */
 #undef USE_THREADS_POSIX
 
 /* to enable SSPI support */
 #undef USE_WINDOWS_SSPI
 
+/* if wolfSSL is enabled */
+#undef USE_WOLFSSL
+
 /* Version number of package */
 #undef VERSION
 
index b123a00..39c0f35 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 2015, Steve Holme, <steve_holme@hotmail.com>.
+ * Copyright (C) 2015 - 2019, Steve Holme, <steve_holme@hotmail.com>.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
index 129060f..a42eeb5 100644 (file)
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 2015, Steve Holme, <steve_holme@hotmail.com>.
+ * Copyright (C) 2015 - 2019, Steve Holme, <steve_holme@hotmail.com>.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
index c25db49..a774d13 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -81,8 +81,9 @@ unsigned short Curl_read16_be(const unsigned char *buf)
                           ((unsigned short)buf[1]));
 }
 
+#if (CURL_SIZEOF_CURL_OFF_T > 4)
 /*
- * Curl_write32_le()
+ * write32_le()
  *
  * This function converts a 32-bit integer from the native endian format,
  * to little endian format ready for sending down the wire.
@@ -92,7 +93,7 @@ unsigned short Curl_read16_be(const unsigned char *buf)
  * value    [in]     - The 32-bit integer value.
  * buffer   [in]     - A pointer to the output buffer.
  */
-void Curl_write32_le(const int value, unsigned char *buffer)
+static void write32_le(const int value, unsigned char *buffer)
 {
   buffer[0] = (char)(value & 0x000000FF);
   buffer[1] = (char)((value & 0x0000FF00) >> 8);
@@ -100,7 +101,6 @@ void Curl_write32_le(const int value, unsigned char *buffer)
   buffer[3] = (char)((value & 0xFF000000) >> 24);
 }
 
-#if (CURL_SIZEOF_CURL_OFF_T > 4)
 /*
  * Curl_write64_le()
  *
@@ -118,7 +118,7 @@ void Curl_write64_le(const long long value, unsigned char *buffer)
 void Curl_write64_le(const __int64 value, unsigned char *buffer)
 #endif
 {
-  Curl_write32_le((int)value, buffer);
-  Curl_write32_le((int)(value >> 32), buffer + 4);
+  write32_le((int)value, buffer);
+  write32_le((int)(value >> 32), buffer + 4);
 }
 #endif /* CURL_SIZEOF_CURL_OFF_T > 4 */
index 4f345a6..9830e58 100644 (file)
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -31,9 +31,6 @@ unsigned int Curl_read32_le(const unsigned char *buf);
 /* Converts a 16-bit integer from big endian */
 unsigned short Curl_read16_be(const unsigned char *buf);
 
-/* Converts a 32-bit integer to little endian */
-void Curl_write32_le(const int value, unsigned char *buffer);
-
 #if (CURL_SIZEOF_CURL_OFF_T > 4)
 /* Converts a 64-bit integer to little endian */
 #if defined(HAVE_LONGLONG)
index fbfd85c..ab3e742 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -21,7 +21,7 @@
  ***************************************************************************/
 
 #include "curl_setup.h"
-
+#ifndef CURL_DISABLE_FTP
 #include <curl/curl.h>
 
 #include "curl_fnmatch.h"
 
 #ifndef HAVE_FNMATCH
 
-/*
- * TODO:
- *
- * Make this function match POSIX. Test 1307 includes a set of test patterns
- * that returns different results with a POSIX fnmatch() than with this
- * implementation and this is considered a bug where POSIX is the guiding
- * light.
- */
-
 #define CURLFNM_CHARSET_LEN (sizeof(char) * 256)
 #define CURLFNM_CHSET_SIZE (CURLFNM_CHARSET_LEN + 15)
 
@@ -394,3 +385,5 @@ int Curl_fnmatch(void *ptr, const char *pattern, const char *string)
 }
 
 #endif
+
+#endif /* if FTP is disabled */
index 69ffe39..34fccae 100644 (file)
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2009, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
diff --git a/lib/curl_get_line.c b/lib/curl_get_line.c
new file mode 100644 (file)
index 0000000..c419485
--- /dev/null
@@ -0,0 +1,55 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+
+#include "curl_setup.h"
+
+#include "curl_get_line.h"
+#include "curl_memory.h"
+/* The last #include file should be: */
+#include "memdebug.h"
+
+/*
+ * get_line() makes sure to only return complete whole lines that fit in 'len'
+ * bytes and end with a newline.
+ */
+char *Curl_get_line(char *buf, int len, FILE *input)
+{
+  bool partial = FALSE;
+  while(1) {
+    char *b = fgets(buf, len, input);
+    if(b) {
+      size_t rlen = strlen(b);
+      if(rlen && (b[rlen-1] == '\n')) {
+        if(partial) {
+          partial = FALSE;
+          continue;
+        }
+        return b;
+      }
+      /* read a partial, discard the next piece that ends with newline */
+      partial = TRUE;
+    }
+    else
+      break;
+  }
+  return NULL;
+}
similarity index 73%
rename from lib/vtls/axtls.h
rename to lib/curl_get_line.h
index cb81872..532ab08 100644 (file)
@@ -1,5 +1,5 @@
-#ifndef HEADER_CURL_AXTLS_H
-#define HEADER_CURL_AXTLS_H
+#ifndef HEADER_CURL_GET_LINE_H
+#define HEADER_CURL_GET_LINE_H
 /***************************************************************************
  *                                  _   _ ____  _
  *  Project                     ___| | | |  _ \| |
@@ -7,8 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 2010, DirecTV, Contact: Eric Hu <ehu@directv.com>
- * Copyright (C) 2010 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
  *
  ***************************************************************************/
 
-#ifdef USE_AXTLS
-#include "curl/curl.h"
-#include "urldata.h"
+/* get_line() makes sure to only return complete whole lines that fit in 'len'
+ * bytes and end with a newline. */
+char *Curl_get_line(char *buf, int len, FILE *input);
 
-extern const struct Curl_ssl Curl_ssl_axtls;
-
-#endif /* USE_AXTLS */
-#endif /* HEADER_CURL_AXTLS_H */
+#endif /* HEADER_CURL_GET_LINE_H */
index 07517c5..8ae15e6 100644 (file)
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2010, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
index f007986..d854ab0 100644 (file)
@@ -97,9 +97,9 @@ static size_t display_gss_error(OM_uint32 status, int type,
                                   &msg_ctx,
                                   &status_string);
     if(GSS_LOG_BUFFER_LEN > len + status_string.length + 3) {
-      len += snprintf(buf + len, GSS_LOG_BUFFER_LEN - len,
-                      "%.*s. ", (int)status_string.length,
-                      (char *)status_string.value);
+      len += msnprintf(buf + len, GSS_LOG_BUFFER_LEN - len,
+                       "%.*s. ", (int)status_string.length,
+                       (char *)status_string.value);
     }
     gss_release_buffer(&min_stat, &status_string);
   } while(!GSS_ERROR(maj_stat) && msg_ctx != 0);
index 9700a28..88f68db 100644 (file)
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 2011 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 2011 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
 #include "urldata.h"
 
 #ifdef HAVE_GSSAPI
-
-#ifdef HAVE_GSSGNU
-#  include <gss.h>
-#elif defined HAVE_GSSMIT
-   /* MIT style */
-#  include <gssapi/gssapi.h>
-#  include <gssapi/gssapi_generic.h>
-#  include <gssapi/gssapi_krb5.h>
-#else
-   /* Heimdal-style */
-#  include <gssapi.h>
-#endif
-
 extern gss_OID_desc Curl_spnego_mech_oid;
 extern gss_OID_desc Curl_krb5_mech_oid;
 
@@ -71,5 +58,4 @@ void Curl_gss_log_error(struct Curl_easy *data, const char *prefix,
 #define GSSAUTH_P_PRIVACY   4
 
 #endif /* HAVE_GSSAPI */
-
 #endif /* HEADER_CURL_GSSAPI_H */
index 94c0029..912e131 100644 (file)
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2010, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
index e069041..82df708 100644 (file)
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
 
 #include "curl_setup.h"
 
-#if defined(USE_NSS) || defined(USE_OS400CRYPTO) || \
-    (defined(USE_MBEDTLS) && !defined(MBEDTLS_MD4_C))
+#if !defined(CURL_DISABLE_CRYPTO_AUTH)
+
+#define MD4_DIGEST_LENGTH 16
 
 void Curl_md4it(unsigned char *output, const unsigned char *input, size_t len);
 
-#endif /* defined(USE_NSS) || defined(USE_OS400CRYPTO) ||
-    (defined(USE_MBEDTLS) && !defined(MBEDTLS_MD4_C)) */
+#endif /* !defined(CURL_DISABLE_CRYPTO_AUTH) */
 
 #endif /* HEADER_CURL_MD4_H */
index 5f70c96..aaf25f6 100644 (file)
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2010, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -53,10 +53,10 @@ void Curl_md5it(unsigned char *output,
                 const unsigned char *input);
 
 MD5_context * Curl_MD5_init(const MD5_params *md5params);
-int Curl_MD5_update(MD5_context *context,
-                    const unsigned char *data,
-                    unsigned int len);
-int Curl_MD5_final(MD5_context *context, unsigned char *result);
+CURLcode Curl_MD5_update(MD5_context *context,
+                         const unsigned char *data,
+                         unsigned int len);
+CURLcode Curl_MD5_final(MD5_context *context, unsigned char *result);
 
 #endif
 
index fccf468..ce38a08 100644 (file)
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -39,7 +39,7 @@
  *
  * File lib/strdup.c is an exception, given that it provides a strdup
  * clone implementation while using malloc. Extra care needed inside
- * this one. TODO: revisit this paragraph and related code.
+ * this one.
  *
  * The need for curl_memory.h inclusion is due to libcurl's feature
  * of allowing library user to provide memory replacement functions,
index 747509c..90a8a07 100644 (file)
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2009, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
index e78bb50..e384344 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -64,13 +64,13 @@ char *Curl_convert_wchar_to_UTF8(const wchar_t *str_w)
   char *str_utf8 = NULL;
 
   if(str_w) {
-    int str_utf8_len = WideCharToMultiByte(CP_UTF8, 0, str_w, -1, NULL,
-                                           0, NULL, NULL);
-    if(str_utf8_len > 0) {
-      str_utf8 = malloc(str_utf8_len * sizeof(wchar_t));
+    int bytes = WideCharToMultiByte(CP_UTF8, 0, str_w, -1,
+                                    NULL, 0, NULL, NULL);
+    if(bytes > 0) {
+      str_utf8 = malloc(bytes);
       if(str_utf8) {
-        if(WideCharToMultiByte(CP_UTF8, 0, str_w, -1, str_utf8, str_utf8_len,
-                               NULL, FALSE) == 0) {
+        if(WideCharToMultiByte(CP_UTF8, 0, str_w, -1, str_utf8, bytes,
+                               NULL, NULL) == 0) {
           free(str_utf8);
           return NULL;
         }
index 615f5c0..3becf41 100644 (file)
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -61,8 +61,13 @@ char *Curl_convert_wchar_to_UTF8(const wchar_t *str_w);
 
 #define Curl_convert_UTF8_to_tchar(ptr) Curl_convert_UTF8_to_wchar((ptr))
 #define Curl_convert_tchar_to_UTF8(ptr) Curl_convert_wchar_to_UTF8((ptr))
-#define Curl_unicodefree(ptr) \
-  do {if((ptr)) {free((ptr)); (ptr) = NULL;}} WHILE_FALSE
+#define Curl_unicodefree(ptr)                           \
+  do {                                                  \
+    if(ptr) {                                           \
+      free(ptr);                                        \
+      (ptr) = NULL;                                     \
+    }                                                   \
+  } while(0)
 
 typedef union {
   unsigned short       *tchar_ptr;
@@ -76,7 +81,7 @@ typedef union {
 #define Curl_convert_UTF8_to_tchar(ptr) (ptr)
 #define Curl_convert_tchar_to_UTF8(ptr) (ptr)
 #define Curl_unicodefree(ptr) \
-  do {(ptr) = NULL;} WHILE_FALSE
+  do {(ptr) = NULL;} while(0)
 
 typedef union {
   char                *tchar_ptr;
index 922e85a..19f9b61 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -38,7 +38,7 @@
    3. USE_GNUTLS
    4. USE_NSS
    5. USE_MBEDTLS
-   6. USE_DARWINSSL
+   6. USE_SECTRANSP
    7. USE_OS400CRYPTO
    8. USE_WIN32_CRYPTO
 
 
 #ifdef USE_OPENSSL
 
-#  ifdef USE_OPENSSL
-#    include <openssl/des.h>
-#    ifndef OPENSSL_NO_MD4
-#      include <openssl/md4.h>
-#    endif
-#    include <openssl/md5.h>
-#    include <openssl/ssl.h>
-#    include <openssl/rand.h>
-#  else
-#    include <des.h>
-#    ifndef OPENSSL_NO_MD4
-#      include <md4.h>
-#    endif
-#    include <md5.h>
-#    include <ssl.h>
-#    include <rand.h>
-#  endif
+#  include <openssl/des.h>
+#  include <openssl/md5.h>
+#  include <openssl/ssl.h>
+#  include <openssl/rand.h>
 #  if (OPENSSL_VERSION_NUMBER < 0x00907001L)
 #    define DES_key_schedule des_key_schedule
 #    define DES_cblock des_cblock
 #elif defined(USE_GNUTLS_NETTLE)
 
 #  include <nettle/des.h>
-#  include <nettle/md4.h>
 
 #elif defined(USE_GNUTLS)
 
 #  include <gcrypt.h>
 #  define MD5_DIGEST_LENGTH 16
-#  define MD4_DIGEST_LENGTH 16
 
 #elif defined(USE_NSS)
 
 #  include <nss.h>
 #  include <pk11pub.h>
 #  include <hasht.h>
-#  include "curl_md4.h"
 #  define MD5_DIGEST_LENGTH MD5_LENGTH
 
 #elif defined(USE_MBEDTLS)
 
 #  include <mbedtls/des.h>
-#  include <mbedtls/md4.h>
-#  if !defined(MBEDTLS_MD4_C)
-#    include "curl_md4.h"
-#  endif
+#  include "curl_md4.h"
 
-#elif defined(USE_DARWINSSL)
+#elif defined(USE_SECTRANSP)
 
 #  include <CommonCrypto/CommonCryptor.h>
 #  include <CommonCrypto/CommonDigest.h>
 
 #elif defined(USE_OS400CRYPTO)
 #  include "cipher.mih"  /* mih/cipher */
-#  include "curl_md4.h"
 #elif defined(USE_WIN32_CRYPTO)
 #  include <wincrypt.h>
 #else
 #include "warnless.h"
 #include "curl_endian.h"
 #include "curl_des.h"
+#include "curl_md4.h"
 /* The last 3 #include files should be in this order */
 #include "curl_printf.h"
 #include "curl_memory.h"
@@ -226,7 +207,6 @@ static bool encrypt_des(const unsigned char *in, unsigned char *out,
                         const unsigned char *key_56)
 {
   const CK_MECHANISM_TYPE mech = CKM_DES_ECB; /* DES cipher in ECB mode */
-  PK11SlotInfo *slot = NULL;
   char key[8];                                /* expanded 64 bit key */
   SECItem key_item;
   PK11SymKey *symkey = NULL;
@@ -236,7 +216,7 @@ static bool encrypt_des(const unsigned char *in, unsigned char *out,
   bool rv = FALSE;
 
   /* use internal slot for DES encryption (requires NSS to be initialized) */
-  slot = PK11_GetInternalKeySlot();
+  PK11SlotInfo *slot = PK11_GetInternalKeySlot();
   if(!slot)
     return FALSE;
 
@@ -300,7 +280,7 @@ static bool encrypt_des(const unsigned char *in, unsigned char *out,
   return mbedtls_des_crypt_ecb(&ctx, in, out) == 0;
 }
 
-#elif defined(USE_DARWINSSL)
+#elif defined(USE_SECTRANSP)
 
 static bool encrypt_des(const unsigned char *in, unsigned char *out,
                         const unsigned char *key_56)
@@ -447,7 +427,7 @@ void Curl_ntlm_core_lm_resp(const unsigned char *keys,
   setup_des_key(keys + 14, &des);
   gcry_cipher_encrypt(des, results + 16, 8, plaintext, 8);
   gcry_cipher_close(des);
-#elif defined(USE_NSS) || defined(USE_MBEDTLS) || defined(USE_DARWINSSL) \
+#elif defined(USE_NSS) || defined(USE_MBEDTLS) || defined(USE_SECTRANSP) \
   || defined(USE_OS400CRYPTO) || defined(USE_WIN32_CRYPTO)
   encrypt_des(plaintext, results, keys);
   encrypt_des(plaintext, results + 8, keys + 7);
@@ -511,7 +491,7 @@ CURLcode Curl_ntlm_core_mk_lm_hash(struct Curl_easy *data,
     setup_des_key(pw + 7, &des);
     gcry_cipher_encrypt(des, lmbuffer + 8, 8, magic, 8);
     gcry_cipher_close(des);
-#elif defined(USE_NSS) || defined(USE_MBEDTLS) || defined(USE_DARWINSSL) \
+#elif defined(USE_NSS) || defined(USE_MBEDTLS) || defined(USE_SECTRANSP) \
   || defined(USE_OS400CRYPTO) || defined(USE_WIN32_CRYPTO)
     encrypt_des(magic, lmbuffer, pw);
     encrypt_des(magic, lmbuffer + 8, pw + 7);
@@ -561,7 +541,7 @@ CURLcode Curl_ntlm_core_mk_nt_hash(struct Curl_easy *data,
   CURLcode result;
   if(len > SIZE_T_MAX/2) /* avoid integer overflow */
     return CURLE_OUT_OF_MEMORY;
-  pw = len ? malloc(len * 2) : strdup("");
+  pw = len ? malloc(len * 2) : (unsigned char *)strdup("");
   if(!pw)
     return CURLE_OUT_OF_MEMORY;
 
@@ -575,53 +555,10 @@ CURLcode Curl_ntlm_core_mk_nt_hash(struct Curl_easy *data,
   if(result)
     return result;
 
-  {
-    /* Create NT hashed password. */
-#ifdef USE_OPENSSL
-    MD4_CTX MD4pw;
-    MD4_Init(&MD4pw);
-    MD4_Update(&MD4pw, pw, 2 * len);
-    MD4_Final(ntbuffer, &MD4pw);
-#elif defined(USE_GNUTLS_NETTLE)
-    struct md4_ctx MD4pw;
-    md4_init(&MD4pw);
-    md4_update(&MD4pw, (unsigned int)(2 * len), pw);
-    md4_digest(&MD4pw, MD4_DIGEST_SIZE, ntbuffer);
-#elif defined(USE_GNUTLS)
-    gcry_md_hd_t MD4pw;
-    gcry_md_open(&MD4pw, GCRY_MD_MD4, 0);
-    gcry_md_write(MD4pw, pw, 2 * len);
-    memcpy(ntbuffer, gcry_md_read(MD4pw, 0), MD4_DIGEST_LENGTH);
-    gcry_md_close(MD4pw);
-#elif defined(USE_NSS)
-    Curl_md4it(ntbuffer, pw, 2 * len);
-#elif defined(USE_MBEDTLS)
-#if defined(MBEDTLS_MD4_C)
-    mbedtls_md4(pw, 2 * len, ntbuffer);
-#else
-    Curl_md4it(ntbuffer, pw, 2 * len);
-#endif
-#elif defined(USE_DARWINSSL)
-    (void)CC_MD4(pw, (CC_LONG)(2 * len), ntbuffer);
-#elif defined(USE_OS400CRYPTO)
-    Curl_md4it(ntbuffer, pw, 2 * len);
-#elif defined(USE_WIN32_CRYPTO)
-    HCRYPTPROV hprov;
-    if(CryptAcquireContext(&hprov, NULL, NULL, PROV_RSA_FULL,
-                           CRYPT_VERIFYCONTEXT)) {
-      HCRYPTHASH hhash;
-      if(CryptCreateHash(hprov, CALG_MD4, 0, 0, &hhash)) {
-        DWORD length = 16;
-        CryptHashData(hhash, pw, (unsigned int)len * 2, 0);
-        CryptGetHashParam(hhash, HP_HASHVAL, ntbuffer, &length, 0);
-        CryptDestroyHash(hhash);
-      }
-      CryptReleaseContext(hprov, 0);
-    }
-#endif
+  /* Create NT hashed password. */
+  Curl_md4it(ntbuffer, pw, 2 * len);
 
-    memset(ntbuffer + 16, 0, 21 - 16);
-  }
+  memset(ntbuffer + 16, 0, 21 - 16);
 
   free(pw);
 
@@ -631,9 +568,9 @@ CURLcode Curl_ntlm_core_mk_nt_hash(struct Curl_easy *data,
 #if defined(USE_NTLM_V2) && !defined(USE_WINDOWS_SSPI)
 
 /* This returns the HMAC MD5 digest */
-CURLcode Curl_hmac_md5(const unsigned char *key, unsigned int keylen,
-                       const unsigned char *data, unsigned int datalen,
-                       unsigned char *output)
+static CURLcode hmac_md5(const unsigned char *key, unsigned int keylen,
+                         const unsigned char *data, unsigned int datalen,
+                         unsigned char *output)
 {
   HMAC_context *ctxt = Curl_HMAC_init(Curl_HMAC_MD5, key, keylen);
 
@@ -678,9 +615,8 @@ CURLcode Curl_ntlm_core_mk_ntlmv2_hash(const char *user, size_t userlen,
   ascii_uppercase_to_unicode_le(identity, user, userlen);
   ascii_to_unicode_le(identity + (userlen << 1), domain, domlen);
 
-  result = Curl_hmac_md5(ntlmhash, 16, identity, curlx_uztoui(identity_len),
-                         ntlmv2hash);
-
+  result = hmac_md5(ntlmhash, 16, identity, curlx_uztoui(identity_len),
+                    ntlmv2hash);
   free(identity);
 
   return result;
@@ -753,12 +689,12 @@ CURLcode Curl_ntlm_core_mk_ntlmv2_resp(unsigned char *ntlmv2hash,
     return CURLE_OUT_OF_MEMORY;
 
   /* Create the BLOB structure */
-  snprintf((char *)ptr + NTLM_HMAC_MD5_LEN, NTLMv2_BLOB_LEN,
-           "%c%c%c%c"   /* NTLMv2_BLOB_SIGNATURE */
-           "%c%c%c%c",  /* Reserved = 0 */
-           NTLMv2_BLOB_SIGNATURE[0], NTLMv2_BLOB_SIGNATURE[1],
-           NTLMv2_BLOB_SIGNATURE[2], NTLMv2_BLOB_SIGNATURE[3],
-           0, 0, 0, 0);
+  msnprintf((char *)ptr + NTLM_HMAC_MD5_LEN, NTLMv2_BLOB_LEN,
+            "%c%c%c%c"   /* NTLMv2_BLOB_SIGNATURE */
+            "%c%c%c%c",  /* Reserved = 0 */
+            NTLMv2_BLOB_SIGNATURE[0], NTLMv2_BLOB_SIGNATURE[1],
+            NTLMv2_BLOB_SIGNATURE[2], NTLMv2_BLOB_SIGNATURE[3],
+            0, 0, 0, 0);
 
   Curl_write64_le(tw, ptr + 24);
   memcpy(ptr + 32, challenge_client, 8);
@@ -766,8 +702,8 @@ CURLcode Curl_ntlm_core_mk_ntlmv2_resp(unsigned char *ntlmv2hash,
 
   /* Concatenate the Type 2 challenge with the BLOB and do HMAC MD5 */
   memcpy(ptr + 8, &ntlm->nonce[0], 8);
-  result = Curl_hmac_md5(ntlmv2hash, NTLM_HMAC_MD5_LEN, ptr + 8,
-                         NTLMv2_BLOB_LEN + 8, hmac_output);
+  result = hmac_md5(ntlmv2hash, NTLM_HMAC_MD5_LEN, ptr + 8,
+                    NTLMv2_BLOB_LEN + 8, hmac_output);
   if(result) {
     free(ptr);
     return result;
@@ -809,7 +745,7 @@ CURLcode  Curl_ntlm_core_mk_lmv2_resp(unsigned char *ntlmv2hash,
   memcpy(&data[0], challenge_server, 8);
   memcpy(&data[8], challenge_client, 8);
 
-  result = Curl_hmac_md5(ntlmv2hash, 16, &data[0], 16, hmac_output);
+  result = hmac_md5(ntlmv2hash, 16, &data[0], 16, hmac_output);
   if(result)
     return result;
 
index 07ef5de..392a1b8 100644 (file)
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
 
 /* Define USE_NTRESPONSES in order to make the type-3 message include
  * the NT response message. */
-#if !defined(USE_OPENSSL) || !defined(OPENSSL_NO_MD4)
 #define USE_NTRESPONSES
-#endif
 
 /* Define USE_NTLM2SESSION in order to make the type-3 message include the
    NTLM2Session response message, requires USE_NTRESPONSES defined to 1 and a
    Crypto engine that we have curl_ssl_md5sum() for. */
-#if defined(USE_NTRESPONSES) && !defined(USE_WIN32_CRYPTO)
+#if defined(USE_NTRESPONSES) && \
+  (!defined(USE_WIN32_CRYPTO) || \
+  (defined(USE_SSL) && !defined(CURL_DISABLE_CRYPTO_AUTH)))
 #define USE_NTLM2SESSION
 #endif
 
index a4791eb..30b54de 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -53,6 +53,8 @@
 #include "url.h"
 #include "strerror.h"
 #include "strdup.h"
+#include "strcase.h"
+
 /* The last 3 #include files should be in this order */
 #include "curl_printf.h"
 #include "curl_memory.h"
@@ -74,7 +76,7 @@
 #  define sclose_nolog(x)  close((x))
 #endif
 
-void Curl_ntlm_wb_cleanup(struct connectdata *conn)
+void Curl_http_auth_cleanup_ntlm_wb(struct connectdata *conn)
 {
   if(conn->ntlm_auth_hlpr_socket != CURL_SOCKET_BAD) {
     sclose(conn->ntlm_auth_hlpr_socket);
@@ -106,10 +108,8 @@ void Curl_ntlm_wb_cleanup(struct connectdata *conn)
     conn->ntlm_auth_hlpr_pid = 0;
   }
 
-  free(conn->challenge_header);
-  conn->challenge_header = NULL;
-  free(conn->response_header);
-  conn->response_header = NULL;
+  Curl_safefree(conn->challenge_header);
+  Curl_safefree(conn->response_header);
 }
 
 static CURLcode ntlm_wb_init(struct connectdata *conn, const char *userp)
@@ -124,6 +124,7 @@ static CURLcode ntlm_wb_init(struct connectdata *conn, const char *userp)
   struct passwd pw, *pw_res;
   char pwbuf[1024];
 #endif
+  char buffer[STRERROR_LEN];
 
   /* Return if communication with ntlm_auth already set up */
   if(conn->ntlm_auth_hlpr_socket != CURL_SOCKET_BAD ||
@@ -179,13 +180,13 @@ static CURLcode ntlm_wb_init(struct connectdata *conn, const char *userp)
 
   if(access(ntlm_auth, X_OK) != 0) {
     failf(conn->data, "Could not access ntlm_auth: %s errno %d: %s",
-          ntlm_auth, errno, Curl_strerror(conn, errno));
+          ntlm_auth, errno, Curl_strerror(errno, buffer, sizeof(buffer)));
     goto done;
   }
 
   if(socketpair(AF_UNIX, SOCK_STREAM, 0, sockfds)) {
     failf(conn->data, "Could not open socket pair. errno %d: %s",
-          errno, Curl_strerror(conn, errno));
+          errno, Curl_strerror(errno, buffer, sizeof(buffer)));
     goto done;
   }
 
@@ -194,7 +195,7 @@ static CURLcode ntlm_wb_init(struct connectdata *conn, const char *userp)
     sclose(sockfds[0]);
     sclose(sockfds[1]);
     failf(conn->data, "Could not fork. errno %d: %s",
-          errno, Curl_strerror(conn, errno));
+          errno, Curl_strerror(errno, buffer, sizeof(buffer)));
     goto done;
   }
   else if(!child_pid) {
@@ -206,13 +207,13 @@ static CURLcode ntlm_wb_init(struct connectdata *conn, const char *userp)
     sclose_nolog(sockfds[0]);
     if(dup2(sockfds[1], STDIN_FILENO) == -1) {
       failf(conn->data, "Could not redirect child stdin. errno %d: %s",
-            errno, Curl_strerror(conn, errno));
+            errno, Curl_strerror(errno, buffer, sizeof(buffer)));
       exit(1);
     }
 
     if(dup2(sockfds[1], STDOUT_FILENO) == -1) {
       failf(conn->data, "Could not redirect child stdout. errno %d: %s",
-            errno, Curl_strerror(conn, errno));
+            errno, Curl_strerror(errno, buffer, sizeof(buffer)));
       exit(1);
     }
 
@@ -232,7 +233,7 @@ static CURLcode ntlm_wb_init(struct connectdata *conn, const char *userp)
 
     sclose_nolog(sockfds[1]);
     failf(conn->data, "Could not execl(). errno %d: %s",
-          errno, Curl_strerror(conn, errno));
+          errno, Curl_strerror(errno, buffer, sizeof(buffer)));
     exit(1);
   }
 
@@ -332,6 +333,48 @@ done:
   return CURLE_REMOTE_ACCESS_DENIED;
 }
 
+CURLcode Curl_input_ntlm_wb(struct connectdata *conn,
+                            bool proxy,
+                            const char *header)
+{
+  curlntlm *state = proxy ? &conn->proxy_ntlm_state : &conn->http_ntlm_state;
+
+  if(!checkprefix("NTLM", header))
+    return CURLE_BAD_CONTENT_ENCODING;
+
+  header += strlen("NTLM");
+  while(*header && ISSPACE(*header))
+    header++;
+
+  if(*header) {
+    conn->challenge_header = strdup(header);
+    if(!conn->challenge_header)
+      return CURLE_OUT_OF_MEMORY;
+
+    *state = NTLMSTATE_TYPE2; /* We got a type-2 message */
+  }
+  else {
+    if(*state == NTLMSTATE_LAST) {
+      infof(conn->data, "NTLM auth restarted\n");
+      Curl_http_auth_cleanup_ntlm_wb(conn);
+    }
+    else if(*state == NTLMSTATE_TYPE3) {
+      infof(conn->data, "NTLM handshake rejected\n");
+      Curl_http_auth_cleanup_ntlm_wb(conn);
+      *state = NTLMSTATE_NONE;
+      return CURLE_REMOTE_ACCESS_DENIED;
+    }
+    else if(*state >= NTLMSTATE_TYPE1) {
+      infof(conn->data, "NTLM handshake failure (internal error)\n");
+      return CURLE_REMOTE_ACCESS_DENIED;
+    }
+
+    *state = NTLMSTATE_TYPE1; /* We should send away a type-1 */
+  }
+
+  return CURLE_OK;
+}
+
 /*
  * This is for creating ntlm header output by delegating challenge/response
  * to Samba's winbind daemon helper ntlm_auth.
@@ -344,12 +387,10 @@ CURLcode Curl_output_ntlm_wb(struct connectdata *conn,
   char **allocuserpwd;
   /* point to the name and password for this */
   const char *userp;
-  /* point to the correct struct with this */
-  struct ntlmdata *ntlm;
+  curlntlm *state;
   struct auth *authp;
 
   CURLcode res = CURLE_OK;
-  char *input;
 
   DEBUGASSERT(conn);
   DEBUGASSERT(conn->data);
@@ -357,13 +398,13 @@ CURLcode Curl_output_ntlm_wb(struct connectdata *conn,
   if(proxy) {
     allocuserpwd = &conn->allocptr.proxyuserpwd;
     userp = conn->http_proxy.user;
-    ntlm = &conn->proxyntlm;
+    state = &conn->proxy_ntlm_state;
     authp = &conn->data->state.authproxy;
   }
   else {
     allocuserpwd = &conn->allocptr.userpwd;
     userp = conn->user;
-    ntlm = &conn->ntlm;
+    state = &conn->http_ntlm_state;
     authp = &conn->data->state.authhost;
   }
   authp->done = FALSE;
@@ -372,7 +413,7 @@ CURLcode Curl_output_ntlm_wb(struct connectdata *conn,
   if(!userp)
     userp = "";
 
-  switch(ntlm->state) {
+  switch(*state) {
   case NTLMSTATE_TYPE1:
   default:
     /* Use Samba's 'winbind' daemon to support NTLM authentication,
@@ -391,7 +432,7 @@ CURLcode Curl_output_ntlm_wb(struct connectdata *conn,
     res = ntlm_wb_init(conn, userp);
     if(res)
       return res;
-    res = ntlm_wb_response(conn, "YR\n", ntlm->state);
+    res = ntlm_wb_response(conn, "YR\n", *state);
     if(res)
       return res;
 
@@ -400,18 +441,17 @@ CURLcode Curl_output_ntlm_wb(struct connectdata *conn,
                             proxy ? "Proxy-" : "",
                             conn->response_header);
     DEBUG_OUT(fprintf(stderr, "**** Header %s\n ", *allocuserpwd));
-    free(conn->response_header);
+    Curl_safefree(conn->response_header);
     if(!*allocuserpwd)
       return CURLE_OUT_OF_MEMORY;
-    conn->response_header = NULL;
     break;
-  case NTLMSTATE_TYPE2:
-    input = aprintf("TT %s\n", conn->challenge_header);
+
+  case NTLMSTATE_TYPE2: {
+    char *input = aprintf("TT %s\n", conn->challenge_header);
     if(!input)
       return CURLE_OUT_OF_MEMORY;
-    res = ntlm_wb_response(conn, input, ntlm->state);
+    res = ntlm_wb_response(conn, input, *state);
     free(input);
-    input = NULL;
     if(res)
       return res;
 
@@ -420,17 +460,20 @@ CURLcode Curl_output_ntlm_wb(struct connectdata *conn,
                             proxy ? "Proxy-" : "",
                             conn->response_header);
     DEBUG_OUT(fprintf(stderr, "**** %s\n ", *allocuserpwd));
-    ntlm->state = NTLMSTATE_TYPE3; /* we sent a type-3 */
+    *state = NTLMSTATE_TYPE3; /* we sent a type-3 */
     authp->done = TRUE;
-    Curl_ntlm_wb_cleanup(conn);
+    Curl_http_auth_cleanup_ntlm_wb(conn);
     if(!*allocuserpwd)
       return CURLE_OUT_OF_MEMORY;
     break;
+  }
   case NTLMSTATE_TYPE3:
     /* connection is already authenticated,
      * don't send a header in future requests */
-    free(*allocuserpwd);
-    *allocuserpwd = NULL;
+    *state = NTLMSTATE_LAST;
+    /* FALLTHROUGH */
+  case NTLMSTATE_LAST:
+    Curl_safefree(*allocuserpwd);
     authp->done = TRUE;
     break;
   }
index aba3d46..3cf841c 100644 (file)
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
 #if !defined(CURL_DISABLE_HTTP) && defined(USE_NTLM) && \
     defined(NTLM_WB_ENABLED)
 
-/* this is for creating ntlm header output by delegating challenge/response
-   to Samba's winbind daemon helper ntlm_auth */
+/* this is for ntlm header input */
+CURLcode Curl_input_ntlm_wb(struct connectdata *conn, bool proxy,
+                            const char *header);
+
+/* this is for creating ntlm header output */
 CURLcode Curl_output_ntlm_wb(struct connectdata *conn, bool proxy);
 
-void Curl_ntlm_wb_cleanup(struct connectdata *conn);
+void Curl_http_auth_cleanup_ntlm_wb(struct connectdata *conn);
 
 #endif /* !CURL_DISABLE_HTTP && USE_NTLM && NTLM_WB_ENABLED */
 
index 68f3e44..f429634 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -22,6 +22,8 @@
 
 #include "curl_setup.h"
 
+#if defined(USE_SSH)
+
 #include <curl/curl.h>
 #include "curl_memory.h"
 #include "curl_path.h"
@@ -53,7 +55,7 @@ CURLcode Curl_getworkingpath(struct connectdata *conn,
     }
     if((working_path_len > 3) && (!memcmp(working_path, "/~/", 3)))
       /* It is referenced to the home directory, so strip the leading '/~/' */
-      memcpy(real_path, working_path + 3, 4 + working_path_len-3);
+      memcpy(real_path, working_path + 3, working_path_len - 2);
     else
       memcpy(real_path, working_path, 1 + working_path_len);
   }
@@ -193,3 +195,5 @@ CURLcode Curl_get_pathname(const char **cpp, char **path, char *homedir)
   Curl_safefree(*path);
   return CURLE_QUOTE_ERROR;
 }
+
+#endif /* if SSH is used */
index 49857cd..0d37b8e 100644 (file)
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -31,7 +31,7 @@
 
 # undef printf
 # undef fprintf
-# undef snprintf
+# undef msnprintf
 # undef vprintf
 # undef vfprintf
 # undef vsnprintf
 # undef vaprintf
 # define printf curl_mprintf
 # define fprintf curl_mfprintf
-# define snprintf curl_msnprintf
+# define msnprintf curl_msnprintf
 # define vprintf curl_mvprintf
 # define vfprintf curl_mvfprintf
-# define vsnprintf curl_mvsnprintf
+# define mvsnprintf curl_mvsnprintf
 # define aprintf curl_maprintf
 # define vaprintf curl_mvaprintf
-
-/* We define away the sprintf functions unconditonally since we don't want
-   internal code to be using them, intentionally or by mistake!*/
-# undef sprintf
-# undef vsprintf
-# define sprintf sprintf_was_used
-# define vsprintf vsprintf_was_used
-
 #endif /* HEADER_CURL_PRINTF_H */
index f09f2f3..df8f2b1 100644 (file)
@@ -5,7 +5,7 @@
  *                | (__| |_| |  _ <| |___
  *                 \___|\___/|_| \_\_____|
  *
- * Copyright (C) 2012 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 2012 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  * Copyright (C) 2010, Howard Chu, <hyc@highlandsun.com>
  *
  * This software is licensed as described in the file COPYING, which
@@ -199,13 +199,13 @@ static CURLcode rtmp_setup_connection(struct connectdata *conn)
     RTMP_Free(r);
     return CURLE_URL_MALFORMAT;
   }
-  conn->proto.generic = r;
+  conn->proto.rtmp = r;
   return CURLE_OK;
 }
 
 static CURLcode rtmp_connect(struct connectdata *conn, bool *done)
 {
-  RTMP *r = conn->proto.generic;
+  RTMP *r = conn->proto.rtmp;
   SET_RCVTIMEO(tv, 10);
 
   r->m_sb.sb_socket = (int)conn->sock[FIRSTSOCKET];
@@ -239,17 +239,18 @@ static CURLcode rtmp_connect(struct connectdata *conn, bool *done)
 
 static CURLcode rtmp_do(struct connectdata *conn, bool *done)
 {
-  RTMP *r = conn->proto.generic;
+  struct Curl_easy *data = conn->data;
+  RTMP *r = conn->proto.rtmp;
 
   if(!RTMP_ConnectStream(r, 0))
     return CURLE_FAILED_INIT;
 
   if(conn->data->set.upload) {
-    Curl_pgrsSetUploadSize(conn->data, conn->data->state.infilesize);
-    Curl_setup_transfer(conn, -1, -1, FALSE, NULL, FIRSTSOCKET, NULL);
+    Curl_pgrsSetUploadSize(data, data->state.infilesize);
+    Curl_setup_transfer(data, -1, -1, FALSE, FIRSTSOCKET);
   }
   else
-    Curl_setup_transfer(conn, FIRSTSOCKET, -1, FALSE, NULL, -1, NULL);
+    Curl_setup_transfer(data, FIRSTSOCKET, -1, FALSE, -1);
   *done = TRUE;
   return CURLE_OK;
 }
@@ -267,10 +268,10 @@ static CURLcode rtmp_done(struct connectdata *conn, CURLcode status,
 static CURLcode rtmp_disconnect(struct connectdata *conn,
                                 bool dead_connection)
 {
-  RTMP *r = conn->proto.generic;
+  RTMP *r = conn->proto.rtmp;
   (void)dead_connection;
   if(r) {
-    conn->proto.generic = NULL;
+    conn->proto.rtmp = NULL;
     RTMP_Close(r);
     RTMP_Free(r);
   }
@@ -280,7 +281,7 @@ static CURLcode rtmp_disconnect(struct connectdata *conn,
 static ssize_t rtmp_recv(struct connectdata *conn, int sockindex, char *buf,
                          size_t len, CURLcode *err)
 {
-  RTMP *r = conn->proto.generic;
+  RTMP *r = conn->proto.rtmp;
   ssize_t nread;
 
   (void)sockindex; /* unused */
@@ -301,7 +302,7 @@ static ssize_t rtmp_recv(struct connectdata *conn, int sockindex, char *buf,
 static ssize_t rtmp_send(struct connectdata *conn, int sockindex,
                          const void *buf, size_t len, CURLcode *err)
 {
-  RTMP *r = conn->proto.generic;
+  RTMP *r = conn->proto.rtmp;
   ssize_t num;
 
   (void)sockindex; /* unused */
index 3306e22..86a0138 100644 (file)
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 2010, Howard Chu, <hyc@highlandsun.com>
+ * Copyright (C) 2010 - 2019, Howard Chu, <hyc@highlandsun.com>
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
index 354bc54..0aa1f5b 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 2012 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 2012 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -31,6 +31,9 @@
 
 #include "curl_setup.h"
 
+#if !defined(CURL_DISABLE_IMAP) || !defined(CURL_DISABLE_SMTP) || \
+  !defined(CURL_DISABLE_POP3)
+
 #include <curl/curl.h>
 #include "urldata.h"
 
@@ -83,14 +86,14 @@ void Curl_sasl_cleanup(struct connectdata *conn, unsigned int authused)
 #if defined(USE_KERBEROS5)
   /* Cleanup the gssapi structure */
   if(authused == SASL_MECH_GSSAPI) {
-    Curl_auth_gssapi_cleanup(&conn->krb5);
+    Curl_auth_cleanup_gssapi(&conn->krb5);
   }
 #endif
 
 #if defined(USE_NTLM)
   /* Cleanup the NTLM structure */
   if(authused == SASL_MECH_NTLM) {
-    Curl_auth_ntlm_cleanup(&conn->ntlm);
+    Curl_auth_cleanup_ntlm(&conn->ntlm);
   }
 #endif
 
@@ -290,7 +293,7 @@ CURLcode Curl_sasl_start(struct SASL *sasl, struct connectdata *conn,
 #if defined(USE_KERBEROS5)
     if((enabledmechs & SASL_MECH_GSSAPI) && Curl_auth_is_gssapi_supported() &&
        Curl_auth_user_contains_domain(conn->user)) {
-      sasl->mutual_auth = FALSE; /* TODO: Calculate mutual authentication */
+      sasl->mutual_auth = FALSE;
       mech = SASL_MECH_STRING_GSSAPI;
       state1 = SASL_GSSAPI;
       state2 = SASL_GSSAPI_TOKEN;
@@ -300,8 +303,7 @@ CURLcode Curl_sasl_start(struct SASL *sasl, struct connectdata *conn,
         result = Curl_auth_create_gssapi_user_message(data, conn->user,
                                                       conn->passwd,
                                                       service,
-                                                      data->easy_conn->
-                                                            host.name,
+                                                      data->conn->host.name,
                                                       sasl->mutual_auth,
                                                       NULL, &conn->krb5,
                                                       &resp, &len);
@@ -358,10 +360,9 @@ CURLcode Curl_sasl_start(struct SASL *sasl, struct connectdata *conn,
       sasl->authused = SASL_MECH_XOAUTH2;
 
       if(force_ir || data->set.sasl_ir)
-        result = Curl_auth_create_oauth_bearer_message(data, conn->user,
-                                                       NULL, 0,
-                                                       conn->oauth_bearer,
-                                                       &resp, &len);
+        result = Curl_auth_create_xoauth_bearer_message(data, conn->user,
+                                                        conn->oauth_bearer,
+                                                        &resp, &len);
     }
     else if(enabledmechs & SASL_MECH_PLAIN) {
       mech = SASL_MECH_STRING_PLAIN;
@@ -369,7 +370,8 @@ CURLcode Curl_sasl_start(struct SASL *sasl, struct connectdata *conn,
       sasl->authused = SASL_MECH_PLAIN;
 
       if(force_ir || data->set.sasl_ir)
-        result = Curl_auth_create_plain_message(data, conn->user, conn->passwd,
+        result = Curl_auth_create_plain_message(data, conn->sasl_authzid,
+                                                conn->user, conn->passwd,
                                                 &resp, &len);
     }
     else if(enabledmechs & SASL_MECH_LOGIN) {
@@ -452,9 +454,9 @@ CURLcode Curl_sasl_continue(struct SASL *sasl, struct connectdata *conn,
     *progress = SASL_DONE;
     return result;
   case SASL_PLAIN:
-    result = Curl_auth_create_plain_message(data, conn->user, conn->passwd,
-                                            &resp,
-                                            &len);
+    result = Curl_auth_create_plain_message(data, conn->sasl_authzid,
+                                            conn->user, conn->passwd,
+                                            &resp, &len);
     break;
   case SASL_LOGIN:
     result = Curl_auth_create_login_message(data, conn->user, &resp, &len);
@@ -517,7 +519,7 @@ CURLcode Curl_sasl_continue(struct SASL *sasl, struct connectdata *conn,
     result = Curl_auth_create_gssapi_user_message(data, conn->user,
                                                   conn->passwd,
                                                   service,
-                                                  data->easy_conn->host.name,
+                                                  data->conn->host.name,
                                                   sasl->mutual_auth, NULL,
                                                   &conn->krb5,
                                                   &resp, &len);
@@ -563,10 +565,9 @@ CURLcode Curl_sasl_continue(struct SASL *sasl, struct connectdata *conn,
       newstate = SASL_OAUTH2_RESP;
     }
     else
-      result = Curl_auth_create_oauth_bearer_message(data, conn->user,
-                                                     NULL, 0,
-                                                     conn->oauth_bearer,
-                                                     &resp, &len);
+      result = Curl_auth_create_xoauth_bearer_message(data, conn->user,
+                                                      conn->oauth_bearer,
+                                                      &resp, &len);
     break;
 
   case SASL_OAUTH2_RESP:
@@ -627,3 +628,4 @@ CURLcode Curl_sasl_continue(struct SASL *sasl, struct connectdata *conn,
 
   return result;
 }
+#endif /* protocols are enabled that use SASL */
index b845015..4ecda6a 100644 (file)
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
 #endif
 
 /*
+ * Disable Visual Studio warnings:
+ * 4127 "conditional expression is constant"
+ */
+#ifdef _MSC_VER
+#pragma warning(disable:4127)
+#endif
+
+/*
  * Define WIN32 when build target is Win32 API
  */
 
 #  include "config-vxworks.h"
 #endif
 
+#ifdef __PLAN9__
+#  include "config-plan9.h"
+#endif
+
 #endif /* HAVE_CONFIG_H */
 
 /* ================================================================ */
 #endif
 
 #ifdef __AMIGA__
-#  ifndef __ixemul__
-#    include <exec/types.h>
-#    include <exec/execbase.h>
-#    include <proto/exec.h>
-#    include <proto/dos.h>
+#  include <exec/types.h>
+#  include <exec/execbase.h>
+#  include <proto/exec.h>
+#  include <proto/dos.h>
+#  ifdef HAVE_PROTO_BSDSOCKET_H
+#    include <proto/bsdsocket.h> /* ensure bsdsocket.library use */
 #    define select(a,b,c,d,e) WaitSelect(a,b,c,d,e,0)
 #  endif
 #endif
 #ifdef WIN32
 
 #  define DIR_CHAR      "\\"
-#  define DOT_CHAR      "_"
 
 #else /* WIN32 */
 
 #  endif
 
 #  define DIR_CHAR      "/"
-#  ifndef DOT_CHAR
-#    define DOT_CHAR      "."
-#  endif
-
-#  ifdef MSDOS
-#    undef DOT_CHAR
-#    define DOT_CHAR      "_"
-#  endif
 
 #  ifndef fileno /* sunos 4 have this as a macro! */
      int fileno(FILE *stream);
  * Mutually exclusive CURLRES_* definitions.
  */
 
+#if defined(ENABLE_IPV6) && defined(HAVE_GETADDRINFO)
+#  define CURLRES_IPV6
+#else
+#  define CURLRES_IPV4
+#endif
+
 #ifdef USE_ARES
 #  define CURLRES_ASYNCH
 #  define CURLRES_ARES
 #  define CURLRES_SYNCH
 #endif
 
-#ifdef ENABLE_IPV6
-#  define CURLRES_IPV6
-#else
-#  define CURLRES_IPV4
-#endif
-
 /* ---------------------------------------------------------------- */
 
 /*
@@ -646,9 +650,10 @@ int netware_init(void);
 #define LIBIDN_REQUIRED_VERSION "0.4.1"
 
 #if defined(USE_GNUTLS) || defined(USE_OPENSSL) || defined(USE_NSS) || \
-    defined(USE_POLARSSL) || defined(USE_AXTLS) || defined(USE_MBEDTLS) || \
-    defined(USE_CYASSL) || defined(USE_SCHANNEL) || \
-    defined(USE_DARWINSSL) || defined(USE_GSKIT) || defined(USE_MESALINK)
+    defined(USE_MBEDTLS) || \
+    defined(USE_WOLFSSL) || defined(USE_SCHANNEL) || \
+    defined(USE_SECTRANSP) || defined(USE_GSKIT) || defined(USE_MESALINK) || \
+    defined(USE_BEARSSL)
 #define USE_SSL    /* SSL support has been enabled */
 #endif
 
@@ -667,7 +672,7 @@ int netware_init(void);
 /* Single point where USE_NTLM definition might be defined */
 #if !defined(CURL_DISABLE_NTLM) && !defined(CURL_DISABLE_CRYPTO_AUTH)
 #if defined(USE_OPENSSL) || defined(USE_WINDOWS_SSPI) || \
-    defined(USE_GNUTLS) || defined(USE_NSS) || defined(USE_DARWINSSL) || \
+    defined(USE_GNUTLS) || defined(USE_NSS) || defined(USE_SECTRANSP) || \
     defined(USE_OS400CRYPTO) || defined(USE_WIN32_CRYPTO) || \
     defined(USE_MBEDTLS)
 
@@ -685,6 +690,10 @@ int netware_init(void);
 #error "No longer supported. Set CURLOPT_CAINFO at runtime instead."
 #endif
 
+#if defined(USE_LIBSSH2) || defined(USE_LIBSSH) || defined(USE_WOLFSSH)
+#define USE_SSH
+#endif
+
 /*
  * Provide a mechanism to silence picky compilers, such as gcc 4.6+.
  * Parameters should of course normally not be unused, but for example when
@@ -713,7 +722,7 @@ int netware_init(void);
  */
 
 #ifndef Curl_nop_stmt
-#  define Curl_nop_stmt do { } WHILE_FALSE
+#  define Curl_nop_stmt do { } while(0)
 #endif
 
 /*
@@ -816,4 +825,14 @@ int getpwuid_r(uid_t uid, struct passwd *pwd, char *buf,
                size_t buflen, struct passwd **result);
 #endif
 
+#ifdef DEBUGBUILD
+#define UNITTEST
+#else
+#define UNITTEST static
+#endif
+
+#if defined(USE_NGTCP2) || defined(USE_QUICHE)
+#define ENABLE_QUIC
+#endif
+
 #endif /* HEADER_CURL_SETUP_H */
index 413ccea..8890f38 100644 (file)
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -330,27 +330,6 @@ struct timeval {
 #include "curl_ctype.h"
 
 /*
- * Macro WHILE_FALSE may be used to build single-iteration do-while loops,
- * avoiding compiler warnings. Mostly intended for other macro definitions.
- */
-
-#define WHILE_FALSE  while(0)
-
-#if defined(_MSC_VER) && !defined(__POCC__)
-#  undef WHILE_FALSE
-#  if (_MSC_VER < 1500)
-#    define WHILE_FALSE  while(1, 0)
-#  else
-#    define WHILE_FALSE \
-__pragma(warning(push)) \
-__pragma(warning(disable:4127)) \
-while(0) \
-__pragma(warning(pop))
-#  endif
-#endif
-
-
-/*
  * Typedef to 'int' if sig_atomic_t is not an available 'typedefed' type.
  */
 
@@ -387,7 +366,7 @@ typedef int sig_atomic_t;
 #ifdef DEBUGBUILD
 #define DEBUGF(x) x
 #else
-#define DEBUGF(x) do { } WHILE_FALSE
+#define DEBUGF(x) do { } while(0)
 #endif
 
 
@@ -395,10 +374,11 @@ typedef int sig_atomic_t;
  * Macro used to include assertion code only in debug builds.
  */
 
+#undef DEBUGASSERT
 #if defined(DEBUGBUILD) && defined(HAVE_ASSERT_H)
 #define DEBUGASSERT(x) assert(x)
 #else
-#define DEBUGASSERT(x) do { } WHILE_FALSE
+#define DEBUGASSERT(x) do { } while(0)
 #endif
 
 
index 6db4b04..14b6414 100644 (file)
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2010, Florin Petriuc, <petriuc.florin@gmail.com>
+ * Copyright (C) 1998 - 2019, Florin Petriuc, <petriuc.florin@gmail.com>
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
index 1d0de4e..f7cc10f 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
index 2bbf947..c09026e 100644 (file)
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
index 8e5937a..064c075 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
index 2a93644..65d1a79 100644 (file)
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
index 4c77d4f..3e9b516 100644 (file)
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
 # undef printf
 # undef fprintf
 # undef sprintf
-# undef snprintf
+# undef msnprintf
 # undef vprintf
 # undef vfprintf
 # undef vsprintf
-# undef vsnprintf
+# undef mvsnprintf
 # undef aprintf
 # undef vaprintf
 
 # define printf curlx_mprintf
 # define fprintf curlx_mfprintf
 # define sprintf curlx_msprintf
-# define snprintf curlx_msnprintf
+# define msnprintf curlx_msnprintf
 # define vprintf curlx_mvprintf
 # define vfprintf curlx_mvfprintf
-# define vsprintf curlx_mvsprintf
-# define vsnprintf curlx_mvsnprintf
+# define mvsnprintf curlx_mvsnprintf
 # define aprintf curlx_maprintf
 # define vaprintf curlx_mvaprintf
 #endif /* ENABLE_CURLX_PRINTF */
index 78ef046..208a233 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -137,7 +137,6 @@ static CURLcode dict_do(struct connectdata *conn, bool *done)
   curl_socket_t sockfd = conn->sock[FIRSTSOCKET];
 
   char *path = data->state.up.path;
-  curl_off_t *bytecount = &data->req.bytecount;
 
   *done = TRUE; /* unconditionally */
 
@@ -200,8 +199,7 @@ static CURLcode dict_do(struct connectdata *conn, bool *done)
       failf(data, "Failed sending DICT request");
       return result;
     }
-    Curl_setup_transfer(conn, FIRSTSOCKET, -1, FALSE, bytecount,
-                        -1, NULL); /* no upload */
+    Curl_setup_transfer(data, FIRSTSOCKET, -1, FALSE, -1); /* no upload */
   }
   else if(strncasecompare(path, DICT_DEFINE, sizeof(DICT_DEFINE)-1) ||
           strncasecompare(path, DICT_DEFINE2, sizeof(DICT_DEFINE2)-1) ||
@@ -247,8 +245,7 @@ static CURLcode dict_do(struct connectdata *conn, bool *done)
       failf(data, "Failed sending DICT request");
       return result;
     }
-    Curl_setup_transfer(conn, FIRSTSOCKET, -1, FALSE, bytecount,
-                        -1, NULL); /* no upload */
+    Curl_setup_transfer(data, FIRSTSOCKET, -1, FALSE, -1);
   }
   else {
 
@@ -270,7 +267,7 @@ static CURLcode dict_do(struct connectdata *conn, bool *done)
         return result;
       }
 
-      Curl_setup_transfer(conn, FIRSTSOCKET, -1, FALSE, bytecount, -1, NULL);
+      Curl_setup_transfer(data, FIRSTSOCKET, -1, FALSE, -1);
     }
   }
 
index 12c0f33..38a55ac 100644 (file)
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2009, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
index ef6013d..7f4eee5 100644 (file)
--- a/lib/doh.c
+++ b/lib/doh.c
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 2018 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
 
 #include "curl_setup.h"
 
+#ifndef CURL_DISABLE_DOH
+
 #include "urldata.h"
 #include "curl_addrinfo.h"
 #include "doh.h"
 
-#ifdef USE_NGHTTP2
 #include "sendf.h"
 #include "multiif.h"
 #include "url.h"
 #include "share.h"
 #include "curl_base64.h"
 #include "connect.h"
+#include "strdup.h"
 /* The last 3 #include files should be in this order */
 #include "curl_printf.h"
 #include "curl_memory.h"
@@ -72,17 +74,50 @@ static const char *doh_strerror(DOHcode code)
 #define UNITTEST static
 #endif
 
+/* @unittest 1655
+ */
 UNITTEST DOHcode doh_encode(const char *host,
                             DNStype dnstype,
                             unsigned char *dnsp, /* buffer */
                             size_t len,  /* buffer size */
                             size_t *olen) /* output length */
 {
-  size_t hostlen = strlen(host);
+  const size_t hostlen = strlen(host);
   unsigned char *orig = dnsp;
   const char *hostp = host;
 
-  if(len < (12 + hostlen + 4))
+  /* The expected output length is 16 bytes more than the length of
+   * the QNAME-encoding of the host name.
+   *
+   * A valid DNS name may not contain a zero-length label, except at
+   * the end.  For this reason, a name beginning with a dot, or
+   * containing a sequence of two or more consecutive dots, is invalid
+   * and cannot be encoded as a QNAME.
+   *
+   * If the host name ends with a trailing dot, the corresponding
+   * QNAME-encoding is one byte longer than the host name. If (as is
+   * also valid) the hostname is shortened by the omission of the
+   * trailing dot, then its QNAME-encoding will be two bytes longer
+   * than the host name.
+   *
+   * Each [ label, dot ] pair is encoded as [ length, label ],
+   * preserving overall length.  A final [ label ] without a dot is
+   * also encoded as [ length, label ], increasing overall length
+   * by one. The encoding is completed by appending a zero byte,
+   * representing the zero-length root label, again increasing
+   * the overall length by one.
+   */
+
+  size_t expected_len;
+  DEBUGASSERT(hostlen);
+  expected_len = 12 + 1 + hostlen + 4;
+  if(host[hostlen-1]!='.')
+    expected_len++;
+
+  if(expected_len > (256 + 16)) /* RFCs 1034, 1035 */
+    return DOH_DNS_NAME_TOO_LONG;
+
+  if(len < expected_len)
     return DOH_TOO_SMALL_BUFFER;
 
   *dnsp++ = 0; /* 16 bit id */
@@ -98,38 +133,43 @@ UNITTEST DOHcode doh_encode(const char *host,
   *dnsp++ = '\0';
   *dnsp++ = '\0'; /* ARCOUNT */
 
-  /* store a QNAME */
-  do {
-    char *dot = strchr(hostp, '.');
+  /* encode each label and store it in the QNAME */
+  while(*hostp) {
     size_t labellen;
-    bool found = false;
-    if(dot) {
-      found = true;
+    char *dot = strchr(hostp, '.');
+    if(dot)
       labellen = dot - hostp;
-    }
     else
       labellen = strlen(hostp);
-    if(labellen > 63) {
-      /* too long label, error out */
+    if((labellen > 63) || (!labellen)) {
+      /* label is too long or too short, error out */
       *olen = 0;
       return DOH_DNS_BAD_LABEL;
     }
+    /* label is non-empty, process it */
     *dnsp++ = (unsigned char)labellen;
     memcpy(dnsp, hostp, labellen);
     dnsp += labellen;
-    hostp += labellen + 1;
-    if(!found) {
-      *dnsp++ = 0; /* terminating zero */
-      break;
-    }
-  } while(1);
+    hostp += labellen;
+    /* advance past dot, but only if there is one */
+    if(dot)
+      hostp++;
+  } /* next label */
+
+  *dnsp++ = 0; /* append zero-length label for root */
+
+  /* There are assigned TYPE codes beyond 255: use range [1..65535]  */
+  *dnsp++ = (unsigned char)(255 & (dnstype>>8)); /* upper 8 bit TYPE */
+  *dnsp++ = (unsigned char)(255 & dnstype);      /* lower 8 bit TYPE */
 
-  *dnsp++ = '\0'; /* upper 8 bit TYPE */
-  *dnsp++ = (unsigned char)dnstype;
   *dnsp++ = '\0'; /* upper 8 bit CLASS */
   *dnsp++ = DNS_CLASS_IN; /* IN - "the Internet" */
 
   *olen = dnsp - orig;
+
+  /* verify that our estimation of length is valid, since
+   * this has led to buffer overflows in this function */
+  DEBUGASSERT(*olen == expected_len);
   return DOH_OK;
 }
 
@@ -143,8 +183,8 @@ doh_write_cb(void *contents, size_t size, size_t nmemb, void *userp)
     /* suspiciously much for us */
     return 0;
 
-  mem->memory = realloc(mem->memory, mem->size + realsize);
-  if(mem->memory == NULL)
+  mem->memory = Curl_saferealloc(mem->memory, mem->size + realsize);
+  if(!mem->memory)
     /* out of memory! */
     return 0;
 
@@ -160,7 +200,7 @@ static int Curl_doh_done(struct Curl_easy *doh, CURLcode result)
   struct Curl_easy *data = doh->set.dohfor;
   /* so one of the DOH request done for the 'data' transfer is now complete! */
   data->req.doh.pending--;
-  infof(data, "a DOH request is completed, %d to go\n", data->req.doh.pending);
+  infof(data, "a DOH request is completed, %u to go\n", data->req.doh.pending);
   if(result)
     infof(data, "DOH request %s\n", curl_easy_strerror(result));
 
@@ -173,8 +213,12 @@ static int Curl_doh_done(struct Curl_easy *doh, CURLcode result)
   return 0;
 }
 
-#define ERROR_CHECK_SETOPT(x,y) result = curl_easy_setopt(doh, x, y);   \
-  if(result) goto error
+#define ERROR_CHECK_SETOPT(x,y) \
+do {                                      \
+  result = curl_easy_setopt(doh, x, y);   \
+  if(result)                              \
+    goto error;                           \
+} while(0)
 
 static CURLcode dohprobe(struct Curl_easy *data,
                          struct dnsprobe *p, DNStype dnstype,
@@ -219,7 +263,10 @@ static CURLcode dohprobe(struct Curl_easy *data,
   }
 
   timeout_ms = Curl_timeleft(data, NULL, TRUE);
-
+  if(timeout_ms <= 0) {
+    result = CURLE_OPERATION_TIMEDOUT;
+    goto error;
+  }
   /* Curl_open() is the internal version of curl_easy_init() */
   result = Curl_open(&doh);
   if(!result) {
@@ -234,13 +281,81 @@ static CURLcode dohprobe(struct Curl_easy *data,
       ERROR_CHECK_SETOPT(CURLOPT_POSTFIELDSIZE, (long)p->dohlen);
     }
     ERROR_CHECK_SETOPT(CURLOPT_HTTPHEADER, headers);
+#ifdef USE_NGHTTP2
     ERROR_CHECK_SETOPT(CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_2TLS);
+#endif
 #ifndef CURLDEBUG
     /* enforce HTTPS if not debug */
     ERROR_CHECK_SETOPT(CURLOPT_PROTOCOLS, CURLPROTO_HTTPS);
+#else
+    /* in debug mode, also allow http */
+    ERROR_CHECK_SETOPT(CURLOPT_PROTOCOLS, CURLPROTO_HTTP|CURLPROTO_HTTPS);
 #endif
     ERROR_CHECK_SETOPT(CURLOPT_TIMEOUT_MS, (long)timeout_ms);
-    ERROR_CHECK_SETOPT(CURLOPT_VERBOSE, 1L);
+    if(data->set.verbose)
+      ERROR_CHECK_SETOPT(CURLOPT_VERBOSE, 1L);
+    if(data->set.no_signal)
+      ERROR_CHECK_SETOPT(CURLOPT_NOSIGNAL, 1L);
+
+    /* Inherit *some* SSL options from the user's transfer. This is a
+       best-guess as to which options are needed for compatibility. #3661 */
+    if(data->set.ssl.falsestart)
+      ERROR_CHECK_SETOPT(CURLOPT_SSL_FALSESTART, 1L);
+    if(data->set.ssl.primary.verifyhost)
+      ERROR_CHECK_SETOPT(CURLOPT_SSL_VERIFYHOST, 2L);
+#ifndef CURL_DISABLE_PROXY
+    if(data->set.proxy_ssl.primary.verifyhost)
+      ERROR_CHECK_SETOPT(CURLOPT_PROXY_SSL_VERIFYHOST, 2L);
+    if(data->set.proxy_ssl.primary.verifypeer)
+      ERROR_CHECK_SETOPT(CURLOPT_PROXY_SSL_VERIFYPEER, 1L);
+    if(data->set.str[STRING_SSL_CAFILE_PROXY]) {
+      ERROR_CHECK_SETOPT(CURLOPT_PROXY_CAINFO,
+        data->set.str[STRING_SSL_CAFILE_PROXY]);
+    }
+    if(data->set.str[STRING_SSL_CRLFILE_PROXY]) {
+      ERROR_CHECK_SETOPT(CURLOPT_PROXY_CRLFILE,
+        data->set.str[STRING_SSL_CRLFILE_PROXY]);
+    }
+    if(data->set.proxy_ssl.no_revoke)
+      ERROR_CHECK_SETOPT(CURLOPT_PROXY_SSL_OPTIONS, CURLSSLOPT_NO_REVOKE);
+    if(data->set.str[STRING_SSL_CAPATH_PROXY]) {
+      ERROR_CHECK_SETOPT(CURLOPT_PROXY_CAPATH,
+        data->set.str[STRING_SSL_CAPATH_PROXY]);
+    }
+#endif
+    if(data->set.ssl.primary.verifypeer)
+      ERROR_CHECK_SETOPT(CURLOPT_SSL_VERIFYPEER, 1L);
+    if(data->set.ssl.primary.verifystatus)
+      ERROR_CHECK_SETOPT(CURLOPT_SSL_VERIFYSTATUS, 1L);
+    if(data->set.str[STRING_SSL_CAFILE_ORIG]) {
+      ERROR_CHECK_SETOPT(CURLOPT_CAINFO,
+        data->set.str[STRING_SSL_CAFILE_ORIG]);
+    }
+    if(data->set.str[STRING_SSL_CAPATH_ORIG]) {
+      ERROR_CHECK_SETOPT(CURLOPT_CAPATH,
+        data->set.str[STRING_SSL_CAPATH_ORIG]);
+    }
+    if(data->set.str[STRING_SSL_CRLFILE_ORIG]) {
+      ERROR_CHECK_SETOPT(CURLOPT_CRLFILE,
+        data->set.str[STRING_SSL_CRLFILE_ORIG]);
+    }
+    if(data->set.ssl.certinfo)
+      ERROR_CHECK_SETOPT(CURLOPT_CERTINFO, 1L);
+    if(data->set.str[STRING_SSL_RANDOM_FILE]) {
+      ERROR_CHECK_SETOPT(CURLOPT_RANDOM_FILE,
+        data->set.str[STRING_SSL_RANDOM_FILE]);
+    }
+    if(data->set.str[STRING_SSL_EGDSOCKET]) {
+      ERROR_CHECK_SETOPT(CURLOPT_EGDSOCKET,
+        data->set.str[STRING_SSL_EGDSOCKET]);
+    }
+    if(data->set.ssl.no_revoke)
+      ERROR_CHECK_SETOPT(CURLOPT_SSL_OPTIONS, CURLSSLOPT_NO_REVOKE);
+    if(data->set.ssl.fsslctx)
+      ERROR_CHECK_SETOPT(CURLOPT_SSL_CTX_FUNCTION, data->set.ssl.fsslctx);
+    if(data->set.ssl.fsslctxp)
+      ERROR_CHECK_SETOPT(CURLOPT_SSL_CTX_DATA, data->set.ssl.fsslctxp);
+
     doh->set.fmultidone = Curl_doh_done;
     doh->set.dohfor = data; /* identify for which transfer this is done */
     p->easy = doh;
@@ -256,7 +371,7 @@ static CURLcode dohprobe(struct Curl_easy *data,
 
   error:
   free(nurl);
-  Curl_close(doh);
+  Curl_close(&doh);
   return result;
 }
 
@@ -272,6 +387,7 @@ Curl_addrinfo *Curl_doh(struct connectdata *conn,
 {
   struct Curl_easy *data = conn->data;
   CURLcode result = CURLE_OK;
+  int slot;
   *waitp = TRUE; /* this never returns synchronously */
   (void)conn;
   (void)hostname;
@@ -290,8 +406,8 @@ Curl_addrinfo *Curl_doh(struct connectdata *conn,
 
   if(conn->ip_version != CURL_IPRESOLVE_V6) {
     /* create IPv4 DOH request */
-    result = dohprobe(data, &data->req.doh.probe[0], DNS_TYPE_A,
-                      hostname, data->set.str[STRING_DOH],
+    result = dohprobe(data, &data->req.doh.probe[DOH_PROBE_SLOT_IPADDR_V4],
+                      DNS_TYPE_A, hostname, data->set.str[STRING_DOH],
                       data->multi, data->req.doh.headers);
     if(result)
       goto error;
@@ -300,8 +416,8 @@ Curl_addrinfo *Curl_doh(struct connectdata *conn,
 
   if(conn->ip_version != CURL_IPRESOLVE_V4) {
     /* create IPv6 DOH request */
-    result = dohprobe(data, &data->req.doh.probe[1], DNS_TYPE_AAAA,
-                      hostname, data->set.str[STRING_DOH],
+    result = dohprobe(data, &data->req.doh.probe[DOH_PROBE_SLOT_IPADDR_V6],
+                      DNS_TYPE_AAAA, hostname, data->set.str[STRING_DOH],
                       data->multi, data->req.doh.headers);
     if(result)
       goto error;
@@ -312,10 +428,9 @@ Curl_addrinfo *Curl_doh(struct connectdata *conn,
   error:
   curl_slist_free_all(data->req.doh.headers);
   data->req.doh.headers = NULL;
-  curl_easy_cleanup(data->req.doh.probe[0].easy);
-  data->req.doh.probe[0].easy = NULL;
-  curl_easy_cleanup(data->req.doh.probe[1].easy);
-  data->req.doh.probe[1].easy = NULL;
+  for(slot = 0; slot < DOH_PROBE_SLOTS; slot++) {
+    Curl_close(&data->req.doh.probe[slot].easy);
+  }
   return NULL;
 }
 
@@ -350,8 +465,14 @@ static unsigned short get16bit(unsigned char *doh, int index)
 
 static unsigned int get32bit(unsigned char *doh, int index)
 {
-  return (doh[index] << 24) | (doh[index + 1] << 16) |
-    (doh[index + 2] << 8) | doh[index + 3];
+   /* make clang and gcc optimize this to bswap by incrementing
+      the pointer first. */
+   doh += index;
+
+   /* avoid undefined behaviour by casting to unsigned before shifting
+      24 bits, possibly into the sign bit. codegen is same, but
+      ub sanitizer won't be upset */
+  return ( (unsigned)doh[0] << 24) | (doh[1] << 16) |(doh[2] << 8) | doh[3];
 }
 
 static DOHcode store_a(unsigned char *doh, int index, struct dohentry *d)
@@ -492,6 +613,9 @@ static DOHcode rdata(unsigned char *doh,
     if(rc)
       return rc;
     break;
+  case DNS_TYPE_DNAME:
+    /* explicit for clarity; just skip; rely on synthesized CNAME  */
+    break;
   default:
     /* unsupported type, just skip it */
     break;
@@ -515,7 +639,6 @@ UNITTEST DOHcode doh_decode(unsigned char *doh,
   unsigned short qdcount;
   unsigned short ancount;
   unsigned short type = 0;
-  unsigned short class;
   unsigned short rdlength;
   unsigned short nscount;
   unsigned short arcount;
@@ -524,7 +647,7 @@ UNITTEST DOHcode doh_decode(unsigned char *doh,
 
   if(dohlen < 12)
     return DOH_TOO_SMALL_BUFFER; /* too small */
-  if(doh[0] || doh[1])
+  if(!doh || doh[0] || doh[1])
     return DOH_DNS_BAD_ID; /* bad ID */
   rcode = doh[3] & 0x0f;
   if(rcode)
@@ -543,6 +666,7 @@ UNITTEST DOHcode doh_decode(unsigned char *doh,
 
   ancount = get16bit(doh, 6);
   while(ancount) {
+    unsigned short class;
     unsigned int ttl;
 
     rc = skipqname(doh, dohlen, &index);
@@ -553,8 +677,10 @@ UNITTEST DOHcode doh_decode(unsigned char *doh,
       return DOH_DNS_OUT_OF_RANGE;
 
     type = get16bit(doh, index);
-    if((type != DNS_TYPE_CNAME) && (type != dnstype))
-      /* Not the same type as was asked for nor CNAME */
+    if((type != DNS_TYPE_CNAME)    /* may be synthesized from DNAME */
+       && (type != DNS_TYPE_DNAME) /* if present, accept and ignore */
+       && (type != dnstype))
+      /* Not the same type as was asked for nor CNAME nor DNAME */
       return DOH_DNS_UNEXPECTED_TYPE;
     index += 2;
 
@@ -660,13 +786,13 @@ static void showdoh(struct Curl_easy *data,
       char buffer[128];
       char *ptr;
       size_t len;
-      snprintf(buffer, 128, "DOH AAAA: ");
+      msnprintf(buffer, 128, "DOH AAAA: ");
       ptr = &buffer[10];
       len = 118;
       for(j = 0; j < 16; j += 2) {
         size_t l;
-        snprintf(ptr, len, "%s%02x%02x", j?":":"", d->addr[i].ip.v6[j],
-                 d->addr[i].ip.v6[j + 1]);
+        msnprintf(ptr, len, "%s%02x%02x", j?":":"", d->addr[i].ip.v6[j],
+                  d->addr[i].ip.v6[j + 1]);
         l = strlen(ptr);
         len -= l;
         ptr += l;
@@ -815,49 +941,46 @@ UNITTEST void de_cleanup(struct dohentry *d)
 CURLcode Curl_doh_is_resolved(struct connectdata *conn,
                               struct Curl_dns_entry **dnsp)
 {
+  CURLcode result;
   struct Curl_easy *data = conn->data;
   *dnsp = NULL; /* defaults to no response */
 
-  if(!data->req.doh.probe[0].easy && !data->req.doh.probe[1].easy) {
+  if(!data->req.doh.probe[DOH_PROBE_SLOT_IPADDR_V4].easy &&
+     !data->req.doh.probe[DOH_PROBE_SLOT_IPADDR_V6].easy) {
     failf(data, "Could not DOH-resolve: %s", conn->async.hostname);
     return conn->bits.proxy?CURLE_COULDNT_RESOLVE_PROXY:
       CURLE_COULDNT_RESOLVE_HOST;
   }
   else if(!data->req.doh.pending) {
-    DOHcode rc;
-    DOHcode rc2;
+    DOHcode rc[DOH_PROBE_SLOTS];
     struct dohentry de;
-    struct Curl_dns_entry *dns;
-    struct Curl_addrinfo *ai;
+    int slot;
     /* remove DOH handles from multi handle and close them */
-    curl_multi_remove_handle(data->multi, data->req.doh.probe[0].easy);
-    Curl_close(data->req.doh.probe[0].easy);
-    curl_multi_remove_handle(data->multi, data->req.doh.probe[1].easy);
-    Curl_close(data->req.doh.probe[1].easy);
-
+    for(slot = 0; slot < DOH_PROBE_SLOTS; slot++) {
+      curl_multi_remove_handle(data->multi, data->req.doh.probe[slot].easy);
+      Curl_close(&data->req.doh.probe[slot].easy);
+    }
     /* parse the responses, create the struct and return it! */
     init_dohentry(&de);
-    rc = doh_decode(data->req.doh.probe[0].serverdoh.memory,
-                    data->req.doh.probe[0].serverdoh.size,
-                    data->req.doh.probe[0].dnstype,
-                    &de);
-    free(data->req.doh.probe[0].serverdoh.memory);
-    if(rc) {
-      infof(data, "DOH: %s type %s for %s\n", doh_strerror(rc),
-            type2name(data->req.doh.probe[0].dnstype),
-            data->req.doh.host);
-    }
-    rc2 = doh_decode(data->req.doh.probe[1].serverdoh.memory,
-                     data->req.doh.probe[1].serverdoh.size,
-                     data->req.doh.probe[1].dnstype,
-                     &de);
-    free(data->req.doh.probe[1].serverdoh.memory);
-    if(rc2) {
-      infof(data, "DOG: %s type %s for %s\n", doh_strerror(rc2),
-            type2name(data->req.doh.probe[1].dnstype),
-            data->req.doh.host);
-    }
-    if(!rc || !rc2) {
+    for(slot = 0; slot < DOH_PROBE_SLOTS; slot++) {
+      rc[slot] = doh_decode(data->req.doh.probe[slot].serverdoh.memory,
+                            data->req.doh.probe[slot].serverdoh.size,
+                            data->req.doh.probe[slot].dnstype,
+                            &de);
+      Curl_safefree(data->req.doh.probe[slot].serverdoh.memory);
+      if(rc[slot]) {
+        infof(data, "DOH: %s type %s for %s\n", doh_strerror(rc[slot]),
+              type2name(data->req.doh.probe[slot].dnstype),
+              data->req.doh.host);
+      }
+    } /* next slot */
+
+    result = CURLE_COULDNT_RESOLVE_HOST; /* until we know better */
+    if(!rc[DOH_PROBE_SLOT_IPADDR_V4] || !rc[DOH_PROBE_SLOT_IPADDR_V6]) {
+      /* we have an address, of one kind or other */
+      struct Curl_dns_entry *dns;
+      struct Curl_addrinfo *ai;
+
       infof(data, "DOH Host name: %s\n", data->req.doh.host);
       showdoh(data, &de);
 
@@ -876,45 +999,27 @@ CURLcode Curl_doh_is_resolved(struct connectdata *conn,
       if(data->share)
         Curl_share_unlock(data, CURL_LOCK_DATA_DNS);
 
-      de_cleanup(&de);
-      if(!dns)
+      if(!dns) {
         /* returned failure, bail out nicely */
         Curl_freeaddrinfo(ai);
+      }
       else {
         conn->async.dns = dns;
         *dnsp = dns;
-        return CURLE_OK;
+        result = CURLE_OK;      /* address resolution OK */
       }
-    }
-    de_cleanup(&de);
+    } /* address processing done */
 
-    return CURLE_COULDNT_RESOLVE_HOST;
-  }
+    /* Now process any build-specific attributes retrieved from DNS */
 
-  return CURLE_OK;
-}
+    /* All done */
+    de_cleanup(&de);
+    return result;
 
-#else /* !USE_NGHTTP2 */
-/*
- */
-Curl_addrinfo *Curl_doh(struct connectdata *conn,
-                        const char *hostname,
-                        int port,
-                        int *waitp)
-{
-  (void)conn;
-  (void)hostname;
-  (void)port;
-  (void)waitp;
-  return NULL;
-}
+  } /* !data->req.doh.pending */
 
-CURLcode Curl_doh_is_resolved(struct connectdata *conn,
-                              struct Curl_dns_entry **dnsp)
-{
-  (void)conn;
-  (void)dnsp;
-  return CURLE_NOT_BUILT_IN;
+  /* else wait for pending DOH transactions to complete */
+  return CURLE_OK;
 }
 
-#endif /* USE_NGHTTP2 */
+#endif /* CURL_DISABLE_DOH */
index 83c79bc..fc053ed 100644 (file)
--- a/lib/doh.h
+++ b/lib/doh.h
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 2018 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -25,6 +25,8 @@
 #include "urldata.h"
 #include "curl_addrinfo.h"
 
+#ifndef CURL_DISABLE_DOH
+
 /*
  * Curl_doh() resolve a name using DoH (DNS-over-HTTPS). It resolves a name
  * and returns a 'Curl_addrinfo *' with the address information.
@@ -38,8 +40,7 @@ Curl_addrinfo *Curl_doh(struct connectdata *conn,
 CURLcode Curl_doh_is_resolved(struct connectdata *conn,
                               struct Curl_dns_entry **dns);
 
-int Curl_doh_getsock(struct connectdata *conn, curl_socket_t *socks,
-                     int numsocks);
+int Curl_doh_getsock(struct connectdata *conn, curl_socket_t *socks);
 
 typedef enum {
   DOH_OK,
@@ -54,14 +55,16 @@ typedef enum {
   DOH_DNS_UNEXPECTED_TYPE,  /* 9 */
   DOH_DNS_UNEXPECTED_CLASS, /* 10 */
   DOH_NO_CONTENT,           /* 11 */
-  DOH_DNS_BAD_ID            /* 12 */
+  DOH_DNS_BAD_ID,           /* 12 */
+  DOH_DNS_NAME_TOO_LONG     /* 13 */
 } DOHcode;
 
 typedef enum {
   DNS_TYPE_A = 1,
   DNS_TYPE_NS = 2,
   DNS_TYPE_CNAME = 5,
-  DNS_TYPE_AAAA = 28
+  DNS_TYPE_AAAA = 28,
+  DNS_TYPE_DNAME = 39           /* RFC6672 */
 } DNStype;
 
 #define DOH_MAX_ADDR 24
@@ -102,4 +105,10 @@ DOHcode doh_decode(unsigned char *doh,
                    struct dohentry *d);
 void de_cleanup(struct dohentry *d);
 #endif
+
+#else /* if DOH is disabled */
+#define Curl_doh(a,b,c,d) NULL
+#define Curl_doh_is_resolved(x,y) CURLE_COULDNT_RESOLVE_HOST
+#endif
+
 #endif /* HEADER_CURL_DOH_H */
index 2c6177a..fe4f497 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
index 125af43..f70b1db 100644 (file)
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
index 4de4e65..6382cee 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
 #include "warnless.h"
 #include "multiif.h"
 #include "sigpipe.h"
-#include "ssh.h"
+#include "vssh/ssh.h"
 #include "setopt.h"
 #include "http_digest.h"
+#include "system_win32.h"
 
 /* The last 3 #include files should be in this order */
 #include "curl_printf.h"
 
 void Curl_version_init(void);
 
-/* win32_cleanup() is for win32 socket cleanup functionality, the opposite
-   of win32_init() */
-static void win32_cleanup(void)
-{
-#ifdef USE_WINSOCK
-  WSACleanup();
-#endif
-#ifdef USE_WINDOWS_SSPI
-  Curl_sspi_global_cleanup();
-#endif
-}
-
-/* win32_init() performs win32 socket initialization to properly setup the
-   stack to allow networking */
-static CURLcode win32_init(void)
-{
-#ifdef USE_WINSOCK
-  WORD wVersionRequested;
-  WSADATA wsaData;
-  int res;
-
-#if defined(ENABLE_IPV6) && (USE_WINSOCK < 2)
-  Error IPV6_requires_winsock2
-#endif
-
-  wVersionRequested = MAKEWORD(USE_WINSOCK, USE_WINSOCK);
-
-  res = WSAStartup(wVersionRequested, &wsaData);
-
-  if(res != 0)
-    /* Tell the user that we couldn't find a usable */
-    /* winsock.dll.     */
-    return CURLE_FAILED_INIT;
-
-  /* Confirm that the Windows Sockets DLL supports what we need.*/
-  /* Note that if the DLL supports versions greater */
-  /* than wVersionRequested, it will still return */
-  /* wVersionRequested in wVersion. wHighVersion contains the */
-  /* highest supported version. */
-
-  if(LOBYTE(wsaData.wVersion) != LOBYTE(wVersionRequested) ||
-     HIBYTE(wsaData.wVersion) != HIBYTE(wVersionRequested) ) {
-    /* Tell the user that we couldn't find a usable */
-
-    /* winsock.dll. */
-    WSACleanup();
-    return CURLE_FAILED_INIT;
-  }
-  /* The Windows Sockets DLL is acceptable. Proceed. */
-#elif defined(USE_LWIPSOCK)
-  lwip_init();
-#endif
-
-#ifdef USE_WINDOWS_SSPI
-  {
-    CURLcode result = Curl_sspi_global_init();
-    if(result)
-      return result;
-  }
-#endif
-
-  return CURLE_OK;
-}
-
 /* true globals -- for curl_global_init() and curl_global_cleanup() */
 static unsigned int  initialized;
 static long          init_flags;
@@ -220,19 +157,20 @@ static CURLcode global_init(long flags, bool memoryfuncs)
 
   if(!Curl_ssl_init()) {
     DEBUGF(fprintf(stderr, "Error: Curl_ssl_init failed\n"));
-    return CURLE_FAILED_INIT;
+    goto fail;
   }
 
-  if(flags & CURL_GLOBAL_WIN32)
-    if(win32_init()) {
-      DEBUGF(fprintf(stderr, "Error: win32_init failed\n"));
-      return CURLE_FAILED_INIT;
-    }
+#ifdef WIN32
+  if(Curl_win32_init(flags)) {
+    DEBUGF(fprintf(stderr, "Error: win32_init failed\n"));
+    goto fail;
+  }
+#endif
 
 #ifdef __AMIGA__
   if(!Curl_amiga_init()) {
     DEBUGF(fprintf(stderr, "Error: Curl_amiga_init failed\n"));
-    return CURLE_FAILED_INIT;
+    goto fail;
   }
 #endif
 
@@ -244,22 +182,14 @@ static CURLcode global_init(long flags, bool memoryfuncs)
 
   if(Curl_resolver_global_init()) {
     DEBUGF(fprintf(stderr, "Error: resolver_global_init failed\n"));
-    return CURLE_FAILED_INIT;
+    goto fail;
   }
 
   (void)Curl_ipv6works();
 
-#if defined(USE_LIBSSH2) && defined(HAVE_LIBSSH2_INIT)
-  if(libssh2_init(0)) {
-    DEBUGF(fprintf(stderr, "Error: libssh2_init failed\n"));
-    return CURLE_FAILED_INIT;
-  }
-#endif
-
-#if defined(USE_LIBSSH)
-  if(ssh_init()) {
-    DEBUGF(fprintf(stderr, "Error: libssh_init failed\n"));
-    return CURLE_FAILED_INIT;
+#if defined(USE_SSH)
+  if(Curl_ssh_init()) {
+    goto fail;
   }
 #endif
 
@@ -271,6 +201,10 @@ static CURLcode global_init(long flags, bool memoryfuncs)
   Curl_version_init();
 
   return CURLE_OK;
+
+  fail:
+  initialized--; /* undo the increase */
+  return CURLE_FAILED_INIT;
 }
 
 
@@ -327,22 +261,16 @@ void curl_global_cleanup(void)
   if(--initialized)
     return;
 
-  Curl_global_host_cache_dtor();
   Curl_ssl_cleanup();
   Curl_resolver_global_cleanup();
 
-  if(init_flags & CURL_GLOBAL_WIN32)
-    win32_cleanup();
+#ifdef WIN32
+  Curl_win32_cleanup(init_flags);
+#endif
 
   Curl_amiga_cleanup();
 
-#if defined(USE_LIBSSH2) && defined(HAVE_LIBSSH2_EXIT)
-  (void)libssh2_exit();
-#endif
-
-#if defined(USE_LIBSSH)
-  (void)ssh_finalize();
-#endif
+  Curl_ssh_cleanup();
 
   init_flags  = 0;
 }
@@ -489,8 +417,8 @@ static int events_socket(struct Curl_easy *easy,      /* easy handle */
            mask. Convert from libcurl bitmask to the poll one. */
         m->socket.events = socketcb2poll(what);
         infof(easy, "socket cb: socket %d UPDATED as %s%s\n", s,
-              what&CURL_POLL_IN?"IN":"",
-              what&CURL_POLL_OUT?"OUT":"");
+              (what&CURL_POLL_IN)?"IN":"",
+              (what&CURL_POLL_OUT)?"OUT":"");
       }
       break;
     }
@@ -513,8 +441,8 @@ static int events_socket(struct Curl_easy *easy,      /* easy handle */
         m->socket.revents = 0;
         ev->list = m;
         infof(easy, "socket cb: socket %d ADDED as %s%s\n", s,
-              what&CURL_POLL_IN?"IN":"",
-              what&CURL_POLL_OUT?"OUT":"");
+              (what&CURL_POLL_IN)?"IN":"",
+              (what&CURL_POLL_OUT)?"OUT":"");
       }
       else
         return CURLE_OUT_OF_MEMORY;
@@ -621,7 +549,7 @@ static CURLcode wait_or_timeout(struct Curl_multi *multi, struct events *ev)
       return CURLE_RECV_ERROR;
 
     if(mcode)
-      return CURLE_URL_MALFORMAT; /* TODO: return a proper error! */
+      return CURLE_URL_MALFORMAT;
 
     /* we don't really care about the "msgs_in_queue" value returned in the
        second argument */
@@ -664,30 +592,15 @@ static CURLcode easy_transfer(struct Curl_multi *multi)
 
   while(!done && !mcode) {
     int still_running = 0;
-    int rc;
-
-    mcode = curl_multi_wait(multi, NULL, 0, 1000, &rc);
-
-    if(!mcode) {
-      if(!rc) {
-        long sleep_ms;
-
-        /* If it returns without any filedescriptor instantly, we need to
-           avoid busy-looping during periods where it has nothing particular
-           to wait for */
-        curl_multi_timeout(multi, &sleep_ms);
-        if(sleep_ms) {
-          if(sleep_ms > 1000)
-            sleep_ms = 1000;
-          Curl_wait_ms((int)sleep_ms);
-        }
-      }
 
+    mcode = curl_multi_poll(multi, NULL, 0, 1000, NULL);
+
+    if(!mcode)
       mcode = curl_multi_perform(multi, &still_running);
-    }
 
     /* only read 'still_running' if curl_multi_perform() return OK */
     if(!mcode && !still_running) {
+      int rc;
       CURLMsg *msg = curl_multi_info_read(multi, &rc);
       if(msg) {
         result = msg->data.result;
@@ -822,7 +735,7 @@ void curl_easy_cleanup(struct Curl_easy *data)
     return;
 
   sigpipe_ignore(data, &pipe_st);
-  Curl_close(data);
+  Curl_close(&data);
   sigpipe_restore(&pipe_st);
 }
 
@@ -966,7 +879,8 @@ struct Curl_easy *curl_easy_duphandle(struct Curl_easy *data)
   }
 
   /* Clone the resolver handle, if present, for the new handle */
-  if(Curl_resolver_duphandle(&outcurl->state.resolver,
+  if(Curl_resolver_duphandle(outcurl,
+                             &outcurl->state.resolver,
                              data->state.resolver))
     goto fail;
 
@@ -1002,6 +916,8 @@ struct Curl_easy *curl_easy_duphandle(struct Curl_easy *data)
  */
 void curl_easy_reset(struct Curl_easy *data)
 {
+  long old_buffer_size = data->set.buffer_size;
+
   Curl_free_request_state(data);
 
   /* zero out UserDefined data: */
@@ -1021,7 +937,22 @@ void curl_easy_reset(struct Curl_easy *data)
   /* zero out authentication data: */
   memset(&data->state.authhost, 0, sizeof(struct auth));
   memset(&data->state.authproxy, 0, sizeof(struct auth));
-  Curl_digest_cleanup(data);
+
+#if !defined(CURL_DISABLE_HTTP) && !defined(CURL_DISABLE_CRYPTO_AUTH)
+  Curl_http_auth_cleanup_digest(data);
+#endif
+
+  /* resize receive buffer */
+  if(old_buffer_size != data->set.buffer_size) {
+    char *newbuff = realloc(data->state.buffer, data->set.buffer_size + 1);
+    if(!newbuff) {
+      DEBUGF(fprintf(stderr, "Error: realloc of buffer failed\n"));
+      /* nothing we can do here except use the old size */
+      data->set.buffer_size = old_buffer_size;
+    }
+    else
+      data->state.buffer = newbuff;
+  }
 }
 
 /*
@@ -1058,7 +989,7 @@ CURLcode curl_easy_pause(struct Curl_easy *data, int action)
     unsigned int i;
     unsigned int count = data->state.tempcount;
     struct tempbuf writebuf[3]; /* there can only be three */
-    struct connectdata *conn = data->easy_conn;
+    struct connectdata *conn = data->conn;
     struct Curl_easy *saved_data = NULL;
 
     /* copy the structs to allow for immediate re-pausing */
@@ -1093,14 +1024,17 @@ CURLcode curl_easy_pause(struct Curl_easy *data, int action)
 
   /* if there's no error and we're not pausing both directions, we want
      to have this handle checked soon */
-  if(!result &&
-     ((newstate&(KEEP_RECV_PAUSE|KEEP_SEND_PAUSE)) !=
-      (KEEP_RECV_PAUSE|KEEP_SEND_PAUSE)) )
+  if((newstate & (KEEP_RECV_PAUSE|KEEP_SEND_PAUSE)) !=
+     (KEEP_RECV_PAUSE|KEEP_SEND_PAUSE)) {
     Curl_expire(data, 0, EXPIRE_RUN_NOW); /* get this handle going again */
+    if(data->multi)
+      Curl_update_timer(data->multi);
+  }
 
-  /* This transfer may have been moved in or out of the bundle, update
-     the corresponding socket callback, if used */
-  Curl_updatesocket(data);
+  if(!data->state.done)
+    /* This transfer may have been moved in or out of the bundle, update the
+       corresponding socket callback, if used */
+    Curl_updatesocket(data);
 
   return result;
 }
@@ -1195,6 +1129,35 @@ CURLcode curl_easy_send(struct Curl_easy *data, const void *buffer,
 }
 
 /*
+ * Wrapper to call functions in Curl_conncache_foreach()
+ *
+ * Returns always 0.
+ */
+static int conn_upkeep(struct connectdata *conn,
+                       void *param)
+{
+  /* Param is unused. */
+  (void)param;
+
+  if(conn->handler->connection_check) {
+    /* Do a protocol-specific keepalive check on the connection. */
+    conn->handler->connection_check(conn, CONNCHECK_KEEPALIVE);
+  }
+
+  return 0; /* continue iteration */
+}
+
+static CURLcode upkeep(struct conncache *conn_cache, void *data)
+{
+  /* Loop over every connection and make connection alive. */
+  Curl_conncache_foreach(data,
+                         conn_cache,
+                         data,
+                         conn_upkeep);
+  return CURLE_OK;
+}
+
+/*
  * Performs connection upkeep for the given session handle.
  */
 CURLcode curl_easy_upkeep(struct Curl_easy *data)
@@ -1205,7 +1168,7 @@ CURLcode curl_easy_upkeep(struct Curl_easy *data)
 
   if(data->multi_easy) {
     /* Use the common function to keep connections alive. */
-    return Curl_upkeep(&data->multi_easy->conn_cache, data);
+    return upkeep(&data->multi_easy->conn_cache, data);
   }
   else {
     /* No connections, so just return success */
index 6ba7e54..8a309c5 100644 (file)
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
index afd3899..7121db3 100644 (file)
@@ -122,7 +122,7 @@ char *curl_easy_escape(struct Curl_easy *data, const char *string,
         return NULL;
       }
 
-      snprintf(&ns[strindex], 4, "%%%02X", in);
+      msnprintf(&ns[strindex], 4, "%%%02X", in);
 
       strindex += 3;
     }
index 722b55e..2492370 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -136,7 +136,7 @@ static CURLcode file_connect(struct connectdata *conn, bool *done)
   struct Curl_easy *data = conn->data;
   char *real_path;
   struct FILEPROTO *file = data->req.protop;
-  int fd;
+  int fd = -1;
 #ifdef DOS_FILESYSTEM
   size_t i;
   char *actual_path;
@@ -181,7 +181,9 @@ static CURLcode file_connect(struct connectdata *conn, bool *done)
       return CURLE_URL_MALFORMAT;
     }
 
-  fd = open_readonly(actual_path, O_RDONLY|O_BINARY);
+  if(strncmp("\\\\", actual_path, 2))
+    /* refuse to open path that starts with two backslashes */
+    fd = open_readonly(actual_path, O_RDONLY|O_BINARY);
   file->path = actual_path;
 #else
   if(memchr(real_path, 0, real_path_len)) {
@@ -311,7 +313,7 @@ static CURLcode file_upload(struct connectdata *conn)
     if(result)
       break;
 
-    if(readcount <= 0)  /* fix questionable compare error. curlvms */
+    if(!readcount)
       break;
 
     nread = readcount;
@@ -417,8 +419,9 @@ static CURLcode file_do(struct connectdata *conn, bool *done)
     struct tm buffer;
     const struct tm *tm = &buffer;
     char header[80];
-    snprintf(header, sizeof(header),
-             "Content-Length: %" CURL_FORMAT_CURL_OFF_T "\r\n", expected_size);
+    msnprintf(header, sizeof(header),
+              "Content-Length: %" CURL_FORMAT_CURL_OFF_T "\r\n",
+              expected_size);
     result = Curl_client_write(conn, CLIENTWRITE_HEADER, header, 0);
     if(result)
       return result;
@@ -434,16 +437,16 @@ static CURLcode file_do(struct connectdata *conn, bool *done)
       return result;
 
     /* format: "Tue, 15 Nov 1994 12:45:26 GMT" */
-    snprintf(header, sizeof(header),
-             "Last-Modified: %s, %02d %s %4d %02d:%02d:%02d GMT\r\n%s",
-             Curl_wkday[tm->tm_wday?tm->tm_wday-1:6],
-             tm->tm_mday,
-             Curl_month[tm->tm_mon],
-             tm->tm_year + 1900,
-             tm->tm_hour,
-             tm->tm_min,
-             tm->tm_sec,
-             data->set.opt_no_body ? "": "\r\n");
+    msnprintf(header, sizeof(header),
+              "Last-Modified: %s, %02d %s %4d %02d:%02d:%02d GMT\r\n%s",
+              Curl_wkday[tm->tm_wday?tm->tm_wday-1:6],
+              tm->tm_mday,
+              Curl_month[tm->tm_mon],
+              tm->tm_year + 1900,
+              tm->tm_hour,
+              tm->tm_min,
+              tm->tm_sec,
+              data->set.opt_no_body ? "": "\r\n");
     result = Curl_client_write(conn, CLIENTWRITE_HEADER, header, 0);
     if(result)
       return result;
index 20828ad..f6b74a7 100644 (file)
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2009, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
index 4e72e1e..2630c9e 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 2010 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 2010 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -21,7 +21,7 @@
  ***************************************************************************/
 
 #include "curl_setup.h"
-
+#ifndef CURL_DISABLE_FTP
 #include "strdup.h"
 #include "fileinfo.h"
 #include "curl_memory.h"
@@ -41,3 +41,4 @@ void Curl_fileinfo_cleanup(struct fileinfo *finfo)
   Curl_safefree(finfo->info.b_data);
   free(finfo);
 }
+#endif
index 202d930..429d479 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
 
 #include <curl/curl.h>
 
-#ifndef CURL_DISABLE_HTTP
+#include "formdata.h"
+#if !defined(CURL_DISABLE_HTTP) && !defined(CURL_DISABLE_MIME)
 
 #if defined(HAVE_LIBGEN_H) && defined(HAVE_BASENAME)
 #include <libgen.h>
 #endif
 
 #include "urldata.h" /* for struct Curl_easy */
-#include "formdata.h"
 #include "mime.h"
 #include "non-ascii.h"
 #include "vtls/vtls.h"
@@ -569,7 +569,7 @@ CURLFORMcode FormAdd(struct curl_httppost **httppost,
       if(((form->flags & HTTPPOST_FILENAME) ||
           (form->flags & HTTPPOST_BUFFER)) &&
          !form->contenttype) {
-        char *f = form->flags & HTTPPOST_BUFFER?
+        char *f = (form->flags & HTTPPOST_BUFFER)?
           form->showfilename : form->value;
         char const *type;
         type = Curl_mime_contenttype(f);
@@ -921,7 +921,8 @@ CURLcode Curl_getformdata(struct Curl_easy *data,
   return result;
 }
 
-#else  /* CURL_DISABLE_HTTP */
+#else
+/* if disabled */
 CURLFORMcode curl_formadd(struct curl_httppost **httppost,
                           struct curl_httppost **last_post,
                           ...)
@@ -946,5 +947,4 @@ void curl_formfree(struct curl_httppost *form)
   /* does nothing HTTP is disabled */
 }
 
-
-#endif  /* !defined(CURL_DISABLE_HTTP) */
+#endif  /* if disabled */
index 1246c2b..cb20805 100644 (file)
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
  *
  ***************************************************************************/
 
+#include "curl_setup.h"
+
+#ifndef CURL_DISABLE_MIME
+
 /* used by FormAdd for temporary storage */
 typedef struct FormInfo {
   char *name;
@@ -47,5 +51,10 @@ CURLcode Curl_getformdata(struct Curl_easy *data,
                           curl_mimepart *,
                           struct curl_httppost *post,
                           curl_read_callback fread_func);
+#else
+/* disabled */
+#define Curl_getformdata(a,b,c,d) CURLE_NOT_BUILT_IN
+#endif
+
 
 #endif /* HEADER_CURL_FORMDATA_H */
index 793d991..469096f 100644 (file)
--- a/lib/ftp.c
+++ b/lib/ftp.c
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -132,10 +132,8 @@ static CURLcode ftp_connect(struct connectdata *conn, bool *done);
 static CURLcode ftp_disconnect(struct connectdata *conn, bool dead_connection);
 static CURLcode ftp_do_more(struct connectdata *conn, int *completed);
 static CURLcode ftp_multi_statemach(struct connectdata *conn, bool *done);
-static int ftp_getsock(struct connectdata *conn, curl_socket_t *socks,
-                       int numsocks);
-static int ftp_domore_getsock(struct connectdata *conn, curl_socket_t *socks,
-                              int numsocks);
+static int ftp_getsock(struct connectdata *conn, curl_socket_t *socks);
+static int ftp_domore_getsock(struct connectdata *conn, curl_socket_t *socks);
 static CURLcode ftp_doing(struct connectdata *conn,
                           bool *dophase_done);
 static CURLcode ftp_setup_connection(struct connectdata * conn);
@@ -382,7 +380,7 @@ static CURLcode ReceivedServerConnect(struct connectdata *conn, bool *received)
   struct ftp_conn *ftpc = &conn->proto.ftpc;
   struct pingpong *pp = &ftpc->pp;
   int result;
-  time_t timeout_ms;
+  timediff_t timeout_ms;
   ssize_t nread;
   int ftpcode;
 
@@ -448,7 +446,6 @@ static CURLcode ReceivedServerConnect(struct connectdata *conn, bool *received)
 static CURLcode InitiateTransfer(struct connectdata *conn)
 {
   struct Curl_easy *data = conn->data;
-  struct FTP *ftp = data->req.protop;
   CURLcode result = CURLE_OK;
 
   if(conn->bits.ftp_use_data_ssl) {
@@ -461,24 +458,19 @@ static CURLcode InitiateTransfer(struct connectdata *conn)
   }
 
   if(conn->proto.ftpc.state_saved == FTP_STOR) {
-    *(ftp->bytecountp) = 0;
-
     /* When we know we're uploading a specified file, we can get the file
        size prior to the actual upload. */
-
     Curl_pgrsSetUploadSize(data, data->state.infilesize);
 
     /* set the SO_SNDBUF for the secondary socket for those who need it */
     Curl_sndbufset(conn->sock[SECONDARYSOCKET]);
 
-    Curl_setup_transfer(conn, -1, -1, FALSE, NULL, /* no download */
-                        SECONDARYSOCKET, ftp->bytecountp);
+    Curl_setup_transfer(data, -1, -1, FALSE, SECONDARYSOCKET);
   }
   else {
     /* FTP download: */
-    Curl_setup_transfer(conn, SECONDARYSOCKET,
-                        conn->proto.ftpc.retr_size_saved, FALSE,
-                        ftp->bytecountp, -1, NULL); /* no upload here */
+    Curl_setup_transfer(data, SECONDARYSOCKET,
+                        conn->proto.ftpc.retr_size_saved, FALSE, -1);
   }
 
   conn->proto.ftpc.pp.pending_resp = TRUE; /* expect server response */
@@ -499,7 +491,7 @@ static CURLcode InitiateTransfer(struct connectdata *conn)
 static CURLcode AllowServerConnect(struct connectdata *conn, bool *connected)
 {
   struct Curl_easy *data = conn->data;
-  time_t timeout_ms;
+  timediff_t timeout_ms;
   CURLcode result = CURLE_OK;
 
   *connected = FALSE;
@@ -531,7 +523,7 @@ static CURLcode AllowServerConnect(struct connectdata *conn, bool *connected)
   }
   else {
     /* Add timeout to multi handle and break out of the loop */
-    if(!result && *connected == FALSE) {
+    if(*connected == FALSE) {
       Curl_expire(data, data->set.accepttimeout > 0 ?
                   data->set.accepttimeout: DEFAULT_ACCEPT_TIMEOUT, 0);
     }
@@ -571,14 +563,11 @@ static CURLcode ftp_readresp(curl_socket_t sockfd,
 #ifdef HAVE_GSSAPI
   char * const buf = data->state.buffer;
 #endif
-  CURLcode result = CURLE_OK;
   int code;
-
-  result = Curl_pp_readresp(sockfd, pp, &code, size);
+  CURLcode result = Curl_pp_readresp(sockfd, pp, &code, size);
 
 #if defined(HAVE_GSSAPI)
   /* handle the security-oriented responses 6xx ***/
-  /* FIXME: some errorchecking perhaps... ***/
   switch(code) {
   case 631:
     code = Curl_sec_read_msg(conn, buf, PROT_SAFE);
@@ -655,7 +644,7 @@ CURLcode Curl_GetFTPResponse(ssize_t *nreadp, /* return number of bytes read */
 
   while(!*ftpcode && !result) {
     /* check and reset timeout value every lap */
-    time_t timeout = Curl_pp_state_timeout(pp); /* timeout in milliseconds */
+    time_t timeout = Curl_pp_state_timeout(pp, FALSE);
     time_t interval_ms;
 
     if(timeout <= 0) {
@@ -819,21 +808,16 @@ static CURLcode ftp_state_pwd(struct connectdata *conn)
 
 /* For the FTP "protocol connect" and "doing" phases only */
 static int ftp_getsock(struct connectdata *conn,
-                       curl_socket_t *socks,
-                       int numsocks)
+                       curl_socket_t *socks)
 {
-  return Curl_pp_getsock(&conn->proto.ftpc.pp, socks, numsocks);
+  return Curl_pp_getsock(&conn->proto.ftpc.pp, socks);
 }
 
 /* For the FTP "DO_MORE" phase only */
-static int ftp_domore_getsock(struct connectdata *conn, curl_socket_t *socks,
-                              int numsocks)
+static int ftp_domore_getsock(struct connectdata *conn, curl_socket_t *socks)
 {
   struct ftp_conn *ftpc = &conn->proto.ftpc;
 
-  if(!numsocks)
-    return GETSOCK_BLANK;
-
   /* When in DO_MORE state, we could be either waiting for us to connect to a
    * remote site, or we could wait for that site to connect to us. Or just
    * handle ordinary commands.
@@ -865,7 +849,7 @@ static int ftp_domore_getsock(struct connectdata *conn, curl_socket_t *socks,
 
     return bits;
   }
-  return Curl_pp_getsock(&conn->proto.ftpc.pp, socks, numsocks);
+  return Curl_pp_getsock(&conn->proto.ftpc.pp, socks);
 }
 
 /* This is called after the FTP_QUOTE state is passed.
@@ -883,6 +867,10 @@ static CURLcode ftp_state_cwd(struct connectdata *conn)
     /* already done and fine */
     result = ftp_state_mdtm(conn);
   else {
+    /* FTPFILE_NOCWD with full path: expect ftpc->cwddone! */
+    DEBUGASSERT((conn->data->set.ftp_filemethod != FTPFILE_NOCWD) ||
+                !(ftpc->dirdepth && ftpc->dirs[0][0] == '/'));
+
     ftpc->count2 = 0; /* count2 counts failed CWDs */
 
     /* count3 is set to allow a MKD to fail once. In the case when first CWD
@@ -890,10 +878,9 @@ static CURLcode ftp_state_cwd(struct connectdata *conn)
        dir) this then allows for a second try to CWD to it */
     ftpc->count3 = (conn->data->set.ftp_create_missing_dirs == 2)?1:0;
 
-    if((conn->data->set.ftp_filemethod == FTPFILE_NOCWD) && !ftpc->cwdcount)
-      /* No CWD necessary */
-      result = ftp_state_mdtm(conn);
-    else if(conn->bits.reuse && ftpc->entrypath) {
+    if(conn->bits.reuse && ftpc->entrypath &&
+       /* no need to go to entrypath when we have an absolute path */
+       !(ftpc->dirdepth && ftpc->dirs[0][0] == '/')) {
       /* This is a re-used connection. Since we change directory to where the
          transfer is taking place, we must first get back to the original dir
          where we ended up after login: */
@@ -955,7 +942,7 @@ static CURLcode ftp_state_use_port(struct connectdata *conn,
   unsigned short port_max = 0;
   unsigned short port;
   bool possibly_non_local = TRUE;
-
+  char buffer[STRERROR_LEN];
   char *addr = NULL;
 
   /* Step 1, figure out what is requested,
@@ -1064,11 +1051,10 @@ static CURLcode ftp_state_use_port(struct connectdata *conn,
   if(!host) {
     /* not an interface and not a host name, get default by extracting
        the IP from the control connection */
-
     sslen = sizeof(ss);
     if(getsockname(conn->sock[FIRSTSOCKET], sa, &sslen)) {
       failf(data, "getsockname() failed: %s",
-          Curl_strerror(conn, SOCKERRNO) );
+            Curl_strerror(SOCKERRNO, buffer, sizeof(buffer)));
       free(addr);
       return CURLE_FTP_PORT_FAILED;
     }
@@ -1087,7 +1073,7 @@ static CURLcode ftp_state_use_port(struct connectdata *conn,
   }
 
   /* resolv ip/host to ip */
-  rc = Curl_resolv(conn, host, 0, &h);
+  rc = Curl_resolv(conn, host, 0, FALSE, &h);
   if(rc == CURLRESOLV_PENDING)
     (void)Curl_resolver_wait_resolv(conn, &h);
   if(h) {
@@ -1121,7 +1107,8 @@ static CURLcode ftp_state_use_port(struct connectdata *conn,
     break;
   }
   if(!ai) {
-    failf(data, "socket failure: %s", Curl_strerror(conn, error));
+    failf(data, "socket failure: %s",
+          Curl_strerror(error, buffer, sizeof(buffer)));
     return CURLE_FTP_PORT_FAILED;
   }
 
@@ -1145,14 +1132,13 @@ static CURLcode ftp_state_use_port(struct connectdata *conn,
         /* The requested bind address is not local.  Use the address used for
          * the control connection instead and restart the port loop
          */
-
         infof(data, "bind(port=%hu) on non-local address failed: %s\n", port,
-              Curl_strerror(conn, error) );
+              Curl_strerror(error, buffer, sizeof(buffer)));
 
         sslen = sizeof(ss);
         if(getsockname(conn->sock[FIRSTSOCKET], sa, &sslen)) {
           failf(data, "getsockname() failed: %s",
-                Curl_strerror(conn, SOCKERRNO) );
+                Curl_strerror(SOCKERRNO, buffer, sizeof(buffer)));
           Curl_closesocket(conn, portsock);
           return CURLE_FTP_PORT_FAILED;
         }
@@ -1162,7 +1148,7 @@ static CURLcode ftp_state_use_port(struct connectdata *conn,
       }
       if(error != EADDRINUSE && error != EACCES) {
         failf(data, "bind(port=%hu) failed: %s", port,
-              Curl_strerror(conn, error) );
+              Curl_strerror(error, buffer, sizeof(buffer)));
         Curl_closesocket(conn, portsock);
         return CURLE_FTP_PORT_FAILED;
       }
@@ -1185,7 +1171,7 @@ static CURLcode ftp_state_use_port(struct connectdata *conn,
   sslen = sizeof(ss);
   if(getsockname(portsock, (struct sockaddr *)sa, &sslen)) {
     failf(data, "getsockname() failed: %s",
-          Curl_strerror(conn, SOCKERRNO) );
+          Curl_strerror(SOCKERRNO, buffer, sizeof(buffer)));
     Curl_closesocket(conn, portsock);
     return CURLE_FTP_PORT_FAILED;
   }
@@ -1193,7 +1179,8 @@ static CURLcode ftp_state_use_port(struct connectdata *conn,
   /* step 4, listen on the socket */
 
   if(listen(portsock, 1)) {
-    failf(data, "socket failure: %s", Curl_strerror(conn, SOCKERRNO));
+    failf(data, "socket failure: %s",
+          Curl_strerror(SOCKERRNO, buffer, sizeof(buffer)));
     Curl_closesocket(conn, portsock);
     return CURLE_FTP_PORT_FAILED;
   }
@@ -1272,7 +1259,7 @@ static CURLcode ftp_state_use_port(struct connectdata *conn,
         source++;
       }
       *dest = 0;
-      snprintf(dest, 20, ",%d,%d", (int)(port>>8), (int)(port&0xff));
+      msnprintf(dest, 20, ",%d,%d", (int)(port>>8), (int)(port&0xff));
 
       result = Curl_pp_sendf(&ftpc->pp, "%s %s", mode[fcmd], tmp);
       if(result) {
@@ -1452,31 +1439,37 @@ static CURLcode ftp_state_list(struct connectdata *conn)
      servers either... */
 
   /*
-     if FTPFILE_NOCWD was specified, we are currently in
-     the user's home directory, so we should add the path
+     if FTPFILE_NOCWD was specified, we should add the path
      as argument for the LIST / NLST / or custom command.
      Whether the server will support this, is uncertain.
 
      The other ftp_filemethods will CWD into dir/dir/ first and
      then just do LIST (in that case: nothing to do here)
   */
-  char *cmd, *lstArg, *slashPos;
-  const char *inpath = ftp->path;
-
-  lstArg = NULL;
-  if((data->set.ftp_filemethod == FTPFILE_NOCWD) &&
-     inpath && inpath[0] && strchr(inpath, '/')) {
-    size_t n = strlen(inpath);
-
-    /* Check if path does not end with /, as then we cut off the file part */
-    if(inpath[n - 1] != '/') {
-      /* chop off the file part if format is dir/dir/file */
-      slashPos = strrchr(inpath, '/');
-      n = slashPos - inpath;
-    }
-    result = Curl_urldecode(data, inpath, n, &lstArg, NULL, TRUE);
+  char *lstArg = NULL;
+  char *cmd;
+
+  if((data->set.ftp_filemethod == FTPFILE_NOCWD) && ftp->path) {
+    /* url-decode before evaluation: e.g. paths starting/ending with %2f */
+    const char *slashPos = NULL;
+    char *rawPath = NULL;
+    result = Curl_urldecode(data, ftp->path, 0, &rawPath, NULL, TRUE);
     if(result)
       return result;
+
+    slashPos = strrchr(rawPath, '/');
+    if(slashPos) {
+      /* chop off the file part if format is dir/file otherwise remove
+         the trailing slash for dir/dir/ except for absolute path / */
+      size_t n = slashPos - rawPath;
+      if(n == 0)
+        ++n;
+
+      lstArg = rawPath;
+      lstArg[n] = '\0';
+    }
+    else
+      free(rawPath);
   }
 
   cmd = aprintf("%s%s%s",
@@ -1485,15 +1478,12 @@ static CURLcode ftp_state_list(struct connectdata *conn)
                 (data->set.ftp_list_only?"NLST":"LIST"),
                 lstArg? " ": "",
                 lstArg? lstArg: "");
+  free(lstArg);
 
-  if(!cmd) {
-    free(lstArg);
+  if(!cmd)
     return CURLE_OUT_OF_MEMORY;
-  }
 
   result = Curl_pp_sendf(&conn->proto.ftpc.pp, "%s", cmd);
-
-  free(lstArg);
   free(cmd);
 
   if(result)
@@ -1506,24 +1496,14 @@ static CURLcode ftp_state_list(struct connectdata *conn)
 
 static CURLcode ftp_state_retr_prequote(struct connectdata *conn)
 {
-  CURLcode result = CURLE_OK;
-
   /* We've sent the TYPE, now we must send the list of prequote strings */
-
-  result = ftp_state_quote(conn, TRUE, FTP_RETR_PREQUOTE);
-
-  return result;
+  return ftp_state_quote(conn, TRUE, FTP_RETR_PREQUOTE);
 }
 
 static CURLcode ftp_state_stor_prequote(struct connectdata *conn)
 {
-  CURLcode result = CURLE_OK;
-
   /* We've sent the TYPE, now we must send the list of prequote strings */
-
-  result = ftp_state_quote(conn, TRUE, FTP_STOR_PREQUOTE);
-
-  return result;
+  return ftp_state_quote(conn, TRUE, FTP_STOR_PREQUOTE);
 }
 
 static CURLcode ftp_state_type(struct connectdata *conn)
@@ -1658,7 +1638,7 @@ static CURLcode ftp_state_ul_setup(struct connectdata *conn,
         infof(data, "File already completely uploaded\n");
 
         /* no data to transfer */
-        Curl_setup_transfer(conn, -1, -1, FALSE, NULL, -1, NULL);
+        Curl_setup_transfer(data, -1, -1, FALSE, -1);
 
         /* Set ->transfer so that we won't get any error in
          * ftp_done() because we didn't transfer anything! */
@@ -1940,7 +1920,7 @@ static CURLcode ftp_state_pasv_resp(struct connectdata *conn,
      */
     const char * const host_name = conn->bits.socksproxy ?
       conn->socks_proxy.host.name : conn->http_proxy.host.name;
-    rc = Curl_resolv(conn, host_name, (int)conn->port, &addr);
+    rc = Curl_resolv(conn, host_name, (int)conn->port, FALSE, &addr);
     if(rc == CURLRESOLV_PENDING)
       /* BLOCKING, ignores the return code but 'addr' will be NULL in
          case of failure */
@@ -1956,7 +1936,7 @@ static CURLcode ftp_state_pasv_resp(struct connectdata *conn,
   }
   else {
     /* normal, direct, ftp connection */
-    rc = Curl_resolv(conn, ftpc->newhost, ftpc->newport, &addr);
+    rc = Curl_resolv(conn, ftpc->newhost, ftpc->newport, FALSE, &addr);
     if(rc == CURLRESOLV_PENDING)
       /* BLOCKING */
       (void)Curl_resolver_wait_resolv(conn, &addr);
@@ -2059,13 +2039,11 @@ static CURLcode ftp_state_mdtm_resp(struct connectdata *conn,
                      &year, &month, &day, &hour, &minute, &second)) {
         /* we have a time, reformat it */
         char timebuf[24];
-        time_t secs = time(NULL);
-
-        snprintf(timebuf, sizeof(timebuf),
-                 "%04d%02d%02d %02d:%02d:%02d GMT",
-                 year, month, day, hour, minute, second);
+        msnprintf(timebuf, sizeof(timebuf),
+                  "%04d%02d%02d %02d:%02d:%02d GMT",
+                  year, month, day, hour, minute, second);
         /* now, convert this into a time() value: */
-        data->info.filetime = curl_getdate(timebuf, &secs);
+        data->info.filetime = Curl_getdate_capped(timebuf);
       }
 
 #ifdef CURL_FTP_HTTPSTYLE_HEAD
@@ -2086,15 +2064,15 @@ static CURLcode ftp_state_mdtm_resp(struct connectdata *conn,
           return result;
 
         /* format: "Tue, 15 Nov 1994 12:45:26" */
-        snprintf(headerbuf, sizeof(headerbuf),
-                 "Last-Modified: %s, %02d %s %4d %02d:%02d:%02d GMT\r\n",
-                 Curl_wkday[tm->tm_wday?tm->tm_wday-1:6],
-                 tm->tm_mday,
-                 Curl_month[tm->tm_mon],
-                 tm->tm_year + 1900,
-                 tm->tm_hour,
-                 tm->tm_min,
-                 tm->tm_sec);
+        msnprintf(headerbuf, sizeof(headerbuf),
+                  "Last-Modified: %s, %02d %s %4d %02d:%02d:%02d GMT\r\n",
+                  Curl_wkday[tm->tm_wday?tm->tm_wday-1:6],
+                  tm->tm_mday,
+                  Curl_month[tm->tm_mon],
+                  tm->tm_year + 1900,
+                  tm->tm_hour,
+                  tm->tm_min,
+                  tm->tm_sec);
         result = Curl_client_write(conn, CLIENTWRITE_BOTH, headerbuf, 0);
         if(result)
           return result;
@@ -2230,7 +2208,7 @@ static CURLcode ftp_state_retr(struct connectdata *conn,
 
     if(ftp->downloadsize == 0) {
       /* no data to transfer */
-      Curl_setup_transfer(conn, -1, -1, FALSE, NULL, -1, NULL);
+      Curl_setup_transfer(data, -1, -1, FALSE, -1);
       infof(data, "File already completely downloaded\n");
 
       /* Set ->transfer so that we won't get any error in ftp_done()
@@ -2268,16 +2246,32 @@ static CURLcode ftp_state_size_resp(struct connectdata *conn,
   char *buf = data->state.buffer;
 
   /* get the size from the ascii string: */
-  if(ftpcode == 213)
+  if(ftpcode == 213) {
+    /* To allow servers to prepend "rubbish" in the response string, we scan
+       for all the digits at the end of the response and parse only those as a
+       number. */
+    char *start = &buf[4];
+    char *fdigit = strchr(start, '\r');
+    if(fdigit) {
+      do
+        fdigit--;
+      while(ISDIGIT(*fdigit) && (fdigit > start));
+      if(!ISDIGIT(*fdigit))
+        fdigit++;
+    }
+    else
+      fdigit = start;
     /* ignores parsing errors, which will make the size remain unknown */
-    (void)curlx_strtoofft(buf + 4, NULL, 0, &filesize);
+    (void)curlx_strtoofft(fdigit, NULL, 0, &filesize);
+
+  }
 
   if(instate == FTP_SIZE) {
 #ifdef CURL_FTP_HTTPSTYLE_HEAD
     if(-1 != filesize) {
       char clbuf[128];
-      snprintf(clbuf, sizeof(clbuf),
-               "Content-Length: %" CURL_FORMAT_CURL_OFF_T "\r\n", filesize);
+      msnprintf(clbuf, sizeof(clbuf),
+                "Content-Length: %" CURL_FORMAT_CURL_OFF_T "\r\n", filesize);
       result = Curl_client_write(conn, CLIENTWRITE_BOTH, clbuf, 0);
       if(result)
         return result;
@@ -3054,7 +3048,7 @@ static CURLcode ftp_multi_statemach(struct connectdata *conn,
                                     bool *done)
 {
   struct ftp_conn *ftpc = &conn->proto.ftpc;
-  CURLcode result = Curl_pp_statemach(&ftpc->pp, FALSE);
+  CURLcode result = Curl_pp_statemach(&ftpc->pp, FALSE, FALSE);
 
   /* Check for the state outside of the Curl_socket_check() return code checks
      since at times we are in fact already in this state when this function
@@ -3071,7 +3065,7 @@ static CURLcode ftp_block_statemach(struct connectdata *conn)
   CURLcode result = CURLE_OK;
 
   while(ftpc->state != FTP_STOP) {
-    result = Curl_pp_statemach(pp, TRUE);
+    result = Curl_pp_statemach(pp, TRUE, TRUE /* disconnecting */);
     if(result)
       break;
   }
@@ -3141,7 +3135,8 @@ static CURLcode ftp_done(struct connectdata *conn, CURLcode status,
   ssize_t nread;
   int ftpcode;
   CURLcode result = CURLE_OK;
-  char *path = NULL;
+  char *rawPath = NULL;
+  size_t pathLen = 0;
 
   if(!ftp)
     return CURLE_OK;
@@ -3179,9 +3174,6 @@ static CURLcode ftp_done(struct connectdata *conn, CURLcode status,
     break;
   }
 
-  /* now store a copy of the directory we are in */
-  free(ftpc->prevpath);
-
   if(data->state.wildcardmatch) {
     if(data->set.chunk_end && ftpc->file) {
       Curl_set_in_callback(data, true);
@@ -3192,41 +3184,41 @@ static CURLcode ftp_done(struct connectdata *conn, CURLcode status,
   }
 
   if(!result)
-    /* get the "raw" path */
-    result = Curl_urldecode(data, ftp->path, 0, &path, NULL, TRUE);
+    /* get the url-decoded "raw" path */
+    result = Curl_urldecode(data, ftp->path, 0, &rawPath, &pathLen, TRUE);
   if(result) {
     /* We can limp along anyway (and should try to since we may already be in
      * the error path) */
     ftpc->ctl_valid = FALSE; /* mark control connection as bad */
     connclose(conn, "FTP: out of memory!"); /* mark for connection closure */
+    free(ftpc->prevpath);
     ftpc->prevpath = NULL; /* no path remembering */
   }
-  else {
-    size_t flen = ftpc->file?strlen(ftpc->file):0; /* file is "raw" already */
-    size_t dlen = strlen(path)-flen;
-    if(!ftpc->cwdfail) {
-      ftpc->prevmethod = data->set.ftp_filemethod;
-      if(dlen && (data->set.ftp_filemethod != FTPFILE_NOCWD)) {
-        ftpc->prevpath = path;
-        if(flen)
-          /* if 'path' is not the whole string */
-          ftpc->prevpath[dlen] = 0; /* terminate */
+  else { /* remember working directory for connection reuse */
+    if((data->set.ftp_filemethod == FTPFILE_NOCWD) && (rawPath[0] == '/'))
+      free(rawPath); /* full path => no CWDs happened => keep ftpc->prevpath */
+    else {
+      free(ftpc->prevpath);
+
+      if(!ftpc->cwdfail) {
+        if(data->set.ftp_filemethod == FTPFILE_NOCWD)
+          pathLen = 0; /* relative path => working directory is FTP home */
+        else
+          pathLen -= ftpc->file?strlen(ftpc->file):0; /* file is url-decoded */
+
+        rawPath[pathLen] = '\0';
+        ftpc->prevpath = rawPath;
       }
       else {
-        free(path);
-        /* we never changed dir */
-        ftpc->prevpath = strdup("");
-        if(!ftpc->prevpath)
-          return CURLE_OUT_OF_MEMORY;
+        free(rawPath);
+        ftpc->prevpath = NULL; /* no path */
       }
-      if(ftpc->prevpath)
-        infof(data, "Remembering we are in dir \"%s\"\n", ftpc->prevpath);
-    }
-    else {
-      ftpc->prevpath = NULL; /* no path */
-      free(path);
     }
+
+    if(ftpc->prevpath)
+      infof(data, "Remembering we are in dir \"%s\"\n", ftpc->prevpath);
   }
+
   /* free the dir tree and file parts */
   freedirs(ftpc);
 
@@ -3308,33 +3300,33 @@ static CURLcode ftp_done(struct connectdata *conn, CURLcode status,
     ;
   else if(data->set.upload) {
     if((-1 != data->state.infilesize) &&
-       (data->state.infilesize != *ftp->bytecountp) &&
+       (data->state.infilesize != data->req.writebytecount) &&
        !data->set.crlf &&
        (ftp->transfer == FTPTRANSFER_BODY)) {
       failf(data, "Uploaded unaligned file size (%" CURL_FORMAT_CURL_OFF_T
             " out of %" CURL_FORMAT_CURL_OFF_T " bytes)",
-            *ftp->bytecountp, data->state.infilesize);
+            data->req.bytecount, data->state.infilesize);
       result = CURLE_PARTIAL_FILE;
     }
   }
   else {
     if((-1 != data->req.size) &&
-       (data->req.size != *ftp->bytecountp) &&
+       (data->req.size != data->req.bytecount) &&
 #ifdef CURL_DO_LINEEND_CONV
        /* Most FTP servers don't adjust their file SIZE response for CRLFs, so
         * we'll check to see if the discrepancy can be explained by the number
         * of CRLFs we've changed to LFs.
         */
        ((data->req.size + data->state.crlf_conversions) !=
-        *ftp->bytecountp) &&
+        data->req.bytecount) &&
 #endif /* CURL_DO_LINEEND_CONV */
-       (data->req.maxdownload != *ftp->bytecountp)) {
+       (data->req.maxdownload != data->req.bytecount)) {
       failf(data, "Received only partial file: %" CURL_FORMAT_CURL_OFF_T
-            " bytes", *ftp->bytecountp);
+            " bytes", data->req.bytecount);
       result = CURLE_PARTIAL_FILE;
     }
     else if(!ftpc->dont_check &&
-            !*ftp->bytecountp &&
+            !data->req.bytecount &&
             (data->req.size>0)) {
       failf(data, "No data was received!");
       result = CURLE_FTP_COULDNT_RETR_FILE;
@@ -3496,7 +3488,7 @@ static CURLcode ftp_do_more(struct connectdata *conn, int *completep)
   if(!conn->bits.tcpconnect[SECONDARYSOCKET]) {
     if(Curl_connect_ongoing(conn)) {
       /* As we're in TUNNEL_CONNECT state now, we know the proxy name and port
-         aren't used so we blank their arguments. TODO: make this nicer */
+         aren't used so we blank their arguments. */
       result = Curl_proxyCONNECT(conn, SECONDARYSOCKET, NULL, 0);
 
       return result;
@@ -3539,14 +3531,13 @@ static CURLcode ftp_do_more(struct connectdata *conn, int *completep)
 
     /* if we got an error or if we don't wait for a data connection return
        immediately */
-    if(result || (ftpc->wait_data_conn != TRUE))
+    if(result || !ftpc->wait_data_conn)
       return result;
 
-    if(ftpc->wait_data_conn)
-      /* if we reach the end of the FTP state machine here, *complete will be
-         TRUE but so is ftpc->wait_data_conn, which says we need to wait for
-         the data connection and therefore we're not actually complete */
-      *completep = 0;
+    /* if we reach the end of the FTP state machine here, *complete will be
+       TRUE but so is ftpc->wait_data_conn, which says we need to wait for the
+       data connection and therefore we're not actually complete */
+    *completep = 0;
   }
 
   if(ftp->transfer <= FTPTRANSFER_INFO) {
@@ -3580,13 +3571,8 @@ static CURLcode ftp_do_more(struct connectdata *conn, int *completep)
         return result;
 
       result = ftp_multi_statemach(conn, &complete);
-      if(ftpc->wait_data_conn)
-        /* if we reach the end of the FTP state machine here, *complete will be
-           TRUE but so is ftpc->wait_data_conn, which says we need to wait for
-           the data connection and therefore we're not actually complete */
-        *completep = 0;
-      else
-        *completep = (int)complete;
+      /* ftpc->wait_data_conn is always false here */
+      *completep = (int)complete;
     }
     else {
       /* download */
@@ -3626,10 +3612,8 @@ static CURLcode ftp_do_more(struct connectdata *conn, int *completep)
     return result;
   }
 
-  if(!result && (ftp->transfer != FTPTRANSFER_BODY))
-    /* no data to transfer. FIX: it feels like a kludge to have this here
-       too! */
-    Curl_setup_transfer(conn, -1, -1, FALSE, NULL, -1, NULL);
+  /* no data to transfer */
+  Curl_setup_transfer(data, -1, -1, FALSE, -1);
 
   if(!ftpc->wait_data_conn) {
     /* no waiting for the data connection so this is now complete */
@@ -4106,186 +4090,142 @@ CURLcode ftp_parse_url_path(struct connectdata *conn)
   /* the ftp struct is already inited in ftp_connect() */
   struct FTP *ftp = data->req.protop;
   struct ftp_conn *ftpc = &conn->proto.ftpc;
-  const char *slash_pos;  /* position of the first '/' char in curpos */
-  const char *path_to_use = ftp->path;
-  const char *cur_pos;
-  const char *filename = NULL;
-
-  cur_pos = path_to_use; /* current position in path. point at the begin of
-                            next path component */
+  const char *slashPos = NULL;
+  const char *fileName = NULL;
+  CURLcode result = CURLE_OK;
+  char *rawPath = NULL; /* url-decoded "raw" path */
+  size_t pathLen = 0;
 
   ftpc->ctl_valid = FALSE;
   ftpc->cwdfail = FALSE;
 
-  switch(data->set.ftp_filemethod) {
-  case FTPFILE_NOCWD:
-    /* fastest, but less standard-compliant */
-
-    /*
-      The best time to check whether the path is a file or directory is right
-      here. so:
+  /* url-decode ftp path before further evaluation */
+  result = Curl_urldecode(data, ftp->path, 0, &rawPath, &pathLen, TRUE);
+  if(result)
+    return result;
 
-      the first condition in the if() right here, is there just in case
-      someone decides to set path to NULL one day
-   */
-    if(path_to_use[0] &&
-       (path_to_use[strlen(path_to_use) - 1] != '/') )
-      filename = path_to_use;  /* this is a full file path */
-    /*
-      else {
-        ftpc->file is not used anywhere other than for operations on a file.
-        In other words, never for directory operations.
-        So we can safely leave filename as NULL here and use it as a
-        argument in dir/file decisions.
-      }
-    */
-    break;
+  switch(data->set.ftp_filemethod) {
+    case FTPFILE_NOCWD: /* fastest, but less standard-compliant */
 
-  case FTPFILE_SINGLECWD:
-    /* get the last slash */
-    if(!path_to_use[0]) {
-      /* no dir, no file */
-      ftpc->dirdepth = 0;
+      if((pathLen > 0) && (rawPath[pathLen - 1] != '/'))
+          fileName = rawPath;  /* this is a full file path */
+      /*
+        else: ftpc->file is not used anywhere other than for operations on
+              a file. In other words, never for directory operations.
+              So we can safely leave filename as NULL here and use it as a
+              argument in dir/file decisions.
+      */
       break;
-    }
-    slash_pos = strrchr(cur_pos, '/');
-    if(slash_pos || !*cur_pos) {
-      size_t dirlen = slash_pos-cur_pos;
-      CURLcode result;
 
-      ftpc->dirs = calloc(1, sizeof(ftpc->dirs[0]));
-      if(!ftpc->dirs)
-        return CURLE_OUT_OF_MEMORY;
+    case FTPFILE_SINGLECWD:
+      slashPos = strrchr(rawPath, '/');
+      if(slashPos) {
+        /* get path before last slash, except for / */
+        size_t dirlen = slashPos - rawPath;
+        if(dirlen == 0)
+            dirlen++;
+
+        ftpc->dirs = calloc(1, sizeof(ftpc->dirs[0]));
+        if(!ftpc->dirs) {
+          free(rawPath);
+          return CURLE_OUT_OF_MEMORY;
+        }
 
-      if(!dirlen)
-        dirlen++;
+        ftpc->dirs[0] = calloc(1, dirlen + 1);
+        if(!ftpc->dirs[0]) {
+          free(rawPath);
+          return CURLE_OUT_OF_MEMORY;
+        }
 
-      result = Curl_urldecode(conn->data, slash_pos ? cur_pos : "/",
-                              slash_pos ? dirlen : 1,
-                              &ftpc->dirs[0], NULL,
-                              TRUE);
-      if(result) {
-        freedirs(ftpc);
-        return result;
+        strncpy(ftpc->dirs[0], rawPath, dirlen);
+        ftpc->dirdepth = 1; /* we consider it to be a single dir */
+        fileName = slashPos + 1; /* rest is file name */
       }
-      ftpc->dirdepth = 1; /* we consider it to be a single dir */
-      filename = slash_pos ? slash_pos + 1 : cur_pos; /* rest is file name */
-    }
-    else
-      filename = cur_pos;  /* this is a file name only */
-    break;
+      else
+        fileName = rawPath; /* file name only (or empty) */
+      break;
 
-  default: /* allow pretty much anything */
-  case FTPFILE_MULTICWD:
-    ftpc->dirdepth = 0;
-    ftpc->diralloc = 5; /* default dir depth to allocate */
-    ftpc->dirs = calloc(ftpc->diralloc, sizeof(ftpc->dirs[0]));
-    if(!ftpc->dirs)
-      return CURLE_OUT_OF_MEMORY;
+    default: /* allow pretty much anything */
+    case FTPFILE_MULTICWD: {
+      /* current position: begin of next path component */
+      const char *curPos = rawPath;
+
+      int dirAlloc = 0; /* number of entries allocated for the 'dirs' array */
+      const char *str = rawPath;
+      for(; *str != 0; ++str)
+        if (*str == '/')
+          ++dirAlloc;
+
+      if(dirAlloc > 0) {
+        ftpc->dirs = calloc(dirAlloc, sizeof(ftpc->dirs[0]));
+        if(!ftpc->dirs) {
+          free(rawPath);
+          return CURLE_OUT_OF_MEMORY;
+        }
+
+        /* parse the URL path into separate path components */
+        while((slashPos = strchr(curPos, '/')) != NULL) {
+          size_t compLen = slashPos - curPos;
+
+          /* path starts with a slash: add that as a directory */
+          if((compLen == 0) && (ftpc->dirdepth == 0))
+            ++compLen;
 
-    /* we have a special case for listing the root dir only */
-    if(!strcmp(path_to_use, "/")) {
-      cur_pos++; /* make it point to the zero byte */
-      ftpc->dirs[0] = strdup("/");
-      ftpc->dirdepth++;
-    }
-    else {
-      /* parse the URL path into separate path components */
-      while((slash_pos = strchr(cur_pos, '/')) != NULL) {
-        /* 1 or 0 pointer offset to indicate absolute directory */
-        ssize_t absolute_dir = ((cur_pos - ftp->path > 0) &&
-                                (ftpc->dirdepth == 0))?1:0;
-
-        /* seek out the next path component */
-        if(slash_pos-cur_pos) {
           /* we skip empty path components, like "x//y" since the FTP command
              CWD requires a parameter and a non-existent parameter a) doesn't
              work on many servers and b) has no effect on the others. */
-          size_t len = slash_pos - cur_pos + absolute_dir;
-          CURLcode result =
-            Curl_urldecode(conn->data, cur_pos - absolute_dir, len,
-                           &ftpc->dirs[ftpc->dirdepth], NULL,
-                           TRUE);
-          if(result) {
-            freedirs(ftpc);
-            return result;
-          }
-        }
-        else {
-          cur_pos = slash_pos + 1; /* jump to the rest of the string */
-          if(!ftpc->dirdepth) {
-            /* path starts with a slash, add that as a directory */
-            ftpc->dirs[ftpc->dirdepth] = strdup("/");
-            if(!ftpc->dirs[ftpc->dirdepth++]) { /* run out of memory ... */
-              failf(data, "no memory");
-              freedirs(ftpc);
+          if(compLen > 0) {
+            char *comp = calloc(1, compLen + 1);
+            if(!comp) {
+              free(rawPath);
               return CURLE_OUT_OF_MEMORY;
             }
+            strncpy(comp, curPos, compLen);
+            ftpc->dirs[ftpc->dirdepth++] = comp;
           }
-          continue;
-        }
-
-        cur_pos = slash_pos + 1; /* jump to the rest of the string */
-        if(++ftpc->dirdepth >= ftpc->diralloc) {
-          /* enlarge array */
-          char **bigger;
-          ftpc->diralloc *= 2; /* double the size each time */
-          bigger = realloc(ftpc->dirs, ftpc->diralloc * sizeof(ftpc->dirs[0]));
-          if(!bigger) {
-            freedirs(ftpc);
-            return CURLE_OUT_OF_MEMORY;
-          }
-          ftpc->dirs = bigger;
+          curPos = slashPos + 1;
         }
       }
+      DEBUGASSERT(ftpc->dirdepth <= dirAlloc);
+      fileName = curPos; /* the rest is the file name (or empty) */
     }
-    filename = cur_pos;  /* the rest is the file name */
     break;
   } /* switch */
 
-  if(filename && *filename) {
-    CURLcode result =
-      Curl_urldecode(conn->data, filename, 0,  &ftpc->file, NULL, TRUE);
-
-    if(result) {
-      freedirs(ftpc);
-      return result;
-    }
-  }
+  if(fileName && *fileName)
+    ftpc->file = strdup(fileName);
   else
-    ftpc->file = NULL; /* instead of point to a zero byte, we make it a NULL
-                          pointer */
+    ftpc->file = NULL; /* instead of point to a zero byte,
+                            we make it a NULL pointer */
 
   if(data->set.upload && !ftpc->file && (ftp->transfer == FTPTRANSFER_BODY)) {
     /* We need a file name when uploading. Return error! */
     failf(data, "Uploading to a URL without a file name!");
+    free(rawPath);
     return CURLE_URL_MALFORMAT;
   }
 
   ftpc->cwddone = FALSE; /* default to not done */
 
-  if(ftpc->prevpath) {
-    /* prevpath is "raw" so we convert the input path before we compare the
-       strings */
-    size_t dlen;
-    char *path;
-    CURLcode result =
-      Curl_urldecode(conn->data, ftp->path, 0, &path, &dlen, TRUE);
-    if(result) {
-      freedirs(ftpc);
-      return result;
-    }
+  if((data->set.ftp_filemethod == FTPFILE_NOCWD) && (rawPath[0] == '/'))
+    ftpc->cwddone = TRUE; /* skip CWD for absolute paths */
+  else { /* newly created FTP connections are already in entry path */
+    const char *oldPath = conn->bits.reuse ? ftpc->prevpath : "";
+    if(oldPath) {
+      size_t n = pathLen;
+      if(data->set.ftp_filemethod == FTPFILE_NOCWD)
+        n = 0; /* CWD to entry for relative paths */
+      else
+        n -= ftpc->file?strlen(ftpc->file):0;
 
-    dlen -= ftpc->file?strlen(ftpc->file):0;
-    if((dlen == strlen(ftpc->prevpath)) &&
-       !strncmp(path, ftpc->prevpath, dlen) &&
-       (ftpc->prevmethod == data->set.ftp_filemethod)) {
-      infof(data, "Request has same path as previous transfer\n");
-      ftpc->cwddone = TRUE;
+      if((strlen(oldPath) == n) && !strncmp(rawPath, oldPath, n)) {
+        infof(data, "Request has same path as previous transfer\n");
+        ftpc->cwddone = TRUE;
+      }
     }
-    free(path);
   }
 
+  free(rawPath);
   return CURLE_OK;
 }
 
@@ -4308,7 +4248,7 @@ static CURLcode ftp_dophase_done(struct connectdata *conn,
 
   if(ftp->transfer != FTPTRANSFER_BODY)
     /* no data to transfer */
-    Curl_setup_transfer(conn, -1, -1, FALSE, NULL, -1, NULL);
+    Curl_setup_transfer(conn->data, -1, -1, FALSE, -1);
   else if(!connected)
     /* since we didn't connect now, we want do_more to get called */
     conn->bits.do_more = TRUE;
@@ -4395,7 +4335,6 @@ static CURLcode ftp_setup_connection(struct connectdata *conn)
     return CURLE_OUT_OF_MEMORY;
 
   ftp->path = &data->state.up.path[1]; /* don't include the initial slash */
-  data->state.slash_removed = TRUE; /* we've skipped the slash */
 
   /* FTP URLs support an extension like ";type=<typecode>" that
    * we'll try to get now! */
@@ -4428,7 +4367,6 @@ static CURLcode ftp_setup_connection(struct connectdata *conn)
   }
 
   /* get some initial data into the ftp struct */
-  ftp->bytecountp = &conn->data->req.bytecount;
   ftp->transfer = FTPTRANSFER_BODY;
   ftp->downloadsize = 0;
 
index 38d0322..2c88d56 100644 (file)
--- a/lib/ftp.h
+++ b/lib/ftp.h
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -102,7 +102,6 @@ typedef enum {
    perhaps the Curl_easy is changed between the times the connection is
    used. */
 struct FTP {
-  curl_off_t *bytecountp;
   char *user;    /* user name string */
   char *passwd;  /* password string */
   char *path;    /* points to the urlpieces struct field */
@@ -122,8 +121,7 @@ struct ftp_conn {
   char *entrypath; /* the PWD reply when we logged on */
   char **dirs;   /* realloc()ed array for path components */
   int dirdepth;  /* number of entries used in the 'dirs' array */
-  int diralloc;  /* number of entries allocated for the 'dirs' array */
-  char *file;    /* decoded file */
+  char *file;    /* url-decoded file name (or path) */
   bool dont_check;  /* Set to TRUE to prevent the final (post-transfer)
                        file size and 226/250 status check. It should still
                        read the line, just ignore the result. */
@@ -136,8 +134,7 @@ struct ftp_conn {
   bool cwdfail;     /* set TRUE if a CWD command fails, as then we must prevent
                        caching the current directory */
   bool wait_data_conn; /* this is set TRUE if data connection is waited */
-  char *prevpath;   /* conn->path from the previous transfer */
-  curl_ftpfile prevmethod; /* ftp method in previous transfer  */
+  char *prevpath;   /* url-decoded conn->path from the previous transfer */
   char transfertype; /* set by ftp_transfertype for use by Curl_client_write()a
                         and others (A/I or zero) */
   int count1; /* general purpose counter for the state machine */
index 249fe09..f399a4c 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -405,7 +405,7 @@ size_t Curl_ftp_parselist(char *buffer, size_t size, size_t nmemb,
             parser->state.UNIX.main = PL_UNIX_FILETYPE;
             /* start FSM again not considering size of directory */
             finfo->b_used = 0;
-            i--;
+            continue;
           }
           break;
         case PL_UNIX_TOTALSIZE_READING:
@@ -914,10 +914,7 @@ size_t Curl_ftp_parselist(char *buffer, size_t size, size_t nmemb,
       case PL_WINNT_DIRORSIZE:
         switch(parser->state.NT.sub.dirorsize) {
         case PL_WINNT_DIRORSIZE_PRESPACE:
-          if(c == ' ') {
-
-          }
-          else {
+          if(c != ' ') {
             parser->item_offset = finfo->b_used - 1;
             parser->item_length = 1;
             parser->state.NT.sub.dirorsize = PL_WINNT_DIRORSIZE_CONTENT;
index 8128887..b34ae9b 100644 (file)
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
index 89d181d..e444a6a 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -35,7 +35,7 @@ char *GetEnv(const char *variable)
   return NULL;
 #else
 #ifdef WIN32
-  char env[MAX_PATH]; /* MAX_PATH is from windef.h */
+  char env[4096];
   char *temp = getenv(variable);
   env[0] = '\0';
   if(temp != NULL)
index 54c2c2f..2b8f230 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -163,10 +163,10 @@ static CURLcode getinfo_long(struct Curl_easy *data, CURLINFO info,
       *param_longp = (long)data->info.filetime;
     break;
   case CURLINFO_HEADER_SIZE:
-    *param_longp = data->info.header_size;
+    *param_longp = (long)data->info.header_size;
     break;
   case CURLINFO_REQUEST_SIZE:
-    *param_longp = data->info.request_size;
+    *param_longp = (long)data->info.request_size;
     break;
   case CURLINFO_SSL_VERIFYRESULT:
     *param_longp = data->set.ssl.certverifyresult;
@@ -235,6 +235,9 @@ static CURLcode getinfo_long(struct Curl_easy *data, CURLINFO info,
     case 20:
       *param_longp = CURL_HTTP_VERSION_2_0;
       break;
+    case 30:
+      *param_longp = CURL_HTTP_VERSION_3;
+      break;
     default:
       *param_longp = CURL_HTTP_VERSION_NONE;
       break;
@@ -243,7 +246,6 @@ static CURLcode getinfo_long(struct Curl_easy *data, CURLINFO info,
   case CURLINFO_PROTOCOL:
     *param_longp = data->info.conn_protocol;
     break;
-
   default:
     return CURLE_UNKNOWN_OPTION;
   }
@@ -301,7 +303,9 @@ static CURLcode getinfo_offt(struct Curl_easy *data, CURLINFO info,
   case CURLINFO_REDIRECT_TIME_T:
     *param_offt = data->progress.t_redirect;
     break;
-
+  case CURLINFO_RETRY_AFTER:
+    *param_offt = data->info.retry_after;
+    break;
   default:
     return CURLE_UNKNOWN_OPTION;
   }
@@ -390,7 +394,7 @@ static CURLcode getinfo_slist(struct Curl_easy *data, CURLINFO info,
                                           param_slistp;
       struct curl_tlssessioninfo *tsi = &data->tsi;
 #ifdef USE_SSL
-      struct connectdata *conn = data->easy_conn;
+      struct connectdata *conn = data->conn;
 #endif
 
       *tsip = tsi;
index aecf717..8d2af42 100644 (file)
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2010, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
index b441a64..b296c62 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
 #include "progress.h"
 #include "gopher.h"
 #include "select.h"
+#include "strdup.h"
 #include "url.h"
 #include "escape.h"
 #include "warnless.h"
+#include "curl_printf.h"
 #include "curl_memory.h"
 /* The last #include file should be: */
 #include "memdebug.h"
@@ -76,9 +78,9 @@ static CURLcode gopher_do(struct connectdata *conn, bool *done)
   CURLcode result = CURLE_OK;
   struct Curl_easy *data = conn->data;
   curl_socket_t sockfd = conn->sock[FIRSTSOCKET];
-
-  curl_off_t *bytecount = &data->req.bytecount;
+  char *gopherpath;
   char *path = data->state.up.path;
+  char *query = data->state.up.query;
   char *sel = NULL;
   char *sel_org = NULL;
   ssize_t amount, k;
@@ -86,20 +88,33 @@ static CURLcode gopher_do(struct connectdata *conn, bool *done)
 
   *done = TRUE; /* unconditionally */
 
+  /* path is guaranteed non-NULL */
+  DEBUGASSERT(path);
+
+  if(query)
+    gopherpath = aprintf("%s?%s", path, query);
+  else
+    gopherpath = strdup(path);
+
+  if(!gopherpath)
+    return CURLE_OUT_OF_MEMORY;
+
   /* Create selector. Degenerate cases: / and /1 => convert to "" */
-  if(strlen(path) <= 2) {
+  if(strlen(gopherpath) <= 2) {
     sel = (char *)"";
     len = strlen(sel);
+    free(gopherpath);
   }
   else {
     char *newp;
 
     /* Otherwise, drop / and the first character (i.e., item type) ... */
-    newp = path;
+    newp = gopherpath;
     newp += 2;
 
     /* ... and finally unescape */
     result = Curl_urldecode(data, newp, 0, &sel, &len, FALSE);
+    free(gopherpath);
     if(result)
       return result;
     sel_org = sel;
@@ -153,8 +168,7 @@ static CURLcode gopher_do(struct connectdata *conn, bool *done)
   if(result)
     return result;
 
-  Curl_setup_transfer(conn, FIRSTSOCKET, -1, FALSE, bytecount,
-                      -1, NULL); /* no upload */
+  Curl_setup_transfer(data, FIRSTSOCKET, -1, FALSE, -1);
   return CURLE_OK;
 }
 #endif /*CURL_DISABLE_GOPHER*/
index 501c990..dec2557 100644 (file)
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2009, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
index 90a25d1..558d0f4 100644 (file)
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -80,7 +80,7 @@ int Curl_hash_delete(struct curl_hash *h, void *key, size_t key_len);
 void *Curl_hash_pick(struct curl_hash *, void *key, size_t key_len);
 void Curl_hash_apply(struct curl_hash *h, void *user,
                      void (*cb)(void *user, void *ptr));
-int Curl_hash_count(struct curl_hash *h);
+#define Curl_hash_count(h) ((h)->size)
 void Curl_hash_destroy(struct curl_hash *h);
 void Curl_hash_clean(struct curl_hash *h);
 void Curl_hash_clean_with_criterium(struct curl_hash *h, void *user,
index 6ff60ba..99d872b 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -85,14 +85,14 @@ CURLcode Curl_addrinfo_callback(struct connectdata *conn,
       dns = Curl_cache_addr(data, ai,
                             conn->async.hostname,
                             conn->async.port);
+      if(data->share)
+        Curl_share_unlock(data, CURL_LOCK_DATA_DNS);
+
       if(!dns) {
         /* failed to store, cleanup and return error */
         Curl_freeaddrinfo(ai);
         result = CURLE_OUT_OF_MEMORY;
       }
-
-      if(data->share)
-        Curl_share_unlock(data, CURL_LOCK_DATA_DNS);
     }
     else {
       result = CURLE_OUT_OF_MEMORY;
index c9d8112..9e0db05 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -23,7 +23,6 @@
 #include "curl_setup.h"
 
 #if defined(USE_OPENSSL)                                \
-  || defined(USE_AXTLS)                                 \
   || defined(USE_GSKIT)                                 \
   || defined(USE_SCHANNEL)
 /* these backends use functions from this file */
@@ -128,16 +127,14 @@ static int hostmatch(char *hostname, char *pattern)
 
 int Curl_cert_hostcheck(const char *match_pattern, const char *hostname)
 {
-  char *matchp;
-  char *hostp;
   int res = 0;
   if(!match_pattern || !*match_pattern ||
       !hostname || !*hostname) /* sanity check */
     ;
   else {
-    matchp = strdup(match_pattern);
+    char *matchp = strdup(match_pattern);
     if(matchp) {
-      hostp = strdup(hostname);
+      char *hostp = strdup(hostname);
       if(hostp) {
         if(hostmatch(hostp, matchp) == CURL_HOST_MATCH)
           res = 1;
@@ -150,4 +147,4 @@ int Curl_cert_hostcheck(const char *match_pattern, const char *hostname)
   return res;
 }
 
-#endif /* OPENSSL, AXTLS, GSKIT or schannel+wince */
+#endif /* OPENSSL, GSKIT or schannel+wince */
index f562df9..9c18085 100644 (file)
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
index f589a0b..b434b39 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -73,6 +73,8 @@
 #define USE_ALARM_TIMEOUT
 #endif
 
+#define MAX_HOSTCACHE_LEN (255 + 7) /* max FQDN + colon + port number + zero */
+
 /*
  * hostip.c explained
  * ==================
  * CURLRES_* defines based on the config*.h and curl_setup.h defines.
  */
 
-/* These two symbols are for the global DNS cache */
-static struct curl_hash hostname_cache;
-static int host_cache_initialized;
-
 static void freednsentry(void *freethis);
 
 /*
- * Curl_global_host_cache_init() initializes and sets up a global DNS cache.
- * Global DNS cache is general badness. Do not use. This will be removed in
- * a future version. Use the share interface instead!
- *
- * Returns a struct curl_hash pointer on success, NULL on failure.
- */
-struct curl_hash *Curl_global_host_cache_init(void)
-{
-  int rc = 0;
-  if(!host_cache_initialized) {
-    rc = Curl_hash_init(&hostname_cache, 7, Curl_hash_str,
-                        Curl_str_key_compare, freednsentry);
-    if(!rc)
-      host_cache_initialized = 1;
-  }
-  return rc?NULL:&hostname_cache;
-}
-
-/*
- * Destroy and cleanup the global DNS cache
- */
-void Curl_global_host_cache_dtor(void)
-{
-  if(host_cache_initialized) {
-    Curl_hash_destroy(&hostname_cache);
-    host_cache_initialized = 0;
-  }
-}
-
-/*
  * Return # of addresses in a Curl_addrinfo struct
  */
 int Curl_num_addresses(const Curl_addrinfo *addr)
@@ -198,23 +166,19 @@ Curl_printable_address(const Curl_addrinfo *ai, char *buf, size_t bufsize)
 }
 
 /*
- * Return a hostcache id string for the provided host + port, to be used by
- * the DNS caching.
+ * Create a hostcache id string for the provided host + port, to be used by
+ * the DNS caching. Without alloc.
  */
-static char *
-create_hostcache_id(const char *name, int port)
+static void
+create_hostcache_id(const char *name, int port, char *ptr, size_t buflen)
 {
-  /* create and return the new allocated entry */
-  char *id = aprintf("%s:%d", name, port);
-  char *ptr = id;
-  if(ptr) {
-    /* lower case the name part */
-    while(*ptr && (*ptr != ':')) {
-      *ptr = (char)TOLOWER(*ptr);
-      ptr++;
-    }
-  }
-  return id;
+  size_t len = strlen(name);
+  if(len > (buflen - 7))
+    len = buflen - 7;
+  /* store and lower case the name */
+  while(len--)
+    *ptr++ = (char)TOLOWER(*name++);
+  msnprintf(ptr, 7, ":%u", port);
 }
 
 struct hostcache_prune_data {
@@ -296,22 +260,27 @@ fetch_addr(struct connectdata *conn,
                 const char *hostname,
                 int port)
 {
-  char *entry_id = NULL;
   struct Curl_dns_entry *dns = NULL;
   size_t entry_len;
   struct Curl_easy *data = conn->data;
+  char entry_id[MAX_HOSTCACHE_LEN];
 
   /* Create an entry id, based upon the hostname and port */
-  entry_id = create_hostcache_id(hostname, port);
-  /* If we can't create the entry id, fail */
-  if(!entry_id)
-    return dns;
-
+  create_hostcache_id(hostname, port, entry_id, sizeof(entry_id));
   entry_len = strlen(entry_id);
 
   /* See if its already in our dns cache */
   dns = Curl_hash_pick(data->dns.hostcache, entry_id, entry_len + 1);
 
+  /* No entry found in cache, check if we might have a wildcard entry */
+  if(!dns && data->change.wildcard_resolve) {
+    create_hostcache_id("*", port, entry_id, sizeof(entry_id));
+    entry_len = strlen(entry_id);
+
+    /* See if it's already in our dns cache */
+    dns = Curl_hash_pick(data->dns.hostcache, entry_id, entry_len + 1);
+  }
+
   if(dns && (data->set.dns_cache_timeout != -1)) {
     /* See whether the returned entry is stale. Done before we release lock */
     struct hostcache_prune_data user;
@@ -326,9 +295,6 @@ fetch_addr(struct connectdata *conn,
     }
   }
 
-  /* free the allocated entry_id again */
-  free(entry_id);
-
   return dns;
 }
 
@@ -368,6 +334,9 @@ Curl_fetch_addr(struct connectdata *conn,
   return dns;
 }
 
+#ifndef CURL_DISABLE_SHUFFLE_DNS
+UNITTEST CURLcode Curl_shuffle_addr(struct Curl_easy *data,
+                                    Curl_addrinfo **addr);
 /*
  * Curl_shuffle_addr() shuffles the order of addresses in a 'Curl_addrinfo'
  * struct by re-linking its linked list.
@@ -380,7 +349,8 @@ Curl_fetch_addr(struct connectdata *conn,
  *
  * @unittest: 1608
  */
-CURLcode Curl_shuffle_addr(struct Curl_easy *data, Curl_addrinfo **addr)
+UNITTEST CURLcode Curl_shuffle_addr(struct Curl_easy *data,
+                                    Curl_addrinfo **addr)
 {
   CURLcode result = CURLE_OK;
   const int num_addrs = Curl_num_addresses(*addr);
@@ -431,6 +401,7 @@ CURLcode Curl_shuffle_addr(struct Curl_easy *data, Curl_addrinfo **addr)
   }
   return result;
 }
+#endif
 
 /*
  * Curl_cache_addr() stores a 'Curl_addrinfo' struct in the DNS cache.
@@ -447,32 +418,30 @@ Curl_cache_addr(struct Curl_easy *data,
                 const char *hostname,
                 int port)
 {
-  char *entry_id;
+  char entry_id[MAX_HOSTCACHE_LEN];
   size_t entry_len;
   struct Curl_dns_entry *dns;
   struct Curl_dns_entry *dns2;
 
+#ifndef CURL_DISABLE_SHUFFLE_DNS
   /* shuffle addresses if requested */
   if(data->set.dns_shuffle_addresses) {
     CURLcode result = Curl_shuffle_addr(data, &addr);
     if(result)
       return NULL;
   }
-
-  /* Create an entry id, based upon the hostname and port */
-  entry_id = create_hostcache_id(hostname, port);
-  /* If we can't create the entry id, fail */
-  if(!entry_id)
-    return NULL;
-  entry_len = strlen(entry_id);
+#endif
 
   /* Create a new cache entry */
   dns = calloc(1, sizeof(struct Curl_dns_entry));
   if(!dns) {
-    free(entry_id);
     return NULL;
   }
 
+  /* Create an entry id, based upon the hostname and port */
+  create_hostcache_id(hostname, port, entry_id, sizeof(entry_id));
+  entry_len = strlen(entry_id);
+
   dns->inuse = 1;   /* the cache has the first reference */
   dns->addr = addr; /* this is the address(es) */
   time(&dns->timestamp);
@@ -484,16 +453,11 @@ Curl_cache_addr(struct Curl_easy *data,
                        (void *)dns);
   if(!dns2) {
     free(dns);
-    free(entry_id);
     return NULL;
   }
 
   dns = dns2;
   dns->inuse++;         /* mark entry as in-use */
-
-  /* free the allocated entry_id */
-  free(entry_id);
-
   return dns;
 }
 
@@ -521,6 +485,7 @@ Curl_cache_addr(struct Curl_easy *data,
 int Curl_resolv(struct connectdata *conn,
                 const char *hostname,
                 int port,
+                bool allowDOH,
                 struct Curl_dns_entry **entry)
 {
   struct Curl_dns_entry *dns = NULL;
@@ -548,7 +513,7 @@ int Curl_resolv(struct connectdata *conn,
     /* The entry was not in the cache. Resolve it to IP address */
 
     Curl_addrinfo *addr;
-    int respwait;
+    int respwait = 0;
 
     /* Check what IP specifics the app has requested and if we can provide it.
      * If not, bail out. */
@@ -566,7 +531,7 @@ int Curl_resolv(struct connectdata *conn,
         return CURLRESOLV_ERROR;
     }
 
-    if(data->set.doh) {
+    if(allowDOH && data->set.doh) {
       addr = Curl_doh(conn, hostname, port, &respwait);
     }
     else {
@@ -659,7 +624,7 @@ int Curl_resolv_timeout(struct connectdata *conn,
                         const char *hostname,
                         int port,
                         struct Curl_dns_entry **entry,
-                        time_t timeoutms)
+                        timediff_t timeoutms)
 {
 #ifdef USE_ALARM_TIMEOUT
 #ifdef HAVE_SIGACTION
@@ -692,7 +657,7 @@ int Curl_resolv_timeout(struct connectdata *conn,
 
   if(!timeout)
     /* USE_ALARM_TIMEOUT defined, but no timeout actually requested */
-    return Curl_resolv(conn, hostname, port, entry);
+    return Curl_resolv(conn, hostname, port, TRUE, entry);
 
   if(timeout < 1000) {
     /* The alarm() function only provides integer second resolution, so if
@@ -754,7 +719,7 @@ int Curl_resolv_timeout(struct connectdata *conn,
   /* Perform the actual name resolution. This might be interrupted by an
    * alarm if it takes too long.
    */
-  rc = Curl_resolv(conn, hostname, port, entry);
+  rc = Curl_resolv(conn, hostname, port, TRUE, entry);
 
 #ifdef USE_ALARM_TIMEOUT
 clean_up:
@@ -784,7 +749,7 @@ clean_up:
                                             conn->created) / 1000;
 
     /* the alarm period is counted in even number of seconds */
-    unsigned long alarm_set = prev_alarm - elapsed_secs;
+    unsigned long alarm_set = (unsigned long)(prev_alarm - elapsed_secs);
 
     if(!alarm_set ||
        ((alarm_set >= 0x80000000) && (prev_alarm < 0x80000000)) ) {
@@ -872,11 +837,14 @@ CURLcode Curl_loadhostpairs(struct Curl_easy *data)
   char hostname[256];
   int port = 0;
 
+  /* Default is no wildcard found */
+  data->change.wildcard_resolve = false;
+
   for(hostp = data->change.resolve; hostp; hostp = hostp->next) {
+    char entry_id[MAX_HOSTCACHE_LEN];
     if(!hostp->data)
       continue;
     if(hostp->data[0] == '-') {
-      char *entry_id;
       size_t entry_len;
 
       if(2 != sscanf(hostp->data + 1, "%255[^:]:%d", hostname, &port)) {
@@ -886,12 +854,7 @@ CURLcode Curl_loadhostpairs(struct Curl_easy *data)
       }
 
       /* Create an entry id, based upon the hostname and port */
-      entry_id = create_hostcache_id(hostname, port);
-      /* If we can't create the entry id, fail */
-      if(!entry_id) {
-        return CURLE_OUT_OF_MEMORY;
-      }
-
+      create_hostcache_id(hostname, port, entry_id, sizeof(entry_id));
       entry_len = strlen(entry_id);
 
       if(data->share)
@@ -902,14 +865,10 @@ CURLcode Curl_loadhostpairs(struct Curl_easy *data)
 
       if(data->share)
         Curl_share_unlock(data, CURL_LOCK_DATA_DNS);
-
-      /* free the allocated entry_id again */
-      free(entry_id);
     }
     else {
       struct Curl_dns_entry *dns;
       Curl_addrinfo *head = NULL, *tail = NULL;
-      char *entry_id;
       size_t entry_len;
       char address[64];
 #if !defined(CURL_DISABLE_VERBOSE_STRINGS)
@@ -1005,12 +964,7 @@ CURLcode Curl_loadhostpairs(struct Curl_easy *data)
       }
 
       /* Create an entry id, based upon the hostname and port */
-      entry_id = create_hostcache_id(hostname, port);
-      /* If we can't create the entry id, fail */
-      if(!entry_id) {
-        Curl_freeaddrinfo(head);
-        return CURLE_OUT_OF_MEMORY;
-      }
+      create_hostcache_id(hostname, port, entry_id, sizeof(entry_id));
       entry_len = strlen(entry_id);
 
       if(data->share)
@@ -1031,8 +985,6 @@ CURLcode Curl_loadhostpairs(struct Curl_easy *data)
 
         Curl_hash_delete(data->dns.hostcache, entry_id, entry_len + 1);
       }
-      /* free the allocated entry_id again */
-      free(entry_id);
 
       /* put this new host in the cache */
       dns = Curl_cache_addr(data, head, hostname, port);
@@ -1052,6 +1004,13 @@ CURLcode Curl_loadhostpairs(struct Curl_easy *data)
       }
       infof(data, "Added %s:%d:%s to DNS cache\n",
             hostname, port, addresses);
+
+      /* Wildcard hostname */
+      if(hostname[0] == '*' && hostname[1] == '\0') {
+        infof(data, "RESOLVE %s:%d is wildcard, enabling wildcard checks\n",
+              hostname, port);
+        data->change.wildcard_resolve = true;
+      }
     }
   }
   data->change.resolve = NULL; /* dealt with now */
@@ -1062,25 +1021,27 @@ CURLcode Curl_loadhostpairs(struct Curl_easy *data)
 CURLcode Curl_resolv_check(struct connectdata *conn,
                            struct Curl_dns_entry **dns)
 {
+#if defined(CURL_DISABLE_DOH) && !defined(CURLRES_ASYNCH)
+  (void)dns;
+#endif
+
   if(conn->data->set.doh)
     return Curl_doh_is_resolved(conn, dns);
   return Curl_resolver_is_resolved(conn, dns);
 }
 
 int Curl_resolv_getsock(struct connectdata *conn,
-                        curl_socket_t *socks,
-                        int numsocks)
+                        curl_socket_t *socks)
 {
 #ifdef CURLRES_ASYNCH
   if(conn->data->set.doh)
     /* nothing to wait for during DOH resolve, those handles have their own
        sockets */
     return GETSOCK_BLANK;
-  return Curl_resolver_getsock(conn, socks, numsocks);
+  return Curl_resolver_getsock(conn, socks);
 #else
   (void)conn;
   (void)socks;
-  (void)numsocks;
   return GETSOCK_BLANK;
 #endif
 }
index 29fd1ef..e0597ea 100644 (file)
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -25,6 +25,7 @@
 #include "curl_setup.h"
 #include "hash.h"
 #include "curl_addrinfo.h"
+#include "timeval.h" /* for timediff_t */
 #include "asyn.h"
 
 #ifdef HAVE_SETJMP_H
@@ -61,7 +62,6 @@ struct connectdata;
  * Returns a struct curl_hash pointer on success, NULL on failure.
  */
 struct curl_hash *Curl_global_host_cache_init(void);
-void Curl_global_host_cache_dtor(void);
 
 struct Curl_dns_entry {
   Curl_addrinfo *addr;
@@ -83,11 +83,14 @@ struct Curl_dns_entry {
 #define CURLRESOLV_ERROR    -1
 #define CURLRESOLV_RESOLVED  0
 #define CURLRESOLV_PENDING   1
-int Curl_resolv(struct connectdata *conn, const char *hostname,
-                int port, struct Curl_dns_entry **dnsentry);
+int Curl_resolv(struct connectdata *conn,
+                const char *hostname,
+                int port,
+                bool allowDOH,
+                struct Curl_dns_entry **dnsentry);
 int Curl_resolv_timeout(struct connectdata *conn, const char *hostname,
                         int port, struct Curl_dns_entry **dnsentry,
-                        time_t timeoutms);
+                        timediff_t timeoutms);
 
 #ifdef CURLRES_IPV6
 /*
@@ -121,9 +124,6 @@ Curl_addrinfo *Curl_getaddrinfo(struct connectdata *conn,
 void Curl_resolv_unlock(struct Curl_easy *data,
                         struct Curl_dns_entry *dns);
 
-/* for debugging purposes only: */
-void Curl_scan_cache_used(void *user, void *ptr);
-
 /* init a new dns cache and return success */
 int Curl_mk_dnscache(struct curl_hash *hash);
 
@@ -179,16 +179,6 @@ Curl_fetch_addr(struct connectdata *conn,
                 int port);
 
 /*
- * Curl_shuffle_addr() shuffles the order of addresses in a 'Curl_addrinfo'
- * struct by re-linking its linked list.
- *
- * The addr argument should be the address of a pointer to the head node of a
- * `Curl_addrinfo` list and it will be modified to point to the new head after
- * shuffling.
- */
-CURLcode Curl_shuffle_addr(struct Curl_easy *data, Curl_addrinfo **addr);
-
-/*
  * Curl_cache_addr() stores a 'Curl_addrinfo' struct in the DNS cache.
  *
  * Returns the Curl_dns_entry entry pointer or NULL if the storage failed.
@@ -244,11 +234,6 @@ CURLcode Curl_set_dns_local_ip6(struct Curl_easy *data,
 void Curl_hostcache_clean(struct Curl_easy *data, struct curl_hash *hash);
 
 /*
- * Destroy the hostcache of this handle.
- */
-void Curl_hostcache_destroy(struct Curl_easy *data);
-
-/*
  * Populate the cache with specified entries from CURLOPT_RESOLVE.
  */
 CURLcode Curl_loadhostpairs(struct Curl_easy *data);
@@ -256,7 +241,6 @@ CURLcode Curl_loadhostpairs(struct Curl_easy *data);
 CURLcode Curl_resolv_check(struct connectdata *conn,
                            struct Curl_dns_entry **dns);
 int Curl_resolv_getsock(struct connectdata *conn,
-                        curl_socket_t *socks,
-                        int numsocks);
+                        curl_socket_t *socks);
 
 #endif /* HEADER_CURL_HOSTIP_H */
index 9d6f115..2636851 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -131,6 +131,16 @@ Curl_addrinfo *Curl_ipv4_resolve_r(const char *hostname,
   struct in_addr in;
   struct hostent *buf = NULL;
 
+#ifdef ENABLE_IPV6
+  {
+    struct in6_addr in6;
+    /* check if this is an IPv6 address string */
+    if(Curl_inet_pton(AF_INET6, hostname, &in6) > 0)
+      /* This is an IPv6 address literal */
+      return Curl_ip2addr(AF_INET6, &in6, hostname, port);
+  }
+#endif /* ENABLE_IPV6 */
+
   if(Curl_inet_pton(AF_INET, hostname, &in) > 0)
     /* This is a dotted IP address 123.123.123.123-style */
     return Curl_ip2addr(AF_INET, &in, hostname, port);
@@ -145,7 +155,7 @@ Curl_addrinfo *Curl_ipv4_resolve_r(const char *hostname,
     hints.ai_family = PF_INET;
     hints.ai_socktype = SOCK_STREAM;
     if(port) {
-      snprintf(sbuf, sizeof(sbuf), "%d", port);
+      msnprintf(sbuf, sizeof(sbuf), "%d", port);
       sbufptr = sbuf;
     }
 
index 3bf47b4..e0e0c58 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -101,14 +101,16 @@ static void dump_addrinfo(struct connectdata *conn, const Curl_addrinfo *ai)
 {
   printf("dump_addrinfo:\n");
   for(; ai; ai = ai->ai_next) {
-    char  buf[INET6_ADDRSTRLEN];
-
+    char buf[INET6_ADDRSTRLEN];
     printf("    fam %2d, CNAME %s, ",
            ai->ai_family, ai->ai_canonname ? ai->ai_canonname : "<none>");
     if(Curl_printable_address(ai, buf, sizeof(buf)))
       printf("%s\n", buf);
-    else
-      printf("failed; %s\n", Curl_strerror(conn, SOCKERRNO));
+    else {
+      char buffer[STRERROR_LEN];
+      printf("failed; %s\n",
+             Curl_strerror(SOCKERRNO, buffer, sizeof(buffer)));
+    }
   }
 }
 #else
@@ -163,7 +165,8 @@ Curl_addrinfo *Curl_getaddrinfo(struct connectdata *conn,
 
   memset(&hints, 0, sizeof(hints));
   hints.ai_family = pf;
-  hints.ai_socktype = conn->socktype;
+  hints.ai_socktype = (conn->transport == TRNSPRT_TCP) ?
+    SOCK_STREAM : SOCK_DGRAM;
 
 #ifndef USE_RESOLVE_ON_IPS
   /*
@@ -178,7 +181,7 @@ Curl_addrinfo *Curl_getaddrinfo(struct connectdata *conn,
 #endif
 
   if(port) {
-    snprintf(sbuf, sizeof(sbuf), "%d", port);
+    msnprintf(sbuf, sizeof(sbuf), "%d", port);
     sbufptr = sbuf;
   }
 
index 3de6746..9e31008 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
index 46ac15a..837f53c 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
 #include "http_proxy.h"
 #include "warnless.h"
 #include "non-ascii.h"
-#include "pipeline.h"
 #include "http2.h"
 #include "connect.h"
 #include "strdup.h"
+#include "altsvc.h"
 
 /* The last 3 #include files should be in this order */
 #include "curl_printf.h"
  */
 
 static int http_getsock_do(struct connectdata *conn,
-                           curl_socket_t *socks,
-                           int numsocks);
+                           curl_socket_t *socks);
 static int http_should_fail(struct connectdata *conn);
 
+#ifndef CURL_DISABLE_PROXY
 static CURLcode add_haproxy_protocol_header(struct connectdata *conn);
+#endif
 
 #ifdef USE_SSL
 static CURLcode https_connecting(struct connectdata *conn, bool *done);
 static int https_getsock(struct connectdata *conn,
-                         curl_socket_t *socks,
-                         int numsocks);
+                         curl_socket_t *socks);
 #else
 #define https_connecting(x,y) CURLE_COULDNT_CONNECT
 #endif
+static CURLcode http_setup_conn(struct connectdata *conn);
 
 /*
  * HTTP handler interface.
  */
 const struct Curl_handler Curl_handler_http = {
   "HTTP",                               /* scheme */
-  Curl_http_setup_conn,                 /* setup_connection */
+  http_setup_conn,                      /* setup_connection */
   Curl_http,                            /* do_it */
   Curl_http_done,                       /* done */
   ZERO_NULL,                            /* do_more */
@@ -133,7 +134,7 @@ const struct Curl_handler Curl_handler_http = {
  */
 const struct Curl_handler Curl_handler_https = {
   "HTTPS",                              /* scheme */
-  Curl_http_setup_conn,                 /* setup_connection */
+  http_setup_conn,                      /* setup_connection */
   Curl_http,                            /* do_it */
   Curl_http_done,                       /* done */
   ZERO_NULL,                            /* do_more */
@@ -153,7 +154,7 @@ const struct Curl_handler Curl_handler_https = {
 };
 #endif
 
-CURLcode Curl_http_setup_conn(struct connectdata *conn)
+static CURLcode http_setup_conn(struct connectdata *conn)
 {
   /* allocate the HTTP-specific struct for the Curl_easy, only to survive
      during this request */
@@ -168,14 +169,26 @@ CURLcode Curl_http_setup_conn(struct connectdata *conn)
   Curl_mime_initpart(&http->form, conn->data);
   data->req.protop = http;
 
-  if(!CONN_INUSE(conn))
-    /* if not already multi-using, setup connection details */
-    Curl_http2_setup_conn(conn);
-  Curl_http2_setup_req(data);
+  if(data->set.httpversion == CURL_HTTP_VERSION_3) {
+    if(conn->handler->flags & PROTOPT_SSL)
+      /* Only go HTTP/3 directly on HTTPS URLs. It needs a UDP socket and does
+         the QUIC dance. */
+      conn->transport = TRNSPRT_QUIC;
+    else {
+      failf(data, "HTTP/3 requested for non-HTTPS URL");
+      return CURLE_URL_MALFORMAT;
+    }
+  }
+  else {
+    if(!CONN_INUSE(conn))
+      /* if not already multi-using, setup connection details */
+      Curl_http2_setup_conn(conn);
+    Curl_http2_setup_req(data);
+  }
   return CURLE_OK;
 }
 
-
+#ifndef CURL_DISABLE_PROXY
 /*
  * checkProxyHeaders() checks the linked list of custom proxy headers
  * if proxy headers are not available, then it will lookup into http header
@@ -202,6 +215,10 @@ char *Curl_checkProxyheaders(const struct connectdata *conn,
 
   return NULL;
 }
+#else
+/* disabled */
+#define Curl_checkProxyheaders(x,y) NULL
+#endif
 
 /*
  * Strip off leading and trailing whitespace from the value in the
@@ -256,6 +273,7 @@ char *Curl_copy_header_value(const char *header)
   return value;
 }
 
+#ifndef CURL_DISABLE_HTTP_AUTH
 /*
  * http_output_basic() sets up an Authorization: header (or the proxy version)
  * for HTTP Basic authentication.
@@ -337,6 +355,8 @@ static CURLcode http_output_bearer(struct connectdata *conn)
   return result;
 }
 
+#endif
+
 /* pickoneauth() selects the most favourable authentication method from the
  * ones available and the ones we want.
  *
@@ -373,7 +393,7 @@ static bool pickoneauth(struct auth *pick, unsigned long mask)
 }
 
 /*
- * Curl_http_perhapsrewind()
+ * http_perhapsrewind()
  *
  * If we are doing POST or PUT {
  *   If we have more data to send {
@@ -415,7 +435,7 @@ static CURLcode http_perhapsrewind(struct connectdata *conn)
     break;
   }
 
-  bytessent = http->writebytecount;
+  bytessent = data->req.writebytecount;
 
   if(conn->bits.authneg) {
     /* This is a state where we are known to be negotiating and we don't send
@@ -430,9 +450,6 @@ static CURLcode http_perhapsrewind(struct connectdata *conn)
     /* figure out how much data we are expected to send */
     switch(data->set.httpreq) {
     case HTTPREQ_POST:
-      if(data->state.infilesize != -1)
-        expectsend = data->state.infilesize;
-      break;
     case HTTPREQ_PUT:
       if(data->state.infilesize != -1)
         expectsend = data->state.infilesize;
@@ -456,8 +473,8 @@ static CURLcode http_perhapsrewind(struct connectdata *conn)
        (data->state.authproxy.picked == CURLAUTH_NTLM_WB) ||
        (data->state.authhost.picked == CURLAUTH_NTLM_WB)) {
       if(((expectsend - bytessent) < 2000) ||
-         (conn->ntlm.state != NTLMSTATE_NONE) ||
-         (conn->proxyntlm.state != NTLMSTATE_NONE)) {
+         (conn->http_ntlm_state != NTLMSTATE_NONE) ||
+         (conn->proxy_ntlm_state != NTLMSTATE_NONE)) {
         /* The NTLM-negotiation has started *OR* there is just a little (<2K)
            data left to send, keep on sending. */
 
@@ -479,8 +496,36 @@ static CURLcode http_perhapsrewind(struct connectdata *conn)
             (curl_off_t)(expectsend - bytessent));
     }
 #endif
+#if defined(USE_SPNEGO)
+    /* There is still data left to send */
+    if((data->state.authproxy.picked == CURLAUTH_NEGOTIATE) ||
+       (data->state.authhost.picked == CURLAUTH_NEGOTIATE)) {
+      if(((expectsend - bytessent) < 2000) ||
+         (conn->http_negotiate_state != GSS_AUTHNONE) ||
+         (conn->proxy_negotiate_state != GSS_AUTHNONE)) {
+        /* The NEGOTIATE-negotiation has started *OR*
+        there is just a little (<2K) data left to send, keep on sending. */
+
+        /* rewind data when completely done sending! */
+        if(!conn->bits.authneg && (conn->writesockfd != CURL_SOCKET_BAD)) {
+          conn->bits.rewindaftersend = TRUE;
+          infof(data, "Rewind stream after send\n");
+        }
+
+        return CURLE_OK;
+      }
 
-    /* This is not NTLM or many bytes left to send: close */
+      if(conn->bits.close)
+        /* this is already marked to get closed */
+        return CURLE_OK;
+
+      infof(data, "NEGOTIATE send, close instead of sending %"
+        CURL_FORMAT_CURL_OFF_T " bytes\n",
+        (curl_off_t)(expectsend - bytessent));
+    }
+#endif
+
+    /* This is not NEGOTIATE/NTLM or many bytes left to send: close */
     streamclose(conn, "Mid-auth HTTP and much data left to send");
     data->req.size = 0; /* don't download any more than 0 bytes */
 
@@ -526,6 +571,12 @@ CURLcode Curl_http_auth_act(struct connectdata *conn)
     pickhost = pickoneauth(&data->state.authhost, authmask);
     if(!pickhost)
       data->state.authproblem = TRUE;
+    if(data->state.authhost.picked == CURLAUTH_NTLM &&
+       conn->httpversion > 11) {
+      infof(data, "Forcing HTTP/1.1 for NTLM");
+      connclose(conn, "Force HTTP/1.1 connection");
+      conn->data->set.httpversion = CURL_HTTP_VERSION_1_1;
+    }
   }
   if(conn->bits.proxy_user_passwd &&
      ((data->req.httpcode == 407) ||
@@ -576,6 +627,7 @@ CURLcode Curl_http_auth_act(struct connectdata *conn)
   return result;
 }
 
+#ifndef CURL_DISABLE_HTTP_AUTH
 /*
  * Output the correct authentication header depending on the auth type
  * and whether or not it is to a proxy.
@@ -589,13 +641,9 @@ output_auth_headers(struct connectdata *conn,
 {
   const char *auth = NULL;
   CURLcode result = CURLE_OK;
-#if !defined(CURL_DISABLE_VERBOSE_STRINGS) || defined(USE_SPNEGO)
+#if !defined(CURL_DISABLE_VERBOSE_STRINGS)
   struct Curl_easy *data = conn->data;
 #endif
-#ifdef USE_SPNEGO
-  struct negotiatedata *negdata = proxy ?
-    &data->state.proxyneg : &data->state.negotiate;
-#endif
 
 #ifdef CURL_DISABLE_CRYPTO_AUTH
   (void)request;
@@ -603,15 +651,11 @@ output_auth_headers(struct connectdata *conn,
 #endif
 
 #ifdef USE_SPNEGO
-  negdata->state = GSS_AUTHNONE;
-  if((authstatus->picked == CURLAUTH_NEGOTIATE) &&
-     negdata->context && !GSS_ERROR(negdata->status)) {
+  if(authstatus->picked == CURLAUTH_NEGOTIATE) {
     auth = "Negotiate";
     result = Curl_output_negotiate(conn, proxy);
     if(result)
       return result;
-    authstatus->done = TRUE;
-    negdata->state = GSS_AUTHSENT;
   }
   else
 #endif
@@ -697,7 +741,7 @@ output_auth_headers(struct connectdata *conn,
  *
  * @param conn all information about the current connection
  * @param request pointer to the request keyword
- * @param path pointer to the requested path
+ * @param path pointer to the requested path; should include query part
  * @param proxytunnel boolean if this is the request setting up a "proxy
  * tunnel"
  *
@@ -744,7 +788,7 @@ Curl_http_output_auth(struct connectdata *conn,
 #ifndef CURL_DISABLE_PROXY
   /* Send proxy authentication header if needed */
   if(conn->bits.httpproxy &&
-      (conn->bits.tunnel_proxy == proxytunnel)) {
+     (conn->bits.tunnel_proxy == (bit)proxytunnel)) {
     result = output_auth_headers(conn, authproxy, request, path, TRUE);
     if(result)
       return result;
@@ -772,6 +816,22 @@ Curl_http_output_auth(struct connectdata *conn,
   return result;
 }
 
+#else
+/* when disabled */
+CURLcode
+Curl_http_output_auth(struct connectdata *conn,
+                      const char *request,
+                      const char *path,
+                      bool proxytunnel)
+{
+  (void)conn;
+  (void)request;
+  (void)path;
+  (void)proxytunnel;
+  return CURLE_OK;
+}
+#endif
+
 /*
  * Curl_http_input_auth() deals with Proxy-Authenticate: and WWW-Authenticate:
  * headers. They are dealt with both in the transfer.c main loop and in the
@@ -787,8 +847,8 @@ CURLcode Curl_http_input_auth(struct connectdata *conn, bool proxy,
   struct Curl_easy *data = conn->data;
 
 #ifdef USE_SPNEGO
-  struct negotiatedata *negdata = proxy?
-    &data->state.proxyneg:&data->state.negotiate;
+  curlnegotiate *negstate = proxy ? &conn->proxy_negotiate_state :
+                                    &conn->http_negotiate_state;
 #endif
   unsigned long *availp;
   struct auth *authp;
@@ -827,21 +887,18 @@ CURLcode Curl_http_input_auth(struct connectdata *conn, bool proxy,
         authp->avail |= CURLAUTH_NEGOTIATE;
 
         if(authp->picked == CURLAUTH_NEGOTIATE) {
-          if(negdata->state == GSS_AUTHSENT ||
-             negdata->state == GSS_AUTHNONE) {
-            CURLcode result = Curl_input_negotiate(conn, proxy, auth);
-            if(!result) {
-              DEBUGASSERT(!data->req.newurl);
-              data->req.newurl = strdup(data->change.url);
-              if(!data->req.newurl)
-                return CURLE_OUT_OF_MEMORY;
-              data->state.authproblem = FALSE;
-              /* we received a GSS auth token and we dealt with it fine */
-              negdata->state = GSS_AUTHRECV;
-            }
-            else
-              data->state.authproblem = TRUE;
+          CURLcode result = Curl_input_negotiate(conn, proxy, auth);
+          if(!result) {
+            DEBUGASSERT(!data->req.newurl);
+            data->req.newurl = strdup(data->change.url);
+            if(!data->req.newurl)
+              return CURLE_OUT_OF_MEMORY;
+            data->state.authproblem = FALSE;
+            /* we received a GSS auth token and we dealt with it fine */
+            *negstate = GSS_AUTHRECV;
           }
+          else
+            data->state.authproblem = TRUE;
         }
       }
     }
@@ -869,19 +926,10 @@ CURLcode Curl_http_input_auth(struct connectdata *conn, bool proxy,
                 *availp |= CURLAUTH_NTLM_WB;
                 authp->avail |= CURLAUTH_NTLM_WB;
 
-                /* Get the challenge-message which will be passed to
-                 * ntlm_auth for generating the type 3 message later */
-                while(*auth && ISSPACE(*auth))
-                  auth++;
-                if(checkprefix("NTLM", auth)) {
-                  auth += strlen("NTLM");
-                  while(*auth && ISSPACE(*auth))
-                    auth++;
-                  if(*auth) {
-                    conn->challenge_header = strdup(auth);
-                    if(!conn->challenge_header)
-                      return CURLE_OUT_OF_MEMORY;
-                  }
+                result = Curl_input_ntlm_wb(conn, proxy, auth);
+                if(result) {
+                  infof(data, "Authentication problem. Ignoring this.\n");
+                  data->state.authproblem = TRUE;
                 }
               }
 #endif
@@ -1095,10 +1143,14 @@ Curl_send_buffer *Curl_add_buffer_init(void)
  */
 void Curl_add_buffer_free(Curl_send_buffer **inp)
 {
-  Curl_send_buffer *in = *inp;
-  if(in) /* deal with NULL input */
+  Curl_send_buffer *in;
+  if(!inp)
+    return;
+  in = *inp;
+  if(in) { /* deal with NULL input */
     free(in->buffer);
-  free(in);
+    free(in);
+  }
   *inp = NULL;
 }
 
@@ -1111,14 +1163,13 @@ void Curl_add_buffer_free(Curl_send_buffer **inp)
 CURLcode Curl_add_buffer_send(Curl_send_buffer **inp,
                               struct connectdata *conn,
 
-                               /* add the number of sent bytes to this
-                                  counter */
-                              long *bytes_written,
+                              /* add the number of sent bytes to this
+                                 counter */
+                              curl_off_t *bytes_written,
 
-                               /* how much of the buffer contains body data */
+                              /* how much of the buffer contains body data */
                               size_t included_body_bytes,
                               int socketindex)
-
 {
   ssize_t amount;
   CURLcode result;
@@ -1214,7 +1265,8 @@ CURLcode Curl_add_buffer_send(Curl_send_buffer **inp,
     if(http) {
       /* if we sent a piece of the body here, up the byte counter for it
          accordingly */
-      http->writebytecount += bodylen;
+      data->req.writebytecount += bodylen;
+      Curl_pgrsSetUploadCounter(data, data->req.writebytecount);
 
       if((size_t)amount != size) {
         /* The whole request could not be sent in one system call. We must
@@ -1255,7 +1307,6 @@ CURLcode Curl_add_buffer_send(Curl_send_buffer **inp,
            This needs FIXing.
         */
         return CURLE_SEND_ERROR;
-      Curl_pipeline_leave_write(conn);
     }
   }
   Curl_add_buffer_free(&in);
@@ -1432,12 +1483,14 @@ CURLcode Curl_http_connect(struct connectdata *conn, bool *done)
     /* nothing else to do except wait right now - we're not done here. */
     return CURLE_OK;
 
+#ifndef CURL_DISABLE_PROXY
   if(conn->data->set.haproxyprotocol) {
     /* add HAProxy PROXY protocol header */
     result = add_haproxy_protocol_header(conn);
     if(result)
       return result;
   }
+#endif
 
   if(conn->given->protocol & CURLPROTO_HTTPS) {
     /* perform SSL initialization */
@@ -1455,15 +1508,14 @@ CURLcode Curl_http_connect(struct connectdata *conn, bool *done)
    interface and then we're always _sending_ a request and thus we wait for
    the single socket to become writable only */
 static int http_getsock_do(struct connectdata *conn,
-                           curl_socket_t *socks,
-                           int numsocks)
+                           curl_socket_t *socks)
 {
   /* write mode */
-  (void)numsocks; /* unused, we trust it to be at least 1 */
   socks[0] = conn->sock[FIRSTSOCKET];
   return GETSOCK_WRITESOCK(0);
 }
 
+#ifndef CURL_DISABLE_PROXY
 static CURLcode add_haproxy_protocol_header(struct connectdata *conn)
 {
   char proxy_header[128];
@@ -1479,14 +1531,14 @@ static CURLcode add_haproxy_protocol_header(struct connectdata *conn)
     strcpy(tcp_version, "TCP4");
   }
 
-  snprintf(proxy_header,
-           sizeof(proxy_header),
-           "PROXY %s %s %s %li %li\r\n",
-           tcp_version,
-           conn->data->info.conn_local_ip,
-           conn->data->info.conn_primary_ip,
-           conn->data->info.conn_local_port,
-           conn->data->info.conn_primary_port);
+  msnprintf(proxy_header,
+            sizeof(proxy_header),
+            "PROXY %s %s %s %li %li\r\n",
+            tcp_version,
+            conn->data->info.conn_local_ip,
+            conn->data->info.conn_primary_ip,
+            conn->data->info.conn_local_port,
+            conn->data->info.conn_primary_port);
 
   req_buffer = Curl_add_buffer_init();
   if(!req_buffer)
@@ -1504,6 +1556,7 @@ static CURLcode add_haproxy_protocol_header(struct connectdata *conn)
 
   return result;
 }
+#endif
 
 #ifdef USE_SSL
 static CURLcode https_connecting(struct connectdata *conn, bool *done)
@@ -1511,6 +1564,13 @@ static CURLcode https_connecting(struct connectdata *conn, bool *done)
   CURLcode result;
   DEBUGASSERT((conn) && (conn->handler->flags & PROTOPT_SSL));
 
+#ifdef ENABLE_QUIC
+  if(conn->transport == TRNSPRT_QUIC) {
+    *done = TRUE;
+    return CURLE_OK;
+  }
+#endif
+
   /* perform SSL initialization for this socket */
   result = Curl_ssl_connect_nonblocking(conn, FIRSTSOCKET, done);
   if(result)
@@ -1520,11 +1580,10 @@ static CURLcode https_connecting(struct connectdata *conn, bool *done)
 }
 
 static int https_getsock(struct connectdata *conn,
-                         curl_socket_t *socks,
-                         int numsocks)
+                         curl_socket_t *socks)
 {
   if(conn->handler->flags & PROTOPT_SSL)
-    return Curl_ssl_getsock(conn, socks, numsocks);
+    return Curl_ssl_getsock(conn, socks);
   return GETSOCK_BLANK;
 }
 #endif /* USE_SSL */
@@ -1547,20 +1606,6 @@ CURLcode Curl_http_done(struct connectdata *conn,
 
   Curl_unencode_cleanup(conn);
 
-#ifdef USE_SPNEGO
-  if(data->state.proxyneg.state == GSS_AUTHSENT ||
-     data->state.negotiate.state == GSS_AUTHSENT) {
-    /* add forbid re-use if http-code != 401/407 as a WA only needed for
-     * 401/407 that signal auth failure (empty) otherwise state will be RECV
-     * with current code.
-     * Do not close CONNECT_ONLY connections. */
-    if((data->req.httpcode != 401) && (data->req.httpcode != 407) &&
-       !data->set.connect_only)
-      streamclose(conn, "Negotiate transfer completed");
-    Curl_cleanup_negotiate(data);
-  }
-#endif
-
   /* set the proper values (possibly modified on POST) */
   conn->seek_func = data->set.seek_func; /* restore */
   conn->seek_client = data->set.seek_client; /* restore */
@@ -1572,20 +1617,11 @@ CURLcode Curl_http_done(struct connectdata *conn,
     Curl_add_buffer_free(&http->send_buffer);
   }
 
-  Curl_http2_done(conn, premature);
+  Curl_http2_done(data, premature);
+  Curl_quic_done(data, premature);
 
   Curl_mime_cleanpart(&http->form);
 
-  switch(data->set.httpreq) {
-  case HTTPREQ_PUT:
-  case HTTPREQ_POST_FORM:
-  case HTTPREQ_POST_MIME:
-    data->req.bytecount = http->readbytecount + http->writebytecount;
-    break;
-  default:
-    break;
-  }
-
   if(status)
     return status;
 
@@ -1593,7 +1629,7 @@ CURLcode Curl_http_done(struct connectdata *conn,
                       entire operation is complete */
      !conn->bits.retry &&
      !data->set.connect_only &&
-     (http->readbytecount +
+     (data->req.bytecount +
       data->req.headerbytecount -
       data->req.deductheadercount) <= 0) {
     /* If this connection isn't simply closed to be retried, AND nothing was
@@ -1630,6 +1666,12 @@ static bool use_http_1_1plus(const struct Curl_easy *data,
 static const char *get_http_string(const struct Curl_easy *data,
                                    const struct connectdata *conn)
 {
+#ifdef ENABLE_QUIC
+  if((data->set.httpversion == CURL_HTTP_VERSION_3) ||
+     (conn->httpversion == 30))
+    return "3";
+#endif
+
 #ifdef USE_NGHTTP2
   if(conn->proto.httpc.h2)
     return "2";
@@ -1650,7 +1692,7 @@ static CURLcode expect100(struct Curl_easy *data,
   data->state.expect100header = FALSE; /* default to false unless it is set
                                           to TRUE below */
   if(use_http_1_1plus(data, conn) &&
-     (conn->httpversion != 20)) {
+     (conn->httpversion < 20)) {
     /* if not doing HTTP 1.0 or version 2, or disabled explicitly, we add an
        Expect: 100-continue to the headers which actually speeds up post
        operations (as there is one packet coming back from the web server) */
@@ -1676,6 +1718,50 @@ enum proxy_use {
   HEADER_CONNECT  /* sending CONNECT to a proxy */
 };
 
+/* used to compile the provided trailers into one buffer
+   will return an error code if one of the headers is
+   not formatted correctly */
+CURLcode Curl_http_compile_trailers(struct curl_slist *trailers,
+                                    Curl_send_buffer **buffer,
+                                    struct Curl_easy *handle)
+{
+  char *ptr = NULL;
+  CURLcode result = CURLE_OK;
+  const char *endofline_native = NULL;
+  const char *endofline_network = NULL;
+
+  if(
+#ifdef CURL_DO_LINEEND_CONV
+     (handle->set.prefer_ascii) ||
+#endif
+     (handle->set.crlf)) {
+    /* \n will become \r\n later on */
+    endofline_native  = "\n";
+    endofline_network = "\x0a";
+  }
+  else {
+    endofline_native  = "\r\n";
+    endofline_network = "\x0d\x0a";
+  }
+
+  while(trailers) {
+    /* only add correctly formatted trailers */
+    ptr = strchr(trailers->data, ':');
+    if(ptr && *(ptr + 1) == ' ') {
+      result = Curl_add_bufferf(buffer, "%s%s", trailers->data,
+                                endofline_native);
+      if(result)
+        return result;
+    }
+    else
+      infof(handle, "Malformatted trailing header ! Skipping trailer.");
+    trailers = trailers->next;
+  }
+  result = Curl_add_buffer(buffer, endofline_network,
+                           strlen(endofline_network));
+  return result;
+}
+
 CURLcode Curl_add_custom_headers(struct connectdata *conn,
                                  bool is_connect,
                                  Curl_send_buffer *req_buffer)
@@ -1737,9 +1823,16 @@ CURLcode Curl_add_custom_headers(struct connectdata *conn,
           }
           else {
             if(*(--ptr) == ';') {
-              /* send no-value custom header if terminated by semicolon */
-              *ptr = ':';
-              semicolonp = ptr;
+              /* copy the source */
+              semicolonp = strdup(headers->data);
+              if(!semicolonp) {
+                Curl_add_buffer_free(&req_buffer);
+                return CURLE_OUT_OF_MEMORY;
+              }
+              /* put a colon where the semicolon is */
+              semicolonp[ptr - headers->data] = ':';
+              /* point at the colon */
+              optr = &semicolonp [ptr - headers->data];
             }
           }
           ptr = optr;
@@ -1755,35 +1848,37 @@ CURLcode Curl_add_custom_headers(struct connectdata *conn,
         if(*ptr || semicolonp) {
           /* only send this if the contents was non-blank or done special */
           CURLcode result = CURLE_OK;
+          char *compare = semicolonp ? semicolonp : headers->data;
 
           if(conn->allocptr.host &&
              /* a Host: header was sent already, don't pass on any custom Host:
                 header as that will produce *two* in the same request! */
-             checkprefix("Host:", headers->data))
+             checkprefix("Host:", compare))
             ;
           else if(data->set.httpreq == HTTPREQ_POST_FORM &&
                   /* this header (extended by formdata.c) is sent later */
-                  checkprefix("Content-Type:", headers->data))
+                  checkprefix("Content-Type:", compare))
             ;
           else if(data->set.httpreq == HTTPREQ_POST_MIME &&
                   /* this header is sent later */
-                  checkprefix("Content-Type:", headers->data))
+                  checkprefix("Content-Type:", compare))
             ;
           else if(conn->bits.authneg &&
                   /* while doing auth neg, don't allow the custom length since
                      we will force length zero then */
-                  checkprefix("Content-Length:", headers->data))
+                  checkprefix("Content-Length:", compare))
             ;
           else if(conn->allocptr.te &&
                   /* when asking for Transfer-Encoding, don't pass on a custom
                      Connection: */
-                  checkprefix("Connection:", headers->data))
+                  checkprefix("Connection:", compare))
             ;
-          else if((conn->httpversion == 20) &&
-                  checkprefix("Transfer-Encoding:", headers->data))
+          else if((conn->httpversion >= 20) &&
+                  checkprefix("Transfer-Encoding:", compare))
             /* HTTP/2 doesn't support chunked requests */
             ;
-          else if(checkprefix("Authorization:", headers->data) &&
+          else if((checkprefix("Authorization:", compare) ||
+                   checkprefix("Cookie:", compare)) &&
                   /* be careful of sending this potentially sensitive header to
                      other hosts */
                   (data->state.this_is_a_follow &&
@@ -1792,10 +1887,10 @@ CURLcode Curl_add_custom_headers(struct connectdata *conn,
                    !strcasecompare(data->state.first_host, conn->host.name)))
             ;
           else {
-            result = Curl_add_bufferf(&req_buffer, "%s\r\n", headers->data);
+            result = Curl_add_bufferf(&req_buffer, "%s\r\n", compare);
           }
           if(semicolonp)
-            *semicolonp = ';'; /* put back the semicolon */
+            free(semicolonp);
           if(result)
             return result;
         }
@@ -1807,9 +1902,11 @@ CURLcode Curl_add_custom_headers(struct connectdata *conn,
   return CURLE_OK;
 }
 
-CURLcode Curl_add_timecondition(struct Curl_easy *data,
+#ifndef CURL_DISABLE_PARSEDATE
+CURLcode Curl_add_timecondition(const struct connectdata *conn,
                                 Curl_send_buffer *req_buffer)
 {
+  struct Curl_easy *data = conn->data;
   const struct tm *tm;
   struct tm keeptime;
   CURLcode result;
@@ -1842,6 +1939,11 @@ CURLcode Curl_add_timecondition(struct Curl_easy *data,
     break;
   }
 
+  if(Curl_checkheaders(conn, condp)) {
+    /* A custom header was specified; it will be sent instead. */
+    return CURLE_OK;
+  }
+
   /* The If-Modified-Since header family should have their times set in
    * GMT as RFC2616 defines: "All HTTP date/time stamps MUST be
    * represented in Greenwich Mean Time (GMT), without exception. For the
@@ -1850,21 +1952,31 @@ CURLcode Curl_add_timecondition(struct Curl_easy *data,
    */
 
   /* format: "Tue, 15 Nov 1994 12:45:26 GMT" */
-  snprintf(datestr, sizeof(datestr),
-           "%s: %s, %02d %s %4d %02d:%02d:%02d GMT\r\n",
-           condp,
-           Curl_wkday[tm->tm_wday?tm->tm_wday-1:6],
-           tm->tm_mday,
-           Curl_month[tm->tm_mon],
-           tm->tm_year + 1900,
-           tm->tm_hour,
-           tm->tm_min,
-           tm->tm_sec);
+  msnprintf(datestr, sizeof(datestr),
+            "%s: %s, %02d %s %4d %02d:%02d:%02d GMT\r\n",
+            condp,
+            Curl_wkday[tm->tm_wday?tm->tm_wday-1:6],
+            tm->tm_mday,
+            Curl_month[tm->tm_mon],
+            tm->tm_year + 1900,
+            tm->tm_hour,
+            tm->tm_min,
+            tm->tm_sec);
 
   result = Curl_add_buffer(&req_buffer, datestr, strlen(datestr));
 
   return result;
 }
+#else
+/* disabled */
+CURLcode Curl_add_timecondition(const struct connectdata *conn,
+                                Curl_send_buffer *req_buffer)
+{
+  (void)conn;
+  (void)req_buffer;
+  return CURLE_OK;
+}
+#endif
 
 /*
  * Curl_http() gets called from the generic multi_do() function when a HTTP
@@ -1892,48 +2004,57 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
   const char *httpstring;
   Curl_send_buffer *req_buffer;
   curl_off_t postsize = 0; /* curl_off_t to handle large file sizes */
+  char *altused = NULL;
 
   /* Always consider the DO phase done after this function call, even if there
      may be parts of the request that is not yet sent, since we can deal with
      the rest of the request in the PERFORM phase. */
   *done = TRUE;
 
-  if(conn->httpversion < 20) { /* unless the connection is re-used and already
-                                  http2 */
-    switch(conn->negnpn) {
-    case CURL_HTTP_VERSION_2:
-      conn->httpversion = 20; /* we know we're on HTTP/2 now */
-
-      result = Curl_http2_switched(conn, NULL, 0);
-      if(result)
-        return result;
-      break;
-    case CURL_HTTP_VERSION_1_1:
-      /* continue with HTTP/1.1 when explicitly requested */
-      break;
-    default:
-      /* Check if user wants to use HTTP/2 with clear TCP*/
-#ifdef USE_NGHTTP2
-      if(conn->data->set.httpversion ==
-         CURL_HTTP_VERSION_2_PRIOR_KNOWLEDGE) {
-        DEBUGF(infof(data, "HTTP/2 over clean TCP\n"));
-        conn->httpversion = 20;
+  if(conn->transport != TRNSPRT_QUIC) {
+    if(conn->httpversion < 20) { /* unless the connection is re-used and
+                                    already http2 */
+      switch(conn->negnpn) {
+      case CURL_HTTP_VERSION_2:
+        conn->httpversion = 20; /* we know we're on HTTP/2 now */
 
         result = Curl_http2_switched(conn, NULL, 0);
         if(result)
           return result;
-      }
+        break;
+      case CURL_HTTP_VERSION_1_1:
+        /* continue with HTTP/1.1 when explicitly requested */
+        break;
+      default:
+        /* Check if user wants to use HTTP/2 with clear TCP*/
+#ifdef USE_NGHTTP2
+        if(conn->data->set.httpversion ==
+           CURL_HTTP_VERSION_2_PRIOR_KNOWLEDGE) {
+          if(conn->bits.httpproxy && !conn->bits.tunnel_proxy) {
+            /* We don't support HTTP/2 proxies yet. Also it's debatable
+               whether or not this setting should apply to HTTP/2 proxies. */
+            infof(data, "Ignoring HTTP/2 prior knowledge due to proxy\n");
+            break;
+          }
+
+          DEBUGF(infof(data, "HTTP/2 over clean TCP\n"));
+          conn->httpversion = 20;
+
+          result = Curl_http2_switched(conn, NULL, 0);
+          if(result)
+            return result;
+        }
 #endif
-      break;
+        break;
+      }
+    }
+    else {
+      /* prepare for a http2 request */
+      result = Curl_http2_setup(conn);
+      if(result)
+        return result;
     }
   }
-  else {
-    /* prepare for a http2 request */
-    result = Curl_http2_setup(conn);
-    if(result)
-      return result;
-  }
-
   http = data->req.protop;
   DEBUGASSERT(http);
 
@@ -1947,7 +2068,6 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
 
     data->state.first_remote_port = conn->remote_port;
   }
-  http->writebytecount = http->readbytecount = 0;
 
   if((conn->handler->protocol&(PROTO_FAMILY_HTTP|CURLPROTO_FTP)) &&
      data->set.upload) {
@@ -1995,11 +2115,21 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
   }
 
   /* setup the authentication headers */
-  result = Curl_http_output_auth(conn, request, path, FALSE);
-  if(result)
-    return result;
+  {
+    char *pq = NULL;
+    if(query && *query) {
+      pq = aprintf("%s?%s", path, query);
+      if(!pq)
+        return CURLE_OUT_OF_MEMORY;
+    }
+    result = Curl_http_output_auth(conn, request, (pq ? pq : path), FALSE);
+    free(pq);
+    if(result)
+      return result;
+  }
 
-  if((data->state.authhost.multipass || data->state.authproxy.multipass) &&
+  if(((data->state.authhost.multipass && !data->state.authhost.done)
+      || (data->state.authproxy.multipass && !data->state.authproxy.done)) &&
      (httpreq != HTTPREQ_GET) &&
      (httpreq != HTTPREQ_HEAD)) {
     /* Auth is required and we are not authenticated yet. Make a PUT or POST
@@ -2084,6 +2214,7 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
     http->sendit = NULL;
   }
 
+#ifndef CURL_DISABLE_MIME
   if(http->sendit) {
     const char *cthdr = Curl_checkheaders(conn, "Content-Type");
 
@@ -2108,6 +2239,7 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
       return result;
     http->postsize = Curl_mime_size(http->sendit);
   }
+#endif
 
   ptr = Curl_checkheaders(conn, "Transfer-Encoding");
   if(ptr) {
@@ -2118,14 +2250,16 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
   else {
     if((conn->handler->protocol & PROTO_FAMILY_HTTP) &&
        (((httpreq == HTTPREQ_POST_MIME || httpreq == HTTPREQ_POST_FORM) &&
-       http->postsize < 0) ||
-       (data->set.upload && data->state.infilesize == -1))) {
+         http->postsize < 0) ||
+        ((data->set.upload || httpreq == HTTPREQ_POST) &&
+         data->state.infilesize == -1))) {
       if(conn->bits.authneg)
         /* don't enable chunked during auth neg */
         ;
       else if(use_http_1_1plus(data, conn)) {
-        /* HTTP, upload, unknown file size and not HTTP 1.0 */
-        data->req.upload_chunky = TRUE;
+        if(conn->httpversion < 20)
+          /* HTTP, upload, unknown file size and not HTTP 1.0 */
+          data->req.upload_chunky = TRUE;
       }
       else {
         failf(data, "Chunky upload is not supported by HTTP 1.0");
@@ -2226,7 +2360,6 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
 
     /* and no fragment part */
     CURLUcode uc;
-    char *url;
     CURLU *h = curl_url_dup(data->state.uh);
     if(!h)
       return CURLE_OUT_OF_MEMORY;
@@ -2257,19 +2390,15 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
         return CURLE_OUT_OF_MEMORY;
       }
     }
-    /* now extract the new version of the URL */
-    uc = curl_url_get(h, CURLUPART_URL, &url, 0);
+    /* Extract the the URL to use in the request. Store in STRING_TEMP_URL for
+       clean-up reasons if the function returns before the free() further
+       down. */
+    uc = curl_url_get(h, CURLUPART_URL, &data->set.str[STRING_TEMP_URL], 0);
     if(uc) {
       curl_url_cleanup(h);
       return CURLE_OUT_OF_MEMORY;
     }
 
-    if(data->change.url_alloc)
-      free(data->change.url);
-
-    data->change.url = url;
-    data->change.url_alloc = TRUE;
-
     curl_url_cleanup(h);
 
     if(strcasecompare("ftp", data->state.up.scheme)) {
@@ -2293,8 +2422,8 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
           if(!*data->state.up.path && path[strlen(path) - 1] != '/') {
             *p++ = '/';
           }
-          snprintf(p, sizeof(ftp_typecode) - 1, ";type=%c",
-                   data->set.prefer_ascii ? 'a' : 'i');
+          msnprintf(p, sizeof(ftp_typecode) - 1, ";type=%c",
+                    data->set.prefer_ascii ? 'a' : 'i');
         }
       }
       if(conn->bits.user_passwd && !conn->bits.userpwd_in_url)
@@ -2448,12 +2577,16 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
     query = NULL;
   }
 
+#ifndef CURL_DISABLE_PROXY
   /* url */
   if(conn->bits.httpproxy && !conn->bits.tunnel_proxy) {
-    char *url = data->change.url;
+    char *url = data->set.str[STRING_TEMP_URL];
     result = Curl_add_buffer(&req_buffer, url, strlen(url));
+    Curl_safefree(data->set.str[STRING_TEMP_URL]);
   }
-  else if(paste_ftp_userpwd)
+  else
+#endif
+  if(paste_ftp_userpwd)
     result = Curl_add_bufferf(&req_buffer, "ftp://%s:%s@%s",
                               conn->user, conn->passwd,
                               path + sizeof("ftp://") - 1);
@@ -2467,6 +2600,14 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
   if(result)
     return result;
 
+#ifdef USE_ALTSVC
+  if(conn->bits.altused && !Curl_checkheaders(conn, "Alt-Used")) {
+    altused = aprintf("Alt-Used: %s:%d\r\n",
+                      conn->conn_to_host.name, conn->conn_to_port);
+    if(!altused)
+      return CURLE_OUT_OF_MEMORY;
+  }
+#endif
   result =
     Curl_add_bufferf(&req_buffer,
                      "%s" /* ftp typecode (;type=x) */
@@ -2481,7 +2622,8 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
                      "%s" /* accept-encoding */
                      "%s" /* referer */
                      "%s" /* Proxy-Connection */
-                     "%s",/* transfer-encoding */
+                     "%s" /* transfer-encoding */
+                     "%s",/* Alt-Used */
 
                      ftp_typecode,
                      httpstring,
@@ -2507,13 +2649,15 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
                       !conn->bits.tunnel_proxy &&
                       !Curl_checkProxyheaders(conn, "Proxy-Connection"))?
                      "Proxy-Connection: Keep-Alive\r\n":"",
-                     te
+                     te,
+                     altused ? altused : ""
       );
 
   /* clear userpwd and proxyuserpwd to avoid re-using old credentials
    * from re-used connections */
   Curl_safefree(conn->allocptr.userpwd);
   Curl_safefree(conn->allocptr.proxyuserpwd);
+  free(altused);
 
   if(result)
     return result;
@@ -2533,7 +2677,7 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
     struct Cookie *co = NULL; /* no cookies from start */
     int count = 0;
 
-    if(data->cookies) {
+    if(data->cookies && data->state.cookie_engine) {
       Curl_share_lock(data, CURL_LOCK_DATA_COOKIE, CURL_LOCK_ACCESS_SINGLE);
       co = Curl_cookie_getlist(data->cookies,
                                conn->allocptr.cookiehost?
@@ -2581,7 +2725,7 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
   }
 #endif
 
-  result = Curl_add_timecondition(data, req_buffer);
+  result = Curl_add_timecondition(conn, req_buffer);
   if(result)
     return result;
 
@@ -2635,9 +2779,8 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
       failf(data, "Failed sending PUT request");
     else
       /* prepare for transfer */
-      Curl_setup_transfer(conn, FIRSTSOCKET, -1, TRUE,
-                          &http->readbytecount, postsize?FIRSTSOCKET:-1,
-                          postsize?&http->writebytecount:NULL);
+      Curl_setup_transfer(data, FIRSTSOCKET, -1, TRUE,
+                          postsize?FIRSTSOCKET:-1);
     if(result)
       return result;
     break;
@@ -2657,12 +2800,11 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
         failf(data, "Failed sending POST request");
       else
         /* setup variables for the upcoming transfer */
-        Curl_setup_transfer(conn, FIRSTSOCKET, -1, TRUE, &http->readbytecount,
-                            -1, NULL);
+        Curl_setup_transfer(data, FIRSTSOCKET, -1, TRUE, -1);
       break;
     }
 
-    postsize = http->postsize;
+    data->state.infilesize = postsize = http->postsize;
 
     /* We only set Content-Length and allow a custom Content-Length if
        we don't upload data chunked, as RFC2616 forbids us to set both
@@ -2678,6 +2820,7 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
         return result;
     }
 
+#ifndef CURL_DISABLE_MIME
     /* Output mime-generated headers. */
     {
       struct curl_slist *hdr;
@@ -2688,6 +2831,7 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
           return result;
       }
     }
+#endif
 
     /* For really small posts we don't use Expect: headers at all, and for
        the somewhat bigger ones we allow the app to disable it. Just make
@@ -2726,9 +2870,8 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
       failf(data, "Failed sending POST request");
     else
       /* prepare for transfer */
-      Curl_setup_transfer(conn, FIRSTSOCKET, -1, TRUE,
-                          &http->readbytecount, postsize?FIRSTSOCKET:-1,
-                          postsize?&http->writebytecount:NULL);
+      Curl_setup_transfer(data, FIRSTSOCKET, -1, TRUE,
+                          postsize?FIRSTSOCKET:-1);
     if(result)
       return result;
 
@@ -2882,9 +3025,8 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
     if(result)
       failf(data, "Failed sending HTTP POST request");
     else
-      Curl_setup_transfer(conn, FIRSTSOCKET, -1, TRUE,
-                          &http->readbytecount, http->postdata?FIRSTSOCKET:-1,
-                          http->postdata?&http->writebytecount:NULL);
+      Curl_setup_transfer(data, FIRSTSOCKET, -1, TRUE,
+                          http->postdata?FIRSTSOCKET:-1);
     break;
 
   default:
@@ -2900,33 +3042,29 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
       failf(data, "Failed sending HTTP request");
     else
       /* HTTP GET/HEAD download: */
-      Curl_setup_transfer(conn, FIRSTSOCKET, -1, TRUE, &http->readbytecount,
-                          http->postdata?FIRSTSOCKET:-1,
-                          http->postdata?&http->writebytecount:NULL);
+      Curl_setup_transfer(data, FIRSTSOCKET, -1, TRUE, -1);
   }
   if(result)
     return result;
 
-  if(http->writebytecount) {
+  if(data->req.writebytecount) {
     /* if a request-body has been sent off, we make sure this progress is noted
        properly */
-    Curl_pgrsSetUploadCounter(data, http->writebytecount);
+    Curl_pgrsSetUploadCounter(data, data->req.writebytecount);
     if(Curl_pgrsUpdate(conn))
       result = CURLE_ABORTED_BY_CALLBACK;
 
-    if(http->writebytecount >= postsize) {
+    if(data->req.writebytecount >= postsize) {
       /* already sent the entire request body, mark the "upload" as
          complete */
       infof(data, "upload completely sent off: %" CURL_FORMAT_CURL_OFF_T
             " out of %" CURL_FORMAT_CURL_OFF_T " bytes\n",
-            http->writebytecount, postsize);
+            data->req.writebytecount, postsize);
       data->req.upload_done = TRUE;
       data->req.keepon &= ~KEEP_SEND; /* we're done writing */
       data->req.exp100 = EXP100_SEND_DATA; /* already sent */
       Curl_expire_done(data, EXPIRE_100_TIMEOUT);
     }
-    else
-      data->req.writebytecount = http->writebytecount;
   }
 
   if((conn->httpversion == 20) && data->req.upload_chunky)
@@ -3050,6 +3188,9 @@ static CURLcode header_append(struct Curl_easy *data,
                               struct SingleRequest *k,
                               size_t length)
 {
+  /* length is at most the size of a full read buffer, for which the upper
+     bound is CURL_MAX_READ_SIZE. There is thus no chance of overflow in this
+     calculation. */
   size_t newsize = k->hbuflen + length;
   if(newsize > CURL_MAX_HTTP_HEADER) {
     /* The reason to have a max limit for this is to avoid the risk of a bad
@@ -3161,6 +3302,10 @@ CURLcode Curl_http_readwrite_headers(struct Curl_easy *data,
           k->header = FALSE;
           k->badheader = HEADER_ALLBAD;
           streamclose(conn, "bad HTTP: No end-of-message indicator");
+          if(!data->set.http09_allowed) {
+            failf(data, "Received HTTP/0.9 when not allowed\n");
+            return CURLE_UNSUPPORTED_PROTOCOL;
+          }
           break;
         }
       }
@@ -3194,6 +3339,10 @@ CURLcode Curl_http_readwrite_headers(struct Curl_easy *data,
       if(st == STATUS_BAD) {
         streamclose(conn, "bad HTTP: No end-of-message indicator");
         /* this is not the beginning of a protocol first header line */
+        if(!data->set.http09_allowed) {
+          failf(data, "Received HTTP/0.9 when not allowed\n");
+          return CURLE_UNSUPPORTED_PROTOCOL;
+        }
         k->header = FALSE;
         if(*nread)
           /* since there's more, this is a partial bad header */
@@ -3306,14 +3455,31 @@ CURLcode Curl_http_readwrite_headers(struct Curl_easy *data,
 #if defined(USE_NTLM)
       if(conn->bits.close &&
          (((data->req.httpcode == 401) &&
-           (conn->ntlm.state == NTLMSTATE_TYPE2)) ||
+           (conn->http_ntlm_state == NTLMSTATE_TYPE2)) ||
           ((data->req.httpcode == 407) &&
-           (conn->proxyntlm.state == NTLMSTATE_TYPE2)))) {
+           (conn->proxy_ntlm_state == NTLMSTATE_TYPE2)))) {
         infof(data, "Connection closure while negotiating auth (HTTP 1.0?)\n");
         data->state.authproblem = TRUE;
       }
 #endif
-
+#if defined(USE_SPNEGO)
+      if(conn->bits.close &&
+        (((data->req.httpcode == 401) &&
+          (conn->http_negotiate_state == GSS_AUTHRECV)) ||
+         ((data->req.httpcode == 407) &&
+          (conn->proxy_negotiate_state == GSS_AUTHRECV)))) {
+        infof(data, "Connection closure while negotiating auth (HTTP 1.0?)\n");
+        data->state.authproblem = TRUE;
+      }
+      if((conn->http_negotiate_state == GSS_AUTHDONE) &&
+         (data->req.httpcode != 401)) {
+        conn->http_negotiate_state = GSS_AUTHSUCC;
+      }
+      if((conn->proxy_negotiate_state == GSS_AUTHDONE) &&
+         (data->req.httpcode != 407)) {
+        conn->proxy_negotiate_state = GSS_AUTHSUCC;
+      }
+#endif
       /*
        * When all the headers have been parsed, see if we should give
        * up and return an error.
@@ -3389,8 +3555,10 @@ CURLcode Curl_http_readwrite_headers(struct Curl_easy *data,
               else {
                 infof(data, "HTTP error before end of send, stop sending\n");
                 streamclose(conn, "Stop sending data before everything sent");
+                result = Curl_done_sending(conn, k);
+                if(result)
+                  return result;
                 k->upload_done = TRUE;
-                k->keepon &= ~KEEP_SEND; /* don't send */
                 if(data->state.expect100header)
                   k->exp100 = EXP100_FAILED;
               }
@@ -3527,6 +3695,7 @@ CURLcode Curl_http_readwrite_headers(struct Curl_easy *data,
          * guarantees on future behaviors since it isn't within the protocol.
          */
         char separator;
+        char twoorthree[2];
         nc = sscanf(HEADER1,
                     " HTTP/%1d.%1d%c%3d",
                     &httpversion_major,
@@ -3534,8 +3703,8 @@ CURLcode Curl_http_readwrite_headers(struct Curl_easy *data,
                     &separator,
                     &k->httpcode);
 
-        if(nc == 1 && httpversion_major == 2 &&
-           1 == sscanf(HEADER1, " HTTP/2 %d", &k->httpcode)) {
+        if(nc == 1 && httpversion_major >= 2 &&
+           2 == sscanf(HEADER1, " HTTP/%1[23] %d", twoorthree, &k->httpcode)) {
           conn->httpversion = 0;
           nc = 4;
           separator = ' ';
@@ -3549,6 +3718,10 @@ CURLcode Curl_http_readwrite_headers(struct Curl_easy *data,
             if(conn->httpversion != 20)
               infof(data, "Lying server, not serving HTTP/2\n");
           }
+          if(conn->httpversion < 20) {
+            conn->bundle->multiuse = BUNDLE_NO_MULTIUSE;
+            infof(data, "Mark bundle as not supporting multiuse\n");
+          }
         }
         else if(!nc) {
           /* this is the real world, not a Nirvana
@@ -3569,7 +3742,7 @@ CURLcode Curl_http_readwrite_headers(struct Curl_easy *data,
           }
         }
         else {
-          failf(data, "Unsupported HTTP version in response\n");
+          failf(data, "Unsupported HTTP version in response");
           return CURLE_UNSUPPORTED_PROTOCOL;
         }
       }
@@ -3586,7 +3759,6 @@ CURLcode Curl_http_readwrite_headers(struct Curl_easy *data,
           conn->httpversion = 11; /* For us, RTSP acts like HTTP 1.1 */
         }
         else {
-          /* TODO: do we care about the other cases here? */
           nc = 0;
         }
       }
@@ -3639,26 +3811,13 @@ CURLcode Curl_http_readwrite_headers(struct Curl_easy *data,
         }
         else if(conn->httpversion >= 11 &&
                 !conn->bits.close) {
-          /* If HTTP version is >= 1.1 and connection is persistent
-             server supports pipelining. */
+          /* If HTTP version is >= 1.1 and connection is persistent */
           DEBUGF(infof(data,
-                       "HTTP 1.1 or later with persistent connection, "
-                       "pipelining supported\n"));
-          /* Activate pipelining if needed */
-          if(conn->bundle) {
-            if(!Curl_pipeline_site_blacklisted(data, conn))
-              conn->bundle->multiuse = BUNDLE_PIPELINING;
-          }
+                       "HTTP 1.1 or later with persistent connection\n"));
         }
 
+        k->http_bodyless = k->httpcode >= 100 && k->httpcode < 200;
         switch(k->httpcode) {
-        case 204:
-          /* (quote from RFC2616, section 10.2.5): The server has
-           * fulfilled the request but does not need to return an
-           * entity-body ... The 204 response MUST NOT include a
-           * message-body, and thus is always terminated by the first
-           * empty line after the header fields. */
-          /* FALLTHROUGH */
         case 304:
           /* (quote from RFC2616, section 10.3.5): The 304 response
            * MUST NOT contain a message-body, and thus is always
@@ -3666,12 +3825,18 @@ CURLcode Curl_http_readwrite_headers(struct Curl_easy *data,
            * fields.  */
           if(data->set.timecondition)
             data->info.timecond = TRUE;
+          /* FALLTHROUGH */
+        case 204:
+          /* (quote from RFC2616, section 10.2.5): The server has
+           * fulfilled the request but does not need to return an
+           * entity-body ... The 204 response MUST NOT include a
+           * message-body, and thus is always terminated by the first
+           * empty line after the header fields. */
           k->size = 0;
           k->maxdownload = 0;
-          k->ignorecl = TRUE; /* ignore Content-Length headers */
+          k->http_bodyless = TRUE;
           break;
         default:
-          /* nothing */
           break;
         }
       }
@@ -3687,8 +3852,8 @@ CURLcode Curl_http_readwrite_headers(struct Curl_easy *data,
       return result;
 
     /* Check for Content-Length: header lines to get size */
-    if(!k->ignorecl && !data->set.ignorecl &&
-       checkprefix("Content-Length:", k->p)) {
+    if(!k->http_bodyless &&
+       !data->set.ignorecl && checkprefix("Content-Length:", k->p)) {
       curl_off_t contentlength;
       CURLofft offt = curlx_strtoofft(k->p + 15, NULL, 10, &contentlength);
 
@@ -3733,19 +3898,6 @@ CURLcode Curl_http_readwrite_headers(struct Curl_easy *data,
         data->info.contenttype = contenttype;
       }
     }
-    else if(checkprefix("Server:", k->p)) {
-      if(conn->httpversion < 20) {
-        /* only do this for non-h2 servers */
-        char *server_name = Curl_copy_header_value(k->p);
-
-        /* Turn off pipelining if the server version is blacklisted  */
-        if(conn->bundle && (conn->bundle->multiuse == BUNDLE_PIPELINING)) {
-          if(Curl_pipeline_server_blacklisted(data, server_name))
-            conn->bundle->multiuse = BUNDLE_NO_MULTIUSE;
-        }
-        free(server_name);
-      }
-    }
     else if((conn->httpversion == 10) &&
             conn->bits.httpproxy &&
             Curl_compareheader(k->p,
@@ -3790,7 +3942,7 @@ CURLcode Curl_http_readwrite_headers(struct Curl_easy *data,
        */
       streamclose(conn, "Connection: close used");
     }
-    else if(checkprefix("Transfer-Encoding:", k->p)) {
+    else if(!k->http_bodyless && checkprefix("Transfer-Encoding:", k->p)) {
       /* One or more encodings. We check for chunked and/or a compression
          algorithm. */
       /*
@@ -3806,7 +3958,7 @@ CURLcode Curl_http_readwrite_headers(struct Curl_easy *data,
       if(result)
         return result;
     }
-    else if(checkprefix("Content-Encoding:", k->p) &&
+    else if(!k->http_bodyless && checkprefix("Content-Encoding:", k->p) &&
             data->set.str[STRING_ENCODING]) {
       /*
        * Process Content-Encoding. Look for the values: identity,
@@ -3819,7 +3971,20 @@ CURLcode Curl_http_readwrite_headers(struct Curl_easy *data,
       if(result)
         return result;
     }
-    else if(checkprefix("Content-Range:", k->p)) {
+    else if(checkprefix("Retry-After:", k->p)) {
+      /* Retry-After = HTTP-date / delay-seconds */
+      curl_off_t retry_after = 0; /* zero for unknown or "now" */
+      time_t date = Curl_getdate_capped(&k->p[12]);
+      if(-1 == date) {
+        /* not a date, try it as a decimal number */
+        (void)curlx_strtoofft(&k->p[12], NULL, 10, &retry_after);
+      }
+      else
+        /* convert date to number of seconds into the future */
+        retry_after = date - time(NULL);
+      data->info.retry_after = retry_after; /* store it */
+    }
+    else if(!k->http_bodyless && checkprefix("Content-Range:", k->p)) {
       /* Content-Range: bytes [num]-
          Content-Range: bytes: [num]-
          Content-Range: [num]-
@@ -3849,7 +4014,7 @@ CURLcode Curl_http_readwrite_headers(struct Curl_easy *data,
         data->state.resume_from = 0; /* get everything */
     }
 #if !defined(CURL_DISABLE_COOKIES)
-    else if(data->cookies &&
+    else if(data->cookies && data->state.cookie_engine &&
             checkprefix("Set-Cookie:", k->p)) {
       Curl_share_lock(data, CURL_LOCK_DATA_COOKIE,
                       CURL_LOCK_ACCESS_SINGLE);
@@ -3859,15 +4024,15 @@ CURLcode Curl_http_readwrite_headers(struct Curl_easy *data,
                          here, or else use real peer host name. */
                       conn->allocptr.cookiehost?
                       conn->allocptr.cookiehost:conn->host.name,
-                      data->state.up.path);
+                      data->state.up.path,
+                      (conn->handler->protocol&CURLPROTO_HTTPS)?
+                      TRUE:FALSE);
       Curl_share_unlock(data, CURL_LOCK_DATA_COOKIE);
     }
 #endif
-    else if(checkprefix("Last-Modified:", k->p) &&
+    else if(!k->http_bodyless && checkprefix("Last-Modified:", k->p) &&
             (data->set.timecondition || data->set.get_filetime) ) {
-      time_t secs = time(NULL);
-      k->timeofdoc = curl_getdate(k->p + strlen("Last-Modified:"),
-                                  &secs);
+      k->timeofdoc = Curl_getdate_capped(k->p + strlen("Last-Modified:"));
       if(data->set.get_filetime)
         data->info.filetime = k->timeofdoc;
     }
@@ -3888,6 +4053,23 @@ CURLcode Curl_http_readwrite_headers(struct Curl_easy *data,
       if(result)
         return result;
     }
+#ifdef USE_SPNEGO
+    else if(checkprefix("Persistent-Auth", k->p)) {
+      struct negotiatedata *negdata = &conn->negotiate;
+      struct auth *authp = &data->state.authhost;
+      if(authp->picked == CURLAUTH_NEGOTIATE) {
+        char *persistentauth = Curl_copy_header_value(k->p);
+        if(!persistentauth)
+          return CURLE_OUT_OF_MEMORY;
+        negdata->noauthpersist = checkprefix("false", persistentauth)?
+          TRUE:FALSE;
+        negdata->havenoauthpersist = TRUE;
+        infof(data, "Negotiate: noauthpersist -> %d, header part: %s",
+          negdata->noauthpersist, persistentauth);
+        free(persistentauth);
+      }
+    }
+#endif
     else if((k->httpcode >= 300 && k->httpcode < 400) &&
             checkprefix("Location:", k->p) &&
             !data->req.location) {
@@ -3915,6 +4097,27 @@ CURLcode Curl_http_readwrite_headers(struct Curl_easy *data,
         }
       }
     }
+#ifdef USE_ALTSVC
+    /* If enabled, the header is incoming and this is over HTTPS */
+    else if(data->asi && checkprefix("Alt-Svc:", k->p) &&
+            ((conn->handler->flags & PROTOPT_SSL) ||
+#ifdef CURLDEBUG
+             /* allow debug builds to circumvent the HTTPS restriction */
+             getenv("CURL_ALTSVC_HTTP")
+#else
+             0
+#endif
+              )) {
+      /* the ALPN of the current request */
+      enum alpnid id = (conn->httpversion == 20) ? ALPN_h2 : ALPN_h1;
+      result = Curl_altsvc_parse(data, data->asi,
+                                 &k->p[ strlen("Alt-Svc:") ],
+                                 id, conn->host.name,
+                                 curlx_uitous(conn->remote_port));
+      if(result)
+        return result;
+    }
+#endif
     else if(conn->handler->protocol & CURLPROTO_RTSP) {
       result = Curl_rtsp_parseheader(conn, k->p);
       if(result)
index 21fa701..70d5dcc 100644 (file)
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -65,33 +65,28 @@ CURLcode Curl_add_buffer(Curl_send_buffer **inp, const void *inptr,
                          size_t size) WARN_UNUSED_RESULT;
 CURLcode Curl_add_buffer_send(Curl_send_buffer **inp,
                               struct connectdata *conn,
-                              long *bytes_written,
+                              curl_off_t *bytes_written,
                               size_t included_body_bytes,
                               int socketindex);
 
-CURLcode Curl_add_timecondition(struct Curl_easy *data,
+CURLcode Curl_add_timecondition(const struct connectdata *conn,
                                 Curl_send_buffer *buf);
 CURLcode Curl_add_custom_headers(struct connectdata *conn,
                                  bool is_connect,
                                  Curl_send_buffer *req_buffer);
+CURLcode Curl_http_compile_trailers(struct curl_slist *trailers,
+                                    Curl_send_buffer **buffer,
+                                    struct Curl_easy *handle);
 
 /* protocol-specific functions set up to be called by the main engine */
 CURLcode Curl_http(struct connectdata *conn, bool *done);
 CURLcode Curl_http_done(struct connectdata *, CURLcode, bool premature);
 CURLcode Curl_http_connect(struct connectdata *conn, bool *done);
-CURLcode Curl_http_setup_conn(struct connectdata *conn);
-
-/* The following functions are defined in http_chunks.c */
-void Curl_httpchunk_init(struct connectdata *conn);
-CHUNKcode Curl_httpchunk_read(struct connectdata *conn, char *datap,
-                              ssize_t length, ssize_t *wrote);
 
 /* These functions are in http.c */
-void Curl_http_auth_stage(struct Curl_easy *data, int stage);
 CURLcode Curl_http_input_auth(struct connectdata *conn, bool proxy,
                               const char *auth);
 CURLcode Curl_http_auth_act(struct connectdata *conn);
-CURLcode Curl_http_perhapsrewind(struct connectdata *conn);
 
 /* If only the PICKNONE bit is set, there has been a round-trip and we
    selected to use no auth at all. Ie, we actively select no auth, as opposed
@@ -126,6 +121,10 @@ CURLcode Curl_http_perhapsrewind(struct connectdata *conn);
 
 #endif /* CURL_DISABLE_HTTP */
 
+#ifdef USE_NGHTTP3
+struct h3out; /* see ngtcp2 */
+#endif
+
 /****************************************************************************
  * HTTP unique setup
  ***************************************************************************/
@@ -136,8 +135,6 @@ struct HTTP {
 
   const char *p_pragma;      /* Pragma: string */
   const char *p_accept;      /* Accept: string */
-  curl_off_t readbytecount;
-  curl_off_t writebytecount;
 
   /* For FORM posting */
   curl_mimepart form;
@@ -174,19 +171,39 @@ struct HTTP {
   int status_code; /* HTTP status code */
   const uint8_t *pausedata; /* pointer to data received in on_data_chunk */
   size_t pauselen; /* the number of bytes left in data */
-  bool closed; /* TRUE on HTTP2 stream close */
   bool close_handled; /* TRUE if stream closure is handled by libcurl */
+
+  char **push_headers;       /* allocated array */
+  size_t push_headers_used;  /* number of entries filled in */
+  size_t push_headers_alloc; /* number of entries allocated */
+#endif
+#if defined(USE_NGHTTP2) || defined(USE_NGHTTP3)
+  bool closed; /* TRUE on HTTP2 stream close */
   char *mem;     /* points to a buffer in memory to store received data */
   size_t len;    /* size of the buffer 'mem' points to */
   size_t memlen; /* size of data copied to mem */
-
+#endif
+#if defined(USE_NGHTTP2) || defined(ENABLE_QUIC)
+  /* fields used by both HTTP/2 and HTTP/3 */
   const uint8_t *upload_mem; /* points to a buffer to read from */
   size_t upload_len; /* size of the buffer 'upload_mem' points to */
   curl_off_t upload_left; /* number of bytes left to upload */
+#endif
 
-  char **push_headers;       /* allocated array */
-  size_t push_headers_used;  /* number of entries filled in */
-  size_t push_headers_alloc; /* number of entries allocated */
+#ifdef ENABLE_QUIC
+  /*********** for HTTP/3 we store stream-local data here *************/
+  int64_t stream3_id; /* stream we are interested in */
+  bool firstheader;  /* FALSE until headers arrive */
+  bool firstbody;  /* FALSE until body arrives */
+  bool h3req;    /* FALSE until request is issued */
+  bool upload_done;
+#endif
+#ifdef USE_NGHTTP3
+  size_t unacked_window;
+  struct h3out *h3out; /* per-stream buffers for upload */
+  char *overflow_buf; /* excess data received during a single Curl_read */
+  size_t overflow_buflen; /* amount of data currently in overflow_buf */
+  size_t overflow_bufsize; /* size of the overflow_buf allocation */
 #endif
 };
 
index 0c5f6db..65f3513 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -68,7 +68,7 @@
 #ifdef DEBUG_HTTP2
 #define H2BUGF(x) x
 #else
-#define H2BUGF(x) do { } WHILE_FALSE
+#define H2BUGF(x) do { } while(0)
 #endif
 
 
@@ -100,19 +100,12 @@ void Curl_http2_init_userset(struct UserDefined *set)
 }
 
 static int http2_perform_getsock(const struct connectdata *conn,
-                                 curl_socket_t *sock, /* points to
-                                                         numsocks
-                                                         number of
-                                                         sockets */
-                                 int numsocks)
+                                 curl_socket_t *sock)
 {
   const struct http_conn *c = &conn->proto.httpc;
   struct SingleRequest *k = &conn->data->req;
   int bitmap = GETSOCK_BLANK;
-  (void)numsocks;
 
-  /* TODO We should check underlying socket state if it is SSL socket
-     because of renegotiation. */
   sock[0] = conn->sock[FIRSTSOCKET];
 
   /* in a HTTP/2 connection we can basically always get a frame so we should
@@ -128,11 +121,9 @@ static int http2_perform_getsock(const struct connectdata *conn,
 }
 
 static int http2_getsock(struct connectdata *conn,
-                         curl_socket_t *sock, /* points to numsocks
-                                                 number of sockets */
-                         int numsocks)
+                         curl_socket_t *socks)
 {
-  return http2_perform_getsock(conn, sock, numsocks);
+  return http2_perform_getsock(conn, socks);
 }
 
 /*
@@ -242,7 +233,7 @@ static unsigned int http2_conncheck(struct connectdata *check,
 
   if(checks_to_perform & CONNCHECK_KEEPALIVE) {
     struct curltime now = Curl_now();
-    time_t elapsed = Curl_timediff(now, check->keepalive);
+    timediff_t elapsed = Curl_timediff(now, check->keepalive);
 
     if(elapsed > check->upkeep_interval_ms) {
       /* Perform an HTTP/2 PING */
@@ -271,7 +262,7 @@ static unsigned int http2_conncheck(struct connectdata *check,
   return ret_val;
 }
 
-/* called from Curl_http_setup_conn */
+/* called from http_setup_conn */
 void Curl_http2_setup_req(struct Curl_easy *data)
 {
   struct HTTP *http = data->req.protop;
@@ -288,7 +279,7 @@ void Curl_http2_setup_req(struct Curl_easy *data)
   http->memlen = 0;
 }
 
-/* called from Curl_http_setup_conn */
+/* called from http_setup_conn */
 void Curl_http2_setup_conn(struct connectdata *conn)
 {
   conn->proto.httpc.settings.max_concurrent_streams =
@@ -350,14 +341,14 @@ static const struct Curl_handler Curl_handler_http2_ssl = {
 int Curl_http2_ver(char *p, size_t len)
 {
   nghttp2_info *h2 = nghttp2_version(0);
-  return snprintf(p, len, " nghttp2/%s", h2->version_str);
+  return msnprintf(p, len, " nghttp2/%s", h2->version_str);
 }
 
 /* HTTP/2 error code to name based on the Error Code Registry.
 https://tools.ietf.org/html/rfc7540#page-77
 nghttp2_error_code enums are identical.
 */
-const char *Curl_http2_strerror(uint32_t err)
+static const char *http2_strerror(uint32_t err)
 {
 #ifndef NGHTTP2_HAS_HTTP2_STRERROR
   const char *str[] = {
@@ -505,16 +496,14 @@ static struct Curl_easy *duphandle(struct Curl_easy *data)
     /* setup the request struct */
     struct HTTP *http = calloc(1, sizeof(struct HTTP));
     if(!http) {
-      (void)Curl_close(second);
-      second = NULL;
+      (void)Curl_close(&second);
     }
     else {
       second->req.protop = http;
       http->header_recvbuf = Curl_add_buffer_init();
       if(!http->header_recvbuf) {
         free(http);
-        (void)Curl_close(second);
-        second = NULL;
+        (void)Curl_close(&second);
       }
       else {
         Curl_http2_setup_req(second);
@@ -556,7 +545,7 @@ static int push_promise(struct Curl_easy *data,
     stream = data->req.protop;
     if(!stream) {
       failf(data, "Internal NULL stream!\n");
-      (void)Curl_close(newhandle);
+      (void)Curl_close(&newhandle);
       rv = 1;
       goto fail;
     }
@@ -578,7 +567,7 @@ static int push_promise(struct Curl_easy *data,
       /* denied, kill off the new handle again */
       http2_stream_free(newhandle->req.protop);
       newhandle->req.protop = NULL;
-      (void)Curl_close(newhandle);
+      (void)Curl_close(&newhandle);
       goto fail;
     }
 
@@ -594,7 +583,7 @@ static int push_promise(struct Curl_easy *data,
       infof(data, "failed to add handle to multi\n");
       http2_stream_free(newhandle->req.protop);
       newhandle->req.protop = NULL;
-      Curl_close(newhandle);
+      Curl_close(&newhandle);
       rv = 1;
       goto fail;
     }
@@ -618,6 +607,18 @@ static int push_promise(struct Curl_easy *data,
   return rv;
 }
 
+/*
+ * multi_connchanged() is called to tell that there is a connection in
+ * this multi handle that has changed state (multiplexing become possible, the
+ * number of allowed streams changed or similar), and a subsequent use of this
+ * multi handle should move CONNECT_PEND handles back to CONNECT to have them
+ * retry.
+ */
+static void multi_connchanged(struct Curl_multi *multi)
+{
+  multi->recheckstate = TRUE;
+}
+
 static int on_frame_recv(nghttp2_session *session, const nghttp2_frame *frame,
                          void *userp)
 {
@@ -650,7 +651,7 @@ static int on_frame_recv(nghttp2_session *session, const nghttp2_frame *frame,
         infof(conn->data,
               "Connection state changed (MAX_CONCURRENT_STREAMS == %u)!\n",
               httpc->settings.max_concurrent_streams);
-        Curl_multi_connchanged(conn->data->multi);
+        multi_connchanged(conn->data->multi);
       }
     }
     return 0;
@@ -800,7 +801,7 @@ static int on_data_chunk_recv(nghttp2_session *session, uint8_t flags,
     H2BUGF(infof(data_s, "NGHTTP2_ERR_PAUSE - %zu bytes out of buffer"
                  ", stream %u\n",
                  len - nread, stream_id));
-    data_s->easy_conn->proto.httpc.pause_stream_id = stream_id;
+    data_s->conn->proto.httpc.pause_stream_id = stream_id;
 
     return NGHTTP2_ERR_PAUSE;
   }
@@ -808,7 +809,7 @@ static int on_data_chunk_recv(nghttp2_session *session, uint8_t flags,
   /* pause execution of nghttp2 if we received data for another handle
      in order to process them first. */
   if(conn->data != data_s) {
-    data_s->easy_conn->proto.httpc.pause_stream_id = stream_id;
+    data_s->conn->proto.httpc.pause_stream_id = stream_id;
 
     return NGHTTP2_ERR_PAUSE;
   }
@@ -837,7 +838,7 @@ static int on_stream_close(nghttp2_session *session, int32_t stream_id,
       return 0;
     }
     H2BUGF(infof(data_s, "on_stream_close(), %s (err %d), stream %u\n",
-                 Curl_http2_strerror(error_code), error_code, stream_id));
+                 http2_strerror(error_code), error_code, stream_id));
     stream = data_s->req.protop;
     if(!stream)
       return NGHTTP2_ERR_CALLBACK_FAILURE;
@@ -845,6 +846,7 @@ static int on_stream_close(nghttp2_session *session, int32_t stream_id,
     stream->closed = TRUE;
     httpc = &conn->proto.httpc;
     drain_this(data_s, httpc);
+    Curl_expire(data_s, 0, EXPIRE_RUN_NOW);
     httpc->error_code = error_code;
 
     /* remove the entry from the hash as the stream is now gone */
@@ -854,6 +856,10 @@ static int on_stream_close(nghttp2_session *session, int32_t stream_id,
             stream_id);
       DEBUGASSERT(0);
     }
+    if(stream_id == httpc->pause_stream_id) {
+      H2BUGF(infof(data_s, "Stopped the pause stream!\n"));
+      httpc->pause_stream_id = 0;
+    }
     H2BUGF(infof(data_s, "Removed stream %u hash!\n", stream_id));
     stream->stream_id = 0; /* cleared */
   }
@@ -953,6 +959,30 @@ static int on_header(nghttp2_session *session, const nghttp2_frame *frame,
   if(frame->hd.type == NGHTTP2_PUSH_PROMISE) {
     char *h;
 
+    if(!strcmp(":authority", (const char *)name)) {
+      /* pseudo headers are lower case */
+      int rc = 0;
+      char *check = aprintf("%s:%d", conn->host.name, conn->remote_port);
+      if(!check)
+        /* no memory */
+        return NGHTTP2_ERR_CALLBACK_FAILURE;
+      if(!Curl_strcasecompare(check, (const char *)value) &&
+         ((conn->remote_port != conn->given->defport) ||
+          !Curl_strcasecompare(conn->host.name, (const char *)value))) {
+        /* This is push is not for the same authority that was asked for in
+         * the URL. RFC 7540 section 8.2 says: "A client MUST treat a
+         * PUSH_PROMISE for which the server is not authoritative as a stream
+         * error of type PROTOCOL_ERROR."
+         */
+        (void)nghttp2_submit_rst_stream(session, NGHTTP2_FLAG_NONE,
+                                        stream_id, NGHTTP2_PROTOCOL_ERROR);
+        rc = NGHTTP2_ERR_CALLBACK_FAILURE;
+      }
+      free(check);
+      if(rc)
+        return rc;
+    }
+
     if(!stream->push_headers) {
       stream->push_headers_alloc = 10;
       stream->push_headers = malloc(stream->push_headers_alloc *
@@ -1128,7 +1158,7 @@ static void populate_settings(struct connectdata *conn,
   nghttp2_settings_entry *iv = httpc->local_settings;
 
   iv[0].settings_id = NGHTTP2_SETTINGS_MAX_CONCURRENT_STREAMS;
-  iv[0].value = 100;
+  iv[0].value = (uint32_t)Curl_multi_max_concurrent_streams(conn->data->multi);
 
   iv[1].settings_id = NGHTTP2_SETTINGS_INITIAL_WINDOW_SIZE;
   iv[1].value = HTTP2_HUGE_WINDOW_SIZE;
@@ -1139,11 +1169,10 @@ static void populate_settings(struct connectdata *conn,
   httpc->local_settings_num = 3;
 }
 
-void Curl_http2_done(struct connectdata *conn, bool premature)
+void Curl_http2_done(struct Curl_easy *data, bool premature)
 {
-  struct Curl_easy *data = conn->data;
   struct HTTP *http = data->req.protop;
-  struct http_conn *httpc = &conn->proto.httpc;
+  struct http_conn *httpc = &data->conn->proto.httpc;
 
   /* there might be allocated resources done before this got the 'h2' pointer
      setup */
@@ -1163,9 +1192,6 @@ void Curl_http2_done(struct connectdata *conn, bool premature)
   if(!httpc->h2) /* not HTTP/2 ? */
     return;
 
-  if(data->state.drain)
-    drained_transfer(data, httpc);
-
   if(premature) {
     /* RST_STREAM */
     if(!nghttp2_submit_rst_stream(httpc->h2, NGHTTP2_FLAG_NONE,
@@ -1177,6 +1203,10 @@ void Curl_http2_done(struct connectdata *conn, bool premature)
       httpc->pause_stream_id = 0;
     }
   }
+
+  if(data->state.drain)
+    drained_transfer(data, httpc);
+
   /* -1 means unassigned and 0 means cleared */
   if(http->stream_id > 0) {
     int rv = nghttp2_session_set_stream_user_data(httpc->h2,
@@ -1193,7 +1223,7 @@ void Curl_http2_done(struct connectdata *conn, bool premature)
 /*
  * Initialize nghttp2 for a Curl connection
  */
-CURLcode Curl_http2_init(struct connectdata *conn)
+static CURLcode http2_init(struct connectdata *conn)
 {
   if(!conn->proto.httpc.h2) {
     int rc;
@@ -1427,7 +1457,7 @@ static ssize_t http2_handle_stream_close(struct connectdata *conn,
   }
   else if(httpc->error_code != NGHTTP2_NO_ERROR) {
     failf(data, "HTTP/2 stream %d was not closed cleanly: %s (err %u)",
-          stream->stream_id, Curl_http2_strerror(httpc->error_code),
+          stream->stream_id, http2_strerror(httpc->error_code),
           httpc->error_code);
     *err = CURLE_HTTP2_STREAM;
     return -1;
@@ -1505,6 +1535,7 @@ static int h2_session_send(struct Curl_easy *data,
 
     H2BUGF(infof(data, "Queuing PRIORITY on stream %u (easy %p)\n",
                  stream->stream_id, data));
+    DEBUGASSERT(stream->stream_id != -1);
     rv = nghttp2_submit_priority(h2, NGHTTP2_FLAG_NONE, stream->stream_id,
                                  &pri_spec);
     if(rv)
@@ -1529,6 +1560,11 @@ static ssize_t http2_recv(struct connectdata *conn, int sockindex,
   if(should_close_session(httpc)) {
     H2BUGF(infof(data,
                  "http2_recv: nothing to do in this session\n"));
+    if(conn->bits.close) {
+      /* already marked for closure, return OK and we're done */
+      *err = CURLE_OK;
+      return 0;
+    }
     *err = CURLE_HTTP2;
     return -1;
   }
@@ -1624,6 +1660,9 @@ static ssize_t http2_recv(struct connectdata *conn, int sockindex,
        socket is not read.  But it seems that usually streams are
        notified with its drain property, and socket is read again
        quickly. */
+    if(stream->closed)
+      /* closed overrides paused */
+      return 0;
     H2BUGF(infof(data, "stream %x is paused, pause id: %x\n",
                  stream->stream_id, httpc->pause_stream_id));
     *err = CURLE_AGAIN;
@@ -1718,14 +1757,16 @@ static ssize_t http2_recv(struct connectdata *conn, int sockindex,
     else if(!stream->closed) {
       drained_transfer(data, httpc);
     }
+    else
+      /* this stream is closed, trigger a another read ASAP to detect that */
+      Curl_expire(data, 0, EXPIRE_RUN_NOW);
 
     return retlen;
   }
-  /* If stream is closed, return 0 to signal the http routine to close
+  /* If this stream is closed, return 0 to signal the http routine to close
      the connection */
-  if(stream->closed) {
-    return http2_handle_stream_close(conn, data, stream, err);
-  }
+  if(stream->closed)
+    return 0;
   *err = CURLE_AGAIN;
   H2BUGF(infof(data, "http2_recv returns AGAIN for stream %u\n",
                stream->stream_id));
@@ -1736,8 +1777,9 @@ static ssize_t http2_recv(struct connectdata *conn, int sockindex,
    field list. */
 #define AUTHORITY_DST_IDX 3
 
+/* USHRT_MAX is 65535 == 0xffff */
 #define HEADER_OVERFLOW(x) \
-  (x.namelen > (uint16_t)-1 || x.valuelen > (uint16_t)-1 - x.namelen)
+  (x.namelen > 0xffff || x.valuelen > 0xffff - x.namelen)
 
 /*
  * Check header memory for the token "trailers".
@@ -1809,9 +1851,9 @@ static ssize_t http2_send(struct connectdata *conn, int sockindex,
                           const void *mem, size_t len, CURLcode *err)
 {
   /*
-   * BIG TODO: Currently, we send request in this function, but this
-   * function is also used to send request body. It would be nice to
-   * add dedicated function for request.
+   * Currently, we send request in this function, but this function is also
+   * used to send request body. It would be nice to add dedicated function for
+   * request.
    */
   int rv;
   struct http_conn *httpc = &conn->proto.httpc;
@@ -1844,7 +1886,11 @@ static ssize_t http2_send(struct connectdata *conn, int sockindex,
        are going to send or sending request body in DATA frame */
     stream->upload_mem = mem;
     stream->upload_len = len;
-    nghttp2_session_resume_data(h2, stream->stream_id);
+    rv = nghttp2_session_resume_data(h2, stream->stream_id);
+    if(nghttp2_is_fatal(rv)) {
+      *err = CURLE_SEND_ERROR;
+      return -1;
+    }
     rv = h2_session_send(conn->data, h2);
     if(nghttp2_is_fatal(rv)) {
       *err = CURLE_SEND_ERROR;
@@ -1983,8 +2029,10 @@ static ssize_t http2_send(struct connectdata *conn, int sockindex,
       nva[i].namelen = strlen((char *)nva[i].name);
     }
     else {
-      nva[i].name = (unsigned char *)hdbuf;
       nva[i].namelen = (size_t)(end - hdbuf);
+      /* Lower case the header name for HTTP/2 */
+      Curl_strntolower((char *)hdbuf, hdbuf, nva[i].namelen);
+      nva[i].name = (unsigned char *)hdbuf;
     }
     hdbuf = end + 1;
     while(*hdbuf == ' ' || *hdbuf == '\t')
@@ -2094,17 +2142,14 @@ static ssize_t http2_send(struct connectdata *conn, int sockindex,
     return -1;
   }
 
-  if(stream->stream_id != -1) {
-    /* If whole HEADERS frame was sent off to the underlying socket,
-       the nghttp2 library calls data_source_read_callback. But only
-       it found that no data available, so it deferred the DATA
-       transmission. Which means that nghttp2_session_want_write()
-       returns 0 on http2_perform_getsock(), which results that no
-       writable socket check is performed. To workaround this, we
-       issue nghttp2_session_resume_data() here to bring back DATA
-       transmission from deferred state. */
-    nghttp2_session_resume_data(h2, stream->stream_id);
-  }
+  /* If whole HEADERS frame was sent off to the underlying socket, the nghttp2
+     library calls data_source_read_callback. But only it found that no data
+     available, so it deferred the DATA transmission. Which means that
+     nghttp2_session_want_write() returns 0 on http2_perform_getsock(), which
+     results that no writable socket check is performed. To workaround this,
+     we issue nghttp2_session_resume_data() here to bring back DATA
+     transmission from deferred state. */
+  nghttp2_session_resume_data(h2, stream->stream_id);
 
   return len;
 
@@ -2137,7 +2182,7 @@ CURLcode Curl_http2_setup(struct connectdata *conn)
   else
     conn->handler = &Curl_handler_http2;
 
-  result = Curl_http2_init(conn);
+  result = http2_init(conn);
   if(result) {
     Curl_add_buffer_free(&stream->header_recvbuf);
     return result;
@@ -2159,7 +2204,7 @@ CURLcode Curl_http2_setup(struct connectdata *conn)
   conn->bundle->multiuse = BUNDLE_MULTIPLEX;
 
   infof(conn->data, "Connection state changed (HTTP/2 confirmed)\n");
-  Curl_multi_connchanged(conn->data->multi);
+  multi_connchanged(conn->data->multi);
 
   return CURLE_OK;
 }
@@ -2367,11 +2412,17 @@ void Curl_http2_cleanup_dependencies(struct Curl_easy *data)
     Curl_http2_remove_child(data->set.stream_depends_on, data);
 }
 
+/* Only call this function for a transfer that already got a HTTP/2
+   CURLE_HTTP2_STREAM error! */
+bool Curl_h2_http_1_1_error(struct connectdata *conn)
+{
+  struct http_conn *httpc = &conn->proto.httpc;
+  return (httpc->error_code == NGHTTP2_HTTP_1_1_REQUIRED);
+}
+
 #else /* !USE_NGHTTP2 */
 
 /* Satisfy external references even if http2 is not compiled in. */
-
-#define CURL_DISABLE_TYPECHECK
 #include <curl/curl.h>
 
 char *curl_pushheader_bynum(struct curl_pushheaders *h, size_t num)
index 4492ec2..12d36ee 100644 (file)
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -42,16 +42,15 @@ const char *Curl_http2_strerror(uint32_t err);
 CURLcode Curl_http2_init(struct connectdata *conn);
 void Curl_http2_init_state(struct UrlState *state);
 void Curl_http2_init_userset(struct UserDefined *set);
-CURLcode Curl_http2_send_request(struct connectdata *conn);
 CURLcode Curl_http2_request_upgrade(Curl_send_buffer *req,
                                     struct connectdata *conn);
 CURLcode Curl_http2_setup(struct connectdata *conn);
 CURLcode Curl_http2_switched(struct connectdata *conn,
                              const char *data, size_t nread);
-/* called from Curl_http_setup_conn */
+/* called from http_setup_conn */
 void Curl_http2_setup_conn(struct connectdata *conn);
 void Curl_http2_setup_req(struct Curl_easy *data);
-void Curl_http2_done(struct connectdata *conn, bool premature);
+void Curl_http2_done(struct Curl_easy *data, bool premature);
 CURLcode Curl_http2_done_sending(struct connectdata *conn);
 CURLcode Curl_http2_add_child(struct Curl_easy *parent,
                               struct Curl_easy *child,
@@ -59,9 +58,10 @@ CURLcode Curl_http2_add_child(struct Curl_easy *parent,
 void Curl_http2_remove_child(struct Curl_easy *parent,
                              struct Curl_easy *child);
 void Curl_http2_cleanup_dependencies(struct Curl_easy *data);
+
+/* returns true if the HTTP/2 stream error was HTTP_1_1_REQUIRED */
+bool Curl_h2_http_1_1_error(struct connectdata *conn);
 #else /* USE_NGHTTP2 */
-#define Curl_http2_init(x) CURLE_UNSUPPORTED_PROTOCOL
-#define Curl_http2_send_request(x) CURLE_UNSUPPORTED_PROTOCOL
 #define Curl_http2_request_upgrade(x,y) CURLE_UNSUPPORTED_PROTOCOL
 #define Curl_http2_setup(x) CURLE_UNSUPPORTED_PROTOCOL
 #define Curl_http2_switched(x,y,z) CURLE_UNSUPPORTED_PROTOCOL
@@ -74,6 +74,7 @@ void Curl_http2_cleanup_dependencies(struct Curl_easy *data);
 #define Curl_http2_add_child(x, y, z)
 #define Curl_http2_remove_child(x, y)
 #define Curl_http2_cleanup_dependencies(x)
+#define Curl_h2_http_1_1_error(x) 0
 #endif
 
 #endif /* HEADER_CURL_HTTP2_H */
index 18dfcb2..b6ffa41 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -109,7 +109,8 @@ void Curl_httpchunk_init(struct connectdata *conn)
 CHUNKcode Curl_httpchunk_read(struct connectdata *conn,
                               char *datap,
                               ssize_t datalen,
-                              ssize_t *wrotep)
+                              ssize_t *wrotep,
+                              CURLcode *extrap)
 {
   CURLcode result = CURLE_OK;
   struct Curl_easy *data = conn->data;
@@ -125,8 +126,10 @@ CHUNKcode Curl_httpchunk_read(struct connectdata *conn,
      chunk read process, to properly calculate the content length*/
   if(data->set.http_te_skip && !k->ignorebody) {
     result = Curl_client_write(conn, CLIENTWRITE_BODY, datap, datalen);
-    if(result)
-      return CHUNKE_WRITE_ERROR;
+    if(result) {
+      *extrap = result;
+      return CHUNKE_PASSTHRU_ERROR;
+    }
   }
 
   while(length) {
@@ -197,8 +200,10 @@ CHUNKcode Curl_httpchunk_read(struct connectdata *conn,
         else
           result = Curl_client_write(conn, CLIENTWRITE_BODY, datap, piece);
 
-        if(result)
-          return CHUNKE_WRITE_ERROR;
+        if(result) {
+          *extrap = result;
+          return CHUNKE_PASSTHRU_ERROR;
+        }
       }
 
       *wrote += piece;
@@ -244,8 +249,10 @@ CHUNKcode Curl_httpchunk_read(struct connectdata *conn,
           if(!data->set.http_te_skip) {
             result = Curl_client_write(conn, CLIENTWRITE_HEADER,
                                        conn->trailer, conn->trlPos);
-            if(result)
-              return CHUNKE_WRITE_ERROR;
+            if(result) {
+              *extrap = result;
+              return CHUNKE_PASSTHRU_ERROR;
+            }
           }
           conn->trlPos = 0;
           ch->state = CHUNK_TRAILER_CR;
@@ -339,8 +346,9 @@ const char *Curl_chunked_strerror(CHUNKcode code)
     return "Illegal or missing hexadecimal sequence";
   case CHUNKE_BAD_CHUNK:
     return "Malformed encoding found";
-  case CHUNKE_WRITE_ERROR:
-    return "Write error";
+  case CHUNKE_PASSTHRU_ERROR:
+    DEBUGASSERT(0); /* never used */
+    return "";
   case CHUNKE_BAD_ENCODING:
     return "Bad content-encoding found";
   case CHUNKE_OUT_OF_MEMORY:
index b969c55..8f4a33c 100644 (file)
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -21,6 +21,9 @@
  * KIND, either express or implied.
  *
  ***************************************************************************/
+
+struct connectdata;
+
 /*
  * The longest possible hexadecimal number we support in a chunked transfer.
  * Weird enough, RFC2616 doesn't set a maximum size! Since we use strtoul()
@@ -71,9 +74,9 @@ typedef enum {
   CHUNKE_TOO_LONG_HEX = 1,
   CHUNKE_ILLEGAL_HEX,
   CHUNKE_BAD_CHUNK,
-  CHUNKE_WRITE_ERROR,
   CHUNKE_BAD_ENCODING,
   CHUNKE_OUT_OF_MEMORY,
+  CHUNKE_PASSTHRU_ERROR, /* Curl_httpchunk_read() returns a CURLcode to use */
   CHUNKE_LAST
 } CHUNKcode;
 
@@ -87,4 +90,10 @@ struct Curl_chunker {
   size_t dataleft; /* untouched data amount at the end of the last buffer */
 };
 
+/* The following functions are defined in http_chunks.c */
+void Curl_httpchunk_init(struct connectdata *conn);
+CHUNKcode Curl_httpchunk_read(struct connectdata *conn, char *datap,
+                              ssize_t length, ssize_t *wrote,
+                              CURLcode *passthru);
+
 #endif /* HEADER_CURL_HTTP_CHUNKS_H */
index e2d865b..9616c30 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -28,6 +28,7 @@
 #include "strcase.h"
 #include "vauth/vauth.h"
 #include "http_digest.h"
+
 /* The last 3 #include files should be in this order */
 #include "curl_printf.h"
 #include "curl_memory.h"
@@ -171,7 +172,7 @@ CURLcode Curl_output_digest(struct connectdata *conn,
   return CURLE_OK;
 }
 
-void Curl_digest_cleanup(struct Curl_easy *data)
+void Curl_http_auth_cleanup_digest(struct Curl_easy *data)
 {
   Curl_auth_digest_cleanup(&data->state.digest);
   Curl_auth_digest_cleanup(&data->state.proxydigest);
index fd225c7..73410ae 100644 (file)
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -23,6 +23,8 @@
  ***************************************************************************/
 #include "curl_setup.h"
 
+#if !defined(CURL_DISABLE_HTTP) && !defined(CURL_DISABLE_CRYPTO_AUTH)
+
 /* this is for digest header input */
 CURLcode Curl_input_digest(struct connectdata *conn,
                            bool proxy, const char *header);
@@ -33,10 +35,8 @@ CURLcode Curl_output_digest(struct connectdata *conn,
                             const unsigned char *request,
                             const unsigned char *uripath);
 
-#if !defined(CURL_DISABLE_HTTP) && !defined(CURL_DISABLE_CRYPTO_AUTH)
-void Curl_digest_cleanup(struct Curl_easy *data);
-#else
-#define Curl_digest_cleanup(x) Curl_nop_stmt
-#endif
+void Curl_http_auth_cleanup_digest(struct Curl_easy *data);
+
+#endif /* !CURL_DISABLE_HTTP && !CURL_DISABLE_CRYPTO_AUTH */
 
 #endif /* HEADER_CURL_HTTP_DIGEST_H */
index ddcd65b..8e1f3bf 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -49,6 +49,7 @@ CURLcode Curl_input_negotiate(struct connectdata *conn, bool proxy,
 
   /* Point to the correct struct with this */
   struct negotiatedata *neg_ctx;
+  curlnegotiate state;
 
   if(proxy) {
     userp = conn->http_proxy.user;
@@ -56,7 +57,8 @@ CURLcode Curl_input_negotiate(struct connectdata *conn, bool proxy,
     service = data->set.str[STRING_PROXY_SERVICE_NAME] ?
               data->set.str[STRING_PROXY_SERVICE_NAME] : "HTTP";
     host = conn->http_proxy.host.name;
-    neg_ctx = &data->state.proxyneg;
+    neg_ctx = &conn->proxyneg;
+    state = conn->proxy_negotiate_state;
   }
   else {
     userp = conn->user;
@@ -64,7 +66,8 @@ CURLcode Curl_input_negotiate(struct connectdata *conn, bool proxy,
     service = data->set.str[STRING_SERVICE_NAME] ?
               data->set.str[STRING_SERVICE_NAME] : "HTTP";
     host = conn->host.name;
-    neg_ctx = &data->state.negotiate;
+    neg_ctx = &conn->negotiate;
+    state = conn->http_negotiate_state;
   }
 
   /* Not set means empty */
@@ -80,59 +83,138 @@ CURLcode Curl_input_negotiate(struct connectdata *conn, bool proxy,
     header++;
 
   len = strlen(header);
+  neg_ctx->havenegdata = len != 0;
   if(!len) {
-    /* Is this the first call in a new negotiation? */
-    if(neg_ctx->context) {
-      /* The server rejected our authentication and hasn't suppled any more
+    if(state == GSS_AUTHSUCC) {
+      infof(conn->data, "Negotiate auth restarted\n");
+      Curl_http_auth_cleanup_negotiate(conn);
+    }
+    else if(state != GSS_AUTHNONE) {
+      /* The server rejected our authentication and hasn't supplied any more
       negotiation mechanisms */
+      Curl_http_auth_cleanup_negotiate(conn);
       return CURLE_LOGIN_DENIED;
     }
   }
 
+  /* Supports SSL channel binding for Windows ISS extended protection */
+#if defined(USE_WINDOWS_SSPI) && defined(SECPKG_ATTR_ENDPOINT_BINDINGS)
+  neg_ctx->sslContext = conn->sslContext;
+#endif
+
   /* Initialize the security context and decode our challenge */
   result = Curl_auth_decode_spnego_message(data, userp, passwdp, service,
                                            host, header, neg_ctx);
 
   if(result)
-    Curl_auth_spnego_cleanup(neg_ctx);
+    Curl_http_auth_cleanup_negotiate(conn);
 
   return result;
 }
 
 CURLcode Curl_output_negotiate(struct connectdata *conn, bool proxy)
 {
-  struct negotiatedata *neg_ctx = proxy ? &conn->data->state.proxyneg :
-    &conn->data->state.negotiate;
+  struct negotiatedata *neg_ctx = proxy ? &conn->proxyneg :
+    &conn->negotiate;
+  struct auth *authp = proxy ? &conn->data->state.authproxy :
+    &conn->data->state.authhost;
+  curlnegotiate *state = proxy ? &conn->proxy_negotiate_state :
+                                 &conn->http_negotiate_state;
   char *base64 = NULL;
   size_t len = 0;
   char *userp;
   CURLcode result;
 
-  result = Curl_auth_create_spnego_message(conn->data, neg_ctx, &base64, &len);
-  if(result)
-    return result;
+  authp->done = FALSE;
 
-  userp = aprintf("%sAuthorization: Negotiate %s\r\n", proxy ? "Proxy-" : "",
-                  base64);
+  if(*state == GSS_AUTHRECV) {
+    if(neg_ctx->havenegdata) {
+      neg_ctx->havemultiplerequests = TRUE;
+    }
+  }
+  else if(*state == GSS_AUTHSUCC) {
+    if(!neg_ctx->havenoauthpersist) {
+      neg_ctx->noauthpersist = !neg_ctx->havemultiplerequests;
+    }
+  }
 
-  if(proxy) {
-    Curl_safefree(conn->allocptr.proxyuserpwd);
-    conn->allocptr.proxyuserpwd = userp;
+  if(neg_ctx->noauthpersist ||
+    (*state != GSS_AUTHDONE && *state != GSS_AUTHSUCC)) {
+
+    if(neg_ctx->noauthpersist && *state == GSS_AUTHSUCC) {
+      infof(conn->data, "Curl_output_negotiate, "
+       "no persistent authentication: cleanup existing context");
+      Curl_http_auth_cleanup_negotiate(conn);
+    }
+    if(!neg_ctx->context) {
+      result = Curl_input_negotiate(conn, proxy, "Negotiate");
+      if(result == CURLE_AUTH_ERROR) {
+        /* negotiate auth failed, let's continue unauthenticated to stay
+         * compatible with the behavior before curl-7_64_0-158-g6c6035532 */
+        authp->done = TRUE;
+        return CURLE_OK;
+      }
+      else if(result)
+        return result;
+    }
+
+    result = Curl_auth_create_spnego_message(conn->data,
+      neg_ctx, &base64, &len);
+    if(result)
+      return result;
+
+    userp = aprintf("%sAuthorization: Negotiate %s\r\n", proxy ? "Proxy-" : "",
+      base64);
+
+    if(proxy) {
+      Curl_safefree(conn->allocptr.proxyuserpwd);
+      conn->allocptr.proxyuserpwd = userp;
+    }
+    else {
+      Curl_safefree(conn->allocptr.userpwd);
+      conn->allocptr.userpwd = userp;
+    }
+
+    free(base64);
+
+    if(userp == NULL) {
+      return CURLE_OUT_OF_MEMORY;
+    }
+
+    *state = GSS_AUTHSENT;
+  #ifdef HAVE_GSSAPI
+    if(neg_ctx->status == GSS_S_COMPLETE ||
+       neg_ctx->status == GSS_S_CONTINUE_NEEDED) {
+      *state = GSS_AUTHDONE;
+    }
+  #else
+  #ifdef USE_WINDOWS_SSPI
+    if(neg_ctx->status == SEC_E_OK ||
+       neg_ctx->status == SEC_I_CONTINUE_NEEDED) {
+      *state = GSS_AUTHDONE;
+    }
+  #endif
+  #endif
   }
-  else {
-    Curl_safefree(conn->allocptr.userpwd);
-    conn->allocptr.userpwd = userp;
+
+  if(*state == GSS_AUTHDONE || *state == GSS_AUTHSUCC) {
+    /* connection is already authenticated,
+     * don't send a header in future requests */
+    authp->done = TRUE;
   }
 
-  free(base64);
+  neg_ctx->havenegdata = FALSE;
 
-  return (userp == NULL) ? CURLE_OUT_OF_MEMORY : CURLE_OK;
+  return CURLE_OK;
 }
 
-void Curl_cleanup_negotiate(struct Curl_easy *data)
+void Curl_http_auth_cleanup_negotiate(struct connectdata *conn)
 {
-  Curl_auth_spnego_cleanup(&data->state.negotiate);
-  Curl_auth_spnego_cleanup(&data->state.proxyneg);
+  conn->http_negotiate_state = GSS_AUTHNONE;
+  conn->proxy_negotiate_state = GSS_AUTHNONE;
+
+  Curl_auth_cleanup_spnego(&conn->negotiate);
+  Curl_auth_cleanup_spnego(&conn->proxyneg);
 }
 
 #endif /* !CURL_DISABLE_HTTP && USE_SPNEGO */
index c64e548..4f0ac16 100644 (file)
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -22,7 +22,7 @@
  *
  ***************************************************************************/
 
-#ifdef USE_SPNEGO
+#if !defined(CURL_DISABLE_HTTP) && defined(USE_SPNEGO)
 
 /* this is for Negotiate header input */
 CURLcode Curl_input_negotiate(struct connectdata *conn, bool proxy,
@@ -31,8 +31,8 @@ CURLcode Curl_input_negotiate(struct connectdata *conn, bool proxy,
 /* this is for creating Negotiate header output */
 CURLcode Curl_output_negotiate(struct connectdata *conn, bool proxy);
 
-void Curl_cleanup_negotiate(struct Curl_easy *data);
+void Curl_http_auth_cleanup_negotiate(struct connectdata *conn);
 
-#endif /* USE_SPNEGO */
+#endif /* !CURL_DISABLE_HTTP && USE_SPNEGO */
 
 #endif /* HEADER_CURL_HTTP_NEGOTIATE_H */
index a9b33f9..342b242 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -44,9 +44,7 @@
 
 /* SSL backend-specific #if branches in this file must be kept in the order
    documented in curl_ntlm_core. */
-#if defined(NTLM_NEEDS_NSS_INIT)
-#include "vtls/nssg.h"
-#elif defined(USE_WINDOWS_SSPI)
+#if defined(USE_WINDOWS_SSPI)
 #include "curl_sspi.h"
 #endif
 
@@ -68,9 +66,11 @@ CURLcode Curl_input_ntlm(struct connectdata *conn,
 {
   /* point to the correct struct with this */
   struct ntlmdata *ntlm;
+  curlntlm *state;
   CURLcode result = CURLE_OK;
 
   ntlm = proxy ? &conn->proxyntlm : &conn->ntlm;
+  state = proxy ? &conn->proxy_ntlm_state : &conn->http_ntlm_state;
 
   if(checkprefix("NTLM", header)) {
     header += strlen("NTLM");
@@ -83,25 +83,25 @@ CURLcode Curl_input_ntlm(struct connectdata *conn,
       if(result)
         return result;
 
-      ntlm->state = NTLMSTATE_TYPE2; /* We got a type-2 message */
+      *state = NTLMSTATE_TYPE2; /* We got a type-2 message */
     }
     else {
-      if(ntlm->state == NTLMSTATE_LAST) {
+      if(*state == NTLMSTATE_LAST) {
         infof(conn->data, "NTLM auth restarted\n");
-        Curl_http_ntlm_cleanup(conn);
+        Curl_http_auth_cleanup_ntlm(conn);
       }
-      else if(ntlm->state == NTLMSTATE_TYPE3) {
+      else if(*state == NTLMSTATE_TYPE3) {
         infof(conn->data, "NTLM handshake rejected\n");
-        Curl_http_ntlm_cleanup(conn);
-        ntlm->state = NTLMSTATE_NONE;
+        Curl_http_auth_cleanup_ntlm(conn);
+        *state = NTLMSTATE_NONE;
         return CURLE_REMOTE_ACCESS_DENIED;
       }
-      else if(ntlm->state >= NTLMSTATE_TYPE1) {
+      else if(*state >= NTLMSTATE_TYPE1) {
         infof(conn->data, "NTLM handshake failure (internal error)\n");
         return CURLE_REMOTE_ACCESS_DENIED;
       }
 
-      ntlm->state = NTLMSTATE_TYPE1; /* We should send away a type-1 */
+      *state = NTLMSTATE_TYPE1; /* We should send away a type-1 */
     }
   }
 
@@ -129,16 +129,12 @@ CURLcode Curl_output_ntlm(struct connectdata *conn, bool proxy)
 
   /* point to the correct struct with this */
   struct ntlmdata *ntlm;
+  curlntlm *state;
   struct auth *authp;
 
   DEBUGASSERT(conn);
   DEBUGASSERT(conn->data);
 
-#if defined(NTLM_NEEDS_NSS_INIT)
-  if(CURLE_OK != Curl_nss_force_init(conn->data))
-    return CURLE_OUT_OF_MEMORY;
-#endif
-
   if(proxy) {
     allocuserpwd = &conn->allocptr.proxyuserpwd;
     userp = conn->http_proxy.user;
@@ -147,6 +143,7 @@ CURLcode Curl_output_ntlm(struct connectdata *conn, bool proxy)
               conn->data->set.str[STRING_PROXY_SERVICE_NAME] : "HTTP";
     hostname = conn->http_proxy.host.name;
     ntlm = &conn->proxyntlm;
+    state = &conn->proxy_ntlm_state;
     authp = &conn->data->state.authproxy;
   }
   else {
@@ -157,6 +154,7 @@ CURLcode Curl_output_ntlm(struct connectdata *conn, bool proxy)
               conn->data->set.str[STRING_SERVICE_NAME] : "HTTP";
     hostname = conn->host.name;
     ntlm = &conn->ntlm;
+    state = &conn->http_ntlm_state;
     authp = &conn->data->state.authhost;
   }
   authp->done = FALSE;
@@ -175,9 +173,12 @@ CURLcode Curl_output_ntlm(struct connectdata *conn, bool proxy)
     if(s_hSecDll == NULL)
       return err;
   }
+#ifdef SECPKG_ATTR_ENDPOINT_BINDINGS
+  ntlm->sslContext = conn->sslContext;
+#endif
 #endif
 
-  switch(ntlm->state) {
+  switch(*state) {
   case NTLMSTATE_TYPE1:
   default: /* for the weird cases we (re)start here */
     /* Create a type-1 message */
@@ -219,7 +220,7 @@ CURLcode Curl_output_ntlm(struct connectdata *conn, bool proxy)
 
       DEBUG_OUT(fprintf(stderr, "**** %s\n ", *allocuserpwd));
 
-      ntlm->state = NTLMSTATE_TYPE3; /* we send a type-3 */
+      *state = NTLMSTATE_TYPE3; /* we send a type-3 */
       authp->done = TRUE;
     }
     break;
@@ -227,7 +228,7 @@ CURLcode Curl_output_ntlm(struct connectdata *conn, bool proxy)
   case NTLMSTATE_TYPE3:
     /* connection is already authenticated,
      * don't send a header in future requests */
-    ntlm->state = NTLMSTATE_LAST;
+    *state = NTLMSTATE_LAST;
     /* FALLTHROUGH */
   case NTLMSTATE_LAST:
     Curl_safefree(*allocuserpwd);
@@ -238,13 +239,13 @@ CURLcode Curl_output_ntlm(struct connectdata *conn, bool proxy)
   return CURLE_OK;
 }
 
-void Curl_http_ntlm_cleanup(struct connectdata *conn)
+void Curl_http_auth_cleanup_ntlm(struct connectdata *conn)
 {
-  Curl_auth_ntlm_cleanup(&conn->ntlm);
-  Curl_auth_ntlm_cleanup(&conn->proxyntlm);
+  Curl_auth_cleanup_ntlm(&conn->ntlm);
+  Curl_auth_cleanup_ntlm(&conn->proxyntlm);
 
 #if defined(NTLM_WB_ENABLED)
-  Curl_ntlm_wb_cleanup(conn);
+  Curl_http_auth_cleanup_ntlm_wb(conn);
 #endif
 }
 
index d186bbe..003714d 100644 (file)
@@ -1,5 +1,5 @@
-#ifndef HEADER_CURL_NTLM_H
-#define HEADER_CURL_NTLM_H
+#ifndef HEADER_CURL_HTTP_NTLM_H
+#define HEADER_CURL_HTTP_NTLM_H
 /***************************************************************************
  *                                  _   _ ____  _
  *  Project                     ___| | | |  _ \| |
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -33,8 +33,8 @@ CURLcode Curl_input_ntlm(struct connectdata *conn, bool proxy,
 /* this is for creating ntlm header output */
 CURLcode Curl_output_ntlm(struct connectdata *conn, bool proxy);
 
-void Curl_http_ntlm_cleanup(struct connectdata *conn);
+void Curl_http_auth_cleanup_ntlm(struct connectdata *conn);
 
 #endif /* !CURL_DISABLE_HTTP && USE_NTLM */
 
-#endif /* HEADER_CURL_NTLM_H */
+#endif /* HEADER_CURL_HTTP_NTLM_H */
index 2e0d92e..75c7a60 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -58,8 +58,9 @@ static CURLcode https_proxy_connect(struct connectdata *conn, int sockindex)
       Curl_ssl_connect_nonblocking(conn, sockindex,
                                    &conn->bits.proxy_ssl_connected[sockindex]);
     if(result)
-      conn->bits.close = TRUE; /* a failed connection is marked for closure to
-                                  prevent (bad) re-use or similar */
+      /* a failed connection is marked for closure to prevent (bad) re-use or
+         similar */
+      connclose(conn, "TLS handshake failed");
   }
   return result;
 #else
@@ -327,7 +328,7 @@ static CURLcode CONNECT(struct connectdata *conn,
     { /* READING RESPONSE PHASE */
       int error = SELECT_OK;
 
-      while(s->keepon && !error) {
+      while(s->keepon) {
         ssize_t gotbytes;
 
         /* make sure we have space to read more data */
@@ -384,11 +385,12 @@ static CURLcode CONNECT(struct connectdata *conn,
             /* chunked-encoded body, so we need to do the chunked dance
                properly to know when the end of the body is reached */
             CHUNKcode r;
+            CURLcode extra;
             ssize_t tookcareof = 0;
 
             /* now parse the chunked piece of data so that we can
                properly tell when the stream ends */
-            r = Curl_httpchunk_read(conn, s->ptr, 1, &tookcareof);
+            r = Curl_httpchunk_read(conn, s->ptr, 1, &tookcareof, &extra);
             if(r == CHUNKE_STOP) {
               /* we're done reading chunks! */
               infof(data, "chunk reading DONE\n");
@@ -455,6 +457,7 @@ static CURLcode CONNECT(struct connectdata *conn,
             }
             else if(s->chunked_encoding) {
               CHUNKcode r;
+              CURLcode extra;
 
               infof(data, "Ignore chunked response-body\n");
 
@@ -472,7 +475,8 @@ static CURLcode CONNECT(struct connectdata *conn,
 
               /* now parse the chunked piece of data so that we can
                  properly tell when the stream ends */
-              r = Curl_httpchunk_read(conn, s->line_start + 1, 1, &gotbytes);
+              r = Curl_httpchunk_read(conn, s->line_start + 1, 1, &gotbytes,
+                                      &extra);
               if(r == CHUNKE_STOP) {
                 /* we're done reading chunks! */
                 infof(data, "chunk reading DONE\n");
@@ -632,6 +636,7 @@ static CURLcode CONNECT(struct connectdata *conn,
   conn->allocptr.proxyuserpwd = NULL;
 
   data->state.authproxy.done = TRUE;
+  data->state.authproxy.multipass = FALSE;
 
   infof(data, "Proxy replied %d to CONNECT request\n",
         data->info.httpproxycode);
@@ -643,7 +648,7 @@ static CURLcode CONNECT(struct connectdata *conn,
 
 void Curl_connect_free(struct Curl_easy *data)
 {
-  struct connectdata *conn = data->easy_conn;
+  struct connectdata *conn = data->conn;
   struct http_connect_state *s = conn->connect_state;
   if(s) {
     free(s);
index ce38ea1..d003de6 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -96,26 +96,8 @@ unsigned int Curl_ipv6_scope(const struct sockaddr *sa)
 
 #if defined(HAVE_GETIFADDRS)
 
-bool Curl_if_is_interface_name(const char *interf)
-{
-  bool result = FALSE;
-
-  struct ifaddrs *iface, *head;
-
-  if(getifaddrs(&head) >= 0) {
-    for(iface = head; iface != NULL; iface = iface->ifa_next) {
-      if(strcasecompare(iface->ifa_name, interf)) {
-        result = TRUE;
-        break;
-      }
-    }
-    freeifaddrs(head);
-  }
-  return result;
-}
-
 if2ip_result_t Curl_if2ip(int af, unsigned int remote_scope,
-                          unsigned int remote_scope_id, const char *interf,
+                          unsigned int local_scope_id, const char *interf,
                           char *buf, int buf_size)
 {
   struct ifaddrs *iface, *head;
@@ -127,7 +109,7 @@ if2ip_result_t Curl_if2ip(int af, unsigned int remote_scope,
 
 #if !defined(HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID) || \
     !defined(ENABLE_IPV6)
-  (void) remote_scope_id;
+  (void) local_scope_id;
 #endif
 
   if(getifaddrs(&head) >= 0) {
@@ -141,7 +123,9 @@ if2ip_result_t Curl_if2ip(int af, unsigned int remote_scope,
             char ipstr[64];
 #ifdef ENABLE_IPV6
             if(af == AF_INET6) {
+#ifdef HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID
               unsigned int scopeid = 0;
+#endif
               unsigned int ifscope = Curl_ipv6_scope(iface->ifa_addr);
 
               if(ifscope != remote_scope) {
@@ -161,15 +145,16 @@ if2ip_result_t Curl_if2ip(int af, unsigned int remote_scope,
                             ->sin6_scope_id;
 
               /* If given, scope id should match. */
-              if(remote_scope_id && scopeid != remote_scope_id) {
+              if(local_scope_id && scopeid != local_scope_id) {
                 if(res == IF2IP_NOT_FOUND)
                   res = IF2IP_AF_NOT_SUPPORTED;
 
                 continue;
               }
-#endif
+
               if(scopeid)
-                snprintf(scope, sizeof(scope), "%%%u", scopeid);
+                  msnprintf(scope, sizeof(scope), "%%%u", scopeid);
+#endif
             }
             else
 #endif
@@ -177,7 +162,7 @@ if2ip_result_t Curl_if2ip(int af, unsigned int remote_scope,
                   &((struct sockaddr_in *)(void *)iface->ifa_addr)->sin_addr;
             res = IF2IP_FOUND;
             ip = (char *) Curl_inet_ntop(af, addr, ipstr, sizeof(ipstr));
-            snprintf(buf, buf_size, "%s%s", ip, scope);
+            msnprintf(buf, buf_size, "%s%s", ip, scope);
             break;
           }
         }
@@ -196,17 +181,8 @@ if2ip_result_t Curl_if2ip(int af, unsigned int remote_scope,
 
 #elif defined(HAVE_IOCTL_SIOCGIFADDR)
 
-bool Curl_if_is_interface_name(const char *interf)
-{
-  /* This is here just to support the old interfaces */
-  char buf[256];
-
-  return (Curl_if2ip(AF_INET, 0 /* unused */, 0, interf, buf, sizeof(buf)) ==
-          IF2IP_NOT_FOUND) ? FALSE : TRUE;
-}
-
 if2ip_result_t Curl_if2ip(int af, unsigned int remote_scope,
-                          unsigned int remote_scope_id, const char *interf,
+                          unsigned int local_scope_id, const char *interf,
                           char *buf, int buf_size)
 {
   struct ifreq req;
@@ -216,7 +192,7 @@ if2ip_result_t Curl_if2ip(int af, unsigned int remote_scope,
   size_t len;
 
   (void)remote_scope;
-  (void)remote_scope_id;
+  (void)local_scope_id;
 
   if(!interf || (af != AF_INET))
     return IF2IP_NOT_FOUND;
@@ -251,20 +227,13 @@ if2ip_result_t Curl_if2ip(int af, unsigned int remote_scope,
 
 #else
 
-bool Curl_if_is_interface_name(const char *interf)
-{
-  (void) interf;
-
-  return FALSE;
-}
-
 if2ip_result_t Curl_if2ip(int af, unsigned int remote_scope,
-                          unsigned int remote_scope_id, const char *interf,
+                          unsigned int local_scope_id, const char *interf,
                           char *buf, int buf_size)
 {
     (void) af;
     (void) remote_scope;
-    (void) remote_scope_id;
+    (void) local_scope_id;
     (void) interf;
     (void) buf;
     (void) buf_size;
index a90e662..f193d42 100644 (file)
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -32,8 +32,6 @@
 
 unsigned int Curl_ipv6_scope(const struct sockaddr *sa);
 
-bool Curl_if_is_interface_name(const char *interf);
-
 typedef enum {
   IF2IP_NOT_FOUND = 0, /* Interface not found */
   IF2IP_AF_NOT_SUPPORTED = 1, /* Int. exists but has no address for this af */
@@ -41,7 +39,7 @@ typedef enum {
 } if2ip_result_t;
 
 if2ip_result_t Curl_if2ip(int af, unsigned int remote_scope,
-                          unsigned int remote_scope_id, const char *interf,
+                          unsigned int local_scope_id, const char *interf,
                           char *buf, int buf_size);
 
 #ifdef __INTERIX
index 3ef8909..66172bd 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -28,6 +28,7 @@
  * RFC4959 IMAP Extension for SASL Initial Client Response
  * RFC5092 IMAP URL Scheme
  * RFC6749 OAuth 2.0 Authorization Framework
+ * RFC8314 Use of TLS for Email Submission and Access
  * Draft   LOGIN SASL Mechanism <draft-murchison-sasl-login-00.txt>
  *
  ***************************************************************************/
@@ -94,8 +95,7 @@ static CURLcode imap_done(struct connectdata *conn, CURLcode status,
 static CURLcode imap_connect(struct connectdata *conn, bool *done);
 static CURLcode imap_disconnect(struct connectdata *conn, bool dead);
 static CURLcode imap_multi_statemach(struct connectdata *conn, bool *done);
-static int imap_getsock(struct connectdata *conn, curl_socket_t *socks,
-                        int numsocks);
+static int imap_getsock(struct connectdata *conn, curl_socket_t *socks);
 static CURLcode imap_doing(struct connectdata *conn, bool *dophase_done);
 static CURLcode imap_setup_connection(struct connectdata *conn);
 static char *imap_atom(const char *str, bool escape_only);
@@ -316,7 +316,7 @@ static bool imap_endofresp(struct connectdata *conn, char *line, size_t len,
      a space and optionally some text as per RFC-3501 for the AUTHENTICATE and
      APPEND commands and as outlined in Section 4. Examples of RFC-4959 but
      some e-mail servers ignore this and only send a single + instead. */
-  if(imap && !imap->custom && ((len == 3 && !memcmp("+", line, 1)) ||
+  if(imap && !imap->custom && ((len == 3 && line[0] == '+') ||
      (len >= 2 && !memcmp("+ ", line, 2)))) {
     switch(imapc->state) {
       /* States which are interested in continuation responses */
@@ -443,10 +443,8 @@ static CURLcode imap_perform_capability(struct connectdata *conn)
  */
 static CURLcode imap_perform_starttls(struct connectdata *conn)
 {
-  CURLcode result = CURLE_OK;
-
   /* Send the STARTTLS command */
-  result = imap_sendf(conn, "STARTTLS");
+  CURLcode result = imap_sendf(conn, "STARTTLS");
 
   if(!result)
     state(conn, IMAP_STARTTLS);
@@ -462,11 +460,10 @@ static CURLcode imap_perform_starttls(struct connectdata *conn)
  */
 static CURLcode imap_perform_upgrade_tls(struct connectdata *conn)
 {
-  CURLcode result = CURLE_OK;
-  struct imap_conn *imapc = &conn->proto.imapc;
-
   /* Start the SSL connection */
-  result = Curl_ssl_connect_nonblocking(conn, FIRSTSOCKET, &imapc->ssldone);
+  struct imap_conn *imapc = &conn->proto.imapc;
+  CURLcode result = Curl_ssl_connect_nonblocking(conn, FIRSTSOCKET,
+                                                 &imapc->ssldone);
 
   if(!result) {
     if(imapc->state != IMAP_UPGRADETLS)
@@ -825,10 +822,8 @@ static CURLcode imap_perform_search(struct connectdata *conn)
  */
 static CURLcode imap_perform_logout(struct connectdata *conn)
 {
-  CURLcode result = CURLE_OK;
-
   /* Send the LOGOUT command */
-  result = imap_sendf(conn, "LOGOUT");
+  CURLcode result = imap_sendf(conn, "LOGOUT");
 
   if(!result)
     state(conn, IMAP_LOGOUT);
@@ -1042,7 +1037,7 @@ static CURLcode imap_state_listsearch_resp(struct connectdata *conn,
     line[len] = '\0';
   }
   else if(imapcode != IMAP_RESP_OK)
-    result = CURLE_QUOTE_ERROR; /* TODO: Fix error code */
+    result = CURLE_QUOTE_ERROR;
   else
     /* End of DO phase */
     state(conn, IMAP_STOP);
@@ -1114,7 +1109,7 @@ static CURLcode imap_state_fetch_resp(struct connectdata *conn, int imapcode,
   if(imapcode != '*') {
     Curl_pgrsSetDownloadSize(data, -1);
     state(conn, IMAP_STOP);
-    return CURLE_REMOTE_FILE_NOT_FOUND; /* TODO: Fix error code */
+    return CURLE_REMOTE_FILE_NOT_FOUND;
   }
 
   /* Something like this is received "* 1 FETCH (BODY[TEXT] {2021}\r" so parse
@@ -1177,11 +1172,11 @@ static CURLcode imap_state_fetch_resp(struct connectdata *conn, int imapcode,
 
     if(data->req.bytecount == size)
       /* The entire data is already transferred! */
-      Curl_setup_transfer(conn, -1, -1, FALSE, NULL, -1, NULL);
+      Curl_setup_transfer(data, -1, -1, FALSE, -1);
     else {
       /* IMAP download */
       data->req.maxdownload = size;
-      Curl_setup_transfer(conn, FIRSTSOCKET, size, FALSE, NULL, -1, NULL);
+      Curl_setup_transfer(data, FIRSTSOCKET, size, FALSE, -1);
     }
   }
   else {
@@ -1231,7 +1226,7 @@ static CURLcode imap_state_append_resp(struct connectdata *conn, int imapcode,
     Curl_pgrsSetUploadSize(data, data->state.infilesize);
 
     /* IMAP upload */
-    Curl_setup_transfer(conn, -1, -1, FALSE, NULL, FIRSTSOCKET, NULL);
+    Curl_setup_transfer(data, -1, -1, FALSE, FIRSTSOCKET);
 
     /* End of DO phase */
     state(conn, IMAP_STOP);
@@ -1311,6 +1306,7 @@ static CURLcode imap_statemach_act(struct connectdata *conn)
       break;
 
     case IMAP_LIST:
+    case IMAP_SEARCH:
       result = imap_state_listsearch_resp(conn, imapcode, imapc->state);
       break;
 
@@ -1334,10 +1330,6 @@ static CURLcode imap_statemach_act(struct connectdata *conn)
       result = imap_state_append_final_resp(conn, imapcode, imapc->state);
       break;
 
-    case IMAP_SEARCH:
-      result = imap_state_listsearch_resp(conn, imapcode, imapc->state);
-      break;
-
     case IMAP_LOGOUT:
       /* fallthrough, just stop! */
     default:
@@ -1362,19 +1354,20 @@ static CURLcode imap_multi_statemach(struct connectdata *conn, bool *done)
       return result;
   }
 
-  result = Curl_pp_statemach(&imapc->pp, FALSE);
+  result = Curl_pp_statemach(&imapc->pp, FALSE, FALSE);
   *done = (imapc->state == IMAP_STOP) ? TRUE : FALSE;
 
   return result;
 }
 
-static CURLcode imap_block_statemach(struct connectdata *conn)
+static CURLcode imap_block_statemach(struct connectdata *conn,
+                                     bool disconnecting)
 {
   CURLcode result = CURLE_OK;
   struct imap_conn *imapc = &conn->proto.imapc;
 
   while(imapc->state != IMAP_STOP && !result)
-    result = Curl_pp_statemach(&imapc->pp, TRUE);
+    result = Curl_pp_statemach(&imapc->pp, TRUE, disconnecting);
 
   return result;
 }
@@ -1395,10 +1388,9 @@ static CURLcode imap_init(struct connectdata *conn)
 }
 
 /* For the IMAP "protocol connect" and "doing" phases only */
-static int imap_getsock(struct connectdata *conn, curl_socket_t *socks,
-                        int numsocks)
+static int imap_getsock(struct connectdata *conn, curl_socket_t *socks)
 {
-  return Curl_pp_getsock(&conn->proto.imapc.pp, socks, numsocks);
+  return Curl_pp_getsock(&conn->proto.imapc.pp, socks);
 }
 
 /***********************************************************************
@@ -1490,14 +1482,9 @@ static CURLcode imap_done(struct connectdata *conn, CURLcode status,
         state(conn, IMAP_APPEND_FINAL);
     }
 
-    /* Run the state-machine
-
-       TODO: when the multi interface is used, this _really_ should be using
-       the imap_multi_statemach function but we have no general support for
-       non-blocking DONE operations!
-    */
+    /* Run the state-machine */
     if(!result)
-      result = imap_block_statemach(conn);
+      result = imap_block_statemach(conn, FALSE);
   }
 
   /* Cleanup our per-request based variables */
@@ -1635,7 +1622,7 @@ static CURLcode imap_disconnect(struct connectdata *conn, bool dead_connection)
      point! */
   if(!dead_connection && imapc->pp.conn && imapc->pp.conn->bits.protoconnstart)
     if(!imap_perform_logout(conn))
-      (void)imap_block_statemach(conn); /* ignore errors on LOGOUT */
+      (void)imap_block_statemach(conn, TRUE); /* ignore errors on LOGOUT */
 
   /* Disconnect from the server */
   Curl_pp_disconnect(&imapc->pp);
@@ -1659,7 +1646,7 @@ static CURLcode imap_dophase_done(struct connectdata *conn, bool connected)
 
   if(imap->transfer != FTPTRANSFER_BODY)
     /* no data to transfer */
-    Curl_setup_transfer(conn, -1, -1, FALSE, NULL, -1, NULL);
+    Curl_setup_transfer(conn->data, -1, -1, FALSE, -1);
 
   return CURLE_OK;
 }
@@ -1749,8 +1736,8 @@ static CURLcode imap_sendf(struct connectdata *conn, const char *fmt, ...)
   imapc->cmdid = (imapc->cmdid + 1) % 1000;
 
   /* Calculate the tag based on the connection ID and command ID */
-  snprintf(imapc->resptag, sizeof(imapc->resptag), "%c%03d",
-           'A' + curlx_sltosi(conn->connection_id % 26), imapc->cmdid);
+  msnprintf(imapc->resptag, sizeof(imapc->resptag), "%c%03d",
+            'A' + curlx_sltosi(conn->connection_id % 26), imapc->cmdid);
 
   /* Prefix the format with the tag */
   taggedfmt = aprintf("%s %s", imapc->resptag, fmt);
@@ -1793,7 +1780,7 @@ static char *imap_atom(const char *str, bool escape_only)
     return NULL;
 
   /* Look for "atom-specials", counting the backslash and quote characters as
-     these will need escapping */
+     these will need escaping */
   p1 = str;
   while(*p1) {
     if(*p1 == '\\')
index 0efcfd2..4786f56 100644 (file)
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 2009 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 2009 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
index ac5d2d4..9a5af7f 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 1996-2001  Internet Software Consortium.
+ * Copyright (C) 1996-2019  Internet Software Consortium.
  *
  * Permission to use, copy, modify, and distribute this software for any
  * purpose with or without fee is hereby granted, provided that the above
@@ -55,11 +55,11 @@ static char *inet_ntop4 (const unsigned char *src, char *dst, size_t size)
   DEBUGASSERT(size >= 16);
 
   tmp[0] = '\0';
-  (void)snprintf(tmp, sizeof(tmp), "%d.%d.%d.%d",
-                 ((int)((unsigned char)src[0])) & 0xff,
-                 ((int)((unsigned char)src[1])) & 0xff,
-                 ((int)((unsigned char)src[2])) & 0xff,
-                 ((int)((unsigned char)src[3])) & 0xff);
+  (void)msnprintf(tmp, sizeof(tmp), "%d.%d.%d.%d",
+                  ((int)((unsigned char)src[0])) & 0xff,
+                  ((int)((unsigned char)src[1])) & 0xff,
+                  ((int)((unsigned char)src[2])) & 0xff,
+                  ((int)((unsigned char)src[3])) & 0xff);
 
   len = strlen(tmp);
   if(len == 0 || len >= size) {
@@ -148,7 +148,7 @@ static char *inet_ntop6 (const unsigned char *src, char *dst, size_t size)
       tp += strlen(tp);
       break;
     }
-    tp += snprintf(tp, 5, "%lx", words[i]);
+    tp += msnprintf(tp, 5, "%lx", words[i]);
   }
 
   /* Was it a trailing run of 0x00's?
index d150bb6..9d3f237 100644 (file)
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
index fef9610..9c87a05 100644 (file)
@@ -1,6 +1,6 @@
 /* This is from the BIND 4.9.4 release, modified to compile by itself */
 
-/* Copyright (c) 1996 by Internet Software Consortium.
+/* Copyright (c) 1996 - 2019 by Internet Software Consortium.
  *
  * Permission to use, copy, modify, and distribute this software for any
  * purpose with or without fee is hereby granted, provided that the above
@@ -153,7 +153,7 @@ inet_pton6(const char *src, unsigned char *dst)
   static const char xdigits_l[] = "0123456789abcdef",
     xdigits_u[] = "0123456789ABCDEF";
   unsigned char tmp[IN6ADDRSZ], *tp, *endp, *colonp;
-  const char *xdigits, *curtok;
+  const char *curtok;
   int ch, saw_xdigit;
   size_t val;
 
@@ -168,6 +168,7 @@ inet_pton6(const char *src, unsigned char *dst)
   saw_xdigit = 0;
   val = 0;
   while((ch = *src++) != '\0') {
+    const char *xdigits;
     const char *pch;
 
     pch = strchr((xdigits = xdigits_l), ch);
index 0209b9b..e695af9 100644 (file)
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
index e51dcd1..f50287a 100644 (file)
@@ -1,8 +1,8 @@
 /* GSSAPI/krb5 support for FTP - loosely based on old krb4.c
  *
- * Copyright (c) 1995, 1996, 1997, 1998, 1999 Kungliga Tekniska Högskolan
+ * Copyright (c) 1995, 1996, 1997, 1998, 1999 Kungliga Tekniska Högskolan
  * (Royal Institute of Technology, Stockholm, Sweden).
- * Copyright (c) 2004 - 2017 Daniel Stenberg
+ * Copyright (c) 2004 - 2019 Daniel Stenberg
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -320,10 +320,8 @@ static void krb5_end(void *app_data)
     OM_uint32 min;
     gss_ctx_id_t *context = app_data;
     if(*context != GSS_C_NO_CONTEXT) {
-#ifdef DEBUGBUILD
-      OM_uint32 maj =
-#endif
-      gss_delete_sec_context(&min, context, GSS_C_NO_BUFFER);
+      OM_uint32 maj = gss_delete_sec_context(&min, context, GSS_C_NO_BUFFER);
+      (void)maj;
       DEBUGASSERT(maj == GSS_S_COMPLETE);
     }
 }
index ceaa71d..771edb4 100644 (file)
@@ -5,7 +5,7 @@
  *                | (__| |_| |  _ <| |___
  *                 \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -112,13 +112,19 @@ static void _ldap_free_urldesc(LDAPURLDesc *ludp);
   #define LDAP_TRACE(x)   do { \
                             _ldap_trace("%u: ", __LINE__); \
                             _ldap_trace x; \
-                          } WHILE_FALSE
+                          } while(0)
 
   static void _ldap_trace(const char *fmt, ...);
 #else
   #define LDAP_TRACE(x)   Curl_nop_stmt
 #endif
 
+#if defined(USE_WIN32_LDAP) && defined(ldap_err2string)
+/* Use ansi error strings in UNICODE builds */
+#undef ldap_err2string
+#define ldap_err2string ldap_err2stringA
+#endif
+
 
 static CURLcode Curl_ldap(struct connectdata *conn, bool *done);
 
@@ -744,7 +750,7 @@ quit:
 #endif
 
   /* no data to transfer */
-  Curl_setup_transfer(conn, -1, -1, FALSE, NULL, -1, NULL);
+  Curl_setup_transfer(data, -1, -1, FALSE, -1);
   connclose(conn, "LDAP connection always disable re-use");
 
   return result;
@@ -838,15 +844,16 @@ static bool split_str(char *str, char ***out, size_t *count)
 static int _ldap_url_parse2(const struct connectdata *conn, LDAPURLDesc *ludp)
 {
   int rc = LDAP_SUCCESS;
-  char *path;
   char *p;
-  char *q;
+  char *path;
+  char *q = NULL;
+  char *query = NULL;
   size_t i;
 
   if(!conn->data ||
      !conn->data->state.up.path ||
      conn->data->state.up.path[0] != '/' ||
-     !strcasecompare("LDAP", conn->data->state.up.scheme))
+     !strncasecompare("LDAP", conn->data->state.up.scheme, 4))
     return LDAP_INVALID_SYNTAX;
 
   ludp->lud_scope = LDAP_SCOPE_BASE;
@@ -858,11 +865,16 @@ static int _ldap_url_parse2(const struct connectdata *conn, LDAPURLDesc *ludp)
   if(!path)
     return LDAP_NO_MEMORY;
 
-  /* Parse the DN (Distinguished Name) */
-  q = strchr(p, '?');
-  if(q)
-    *q++ = '\0';
+  /* Duplicate the query if present */
+  if(conn->data->state.up.query) {
+    q = query = strdup(conn->data->state.up.query);
+    if(!query) {
+      free(path);
+      return LDAP_NO_MEMORY;
+    }
+  }
 
+  /* Parse the DN (Distinguished Name) */
   if(*p) {
     char *dn = p;
     char *unescaped;
@@ -1039,6 +1051,7 @@ static int _ldap_url_parse2(const struct connectdata *conn, LDAPURLDesc *ludp)
 
 quit:
   free(path);
+  free(query);
 
   return rc;
 }
@@ -1064,8 +1077,6 @@ static int _ldap_url_parse(const struct connectdata *conn,
 
 static void _ldap_free_urldesc(LDAPURLDesc *ludp)
 {
-  size_t i;
-
   if(!ludp)
     return;
 
@@ -1073,6 +1084,7 @@ static void _ldap_free_urldesc(LDAPURLDesc *ludp)
   free(ludp->lud_filter);
 
   if(ludp->lud_attrs) {
+    size_t i;
     for(i = 0; i < ludp->lud_attrs_dups; i++)
       free(ludp->lud_attrs[i]);
     free(ludp->lud_attrs);
index 54d0480..236ec42 100644 (file)
@@ -15,7 +15,7 @@
        <string>se.haxx.curl.libcurl</string>
 
        <key>CFBundleVersion</key>
-       <string>7.62.0</string>
+       <string>7.68.0</string>
 
        <key>CFBundleName</key>
        <string>libcurl</string>
@@ -27,9 +27,9 @@
        <string>????</string>
 
        <key>CFBundleShortVersionString</key>
-       <string>libcurl 7.62.0</string>
+       <string>libcurl 7.68.0</string>
 
        <key>CFBundleGetInfoString</key>
-       <string>libcurl.plist 7.62.0</string>
+       <string>libcurl.plist 7.68.0</string>
 </dict>
 </plist>
index 3316fba..4839d0a 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
 #include <winver.h>
 #include "../include/curl/curlver.h"
 
-LANGUAGE  0x09,0x01
+LANGUAGE  0, 0
 
 #define RC_VERSION  LIBCURL_VERSION_MAJOR, LIBCURL_VERSION_MINOR, LIBCURL_VERSION_PATCH, 0
 
 VS_VERSION_INFO VERSIONINFO
   FILEVERSION     RC_VERSION
   PRODUCTVERSION  RC_VERSION
-  FILEFLAGSMASK   0x3fL
+  FILEFLAGSMASK   VS_FFI_FILEFLAGSMASK
 #if defined(DEBUGBUILD) || defined(_DEBUG)
-  FILEFLAGS 1
+  FILEFLAGS VS_FF_DEBUG
 #else
-  FILEFLAGS 0
+  FILEFLAGS 0L
 #endif
   FILEOS      VOS__WINDOWS32
   FILETYPE    VFT_DLL
-  FILESUBTYPE 0x0L
+  FILESUBTYPE 0L
 
 BEGIN
   BLOCK "StringFileInfo"
index b9d4c89..a5e2ecb 100644 (file)
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
index d350602..bbf8975 100644 (file)
--- a/lib/md4.c
+++ b/lib/md4.c
@@ -1,4 +1,223 @@
-/*
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+
+#include "curl_setup.h"
+
+#if !defined(CURL_DISABLE_CRYPTO_AUTH)
+
+#include "curl_md4.h"
+#include "warnless.h"
+
+#ifdef USE_OPENSSL
+#include <openssl/opensslconf.h>
+#endif
+#ifdef USE_MBEDTLS
+#include <mbedtls/config.h>
+#endif
+
+#if defined(USE_GNUTLS_NETTLE)
+
+#include <nettle/md4.h>
+
+#include "curl_memory.h"
+
+/* The last #include file should be: */
+#include "memdebug.h"
+
+typedef struct md4_ctx MD4_CTX;
+
+static void MD4_Init(MD4_CTX *ctx)
+{
+  md4_init(ctx);
+}
+
+static void MD4_Update(MD4_CTX *ctx, const void *data, unsigned long size)
+{
+  md4_update(ctx, size, data);
+}
+
+static void MD4_Final(unsigned char *result, MD4_CTX *ctx)
+{
+  md4_digest(ctx, MD4_DIGEST_SIZE, result);
+}
+
+#elif defined(USE_GNUTLS)
+
+#include <gcrypt.h>
+
+#include "curl_memory.h"
+/* The last #include file should be: */
+#include "memdebug.h"
+
+typedef struct gcry_md_hd_t MD4_CTX;
+
+static void MD4_Init(MD4_CTX *ctx)
+{
+  gcry_md_open(ctx, GCRY_MD_MD4, 0);
+}
+
+static void MD4_Update(MD4_CTX *ctx, const void *data, unsigned long size)
+{
+  gcry_md_write(*ctx, data, size);
+}
+
+static void MD4_Final(unsigned char *result, MD4_CTX *ctx)
+{
+  memcpy(result, gcry_md_read(ctx, 0), MD4_DIGEST_LENGTH);
+  gcry_md_close(ctx);
+}
+
+#elif defined(USE_OPENSSL) && !defined(OPENSSL_NO_MD4)
+/* When OpenSSL is available we use the MD4-functions from OpenSSL */
+#include <openssl/md4.h>
+
+#elif defined(USE_SECTRANSP)
+
+#include <CommonCrypto/CommonDigest.h>
+
+#include "curl_memory.h"
+/* The last #include file should be: */
+#include "memdebug.h"
+
+typedef struct {
+  void *data;
+  unsigned long size;
+} MD4_CTX;
+
+static void MD4_Init(MD4_CTX *ctx)
+{
+  ctx->data = NULL;
+  ctx->size = 0;
+}
+
+static void MD4_Update(MD4_CTX *ctx, const void *data, unsigned long size)
+{
+  if(ctx->data == NULL) {
+    ctx->data = malloc(size);
+    if(ctx->data != NULL) {
+      memcpy(ctx->data, data, size);
+      ctx->size = size;
+    }
+  }
+}
+
+static void MD4_Final(unsigned char *result, MD4_CTX *ctx)
+{
+  if(ctx->data != NULL) {
+    (void)CC_MD4(ctx->data, (CC_LONG) ctx->size, result);
+
+    Curl_safefree(ctx->data);
+    ctx->size = 0;
+  }
+}
+
+#elif defined(USE_WIN32_CRYPTO)
+
+#include <wincrypt.h>
+
+#include "curl_memory.h"
+ /* The last #include file should be: */
+#include "memdebug.h"
+
+typedef struct {
+  HCRYPTPROV hCryptProv;
+  HCRYPTHASH hHash;
+} MD4_CTX;
+
+static void MD4_Init(MD4_CTX *ctx)
+{
+  ctx->hCryptProv = 0;
+  ctx->hHash = 0;
+
+  if(CryptAcquireContext(&ctx->hCryptProv, NULL, NULL, PROV_RSA_FULL,
+                         CRYPT_VERIFYCONTEXT)) {
+    CryptCreateHash(ctx->hCryptProv, CALG_MD4, 0, 0, &ctx->hHash);
+  }
+}
+
+static void MD4_Update(MD4_CTX *ctx, const void *data, unsigned long size)
+{
+  CryptHashData(ctx->hHash, data, (unsigned int) size, 0);
+}
+
+static void MD4_Final(unsigned char *result, MD4_CTX *ctx)
+{
+  unsigned long length = 0;
+
+  CryptGetHashParam(ctx->hHash, HP_HASHVAL, NULL, &length, 0);
+  if(length == MD4_DIGEST_LENGTH)
+    CryptGetHashParam(ctx->hHash, HP_HASHVAL, result, &length, 0);
+
+  if(ctx->hHash)
+    CryptDestroyHash(ctx->hHash);
+
+  if(ctx->hCryptProv)
+    CryptReleaseContext(ctx->hCryptProv, 0);
+}
+
+#elif(defined(USE_MBEDTLS) && defined(MBEDTLS_MD4_C))
+
+#include <mbedtls/md4.h>
+
+#include "curl_memory.h"
+/* The last #include file should be: */
+#include "memdebug.h"
+
+typedef struct {
+  void *data;
+  unsigned long size;
+} MD4_CTX;
+
+static void MD4_Init(MD4_CTX *ctx)
+{
+  ctx->data = NULL;
+  ctx->size = 0;
+}
+
+static void MD4_Update(MD4_CTX *ctx, const void *data, unsigned long size)
+{
+  if(ctx->data == NULL) {
+    ctx->data = malloc(size);
+    if(ctx->data != NULL) {
+      memcpy(ctx->data, data, size);
+      ctx->size = size;
+    }
+  }
+}
+
+static void MD4_Final(unsigned char *result, MD4_CTX *ctx)
+{
+  if(ctx->data != NULL) {
+    mbedtls_md4(ctx->data, ctx->size, result);
+
+    Curl_safefree(ctx->data);
+    ctx->size = 0;
+  }
+}
+
+#else
+/* When no other crypto library is available, or the crypto library doesn't
+ * support MD4, we use this code segment this implementation of it
+ *
  * This is an OpenSSL-compatible implementation of the RSA Data Security, Inc.
  * MD4 Message-Digest Algorithm (RFC 1320).
  *
  * compile-time configuration.
  */
 
-#include "curl_setup.h"
-
-/* The NSS, OS/400 and sometimes mbed TLS crypto libraries do not provide the
- * MD4 hash algorithm, so we have a local implementation of it */
-#if defined(USE_NSS) || defined(USE_OS400CRYPTO) || \
-    (defined(USE_MBEDTLS) && !defined(MBEDTLS_MD4_C))
-
-#include "curl_md4.h"
-#include "warnless.h"
-
-#ifndef HAVE_OPENSSL
 
 #include <string.h>
 
@@ -112,7 +320,6 @@ static const void *body(MD4_CTX *ctx, const void *data, unsigned long size)
 {
   const unsigned char *ptr;
   MD4_u32plus a, b, c, d;
-  MD4_u32plus saved_a, saved_b, saved_c, saved_d;
 
   ptr = (const unsigned char *)data;
 
@@ -122,6 +329,8 @@ static const void *body(MD4_CTX *ctx, const void *data, unsigned long size)
   d = ctx->d;
 
   do {
+    MD4_u32plus saved_a, saved_b, saved_c, saved_d;
+
     saved_a = a;
     saved_b = b;
     saved_c = c;
@@ -129,59 +338,59 @@ static const void *body(MD4_CTX *ctx, const void *data, unsigned long size)
 
 /* Round 1 */
     STEP(F, a, b, c, d, SET(0), 3)
-      STEP(F, d, a, b, c, SET(1), 7)
-      STEP(F, c, d, a, b, SET(2), 11)
-      STEP(F, b, c, d, a, SET(3), 19)
-      STEP(F, a, b, c, d, SET(4), 3)
-      STEP(F, d, a, b, c, SET(5), 7)
-      STEP(F, c, d, a, b, SET(6), 11)
-      STEP(F, b, c, d, a, SET(7), 19)
-      STEP(F, a, b, c, d, SET(8), 3)
-      STEP(F, d, a, b, c, SET(9), 7)
-      STEP(F, c, d, a, b, SET(10), 11)
-      STEP(F, b, c, d, a, SET(11), 19)
-      STEP(F, a, b, c, d, SET(12), 3)
-      STEP(F, d, a, b, c, SET(13), 7)
-      STEP(F, c, d, a, b, SET(14), 11)
-      STEP(F, b, c, d, a, SET(15), 19)
+    STEP(F, d, a, b, c, SET(1), 7)
+    STEP(F, c, d, a, b, SET(2), 11)
+    STEP(F, b, c, d, a, SET(3), 19)
+    STEP(F, a, b, c, d, SET(4), 3)
+    STEP(F, d, a, b, c, SET(5), 7)
+    STEP(F, c, d, a, b, SET(6), 11)
+    STEP(F, b, c, d, a, SET(7), 19)
+    STEP(F, a, b, c, d, SET(8), 3)
+    STEP(F, d, a, b, c, SET(9), 7)
+    STEP(F, c, d, a, b, SET(10), 11)
+    STEP(F, b, c, d, a, SET(11), 19)
+    STEP(F, a, b, c, d, SET(12), 3)
+    STEP(F, d, a, b, c, SET(13), 7)
+    STEP(F, c, d, a, b, SET(14), 11)
+    STEP(F, b, c, d, a, SET(15), 19)
 
 /* Round 2 */
-      STEP(G, a, b, c, d, GET(0) + 0x5a827999, 3)
-      STEP(G, d, a, b, c, GET(4) + 0x5a827999, 5)
-      STEP(G, c, d, a, b, GET(8) + 0x5a827999, 9)
-      STEP(G, b, c, d, a, GET(12) + 0x5a827999, 13)
-      STEP(G, a, b, c, d, GET(1) + 0x5a827999, 3)
-      STEP(G, d, a, b, c, GET(5) + 0x5a827999, 5)
-      STEP(G, c, d, a, b, GET(9) + 0x5a827999, 9)
-      STEP(G, b, c, d, a, GET(13) + 0x5a827999, 13)
-      STEP(G, a, b, c, d, GET(2) + 0x5a827999, 3)
-      STEP(G, d, a, b, c, GET(6) + 0x5a827999, 5)
-      STEP(G, c, d, a, b, GET(10) + 0x5a827999, 9)
-      STEP(G, b, c, d, a, GET(14) + 0x5a827999, 13)
-      STEP(G, a, b, c, d, GET(3) + 0x5a827999, 3)
-      STEP(G, d, a, b, c, GET(7) + 0x5a827999, 5)
-      STEP(G, c, d, a, b, GET(11) + 0x5a827999, 9)
-      STEP(G, b, c, d, a, GET(15) + 0x5a827999, 13)
+    STEP(G, a, b, c, d, GET(0) + 0x5a827999, 3)
+    STEP(G, d, a, b, c, GET(4) + 0x5a827999, 5)
+    STEP(G, c, d, a, b, GET(8) + 0x5a827999, 9)
+    STEP(G, b, c, d, a, GET(12) + 0x5a827999, 13)
+    STEP(G, a, b, c, d, GET(1) + 0x5a827999, 3)
+    STEP(G, d, a, b, c, GET(5) + 0x5a827999, 5)
+    STEP(G, c, d, a, b, GET(9) + 0x5a827999, 9)
+    STEP(G, b, c, d, a, GET(13) + 0x5a827999, 13)
+    STEP(G, a, b, c, d, GET(2) + 0x5a827999, 3)
+    STEP(G, d, a, b, c, GET(6) + 0x5a827999, 5)
+    STEP(G, c, d, a, b, GET(10) + 0x5a827999, 9)
+    STEP(G, b, c, d, a, GET(14) + 0x5a827999, 13)
+    STEP(G, a, b, c, d, GET(3) + 0x5a827999, 3)
+    STEP(G, d, a, b, c, GET(7) + 0x5a827999, 5)
+    STEP(G, c, d, a, b, GET(11) + 0x5a827999, 9)
+    STEP(G, b, c, d, a, GET(15) + 0x5a827999, 13)
 
 /* Round 3 */
-      STEP(H, a, b, c, d, GET(0) + 0x6ed9eba1, 3)
-      STEP(H, d, a, b, c, GET(8) + 0x6ed9eba1, 9)
-      STEP(H, c, d, a, b, GET(4) + 0x6ed9eba1, 11)
-      STEP(H, b, c, d, a, GET(12) + 0x6ed9eba1, 15)
-      STEP(H, a, b, c, d, GET(2) + 0x6ed9eba1, 3)
-      STEP(H, d, a, b, c, GET(10) + 0x6ed9eba1, 9)
-      STEP(H, c, d, a, b, GET(6) + 0x6ed9eba1, 11)
-      STEP(H, b, c, d, a, GET(14) + 0x6ed9eba1, 15)
-      STEP(H, a, b, c, d, GET(1) + 0x6ed9eba1, 3)
-      STEP(H, d, a, b, c, GET(9) + 0x6ed9eba1, 9)
-      STEP(H, c, d, a, b, GET(5) + 0x6ed9eba1, 11)
-      STEP(H, b, c, d, a, GET(13) + 0x6ed9eba1, 15)
-      STEP(H, a, b, c, d, GET(3) + 0x6ed9eba1, 3)
-      STEP(H, d, a, b, c, GET(11) + 0x6ed9eba1, 9)
-      STEP(H, c, d, a, b, GET(7) + 0x6ed9eba1, 11)
-      STEP(H, b, c, d, a, GET(15) + 0x6ed9eba1, 15)
-
-      a += saved_a;
+    STEP(H, a, b, c, d, GET(0) + 0x6ed9eba1, 3)
+    STEP(H, d, a, b, c, GET(8) + 0x6ed9eba1, 9)
+    STEP(H, c, d, a, b, GET(4) + 0x6ed9eba1, 11)
+    STEP(H, b, c, d, a, GET(12) + 0x6ed9eba1, 15)
+    STEP(H, a, b, c, d, GET(2) + 0x6ed9eba1, 3)
+    STEP(H, d, a, b, c, GET(10) + 0x6ed9eba1, 9)
+    STEP(H, c, d, a, b, GET(6) + 0x6ed9eba1, 11)
+    STEP(H, b, c, d, a, GET(14) + 0x6ed9eba1, 15)
+    STEP(H, a, b, c, d, GET(1) + 0x6ed9eba1, 3)
+    STEP(H, d, a, b, c, GET(9) + 0x6ed9eba1, 9)
+    STEP(H, c, d, a, b, GET(5) + 0x6ed9eba1, 11)
+    STEP(H, b, c, d, a, GET(13) + 0x6ed9eba1, 15)
+    STEP(H, a, b, c, d, GET(3) + 0x6ed9eba1, 3)
+    STEP(H, d, a, b, c, GET(11) + 0x6ed9eba1, 9)
+    STEP(H, c, d, a, b, GET(7) + 0x6ed9eba1, 11)
+    STEP(H, b, c, d, a, GET(15) + 0x6ed9eba1, 15)
+
+    a += saved_a;
     b += saved_b;
     c += saved_c;
     d += saved_d;
@@ -211,7 +420,7 @@ static void MD4_Init(MD4_CTX *ctx)
 static void MD4_Update(MD4_CTX *ctx, const void *data, unsigned long size)
 {
   MD4_u32plus saved_lo;
-  unsigned long used, available;
+  unsigned long used;
 
   saved_lo = ctx->lo;
   ctx->lo = (saved_lo + size) & 0x1fffffff;
@@ -222,7 +431,7 @@ static void MD4_Update(MD4_CTX *ctx, const void *data, unsigned long size)
   used = saved_lo & 0x3f;
 
   if(used) {
-    available = 64 - used;
+    unsigned long available = 64 - used;
 
     if(size < available) {
       memcpy(&ctx->buffer[used], data, size);
@@ -294,7 +503,7 @@ static void MD4_Final(unsigned char *result, MD4_CTX *ctx)
   memset(ctx, 0, sizeof(*ctx));
 }
 
-#endif
+#endif /* CRYPTO LIBS */
 
 void Curl_md4it(unsigned char *output, const unsigned char *input, size_t len)
 {
@@ -303,5 +512,5 @@ void Curl_md4it(unsigned char *output, const unsigned char *input, size_t len)
   MD4_Update(&ctx, input, curlx_uztoui(len));
   MD4_Final(output, &ctx);
 }
-#endif /* defined(USE_NSS) || defined(USE_OS400CRYPTO) ||
-    (defined(USE_MBEDTLS) && !defined(MBEDTLS_MD4_C)) */
+
+#endif /* CURL_DISABLE_CRYPTO_AUTH */
index 45f45bb..2b81ca4 100644 (file)
--- a/lib/md5.c
+++ b/lib/md5.c
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
 
 typedef struct md5_ctx MD5_CTX;
 
-static void MD5_Init(MD5_CTX * ctx)
+static void MD5_Init(MD5_CTX *ctx)
 {
   md5_init(ctx);
 }
 
-static void MD5_Update(MD5_CTX * ctx,
+static void MD5_Update(MD5_CTX *ctx,
                        const unsigned char *input,
                        unsigned int inputLen)
 {
   md5_update(ctx, inputLen, input);
 }
 
-static void MD5_Final(unsigned char digest[16], MD5_CTX * ctx)
+static void MD5_Final(unsigned char digest[16], MD5_CTX *ctx)
 {
   md5_digest(ctx, 16, digest);
 }
@@ -65,25 +65,25 @@ static void MD5_Final(unsigned char digest[16], MD5_CTX * ctx)
 
 typedef gcry_md_hd_t MD5_CTX;
 
-static void MD5_Init(MD5_CTX * ctx)
+static void MD5_Init(MD5_CTX *ctx)
 {
   gcry_md_open(ctx, GCRY_MD_MD5, 0);
 }
 
-static void MD5_Update(MD5_CTX * ctx,
+static void MD5_Update(MD5_CTX *ctx,
                        const unsigned char *input,
                        unsigned int inputLen)
 {
   gcry_md_write(*ctx, input, inputLen);
 }
 
-static void MD5_Final(unsigned char digest[16], MD5_CTX * ctx)
+static void MD5_Final(unsigned char digest[16], MD5_CTX *ctx)
 {
   memcpy(digest, gcry_md_read(*ctx, 0), 16);
   gcry_md_close(*ctx);
 }
 
-#elif defined(USE_OPENSSL)
+#elif defined(USE_OPENSSL) && !defined(USE_AMISSL)
 /* When OpenSSL is available we use the MD5-function from OpenSSL */
 #include <openssl/md5.h>
 #include "curl_memory.h"
@@ -124,7 +124,7 @@ static void MD5_Final(unsigned char digest[16], MD5_CTX *ctx)
   CC_MD5_Final(digest, ctx);
 }
 
-#elif defined(_WIN32) && !defined(CURL_WINDOWS_APP)
+#elif defined(WIN32) && !defined(CURL_WINDOWS_APP)
 
 #include <wincrypt.h>
 #include "curl_memory.h"
@@ -163,13 +163,6 @@ static void MD5_Final(unsigned char digest[16], MD5_CTX *ctx)
     CryptReleaseContext(ctx->hCryptProv, 0);
 }
 
-#elif defined(USE_AXTLS)
-#include <axTLS/config.h>
-#include <axTLS/os_int.h>
-#include <axTLS/crypto.h>
-#include "curl_memory.h"
-/* The last #include file should be: */
-#include "memdebug.h"
 #else
 /* When no other crypto library is available we use this code segment */
 /*
@@ -282,7 +275,6 @@ static const void *body(MD5_CTX *ctx, const void *data, unsigned long size)
 {
   const unsigned char *ptr;
   MD5_u32plus a, b, c, d;
-  MD5_u32plus saved_a, saved_b, saved_c, saved_d;
 
   ptr = (const unsigned char *)data;
 
@@ -292,6 +284,8 @@ static const void *body(MD5_CTX *ctx, const void *data, unsigned long size)
   d = ctx->d;
 
   do {
+    MD5_u32plus saved_a, saved_b, saved_c, saved_d;
+
     saved_a = a;
     saved_b = b;
     saved_c = c;
@@ -299,77 +293,77 @@ static const void *body(MD5_CTX *ctx, const void *data, unsigned long size)
 
 /* Round 1 */
     STEP(F, a, b, c, d, SET(0), 0xd76aa478, 7)
-      STEP(F, d, a, b, c, SET(1), 0xe8c7b756, 12)
-      STEP(F, c, d, a, b, SET(2), 0x242070db, 17)
-      STEP(F, b, c, d, a, SET(3), 0xc1bdceee, 22)
-      STEP(F, a, b, c, d, SET(4), 0xf57c0faf, 7)
-      STEP(F, d, a, b, c, SET(5), 0x4787c62a, 12)
-      STEP(F, c, d, a, b, SET(6), 0xa8304613, 17)
-      STEP(F, b, c, d, a, SET(7), 0xfd469501, 22)
-      STEP(F, a, b, c, d, SET(8), 0x698098d8, 7)
-      STEP(F, d, a, b, c, SET(9), 0x8b44f7af, 12)
-      STEP(F, c, d, a, b, SET(10), 0xffff5bb1, 17)
-      STEP(F, b, c, d, a, SET(11), 0x895cd7be, 22)
-      STEP(F, a, b, c, d, SET(12), 0x6b901122, 7)
-      STEP(F, d, a, b, c, SET(13), 0xfd987193, 12)
-      STEP(F, c, d, a, b, SET(14), 0xa679438e, 17)
-      STEP(F, b, c, d, a, SET(15), 0x49b40821, 22)
+    STEP(F, d, a, b, c, SET(1), 0xe8c7b756, 12)
+    STEP(F, c, d, a, b, SET(2), 0x242070db, 17)
+    STEP(F, b, c, d, a, SET(3), 0xc1bdceee, 22)
+    STEP(F, a, b, c, d, SET(4), 0xf57c0faf, 7)
+    STEP(F, d, a, b, c, SET(5), 0x4787c62a, 12)
+    STEP(F, c, d, a, b, SET(6), 0xa8304613, 17)
+    STEP(F, b, c, d, a, SET(7), 0xfd469501, 22)
+    STEP(F, a, b, c, d, SET(8), 0x698098d8, 7)
+    STEP(F, d, a, b, c, SET(9), 0x8b44f7af, 12)
+    STEP(F, c, d, a, b, SET(10), 0xffff5bb1, 17)
+    STEP(F, b, c, d, a, SET(11), 0x895cd7be, 22)
+    STEP(F, a, b, c, d, SET(12), 0x6b901122, 7)
+    STEP(F, d, a, b, c, SET(13), 0xfd987193, 12)
+    STEP(F, c, d, a, b, SET(14), 0xa679438e, 17)
+    STEP(F, b, c, d, a, SET(15), 0x49b40821, 22)
 
 /* Round 2 */
-      STEP(G, a, b, c, d, GET(1), 0xf61e2562, 5)
-      STEP(G, d, a, b, c, GET(6), 0xc040b340, 9)
-      STEP(G, c, d, a, b, GET(11), 0x265e5a51, 14)
-      STEP(G, b, c, d, a, GET(0), 0xe9b6c7aa, 20)
-      STEP(G, a, b, c, d, GET(5), 0xd62f105d, 5)
-      STEP(G, d, a, b, c, GET(10), 0x02441453, 9)
-      STEP(G, c, d, a, b, GET(15), 0xd8a1e681, 14)
-      STEP(G, b, c, d, a, GET(4), 0xe7d3fbc8, 20)
-      STEP(G, a, b, c, d, GET(9), 0x21e1cde6, 5)
-      STEP(G, d, a, b, c, GET(14), 0xc33707d6, 9)
-      STEP(G, c, d, a, b, GET(3), 0xf4d50d87, 14)
-      STEP(G, b, c, d, a, GET(8), 0x455a14ed, 20)
-      STEP(G, a, b, c, d, GET(13), 0xa9e3e905, 5)
-      STEP(G, d, a, b, c, GET(2), 0xfcefa3f8, 9)
-      STEP(G, c, d, a, b, GET(7), 0x676f02d9, 14)
-      STEP(G, b, c, d, a, GET(12), 0x8d2a4c8a, 20)
+    STEP(G, a, b, c, d, GET(1), 0xf61e2562, 5)
+    STEP(G, d, a, b, c, GET(6), 0xc040b340, 9)
+    STEP(G, c, d, a, b, GET(11), 0x265e5a51, 14)
+    STEP(G, b, c, d, a, GET(0), 0xe9b6c7aa, 20)
+    STEP(G, a, b, c, d, GET(5), 0xd62f105d, 5)
+    STEP(G, d, a, b, c, GET(10), 0x02441453, 9)
+    STEP(G, c, d, a, b, GET(15), 0xd8a1e681, 14)
+    STEP(G, b, c, d, a, GET(4), 0xe7d3fbc8, 20)
+    STEP(G, a, b, c, d, GET(9), 0x21e1cde6, 5)
+    STEP(G, d, a, b, c, GET(14), 0xc33707d6, 9)
+    STEP(G, c, d, a, b, GET(3), 0xf4d50d87, 14)
+    STEP(G, b, c, d, a, GET(8), 0x455a14ed, 20)
+    STEP(G, a, b, c, d, GET(13), 0xa9e3e905, 5)
+    STEP(G, d, a, b, c, GET(2), 0xfcefa3f8, 9)
+    STEP(G, c, d, a, b, GET(7), 0x676f02d9, 14)
+    STEP(G, b, c, d, a, GET(12), 0x8d2a4c8a, 20)
 
 /* Round 3 */
-      STEP(H, a, b, c, d, GET(5), 0xfffa3942, 4)
-      STEP(H2, d, a, b, c, GET(8), 0x8771f681, 11)
-      STEP(H, c, d, a, b, GET(11), 0x6d9d6122, 16)
-      STEP(H2, b, c, d, a, GET(14), 0xfde5380c, 23)
-      STEP(H, a, b, c, d, GET(1), 0xa4beea44, 4)
-      STEP(H2, d, a, b, c, GET(4), 0x4bdecfa9, 11)
-      STEP(H, c, d, a, b, GET(7), 0xf6bb4b60, 16)
-      STEP(H2, b, c, d, a, GET(10), 0xbebfbc70, 23)
-      STEP(H, a, b, c, d, GET(13), 0x289b7ec6, 4)
-      STEP(H2, d, a, b, c, GET(0), 0xeaa127fa, 11)
-      STEP(H, c, d, a, b, GET(3), 0xd4ef3085, 16)
-      STEP(H2, b, c, d, a, GET(6), 0x04881d05, 23)
-      STEP(H, a, b, c, d, GET(9), 0xd9d4d039, 4)
-      STEP(H2, d, a, b, c, GET(12), 0xe6db99e5, 11)
-      STEP(H, c, d, a, b, GET(15), 0x1fa27cf8, 16)
-      STEP(H2, b, c, d, a, GET(2), 0xc4ac5665, 23)
+    STEP(H, a, b, c, d, GET(5), 0xfffa3942, 4)
+    STEP(H2, d, a, b, c, GET(8), 0x8771f681, 11)
+    STEP(H, c, d, a, b, GET(11), 0x6d9d6122, 16)
+    STEP(H2, b, c, d, a, GET(14), 0xfde5380c, 23)
+    STEP(H, a, b, c, d, GET(1), 0xa4beea44, 4)
+    STEP(H2, d, a, b, c, GET(4), 0x4bdecfa9, 11)
+    STEP(H, c, d, a, b, GET(7), 0xf6bb4b60, 16)
+    STEP(H2, b, c, d, a, GET(10), 0xbebfbc70, 23)
+    STEP(H, a, b, c, d, GET(13), 0x289b7ec6, 4)
+    STEP(H2, d, a, b, c, GET(0), 0xeaa127fa, 11)
+    STEP(H, c, d, a, b, GET(3), 0xd4ef3085, 16)
+    STEP(H2, b, c, d, a, GET(6), 0x04881d05, 23)
+    STEP(H, a, b, c, d, GET(9), 0xd9d4d039, 4)
+    STEP(H2, d, a, b, c, GET(12), 0xe6db99e5, 11)
+    STEP(H, c, d, a, b, GET(15), 0x1fa27cf8, 16)
+    STEP(H2, b, c, d, a, GET(2), 0xc4ac5665, 23)
 
 /* Round 4 */
-      STEP(I, a, b, c, d, GET(0), 0xf4292244, 6)
-      STEP(I, d, a, b, c, GET(7), 0x432aff97, 10)
-      STEP(I, c, d, a, b, GET(14), 0xab9423a7, 15)
-      STEP(I, b, c, d, a, GET(5), 0xfc93a039, 21)
-      STEP(I, a, b, c, d, GET(12), 0x655b59c3, 6)
-      STEP(I, d, a, b, c, GET(3), 0x8f0ccc92, 10)
-      STEP(I, c, d, a, b, GET(10), 0xffeff47d, 15)
-      STEP(I, b, c, d, a, GET(1), 0x85845dd1, 21)
-      STEP(I, a, b, c, d, GET(8), 0x6fa87e4f, 6)
-      STEP(I, d, a, b, c, GET(15), 0xfe2ce6e0, 10)
-      STEP(I, c, d, a, b, GET(6), 0xa3014314, 15)
-      STEP(I, b, c, d, a, GET(13), 0x4e0811a1, 21)
-      STEP(I, a, b, c, d, GET(4), 0xf7537e82, 6)
-      STEP(I, d, a, b, c, GET(11), 0xbd3af235, 10)
-      STEP(I, c, d, a, b, GET(2), 0x2ad7d2bb, 15)
-      STEP(I, b, c, d, a, GET(9), 0xeb86d391, 21)
-
-      a += saved_a;
+    STEP(I, a, b, c, d, GET(0), 0xf4292244, 6)
+    STEP(I, d, a, b, c, GET(7), 0x432aff97, 10)
+    STEP(I, c, d, a, b, GET(14), 0xab9423a7, 15)
+    STEP(I, b, c, d, a, GET(5), 0xfc93a039, 21)
+    STEP(I, a, b, c, d, GET(12), 0x655b59c3, 6)
+    STEP(I, d, a, b, c, GET(3), 0x8f0ccc92, 10)
+    STEP(I, c, d, a, b, GET(10), 0xffeff47d, 15)
+    STEP(I, b, c, d, a, GET(1), 0x85845dd1, 21)
+    STEP(I, a, b, c, d, GET(8), 0x6fa87e4f, 6)
+    STEP(I, d, a, b, c, GET(15), 0xfe2ce6e0, 10)
+    STEP(I, c, d, a, b, GET(6), 0xa3014314, 15)
+    STEP(I, b, c, d, a, GET(13), 0x4e0811a1, 21)
+    STEP(I, a, b, c, d, GET(4), 0xf7537e82, 6)
+    STEP(I, d, a, b, c, GET(11), 0xbd3af235, 10)
+    STEP(I, c, d, a, b, GET(2), 0x2ad7d2bb, 15)
+    STEP(I, b, c, d, a, GET(9), 0xeb86d391, 21)
+
+    a += saved_a;
     b += saved_b;
     c += saved_c;
     d += saved_d;
@@ -399,7 +393,7 @@ static void MD5_Init(MD5_CTX *ctx)
 static void MD5_Update(MD5_CTX *ctx, const void *data, unsigned long size)
 {
   MD5_u32plus saved_lo;
-  unsigned long used, available;
+  unsigned long used;
 
   saved_lo = ctx->lo;
   ctx->lo = (saved_lo + size) & 0x1fffffff;
@@ -410,7 +404,7 @@ static void MD5_Update(MD5_CTX *ctx, const void *data, unsigned long size)
   used = saved_lo & 0x3f;
 
   if(used) {
-    available = 64 - used;
+    unsigned long available = 64 - used;
 
     if(size < available) {
       memcpy(&ctx->buffer[used], data, size);
@@ -552,23 +546,23 @@ MD5_context *Curl_MD5_init(const MD5_params *md5params)
   return ctxt;
 }
 
-int Curl_MD5_update(MD5_context *context,
-                    const unsigned char *data,
-                    unsigned int len)
+CURLcode Curl_MD5_update(MD5_context *context,
+                         const unsigned char *data,
+                         unsigned int len)
 {
   (*context->md5_hash->md5_update_func)(context->md5_hashctx, data, len);
 
-  return 0;
+  return CURLE_OK;
 }
 
-int Curl_MD5_final(MD5_context *context, unsigned char *result)
+CURLcode Curl_MD5_final(MD5_context *context, unsigned char *result)
 {
   (*context->md5_hash->md5_final_func)(result, context->md5_hashctx);
 
   free(context->md5_hashctx);
   free(context);
 
-  return 0;
+  return CURLE_OK;
 }
 
 #endif /* CURL_DISABLE_CRYPTO_AUTH */
index 2b81c26..ede6009 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -100,30 +100,29 @@ struct memdebug {
  * Don't use these with multithreaded test programs!
  */
 
-#define logfile curl_debuglogfile
-FILE *curl_debuglogfile = NULL;
+FILE *curl_dbg_logfile = NULL;
 static bool memlimit = FALSE; /* enable memory limit */
 static long memsize = 0;  /* set number of mallocs allowed */
 
 /* this sets the log file name */
-void curl_memdebug(const char *logname)
+void curl_dbg_memdebug(const char *logname)
 {
-  if(!logfile) {
+  if(!curl_dbg_logfile) {
     if(logname && *logname)
-      logfile = fopen(logname, FOPEN_WRITETEXT);
+      curl_dbg_logfile = fopen(logname, FOPEN_WRITETEXT);
     else
-      logfile = stderr;
+      curl_dbg_logfile = stderr;
 #ifdef MEMDEBUG_LOG_SYNC
     /* Flush the log file after every line so the log isn't lost in a crash */
-    if(logfile)
-      setbuf(logfile, (char *)NULL);
+    if(curl_dbg_logfile)
+      setbuf(curl_dbg_logfile, (char *)NULL);
 #endif
   }
 }
 
 /* This function sets the number of malloc() calls that should return
    successfully! */
-void curl_memlimit(long limit)
+void curl_dbg_memlimit(long limit)
 {
   if(!memlimit) {
     memlimit = TRUE;
@@ -140,12 +139,12 @@ static bool countcheck(const char *func, int line, const char *source)
     if(!memsize) {
       if(source) {
         /* log to file */
-        curl_memlog("LIMIT %s:%d %s reached memlimit\n",
-                    source, line, func);
+        curl_dbg_log("LIMIT %s:%d %s reached memlimit\n",
+                     source, line, func);
         /* log to stderr also */
         fprintf(stderr, "LIMIT %s:%d %s reached memlimit\n",
                 source, line, func);
-        fflush(logfile); /* because it might crash now */
+        fflush(curl_dbg_logfile); /* because it might crash now */
       }
       errno = ENOMEM;
       return TRUE; /* RETURN ERROR! */
@@ -159,7 +158,7 @@ static bool countcheck(const char *func, int line, const char *source)
   return FALSE; /* allow this */
 }
 
-void *curl_domalloc(size_t wantedsize, int line, const char *source)
+void *curl_dbg_malloc(size_t wantedsize, int line, const char *source)
 {
   struct memdebug *mem;
   size_t size;
@@ -180,15 +179,15 @@ void *curl_domalloc(size_t wantedsize, int line, const char *source)
   }
 
   if(source)
-    curl_memlog("MEM %s:%d malloc(%zu) = %p\n",
-                source, line, wantedsize,
-                mem ? (void *)mem->mem : (void *)0);
+    curl_dbg_log("MEM %s:%d malloc(%zu) = %p\n",
+                 source, line, wantedsize,
+                 mem ? (void *)mem->mem : (void *)0);
 
   return (mem ? mem->mem : NULL);
 }
 
-void *curl_docalloc(size_t wanted_elements, size_t wanted_size,
-                    int line, const char *source)
+void *curl_dbg_calloc(size_t wanted_elements, size_t wanted_size,
+                      int line, const char *source)
 {
   struct memdebug *mem;
   size_t size, user_size;
@@ -208,14 +207,14 @@ void *curl_docalloc(size_t wanted_elements, size_t wanted_size,
     mem->size = user_size;
 
   if(source)
-    curl_memlog("MEM %s:%d calloc(%zu,%zu) = %p\n",
-                source, line, wanted_elements, wanted_size,
-                mem ? (void *)mem->mem : (void *)0);
+    curl_dbg_log("MEM %s:%d calloc(%zu,%zu) = %p\n",
+                 source, line, wanted_elements, wanted_size,
+                 mem ? (void *)mem->mem : (void *)0);
 
   return (mem ? mem->mem : NULL);
 }
 
-char *curl_dostrdup(const char *str, int line, const char *source)
+char *curl_dbg_strdup(const char *str, int line, const char *source)
 {
   char *mem;
   size_t len;
@@ -227,19 +226,19 @@ char *curl_dostrdup(const char *str, int line, const char *source)
 
   len = strlen(str) + 1;
 
-  mem = curl_domalloc(len, 0, NULL); /* NULL prevents logging */
+  mem = curl_dbg_malloc(len, 0, NULL); /* NULL prevents logging */
   if(mem)
     memcpy(mem, str, len);
 
   if(source)
-    curl_memlog("MEM %s:%d strdup(%p) (%zu) = %p\n",
-                source, line, (const void *)str, len, (const void *)mem);
+    curl_dbg_log("MEM %s:%d strdup(%p) (%zu) = %p\n",
+                 source, line, (const void *)str, len, (const void *)mem);
 
   return mem;
 }
 
 #if defined(WIN32) && defined(UNICODE)
-wchar_t *curl_dowcsdup(const wchar_t *str, int line, const char *source)
+wchar_t *curl_dbg_wcsdup(const wchar_t *str, int line, const char *source)
 {
   wchar_t *mem;
   size_t wsiz, bsiz;
@@ -252,12 +251,12 @@ wchar_t *curl_dowcsdup(const wchar_t *str, int line, const char *source)
   wsiz = wcslen(str) + 1;
   bsiz = wsiz * sizeof(wchar_t);
 
-  mem = curl_domalloc(bsiz, 0, NULL); /* NULL prevents logging */
+  mem = curl_dbg_malloc(bsiz, 0, NULL); /* NULL prevents logging */
   if(mem)
     memcpy(mem, str, bsiz);
 
   if(source)
-    curl_memlog("MEM %s:%d wcsdup(%p) (%zu) = %p\n",
+    curl_dbg_log("MEM %s:%d wcsdup(%p) (%zu) = %p\n",
                 source, line, (void *)str, bsiz, (void *)mem);
 
   return mem;
@@ -266,8 +265,8 @@ wchar_t *curl_dowcsdup(const wchar_t *str, int line, const char *source)
 
 /* We provide a realloc() that accepts a NULL as pointer, which then
    performs a malloc(). In order to work with ares. */
-void *curl_dorealloc(void *ptr, size_t wantedsize,
-                     int line, const char *source)
+void *curl_dbg_realloc(void *ptr, size_t wantedsize,
+                      int line, const char *source)
 {
   struct memdebug *mem = NULL;
 
@@ -293,7 +292,7 @@ void *curl_dorealloc(void *ptr, size_t wantedsize,
 
   mem = (Curl_crealloc)(mem, size);
   if(source)
-    curl_memlog("MEM %s:%d realloc(%p, %zu) = %p\n",
+    curl_dbg_log("MEM %s:%d realloc(%p, %zu) = %p\n",
                 source, line, (void *)ptr, wantedsize,
                 mem ? (void *)mem->mem : (void *)0);
 
@@ -305,11 +304,10 @@ void *curl_dorealloc(void *ptr, size_t wantedsize,
   return NULL;
 }
 
-void curl_dofree(void *ptr, int line, const char *source)
+void curl_dbg_free(void *ptr, int line, const char *source)
 {
-  struct memdebug *mem;
-
   if(ptr) {
+    struct memdebug *mem;
 
 #ifdef __INTEL_COMPILER
 #  pragma warning(push)
@@ -331,11 +329,11 @@ void curl_dofree(void *ptr, int line, const char *source)
   }
 
   if(source)
-    curl_memlog("MEM %s:%d free(%p)\n", source, line, (void *)ptr);
+    curl_dbg_log("MEM %s:%d free(%p)\n", source, line, (void *)ptr);
 }
 
-curl_socket_t curl_socket(int domain, int type, int protocol,
-                          int line, const char *source)
+curl_socket_t curl_dbg_socket(int domain, int type, int protocol,
+                             int line, const char *source)
 {
   const char *fmt = (sizeof(curl_socket_t) == sizeof(int)) ?
     "FD %s:%d socket() = %d\n" :
@@ -351,44 +349,44 @@ curl_socket_t curl_socket(int domain, int type, int protocol,
   sockfd = socket(domain, type, protocol);
 
   if(source && (sockfd != CURL_SOCKET_BAD))
-    curl_memlog(fmt, source, line, sockfd);
+    curl_dbg_log(fmt, source, line, sockfd);
 
   return sockfd;
 }
 
-SEND_TYPE_RETV curl_dosend(SEND_TYPE_ARG1 sockfd,
-                           SEND_QUAL_ARG2 SEND_TYPE_ARG2 buf,
-                           SEND_TYPE_ARG3 len, SEND_TYPE_ARG4 flags, int line,
-                           const char *source)
+SEND_TYPE_RETV curl_dbg_send(SEND_TYPE_ARG1 sockfd,
+                            SEND_QUAL_ARG2 SEND_TYPE_ARG2 buf,
+                            SEND_TYPE_ARG3 len, SEND_TYPE_ARG4 flags, int line,
+                            const char *source)
 {
   SEND_TYPE_RETV rc;
   if(countcheck("send", line, source))
     return -1;
   rc = send(sockfd, buf, len, flags);
   if(source)
-    curl_memlog("SEND %s:%d send(%lu) = %ld\n",
+    curl_dbg_log("SEND %s:%d send(%lu) = %ld\n",
                 source, line, (unsigned long)len, (long)rc);
   return rc;
 }
 
-RECV_TYPE_RETV curl_dorecv(RECV_TYPE_ARG1 sockfd, RECV_TYPE_ARG2 buf,
-                           RECV_TYPE_ARG3 len, RECV_TYPE_ARG4 flags, int line,
-                           const char *source)
+RECV_TYPE_RETV curl_dbg_recv(RECV_TYPE_ARG1 sockfd, RECV_TYPE_ARG2 buf,
+                            RECV_TYPE_ARG3 len, RECV_TYPE_ARG4 flags, int line,
+                            const char *source)
 {
   RECV_TYPE_RETV rc;
   if(countcheck("recv", line, source))
     return -1;
   rc = recv(sockfd, buf, len, flags);
   if(source)
-    curl_memlog("RECV %s:%d recv(%lu) = %ld\n",
+    curl_dbg_log("RECV %s:%d recv(%lu) = %ld\n",
                 source, line, (unsigned long)len, (long)rc);
   return rc;
 }
 
 #ifdef HAVE_SOCKETPAIR
-int curl_socketpair(int domain, int type, int protocol,
-                    curl_socket_t socket_vector[2],
-                    int line, const char *source)
+int curl_dbg_socketpair(int domain, int type, int protocol,
+                       curl_socket_t socket_vector[2],
+                       int line, const char *source)
 {
   const char *fmt = (sizeof(curl_socket_t) == sizeof(int)) ?
     "FD %s:%d socketpair() = %d %d\n" :
@@ -399,14 +397,14 @@ int curl_socketpair(int domain, int type, int protocol,
   int res = socketpair(domain, type, protocol, socket_vector);
 
   if(source && (0 == res))
-    curl_memlog(fmt, source, line, socket_vector[0], socket_vector[1]);
+    curl_dbg_log(fmt, source, line, socket_vector[0], socket_vector[1]);
 
   return res;
 }
 #endif
 
-curl_socket_t curl_accept(curl_socket_t s, void *saddr, void *saddrlen,
-                          int line, const char *source)
+curl_socket_t curl_dbg_accept(curl_socket_t s, void *saddr, void *saddrlen,
+                             int line, const char *source)
 {
   const char *fmt = (sizeof(curl_socket_t) == sizeof(int)) ?
     "FD %s:%d accept() = %d\n" :
@@ -420,13 +418,13 @@ curl_socket_t curl_accept(curl_socket_t s, void *saddr, void *saddrlen,
   curl_socket_t sockfd = accept(s, addr, addrlen);
 
   if(source && (sockfd != CURL_SOCKET_BAD))
-    curl_memlog(fmt, source, line, sockfd);
+    curl_dbg_log(fmt, source, line, sockfd);
 
   return sockfd;
 }
 
 /* separate function to allow libcurl to mark a "faked" close */
-void curl_mark_sclose(curl_socket_t sockfd, int line, const char *source)
+void curl_dbg_mark_sclose(curl_socket_t sockfd, int line, const char *source)
 {
   const char *fmt = (sizeof(curl_socket_t) == sizeof(int)) ?
     "FD %s:%d sclose(%d)\n":
@@ -435,54 +433,40 @@ void curl_mark_sclose(curl_socket_t sockfd, int line, const char *source)
     "FD %s:%d sclose(%zd)\n";
 
   if(source)
-    curl_memlog(fmt, source, line, sockfd);
+    curl_dbg_log(fmt, source, line, sockfd);
 }
 
 /* this is our own defined way to close sockets on *ALL* platforms */
-int curl_sclose(curl_socket_t sockfd, int line, const char *source)
+int curl_dbg_sclose(curl_socket_t sockfd, int line, const char *source)
 {
   int res = sclose(sockfd);
-  curl_mark_sclose(sockfd, line, source);
+  curl_dbg_mark_sclose(sockfd, line, source);
   return res;
 }
 
-FILE *curl_fopen(const char *file, const char *mode,
-                 int line, const char *source)
+FILE *curl_dbg_fopen(const char *file, const char *mode,
+                    int line, const char *source)
 {
   FILE *res = fopen(file, mode);
 
   if(source)
-    curl_memlog("FILE %s:%d fopen(\"%s\",\"%s\") = %p\n",
+    curl_dbg_log("FILE %s:%d fopen(\"%s\",\"%s\") = %p\n",
                 source, line, file, mode, (void *)res);
 
   return res;
 }
 
-#ifdef HAVE_FDOPEN
-FILE *curl_fdopen(int filedes, const char *mode,
-                  int line, const char *source)
-{
-  FILE *res = fdopen(filedes, mode);
-
-  if(source)
-    curl_memlog("FILE %s:%d fdopen(\"%d\",\"%s\") = %p\n",
-                source, line, filedes, mode, (void *)res);
-
-  return res;
-}
-#endif
-
-int curl_fclose(FILE *file, int line, const char *source)
+int curl_dbg_fclose(FILE *file, int line, const char *source)
 {
   int res;
 
   DEBUGASSERT(file != NULL);
 
-  res = fclose(file);
-
   if(source)
-    curl_memlog("FILE %s:%d fclose(%p)\n",
-                source, line, (void *)file);
+    curl_dbg_log("FILE %s:%d fclose(%p)\n",
+                 source, line, (void *)file);
+
+  res = fclose(file);
 
   return res;
 }
@@ -490,13 +474,13 @@ int curl_fclose(FILE *file, int line, const char *source)
 #define LOGLINE_BUFSIZE  1024
 
 /* this does the writing to the memory tracking log file */
-void curl_memlog(const char *format, ...)
+void curl_dbg_log(const char *format, ...)
 {
   char *buf;
   int nchars;
   va_list ap;
 
-  if(!logfile)
+  if(!curl_dbg_logfile)
     return;
 
   buf = (Curl_cmalloc)(LOGLINE_BUFSIZE);
@@ -504,14 +488,14 @@ void curl_memlog(const char *format, ...)
     return;
 
   va_start(ap, format);
-  nchars = vsnprintf(buf, LOGLINE_BUFSIZE, format, ap);
+  nchars = mvsnprintf(buf, LOGLINE_BUFSIZE, format, ap);
   va_end(ap);
 
   if(nchars > LOGLINE_BUFSIZE - 1)
     nchars = LOGLINE_BUFSIZE - 1;
 
   if(nchars > 0)
-    fwrite(buf, 1, (size_t)nchars, logfile);
+    fwrite(buf, 1, (size_t)nchars, curl_dbg_logfile);
 
   (Curl_cfree)(buf);
 }
index 233de65..7ca4426 100644 (file)
@@ -8,7 +8,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
 
 #define CURL_MT_LOGFNAME_BUFSIZE 512
 
-#define logfile curl_debuglogfile
-
-extern FILE *logfile;
+extern FILE *curl_dbg_logfile;
 
 /* memory functions */
-CURL_EXTERN void *curl_domalloc(size_t size, int line, const char *source);
-CURL_EXTERN void *curl_docalloc(size_t elements, size_t size, int line,
-                                const char *source);
-CURL_EXTERN void *curl_dorealloc(void *ptr, size_t size, int line,
-                                 const char *source);
-CURL_EXTERN void curl_dofree(void *ptr, int line, const char *source);
-CURL_EXTERN char *curl_dostrdup(const char *str, int line, const char *source);
-#if defined(WIN32) && defined(UNICODE)
-CURL_EXTERN wchar_t *curl_dowcsdup(const wchar_t *str, int line,
+CURL_EXTERN void *curl_dbg_malloc(size_t size, int line, const char *source);
+CURL_EXTERN void *curl_dbg_calloc(size_t elements, size_t size, int line,
+                                  const char *source);
+CURL_EXTERN void *curl_dbg_realloc(void *ptr, size_t size, int line,
                                    const char *source);
+CURL_EXTERN void curl_dbg_free(void *ptr, int line, const char *source);
+CURL_EXTERN char *curl_dbg_strdup(const char *str, int line, const char *src);
+#if defined(WIN32) && defined(UNICODE)
+CURL_EXTERN wchar_t *curl_dbg_wcsdup(const wchar_t *str, int line,
+                                     const char *source);
 #endif
 
-CURL_EXTERN void curl_memdebug(const char *logname);
-CURL_EXTERN void curl_memlimit(long limit);
-CURL_EXTERN void curl_memlog(const char *format, ...);
+CURL_EXTERN void curl_dbg_memdebug(const char *logname);
+CURL_EXTERN void curl_dbg_memlimit(long limit);
+CURL_EXTERN void curl_dbg_log(const char *format, ...);
 
 /* file descriptor manipulators */
-CURL_EXTERN curl_socket_t curl_socket(int domain, int type, int protocol,
-                                      int line, const char *source);
-CURL_EXTERN void curl_mark_sclose(curl_socket_t sockfd,
-                                  int line, const char *source);
-CURL_EXTERN int curl_sclose(curl_socket_t sockfd,
-                            int line, const char *source);
-CURL_EXTERN curl_socket_t curl_accept(curl_socket_t s, void *a, void *alen,
+CURL_EXTERN curl_socket_t curl_dbg_socket(int domain, int type, int protocol,
+                                          int line, const char *source);
+CURL_EXTERN void curl_dbg_mark_sclose(curl_socket_t sockfd,
                                       int line, const char *source);
-#ifdef HAVE_SOCKETPAIR
-CURL_EXTERN int curl_socketpair(int domain, int type, int protocol,
-                                curl_socket_t socket_vector[2],
+CURL_EXTERN int curl_dbg_sclose(curl_socket_t sockfd,
                                 int line, const char *source);
+CURL_EXTERN curl_socket_t curl_dbg_accept(curl_socket_t s, void *a, void *alen,
+                                          int line, const char *source);
+#ifdef HAVE_SOCKETPAIR
+CURL_EXTERN int curl_dbg_socketpair(int domain, int type, int protocol,
+                                    curl_socket_t socket_vector[2],
+                                    int line, const char *source);
 #endif
 
 /* send/receive sockets */
-CURL_EXTERN SEND_TYPE_RETV curl_dosend(SEND_TYPE_ARG1 sockfd,
-                                       SEND_QUAL_ARG2 SEND_TYPE_ARG2 buf,
-                                       SEND_TYPE_ARG3 len,
-                                       SEND_TYPE_ARG4 flags, int line,
-                                       const char *source);
-CURL_EXTERN RECV_TYPE_RETV curl_dorecv(RECV_TYPE_ARG1 sockfd,
-                                       RECV_TYPE_ARG2 buf, RECV_TYPE_ARG3 len,
-                                       RECV_TYPE_ARG4 flags, int line,
-                                       const char *source);
+CURL_EXTERN SEND_TYPE_RETV curl_dbg_send(SEND_TYPE_ARG1 sockfd,
+                                         SEND_QUAL_ARG2 SEND_TYPE_ARG2 buf,
+                                         SEND_TYPE_ARG3 len,
+                                         SEND_TYPE_ARG4 flags, int line,
+                                         const char *source);
+CURL_EXTERN RECV_TYPE_RETV curl_dbg_recv(RECV_TYPE_ARG1 sockfd,
+                                         RECV_TYPE_ARG2 buf,
+                                         RECV_TYPE_ARG3 len,
+                                         RECV_TYPE_ARG4 flags, int line,
+                                         const char *source);
 
 /* FILE functions */
-CURL_EXTERN FILE *curl_fopen(const char *file, const char *mode, int line,
-                             const char *source);
-#ifdef HAVE_FDOPEN
-CURL_EXTERN FILE *curl_fdopen(int filedes, const char *mode, int line,
-                              const char *source);
-#endif
-CURL_EXTERN int curl_fclose(FILE *file, int line, const char *source);
+CURL_EXTERN FILE *curl_dbg_fopen(const char *file, const char *mode, int line,
+                                 const char *source);
+CURL_EXTERN int curl_dbg_fclose(FILE *file, int line, const char *source);
 
 #ifndef MEMDEBUG_NODEFINES
 
 /* Set this symbol on the command-line, recompile all lib-sources */
 #undef strdup
-#define strdup(ptr) curl_dostrdup(ptr, __LINE__, __FILE__)
-#define malloc(size) curl_domalloc(size, __LINE__, __FILE__)
-#define calloc(nbelem,size) curl_docalloc(nbelem, size, __LINE__, __FILE__)
-#define realloc(ptr,size) curl_dorealloc(ptr, size, __LINE__, __FILE__)
-#define free(ptr) curl_dofree(ptr, __LINE__, __FILE__)
-#define send(a,b,c,d) curl_dosend(a,b,c,d, __LINE__, __FILE__)
-#define recv(a,b,c,d) curl_dorecv(a,b,c,d, __LINE__, __FILE__)
+#define strdup(ptr) curl_dbg_strdup(ptr, __LINE__, __FILE__)
+#define malloc(size) curl_dbg_malloc(size, __LINE__, __FILE__)
+#define calloc(nbelem,size) curl_dbg_calloc(nbelem, size, __LINE__, __FILE__)
+#define realloc(ptr,size) curl_dbg_realloc(ptr, size, __LINE__, __FILE__)
+#define free(ptr) curl_dbg_free(ptr, __LINE__, __FILE__)
+#define send(a,b,c,d) curl_dbg_send(a,b,c,d, __LINE__, __FILE__)
+#define recv(a,b,c,d) curl_dbg_recv(a,b,c,d, __LINE__, __FILE__)
 
 #ifdef WIN32
 #  ifdef UNICODE
 #    undef wcsdup
-#    define wcsdup(ptr) curl_dowcsdup(ptr, __LINE__, __FILE__)
+#    define wcsdup(ptr) curl_dbg_wcsdup(ptr, __LINE__, __FILE__)
 #    undef _wcsdup
-#    define _wcsdup(ptr) curl_dowcsdup(ptr, __LINE__, __FILE__)
+#    define _wcsdup(ptr) curl_dbg_wcsdup(ptr, __LINE__, __FILE__)
 #    undef _tcsdup
-#    define _tcsdup(ptr) curl_dowcsdup(ptr, __LINE__, __FILE__)
+#    define _tcsdup(ptr) curl_dbg_wcsdup(ptr, __LINE__, __FILE__)
 #  else
 #    undef _tcsdup
-#    define _tcsdup(ptr) curl_dostrdup(ptr, __LINE__, __FILE__)
+#    define _tcsdup(ptr) curl_dbg_strdup(ptr, __LINE__, __FILE__)
 #  endif
 #endif
 
 #undef socket
 #define socket(domain,type,protocol)\
- curl_socket(domain, type, protocol, __LINE__, __FILE__)
+ curl_dbg_socket(domain, type, protocol, __LINE__, __FILE__)
 #undef accept /* for those with accept as a macro */
 #define accept(sock,addr,len)\
- curl_accept(sock, addr, len, __LINE__, __FILE__)
+ curl_dbg_accept(sock, addr, len, __LINE__, __FILE__)
 #ifdef HAVE_SOCKETPAIR
 #define socketpair(domain,type,protocol,socket_vector)\
- curl_socketpair(domain, type, protocol, socket_vector, __LINE__, __FILE__)
+ curl_dbg_socketpair(domain, type, protocol, socket_vector, __LINE__, __FILE__)
 #endif
 
 #ifdef HAVE_GETADDRINFO
@@ -129,31 +124,31 @@ CURL_EXTERN int curl_fclose(FILE *file, int line, const char *source);
    our macro as for other platforms. Instead, we redefine the new name they
    define getaddrinfo to become! */
 #define ogetaddrinfo(host,serv,hint,res) \
-  curl_dogetaddrinfo(host, serv, hint, res, __LINE__, __FILE__)
+  curl_dbg_getaddrinfo(host, serv, hint, res, __LINE__, __FILE__)
 #else
 #undef getaddrinfo
 #define getaddrinfo(host,serv,hint,res) \
-  curl_dogetaddrinfo(host, serv, hint, res, __LINE__, __FILE__)
+  curl_dbg_getaddrinfo(host, serv, hint, res, __LINE__, __FILE__)
 #endif
 #endif /* HAVE_GETADDRINFO */
 
 #ifdef HAVE_FREEADDRINFO
 #undef freeaddrinfo
 #define freeaddrinfo(data) \
-  curl_dofreeaddrinfo(data, __LINE__, __FILE__)
+  curl_dbg_freeaddrinfo(data, __LINE__, __FILE__)
 #endif /* HAVE_FREEADDRINFO */
 
 /* sclose is probably already defined, redefine it! */
 #undef sclose
-#define sclose(sockfd) curl_sclose(sockfd,__LINE__,__FILE__)
+#define sclose(sockfd) curl_dbg_sclose(sockfd,__LINE__,__FILE__)
 
-#define fake_sclose(sockfd) curl_mark_sclose(sockfd,__LINE__,__FILE__)
+#define fake_sclose(sockfd) curl_dbg_mark_sclose(sockfd,__LINE__,__FILE__)
 
 #undef fopen
-#define fopen(file,mode) curl_fopen(file,mode,__LINE__,__FILE__)
+#define fopen(file,mode) curl_dbg_fopen(file,mode,__LINE__,__FILE__)
 #undef fdopen
-#define fdopen(file,mode) curl_fdopen(file,mode,__LINE__,__FILE__)
-#define fclose(file) curl_fclose(file,__LINE__,__FILE__)
+#define fdopen(file,mode) curl_dbg_fdopen(file,mode,__LINE__,__FILE__)
+#define fclose(file) curl_dbg_fclose(file,__LINE__,__FILE__)
 
 #endif /* MEMDEBUG_NODEFINES */
 
@@ -174,6 +169,6 @@ CURL_EXTERN int curl_fclose(FILE *file, int line, const char *source);
  */
 
 #define Curl_safefree(ptr) \
-  do { free((ptr)); (ptr) = NULL;} WHILE_FALSE
+  do { free((ptr)); (ptr) = NULL;} while(0)
 
 #endif /* HEADER_CURL_MEMDEBUG_H */
index ca492d1..081e51e 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -29,8 +29,8 @@
 #include "urldata.h"
 #include "sendf.h"
 
-#if !defined(CURL_DISABLE_HTTP) || !defined(CURL_DISABLE_SMTP) || \
-    !defined(CURL_DISABLE_IMAP)
+#if (!defined(CURL_DISABLE_HTTP) && !defined(CURL_DISABLE_MIME)) || \
+  !defined(CURL_DISABLE_SMTP) || !defined(CURL_DISABLE_IMAP)
 
 #if defined(HAVE_LIBGEN_H) && defined(HAVE_BASENAME)
 #include <libgen.h>
@@ -821,8 +821,10 @@ static size_t readback_part(curl_mimepart *part,
     struct curl_slist *hdr = (struct curl_slist *) part->state.ptr;
     switch(part->state.state) {
     case MIMESTATE_BEGIN:
-      mimesetstate(&part->state, part->flags & MIME_BODY_ONLY? MIMESTATE_BODY:
-                                 MIMESTATE_CURLHEADERS, part->curlheaders);
+      mimesetstate(&part->state,
+                   (part->flags & MIME_BODY_ONLY)?
+                     MIMESTATE_BODY: MIMESTATE_CURLHEADERS,
+                   part->curlheaders);
       break;
     case MIMESTATE_USERHEADERS:
       if(!hdr) {
@@ -1122,8 +1124,6 @@ void curl_mime_free(curl_mime *mime)
       Curl_mime_cleanpart(part);
       free(part);
     }
-
-    free(mime->boundary);
     free(mime);
   }
 }
@@ -1135,6 +1135,8 @@ CURLcode Curl_mime_duppart(curl_mimepart *dst, const curl_mimepart *src)
   const curl_mimepart *s;
   CURLcode res = CURLE_OK;
 
+  DEBUGASSERT(dst);
+
   /* Duplicate content. */
   switch(src->kind) {
   case MIMEKIND_NONE:
@@ -1184,20 +1186,18 @@ CURLcode Curl_mime_duppart(curl_mimepart *dst, const curl_mimepart *src)
     }
   }
 
-  /* Duplicate other fields. */
-  if(dst != NULL)
+  if(!res) {
+    /* Duplicate other fields. */
     dst->encoder = src->encoder;
-  else
-    res = CURLE_WRITE_ERROR;
-  if(!res)
     res = curl_mime_type(dst, src->mimetype);
+  }
   if(!res)
     res = curl_mime_name(dst, src->name);
   if(!res)
     res = curl_mime_filename(dst, src->filename);
 
   /* If an error occurred, rollback. */
-  if(res && dst)
+  if(res)
     Curl_mime_cleanpart(dst);
 
   return res;
@@ -1220,18 +1220,10 @@ curl_mime *curl_mime_init(struct Curl_easy *easy)
     mime->firstpart = NULL;
     mime->lastpart = NULL;
 
-    /* Get a part boundary. */
-    mime->boundary = malloc(24 + MIME_RAND_BOUNDARY_CHARS + 1);
-    if(!mime->boundary) {
-      free(mime);
-      return NULL;
-    }
-
     memset(mime->boundary, '-', 24);
-    if(Curl_rand_hex(easy, (unsigned char *) mime->boundary + 24,
+    if(Curl_rand_hex(easy, (unsigned char *) &mime->boundary[24],
                      MIME_RAND_BOUNDARY_CHARS + 1)) {
       /* failed to get random separator, bail out */
-      free(mime->boundary);
       free(mime);
       return NULL;
     }
@@ -1909,72 +1901,11 @@ CURLcode curl_mime_headers(curl_mimepart *part,
   return CURLE_NOT_BUILT_IN;
 }
 
-void Curl_mime_initpart(curl_mimepart *part, struct Curl_easy *easy)
-{
-  (void) part;
-  (void) easy;
-}
-
-void Curl_mime_cleanpart(curl_mimepart *part)
-{
-  (void) part;
-}
-
-CURLcode Curl_mime_duppart(curl_mimepart *dst, const curl_mimepart *src)
-{
-  (void) dst;
-  (void) src;
-  return CURLE_OK;    /* Nothing to duplicate: always succeed. */
-}
-
-CURLcode Curl_mime_set_subparts(curl_mimepart *part,
-                                curl_mime *subparts, int take_ownership)
-{
-  (void) part;
-  (void) subparts;
-  (void) take_ownership;
-  return CURLE_NOT_BUILT_IN;
-}
-
-CURLcode Curl_mime_prepare_headers(curl_mimepart *part,
-                                   const char *contenttype,
-                                   const char *disposition,
-                                   enum mimestrategy strategy)
-{
-  (void) part;
-  (void) contenttype;
-  (void) disposition;
-  (void) strategy;
-  return CURLE_NOT_BUILT_IN;
-}
-
-curl_off_t Curl_mime_size(curl_mimepart *part)
-{
-  (void) part;
-  return (curl_off_t) -1;
-}
-
-size_t Curl_mime_read(char *buffer, size_t size, size_t nitems, void *instream)
-{
-  (void) buffer;
-  (void) size;
-  (void) nitems;
-  (void) instream;
-  return 0;
-}
-
-CURLcode Curl_mime_rewind(curl_mimepart *part)
-{
-  (void) part;
-  return CURLE_NOT_BUILT_IN;
-}
-
-/* VARARGS2 */
 CURLcode Curl_mime_add_header(struct curl_slist **slp, const char *fmt, ...)
 {
-  (void) slp;
-  (void) fmt;
+  (void)slp;
+  (void)fmt;
   return CURLE_NOT_BUILT_IN;
 }
 
-#endif /* !CURL_DISABLE_HTTP || !CURL_DISABLE_SMTP || !CURL_DISABLE_IMAP */
+#endif /* if disabled */
index 4d5c704..3241fdc 100644 (file)
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -22,6 +22,8 @@
  *
  ***************************************************************************/
 
+#include "curl_setup.h"
+
 #define MIME_RAND_BOUNDARY_CHARS        16  /* Nb. of random boundary chars. */
 #define MAX_ENCODED_LINE_LENGTH         76  /* Maximum encoded line length. */
 #define ENCODING_BUFFER_SIZE            256 /* Encoding temp buffers size. */
@@ -69,7 +71,7 @@ enum mimestrategy {
 typedef struct {
   const char *   name;          /* Encoding name. */
   size_t         (*encodefunc)(char *buffer, size_t size, bool ateof,
-                             curl_mimepart *part);  /* Encoded read. */
+                               curl_mimepart *part);  /* Encoded read. */
   curl_off_t     (*sizefunc)(curl_mimepart *part);  /* Encoded size. */
 }  mime_encoder;
 
@@ -88,13 +90,16 @@ typedef struct {
   size_t offset;              /* State-dependent offset. */
 }  mime_state;
 
+/* minimum buffer size for the boundary string */
+#define MIME_BOUNDARY_LEN (24 + MIME_RAND_BOUNDARY_CHARS + 1)
+
 /* A mime multipart. */
 struct curl_mime_s {
   struct Curl_easy *easy;          /* The associated easy handle. */
   curl_mimepart *parent;           /* Parent part. */
   curl_mimepart *firstpart;        /* First part. */
   curl_mimepart *lastpart;         /* Last part. */
-  char *boundary;                  /* The part boundary. */
+  char boundary[MIME_BOUNDARY_LEN]; /* The part boundary. */
   mime_state state;                /* Current readback state. */
 };
 
@@ -122,6 +127,10 @@ struct curl_mimepart_s {
   mime_encoder_state encstate;     /* Data encoder state. */
 };
 
+CURLcode Curl_mime_add_header(struct curl_slist **slp, const char *fmt, ...);
+
+#if (!defined(CURL_DISABLE_HTTP) && !defined(CURL_DISABLE_MIME)) ||     \
+  !defined(CURL_DISABLE_SMTP) || !defined(CURL_DISABLE_IMAP)
 
 /* Prototypes. */
 void Curl_mime_initpart(curl_mimepart *part, struct Curl_easy *easy);
@@ -137,7 +146,19 @@ curl_off_t Curl_mime_size(curl_mimepart *part);
 size_t Curl_mime_read(char *buffer, size_t size, size_t nitems,
                       void *instream);
 CURLcode Curl_mime_rewind(curl_mimepart *part);
-CURLcode Curl_mime_add_header(struct curl_slist **slp, const char *fmt, ...);
 const char *Curl_mime_contenttype(const char *filename);
 
+#else
+/* if disabled */
+#define Curl_mime_initpart(x,y)
+#define Curl_mime_cleanpart(x)
+#define Curl_mime_duppart(x,y) CURLE_OK /* Nothing to duplicate. Succeed */
+#define Curl_mime_set_subparts(a,b,c) CURLE_NOT_BUILT_IN
+#define Curl_mime_prepare_headers(a,b,c,d) CURLE_NOT_BUILT_IN
+#define Curl_mime_size(x) (curl_off_t) -1
+#define Curl_mime_read NULL
+#define Curl_mime_rewind(x) ((void)x, CURLE_NOT_BUILT_IN)
+#endif
+
+
 #endif /* HEADER_CURL_MIME_H */
index d2d91d7..bc00913 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1999 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1999 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -104,7 +104,7 @@ static const char upper_digits[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
       done++; \
     else \
      return done; /* return immediately on failure */ \
-  } WHILE_FALSE
+  } while(0)
 
 /* Data type to read from the arglist */
 typedef enum {
@@ -835,7 +835,7 @@ static int dprintf_formatf(
           while(width-- > 0)
             OUTCHAR(' ');
 
-        while((len-- > 0) && *str)
+        for(; len && *str; len--)
           OUTCHAR(*str++);
         if(p->flags&FLAGS_LEFT)
           while(width-- > 0)
index 0db2a97..6d819b4 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
 #include "speedcheck.h"
 #include "conncache.h"
 #include "multihandle.h"
-#include "pipeline.h"
 #include "sigpipe.h"
 #include "vtls/vtls.h"
 #include "connect.h"
 #include "http_proxy.h"
+#include "http2.h"
+#include "socketpair.h"
 /* The last 3 #include files should be in this order */
 #include "curl_printf.h"
 #include "curl_memory.h"
 
 static CURLMcode singlesocket(struct Curl_multi *multi,
                               struct Curl_easy *data);
-static int update_timer(struct Curl_multi *multi);
-
 static CURLMcode add_next_timeout(struct curltime now,
                                   struct Curl_multi *multi,
                                   struct Curl_easy *d);
 static CURLMcode multi_timeout(struct Curl_multi *multi,
                                long *timeout_ms);
 static void process_pending_handles(struct Curl_multi *multi);
+static void detach_connnection(struct Curl_easy *data);
 
 #ifdef DEBUGBUILD
 static const char * const statename[]={
@@ -90,12 +90,10 @@ static const char * const statename[]={
   "WAITPROXYCONNECT",
   "SENDPROTOCONNECT",
   "PROTOCONNECT",
-  "WAITDO",
   "DO",
   "DOING",
   "DO_MORE",
   "DO_DONE",
-  "WAITPERFORM",
   "PERFORM",
   "TOOFAST",
   "DONE",
@@ -113,7 +111,7 @@ static void Curl_init_completed(struct Curl_easy *data)
 
   /* Important: reset the conn pointer so that we don't point to memory
      that could be freed anytime */
-  data->easy_conn = NULL;
+  detach_connnection(data);
   Curl_expire_clear(data); /* stop all timers */
 }
 
@@ -134,12 +132,10 @@ static void mstate(struct Curl_easy *data, CURLMstate state
     NULL,              /* WAITPROXYCONNECT */
     NULL,              /* SENDPROTOCONNECT */
     NULL,              /* PROTOCONNECT */
-    NULL,              /* WAITDO */
     Curl_connect_free, /* DO */
     NULL,              /* DOING */
     NULL,              /* DO_MORE */
     NULL,              /* DO_DONE */
-    NULL,              /* WAITPERFORM */
     NULL,              /* PERFORM */
     NULL,              /* TOOFAST */
     NULL,              /* DONE */
@@ -162,8 +158,8 @@ static void mstate(struct Curl_easy *data, CURLMstate state
      data->mstate < CURLM_STATE_COMPLETED) {
     long connection_id = -5000;
 
-    if(data->easy_conn)
-      connection_id = data->easy_conn->connection_id;
+    if(data->conn)
+      connection_id = data->conn->connection_id;
 
     infof(data,
           "STATE: %s => %s handle %p; line %d (connection #%ld)\n",
@@ -188,14 +184,17 @@ static void mstate(struct Curl_easy *data, CURLMstate state
 #endif
 
 /*
- * We add one of these structs to the sockhash for a particular socket
+ * We add one of these structs to the sockhash for each socket
  */
 
 struct Curl_sh_entry {
-  struct Curl_easy *easy;
-  int action;  /* what action READ/WRITE this socket waits for */
-  curl_socket_t socket; /* mainly to ease debugging */
+  struct curl_hash transfers; /* hash of transfers using this socket */
+  unsigned int action;  /* what combined action READ/WRITE this socket waits
+                           for */
   void *socketp; /* settable by users with curl_multi_assign() */
+  unsigned int users; /* number of transfers using this */
+  unsigned int readers; /* this many transfers want to read */
+  unsigned int writers; /* this many transfers want to write */
 };
 /* bits for 'action' having no bits means this socket is not expecting any
    action */
@@ -206,34 +205,62 @@ struct Curl_sh_entry {
 static struct Curl_sh_entry *sh_getentry(struct curl_hash *sh,
                                          curl_socket_t s)
 {
-  if(s != CURL_SOCKET_BAD)
+  if(s != CURL_SOCKET_BAD) {
     /* only look for proper sockets */
     return Curl_hash_pick(sh, (char *)&s, sizeof(curl_socket_t));
+  }
   return NULL;
 }
 
+#define TRHASH_SIZE 13
+static size_t trhash(void *key, size_t key_length, size_t slots_num)
+{
+  size_t keyval = (size_t)*(struct Curl_easy **)key;
+  (void) key_length;
+
+  return (keyval % slots_num);
+}
+
+static size_t trhash_compare(void *k1, size_t k1_len, void *k2, size_t k2_len)
+{
+  (void)k1_len;
+  (void)k2_len;
+
+  return *(struct Curl_easy **)k1 == *(struct Curl_easy **)k2;
+}
+
+static void trhash_dtor(void *nada)
+{
+  (void)nada;
+}
+
+
 /* make sure this socket is present in the hash for this handle */
 static struct Curl_sh_entry *sh_addentry(struct curl_hash *sh,
-                                         curl_socket_t s,
-                                         struct Curl_easy *data)
+                                         curl_socket_t s)
 {
   struct Curl_sh_entry *there = sh_getentry(sh, s);
   struct Curl_sh_entry *check;
 
-  if(there)
+  if(there) {
     /* it is present, return fine */
     return there;
+  }
 
   /* not present, add it */
   check = calloc(1, sizeof(struct Curl_sh_entry));
   if(!check)
     return NULL; /* major failure */
 
-  check->easy = data;
-  check->socket = s;
+  if(Curl_hash_init(&check->transfers, TRHASH_SIZE, trhash,
+                    trhash_compare, trhash_dtor)) {
+    free(check);
+    return NULL;
+  }
 
   /* make/add new hash entry */
   if(!Curl_hash_add(sh, (char *)&s, sizeof(curl_socket_t), check)) {
+    Curl_hash_destroy(&check->transfers);
     free(check);
     return NULL; /* major failure */
   }
@@ -243,8 +270,11 @@ static struct Curl_sh_entry *sh_addentry(struct curl_hash *sh,
 
 
 /* delete the given socket + handle from the hash */
-static void sh_delentry(struct curl_hash *sh, curl_socket_t s)
+static void sh_delentry(struct Curl_sh_entry *entry,
+                        struct curl_hash *sh, curl_socket_t s)
 {
+  Curl_hash_destroy(&entry->transfers);
+
   /* We remove the hash entry. This will end up in a call to
      sh_freeentry(). */
   Curl_hash_delete(sh, (char *)&s, sizeof(curl_socket_t));
@@ -313,17 +343,6 @@ static CURLMcode multi_addmsg(struct Curl_multi *multi,
   return CURLM_OK;
 }
 
-/*
- * multi_freeamsg()
- *
- * Callback used by the llist system when a single list entry is destroyed.
- */
-static void multi_freeamsg(void *a, void *b)
-{
-  (void)a;
-  (void)b;
-}
-
 struct Curl_multi *Curl_multi_handle(int hashsize, /* socket hash */
                                      int chashsize) /* connection hash */
 {
@@ -343,14 +362,28 @@ struct Curl_multi *Curl_multi_handle(int hashsize, /* socket hash */
   if(Curl_conncache_init(&multi->conn_cache, chashsize))
     goto error;
 
-  Curl_llist_init(&multi->msglist, multi_freeamsg);
-  Curl_llist_init(&multi->pending, multi_freeamsg);
+  Curl_llist_init(&multi->msglist, NULL);
+  Curl_llist_init(&multi->pending, NULL);
 
-  multi->max_pipeline_length = 5;
-  multi->pipelining = CURLPIPE_MULTIPLEX;
+  multi->multiplexing = TRUE;
 
   /* -1 means it not set by user, use the default value */
   multi->maxconnects = -1;
+
+#ifdef ENABLE_WAKEUP
+  if(Curl_socketpair(AF_UNIX, SOCK_STREAM, 0, multi->wakeup_pair) < 0) {
+    multi->wakeup_pair[0] = CURL_SOCKET_BAD;
+    multi->wakeup_pair[1] = CURL_SOCKET_BAD;
+  }
+  else if(curlx_nonblock(multi->wakeup_pair[0], TRUE) < 0 ||
+          curlx_nonblock(multi->wakeup_pair[1], TRUE) < 0) {
+    sclose(multi->wakeup_pair[0]);
+    sclose(multi->wakeup_pair[1]);
+    multi->wakeup_pair[0] = CURL_SOCKET_BAD;
+    multi->wakeup_pair[1] = CURL_SOCKET_BAD;
+  }
+#endif
+
   return multi;
 
   error:
@@ -405,19 +438,9 @@ CURLMcode curl_multi_add_handle(struct Curl_multi *multi,
   /* set the easy handle */
   multistate(data, CURLM_STATE_INIT);
 
-  if((data->set.global_dns_cache) &&
-     (data->dns.hostcachetype != HCACHE_GLOBAL)) {
-    /* global dns cache was requested but still isn't */
-    struct curl_hash *global = Curl_global_host_cache_init();
-    if(global) {
-      /* only do this if the global cache init works */
-      data->dns.hostcache = global;
-      data->dns.hostcachetype = HCACHE_GLOBAL;
-    }
-  }
   /* for multi interface connections, we share DNS cache automatically if the
      easy handle's one is currently not set. */
-  else if(!data->dns.hostcache ||
+  if(!data->dns.hostcache ||
      (data->dns.hostcachetype == HCACHE_NONE)) {
     data->dns.hostcache = &multi->hostcache;
     data->dns.hostcachetype = HCACHE_MULTI;
@@ -437,12 +460,7 @@ CURLMcode curl_multi_add_handle(struct Curl_multi *multi,
     data->psl = &multi->psl;
 #endif
 
-  /* This adds the new entry at the 'end' of the doubly-linked circular
-     list of Curl_easy structs to try and maintain a FIFO queue so
-     the pipelined requests are in order. */
-
-  /* We add this new entry last in the list. */
-
+  /* We add the new entry last in the list. */
   data->next = NULL; /* end of the line */
   if(multi->easyp) {
     struct Curl_easy *last = multi->easylp;
@@ -473,16 +491,16 @@ CURLMcode curl_multi_add_handle(struct Curl_multi *multi,
   /* increase the alive-counter */
   multi->num_alive++;
 
-  /* A somewhat crude work-around for a little glitch in update_timer() that
-     happens if the lastcall time is set to the same time when the handle is
-     removed as when the next handle is added, as then the check in
-     update_timer() that prevents calling the application multiple times with
-     the same timer info will not trigger and then the new handle's timeout
-     will not be notified to the app.
+  /* A somewhat crude work-around for a little glitch in Curl_update_timer()
+     that happens if the lastcall time is set to the same time when the handle
+     is removed as when the next handle is added, as then the check in
+     Curl_update_timer() that prevents calling the application multiple times
+     with the same timer info will not trigger and then the new handle's
+     timeout will not be notified to the app.
 
      The work-around is thus simply to clear the 'lastcall' variable to force
-     update_timer() to always trigger a callback to the app when a new easy
-     handle is added */
+     Curl_update_timer() to always trigger a callback to the app when a new
+     easy handle is added */
   memset(&multi->timer_lastcall, 0, sizeof(multi->timer_lastcall));
 
   /* The closure handle only ever has default timeouts set. To improve the
@@ -495,7 +513,7 @@ CURLMcode curl_multi_add_handle(struct Curl_multi *multi,
   data->state.conn_cache->closure_handle->set.no_signal =
     data->set.no_signal;
 
-  update_timer(multi);
+  Curl_update_timer(multi);
   return CURLM_OK;
 }
 
@@ -515,33 +533,25 @@ static void debug_print_sock_hash(void *p)
 }
 #endif
 
-static CURLcode multi_done(struct connectdata **connp,
-                          CURLcode status,  /* an error if this is called
-                                               after an error was detected */
-                          bool premature)
+static CURLcode multi_done(struct Curl_easy *data,
+                           CURLcode status,  /* an error if this is called
+                                                after an error was detected */
+                           bool premature)
 {
   CURLcode result;
-  struct connectdata *conn;
-  struct Curl_easy *data;
+  struct connectdata *conn = data->conn;
   unsigned int i;
 
-  DEBUGASSERT(*connp);
-
-  conn = *connp;
-  data = conn->data;
-
   DEBUGF(infof(data, "multi_done\n"));
 
   if(data->state.done)
     /* Stop if multi_done() has already been called */
     return CURLE_OK;
 
-  if(data->mstate == CURLM_STATE_WAITRESOLVE) {
-    /* still waiting for the resolve to complete */
-    (void)Curl_resolver_wait_resolv(conn, NULL);
-  }
+  conn->data = data; /* ensure the connection uses this transfer now */
 
-  Curl_getoff_all_pipelines(data, conn);
+  /* Stop the resolver and free its own resources (but not dns_entry yet). */
+  Curl_resolver_kill(conn);
 
   /* Cleanup possible redirect junk */
   Curl_safefree(data->req.newurl);
@@ -576,17 +586,18 @@ static CURLcode multi_done(struct connectdata **connp,
 
   process_pending_handles(data->multi); /* connection / multiplex */
 
-  if(conn->send_pipe.size || conn->recv_pipe.size) {
-    /* Stop if pipeline is not empty . */
-    data->easy_conn = NULL;
-    DEBUGF(infof(data, "Connection still in use %zu/%zu, "
+  CONN_LOCK(data);
+  detach_connnection(data);
+  if(CONN_INUSE(conn)) {
+    /* Stop if still used. */
+    CONN_UNLOCK(data);
+    DEBUGF(infof(data, "Connection still in use %zu, "
                  "no more multi_done now!\n",
-                 conn->send_pipe.size, conn->recv_pipe.size));
+                 conn->easyq.size));
     return CURLE_OK;
   }
-
+  conn->data = NULL; /* the connection now has no owner */
   data->state.done = TRUE; /* called just now! */
-  Curl_resolver_cancel(conn);
 
   if(conn->dns_entry) {
     Curl_resolv_unlock(data, conn->dns_entry); /* done with this */
@@ -604,7 +615,7 @@ static CURLcode multi_done(struct connectdata **connp,
 
   /* if data->set.reuse_forbid is TRUE, it means the libcurl client has
      forced us to close this connection. This is ignored for requests taking
-     place in a NTLM authentication handshake
+     place in a NTLM/NEGOTIATE authentication handshake
 
      if conn->bits.close is TRUE, it means that the connection should be
      closed in spite of all our efforts to be nice, due to protocol
@@ -619,12 +630,19 @@ static CURLcode multi_done(struct connectdata **connp,
 
   if((data->set.reuse_forbid
 #if defined(USE_NTLM)
-      && !(conn->ntlm.state == NTLMSTATE_TYPE2 ||
-           conn->proxyntlm.state == NTLMSTATE_TYPE2)
+      && !(conn->http_ntlm_state == NTLMSTATE_TYPE2 ||
+           conn->proxy_ntlm_state == NTLMSTATE_TYPE2)
+#endif
+#if defined(USE_SPNEGO)
+      && !(conn->http_negotiate_state == GSS_AUTHRECV ||
+           conn->proxy_negotiate_state == GSS_AUTHRECV)
 #endif
      ) || conn->bits.close
        || (premature && !(conn->handler->flags & PROTOPT_STREAM))) {
-    CURLcode res2 = Curl_disconnect(data, conn, premature);
+    CURLcode res2;
+    connclose(conn, "disconnecting");
+    CONN_UNLOCK(data);
+    res2 = Curl_disconnect(data, conn, premature);
 
     /* If we had an error already, make sure we return that one. But
        if we got a new error, return that. */
@@ -634,16 +652,16 @@ static CURLcode multi_done(struct connectdata **connp,
   else {
     char buffer[256];
     /* create string before returning the connection */
-    snprintf(buffer, sizeof(buffer),
-             "Connection #%ld to host %s left intact",
-             conn->connection_id,
-             conn->bits.socksproxy ? conn->socks_proxy.host.dispname :
-             conn->bits.httpproxy ? conn->http_proxy.host.dispname :
-             conn->bits.conn_to_host ? conn->conn_to_host.dispname :
-             conn->host.dispname);
-
+    msnprintf(buffer, sizeof(buffer),
+              "Connection #%ld to host %s left intact",
+              conn->connection_id,
+              conn->bits.socksproxy ? conn->socks_proxy.host.dispname :
+              conn->bits.httpproxy ? conn->http_proxy.host.dispname :
+              conn->bits.conn_to_host ? conn->conn_to_host.dispname :
+              conn->host.dispname);
     /* the connection is no longer in use by this transfer */
-    if(Curl_conncache_return_conn(conn)) {
+    CONN_UNLOCK(data);
+    if(Curl_conncache_return_conn(data, conn)) {
       /* remember the most recently used connection */
       data->state.lastconnect = conn;
       infof(data, "%s\n", buffer);
@@ -652,10 +670,6 @@ static CURLcode multi_done(struct connectdata **connp,
       data->state.lastconnect = NULL;
   }
 
-  *connp = NULL; /* to make the caller of this function better detect that
-                    this was either closed or handed over to the connection
-                    cache here, and therefore cannot be used from this point on
-                 */
   Curl_free_request_state(data);
   return result;
 }
@@ -684,7 +698,7 @@ CURLMcode curl_multi_remove_handle(struct Curl_multi *multi,
     return CURLM_RECURSIVE_API_CALL;
 
   premature = (data->mstate < CURLM_STATE_COMPLETED) ? TRUE : FALSE;
-  easy_owns_conn = (data->easy_conn && (data->easy_conn->data == easy)) ?
+  easy_owns_conn = (data->conn && (data->conn->data == easy)) ?
     TRUE : FALSE;
 
   /* If the 'state' is not INIT or COMPLETED, we might need to do something
@@ -695,25 +709,17 @@ CURLMcode curl_multi_remove_handle(struct Curl_multi *multi,
     multi->num_alive--;
   }
 
-  if(data->easy_conn &&
+  if(data->conn &&
      data->mstate > CURLM_STATE_DO &&
      data->mstate < CURLM_STATE_COMPLETED) {
     /* Set connection owner so that the DONE function closes it.  We can
        safely do this here since connection is killed. */
-    data->easy_conn->data = easy;
-    /* If the handle is in a pipeline and has started sending off its
-       request but not received its response yet, we need to close
-       connection. */
-    streamclose(data->easy_conn, "Removed with partial response");
+    data->conn->data = easy;
+    streamclose(data->conn, "Removed with partial response");
     easy_owns_conn = TRUE;
   }
 
-  /* The timer must be shut down before data->multi is set to NULL,
-     else the timenode will remain in the splay tree after
-     curl_easy_cleanup is called. */
-  Curl_expire_clear(data);
-
-  if(data->easy_conn) {
+  if(data->conn) {
 
     /* we must call multi_done() here (if we still own the connection) so that
        we don't leave a half-baked one around */
@@ -724,13 +730,15 @@ CURLMcode curl_multi_remove_handle(struct Curl_multi *multi,
 
          Note that this ignores the return code simply because there's
          nothing really useful to do with it anyway! */
-      (void)multi_done(&data->easy_conn, data->result, premature);
+      (void)multi_done(data, data->result, premature);
     }
-    else
-      /* Clear connection pipelines, if multi_done above was not called */
-      Curl_getoff_all_pipelines(data, data->easy_conn);
   }
 
+  /* The timer must be shut down before data->multi is set to NULL, else the
+     timenode will remain in the splay tree after curl_easy_cleanup is
+     called. Do it after multi_done() in case that sets another time! */
+  Curl_expire_clear(data);
+
   if(data->connect_queue.ptr)
     /* the handle was in the pending list waiting for an available connection,
        so go ahead and remove it */
@@ -760,10 +768,8 @@ CURLMcode curl_multi_remove_handle(struct Curl_multi *multi,
                                 vanish with this handle */
 
   /* Remove the association between the connection and the handle */
-  if(data->easy_conn) {
-    data->easy_conn->data = NULL;
-    data->easy_conn = NULL;
-  }
+  if(data->conn)
+    detach_connnection(data);
 
 #ifdef USE_LIBPSL
   /* Remove the PSL association. */
@@ -802,41 +808,59 @@ CURLMcode curl_multi_remove_handle(struct Curl_multi *multi,
      We do not touch the easy handle here! */
   multi->num_easy--; /* one less to care about now */
 
-  update_timer(multi);
+  Curl_update_timer(multi);
   return CURLM_OK;
 }
 
-/* Return TRUE if the application asked for a certain set of pipelining */
-bool Curl_pipeline_wanted(const struct Curl_multi *multi, int bits)
+/* Return TRUE if the application asked for multiplexing */
+bool Curl_multiplex_wanted(const struct Curl_multi *multi)
+{
+  return (multi && (multi->multiplexing));
+}
+
+/* This is the only function that should clear data->conn. This will
+   occasionally be called with the pointer already cleared. */
+static void detach_connnection(struct Curl_easy *data)
 {
-  return (multi && (multi->pipelining & bits)) ? TRUE : FALSE;
+  struct connectdata *conn = data->conn;
+  if(conn)
+    Curl_llist_remove(&conn->easyq, &data->conn_queue, NULL);
+  data->conn = NULL;
 }
 
-void Curl_multi_handlePipeBreak(struct Curl_easy *data)
+/* This is the only function that should assign data->conn */
+void Curl_attach_connnection(struct Curl_easy *data,
+                             struct connectdata *conn)
 {
-  data->easy_conn = NULL;
+  DEBUGASSERT(!data->conn);
+  DEBUGASSERT(conn);
+  data->conn = conn;
+  Curl_llist_insert_next(&conn->easyq, conn->easyq.tail, data,
+                         &data->conn_queue);
 }
 
 static int waitconnect_getsock(struct connectdata *conn,
-                               curl_socket_t *sock,
-                               int numsocks)
+                               curl_socket_t *sock)
 {
   int i;
   int s = 0;
   int rc = 0;
 
-  if(!numsocks)
-    return GETSOCK_BLANK;
-
 #ifdef USE_SSL
   if(CONNECT_FIRSTSOCKET_PROXY_SSL())
-    return Curl_ssl_getsock(conn, sock, numsocks);
+    return Curl_ssl_getsock(conn, sock);
 #endif
 
   for(i = 0; i<2; i++) {
     if(conn->tempsock[i] != CURL_SOCKET_BAD) {
       sock[s] = conn->tempsock[i];
-      rc |= GETSOCK_WRITESOCK(s++);
+      rc |= GETSOCK_WRITESOCK(s);
+#ifdef ENABLE_QUIC
+      if(conn->transport == TRNSPRT_QUIC)
+        /* when connecting QUIC, we want to read the socket too */
+        rc |= GETSOCK_READSOCK(s);
+#endif
+      s++;
     }
   }
 
@@ -844,12 +868,8 @@ static int waitconnect_getsock(struct connectdata *conn,
 }
 
 static int waitproxyconnect_getsock(struct connectdata *conn,
-                                    curl_socket_t *sock,
-                                    int numsocks)
+                                    curl_socket_t *sock)
 {
-  if(!numsocks)
-    return GETSOCK_BLANK;
-
   sock[0] = conn->sock[FIRSTSOCKET];
 
   /* when we've sent a CONNECT to a proxy, we should rather wait for the
@@ -861,30 +881,48 @@ static int waitproxyconnect_getsock(struct connectdata *conn,
 }
 
 static int domore_getsock(struct connectdata *conn,
-                          curl_socket_t *socks,
-                          int numsocks)
+                          curl_socket_t *socks)
 {
   if(conn && conn->handler->domore_getsock)
-    return conn->handler->domore_getsock(conn, socks, numsocks);
+    return conn->handler->domore_getsock(conn, socks);
+  return GETSOCK_BLANK;
+}
+
+static int doing_getsock(struct connectdata *conn,
+                         curl_socket_t *socks)
+{
+  if(conn && conn->handler->doing_getsock)
+    return conn->handler->doing_getsock(conn, socks);
   return GETSOCK_BLANK;
 }
 
-/* returns bitmapped flags for this handle and its sockets */
+static int protocol_getsock(struct connectdata *conn,
+                            curl_socket_t *socks)
+{
+  if(conn->handler->proto_getsock)
+    return conn->handler->proto_getsock(conn, socks);
+  /* Backup getsock logic. Since there is a live socket in use, we must wait
+     for it or it will be removed from watching when the multi_socket API is
+     used. */
+  socks[0] = conn->sock[FIRSTSOCKET];
+  return GETSOCK_READSOCK(0) | GETSOCK_WRITESOCK(0);
+}
+
+/* returns bitmapped flags for this handle and its sockets. The 'socks[]'
+   array contains MAX_SOCKSPEREASYHANDLE entries. */
 static int multi_getsock(struct Curl_easy *data,
-                         curl_socket_t *socks, /* points to numsocks number
-                                                  of sockets */
-                         int numsocks)
+                         curl_socket_t *socks)
 {
   /* The no connection case can happen when this is called from
      curl_multi_remove_handle() => singlesocket() => multi_getsock().
   */
-  if(!data->easy_conn)
+  if(!data->conn)
     return 0;
 
   if(data->mstate > CURLM_STATE_CONNECT &&
      data->mstate < CURLM_STATE_COMPLETED) {
     /* Set up ownership correctly */
-    data->easy_conn->data = data;
+    data->conn->data = data;
   }
 
   switch(data->mstate) {
@@ -905,31 +943,30 @@ static int multi_getsock(struct Curl_easy *data,
     return 0;
 
   case CURLM_STATE_WAITRESOLVE:
-    return Curl_resolv_getsock(data->easy_conn, socks, numsocks);
+    return Curl_resolv_getsock(data->conn, socks);
 
   case CURLM_STATE_PROTOCONNECT:
   case CURLM_STATE_SENDPROTOCONNECT:
-    return Curl_protocol_getsock(data->easy_conn, socks, numsocks);
+    return protocol_getsock(data->conn, socks);
 
   case CURLM_STATE_DO:
   case CURLM_STATE_DOING:
-    return Curl_doing_getsock(data->easy_conn, socks, numsocks);
+    return doing_getsock(data->conn, socks);
 
   case CURLM_STATE_WAITPROXYCONNECT:
-    return waitproxyconnect_getsock(data->easy_conn, socks, numsocks);
+    return waitproxyconnect_getsock(data->conn, socks);
 
   case CURLM_STATE_WAITCONNECT:
-    return waitconnect_getsock(data->easy_conn, socks, numsocks);
+    return waitconnect_getsock(data->conn, socks);
 
   case CURLM_STATE_DO_MORE:
-    return domore_getsock(data->easy_conn, socks, numsocks);
+    return domore_getsock(data->conn, socks);
 
   case CURLM_STATE_DO_DONE: /* since is set after DO is completed, we switch
                                to waiting for the same as the *PERFORM
                                states */
   case CURLM_STATE_PERFORM:
-  case CURLM_STATE_WAITPERFORM:
-    return Curl_single_getsock(data->easy_conn, socks, numsocks);
+    return Curl_single_getsock(data->conn, socks);
   }
 
 }
@@ -955,7 +992,7 @@ CURLMcode curl_multi_fdset(struct Curl_multi *multi,
 
   data = multi->easyp;
   while(data) {
-    int bitmap = multi_getsock(data, sockbunch, MAX_SOCKSPEREASYHANDLE);
+    int bitmap = multi_getsock(data, sockbunch);
 
     for(i = 0; i< MAX_SOCKSPEREASYHANDLE; i++) {
       curl_socket_t s = CURL_SOCKET_BAD;
@@ -985,11 +1022,13 @@ CURLMcode curl_multi_fdset(struct Curl_multi *multi,
 
 #define NUM_POLLS_ON_STACK 10
 
-CURLMcode curl_multi_wait(struct Curl_multi *multi,
-                          struct curl_waitfd extra_fds[],
-                          unsigned int extra_nfds,
-                          int timeout_ms,
-                          int *ret)
+static CURLMcode Curl_multi_wait(struct Curl_multi *multi,
+                                 struct curl_waitfd extra_fds[],
+                                 unsigned int extra_nfds,
+                                 int timeout_ms,
+                                 int *ret,
+                                 bool extrawait, /* when no socket, wait */
+                                 bool use_wakeup)
 {
   struct Curl_easy *data;
   curl_socket_t sockbunch[MAX_SOCKSPEREASYHANDLE];
@@ -997,11 +1036,11 @@ CURLMcode curl_multi_wait(struct Curl_multi *multi,
   unsigned int i;
   unsigned int nfds = 0;
   unsigned int curlfds;
-  struct pollfd *ufds = NULL;
   bool ufds_malloc = FALSE;
   long timeout_internal;
   int retcode = 0;
   struct pollfd a_few_on_stack[NUM_POLLS_ON_STACK];
+  struct pollfd *ufds = &a_few_on_stack[0];
 
   if(!GOOD_MULTI_HANDLE(multi))
     return CURLM_BAD_HANDLE;
@@ -1012,7 +1051,7 @@ CURLMcode curl_multi_wait(struct Curl_multi *multi,
   /* Count up how many fds we have from the multi handle */
   data = multi->easyp;
   while(data) {
-    bitmap = multi_getsock(data, sockbunch, MAX_SOCKSPEREASYHANDLE);
+    bitmap = multi_getsock(data, sockbunch);
 
     for(i = 0; i< MAX_SOCKSPEREASYHANDLE; i++) {
       curl_socket_t s = CURL_SOCKET_BAD;
@@ -1043,19 +1082,21 @@ CURLMcode curl_multi_wait(struct Curl_multi *multi,
   curlfds = nfds; /* number of internal file descriptors */
   nfds += extra_nfds; /* add the externally provided ones */
 
-  if(nfds) {
-    if(nfds > NUM_POLLS_ON_STACK) {
-      /* 'nfds' is a 32 bit value and 'struct pollfd' is typically 8 bytes
-         big, so at 2^29 sockets this value might wrap. When a process gets
-         the capability to actually handle over 500 million sockets this
-         calculation needs a integer overflow check. */
-      ufds = malloc(nfds * sizeof(struct pollfd));
-      if(!ufds)
-        return CURLM_OUT_OF_MEMORY;
-      ufds_malloc = TRUE;
-    }
-    else
-      ufds = &a_few_on_stack[0];
+#ifdef ENABLE_WAKEUP
+  if(use_wakeup && multi->wakeup_pair[0] != CURL_SOCKET_BAD) {
+    ++nfds;
+  }
+#endif
+
+  if(nfds > NUM_POLLS_ON_STACK) {
+    /* 'nfds' is a 32 bit value and 'struct pollfd' is typically 8 bytes
+       big, so at 2^29 sockets this value might wrap. When a process gets
+       the capability to actually handle over 500 million sockets this
+       calculation needs a integer overflow check. */
+    ufds = malloc(nfds * sizeof(struct pollfd));
+    if(!ufds)
+      return CURLM_OUT_OF_MEMORY;
+    ufds_malloc = TRUE;
   }
   nfds = 0;
 
@@ -1066,7 +1107,7 @@ CURLMcode curl_multi_wait(struct Curl_multi *multi,
     /* Add the curl handles to our pollfds first */
     data = multi->easyp;
     while(data) {
-      bitmap = multi_getsock(data, sockbunch, MAX_SOCKSPEREASYHANDLE);
+      bitmap = multi_getsock(data, sockbunch);
 
       for(i = 0; i< MAX_SOCKSPEREASYHANDLE; i++) {
         curl_socket_t s = CURL_SOCKET_BAD;
@@ -1105,6 +1146,14 @@ CURLMcode curl_multi_wait(struct Curl_multi *multi,
     ++nfds;
   }
 
+#ifdef ENABLE_WAKEUP
+  if(use_wakeup && multi->wakeup_pair[0] != CURL_SOCKET_BAD) {
+    ufds[nfds].fd = multi->wakeup_pair[0];
+    ufds[nfds].events = POLLIN;
+    ++nfds;
+  }
+#endif
+
   if(nfds) {
     int pollrc;
     /* wait... */
@@ -1128,6 +1177,29 @@ CURLMcode curl_multi_wait(struct Curl_multi *multi,
 
         extra_fds[i].revents = mask;
       }
+
+#ifdef ENABLE_WAKEUP
+      if(use_wakeup && multi->wakeup_pair[0] != CURL_SOCKET_BAD) {
+        if(ufds[curlfds + extra_nfds].revents & POLLIN) {
+          char buf[64];
+          while(1) {
+            /* the reading socket is non-blocking, try to read
+               data from it until it receives an error (except EINTR).
+               In normal cases it will get EAGAIN or EWOULDBLOCK
+               when there is no more data, breaking the loop. */
+            if(sread(multi->wakeup_pair[0], buf, sizeof(buf)) < 0) {
+#ifndef USE_WINSOCK
+              if(EINTR == SOCKERRNO)
+                continue;
+#endif
+              break;
+            }
+          }
+          /* do not count the wakeup socket into the returned value */
+          retcode--;
+        }
+      }
+#endif
     }
   }
 
@@ -1135,19 +1207,92 @@ CURLMcode curl_multi_wait(struct Curl_multi *multi,
     free(ufds);
   if(ret)
     *ret = retcode;
+  if(!extrawait || nfds)
+    /* if any socket was checked */
+    ;
+  else {
+    long sleep_ms = 0;
+
+    /* Avoid busy-looping when there's nothing particular to wait for */
+    if(!curl_multi_timeout(multi, &sleep_ms) && sleep_ms) {
+      if(sleep_ms > timeout_ms)
+        sleep_ms = timeout_ms;
+      /* when there are no easy handles in the multi, this holds a -1
+         timeout */
+      else if((sleep_ms < 0) && extrawait)
+        sleep_ms = timeout_ms;
+      Curl_wait_ms((int)sleep_ms);
+    }
+  }
+
   return CURLM_OK;
 }
 
-/*
- * Curl_multi_connchanged() is called to tell that there is a connection in
- * this multi handle that has changed state (pipelining become possible, the
- * number of allowed streams changed or similar), and a subsequent use of this
- * multi handle should move CONNECT_PEND handles back to CONNECT to have them
- * retry.
- */
-void Curl_multi_connchanged(struct Curl_multi *multi)
+CURLMcode curl_multi_wait(struct Curl_multi *multi,
+                          struct curl_waitfd extra_fds[],
+                          unsigned int extra_nfds,
+                          int timeout_ms,
+                          int *ret)
+{
+  return Curl_multi_wait(multi, extra_fds, extra_nfds, timeout_ms, ret, FALSE,
+                         FALSE);
+}
+
+CURLMcode curl_multi_poll(struct Curl_multi *multi,
+                          struct curl_waitfd extra_fds[],
+                          unsigned int extra_nfds,
+                          int timeout_ms,
+                          int *ret)
+{
+  return Curl_multi_wait(multi, extra_fds, extra_nfds, timeout_ms, ret, TRUE,
+                         TRUE);
+}
+
+CURLMcode curl_multi_wakeup(struct Curl_multi *multi)
 {
-  multi->recheckstate = TRUE;
+  /* this function is usually called from another thread,
+     it has to be careful only to access parts of the
+     Curl_multi struct that are constant */
+
+  /* GOOD_MULTI_HANDLE can be safely called */
+  if(!GOOD_MULTI_HANDLE(multi))
+    return CURLM_BAD_HANDLE;
+
+#ifdef ENABLE_WAKEUP
+  /* the wakeup_pair variable is only written during init and cleanup,
+     making it safe to access from another thread after the init part
+     and before cleanup */
+  if(multi->wakeup_pair[1] != CURL_SOCKET_BAD) {
+    char buf[1];
+    buf[0] = 1;
+    while(1) {
+      /* swrite() is not thread-safe in general, because concurrent calls
+         can have their messages interleaved, but in this case the content
+         of the messages does not matter, which makes it ok to call.
+
+         The write socket is set to non-blocking, this way this function
+         cannot block, making it safe to call even from the same thread
+         that will call Curl_multi_wait(). If swrite() returns that it
+         would block, it's considered successful because it means that
+         previous calls to this function will wake up the poll(). */
+      if(swrite(multi->wakeup_pair[1], buf, sizeof(buf)) < 0) {
+        int err = SOCKERRNO;
+        int return_success;
+#ifdef USE_WINSOCK
+        return_success = WSAEWOULDBLOCK == err;
+#else
+        if(EINTR == err)
+          continue;
+        return_success = EWOULDBLOCK == err || EAGAIN == err;
+#endif
+        if(!return_success)
+          return CURLM_WAKEUP_FAILURE;
+      }
+      return CURLM_OK;
+    }
+  }
+#endif
+  return CURLM_WAKEUP_FAILURE;
 }
 
 /*
@@ -1185,111 +1330,37 @@ CURLMcode Curl_multi_add_perform(struct Curl_multi *multi,
 
     /* take this handle to the perform state right away */
     multistate(data, CURLM_STATE_PERFORM);
-    data->easy_conn = conn;
+    Curl_attach_connnection(data, conn);
     k->keepon |= KEEP_RECV; /* setup to receive! */
   }
   return rc;
 }
 
-static CURLcode multi_reconnect_request(struct connectdata **connp)
-{
-  CURLcode result = CURLE_OK;
-  struct connectdata *conn = *connp;
-  struct Curl_easy *data = conn->data;
-
-  /* This was a re-use of a connection and we got a write error in the
-   * DO-phase. Then we DISCONNECT this connection and have another attempt to
-   * CONNECT and then DO again! The retry cannot possibly find another
-   * connection to re-use, since we only keep one possible connection for
-   * each.  */
-
-  infof(data, "Re-used connection seems dead, get a new one\n");
-
-  connclose(conn, "Reconnect dead connection"); /* enforce close */
-  result = multi_done(&conn, result, FALSE); /* we are so done with this */
-
-  /* conn may no longer be a good pointer, clear it to avoid mistakes by
-     parent functions */
-  *connp = NULL;
-
-  /*
-   * We need to check for CURLE_SEND_ERROR here as well. This could happen
-   * when the request failed on a FTP connection and thus multi_done() itself
-   * tried to use the connection (again).
-   */
-  if(!result || (CURLE_SEND_ERROR == result)) {
-    bool async;
-    bool protocol_done = TRUE;
-
-    /* Now, redo the connect and get a new connection */
-    result = Curl_connect(data, connp, &async, &protocol_done);
-    if(!result) {
-      /* We have connected or sent away a name resolve query fine */
-
-      conn = *connp; /* setup conn to again point to something nice */
-      if(async) {
-        /* Now, if async is TRUE here, we need to wait for the name
-           to resolve */
-        result = Curl_resolver_wait_resolv(conn, NULL);
-        if(result)
-          return result;
-
-        /* Resolved, continue with the connection */
-        result = Curl_once_resolved(conn, &protocol_done);
-        if(result)
-          return result;
-      }
-    }
-  }
-
-  return result;
-}
-
 /*
  * do_complete is called when the DO actions are complete.
  *
  * We init chunking and trailer bits to their default values here immediately
- * before receiving any header data for the current request in the pipeline.
+ * before receiving any header data for the current request.
  */
 static void do_complete(struct connectdata *conn)
 {
   conn->data->req.chunk = FALSE;
-  conn->data->req.maxfd = (conn->sockfd>conn->writesockfd?
-                           conn->sockfd:conn->writesockfd) + 1;
   Curl_pgrsTime(conn->data, TIMER_PRETRANSFER);
 }
 
-static CURLcode multi_do(struct connectdata **connp, bool *done)
+static CURLcode multi_do(struct Curl_easy *data, bool *done)
 {
   CURLcode result = CURLE_OK;
-  struct connectdata *conn = *connp;
-  struct Curl_easy *data = conn->data;
+  struct connectdata *conn = data->conn;
+
+  DEBUGASSERT(conn);
+  DEBUGASSERT(conn->handler);
+  DEBUGASSERT(conn->data == data);
 
   if(conn->handler->do_it) {
     /* generic protocol-specific function pointer set in curl_connect() */
     result = conn->handler->do_it(conn, done);
 
-    /* This was formerly done in transfer.c, but we better do it here */
-    if((CURLE_SEND_ERROR == result) && conn->bits.reuse) {
-      /*
-       * If the connection is using an easy handle, call reconnect
-       * to re-establish the connection.  Otherwise, let the multi logic
-       * figure out how to re-establish the connection.
-       */
-      if(!data->multi) {
-        result = multi_reconnect_request(connp);
-
-        if(!result) {
-          /* ... finally back to actually retry the DO phase */
-          conn = *connp; /* re-assign conn since multi_reconnect_request
-                            creates a new connection */
-          result = conn->handler->do_it(conn, done);
-        }
-      }
-      else
-        return result;
-    }
-
     if(!result && *done)
       /* do_complete must be called after the protocol-specific DO function */
       do_complete(conn);
@@ -1302,8 +1373,6 @@ static CURLcode multi_do(struct connectdata **connp, bool *done)
  * second stage DO state which (wrongly) was introduced to support FTP's
  * second connection.
  *
- * TODO: A future libcurl should be able to work away this state.
- *
  * 'complete' can return 0 for incomplete, 1 for done and -1 for go back to
  * DOING state there's more work to do!
  */
@@ -1324,6 +1393,109 @@ static CURLcode multi_do_more(struct connectdata *conn, int *complete)
   return result;
 }
 
+/*
+ * We are doing protocol-specific connecting and this is being called over and
+ * over from the multi interface until the connection phase is done on
+ * protocol layer.
+ */
+
+static CURLcode protocol_connecting(struct connectdata *conn,
+                                    bool *done)
+{
+  CURLcode result = CURLE_OK;
+
+  if(conn && conn->handler->connecting) {
+    *done = FALSE;
+    result = conn->handler->connecting(conn, done);
+  }
+  else
+    *done = TRUE;
+
+  return result;
+}
+
+/*
+ * We are DOING this is being called over and over from the multi interface
+ * until the DOING phase is done on protocol layer.
+ */
+
+static CURLcode protocol_doing(struct connectdata *conn, bool *done)
+{
+  CURLcode result = CURLE_OK;
+
+  if(conn && conn->handler->doing) {
+    *done = FALSE;
+    result = conn->handler->doing(conn, done);
+  }
+  else
+    *done = TRUE;
+
+  return result;
+}
+
+/*
+ * We have discovered that the TCP connection has been successful, we can now
+ * proceed with some action.
+ *
+ */
+static CURLcode protocol_connect(struct connectdata *conn,
+                                 bool *protocol_done)
+{
+  CURLcode result = CURLE_OK;
+
+  DEBUGASSERT(conn);
+  DEBUGASSERT(protocol_done);
+
+  *protocol_done = FALSE;
+
+  if(conn->bits.tcpconnect[FIRSTSOCKET] && conn->bits.protoconnstart) {
+    /* We already are connected, get back. This may happen when the connect
+       worked fine in the first call, like when we connect to a local server
+       or proxy. Note that we don't know if the protocol is actually done.
+
+       Unless this protocol doesn't have any protocol-connect callback, as
+       then we know we're done. */
+    if(!conn->handler->connecting)
+      *protocol_done = TRUE;
+
+    return CURLE_OK;
+  }
+
+  if(!conn->bits.protoconnstart) {
+
+    result = Curl_proxy_connect(conn, FIRSTSOCKET);
+    if(result)
+      return result;
+
+    if(CONNECT_FIRSTSOCKET_PROXY_SSL())
+      /* wait for HTTPS proxy SSL initialization to complete */
+      return CURLE_OK;
+
+    if(conn->bits.tunnel_proxy && conn->bits.httpproxy &&
+       Curl_connect_ongoing(conn))
+      /* when using an HTTP tunnel proxy, await complete tunnel establishment
+         before proceeding further. Return CURLE_OK so we'll be called again */
+      return CURLE_OK;
+
+    if(conn->handler->connect_it) {
+      /* is there a protocol-specific connect() procedure? */
+
+      /* Call the protocol-specific connect function */
+      result = conn->handler->connect_it(conn, protocol_done);
+    }
+    else
+      *protocol_done = TRUE;
+
+    /* it has started, possibly even completed but that knowledge isn't stored
+       in this bit! */
+    if(!result)
+      conn->bits.protoconnstart = TRUE;
+  }
+
+  return result; /* pass back status */
+}
+
+
 static CURLMcode multi_runsingle(struct Curl_multi *multi,
                                  struct curltime now,
                                  struct Curl_easy *data)
@@ -1331,14 +1503,13 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
   struct Curl_message *msg = NULL;
   bool connected;
   bool async;
-  bool protocol_connect = FALSE;
+  bool protocol_connected = FALSE;
   bool dophase_done = FALSE;
   bool done = FALSE;
   CURLMcode rc;
   CURLcode result = CURLE_OK;
-  struct SingleRequest *k;
-  time_t timeout_ms;
-  time_t recv_timeout_ms;
+  timediff_t timeout_ms;
+  timediff_t recv_timeout_ms;
   timediff_t send_timeout_ms;
   int control;
 
@@ -1351,56 +1522,62 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
     bool stream_error = FALSE;
     rc = CURLM_OK;
 
-    if(!data->easy_conn &&
+    DEBUGASSERT((data->mstate <= CURLM_STATE_CONNECT) ||
+                (data->mstate >= CURLM_STATE_DONE) ||
+                data->conn);
+    if(!data->conn &&
        data->mstate > CURLM_STATE_CONNECT &&
        data->mstate < CURLM_STATE_DONE) {
-      /* In all these states, the code will blindly access 'data->easy_conn'
+      /* In all these states, the code will blindly access 'data->conn'
          so this is precaution that it isn't NULL. And it silences static
          analyzers. */
-      failf(data, "In state %d with no easy_conn, bail out!\n", data->mstate);
+      failf(data, "In state %d with no conn, bail out!\n", data->mstate);
       return CURLM_INTERNAL_ERROR;
     }
 
     if(multi_ischanged(multi, TRUE)) {
       DEBUGF(infof(data, "multi changed, check CONNECT_PEND queue!\n"));
-      process_pending_handles(multi); /* pipelined/multiplexed */
+      process_pending_handles(multi); /* multiplexed */
     }
 
-    if(data->easy_conn && data->mstate > CURLM_STATE_CONNECT &&
+    if(data->conn && data->mstate > CURLM_STATE_CONNECT &&
        data->mstate < CURLM_STATE_COMPLETED) {
       /* Make sure we set the connection's current owner */
-      data->easy_conn->data = data;
+      data->conn->data = data;
     }
 
-    if(data->easy_conn &&
+    if(data->conn &&
        (data->mstate >= CURLM_STATE_CONNECT) &&
        (data->mstate < CURLM_STATE_COMPLETED)) {
       /* we need to wait for the connect state as only then is the start time
          stored, but we must not check already completed handles */
       timeout_ms = Curl_timeleft(data, &now,
-                                 (data->mstate <= CURLM_STATE_WAITDO)?
+                                 (data->mstate <= CURLM_STATE_DO)?
                                  TRUE:FALSE);
 
       if(timeout_ms < 0) {
         /* Handle timed out */
         if(data->mstate == CURLM_STATE_WAITRESOLVE)
-          failf(data, "Resolving timed out after %ld milliseconds",
+          failf(data, "Resolving timed out after %" CURL_FORMAT_TIMEDIFF_T
+                " milliseconds",
                 Curl_timediff(now, data->progress.t_startsingle));
         else if(data->mstate == CURLM_STATE_WAITCONNECT)
-          failf(data, "Connection timed out after %ld milliseconds",
+          failf(data, "Connection timed out after %" CURL_FORMAT_TIMEDIFF_T
+                " milliseconds",
                 Curl_timediff(now, data->progress.t_startsingle));
         else {
-          k = &data->req;
+          struct SingleRequest *k = &data->req;
           if(k->size != -1) {
-            failf(data, "Operation timed out after %ld milliseconds with %"
-                  CURL_FORMAT_CURL_OFF_T " out of %"
+            failf(data, "Operation timed out after %" CURL_FORMAT_TIMEDIFF_T
+                  " milliseconds with %" CURL_FORMAT_CURL_OFF_T " out of %"
                   CURL_FORMAT_CURL_OFF_T " bytes received",
                   Curl_timediff(now, data->progress.t_startsingle),
                   k->bytecount, k->size);
           }
           else {
-            failf(data, "Operation timed out after %ld milliseconds with %"
-                  CURL_FORMAT_CURL_OFF_T " bytes received",
+            failf(data, "Operation timed out after %" CURL_FORMAT_TIMEDIFF_T
+                  " milliseconds with %" CURL_FORMAT_CURL_OFF_T
+                  " bytes received",
                   Curl_timediff(now, data->progress.t_startsingle),
                   k->bytecount);
           }
@@ -1408,11 +1585,11 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
 
         /* Force connection closed if the connection has indeed been used */
         if(data->mstate > CURLM_STATE_DO) {
-          streamclose(data->easy_conn, "Disconnected with pending data");
+          streamclose(data->conn, "Disconnected with pending data");
           stream_error = TRUE;
         }
         result = CURLE_OPERATION_TIMEDOUT;
-        (void)multi_done(&data->easy_conn, result, TRUE);
+        (void)multi_done(data, result, TRUE);
         /* Skip the statemachine and go directly to error handling section. */
         goto statemachine_end;
       }
@@ -1439,8 +1616,13 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
     case CURLM_STATE_CONNECT:
       /* Connect. We want to get a connection identifier filled in. */
       Curl_pgrsTime(data, TIMER_STARTSINGLE);
-      result = Curl_connect(data, &data->easy_conn,
-                            &async, &protocol_connect);
+      if(data->set.timeout)
+        Curl_expire(data, data->set.timeout, EXPIRE_TIMEOUT);
+
+      if(data->set.connecttimeout)
+        Curl_expire(data, data->set.connecttimeout, EXPIRE_CONNECTTIMEOUT);
+
+      result = Curl_connect(data, &async, &protocol_connected);
       if(CURLE_NO_CONNECTION_AVAILABLE == result) {
         /* There was no connection available. We will go to the pending
            state and wait for an available connection. */
@@ -1452,33 +1634,31 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
         result = CURLE_OK;
         break;
       }
+      else if(data->state.previouslypending) {
+        /* this transfer comes from the pending queue so try move another */
+        infof(data, "Transfer was pending, now try another\n");
+        process_pending_handles(data->multi);
+      }
 
       if(!result) {
-        /* Add this handle to the send or pend pipeline */
-        result = Curl_add_handle_to_pipeline(data, data->easy_conn);
-        if(result)
-          stream_error = TRUE;
+        if(async)
+          /* We're now waiting for an asynchronous name lookup */
+          multistate(data, CURLM_STATE_WAITRESOLVE);
         else {
-          if(async)
-            /* We're now waiting for an asynchronous name lookup */
-            multistate(data, CURLM_STATE_WAITRESOLVE);
-          else {
-            /* after the connect has been sent off, go WAITCONNECT unless the
-               protocol connect is already done and we can go directly to
-               WAITDO or DO! */
-            rc = CURLM_CALL_MULTI_PERFORM;
+          /* after the connect has been sent off, go WAITCONNECT unless the
+             protocol connect is already done and we can go directly to
+             WAITDO or DO! */
+          rc = CURLM_CALL_MULTI_PERFORM;
 
-            if(protocol_connect)
-              multistate(data, Curl_pipeline_wanted(multi, CURLPIPE_HTTP1)?
-                         CURLM_STATE_WAITDO:CURLM_STATE_DO);
-            else {
+          if(protocol_connected)
+            multistate(data, CURLM_STATE_DO);
+          else {
 #ifndef CURL_DISABLE_HTTP
-              if(Curl_connect_ongoing(data->easy_conn))
-                multistate(data, CURLM_STATE_WAITPROXYCONNECT);
-              else
+            if(Curl_connect_ongoing(data->conn))
+              multistate(data, CURLM_STATE_WAITPROXYCONNECT);
+            else
 #endif
-                multistate(data, CURLM_STATE_WAITCONNECT);
-            }
+              multistate(data, CURLM_STATE_WAITCONNECT);
           }
         }
       }
@@ -1488,9 +1668,10 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
       /* awaiting an asynch name resolve to complete */
     {
       struct Curl_dns_entry *dns = NULL;
-      struct connectdata *conn = data->easy_conn;
+      struct connectdata *conn = data->conn;
       const char *hostname;
 
+      DEBUGASSERT(conn);
       if(conn->bits.httpproxy)
         hostname = conn->http_proxy.host.name;
       else if(conn->bits.conn_to_host)
@@ -1511,7 +1692,7 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
       }
 
       if(!dns)
-        result = Curl_resolv_check(data->easy_conn, &dns);
+        result = Curl_resolv_check(data->conn, &dns);
 
       /* Update sockets here, because the socket(s) may have been
          closed and the application thus needs to be told, even if it
@@ -1524,21 +1705,20 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
       if(dns) {
         /* Perform the next step in the connection phase, and then move on
            to the WAITCONNECT state */
-        result = Curl_once_resolved(data->easy_conn, &protocol_connect);
+        result = Curl_once_resolved(data->conn, &protocol_connected);
 
         if(result)
           /* if Curl_once_resolved() returns failure, the connection struct
              is already freed and gone */
-          data->easy_conn = NULL;           /* no more connection */
+          data->conn = NULL; /* no more connection */
         else {
           /* call again please so that we get the next socket setup */
           rc = CURLM_CALL_MULTI_PERFORM;
-          if(protocol_connect)
-            multistate(data, Curl_pipeline_wanted(multi, CURLPIPE_HTTP1)?
-                       CURLM_STATE_WAITDO:CURLM_STATE_DO);
+          if(protocol_connected)
+            multistate(data, CURLM_STATE_DO);
           else {
 #ifndef CURL_DISABLE_HTTP
-            if(Curl_connect_ongoing(data->easy_conn))
+            if(Curl_connect_ongoing(data->conn))
               multistate(data, CURLM_STATE_WAITPROXYCONNECT);
             else
 #endif
@@ -1558,19 +1738,20 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
 #ifndef CURL_DISABLE_HTTP
     case CURLM_STATE_WAITPROXYCONNECT:
       /* this is HTTP-specific, but sending CONNECT to a proxy is HTTP... */
-      result = Curl_http_connect(data->easy_conn, &protocol_connect);
+      DEBUGASSERT(data->conn);
+      result = Curl_http_connect(data->conn, &protocol_connected);
 
-      if(data->easy_conn->bits.proxy_connect_closed) {
+      if(data->conn->bits.proxy_connect_closed) {
         rc = CURLM_CALL_MULTI_PERFORM;
         /* connect back to proxy again */
         result = CURLE_OK;
-        multi_done(&data->easy_conn, CURLE_OK, FALSE);
+        multi_done(data, CURLE_OK, FALSE);
         multistate(data, CURLM_STATE_CONNECT);
       }
       else if(!result) {
-        if((data->easy_conn->http_proxy.proxytype != CURLPROXY_HTTPS ||
-           data->easy_conn->bits.proxy_ssl_connected[FIRSTSOCKET]) &&
-           Curl_connect_complete(data->easy_conn)) {
+        if((data->conn->http_proxy.proxytype != CURLPROXY_HTTPS ||
+           data->conn->bits.proxy_ssl_connected[FIRSTSOCKET]) &&
+           Curl_connect_complete(data->conn)) {
           rc = CURLM_CALL_MULTI_PERFORM;
           /* initiate protocol connect phase */
           multistate(data, CURLM_STATE_SENDPROTOCONNECT);
@@ -1583,101 +1764,94 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
 
     case CURLM_STATE_WAITCONNECT:
       /* awaiting a completion of an asynch TCP connect */
-      result = Curl_is_connected(data->easy_conn, FIRSTSOCKET, &connected);
+      DEBUGASSERT(data->conn);
+      result = Curl_is_connected(data->conn, FIRSTSOCKET, &connected);
       if(connected && !result) {
 #ifndef CURL_DISABLE_HTTP
-        if((data->easy_conn->http_proxy.proxytype == CURLPROXY_HTTPS &&
-            !data->easy_conn->bits.proxy_ssl_connected[FIRSTSOCKET]) ||
-           Curl_connect_ongoing(data->easy_conn)) {
+        if((data->conn->http_proxy.proxytype == CURLPROXY_HTTPS &&
+            !data->conn->bits.proxy_ssl_connected[FIRSTSOCKET]) ||
+           Curl_connect_ongoing(data->conn)) {
           multistate(data, CURLM_STATE_WAITPROXYCONNECT);
           break;
         }
 #endif
         rc = CURLM_CALL_MULTI_PERFORM;
-        multistate(data, data->easy_conn->bits.tunnel_proxy?
+        multistate(data, data->conn->bits.tunnel_proxy?
                    CURLM_STATE_WAITPROXYCONNECT:
                    CURLM_STATE_SENDPROTOCONNECT);
       }
       else if(result) {
         /* failure detected */
-        /* Just break, the cleaning up is handled all in one place */
+        Curl_posttransfer(data);
+        multi_done(data, result, TRUE);
         stream_error = TRUE;
         break;
       }
       break;
 
     case CURLM_STATE_SENDPROTOCONNECT:
-      result = Curl_protocol_connect(data->easy_conn, &protocol_connect);
-      if(!result && !protocol_connect)
+      result = protocol_connect(data->conn, &protocol_connected);
+      if(!result && !protocol_connected)
         /* switch to waiting state */
         multistate(data, CURLM_STATE_PROTOCONNECT);
       else if(!result) {
         /* protocol connect has completed, go WAITDO or DO */
-        multistate(data, Curl_pipeline_wanted(multi, CURLPIPE_HTTP1)?
-                   CURLM_STATE_WAITDO:CURLM_STATE_DO);
+        multistate(data, CURLM_STATE_DO);
         rc = CURLM_CALL_MULTI_PERFORM;
       }
       else if(result) {
         /* failure detected */
         Curl_posttransfer(data);
-        multi_done(&data->easy_conn, result, TRUE);
+        multi_done(data, result, TRUE);
         stream_error = TRUE;
       }
       break;
 
     case CURLM_STATE_PROTOCONNECT:
       /* protocol-specific connect phase */
-      result = Curl_protocol_connecting(data->easy_conn, &protocol_connect);
-      if(!result && protocol_connect) {
+      result = protocol_connecting(data->conn, &protocol_connected);
+      if(!result && protocol_connected) {
         /* after the connect has completed, go WAITDO or DO */
-        multistate(data, Curl_pipeline_wanted(multi, CURLPIPE_HTTP1)?
-                   CURLM_STATE_WAITDO:CURLM_STATE_DO);
+        multistate(data, CURLM_STATE_DO);
         rc = CURLM_CALL_MULTI_PERFORM;
       }
       else if(result) {
         /* failure detected */
         Curl_posttransfer(data);
-        multi_done(&data->easy_conn, result, TRUE);
+        multi_done(data, result, TRUE);
         stream_error = TRUE;
       }
       break;
 
-    case CURLM_STATE_WAITDO:
-      /* Wait for our turn to DO when we're pipelining requests */
-      if(Curl_pipeline_checkget_write(data, data->easy_conn)) {
-        /* Grabbed the channel */
-        multistate(data, CURLM_STATE_DO);
-        rc = CURLM_CALL_MULTI_PERFORM;
-      }
-      break;
-
     case CURLM_STATE_DO:
       if(data->set.connect_only) {
         /* keep connection open for application to use the socket */
-        connkeep(data->easy_conn, "CONNECT_ONLY");
+        connkeep(data->conn, "CONNECT_ONLY");
         multistate(data, CURLM_STATE_DONE);
         result = CURLE_OK;
         rc = CURLM_CALL_MULTI_PERFORM;
       }
       else {
         /* Perform the protocol's DO action */
-        result = multi_do(&data->easy_conn, &dophase_done);
+        result = multi_do(data, &dophase_done);
 
-        /* When multi_do() returns failure, data->easy_conn might be NULL! */
+        /* When multi_do() returns failure, data->conn might be NULL! */
 
         if(!result) {
           if(!dophase_done) {
+#ifndef CURL_DISABLE_FTP
             /* some steps needed for wildcard matching */
             if(data->state.wildcardmatch) {
               struct WildcardData *wc = &data->wildcard;
               if(wc->state == CURLWC_DONE || wc->state == CURLWC_SKIP) {
                 /* skip some states if it is important */
-                multi_done(&data->easy_conn, CURLE_OK, FALSE);
+                multi_done(data, CURLE_OK, FALSE);
                 multistate(data, CURLM_STATE_DONE);
                 rc = CURLM_CALL_MULTI_PERFORM;
                 break;
               }
             }
+#endif
             /* DO was not completed in one function call, we must continue
                DOING... */
             multistate(data, CURLM_STATE_DOING);
@@ -1685,7 +1859,7 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
           }
 
           /* after DO, go DO_DONE... or DO_MORE */
-          else if(data->easy_conn->bits.do_more) {
+          else if(data->conn->bits.do_more) {
             /* we're supposed to do more, but we need to sit down, relax
                and wait a little while first */
             multistate(data, CURLM_STATE_DO_MORE);
@@ -1698,7 +1872,7 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
           }
         }
         else if((CURLE_SEND_ERROR == result) &&
-                data->easy_conn->bits.reuse) {
+                data->conn->bits.reuse) {
           /*
            * In this situation, a connection that we were trying to use
            * may have unexpectedly died.  If possible, send the connection
@@ -1708,7 +1882,7 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
           followtype follow = FOLLOW_NONE;
           CURLcode drc;
 
-          drc = Curl_retry_request(data->easy_conn, &newurl);
+          drc = Curl_retry_request(data->conn, &newurl);
           if(drc) {
             /* a failure here pretty much implies an out of memory */
             result = drc;
@@ -1716,7 +1890,7 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
           }
 
           Curl_posttransfer(data);
-          drc = multi_done(&data->easy_conn, result, FALSE);
+          drc = multi_done(data, result, FALSE);
 
           /* When set to retry the connection, we must to go back to
            * the CONNECT state */
@@ -1748,8 +1922,8 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
         else {
           /* failure detected */
           Curl_posttransfer(data);
-          if(data->easy_conn)
-            multi_done(&data->easy_conn, result, FALSE);
+          if(data->conn)
+            multi_done(data, result, FALSE);
           stream_error = TRUE;
         }
       }
@@ -1757,12 +1931,12 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
 
     case CURLM_STATE_DOING:
       /* we continue DOING until the DO phase is complete */
-      result = Curl_protocol_doing(data->easy_conn,
-                                   &dophase_done);
+      DEBUGASSERT(data->conn);
+      result = protocol_doing(data->conn, &dophase_done);
       if(!result) {
         if(dophase_done) {
           /* after DO, go DO_DONE or DO_MORE */
-          multistate(data, data->easy_conn->bits.do_more?
+          multistate(data, data->conn->bits.do_more?
                      CURLM_STATE_DO_MORE:
                      CURLM_STATE_DO_DONE);
           rc = CURLM_CALL_MULTI_PERFORM;
@@ -1771,7 +1945,7 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
       else {
         /* failure detected */
         Curl_posttransfer(data);
-        multi_done(&data->easy_conn, result, FALSE);
+        multi_done(data, result, FALSE);
         stream_error = TRUE;
       }
       break;
@@ -1780,10 +1954,9 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
       /*
        * When we are connected, DO MORE and then go DO_DONE
        */
-      result = multi_do_more(data->easy_conn, &control);
+      DEBUGASSERT(data->conn);
+      result = multi_do_more(data->conn, &control);
 
-      /* No need to remove this handle from the send pipeline here since that
-         is done in multi_done() */
       if(!result) {
         if(control) {
           /* if positive, advance to DO_DONE
@@ -1800,46 +1973,38 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
       else {
         /* failure detected */
         Curl_posttransfer(data);
-        multi_done(&data->easy_conn, result, FALSE);
+        multi_done(data, result, FALSE);
         stream_error = TRUE;
       }
       break;
 
     case CURLM_STATE_DO_DONE:
-      /* Move ourselves from the send to recv pipeline */
-      Curl_move_handle_from_send_to_recv_pipe(data, data->easy_conn);
-
-      if(data->easy_conn->bits.multiplex || data->easy_conn->send_pipe.size)
+      DEBUGASSERT(data->conn);
+      if(data->conn->bits.multiplex)
         /* Check if we can move pending requests to send pipe */
-        process_pending_handles(multi); /*  pipelined/multiplexed */
+        process_pending_handles(multi); /*  multiplexed */
 
       /* Only perform the transfer if there's a good socket to work with.
          Having both BAD is a signal to skip immediately to DONE */
-      if((data->easy_conn->sockfd != CURL_SOCKET_BAD) ||
-         (data->easy_conn->writesockfd != CURL_SOCKET_BAD))
-        multistate(data, CURLM_STATE_WAITPERFORM);
+      if((data->conn->sockfd != CURL_SOCKET_BAD) ||
+         (data->conn->writesockfd != CURL_SOCKET_BAD))
+        multistate(data, CURLM_STATE_PERFORM);
       else {
+#ifndef CURL_DISABLE_FTP
         if(data->state.wildcardmatch &&
-           ((data->easy_conn->handler->flags & PROTOPT_WILDCARD) == 0)) {
-           data->wildcard.state = CURLWC_DONE;
+           ((data->conn->handler->flags & PROTOPT_WILDCARD) == 0)) {
+          data->wildcard.state = CURLWC_DONE;
         }
+#endif
         multistate(data, CURLM_STATE_DONE);
       }
       rc = CURLM_CALL_MULTI_PERFORM;
       break;
 
-    case CURLM_STATE_WAITPERFORM:
-      /* Wait for our turn to PERFORM */
-      if(Curl_pipeline_checkget_read(data, data->easy_conn)) {
-        /* Grabbed the channel */
-        multistate(data, CURLM_STATE_PERFORM);
-        rc = CURLM_CALL_MULTI_PERFORM;
-      }
-      break;
-
     case CURLM_STATE_TOOFAST: /* limit-rate exceeded in either direction */
+      DEBUGASSERT(data->conn);
       /* if both rates are within spec, resume transfer */
-      if(Curl_pgrsUpdate(data->easy_conn))
+      if(Curl_pgrsUpdate(data->conn))
         result = CURLE_ABORTED_BY_CALLBACK;
       else
         result = Curl_speedcheck(data, now);
@@ -1909,24 +2074,14 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
       }
 
       /* read/write data if it is ready to do so */
-      result = Curl_readwrite(data->easy_conn, data, &done, &comeback);
-
-      k = &data->req;
-
-      if(!(k->keepon & KEEP_RECV))
-        /* We're done receiving */
-        Curl_pipeline_leave_read(data->easy_conn);
-
-      if(!(k->keepon & KEEP_SEND))
-        /* We're done sending */
-        Curl_pipeline_leave_write(data->easy_conn);
+      result = Curl_readwrite(data->conn, data, &done, &comeback);
 
       if(done || (result == CURLE_RECV_ERROR)) {
         /* If CURLE_RECV_ERROR happens early enough, we assume it was a race
          * condition and the server closed the re-used connection exactly when
          * we wanted to use it, so figure out if that is indeed the case.
          */
-        CURLcode ret = Curl_retry_request(data->easy_conn, &newurl);
+        CURLcode ret = Curl_retry_request(data->conn, &newurl);
         if(!ret)
           retry = (newurl)?TRUE:FALSE;
         else if(!result)
@@ -1939,6 +2094,27 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
           done = TRUE;
         }
       }
+      else if((CURLE_HTTP2_STREAM == result) &&
+              Curl_h2_http_1_1_error(data->conn)) {
+        CURLcode ret = Curl_retry_request(data->conn, &newurl);
+
+        if(!ret) {
+          infof(data, "Downgrades to HTTP/1.1!\n");
+          data->set.httpversion = CURL_HTTP_VERSION_1_1;
+          /* clear the error message bit too as we ignore the one we got */
+          data->state.errorbuf = FALSE;
+          if(!newurl)
+            /* typically for HTTP_1_1_REQUIRED error on first flight */
+            newurl = strdup(data->change.url);
+          /* if we are to retry, set the result to OK and consider the request
+             as done */
+          retry = TRUE;
+          result = CURLE_OK;
+          done = TRUE;
+        }
+        else
+          result = ret;
+      }
 
       if(result) {
         /*
@@ -1949,12 +2125,12 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
          * happened in the data connection.
          */
 
-        if(!(data->easy_conn->handler->flags & PROTOPT_DUAL) &&
+        if(!(data->conn->handler->flags & PROTOPT_DUAL) &&
            result != CURLE_HTTP2_STREAM)
-          streamclose(data->easy_conn, "Transfer returned error");
+          streamclose(data->conn, "Transfer returned error");
 
         Curl_posttransfer(data);
-        multi_done(&data->easy_conn, result, TRUE);
+        multi_done(data, result, TRUE);
       }
       else if(done) {
         followtype follow = FOLLOW_NONE;
@@ -1962,13 +2138,6 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
         /* call this even if the readwrite function returned error */
         Curl_posttransfer(data);
 
-        /* we're no longer receiving */
-        Curl_removeHandleFromPipeline(data, &data->easy_conn->recv_pipe);
-
-        /* expire the new receiving pipeline head */
-        if(data->easy_conn->recv_pipe.head)
-          Curl_expire(data->easy_conn->recv_pipe.head->ptr, 0, EXPIRE_RUN_NOW);
-
         /* When we follow redirects or is set to retry the connection, we must
            to go back to the CONNECT state */
         if(data->req.newurl || retry) {
@@ -1982,13 +2151,12 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
           }
           else
             follow = FOLLOW_RETRY;
-          result = multi_done(&data->easy_conn, CURLE_OK, FALSE);
+          (void)multi_done(data, CURLE_OK, FALSE);
+          /* multi_done() might return CURLE_GOT_NOTHING */
+          result = Curl_follow(data, newurl, follow);
           if(!result) {
-            result = Curl_follow(data, newurl, follow);
-            if(!result) {
-              multistate(data, CURLM_STATE_CONNECT);
-              rc = CURLM_CALL_MULTI_PERFORM;
-            }
+            multistate(data, CURLM_STATE_CONNECT);
+            rc = CURLM_CALL_MULTI_PERFORM;
           }
           free(newurl);
         }
@@ -2005,7 +2173,7 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
             free(newurl);
             if(result) {
               stream_error = TRUE;
-              result = multi_done(&data->easy_conn, result, TRUE);
+              result = multi_done(data, result, TRUE);
             }
           }
 
@@ -2024,33 +2192,31 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
       /* this state is highly transient, so run another loop after this */
       rc = CURLM_CALL_MULTI_PERFORM;
 
-      if(data->easy_conn) {
+      if(data->conn) {
         CURLcode res;
 
-        /* Remove ourselves from the receive pipeline, if we are there. */
-        Curl_removeHandleFromPipeline(data, &data->easy_conn->recv_pipe);
-
-        if(data->easy_conn->bits.multiplex || data->easy_conn->send_pipe.size)
+        if(data->conn->bits.multiplex)
           /* Check if we can move pending requests to connection */
-          process_pending_handles(multi); /* pipelined/multiplexing */
+          process_pending_handles(multi); /* multiplexing */
 
         /* post-transfer command */
-        res = multi_done(&data->easy_conn, result, FALSE);
+        res = multi_done(data, result, FALSE);
 
         /* allow a previously set error code take precedence */
         if(!result)
           result = res;
 
         /*
-         * If there are other handles on the pipeline, multi_done won't set
-         * easy_conn to NULL.  In such a case, curl_multi_remove_handle() can
+         * If there are other handles on the connection, multi_done won't set
+         * conn to NULL.  In such a case, curl_multi_remove_handle() can
          * access free'd data, if the connection is free'd and the handle
          * removed before we perform the processing in CURLM_STATE_COMPLETED
          */
-        if(data->easy_conn)
-          data->easy_conn = NULL;
+        if(data->conn)
+          detach_connnection(data);
       }
 
+#ifndef CURL_DISABLE_FTP
       if(data->state.wildcardmatch) {
         if(data->wildcard.state != CURLWC_DONE) {
           /* if a wildcard is set and we are not ending -> lets start again
@@ -2059,7 +2225,7 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
           break;
         }
       }
-
+#endif
       /* after we have DONE what we're supposed to do, go COMPLETED, and
          it doesn't matter what the multi_done() returned! */
       multistate(data, CURLM_STATE_COMPLETED);
@@ -2090,23 +2256,19 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
         /* Check if we can move pending requests to send pipe */
         process_pending_handles(multi); /* connection */
 
-        if(data->easy_conn) {
-          /* if this has a connection, unsubscribe from the pipelines */
-          Curl_pipeline_leave_write(data->easy_conn);
-          Curl_pipeline_leave_read(data->easy_conn);
-          Curl_removeHandleFromPipeline(data, &data->easy_conn->send_pipe);
-          Curl_removeHandleFromPipeline(data, &data->easy_conn->recv_pipe);
-
+        if(data->conn) {
           if(stream_error) {
             /* Don't attempt to send data over a connection that timed out */
             bool dead_connection = result == CURLE_OPERATION_TIMEDOUT;
-            /* disconnect properly */
-            Curl_disconnect(data, data->easy_conn, dead_connection);
+            struct connectdata *conn = data->conn;
 
-            /* This is where we make sure that the easy_conn pointer is reset.
+            /* This is where we make sure that the conn pointer is reset.
                We don't have to do this in every case block above where a
                failure is detected */
-            data->easy_conn = NULL;
+            detach_connnection(data);
+
+            /* disconnect properly */
+            Curl_disconnect(data, conn, dead_connection);
           }
         }
         else if(data->mstate == CURLM_STATE_CONNECT) {
@@ -2118,11 +2280,11 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
         rc = CURLM_CALL_MULTI_PERFORM;
       }
       /* if there's still a connection to use, call the progress function */
-      else if(data->easy_conn && Curl_pgrsUpdate(data->easy_conn)) {
+      else if(data->conn && Curl_pgrsUpdate(data->conn)) {
         /* aborted due to progress callback return code must close the
            connection */
         result = CURLE_ABORTED_BY_CALLBACK;
-        streamclose(data->easy_conn, "Aborted by callback");
+        streamclose(data->conn, "Aborted by callback");
 
         /* if not yet in DONE state, go there, otherwise COMPLETED */
         multistate(data, (data->mstate < CURLM_STATE_DONE)?
@@ -2145,7 +2307,7 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
         msg->extmsg.data.result = result;
 
         rc = multi_addmsg(multi, msg);
-        DEBUGASSERT(!data->easy_conn);
+        DEBUGASSERT(!data->conn);
       }
       multistate(data, CURLM_STATE_MSGSENT);
     }
@@ -2205,7 +2367,7 @@ CURLMcode curl_multi_perform(struct Curl_multi *multi, int *running_handles)
   *running_handles = multi->num_alive;
 
   if(CURLM_OK >= returncode)
-    update_timer(multi);
+    Curl_update_timer(multi);
 
   return returncode;
 }
@@ -2225,9 +2387,9 @@ CURLMcode curl_multi_cleanup(struct Curl_multi *multi)
     data = multi->easyp;
     while(data) {
       nextdata = data->next;
-      if(!data->state.done && data->easy_conn)
+      if(!data->state.done && data->conn)
         /* if DONE was never called for this handle */
-        (void)multi_done(&data->easy_conn, CURLE_OK, TRUE);
+        (void)multi_done(data, CURLE_OK, TRUE);
       if(data->dns.hostcachetype == HCACHE_MULTI) {
         /* clear out the usage of the shared DNS cache */
         Curl_hostcache_clean(data, data->dns.hostcache);
@@ -2258,10 +2420,10 @@ CURLMcode curl_multi_cleanup(struct Curl_multi *multi)
     Curl_hash_destroy(&multi->hostcache);
     Curl_psl_destroy(&multi->psl);
 
-    /* Free the blacklists by setting them to NULL */
-    Curl_pipeline_set_site_blacklist(NULL, &multi->pipelining_site_bl);
-    Curl_pipeline_set_server_blacklist(NULL, &multi->pipelining_server_bl);
-
+#ifdef ENABLE_WAKEUP
+    sclose(multi->wakeup_pair[0]);
+    sclose(multi->wakeup_pair[1]);
+#endif
     free(multi);
 
     return CURLM_OK;
@@ -2320,13 +2482,14 @@ static CURLMcode singlesocket(struct Curl_multi *multi,
   curl_socket_t s;
   int num;
   unsigned int curraction;
+  int actions[MAX_SOCKSPEREASYHANDLE];
 
   for(i = 0; i< MAX_SOCKSPEREASYHANDLE; i++)
     socks[i] = CURL_SOCKET_BAD;
 
   /* Fill in the 'current' struct with the state as it is now: what sockets to
      supervise and for what actions */
-  curraction = multi_getsock(data, socks, MAX_SOCKSPEREASYHANDLE);
+  curraction = multi_getsock(data, socks);
 
   /* We have 0 .. N sockets already and we get to know about the 0 .. M
      sockets we should have from now on. Detect the differences, remove no
@@ -2336,7 +2499,10 @@ static CURLMcode singlesocket(struct Curl_multi *multi,
   for(i = 0; (i< MAX_SOCKSPEREASYHANDLE) &&
         (curraction & (GETSOCK_READSOCK(i) | GETSOCK_WRITESOCK(i)));
       i++) {
-    int action = CURL_POLL_NONE;
+    unsigned int action = CURL_POLL_NONE;
+    unsigned int prevaction = 0;
+    unsigned int comboaction;
+    bool sincebefore = FALSE;
 
     s = socks[i];
 
@@ -2348,29 +2514,63 @@ static CURLMcode singlesocket(struct Curl_multi *multi,
     if(curraction & GETSOCK_WRITESOCK(i))
       action |= CURL_POLL_OUT;
 
+    actions[i] = action;
     if(entry) {
-      /* yeps, already present so check if it has the same action set */
-      if(entry->action == action)
-        /* same, continue */
-        continue;
+      /* check if new for this transfer */
+      int j;
+      for(j = 0; j< data->numsocks; j++) {
+        if(s == data->sockets[j]) {
+          prevaction = data->actions[j];
+          sincebefore = TRUE;
+          break;
+        }
+      }
     }
     else {
-      /* this is a socket we didn't have before, add it! */
-      entry = sh_addentry(&multi->sockhash, s, data);
+      /* this is a socket we didn't have before, add it to the hash! */
+      entry = sh_addentry(&multi->sockhash, s);
       if(!entry)
         /* fatal */
         return CURLM_OUT_OF_MEMORY;
     }
+    if(sincebefore && (prevaction != action)) {
+      /* Socket was used already, but different action now */
+      if(prevaction & CURL_POLL_IN)
+        entry->readers--;
+      if(prevaction & CURL_POLL_OUT)
+        entry->writers--;
+      if(action & CURL_POLL_IN)
+        entry->readers++;
+      if(action & CURL_POLL_OUT)
+        entry->writers++;
+    }
+    else if(!sincebefore) {
+      /* a new user */
+      entry->users++;
+      if(action & CURL_POLL_IN)
+        entry->readers++;
+      if(action & CURL_POLL_OUT)
+        entry->writers++;
+
+      /* add 'data' to the transfer hash on this socket! */
+      if(!Curl_hash_add(&entry->transfers, (char *)&data, /* hash key */
+                        sizeof(struct Curl_easy *), data))
+        return CURLM_OUT_OF_MEMORY;
+    }
+
+    comboaction = (entry->writers? CURL_POLL_OUT : 0) |
+      (entry->readers ? CURL_POLL_IN : 0);
+
+    /* socket existed before and has the same action set as before */
+    if(sincebefore && (entry->action == comboaction))
+      /* same, continue */
+      continue;
 
-    /* we know (entry != NULL) at this point, see the logic above */
     if(multi->socket_cb)
-      multi->socket_cb(data,
-                       s,
-                       action,
-                       multi->socket_userp,
+      multi->socket_cb(data, s, comboaction, multi->socket_userp,
                        entry->socketp);
 
-    entry->action = action; /* store the current action state */
+    entry->action = comboaction; /* store the current action state */
   }
 
   num = i; /* number of sockets */
@@ -2379,73 +2579,48 @@ static CURLMcode singlesocket(struct Curl_multi *multi,
      make sure to detect sockets that are removed */
   for(i = 0; i< data->numsocks; i++) {
     int j;
+    bool stillused = FALSE;
     s = data->sockets[i];
-    for(j = 0; j<num; j++) {
+    for(j = 0; j < num; j++) {
       if(s == socks[j]) {
         /* this is still supervised */
-        s = CURL_SOCKET_BAD;
+        stillused = TRUE;
         break;
       }
     }
+    if(stillused)
+      continue;
 
     entry = sh_getentry(&multi->sockhash, s);
+    /* if this is NULL here, the socket has been closed and notified so
+       already by Curl_multi_closed() */
     if(entry) {
-      /* this socket has been removed. Tell the app to remove it */
-      bool remove_sock_from_hash = TRUE;
-
-      /* check if the socket to be removed serves a connection which has
-         other easy-s in a pipeline. In this case the socket should not be
-         removed. */
-      struct connectdata *easy_conn = data->easy_conn;
-      if(easy_conn) {
-        if(easy_conn->recv_pipe.size > 1) {
-          /* the handle should not be removed from the pipe yet */
-          remove_sock_from_hash = FALSE;
-
-          /* Update the sockhash entry to instead point to the next in line
-             for the recv_pipe, or the first (in case this particular easy
-             isn't already) */
-          if(entry->easy == data) {
-            if(Curl_recvpipe_head(data, easy_conn))
-              entry->easy = easy_conn->recv_pipe.head->next->ptr;
-            else
-              entry->easy = easy_conn->recv_pipe.head->ptr;
-          }
-        }
-        if(easy_conn->send_pipe.size > 1) {
-          /* the handle should not be removed from the pipe yet */
-          remove_sock_from_hash = FALSE;
-
-          /* Update the sockhash entry to instead point to the next in line
-             for the send_pipe, or the first (in case this particular easy
-             isn't already) */
-          if(entry->easy == data) {
-            if(Curl_sendpipe_head(data, easy_conn))
-              entry->easy = easy_conn->send_pipe.head->next->ptr;
-            else
-              entry->easy = easy_conn->send_pipe.head->ptr;
-          }
-        }
-        /* Don't worry about overwriting recv_pipe head with send_pipe_head,
-           when action will be asked on the socket (see multi_socket()), the
-           head of the correct pipe will be taken according to the
-           action. */
-      }
-
-      if(remove_sock_from_hash) {
-        /* in this case 'entry' is always non-NULL */
+      int oldactions = data->actions[i];
+      /* this socket has been removed. Decrease user count */
+      entry->users--;
+      if(oldactions & CURL_POLL_OUT)
+        entry->writers--;
+      if(oldactions & CURL_POLL_IN)
+        entry->readers--;
+      if(!entry->users) {
         if(multi->socket_cb)
-          multi->socket_cb(data,
-                           s,
-                           CURL_POLL_REMOVE,
+          multi->socket_cb(data, s, CURL_POLL_REMOVE,
                            multi->socket_userp,
                            entry->socketp);
-        sh_delentry(&multi->sockhash, s);
+        sh_delentry(entry, &multi->sockhash, s);
       }
-    } /* if sockhash entry existed */
+      else {
+        /* still users, but remove this handle as a user of this socket */
+        if(Curl_hash_delete(&entry->transfers, (char *)&data,
+                            sizeof(struct Curl_easy *))) {
+          DEBUGASSERT(NULL);
+        }
+      }
+    }
   } /* for loop over numsocks */
 
   memcpy(data->sockets, socks, num*sizeof(curl_socket_t));
+  memcpy(data->actions, actions, num*sizeof(int));
   data->numsocks = num;
   return CURLM_OK;
 }
@@ -2466,11 +2641,11 @@ void Curl_updatesocket(struct Curl_easy *data)
  * socket again and it gets the same file descriptor number.
  */
 
-void Curl_multi_closed(struct connectdata *conn, curl_socket_t s)
+void Curl_multi_closed(struct Curl_easy *data, curl_socket_t s)
 {
-  if(conn->data) {
+  if(data) {
     /* if there's still an easy handle associated with this connection */
-    struct Curl_multi *multi = conn->data->multi;
+    struct Curl_multi *multi = data->multi;
     if(multi) {
       /* this is set if this connection is part of a handle that is added to
          a multi handle, and only then this is necessary */
@@ -2478,12 +2653,12 @@ void Curl_multi_closed(struct connectdata *conn, curl_socket_t s)
 
       if(entry) {
         if(multi->socket_cb)
-          multi->socket_cb(conn->data, s, CURL_POLL_REMOVE,
+          multi->socket_cb(data, s, CURL_POLL_REMOVE,
                            multi->socket_userp,
                            entry->socketp);
 
         /* now remove it from the socket hash */
-        sh_delentry(&multi->sockhash, s);
+        sh_delentry(entry, &multi->sockhash, s);
       }
     }
   }
@@ -2574,7 +2749,6 @@ static CURLMcode multi_socket(struct Curl_multi *multi,
     return result;
   }
   if(s != CURL_SOCKET_TIMEOUT) {
-
     struct Curl_sh_entry *entry = sh_getentry(&multi->sockhash, s);
 
     if(!entry)
@@ -2585,46 +2759,22 @@ static CURLMcode multi_socket(struct Curl_multi *multi,
          and just move on. */
       ;
     else {
-      SIGPIPE_VARIABLE(pipe_st);
-
-      data = entry->easy;
-
-      if(data->magic != CURLEASY_MAGIC_NUMBER)
-        /* bad bad bad bad bad bad bad */
-        return CURLM_INTERNAL_ERROR;
-
-      /* If the pipeline is enabled, take the handle which is in the head of
-         the pipeline. If we should write into the socket, take the send_pipe
-         head.  If we should read from the socket, take the recv_pipe head. */
-      if(data->easy_conn) {
-        if((ev_bitmask & CURL_POLL_OUT) &&
-           data->easy_conn->send_pipe.head)
-          data = data->easy_conn->send_pipe.head->ptr;
-        else if((ev_bitmask & CURL_POLL_IN) &&
-                data->easy_conn->recv_pipe.head)
-          data = data->easy_conn->recv_pipe.head->ptr;
-      }
-
-      if(data->easy_conn &&
-         !(data->easy_conn->handler->flags & PROTOPT_DIRLOCK))
-        /* set socket event bitmask if they're not locked */
-        data->easy_conn->cselect_bits = ev_bitmask;
-
-      sigpipe_ignore(data, &pipe_st);
-      result = multi_runsingle(multi, now, data);
-      sigpipe_restore(&pipe_st);
-
-      if(data->easy_conn &&
-         !(data->easy_conn->handler->flags & PROTOPT_DIRLOCK))
-        /* clear the bitmask only if not locked */
-        data->easy_conn->cselect_bits = 0;
-
-      if(CURLM_OK >= result) {
-        /* get the socket(s) and check if the state has been changed since
-           last */
-        result = singlesocket(multi, data);
-        if(result)
-          return result;
+      struct curl_hash_iterator iter;
+      struct curl_hash_element *he;
+
+      /* the socket can be shared by many transfers, iterate */
+      Curl_hash_start_iterate(&entry->transfers, &iter);
+      for(he = Curl_hash_next_element(&iter); he;
+          he = Curl_hash_next_element(&iter)) {
+        data = (struct Curl_easy *)he->ptr;
+        DEBUGASSERT(data);
+        DEBUGASSERT(data->magic == CURLEASY_MAGIC_NUMBER);
+
+        if(data->conn && !(data->conn->handler->flags & PROTOPT_DIRLOCK))
+          /* set socket event bitmask if they're not locked */
+          data->conn->cselect_bits = ev_bitmask;
+
+        Curl_expire(data, 0, EXPIRE_RUN_NOW);
       }
 
       /* Now we fall-through and do the timer-based stuff, since we don't want
@@ -2639,9 +2789,10 @@ static CURLMcode multi_socket(struct Curl_multi *multi,
   }
   else {
     /* Asked to run due to time-out. Clear the 'lastcall' variable to force
-       update_timer() to trigger a callback to the app again even if the same
-       timeout is still the one to run after this call. That handles the case
-       when the application asks libcurl to run the timeout prematurely. */
+       Curl_update_timer() to trigger a callback to the app again even if the
+       same timeout is still the one to run after this call. That handles the
+       case when the application asks libcurl to run the timeout
+       prematurely. */
     memset(&multi->timer_lastcall, 0, sizeof(multi->timer_lastcall));
   }
 
@@ -2712,7 +2863,7 @@ CURLMcode curl_multi_setopt(struct Curl_multi *multi,
     multi->push_userp = va_arg(param, void *);
     break;
   case CURLMOPT_PIPELINING:
-    multi->pipelining = va_arg(param, long) & CURLPIPE_MULTIPLEX;
+    multi->multiplexing = va_arg(param, long) & CURLPIPE_MULTIPLEX;
     break;
   case CURLMOPT_TIMERFUNCTION:
     multi->timer_cb = va_arg(param, curl_multi_timer_callback);
@@ -2726,25 +2877,29 @@ CURLMcode curl_multi_setopt(struct Curl_multi *multi,
   case CURLMOPT_MAX_HOST_CONNECTIONS:
     multi->max_host_connections = va_arg(param, long);
     break;
+  case CURLMOPT_MAX_TOTAL_CONNECTIONS:
+    multi->max_total_connections = va_arg(param, long);
+    break;
+    /* options formerly used for pipelining */
   case CURLMOPT_MAX_PIPELINE_LENGTH:
-    multi->max_pipeline_length = va_arg(param, long);
     break;
   case CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE:
-    multi->content_length_penalty_size = va_arg(param, long);
     break;
   case CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE:
-    multi->chunk_length_penalty_size = va_arg(param, long);
     break;
   case CURLMOPT_PIPELINING_SITE_BL:
-    res = Curl_pipeline_set_site_blacklist(va_arg(param, char **),
-                                           &multi->pipelining_site_bl);
     break;
   case CURLMOPT_PIPELINING_SERVER_BL:
-    res = Curl_pipeline_set_server_blacklist(va_arg(param, char **),
-                                             &multi->pipelining_server_bl);
     break;
-  case CURLMOPT_MAX_TOTAL_CONNECTIONS:
-    multi->max_total_connections = va_arg(param, long);
+  case CURLMOPT_MAX_CONCURRENT_STREAMS:
+    {
+      long streams = va_arg(param, long);
+      if(streams < 1)
+        streams = 100;
+      multi->max_concurrent_streams =
+          (streams > (long)INITIAL_MAX_CONCURRENT_STREAMS)?
+          (long)INITIAL_MAX_CONCURRENT_STREAMS : streams;
+    }
     break;
   default:
     res = CURLM_UNKNOWN_OPTION;
@@ -2765,7 +2920,7 @@ CURLMcode curl_multi_socket(struct Curl_multi *multi, curl_socket_t s,
     return CURLM_RECURSIVE_API_CALL;
   result = multi_socket(multi, FALSE, s, 0, running_handles);
   if(CURLM_OK >= result)
-    update_timer(multi);
+    Curl_update_timer(multi);
   return result;
 }
 
@@ -2777,7 +2932,7 @@ CURLMcode curl_multi_socket_action(struct Curl_multi *multi, curl_socket_t s,
     return CURLM_RECURSIVE_API_CALL;
   result = multi_socket(multi, FALSE, s, ev_bitmask, running_handles);
   if(CURLM_OK >= result)
-    update_timer(multi);
+    Curl_update_timer(multi);
   return result;
 }
 
@@ -2789,7 +2944,7 @@ CURLMcode curl_multi_socket_all(struct Curl_multi *multi, int *running_handles)
     return CURLM_RECURSIVE_API_CALL;
   result = multi_socket(multi, TRUE, CURL_SOCKET_BAD, 0, running_handles);
   if(CURLM_OK >= result)
-    update_timer(multi);
+    Curl_update_timer(multi);
   return result;
 }
 
@@ -2849,14 +3004,14 @@ CURLMcode curl_multi_timeout(struct Curl_multi *multi,
  * Tell the application it should update its timers, if it subscribes to the
  * update timer callback.
  */
-static int update_timer(struct Curl_multi *multi)
+void Curl_update_timer(struct Curl_multi *multi)
 {
   long timeout_ms;
 
   if(!multi->timer_cb)
-    return 0;
+    return;
   if(multi_timeout(multi, &timeout_ms)) {
-    return -1;
+    return;
   }
   if(timeout_ms < 0) {
     static const struct curltime none = {0, 0};
@@ -2864,9 +3019,10 @@ static int update_timer(struct Curl_multi *multi)
       multi->timer_lastcall = none;
       /* there's no timeout now but there was one previously, tell the app to
          disable it */
-      return multi->timer_cb(multi, -1, multi->timer_userp);
+      multi->timer_cb(multi, -1, multi->timer_userp);
+      return;
     }
-    return 0;
+    return;
   }
 
   /* When multi_timeout() is done, multi->timetree points to the node with the
@@ -2874,11 +3030,11 @@ static int update_timer(struct Curl_multi *multi)
    * if this is the same (fixed) time as we got in a previous call and then
    * avoid calling the callback again. */
   if(Curl_splaycomparekeys(multi->timetree->key, multi->timer_lastcall) == 0)
-    return 0;
+    return;
 
   multi->timer_lastcall = multi->timetree->key;
 
-  return multi->timer_cb(multi, timeout_ms, multi->timer_userp);
+  multi->timer_cb(multi, timeout_ms, multi->timer_userp);
 }
 
 /*
@@ -2955,7 +3111,7 @@ multi_addtimeout(struct Curl_easy *data,
  *
  * Expire replaces a former timeout using the same id if already set.
  */
-void Curl_expire(struct Curl_easy *data, time_t milli, expire_id id)
+void Curl_expire(struct Curl_easy *data, timediff_t milli, expire_id id)
 {
   struct Curl_multi *multi = data->multi;
   struct curltime *nowp = &data->state.expiretime;
@@ -2969,7 +3125,7 @@ void Curl_expire(struct Curl_easy *data, time_t milli, expire_id id)
   DEBUGASSERT(id < EXPIRE_LAST);
 
   set = Curl_now();
-  set.tv_sec += milli/1000;
+  set.tv_sec += (time_t)(milli/1000); /* might be a 64 to 32 bit conversion */
   set.tv_usec += (unsigned int)(milli%1000)*1000;
 
   if(set.tv_usec >= 1000000) {
@@ -3059,7 +3215,7 @@ void Curl_expire_clear(struct Curl_easy *data)
     }
 
 #ifdef DEBUGBUILD
-    infof(data, "Expire cleared\n");
+    infof(data, "Expire cleared (transfer %p)\n", data);
 #endif
     nowp->tv_sec = 0;
     nowp->tv_usec = 0;
@@ -3097,24 +3253,20 @@ size_t Curl_multi_max_total_connections(struct Curl_multi *multi)
   return multi ? multi->max_total_connections : 0;
 }
 
-curl_off_t Curl_multi_content_length_penalty_size(struct Curl_multi *multi)
-{
-  return multi ? multi->content_length_penalty_size : 0;
-}
-
-curl_off_t Curl_multi_chunk_length_penalty_size(struct Curl_multi *multi)
-{
-  return multi ? multi->chunk_length_penalty_size : 0;
-}
+/*
+ * When information about a connection has appeared, call this!
+ */
 
-struct curl_llist *Curl_multi_pipelining_site_bl(struct Curl_multi *multi)
+void Curl_multiuse_state(struct connectdata *conn,
+                         int bundlestate) /* use BUNDLE_* defines */
 {
-  return &multi->pipelining_site_bl;
-}
+  DEBUGASSERT(conn);
+  DEBUGASSERT(conn->bundle);
+  DEBUGASSERT(conn->data);
+  DEBUGASSERT(conn->data->multi);
 
-struct curl_llist *Curl_multi_pipelining_server_bl(struct Curl_multi *multi)
-{
-  return &multi->pipelining_server_bl;
+  conn->bundle->multiuse = bundlestate;
+  process_pending_handles(conn->data->multi);
 }
 
 static void process_pending_handles(struct Curl_multi *multi)
@@ -3132,6 +3284,9 @@ static void process_pending_handles(struct Curl_multi *multi)
 
     /* Make sure that the handle will be processed soonish. */
     Curl_expire(data, 0, EXPIRE_RUN_NOW);
+
+    /* mark this as having been in the pending queue */
+    data->state.previouslypending = TRUE;
   }
 }
 
@@ -3175,8 +3330,8 @@ void Curl_multi_dump(struct Curl_multi *multi)
           continue;
         }
         fprintf(stderr, "[%s %s] ",
-                entry->action&CURL_POLL_IN?"RECVING":"",
-                entry->action&CURL_POLL_OUT?"SENDING":"");
+                (entry->action&CURL_POLL_IN)?"RECVING":"",
+                (entry->action&CURL_POLL_OUT)?"SENDING":"");
       }
       if(data->numsocks)
         fprintf(stderr, "\n");
@@ -3184,3 +3339,9 @@ void Curl_multi_dump(struct Curl_multi *multi)
   }
 }
 #endif
+
+size_t Curl_multi_max_concurrent_streams(struct Curl_multi *multi)
+{
+  return multi ? ((size_t)multi->max_concurrent_streams ?
+                  (size_t)multi->max_concurrent_streams : 100) : 0;
+}
index ea2bf35..0bf09e6 100644 (file)
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -24,6 +24,7 @@
 
 #include "conncache.h"
 #include "psl.h"
+#include "socketpair.h"
 
 struct Curl_message {
   struct curl_llist_element list;
@@ -46,18 +47,16 @@ typedef enum {
   CURLM_STATE_SENDPROTOCONNECT, /* 6 - initiate protocol connect procedure */
   CURLM_STATE_PROTOCONNECT, /* 7 - completing the protocol-specific connect
                                    phase */
-  CURLM_STATE_WAITDO,       /* 8 - wait for our turn to send the request */
-  CURLM_STATE_DO,           /* 9 - start send off the request (part 1) */
-  CURLM_STATE_DOING,        /* 10 - sending off the request (part 1) */
-  CURLM_STATE_DO_MORE,      /* 11 - send off the request (part 2) */
-  CURLM_STATE_DO_DONE,      /* 12 - done sending off request */
-  CURLM_STATE_WAITPERFORM,  /* 13 - wait for our turn to read the response */
-  CURLM_STATE_PERFORM,      /* 14 - transfer data */
-  CURLM_STATE_TOOFAST,      /* 15 - wait because limit-rate exceeded */
-  CURLM_STATE_DONE,         /* 16 - post data transfer operation */
-  CURLM_STATE_COMPLETED,    /* 17 - operation complete */
-  CURLM_STATE_MSGSENT,      /* 18 - the operation complete message is sent */
-  CURLM_STATE_LAST          /* 19 - not a true state, never use this */
+  CURLM_STATE_DO,           /* 8 - start send off the request (part 1) */
+  CURLM_STATE_DOING,        /* 9 - sending off the request (part 1) */
+  CURLM_STATE_DO_MORE,      /* 10 - send off the request (part 2) */
+  CURLM_STATE_DO_DONE,      /* 11 - done sending off request */
+  CURLM_STATE_PERFORM,      /* 12 - transfer data */
+  CURLM_STATE_TOOFAST,      /* 13 - wait because limit-rate exceeded */
+  CURLM_STATE_DONE,         /* 14 - post data transfer operation */
+  CURLM_STATE_COMPLETED,    /* 15 - operation complete */
+  CURLM_STATE_MSGSENT,      /* 16 - the operation complete message is sent */
+  CURLM_STATE_LAST          /* 17 - not a true state, never use this */
 } CURLMstate;
 
 /* we support N sockets per easy handle. Set the corresponding bit to what
@@ -66,7 +65,15 @@ typedef enum {
 #define GETSOCK_READABLE (0x00ff)
 #define GETSOCK_WRITABLE (0xff00)
 
-#define CURLPIPE_ANY (CURLPIPE_HTTP1 | CURLPIPE_MULTIPLEX)
+#define CURLPIPE_ANY (CURLPIPE_MULTIPLEX)
+
+#if defined(USE_SOCKETPAIR) && !defined(USE_BLOCKING_SOCKETS)
+#define ENABLE_WAKEUP
+#endif
+
+
+/* value for MAXIMUM CONCURRENT STREAMS upper limit */
+#define INITIAL_MAX_CONCURRENT_STREAMS ((1U << 31) - 1)
 
 /* This is the struct known as CURLM on the outside */
 struct Curl_multi {
@@ -112,8 +119,8 @@ struct Curl_multi {
      same actual socket) */
   struct curl_hash sockhash;
 
-  /* pipelining wanted bits (CURLPIPE*) */
-  long pipelining;
+  /* multiplexing wanted */
+  bool multiplexing;
 
   bool recheckstate; /* see Curl_multi_connchanged */
 
@@ -129,30 +136,18 @@ struct Curl_multi {
   long max_total_connections; /* if >0, a fixed limit of the maximum number
                                  of connections in total */
 
-  long max_pipeline_length; /* if >0, maximum number of requests in a
-                               pipeline */
-
-  long content_length_penalty_size; /* a connection with a
-                                       content-length bigger than
-                                       this is not considered
-                                       for pipelining */
-
-  long chunk_length_penalty_size; /* a connection with a chunk length
-                                     bigger than this is not
-                                     considered for pipelining */
-
-  struct curl_llist pipelining_site_bl; /* List of sites that are blacklisted
-                                           from pipelining */
-
-  struct curl_llist pipelining_server_bl; /* List of server types that are
-                                             blacklisted from pipelining */
-
   /* timer callback and user data pointer for the *socket() API */
   curl_multi_timer_callback timer_cb;
   void *timer_userp;
   struct curltime timer_lastcall; /* the fixed time for the timeout for the
                                     previous callback */
   bool in_callback;            /* true while executing a callback */
+  long max_concurrent_streams; /* max concurrent streams client to support */
+
+#ifdef ENABLE_WAKEUP
+  curl_socket_t wakeup_pair[2]; /* socketpair() used for wakeup
+                                   0 is used for read, 1 is used for write */
+#endif
 };
 
 #endif /* HEADER_CURL_MULTIHANDLE_H */
index c8fb5ca..7502523 100644 (file)
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
  */
 
 void Curl_updatesocket(struct Curl_easy *data);
-void Curl_expire(struct Curl_easy *data, time_t milli, expire_id);
+void Curl_expire(struct Curl_easy *data, timediff_t milli, expire_id);
 void Curl_expire_clear(struct Curl_easy *data);
 void Curl_expire_done(struct Curl_easy *data, expire_id id);
-bool Curl_pipeline_wanted(const struct Curl_multi* multi, int bits);
-void Curl_multi_handlePipeBreak(struct Curl_easy *data);
+void Curl_update_timer(struct Curl_multi *multi);
+void Curl_attach_connnection(struct Curl_easy *data,
+                             struct connectdata *conn);
+bool Curl_multiplex_wanted(const struct Curl_multi *multi);
 void Curl_set_in_callback(struct Curl_easy *data, bool value);
 bool Curl_is_in_callback(struct Curl_easy *easy);
 
@@ -62,22 +64,11 @@ void Curl_multi_dump(struct Curl_multi *multi);
 /* Return the value of the CURLMOPT_MAX_HOST_CONNECTIONS option */
 size_t Curl_multi_max_host_connections(struct Curl_multi *multi);
 
-/* Return the value of the CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE option */
-curl_off_t Curl_multi_content_length_penalty_size(struct Curl_multi *multi);
-
-/* Return the value of the CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE option */
-curl_off_t Curl_multi_chunk_length_penalty_size(struct Curl_multi *multi);
-
-/* Return the value of the CURLMOPT_PIPELINING_SITE_BL option */
-struct curl_llist *Curl_multi_pipelining_site_bl(struct Curl_multi *multi);
-
-/* Return the value of the CURLMOPT_PIPELINING_SERVER_BL option */
-struct curl_llist *Curl_multi_pipelining_server_bl(struct Curl_multi *multi);
-
 /* Return the value of the CURLMOPT_MAX_TOTAL_CONNECTIONS option */
 size_t Curl_multi_max_total_connections(struct Curl_multi *multi);
 
-void Curl_multi_connchanged(struct Curl_multi *multi);
+void Curl_multiuse_state(struct connectdata *conn,
+                         int bundlestate); /* use BUNDLE_* defines */
 
 /*
  * Curl_multi_closed()
@@ -89,7 +80,7 @@ void Curl_multi_connchanged(struct Curl_multi *multi);
  * socket again and it gets the same file descriptor number.
  */
 
-void Curl_multi_closed(struct connectdata *conn, curl_socket_t s);
+void Curl_multi_closed(struct Curl_easy *data, curl_socket_t s);
 
 /*
  * Add a handle and move it into PERFORM state at once. For pushed streams.
@@ -97,4 +88,11 @@ void Curl_multi_closed(struct connectdata *conn, curl_socket_t s);
 CURLMcode Curl_multi_add_perform(struct Curl_multi *multi,
                                  struct Curl_easy *data,
                                  struct connectdata *conn);
+
+
+/* Return the value of the CURLMOPT_MAX_CONCURRENT_STREAMS option
+ * If not specified or 0, default would be 100
+ */
+size_t Curl_multi_max_concurrent_streams(struct Curl_multi *multi);
+
 #endif /* HEADER_CURL_MULTIIF_H */
index 1724b35..1c9da31 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -21,6 +21,7 @@
  ***************************************************************************/
 
 #include "curl_setup.h"
+#ifndef CURL_DISABLE_NETRC
 
 #ifdef HAVE_PWD_H
 #include <pwd.h>
@@ -44,25 +45,27 @@ enum host_lookup_state {
   HOSTVALID     /* this is "our" machine! */
 };
 
+#define NETRC_FILE_MISSING 1
+#define NETRC_FAILED -1
+#define NETRC_SUCCESS 0
+
 /*
- * @unittest: 1304
- *
- * *loginp and *passwordp MUST be allocated if they aren't NULL when passed
- * in.
+ * Returns zero on success.
  */
-int Curl_parsenetrc(const char *host,
-                    char **loginp,
-                    char **passwordp,
-                    char *netrcfile)
+static int parsenetrc(const char *host,
+                      char **loginp,
+                      char **passwordp,
+                      bool *login_changed,
+                      bool *password_changed,
+                      char *netrcfile)
 {
   FILE *file;
-  int retcode = 1;
+  int retcode = NETRC_FILE_MISSING;
   char *login = *loginp;
   char *password = *passwordp;
   bool specific_login = (login && *login != 0);
   bool login_alloc = FALSE;
   bool password_alloc = FALSE;
-  bool netrc_alloc = FALSE;
   enum host_lookup_state state = NOTHING;
 
   char state_login = 0;      /* Found a login keyword */
@@ -70,51 +73,9 @@ int Curl_parsenetrc(const char *host,
   int state_our_login = FALSE;  /* With specific_login, found *our* login
                                    name */
 
-#define NETRC DOT_CHAR "netrc"
-
-  if(!netrcfile) {
-    bool home_alloc = FALSE;
-    char *home = curl_getenv("HOME"); /* portable environment reader */
-    if(home) {
-      home_alloc = TRUE;
-#if defined(HAVE_GETPWUID_R) && defined(HAVE_GETEUID)
-    }
-    else {
-      struct passwd pw, *pw_res;
-      char pwbuf[1024];
-      if(!getpwuid_r(geteuid(), &pw, pwbuf, sizeof(pwbuf), &pw_res)
-         && pw_res) {
-        home = strdup(pw.pw_dir);
-        if(!home)
-          return CURLE_OUT_OF_MEMORY;
-        home_alloc = TRUE;
-      }
-#elif defined(HAVE_GETPWUID) && defined(HAVE_GETEUID)
-    }
-    else {
-      struct passwd *pw;
-      pw = getpwuid(geteuid());
-      if(pw) {
-        home = pw->pw_dir;
-      }
-#endif
-    }
-
-    if(!home)
-      return retcode; /* no home directory found (or possibly out of memory) */
-
-    netrcfile = curl_maprintf("%s%s%s", home, DIR_CHAR, NETRC);
-    if(home_alloc)
-      free(home);
-    if(!netrcfile) {
-      return -1;
-    }
-    netrc_alloc = TRUE;
-  }
+  DEBUGASSERT(netrcfile);
 
   file = fopen(netrcfile, FOPEN_READTEXT);
-  if(netrc_alloc)
-    free(netrcfile);
   if(file) {
     char *tok;
     char *tok_buf;
@@ -127,7 +88,7 @@ int Curl_parsenetrc(const char *host,
       if(tok && *tok == '#')
         /* treat an initial hash as a comment line */
         continue;
-      while(!done && tok) {
+      while(tok) {
 
         if((login && *login) && (password && *password)) {
           done = TRUE;
@@ -145,14 +106,14 @@ int Curl_parsenetrc(const char *host,
           }
           else if(strcasecompare("default", tok)) {
             state = HOSTVALID;
-            retcode = 0; /* we did find our host */
+            retcode = NETRC_SUCCESS; /* we did find our host */
           }
           break;
         case HOSTFOUND:
           if(strcasecompare(host, tok)) {
             /* and yes, this is our host! */
             state = HOSTVALID;
-            retcode = 0; /* we did find our host */
+            retcode = NETRC_SUCCESS; /* we did find our host */
           }
           else
             /* not our host */
@@ -164,14 +125,14 @@ int Curl_parsenetrc(const char *host,
             if(specific_login) {
               state_our_login = strcasecompare(login, tok);
             }
-            else {
+            else if(!login || strcmp(login, tok)) {
               if(login_alloc) {
                 free(login);
                 login_alloc = FALSE;
               }
               login = strdup(tok);
               if(!login) {
-                retcode = -1; /* allocation failed */
+                retcode = NETRC_FAILED; /* allocation failed */
                 goto out;
               }
               login_alloc = TRUE;
@@ -179,14 +140,15 @@ int Curl_parsenetrc(const char *host,
             state_login = 0;
           }
           else if(state_password) {
-            if(state_our_login || !specific_login) {
+            if((state_our_login || !specific_login)
+                && (!password || strcmp(password, tok))) {
               if(password_alloc) {
                 free(password);
                 password_alloc = FALSE;
               }
               password = strdup(tok);
               if(!password) {
-                retcode = -1; /* allocation failed */
+                retcode = NETRC_FAILED; /* allocation failed */
                 goto out;
               }
               password_alloc = TRUE;
@@ -211,15 +173,20 @@ int Curl_parsenetrc(const char *host,
 
     out:
     if(!retcode) {
+      /* success */
+      *login_changed = FALSE;
+      *password_changed = FALSE;
       if(login_alloc) {
         if(*loginp)
           free(*loginp);
         *loginp = login;
+        *login_changed = TRUE;
       }
       if(password_alloc) {
         if(*passwordp)
           free(*passwordp);
         *passwordp = password;
+        *password_changed = TRUE;
       }
     }
     else {
@@ -233,3 +200,79 @@ int Curl_parsenetrc(const char *host,
 
   return retcode;
 }
+
+/*
+ * @unittest: 1304
+ *
+ * *loginp and *passwordp MUST be allocated if they aren't NULL when passed
+ * in.
+ */
+int Curl_parsenetrc(const char *host,
+                    char **loginp,
+                    char **passwordp,
+                    bool *login_changed,
+                    bool *password_changed,
+                    char *netrcfile)
+{
+  int retcode = 1;
+  char *filealloc = NULL;
+
+  if(!netrcfile) {
+    char *home = NULL;
+    char *homea = curl_getenv("HOME"); /* portable environment reader */
+    if(homea) {
+      home = homea;
+#if defined(HAVE_GETPWUID_R) && defined(HAVE_GETEUID)
+    }
+    else {
+      struct passwd pw, *pw_res;
+      char pwbuf[1024];
+      if(!getpwuid_r(geteuid(), &pw, pwbuf, sizeof(pwbuf), &pw_res)
+         && pw_res) {
+        home = pw.pw_dir;
+      }
+#elif defined(HAVE_GETPWUID) && defined(HAVE_GETEUID)
+    }
+    else {
+      struct passwd *pw;
+      pw = getpwuid(geteuid());
+      if(pw) {
+        home = pw->pw_dir;
+      }
+#endif
+    }
+
+    if(!home)
+      return retcode; /* no home directory found (or possibly out of
+                         memory) */
+
+    filealloc = curl_maprintf("%s%s.netrc", home, DIR_CHAR);
+    if(!filealloc) {
+      free(homea);
+      return -1;
+    }
+    retcode = parsenetrc(host, loginp, passwordp, login_changed,
+                         password_changed, filealloc);
+    free(filealloc);
+#ifdef WIN32
+    if(retcode == NETRC_FILE_MISSING) {
+      /* fallback to the old-style "_netrc" file */
+      filealloc = curl_maprintf("%s%s_netrc", home, DIR_CHAR);
+      if(!filealloc) {
+        free(homea);
+        return -1;
+      }
+      retcode = parsenetrc(host, loginp, passwordp, login_changed,
+                           password_changed, filealloc);
+      free(filealloc);
+    }
+#endif
+    free(homea);
+  }
+  else
+    retcode = parsenetrc(host, loginp, passwordp, login_changed,
+                         password_changed, netrcfile);
+  return retcode;
+}
+
+#endif
index d980166..7f56c4b 100644 (file)
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
  *
  ***************************************************************************/
 
+#include "curl_setup.h"
+#ifndef CURL_DISABLE_NETRC
+
 /* returns -1 on failure, 0 if the host is found, 1 is the host isn't found */
 int Curl_parsenetrc(const char *host,
                     char **loginp,
                     char **passwordp,
+                    bool *login_changed,
+                    bool *password_changed,
                     char *filename);
   /* Assume: (*passwordp)[0]=0, host[0] != 0.
    * If (*loginp)[0] = 0, search for login and password within a machine
    * section in the netrc.
    * If (*loginp)[0] != 0, search for password within machine and login.
    */
+#else
+/* disabled */
+#define Curl_parsenetrc(a,b,c,d,e,f) 1
+#endif
 
 #endif /* HEADER_CURL_NETRC_H */
index 1414324..a48e67d 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -78,7 +78,7 @@ CURLcode Curl_convert_clone(struct Curl_easy *data,
 
 /*
  * Curl_convert_to_network() is an internal function for performing ASCII
- * conversions on non-ASCII platforms. It convers the buffer _in place_.
+ * conversions on non-ASCII platforms. It converts the buffer _in place_.
  */
 CURLcode Curl_convert_to_network(struct Curl_easy *data,
                                  char *buffer, size_t length)
@@ -144,7 +144,7 @@ CURLcode Curl_convert_to_network(struct Curl_easy *data,
 
 /*
  * Curl_convert_from_network() is an internal function for performing ASCII
- * conversions on non-ASCII platforms. It convers the buffer _in place_.
+ * conversions on non-ASCII platforms. It converts the buffer _in place_.
  */
 CURLcode Curl_convert_from_network(struct Curl_easy *data,
                                    char *buffer, size_t length)
index 4d105c1..abeb659 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
index eb18ea1..d50d315 100644 (file)
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2009, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
index c6cb794..734ca5f 100644 (file)
@@ -6,7 +6,7 @@
  *                 \___|\___/|_| \_\_____|
  *
  * Copyright (C) 2010, Howard Chu, <hyc@openldap.org>
- * Copyright (C) 2011 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 2011 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -151,7 +151,7 @@ static const char *url_errs[] = {
   "bad or missing extensions"
 };
 
-typedef struct ldapconninfo {
+struct ldapconninfo {
   LDAP *ld;
   Curl_recv *recv;  /* for stacking SSL handler */
   Curl_send *send;
@@ -160,7 +160,7 @@ typedef struct ldapconninfo {
   bool ssldone;
   bool sslinst;
   bool didbind;
-} ldapconninfo;
+};
 
 typedef struct ldapreqinfo {
   int msgid;
@@ -169,7 +169,7 @@ typedef struct ldapreqinfo {
 
 static CURLcode ldap_setup_connection(struct connectdata *conn)
 {
-  ldapconninfo *li;
+  struct ldapconninfo *li;
   LDAPURLDesc *lud;
   struct Curl_easy *data = conn->data;
   int rc, proto;
@@ -190,15 +190,12 @@ static CURLcode ldap_setup_connection(struct connectdata *conn)
   proto = ldap_pvt_url_scheme2proto(lud->lud_scheme);
   ldap_free_urldesc(lud);
 
-  li = calloc(1, sizeof(ldapconninfo));
+  li = calloc(1, sizeof(struct ldapconninfo));
   if(!li)
     return CURLE_OUT_OF_MEMORY;
   li->proto = proto;
-  conn->proto.generic = li;
+  conn->proto.ldapc = li;
   connkeep(conn, "OpenLDAP default");
-  /* TODO:
-   * - provide option to choose SASL Binds instead of Simple
-   */
   return CURLE_OK;
 }
 
@@ -208,7 +205,7 @@ static Sockbuf_IO ldapsb_tls;
 
 static CURLcode ldap_connect(struct connectdata *conn, bool *done)
 {
-  ldapconninfo *li = conn->proto.generic;
+  struct ldapconninfo *li = conn->proto.ldapc;
   struct Curl_easy *data = conn->data;
   int rc, proto = LDAP_VERSION3;
   char hosturl[1024];
@@ -220,8 +217,8 @@ static CURLcode ldap_connect(struct connectdata *conn, bool *done)
   ptr = hosturl + 4;
   if(conn->handler->flags & PROTOPT_SSL)
     *ptr++ = 's';
-  snprintf(ptr, sizeof(hosturl)-(ptr-hosturl), "://%s:%d",
-           conn->host.name, conn->remote_port);
+  msnprintf(ptr, sizeof(hosturl)-(ptr-hosturl), "://%s:%d",
+            conn->host.name, conn->remote_port);
 
 #ifdef CURL_OPENLDAP_DEBUG
   static int do_trace = 0;
@@ -255,7 +252,7 @@ static CURLcode ldap_connect(struct connectdata *conn, bool *done)
 
 static CURLcode ldap_connecting(struct connectdata *conn, bool *done)
 {
-  ldapconninfo *li = conn->proto.generic;
+  struct ldapconninfo *li = conn->proto.ldapc;
   struct Curl_easy *data = conn->data;
   LDAPMessage *msg = NULL;
   struct timeval tv = {0, 1}, *tvp;
@@ -360,7 +357,7 @@ static CURLcode ldap_connecting(struct connectdata *conn, bool *done)
 
 static CURLcode ldap_disconnect(struct connectdata *conn, bool dead_connection)
 {
-  ldapconninfo *li = conn->proto.generic;
+  struct ldapconninfo *li = conn->proto.ldapc;
   (void) dead_connection;
 
   if(li) {
@@ -368,7 +365,7 @@ static CURLcode ldap_disconnect(struct connectdata *conn, bool dead_connection)
       ldap_unbind_ext(li->ld, NULL, NULL);
       li->ld = NULL;
     }
-    conn->proto.generic = NULL;
+    conn->proto.ldapc = NULL;
     free(li);
   }
   return CURLE_OK;
@@ -376,7 +373,7 @@ static CURLcode ldap_disconnect(struct connectdata *conn, bool dead_connection)
 
 static CURLcode ldap_do(struct connectdata *conn, bool *done)
 {
-  ldapconninfo *li = conn->proto.generic;
+  struct ldapconninfo *li = conn->proto.ldapc;
   ldapreqinfo *lr;
   CURLcode status = CURLE_OK;
   int rc = 0;
@@ -414,7 +411,7 @@ static CURLcode ldap_do(struct connectdata *conn, bool *done)
     return CURLE_OUT_OF_MEMORY;
   lr->msgid = msgid;
   data->req.protop = lr;
-  Curl_setup_transfer(conn, FIRSTSOCKET, -1, FALSE, NULL, -1, NULL);
+  Curl_setup_transfer(data, FIRSTSOCKET, -1, FALSE, -1);
   *done = TRUE;
   return CURLE_OK;
 }
@@ -430,7 +427,7 @@ static CURLcode ldap_done(struct connectdata *conn, CURLcode res,
   if(lr) {
     /* if there was a search in progress, abandon it */
     if(lr->msgid) {
-      ldapconninfo *li = conn->proto.generic;
+      struct ldapconninfo *li = conn->proto.ldapc;
       ldap_abandon_ext(li->ld, lr->msgid, NULL, NULL);
       lr->msgid = 0;
     }
@@ -444,7 +441,7 @@ static CURLcode ldap_done(struct connectdata *conn, CURLcode res,
 static ssize_t ldap_recv(struct connectdata *conn, int sockindex, char *buf,
                          size_t len, CURLcode *err)
 {
-  ldapconninfo *li = conn->proto.generic;
+  struct ldapconninfo *li = conn->proto.ldapc;
   struct Curl_easy *data = conn->data;
   ldapreqinfo *lr = data->req.protop;
   int rc, ret;
@@ -510,8 +507,6 @@ static ssize_t ldap_recv(struct connectdata *conn, int sockindex, char *buf,
     lr->nument++;
     rc = ldap_get_dn_ber(li->ld, ent, &ber, &bv);
     if(rc < 0) {
-      /* TODO: verify that this is really how this return code should be
-         handled */
       *err = CURLE_RECV_ERROR;
       return -1;
     }
@@ -723,7 +718,7 @@ static ber_slen_t
 ldapsb_tls_read(Sockbuf_IO_Desc *sbiod, void *buf, ber_len_t len)
 {
   struct connectdata *conn = sbiod->sbiod_pvt;
-  ldapconninfo *li = conn->proto.generic;
+  struct ldapconninfo *li = conn->proto.ldapc;
   ber_slen_t ret;
   CURLcode err = CURLE_RECV_ERROR;
 
@@ -738,7 +733,7 @@ static ber_slen_t
 ldapsb_tls_write(Sockbuf_IO_Desc *sbiod, void *buf, ber_len_t len)
 {
   struct connectdata *conn = sbiod->sbiod_pvt;
-  ldapconninfo *li = conn->proto.generic;
+  struct ldapconninfo *li = conn->proto.ldapc;
   ber_slen_t ret;
   CURLcode err = CURLE_SEND_ERROR;
 
index 3d3c00b..585d7ea 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
 #include "warnless.h"
 #include "parsedate.h"
 
-const char * const Curl_wkday[] =
-{"Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"};
-static const char * const weekday[] =
-{ "Monday", "Tuesday", "Wednesday", "Thursday",
-  "Friday", "Saturday", "Sunday" };
-const char * const Curl_month[]=
-{ "Jan", "Feb", "Mar", "Apr", "May", "Jun",
-  "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" };
-
-struct tzinfo {
-  char name[5];
-  int offset; /* +/- in minutes */
-};
-
 /*
  * parsedate()
  *
@@ -114,6 +100,26 @@ static int parsedate(const char *date, time_t *output);
 #define PARSEDATE_LATER  1
 #define PARSEDATE_SOONER 2
 
+#if !defined(CURL_DISABLE_PARSEDATE) || !defined(CURL_DISABLE_FTP) || \
+  !defined(CURL_DISABLE_FILE)
+/* These names are also used by FTP and FILE code */
+const char * const Curl_wkday[] =
+{"Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"};
+const char * const Curl_month[]=
+{ "Jan", "Feb", "Mar", "Apr", "May", "Jun",
+  "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" };
+#endif
+
+#ifndef CURL_DISABLE_PARSEDATE
+static const char * const weekday[] =
+{ "Monday", "Tuesday", "Wednesday", "Thursday",
+  "Friday", "Saturday", "Sunday" };
+
+struct tzinfo {
+  char name[5];
+  int offset; /* +/- in minutes */
+};
+
 /* Here's a bunch of frequently used time zone names. These were supported
    by the old getdate parser. */
 #define tDAYZONE -60       /* offset for daylight savings time */
@@ -555,6 +561,15 @@ static int parsedate(const char *date, time_t *output)
 
   return PARSEDATE_OK;
 }
+#else
+/* disabled */
+static int parsedate(const char *date, time_t *output)
+{
+  (void)date;
+  *output = 0;
+  return PARSEDATE_OK; /* a lie */
+}
+#endif
 
 time_t curl_getdate(const char *p, const time_t *now)
 {
@@ -572,6 +587,30 @@ time_t curl_getdate(const char *p, const time_t *now)
   return -1;
 }
 
+/* Curl_getdate_capped() differs from curl_getdate() in that this will return
+   TIME_T_MAX in case the parsed time value was too big, instead of an
+   error. */
+
+time_t Curl_getdate_capped(const char *p)
+{
+  time_t parsed = -1;
+  int rc = parsedate(p, &parsed);
+
+  switch(rc) {
+  case PARSEDATE_OK:
+    if(parsed == -1)
+      /* avoid returning -1 for a working scenario */
+      parsed++;
+    return parsed;
+  case PARSEDATE_LATER:
+    /* this returns the maximum time value */
+    return parsed;
+  default:
+    return -1; /* everything else is fail */
+  }
+  /* UNREACHABLE */
+}
+
 /*
  * Curl_gmtime() is a gmtime() replacement for portability. Do not use the
  * gmtime_r() or gmtime() functions anywhere else but here.
index 8dc3b90..8c7ae94 100644 (file)
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -27,4 +27,10 @@ extern const char * const Curl_month[12];
 
 CURLcode Curl_gmtime(time_t intime, struct tm *store);
 
+/* Curl_getdate_capped() differs from curl_getdate() in that this will return
+   TIME_T_MAX in case the parsed time value was too big, instead of an
+   error. */
+
+time_t Curl_getdate_capped(const char *p);
+
 #endif /* HEADER_CURL_PARSEDATE_H */
index 2e93d20..d071005 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -44,7 +44,7 @@
 
 /* Returns timeout in ms. 0 or negative number means the timeout has already
    triggered */
-time_t Curl_pp_state_timeout(struct pingpong *pp)
+time_t Curl_pp_state_timeout(struct pingpong *pp, bool disconnecting)
 {
   struct connectdata *conn = pp->conn;
   struct Curl_easy *data = conn->data;
@@ -60,12 +60,12 @@ time_t Curl_pp_state_timeout(struct pingpong *pp)
   /* Without a requested timeout, we only wait 'response_time' seconds for the
      full response to arrive before we bail out */
   timeout_ms = response_time -
-    Curl_timediff(Curl_now(), pp->response); /* spent time */
+    (time_t)Curl_timediff(Curl_now(), pp->response); /* spent time */
 
-  if(data->set.timeout) {
+  if(data->set.timeout && !disconnecting) {
     /* if timeout is requested, find out how much remaining time we have */
     time_t timeout2_ms = data->set.timeout - /* timeout time */
-      Curl_timediff(Curl_now(), conn->now); /* spent time */
+      (time_t)Curl_timediff(Curl_now(), conn->now); /* spent time */
 
     /* pick the lowest number */
     timeout_ms = CURLMIN(timeout_ms, timeout2_ms);
@@ -77,13 +77,14 @@ time_t Curl_pp_state_timeout(struct pingpong *pp)
 /*
  * Curl_pp_statemach()
  */
-CURLcode Curl_pp_statemach(struct pingpong *pp, bool block)
+CURLcode Curl_pp_statemach(struct pingpong *pp, bool block,
+                           bool disconnecting)
 {
   struct connectdata *conn = pp->conn;
   curl_socket_t sock = conn->sock[FIRSTSOCKET];
   int rc;
   time_t interval_ms;
-  time_t timeout_ms = Curl_pp_state_timeout(pp);
+  time_t timeout_ms = Curl_pp_state_timeout(pp, disconnecting);
   struct Curl_easy *data = conn->data;
   CURLcode result = CURLE_OK;
 
@@ -462,14 +463,9 @@ CURLcode Curl_pp_readresp(curl_socket_t sockfd,
 }
 
 int Curl_pp_getsock(struct pingpong *pp,
-                    curl_socket_t *socks,
-                    int numsocks)
+                    curl_socket_t *socks)
 {
   struct connectdata *conn = pp->conn;
-
-  if(!numsocks)
-    return GETSOCK_BLANK;
-
   socks[0] = conn->sock[FIRSTSOCKET];
 
   if(pp->sendleft) {
index 5ac8df8..849a7c0 100644 (file)
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -81,14 +81,15 @@ struct pingpong {
  * called repeatedly until done. Set 'wait' to make it wait a while on the
  * socket if there's no traffic.
  */
-CURLcode Curl_pp_statemach(struct pingpong *pp, bool block);
+CURLcode Curl_pp_statemach(struct pingpong *pp, bool block,
+                           bool disconnecting);
 
 /* initialize stuff to prepare for reading a fresh new response */
 void Curl_pp_init(struct pingpong *pp);
 
 /* Returns timeout in ms. 0 or negative number means the timeout has already
    triggered */
-time_t Curl_pp_state_timeout(struct pingpong *pp);
+time_t Curl_pp_state_timeout(struct pingpong *pp, bool disconnecting);
 
 
 /***********************************************************************
@@ -134,8 +135,7 @@ CURLcode Curl_pp_flushsend(struct pingpong *pp);
 /* call this when a pingpong connection is disconnected */
 CURLcode Curl_pp_disconnect(struct pingpong *pp);
 
-int Curl_pp_getsock(struct pingpong *pp, curl_socket_t *socks,
-                    int numsocks);
+int Curl_pp_getsock(struct pingpong *pp, curl_socket_t *socks);
 
 
 /***********************************************************************
diff --git a/lib/pipeline.c b/lib/pipeline.c
deleted file mode 100644 (file)
index 8de3bab..0000000
+++ /dev/null
@@ -1,404 +0,0 @@
-/***************************************************************************
- *                                  _   _ ____  _
- *  Project                     ___| | | |  _ \| |
- *                             / __| | | | |_) | |
- *                            | (__| |_| |  _ <| |___
- *                             \___|\___/|_| \_\_____|
- *
- * Copyright (C) 2013, Linus Nielsen Feltzing, <linus@haxx.se>
- * Copyright (C) 2013 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
- *
- * This software is licensed as described in the file COPYING, which
- * you should have received as part of this distribution. The terms
- * are also available at https://curl.haxx.se/docs/copyright.html.
- *
- * You may opt to use, copy, modify, merge, publish, distribute and/or sell
- * copies of the Software, and permit persons to whom the Software is
- * furnished to do so, under the terms of the COPYING file.
- *
- * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
- * KIND, either express or implied.
- *
- ***************************************************************************/
-
-#include "curl_setup.h"
-
-#include <curl/curl.h>
-
-#include "urldata.h"
-#include "url.h"
-#include "progress.h"
-#include "multiif.h"
-#include "pipeline.h"
-#include "sendf.h"
-#include "strcase.h"
-
-#include "curl_memory.h"
-/* The last #include file should be: */
-#include "memdebug.h"
-
-struct site_blacklist_entry {
-  struct curl_llist_element list;
-  unsigned short port;
-  char hostname[1];
-};
-
-static void site_blacklist_llist_dtor(void *user, void *element)
-{
-  struct site_blacklist_entry *entry = element;
-  (void)user;
-  free(entry);
-}
-
-static void server_blacklist_llist_dtor(void *user, void *element)
-{
-  (void)user;
-  free(element);
-}
-
-bool Curl_pipeline_penalized(struct Curl_easy *data,
-                             struct connectdata *conn)
-{
-  if(data) {
-    bool penalized = FALSE;
-    curl_off_t penalty_size =
-      Curl_multi_content_length_penalty_size(data->multi);
-    curl_off_t chunk_penalty_size =
-      Curl_multi_chunk_length_penalty_size(data->multi);
-    curl_off_t recv_size = -2; /* Make it easy to spot in the log */
-
-    /* Find the head of the recv pipe, if any */
-    if(conn->recv_pipe.head) {
-      struct Curl_easy *recv_handle = conn->recv_pipe.head->ptr;
-
-      recv_size = recv_handle->req.size;
-
-      if(penalty_size > 0 && recv_size > penalty_size)
-        penalized = TRUE;
-    }
-
-    if(chunk_penalty_size > 0 &&
-       (curl_off_t)conn->chunk.datasize > chunk_penalty_size)
-      penalized = TRUE;
-
-    infof(data, "Conn: %ld (%p) Receive pipe weight: (%"
-          CURL_FORMAT_CURL_OFF_T "/%" CURL_FORMAT_CURL_OFF_T
-          "), penalized: %s\n",
-          conn->connection_id, (void *)conn, recv_size,
-          conn->chunk.datasize, penalized?"TRUE":"FALSE");
-    return penalized;
-  }
-  return FALSE;
-}
-
-static CURLcode addHandleToPipeline(struct Curl_easy *data,
-                                    struct curl_llist *pipeline)
-{
-  Curl_llist_insert_next(pipeline, pipeline->tail, data,
-                         &data->pipeline_queue);
-  return CURLE_OK;
-}
-
-
-CURLcode Curl_add_handle_to_pipeline(struct Curl_easy *handle,
-                                     struct connectdata *conn)
-{
-  struct curl_llist_element *sendhead = conn->send_pipe.head;
-  struct curl_llist *pipeline;
-  CURLcode result;
-
-  pipeline = &conn->send_pipe;
-
-  result = addHandleToPipeline(handle, pipeline);
-  if((conn->bundle->multiuse == BUNDLE_PIPELINING) &&
-     (pipeline == &conn->send_pipe && sendhead != conn->send_pipe.head)) {
-    /* this is a new one as head, expire it */
-    Curl_pipeline_leave_write(conn); /* not in use yet */
-    Curl_expire(conn->send_pipe.head->ptr, 0, EXPIRE_RUN_NOW);
-  }
-
-#if 0 /* enable for pipeline debugging */
-  print_pipeline(conn);
-#endif
-
-  return result;
-}
-
-/* Move this transfer from the sending list to the receiving list.
-
-   Pay special attention to the new sending list "leader" as it needs to get
-   checked to update what sockets it acts on.
-
-*/
-void Curl_move_handle_from_send_to_recv_pipe(struct Curl_easy *handle,
-                                             struct connectdata *conn)
-{
-  struct curl_llist_element *curr;
-
-  curr = conn->send_pipe.head;
-  while(curr) {
-    if(curr->ptr == handle) {
-      Curl_llist_move(&conn->send_pipe, curr,
-                      &conn->recv_pipe, conn->recv_pipe.tail);
-
-      if(conn->send_pipe.head) {
-        /* Since there's a new easy handle at the start of the send pipeline,
-           set its timeout value to 1ms to make it trigger instantly */
-        Curl_pipeline_leave_write(conn); /* not used now */
-#ifdef DEBUGBUILD
-        infof(conn->data, "%p is at send pipe head B!\n",
-              (void *)conn->send_pipe.head->ptr);
-#endif
-        Curl_expire(conn->send_pipe.head->ptr, 0, EXPIRE_RUN_NOW);
-      }
-
-      /* The receiver's list is not really interesting here since either this
-         handle is now first in the list and we'll deal with it soon, or
-         another handle is already first and thus is already taken care of */
-
-      break; /* we're done! */
-    }
-    curr = curr->next;
-  }
-}
-
-bool Curl_pipeline_site_blacklisted(struct Curl_easy *handle,
-                                    struct connectdata *conn)
-{
-  if(handle->multi) {
-    struct curl_llist *blacklist =
-      Curl_multi_pipelining_site_bl(handle->multi);
-
-    if(blacklist) {
-      struct curl_llist_element *curr;
-
-      curr = blacklist->head;
-      while(curr) {
-        struct site_blacklist_entry *site;
-
-        site = curr->ptr;
-        if(strcasecompare(site->hostname, conn->host.name) &&
-           site->port == conn->remote_port) {
-          infof(handle, "Site %s:%d is pipeline blacklisted\n",
-                conn->host.name, conn->remote_port);
-          return TRUE;
-        }
-        curr = curr->next;
-      }
-    }
-  }
-  return FALSE;
-}
-
-CURLMcode Curl_pipeline_set_site_blacklist(char **sites,
-                                           struct curl_llist *list)
-{
-  /* Free the old list */
-  if(list->size)
-    Curl_llist_destroy(list, NULL);
-
-  if(sites) {
-    Curl_llist_init(list, (curl_llist_dtor) site_blacklist_llist_dtor);
-
-    /* Parse the URLs and populate the list */
-    while(*sites) {
-      char *port;
-      struct site_blacklist_entry *entry;
-
-      entry = malloc(sizeof(struct site_blacklist_entry) + strlen(*sites));
-      if(!entry) {
-        Curl_llist_destroy(list, NULL);
-        return CURLM_OUT_OF_MEMORY;
-      }
-      strcpy(entry->hostname, *sites);
-
-      port = strchr(entry->hostname, ':');
-      if(port) {
-        *port = '\0';
-        port++;
-        entry->port = (unsigned short)strtol(port, NULL, 10);
-      }
-      else {
-        /* Default port number for HTTP */
-        entry->port = 80;
-      }
-
-      Curl_llist_insert_next(list, list->tail, entry, &entry->list);
-      sites++;
-    }
-  }
-
-  return CURLM_OK;
-}
-
-struct blacklist_node {
-  struct curl_llist_element list;
-  char server_name[1];
-};
-
-bool Curl_pipeline_server_blacklisted(struct Curl_easy *handle,
-                                      char *server_name)
-{
-  if(handle->multi && server_name) {
-    struct curl_llist *list =
-      Curl_multi_pipelining_server_bl(handle->multi);
-
-    struct curl_llist_element *e = list->head;
-    while(e) {
-      struct blacklist_node *bl = (struct blacklist_node *)e;
-      if(strncasecompare(bl->server_name, server_name,
-                         strlen(bl->server_name))) {
-        infof(handle, "Server %s is blacklisted\n", server_name);
-        return TRUE;
-      }
-      e = e->next;
-    }
-
-    DEBUGF(infof(handle, "Server %s is not blacklisted\n", server_name));
-  }
-  return FALSE;
-}
-
-CURLMcode Curl_pipeline_set_server_blacklist(char **servers,
-                                             struct curl_llist *list)
-{
-  /* Free the old list */
-  if(list->size)
-    Curl_llist_destroy(list, NULL);
-
-  if(servers) {
-    Curl_llist_init(list, (curl_llist_dtor) server_blacklist_llist_dtor);
-
-    /* Parse the URLs and populate the list */
-    while(*servers) {
-      struct blacklist_node *n;
-      size_t len = strlen(*servers);
-
-      n = malloc(sizeof(struct blacklist_node) + len);
-      if(!n) {
-        Curl_llist_destroy(list, NULL);
-        return CURLM_OUT_OF_MEMORY;
-      }
-      strcpy(n->server_name, *servers);
-
-      Curl_llist_insert_next(list, list->tail, n, &n->list);
-      servers++;
-    }
-  }
-
-
-  return CURLM_OK;
-}
-
-static bool pipe_head(struct Curl_easy *data,
-                      struct curl_llist *pipeline)
-{
-  if(pipeline) {
-    struct curl_llist_element *curr = pipeline->head;
-    if(curr)
-      return (curr->ptr == data) ? TRUE : FALSE;
-  }
-  return FALSE;
-}
-
-/* returns TRUE if the given handle is head of the recv pipe */
-bool Curl_recvpipe_head(struct Curl_easy *data,
-                        struct connectdata *conn)
-{
-  return pipe_head(data, &conn->recv_pipe);
-}
-
-/* returns TRUE if the given handle is head of the send pipe */
-bool Curl_sendpipe_head(struct Curl_easy *data,
-                        struct connectdata *conn)
-{
-  return pipe_head(data, &conn->send_pipe);
-}
-
-
-/*
- * Check if the write channel is available and this handle as at the head,
- * then grab the channel and return TRUE.
- *
- * If not available, return FALSE.
- */
-
-bool Curl_pipeline_checkget_write(struct Curl_easy *data,
-                                  struct connectdata *conn)
-{
-  if(conn->bits.multiplex)
-    /* when multiplexing, we can use it at once */
-    return TRUE;
-
-  if(!conn->writechannel_inuse && Curl_sendpipe_head(data, conn)) {
-    /* Grab the channel */
-    conn->writechannel_inuse = TRUE;
-    return TRUE;
-  }
-  return FALSE;
-}
-
-
-/*
- * Check if the read channel is available and this handle as at the head, then
- * grab the channel and return TRUE.
- *
- * If not available, return FALSE.
- */
-
-bool Curl_pipeline_checkget_read(struct Curl_easy *data,
-                                 struct connectdata *conn)
-{
-  if(conn->bits.multiplex)
-    /* when multiplexing, we can use it at once */
-    return TRUE;
-
-  if(!conn->readchannel_inuse && Curl_recvpipe_head(data, conn)) {
-    /* Grab the channel */
-    conn->readchannel_inuse = TRUE;
-    return TRUE;
-  }
-  return FALSE;
-}
-
-/*
- * The current user of the pipeline write channel gives it up.
- */
-void Curl_pipeline_leave_write(struct connectdata *conn)
-{
-  conn->writechannel_inuse = FALSE;
-}
-
-/*
- * The current user of the pipeline read channel gives it up.
- */
-void Curl_pipeline_leave_read(struct connectdata *conn)
-{
-  conn->readchannel_inuse = FALSE;
-}
-
-
-#if 0
-void print_pipeline(struct connectdata *conn)
-{
-  struct curl_llist_element *curr;
-  struct connectbundle *cb_ptr;
-  struct Curl_easy *data = conn->data;
-
-  cb_ptr = conn->bundle;
-
-  if(cb_ptr) {
-    curr = cb_ptr->conn_list->head;
-    while(curr) {
-      conn = curr->ptr;
-      infof(data, "- Conn %ld (%p) send_pipe: %zu, recv_pipe: %zu\n",
-            conn->connection_id,
-            (void *)conn,
-            conn->send_pipe->size,
-            conn->recv_pipe->size);
-      curr = curr->next;
-    }
-  }
-}
-
-#endif
diff --git a/lib/pipeline.h b/lib/pipeline.h
deleted file mode 100644 (file)
index 413ba31..0000000
+++ /dev/null
@@ -1,56 +0,0 @@
-#ifndef HEADER_CURL_PIPELINE_H
-#define HEADER_CURL_PIPELINE_H
-/***************************************************************************
- *                                  _   _ ____  _
- *  Project                     ___| | | |  _ \| |
- *                             / __| | | | |_) | |
- *                            | (__| |_| |  _ <| |___
- *                             \___|\___/|_| \_\_____|
- *
- * Copyright (C) 2015 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
- * Copyright (C) 2013 - 2014, Linus Nielsen Feltzing, <linus@haxx.se>
- *
- * This software is licensed as described in the file COPYING, which
- * you should have received as part of this distribution. The terms
- * are also available at https://curl.haxx.se/docs/copyright.html.
- *
- * You may opt to use, copy, modify, merge, publish, distribute and/or sell
- * copies of the Software, and permit persons to whom the Software is
- * furnished to do so, under the terms of the COPYING file.
- *
- * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
- * KIND, either express or implied.
- *
- ***************************************************************************/
-
-CURLcode Curl_add_handle_to_pipeline(struct Curl_easy *handle,
-                                     struct connectdata *conn);
-void Curl_move_handle_from_send_to_recv_pipe(struct Curl_easy *handle,
-                                             struct connectdata *conn);
-bool Curl_pipeline_penalized(struct Curl_easy *data,
-                             struct connectdata *conn);
-
-bool Curl_pipeline_site_blacklisted(struct Curl_easy *handle,
-                                    struct connectdata *conn);
-
-CURLMcode Curl_pipeline_set_site_blacklist(char **sites,
-                                           struct curl_llist *list_ptr);
-
-bool Curl_pipeline_server_blacklisted(struct Curl_easy *handle,
-                                      char *server_name);
-
-CURLMcode Curl_pipeline_set_server_blacklist(char **servers,
-                                             struct curl_llist *list_ptr);
-
-bool Curl_pipeline_checkget_write(struct Curl_easy *data,
-                                  struct connectdata *conn);
-bool Curl_pipeline_checkget_read(struct Curl_easy *data,
-                                 struct connectdata *conn);
-void Curl_pipeline_leave_write(struct connectdata *conn);
-void Curl_pipeline_leave_read(struct connectdata *conn);
-bool Curl_recvpipe_head(struct Curl_easy *data,
-                        struct connectdata *conn);
-bool Curl_sendpipe_head(struct Curl_easy *data,
-                        struct connectdata *conn);
-
-#endif /* HEADER_CURL_PIPELINE_H */
index 5e0fd22..57c1373 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -30,6 +30,7 @@
  * RFC4752 The Kerberos V5 ("GSSAPI") SASL Mechanism
  * RFC5034 POP3 SASL Authentication Mechanism
  * RFC6749 OAuth 2.0 Authorization Framework
+ * RFC8314 Use of TLS for Email Submission and Access
  * Draft   LOGIN SASL Mechanism <draft-murchison-sasl-login-00.txt>
  *
  ***************************************************************************/
@@ -94,8 +95,7 @@ static CURLcode pop3_done(struct connectdata *conn, CURLcode status,
 static CURLcode pop3_connect(struct connectdata *conn, bool *done);
 static CURLcode pop3_disconnect(struct connectdata *conn, bool dead);
 static CURLcode pop3_multi_statemach(struct connectdata *conn, bool *done);
-static int pop3_getsock(struct connectdata *conn, curl_socket_t *socks,
-                        int numsocks);
+static int pop3_getsock(struct connectdata *conn, curl_socket_t *socks);
 static CURLcode pop3_doing(struct connectdata *conn, bool *dophase_done);
 static CURLcode pop3_setup_connection(struct connectdata *conn);
 static CURLcode pop3_parse_url_options(struct connectdata *conn);
@@ -208,7 +208,7 @@ static bool pop3_endofresp(struct connectdata *conn, char *line, size_t len,
   /* Are we processing CAPA command responses? */
   if(pop3c->state == POP3_CAPA) {
     /* Do we have the terminating line? */
-    if(len >= 1 && !memcmp(line, ".", 1))
+    if(len >= 1 && line[0] == '.')
       /* Treat the response as a success */
       *resp = '+';
     else
@@ -226,7 +226,7 @@ static bool pop3_endofresp(struct connectdata *conn, char *line, size_t len,
   }
 
   /* Do we have a continuation response? */
-  if(len >= 1 && !memcmp("+", line, 1)) {
+  if(len >= 1 && line[0] == '+') {
     *resp = '*';
 
     return TRUE;
@@ -338,10 +338,8 @@ static CURLcode pop3_perform_capa(struct connectdata *conn)
  */
 static CURLcode pop3_perform_starttls(struct connectdata *conn)
 {
-  CURLcode result = CURLE_OK;
-
   /* Send the STLS command */
-  result = Curl_pp_sendf(&conn->proto.pop3c.pp, "%s", "STLS");
+  CURLcode result = Curl_pp_sendf(&conn->proto.pop3c.pp, "%s", "STLS");
 
   if(!result)
     state(conn, POP3_STARTTLS);
@@ -357,11 +355,10 @@ static CURLcode pop3_perform_starttls(struct connectdata *conn)
  */
 static CURLcode pop3_perform_upgrade_tls(struct connectdata *conn)
 {
-  CURLcode result = CURLE_OK;
-  struct pop3_conn *pop3c = &conn->proto.pop3c;
-
   /* Start the SSL connection */
-  result = Curl_ssl_connect_nonblocking(conn, FIRSTSOCKET, &pop3c->ssldone);
+  struct pop3_conn *pop3c = &conn->proto.pop3c;
+  CURLcode result = Curl_ssl_connect_nonblocking(conn, FIRSTSOCKET,
+                                                 &pop3c->ssldone);
 
   if(!result) {
     if(pop3c->state != POP3_UPGRADETLS)
@@ -443,7 +440,7 @@ static CURLcode pop3_perform_apop(struct connectdata *conn)
 
   /* Convert the calculated 16 octet digest into a 32 byte hex string */
   for(i = 0; i < MD5_DIGEST_LEN; i++)
-    snprintf(&secret[2 * i], 3, "%02x", digest[i]);
+    msnprintf(&secret[2 * i], 3, "%02x", digest[i]);
 
   result = Curl_pp_sendf(&pop3c->pp, "APOP %s %s", conn->user, secret);
 
@@ -592,10 +589,8 @@ static CURLcode pop3_perform_command(struct connectdata *conn)
  */
 static CURLcode pop3_perform_quit(struct connectdata *conn)
 {
-  CURLcode result = CURLE_OK;
-
   /* Send the QUIT command */
-  result = Curl_pp_sendf(&conn->proto.pop3c.pp, "%s", "QUIT");
+  CURLcode result = Curl_pp_sendf(&conn->proto.pop3c.pp, "%s", "QUIT");
 
   if(!result)
     state(conn, POP3_QUIT);
@@ -629,6 +624,7 @@ static CURLcode pop3_state_servergreet_resp(struct connectdata *conn,
         if(line[i] == '<') {
           /* Calculate the length of the timestamp */
           size_t timestamplen = len - 1 - i;
+          char *at;
           if(!timestamplen)
             break;
 
@@ -642,8 +638,15 @@ static CURLcode pop3_state_servergreet_resp(struct connectdata *conn,
           memcpy(pop3c->apoptimestamp, line + i, timestamplen);
           pop3c->apoptimestamp[timestamplen] = '\0';
 
-          /* Store the APOP capability */
-          pop3c->authtypes |= POP3_TYPE_APOP;
+          /* If the timestamp does not contain '@' it is not (as required by
+             RFC-1939) conformant to the RFC-822 message id syntax, and we
+             therefore do not use APOP authentication. */
+          at = strchr(pop3c->apoptimestamp, '@');
+          if(!at)
+            Curl_safefree(pop3c->apoptimestamp);
+          else
+            /* Store the APOP capability */
+            pop3c->authtypes |= POP3_TYPE_APOP;
           break;
         }
       }
@@ -904,7 +907,7 @@ static CURLcode pop3_state_command_resp(struct connectdata *conn,
 
   if(pop3->transfer == FTPTRANSFER_BODY) {
     /* POP3 download */
-    Curl_setup_transfer(conn, FIRSTSOCKET, -1, FALSE, NULL, -1, NULL);
+    Curl_setup_transfer(data, FIRSTSOCKET, -1, FALSE, -1);
 
     if(pp->cache) {
       /* The header "cache" contains a bunch of data that is actually body
@@ -1017,19 +1020,20 @@ static CURLcode pop3_multi_statemach(struct connectdata *conn, bool *done)
       return result;
   }
 
-  result = Curl_pp_statemach(&pop3c->pp, FALSE);
+  result = Curl_pp_statemach(&pop3c->pp, FALSE, FALSE);
   *done = (pop3c->state == POP3_STOP) ? TRUE : FALSE;
 
   return result;
 }
 
-static CURLcode pop3_block_statemach(struct connectdata *conn)
+static CURLcode pop3_block_statemach(struct connectdata *conn,
+                                     bool disconnecting)
 {
   CURLcode result = CURLE_OK;
   struct pop3_conn *pop3c = &conn->proto.pop3c;
 
   while(pop3c->state != POP3_STOP && !result)
-    result = Curl_pp_statemach(&pop3c->pp, TRUE);
+    result = Curl_pp_statemach(&pop3c->pp, TRUE, disconnecting);
 
   return result;
 }
@@ -1050,10 +1054,9 @@ static CURLcode pop3_init(struct connectdata *conn)
 }
 
 /* For the POP3 "protocol connect" and "doing" phases only */
-static int pop3_getsock(struct connectdata *conn, curl_socket_t *socks,
-                        int numsocks)
+static int pop3_getsock(struct connectdata *conn, curl_socket_t *socks)
 {
-  return Curl_pp_getsock(&conn->proto.pop3c.pp, socks, numsocks);
+  return Curl_pp_getsock(&conn->proto.pop3c.pp, socks);
 }
 
 /***********************************************************************
@@ -1227,7 +1230,7 @@ static CURLcode pop3_disconnect(struct connectdata *conn, bool dead_connection)
      point! */
   if(!dead_connection && pop3c->pp.conn && pop3c->pp.conn->bits.protoconnstart)
     if(!pop3_perform_quit(conn))
-      (void)pop3_block_statemach(conn); /* ignore errors on QUIT */
+      (void)pop3_block_statemach(conn, TRUE); /* ignore errors on QUIT */
 
   /* Disconnect from the server */
   Curl_pp_disconnect(&pop3c->pp);
index a8e697c..3ba7999 100644 (file)
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 2009 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 2009 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
index a94668d..60a941a 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
 #include "sendf.h"
 #include "multiif.h"
 #include "progress.h"
+#include "timeval.h"
 #include "curl_printf.h"
 
 /* check rate limits within this many recent milliseconds, at minimum. */
 #define MIN_RATE_LIMIT_PERIOD 3000
 
+#ifndef CURL_DISABLE_PROGRESS_METER
 /* Provide a string that is 2 + 1 + 2 + 1 + 2 = 8 letters long (plus the zero
    byte) */
 static void time2str(char *r, curl_off_t seconds)
@@ -44,8 +46,8 @@ static void time2str(char *r, curl_off_t seconds)
   if(h <= CURL_OFF_T_C(99)) {
     curl_off_t m = (seconds - (h*CURL_OFF_T_C(3600))) / CURL_OFF_T_C(60);
     curl_off_t s = (seconds - (h*CURL_OFF_T_C(3600))) - (m*CURL_OFF_T_C(60));
-    snprintf(r, 9, "%2" CURL_FORMAT_CURL_OFF_T ":%02" CURL_FORMAT_CURL_OFF_T
-             ":%02" CURL_FORMAT_CURL_OFF_T, h, m, s);
+    msnprintf(r, 9, "%2" CURL_FORMAT_CURL_OFF_T ":%02" CURL_FORMAT_CURL_OFF_T
+              ":%02" CURL_FORMAT_CURL_OFF_T, h, m, s);
   }
   else {
     /* this equals to more than 99 hours, switch to a more suitable output
@@ -53,10 +55,10 @@ static void time2str(char *r, curl_off_t seconds)
     curl_off_t d = seconds / CURL_OFF_T_C(86400);
     h = (seconds - (d*CURL_OFF_T_C(86400))) / CURL_OFF_T_C(3600);
     if(d <= CURL_OFF_T_C(999))
-      snprintf(r, 9, "%3" CURL_FORMAT_CURL_OFF_T
-               "d %02" CURL_FORMAT_CURL_OFF_T "h", d, h);
+      msnprintf(r, 9, "%3" CURL_FORMAT_CURL_OFF_T
+                "d %02" CURL_FORMAT_CURL_OFF_T "h", d, h);
     else
-      snprintf(r, 9, "%7" CURL_FORMAT_CURL_OFF_T "d", d);
+      msnprintf(r, 9, "%7" CURL_FORMAT_CURL_OFF_T "d", d);
   }
 }
 
@@ -72,40 +74,40 @@ static char *max5data(curl_off_t bytes, char *max5)
 #define ONE_PETABYTE (CURL_OFF_T_C(1024) * ONE_TERABYTE)
 
   if(bytes < CURL_OFF_T_C(100000))
-    snprintf(max5, 6, "%5" CURL_FORMAT_CURL_OFF_T, bytes);
+    msnprintf(max5, 6, "%5" CURL_FORMAT_CURL_OFF_T, bytes);
 
   else if(bytes < CURL_OFF_T_C(10000) * ONE_KILOBYTE)
-    snprintf(max5, 6, "%4" CURL_FORMAT_CURL_OFF_T "k", bytes/ONE_KILOBYTE);
+    msnprintf(max5, 6, "%4" CURL_FORMAT_CURL_OFF_T "k", bytes/ONE_KILOBYTE);
 
   else if(bytes < CURL_OFF_T_C(100) * ONE_MEGABYTE)
     /* 'XX.XM' is good as long as we're less than 100 megs */
-    snprintf(max5, 6, "%2" CURL_FORMAT_CURL_OFF_T ".%0"
-             CURL_FORMAT_CURL_OFF_T "M", bytes/ONE_MEGABYTE,
-             (bytes%ONE_MEGABYTE) / (ONE_MEGABYTE/CURL_OFF_T_C(10)) );
+    msnprintf(max5, 6, "%2" CURL_FORMAT_CURL_OFF_T ".%0"
+              CURL_FORMAT_CURL_OFF_T "M", bytes/ONE_MEGABYTE,
+              (bytes%ONE_MEGABYTE) / (ONE_MEGABYTE/CURL_OFF_T_C(10)) );
 
 #if (CURL_SIZEOF_CURL_OFF_T > 4)
 
   else if(bytes < CURL_OFF_T_C(10000) * ONE_MEGABYTE)
     /* 'XXXXM' is good until we're at 10000MB or above */
-    snprintf(max5, 6, "%4" CURL_FORMAT_CURL_OFF_T "M", bytes/ONE_MEGABYTE);
+    msnprintf(max5, 6, "%4" CURL_FORMAT_CURL_OFF_T "M", bytes/ONE_MEGABYTE);
 
   else if(bytes < CURL_OFF_T_C(100) * ONE_GIGABYTE)
     /* 10000 MB - 100 GB, we show it as XX.XG */
-    snprintf(max5, 6, "%2" CURL_FORMAT_CURL_OFF_T ".%0"
-             CURL_FORMAT_CURL_OFF_T "G", bytes/ONE_GIGABYTE,
-             (bytes%ONE_GIGABYTE) / (ONE_GIGABYTE/CURL_OFF_T_C(10)) );
+    msnprintf(max5, 6, "%2" CURL_FORMAT_CURL_OFF_T ".%0"
+              CURL_FORMAT_CURL_OFF_T "G", bytes/ONE_GIGABYTE,
+              (bytes%ONE_GIGABYTE) / (ONE_GIGABYTE/CURL_OFF_T_C(10)) );
 
   else if(bytes < CURL_OFF_T_C(10000) * ONE_GIGABYTE)
     /* up to 10000GB, display without decimal: XXXXG */
-    snprintf(max5, 6, "%4" CURL_FORMAT_CURL_OFF_T "G", bytes/ONE_GIGABYTE);
+    msnprintf(max5, 6, "%4" CURL_FORMAT_CURL_OFF_T "G", bytes/ONE_GIGABYTE);
 
   else if(bytes < CURL_OFF_T_C(10000) * ONE_TERABYTE)
     /* up to 10000TB, display without decimal: XXXXT */
-    snprintf(max5, 6, "%4" CURL_FORMAT_CURL_OFF_T "T", bytes/ONE_TERABYTE);
+    msnprintf(max5, 6, "%4" CURL_FORMAT_CURL_OFF_T "T", bytes/ONE_TERABYTE);
 
   else
     /* up to 10000PB, display without decimal: XXXXP */
-    snprintf(max5, 6, "%4" CURL_FORMAT_CURL_OFF_T "P", bytes/ONE_PETABYTE);
+    msnprintf(max5, 6, "%4" CURL_FORMAT_CURL_OFF_T "P", bytes/ONE_PETABYTE);
 
     /* 16384 petabytes (16 exabytes) is the maximum a 64 bit unsigned number
        can hold, but our data type is signed so 8192PB will be the maximum. */
@@ -113,12 +115,13 @@ static char *max5data(curl_off_t bytes, char *max5)
 #else
 
   else
-    snprintf(max5, 6, "%4" CURL_FORMAT_CURL_OFF_T "M", bytes/ONE_MEGABYTE);
+    msnprintf(max5, 6, "%4" CURL_FORMAT_CURL_OFF_T "M", bytes/ONE_MEGABYTE);
 
 #endif
 
   return max5;
 }
+#endif
 
 /*
 
@@ -166,7 +169,7 @@ void Curl_pgrsResetTransferSizes(struct Curl_easy *data)
 void Curl_pgrsTime(struct Curl_easy *data, timerid timer)
 {
   struct curltime now = Curl_now();
-  time_t *delta = NULL;
+  timediff_t *delta = NULL;
 
   switch(timer) {
   default:
@@ -236,6 +239,8 @@ void Curl_pgrsStartNow(struct Curl_easy *data)
   data->progress.ul_limit_start.tv_usec = 0;
   data->progress.dl_limit_start.tv_sec = 0;
   data->progress.dl_limit_start.tv_usec = 0;
+  data->progress.downloaded = 0;
+  data->progress.uploaded = 0;
   /* clear all bits except HIDE and HEADERS_OUT */
   data->progress.flags &= PGRS_HIDE|PGRS_HEADERS_OUT;
   Curl_ratelimit(data, data->progress.start);
@@ -266,8 +271,8 @@ timediff_t Curl_pgrsLimitWaitTime(curl_off_t cursize,
                                   struct curltime now)
 {
   curl_off_t size = cursize - startsize;
-  time_t minimum;
-  time_t actual;
+  timediff_t minimum;
+  timediff_t actual;
 
   if(!limit || !size)
     return 0;
@@ -280,10 +285,10 @@ timediff_t Curl_pgrsLimitWaitTime(curl_off_t cursize,
     minimum = (time_t) (CURL_OFF_T_C(1000) * size / limit);
   else {
     minimum = (time_t) (size / limit);
-    if(minimum < TIME_T_MAX/1000)
+    if(minimum < TIMEDIFF_T_MAX/1000)
       minimum *= 1000;
     else
-      minimum = TIME_T_MAX;
+      minimum = TIMEDIFF_T_MAX;
   }
 
   /*
@@ -362,22 +367,15 @@ void Curl_pgrsSetUploadSize(struct Curl_easy *data, curl_off_t size)
   }
 }
 
-/*
- * Curl_pgrsUpdate() returns 0 for success or the value returned by the
- * progress callback!
- */
-int Curl_pgrsUpdate(struct connectdata *conn)
+/* returns TRUE if it's time to show the progress meter */
+static bool progress_calc(struct connectdata *conn, struct curltime now)
 {
-  struct curltime now;
   curl_off_t timespent;
   curl_off_t timespent_ms; /* milliseconds */
   struct Curl_easy *data = conn->data;
-  int nowindex = data->progress.speeder_c% CURR_TIME;
-  bool shownow = FALSE;
   curl_off_t dl = data->progress.downloaded;
   curl_off_t ul = data->progress.uploaded;
-
-  now = Curl_now(); /* what time is it */
+  bool timetoshow = FALSE;
 
   /* The time spent so far (from the start) */
   data->progress.timespent = Curl_timediff_us(now, data->progress.start);
@@ -399,9 +397,9 @@ int Curl_pgrsUpdate(struct connectdata *conn)
   /* Calculations done at most once a second, unless end is reached */
   if(data->progress.lastshow != now.tv_sec) {
     int countindex; /* amount of seconds stored in the speeder array */
-    shownow = TRUE;
-
+    int nowindex = data->progress.speeder_c% CURR_TIME;
     data->progress.lastshow = now.tv_sec;
+    timetoshow = TRUE;
 
     /* Let's do the "current speed" thing, with the dl + ul speeds
        combined. Store the speed at entry 'nowindex'. */
@@ -434,8 +432,7 @@ int Curl_pgrsUpdate(struct connectdata *conn)
         data->progress.speeder_c%CURR_TIME:0;
 
       /* Figure out the exact time for the time span */
-      span_ms = Curl_timediff(now,
-                              data->progress.speeder_time[checkindex]);
+      span_ms = Curl_timediff(now, data->progress.speeder_time[checkindex]);
       if(0 == span_ms)
         span_ms = 1; /* at least one millisecond MUST have passed */
 
@@ -461,22 +458,132 @@ int Curl_pgrsUpdate(struct connectdata *conn)
         data->progress.ulspeed + data->progress.dlspeed;
 
   } /* Calculations end */
+  return timetoshow;
+}
+
+#ifndef CURL_DISABLE_PROGRESS_METER
+static void progress_meter(struct connectdata *conn)
+{
+  struct Curl_easy *data = conn->data;
+  char max5[6][10];
+  curl_off_t dlpercen = 0;
+  curl_off_t ulpercen = 0;
+  curl_off_t total_percen = 0;
+  curl_off_t total_transfer;
+  curl_off_t total_expected_transfer;
+  char time_left[10];
+  char time_total[10];
+  char time_spent[10];
+  curl_off_t ulestimate = 0;
+  curl_off_t dlestimate = 0;
+  curl_off_t total_estimate;
+  curl_off_t timespent =
+    (curl_off_t)data->progress.timespent/1000000; /* seconds */
+
+  if(!(data->progress.flags & PGRS_HEADERS_OUT)) {
+    if(data->state.resume_from) {
+      fprintf(data->set.err,
+              "** Resuming transfer from byte position %"
+              CURL_FORMAT_CURL_OFF_T "\n", data->state.resume_from);
+    }
+    fprintf(data->set.err,
+            "  %% Total    %% Received %% Xferd  Average Speed   "
+            "Time    Time     Time  Current\n"
+            "                                 Dload  Upload   "
+            "Total   Spent    Left  Speed\n");
+    data->progress.flags |= PGRS_HEADERS_OUT; /* headers are shown */
+  }
+
+  /* Figure out the estimated time of arrival for the upload */
+  if((data->progress.flags & PGRS_UL_SIZE_KNOWN) &&
+     (data->progress.ulspeed > CURL_OFF_T_C(0))) {
+    ulestimate = data->progress.size_ul / data->progress.ulspeed;
+
+    if(data->progress.size_ul > CURL_OFF_T_C(10000))
+      ulpercen = data->progress.uploaded /
+        (data->progress.size_ul/CURL_OFF_T_C(100));
+    else if(data->progress.size_ul > CURL_OFF_T_C(0))
+      ulpercen = (data->progress.uploaded*100) /
+        data->progress.size_ul;
+  }
+
+  /* ... and the download */
+  if((data->progress.flags & PGRS_DL_SIZE_KNOWN) &&
+     (data->progress.dlspeed > CURL_OFF_T_C(0))) {
+    dlestimate = data->progress.size_dl / data->progress.dlspeed;
+
+    if(data->progress.size_dl > CURL_OFF_T_C(10000))
+      dlpercen = data->progress.downloaded /
+        (data->progress.size_dl/CURL_OFF_T_C(100));
+    else if(data->progress.size_dl > CURL_OFF_T_C(0))
+      dlpercen = (data->progress.downloaded*100) /
+        data->progress.size_dl;
+  }
+
+  /* Now figure out which of them is slower and use that one for the
+     total estimate! */
+  total_estimate = ulestimate>dlestimate?ulestimate:dlestimate;
+
+  /* create the three time strings */
+  time2str(time_left, total_estimate > 0?(total_estimate - timespent):0);
+  time2str(time_total, total_estimate);
+  time2str(time_spent, timespent);
+
+  /* Get the total amount of data expected to get transferred */
+  total_expected_transfer =
+    ((data->progress.flags & PGRS_UL_SIZE_KNOWN)?
+     data->progress.size_ul:data->progress.uploaded)+
+    ((data->progress.flags & PGRS_DL_SIZE_KNOWN)?
+     data->progress.size_dl:data->progress.downloaded);
+
+  /* We have transferred this much so far */
+  total_transfer = data->progress.downloaded + data->progress.uploaded;
+
+  /* Get the percentage of data transferred so far */
+  if(total_expected_transfer > CURL_OFF_T_C(10000))
+    total_percen = total_transfer /
+      (total_expected_transfer/CURL_OFF_T_C(100));
+  else if(total_expected_transfer > CURL_OFF_T_C(0))
+    total_percen = (total_transfer*100) / total_expected_transfer;
+
+  fprintf(data->set.err,
+          "\r"
+          "%3" CURL_FORMAT_CURL_OFF_T " %s  "
+          "%3" CURL_FORMAT_CURL_OFF_T " %s  "
+          "%3" CURL_FORMAT_CURL_OFF_T " %s  %s  %s %s %s %s %s",
+          total_percen,  /* 3 letters */                /* total % */
+          max5data(total_expected_transfer, max5[2]),   /* total size */
+          dlpercen,      /* 3 letters */                /* rcvd % */
+          max5data(data->progress.downloaded, max5[0]), /* rcvd size */
+          ulpercen,      /* 3 letters */                /* xfer % */
+          max5data(data->progress.uploaded, max5[1]),   /* xfer size */
+          max5data(data->progress.dlspeed, max5[3]),    /* avrg dl speed */
+          max5data(data->progress.ulspeed, max5[4]),    /* avrg ul speed */
+          time_total,    /* 8 letters */                /* total time */
+          time_spent,    /* 8 letters */                /* time spent */
+          time_left,     /* 8 letters */                /* time left */
+          max5data(data->progress.current_speed, max5[5])
+    );
+
+  /* we flush the output stream to make it appear as soon as possible */
+  fflush(data->set.err);
+}
+#else
+ /* progress bar disabled */
+#define progress_meter(x) Curl_nop_stmt
+#endif
 
-  if(!(data->progress.flags & PGRS_HIDE)) {
-    /* progress meter has not been shut off */
-    char max5[6][10];
-    curl_off_t dlpercen = 0;
-    curl_off_t ulpercen = 0;
-    curl_off_t total_percen = 0;
-    curl_off_t total_transfer;
-    curl_off_t total_expected_transfer;
-    char time_left[10];
-    char time_total[10];
-    char time_spent[10];
-    curl_off_t ulestimate = 0;
-    curl_off_t dlestimate = 0;
-    curl_off_t total_estimate;
 
+/*
+ * Curl_pgrsUpdate() returns 0 for success or the value returned by the
+ * progress callback!
+ */
+int Curl_pgrsUpdate(struct connectdata *conn)
+{
+  struct Curl_easy *data = conn->data;
+  struct curltime now = Curl_now(); /* what time is it */
+  bool showprogress = progress_calc(conn, now);
+  if(!(data->progress.flags & PGRS_HIDE)) {
     if(data->set.fxferinfo) {
       int result;
       /* There's a callback set, call that */
@@ -487,11 +594,13 @@ int Curl_pgrsUpdate(struct connectdata *conn)
                                    data->progress.size_ul,
                                    data->progress.uploaded);
       Curl_set_in_callback(data, false);
-      if(result)
-        failf(data, "Callback aborted");
-      return result;
+      if(result != CURL_PROGRESSFUNC_CONTINUE) {
+        if(result)
+          failf(data, "Callback aborted");
+        return result;
+      }
     }
-    if(data->set.fprogress) {
+    else if(data->set.fprogress) {
       int result;
       /* The older deprecated callback is set, call that */
       Curl_set_in_callback(data, true);
@@ -501,107 +610,16 @@ int Curl_pgrsUpdate(struct connectdata *conn)
                                    (double)data->progress.size_ul,
                                    (double)data->progress.uploaded);
       Curl_set_in_callback(data, false);
-      if(result)
-        failf(data, "Callback aborted");
-      return result;
-    }
-
-    if(!shownow)
-      /* only show the internal progress meter once per second */
-      return 0;
-
-    /* If there's no external callback set, use internal code to show
-       progress */
-
-    if(!(data->progress.flags & PGRS_HEADERS_OUT)) {
-      if(data->state.resume_from) {
-        fprintf(data->set.err,
-                "** Resuming transfer from byte position %"
-                CURL_FORMAT_CURL_OFF_T "\n", data->state.resume_from);
+      if(result != CURL_PROGRESSFUNC_CONTINUE) {
+        if(result)
+          failf(data, "Callback aborted");
+        return result;
       }
-      fprintf(data->set.err,
-              "  %% Total    %% Received %% Xferd  Average Speed   "
-              "Time    Time     Time  Current\n"
-              "                                 Dload  Upload   "
-              "Total   Spent    Left  Speed\n");
-      data->progress.flags |= PGRS_HEADERS_OUT; /* headers are shown */
-    }
-
-    /* Figure out the estimated time of arrival for the upload */
-    if((data->progress.flags & PGRS_UL_SIZE_KNOWN) &&
-       (data->progress.ulspeed > CURL_OFF_T_C(0))) {
-      ulestimate = data->progress.size_ul / data->progress.ulspeed;
-
-      if(data->progress.size_ul > CURL_OFF_T_C(10000))
-        ulpercen = data->progress.uploaded /
-          (data->progress.size_ul/CURL_OFF_T_C(100));
-      else if(data->progress.size_ul > CURL_OFF_T_C(0))
-        ulpercen = (data->progress.uploaded*100) /
-          data->progress.size_ul;
     }
 
-    /* ... and the download */
-    if((data->progress.flags & PGRS_DL_SIZE_KNOWN) &&
-       (data->progress.dlspeed > CURL_OFF_T_C(0))) {
-      dlestimate = data->progress.size_dl / data->progress.dlspeed;
-
-      if(data->progress.size_dl > CURL_OFF_T_C(10000))
-        dlpercen = data->progress.downloaded /
-          (data->progress.size_dl/CURL_OFF_T_C(100));
-      else if(data->progress.size_dl > CURL_OFF_T_C(0))
-        dlpercen = (data->progress.downloaded*100) /
-          data->progress.size_dl;
-    }
-
-    /* Now figure out which of them is slower and use that one for the
-       total estimate! */
-    total_estimate = ulestimate>dlestimate?ulestimate:dlestimate;
-
-    /* create the three time strings */
-    time2str(time_left, total_estimate > 0?(total_estimate - timespent):0);
-    time2str(time_total, total_estimate);
-    time2str(time_spent, timespent);
-
-    /* Get the total amount of data expected to get transferred */
-    total_expected_transfer =
-      (data->progress.flags & PGRS_UL_SIZE_KNOWN?
-       data->progress.size_ul:data->progress.uploaded)+
-      (data->progress.flags & PGRS_DL_SIZE_KNOWN?
-       data->progress.size_dl:data->progress.downloaded);
-
-    /* We have transferred this much so far */
-    total_transfer = data->progress.downloaded + data->progress.uploaded;
-
-    /* Get the percentage of data transferred so far */
-    if(total_expected_transfer > CURL_OFF_T_C(10000))
-      total_percen = total_transfer /
-        (total_expected_transfer/CURL_OFF_T_C(100));
-    else if(total_expected_transfer > CURL_OFF_T_C(0))
-      total_percen = (total_transfer*100) / total_expected_transfer;
-
-    fprintf(data->set.err,
-            "\r"
-            "%3" CURL_FORMAT_CURL_OFF_T " %s  "
-            "%3" CURL_FORMAT_CURL_OFF_T " %s  "
-            "%3" CURL_FORMAT_CURL_OFF_T " %s  %s  %s %s %s %s %s",
-            total_percen,  /* 3 letters */                /* total % */
-            max5data(total_expected_transfer, max5[2]),   /* total size */
-            dlpercen,      /* 3 letters */                /* rcvd % */
-            max5data(data->progress.downloaded, max5[0]), /* rcvd size */
-            ulpercen,      /* 3 letters */                /* xfer % */
-            max5data(data->progress.uploaded, max5[1]),   /* xfer size */
-            max5data(data->progress.dlspeed, max5[3]),    /* avrg dl speed */
-            max5data(data->progress.ulspeed, max5[4]),    /* avrg ul speed */
-            time_total,    /* 8 letters */                /* total time */
-            time_spent,    /* 8 letters */                /* time spent */
-            time_left,     /* 8 letters */                /* time left */
-            max5data(data->progress.current_speed, max5[5]) /* current speed */
-            );
-
-    /* we flush the output stream to make it appear as soon as possible */
-    fflush(data->set.err);
-
-  } /* !(data->progress.flags & PGRS_HIDE) */
+    if(showprogress)
+      progress_meter(conn);
+  }
 
   return 0;
 }
diff --git a/lib/quic.h b/lib/quic.h
new file mode 100644 (file)
index 0000000..1eb23e9
--- /dev/null
@@ -0,0 +1,57 @@
+#ifndef HEADER_CURL_QUIC_H
+#define HEADER_CURL_QUIC_H
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+
+#include "curl_setup.h"
+
+#ifdef ENABLE_QUIC
+#ifdef USE_NGTCP2
+#include "vquic/ngtcp2.h"
+#endif
+#ifdef USE_QUICHE
+#include "vquic/quiche.h"
+#endif
+
+#include "urldata.h"
+
+/* functions provided by the specific backends */
+CURLcode Curl_quic_connect(struct connectdata *conn,
+                           curl_socket_t sockfd,
+                           int sockindex,
+                           const struct sockaddr *addr,
+                           socklen_t addrlen);
+CURLcode Curl_quic_is_connected(struct connectdata *conn,
+                                curl_socket_t sockfd,
+                                bool *connected);
+int Curl_quic_ver(char *p, size_t len);
+CURLcode Curl_quic_done_sending(struct connectdata *conn);
+void Curl_quic_done(struct Curl_easy *data, bool premature);
+bool Curl_quic_data_pending(const struct Curl_easy *data);
+
+#else /* ENABLE_QUIC */
+#define Curl_quic_done_sending(x)
+#define Curl_quic_done(x,y)
+#define Curl_quic_data_pending(x)
+#endif /* !ENABLE_QUIC */
+
+#endif /* HEADER_CURL_QUIC_H */
index 6ee45fe..c415048 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -106,8 +106,7 @@ static CURLcode randit(struct Curl_easy *data, unsigned int *rnd)
  * 'rndptr' points to.
  *
  * If libcurl is built without TLS support or with a TLS backend that lacks a
- * proper random API (Gskit, PolarSSL or mbedTLS), this function will use
- * "weak" random.
+ * proper random API (Gskit or mbedTLS), this function will use "weak" random.
  *
  * When built *with* TLS support and a backend that offers strong random, it
  * will return error if it cannot provide strong random values.
index c6fae35..3c8e2b8 100644 (file)
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -27,8 +27,7 @@
  * 'rnd' points to.
  *
  * If libcurl is built without TLS support or with a TLS backend that lacks a
- * proper random API (Gskit, PolarSSL or mbedTLS), this function will use
- * "weak" random.
+ * proper random API (Gskit or mbedTLS), this function will use "weak" random.
  *
  * When built *with* TLS support and a backend that offers strong random, it
  * will return error if it cannot provide strong random values.
  */
 CURLcode Curl_rand(struct Curl_easy *data, unsigned char *rnd, size_t num);
 
-/* Same as above but outputs only random lowercase hex characters.
-   Does NOT terminate.*/
+/*
+ * Curl_rand_hex() fills the 'rnd' buffer with a given 'num' size with random
+ * hexadecimal digits PLUS a zero terminating byte. It must be an odd number
+ * size.
+ */
 CURLcode Curl_rand_hex(struct Curl_easy *data, unsigned char *rnd,
                        size_t num);
 
index 01dfce6..bba4c16 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
 #include "curl_memory.h"
 #include "memdebug.h"
 
-/*
- * TODO (general)
- *  -incoming server requests
- *      -server CSeq counter
- *  -digest authentication
- *  -connect through proxy
- *  -pipelining?
- */
-
-
 #define RTP_PKT_CHANNEL(p)   ((int)((unsigned char)((p)[1])))
 
 #define RTP_PKT_LENGTH(p)  ((((int)((unsigned char)((p)[2]))) << 8) | \
@@ -62,10 +52,7 @@ static CURLcode rtsp_do(struct connectdata *conn, bool *done);
 static CURLcode rtsp_done(struct connectdata *conn, CURLcode, bool premature);
 static CURLcode rtsp_connect(struct connectdata *conn, bool *done);
 static CURLcode rtsp_disconnect(struct connectdata *conn, bool dead);
-
-static int rtsp_getsock_do(struct connectdata *conn,
-                           curl_socket_t *socks,
-                           int numsocks);
+static int rtsp_getsock_do(struct connectdata *conn, curl_socket_t *socks);
 
 /*
  * Parse and write out any available RTP data.
@@ -80,8 +67,6 @@ static CURLcode rtsp_rtp_readwrite(struct Curl_easy *data,
                                    bool *readmore);
 
 static CURLcode rtsp_setup_connection(struct connectdata *conn);
-
-bool rtsp_connisdead(struct connectdata *check);
 static unsigned int rtsp_conncheck(struct connectdata *check,
                                    unsigned int checks_to_perform);
 
@@ -89,11 +74,9 @@ static unsigned int rtsp_conncheck(struct connectdata *check,
    interface and then we're always _sending_ a request and thus we wait for
    the single socket to become writable only */
 static int rtsp_getsock_do(struct connectdata *conn,
-                           curl_socket_t *socks,
-                           int numsocks)
+                           curl_socket_t *socks)
 {
   /* write mode */
-  (void)numsocks; /* unused, we trust it to be at least 1 */
   socks[0] = conn->sock[FIRSTSOCKET];
   return GETSOCK_WRITESOCK(0);
 }
@@ -147,7 +130,7 @@ static CURLcode rtsp_setup_connection(struct connectdata *conn)
  * Instead, if it is readable, run Curl_connalive() to peek at the socket
  * and distinguish between closed and data.
  */
-bool rtsp_connisdead(struct connectdata *check)
+static bool rtsp_connisdead(struct connectdata *check)
 {
   int sval;
   bool ret_val = TRUE;
@@ -238,7 +221,6 @@ static CURLcode rtsp_done(struct connectdata *conn,
     if(data->set.rtspreq == RTSPREQ_RECEIVE &&
             (conn->proto.rtspc.rtp_channel == -1)) {
       infof(data, "Got an RTP Receive with a CSeq of %ld\n", CSeq_recv);
-      /* TODO CPC: Server -> Client logic here */
     }
   }
 
@@ -251,7 +233,6 @@ static CURLcode rtsp_do(struct connectdata *conn, bool *done)
   CURLcode result = CURLE_OK;
   Curl_RtspReq rtspreq = data->set.rtspreq;
   struct RTSP *rtsp = data->req.protop;
-  struct HTTP *http;
   Curl_send_buffer *req_buffer;
   curl_off_t postsize = 0; /* for ANNOUNCE and SET_PARAMETER */
   curl_off_t putsize = 0; /* for ANNOUNCE and SET_PARAMETER */
@@ -270,10 +251,6 @@ static CURLcode rtsp_do(struct connectdata *conn, bool *done)
 
   *done = TRUE;
 
-  http = &(rtsp->http_wrapper);
-  /* Assert that no one has changed the RTSP struct in an evil way */
-  DEBUGASSERT((void *)http == (void *)rtsp);
-
   rtsp->CSeq_sent = data->state.rtsp_next_client_CSeq;
   rtsp->CSeq_recv = 0;
 
@@ -330,8 +307,7 @@ static CURLcode rtsp_do(struct connectdata *conn, bool *done)
   }
 
   if(rtspreq == RTSPREQ_RECEIVE) {
-    Curl_setup_transfer(conn, FIRSTSOCKET, -1, TRUE,
-                        &http->readbytecount, -1, NULL);
+    Curl_setup_transfer(data, FIRSTSOCKET, -1, TRUE, -1);
 
     return result;
   }
@@ -344,8 +320,6 @@ static CURLcode rtsp_do(struct connectdata *conn, bool *done)
     return CURLE_BAD_FUNCTION_ARGUMENT;
   }
 
-  /* TODO: proxy? */
-
   /* Stream URI. Default to server '*' if not specified */
   if(data->set.str[STRING_RTSP_STREAM_URI]) {
     p_stream_uri = data->set.str[STRING_RTSP_STREAM_URI];
@@ -512,7 +486,7 @@ static CURLcode rtsp_do(struct connectdata *conn, bool *done)
     return result;
 
   if((rtspreq == RTSPREQ_SETUP) || (rtspreq == RTSPREQ_DESCRIBE)) {
-    result = Curl_add_timecondition(data, req_buffer);
+    result = Curl_add_timecondition(conn, req_buffer);
     if(result)
       return result;
   }
@@ -599,17 +573,15 @@ static CURLcode rtsp_do(struct connectdata *conn, bool *done)
     return result;
   }
 
-  Curl_setup_transfer(conn, FIRSTSOCKET, -1, TRUE, &http->readbytecount,
-                      putsize?FIRSTSOCKET:-1,
-                      putsize?&http->writebytecount:NULL);
+  Curl_setup_transfer(data, FIRSTSOCKET, -1, TRUE, putsize?FIRSTSOCKET:-1);
 
   /* Increment the CSeq on success */
   data->state.rtsp_next_client_CSeq++;
 
-  if(http->writebytecount) {
+  if(data->req.writebytecount) {
     /* if a request-body has been sent off, we make sure this progress is
        noted properly */
-    Curl_pgrsSetUploadCounter(data, http->writebytecount);
+    Curl_pgrsSetUploadCounter(data, data->req.writebytecount);
     if(Curl_pgrsUpdate(conn))
       result = CURLE_ABORTED_BY_CALLBACK;
   }
index 2f9cc32..1aae864 100644 (file)
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
index 6165d0a..fbfa707 100644 (file)
@@ -7,10 +7,10 @@
  * rewrite to work around the paragraph 2 in the BSD licenses as explained
  * below.
  *
- * Copyright (c) 1998, 1999, 2017 Kungliga Tekniska Högskolan
+ * Copyright (c) 1998, 1999, 2017 Kungliga Tekniska Högskolan
  * (Royal Institute of Technology, Stockholm, Sweden).
  *
- * Copyright (C) 2001 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 2001 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * All rights reserved.
  *
@@ -120,7 +120,7 @@ static int ftp_send_command(struct connectdata *conn, const char *message, ...)
   char print_buffer[50];
 
   va_start(args, message);
-  vsnprintf(print_buffer, sizeof(print_buffer), message, args);
+  mvsnprintf(print_buffer, sizeof(print_buffer), message, args);
   va_end(args);
 
   if(Curl_ftpsend(conn, print_buffer)) {
@@ -142,7 +142,7 @@ socket_read(curl_socket_t fd, void *to, size_t len)
 {
   char *to_p = to;
   CURLcode result;
-  ssize_t nread;
+  ssize_t nread = 0;
 
   while(len > 0) {
     result = Curl_read_plain(fd, to_p, len, &nread);
@@ -151,7 +151,6 @@ socket_read(curl_socket_t fd, void *to, size_t len)
       to_p += nread;
     }
     else {
-      /* FIXME: We are doing a busy wait */
       if(result == CURLE_AGAIN)
         continue;
       return result;
@@ -179,7 +178,6 @@ socket_write(struct connectdata *conn, curl_socket_t fd, const void *to,
       to_p += written;
     }
     else {
-      /* FIXME: We are doing a busy wait */
       if(result == CURLE_AGAIN)
         continue;
       return result;
@@ -193,7 +191,6 @@ static CURLcode read_data(struct connectdata *conn,
                           struct krb5buffer *buf)
 {
   int len;
-  void *tmp = NULL;
   CURLcode result;
 
   result = socket_read(fd, &len, sizeof(len));
@@ -203,12 +200,11 @@ static CURLcode read_data(struct connectdata *conn,
   if(len) {
     /* only realloc if there was a length */
     len = ntohl(len);
-    tmp = Curl_saferealloc(buf->data, len);
+    buf->data = Curl_saferealloc(buf->data, len);
   }
-  if(tmp == NULL)
+  if(!len || !buf->data)
     return CURLE_OUT_OF_MEMORY;
 
-  buf->data = tmp;
   result = socket_read(fd, buf->data, len);
   if(result)
     return result;
@@ -240,7 +236,7 @@ static ssize_t sec_recv(struct connectdata *conn, int sockindex,
 
   /* Handle clear text response. */
   if(conn->sec_complete == 0 || conn->data_prot == PROT_CLEAR)
-      return read(fd, buffer, len);
+      return sread(fd, buffer, len);
 
   if(conn->in_buffer.eof_flag) {
     conn->in_buffer.eof_flag = 0;
@@ -265,13 +261,11 @@ static ssize_t sec_recv(struct connectdata *conn, int sockindex,
     total_read += bytes_read;
     buffer += bytes_read;
   }
-  /* FIXME: Check for overflow */
   return total_read;
 }
 
 /* Send |length| bytes from |from| to the |fd| socket taking care of encoding
-   and negociating with the server. |from| can be NULL. */
-/* FIXME: We don't check for errors nor report any! */
+   and negotiating with the server. |from| can be NULL. */
 static void do_sec_send(struct connectdata *conn, curl_socket_t fd,
                         const char *from, int length)
 {
@@ -406,18 +400,14 @@ int Curl_sec_read_msg(struct connectdata *conn, char *buffer,
 
   if(buf[decoded_len - 1] == '\n')
     buf[decoded_len - 1] = '\0';
-  /* FIXME: Is |buffer| length always greater than |decoded_len|? */
   strcpy(buffer, buf);
   free(buf);
   return ret_code;
 }
 
-/* FIXME: The error code returned here is never checked. */
 static int sec_set_protection_level(struct connectdata *conn)
 {
   int code;
-  char *pbsz;
-  static unsigned int buffer_size = 1 << 20; /* 1048576 */
   enum protection_level level = conn->request_data_prot;
 
   DEBUGASSERT(level > PROT_NONE && level < PROT_LAST);
@@ -433,6 +423,9 @@ static int sec_set_protection_level(struct connectdata *conn)
     return 0;
 
   if(level) {
+    char *pbsz;
+    static unsigned int buffer_size = 1 << 20; /* 1048576 */
+
     code = ftp_send_command(conn, "PBSZ %u", buffer_size);
     if(code < 0)
       return -1;
@@ -508,7 +501,6 @@ static CURLcode choose_mech(struct connectdata *conn)
   infof(data, "Trying mechanism %s...\n", mech->name);
   ret = ftp_send_command(conn, "AUTH %s", mech->name);
   if(ret < 0)
-    /* FIXME: This error is too generic but it is OK for now. */
     return CURLE_COULDNT_CONNECT;
 
   if(ret/100 != 3) {
@@ -575,7 +567,6 @@ Curl_sec_end(struct connectdata *conn)
     conn->in_buffer.data = NULL;
     conn->in_buffer.size = 0;
     conn->in_buffer.index = 0;
-    /* FIXME: Is this really needed? */
     conn->in_buffer.eof_flag = 0;
   }
   conn->sec_complete = 0;
index 8cd9eb2..2de503d 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
index 9a1ba45..687ab16 100644 (file)
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -77,9 +77,9 @@ int Curl_socket_check(curl_socket_t readfd, curl_socket_t readfd2,
                       time_t timeout_ms);
 
 #define SOCKET_READABLE(x,z) \
-  Curl_socket_check(x, CURL_SOCKET_BAD, CURL_SOCKET_BAD, z)
+  Curl_socket_check(x, CURL_SOCKET_BAD, CURL_SOCKET_BAD, (time_t)z)
 #define SOCKET_WRITABLE(x,z) \
-  Curl_socket_check(CURL_SOCKET_BAD, CURL_SOCKET_BAD, x, z)
+  Curl_socket_check(CURL_SOCKET_BAD, CURL_SOCKET_BAD, x, (time_t)z)
 
 int Curl_poll(struct pollfd ufds[], unsigned int nfds, int timeout_ms);
 
@@ -109,7 +109,7 @@ int tpf_select_libcurl(int maxfds, fd_set* reads, fd_set* writes,
     SET_SOCKERRNO(EINVAL); \
     return -1; \
   } \
-} WHILE_FALSE
+} while(0)
 #endif
 
 #endif /* HEADER_CURL_SELECT_H */
index d3c10b3..6c38b04 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -36,7 +36,7 @@
 #include "sendf.h"
 #include "connect.h"
 #include "vtls/vtls.h"
-#include "ssh.h"
+#include "vssh/ssh.h"
 #include "easyif.h"
 #include "multiif.h"
 #include "non-ascii.h"
@@ -224,7 +224,7 @@ bool Curl_recv_has_postponed_data(struct connectdata *conn, int sockindex)
   (void)sockindex;
   return false;
 }
-#define pre_receive_plain(c,n) do {} WHILE_FALSE
+#define pre_receive_plain(c,n) do {} while(0)
 #define get_pre_recved(c,n,b,l) 0
 #endif /* ! USE_RECV_BEFORE_SEND_WORKAROUND */
 
@@ -237,7 +237,18 @@ void Curl_infof(struct Curl_easy *data, const char *fmt, ...)
     size_t len;
     char print_buffer[2048 + 1];
     va_start(ap, fmt);
-    vsnprintf(print_buffer, sizeof(print_buffer), fmt, ap);
+    len = mvsnprintf(print_buffer, sizeof(print_buffer), fmt, ap);
+    /*
+     * Indicate truncation of the input by replacing the last 3 characters
+     * with "...", and transfer the newline over in case the format had one.
+     */
+    if(len >= sizeof(print_buffer)) {
+      len = strlen(fmt);
+      if(fmt[--len] == '\n')
+        msnprintf(print_buffer + (sizeof(print_buffer) - 5), 5, "...\n");
+      else
+        msnprintf(print_buffer + (sizeof(print_buffer) - 4), 4, "...");
+    }
     va_end(ap);
     len = strlen(print_buffer);
     Curl_debug(data, CURLINFO_TEXT, print_buffer, len);
@@ -255,7 +266,7 @@ void Curl_failf(struct Curl_easy *data, const char *fmt, ...)
     size_t len;
     char error[CURL_ERROR_SIZE + 2];
     va_start(ap, fmt);
-    vsnprintf(error, CURL_ERROR_SIZE, fmt, ap);
+    mvsnprintf(error, CURL_ERROR_SIZE, fmt, ap);
     len = strlen(error);
 
     if(data->set.errorbuffer && !data->state.errorbuf) {
@@ -400,8 +411,9 @@ ssize_t Curl_send_plain(struct connectdata *conn, int num,
       *code = CURLE_AGAIN;
     }
     else {
+      char buffer[STRERROR_LEN];
       failf(conn->data, "Send failure: %s",
-            Curl_strerror(conn, err));
+            Curl_strerror(err, buffer, sizeof(buffer)));
       conn->data->state.os_errno = err;
       *code = CURLE_SEND_ERROR;
     }
@@ -465,8 +477,9 @@ ssize_t Curl_recv_plain(struct connectdata *conn, int num, char *buf,
       *code = CURLE_AGAIN;
     }
     else {
+      char buffer[STRERROR_LEN];
       failf(conn->data, "Recv failure: %s",
-            Curl_strerror(conn, err));
+            Curl_strerror(err, buffer, sizeof(buffer)));
       conn->data->state.os_errno = err;
       *code = CURLE_RECV_ERROR;
     }
@@ -582,7 +595,10 @@ static CURLcode chop_write(struct connectdata *conn,
     size_t chunklen = len <= CURL_MAX_WRITE_SIZE? len: CURL_MAX_WRITE_SIZE;
 
     if(writebody) {
-      size_t wrote = writebody(ptr, 1, chunklen, data->set.out);
+      size_t wrote;
+      Curl_set_in_callback(data, true);
+      wrote = writebody(ptr, 1, chunklen, data->set.out);
+      Curl_set_in_callback(data, false);
 
       if(CURL_WRITEFUNC_PAUSE == wrote) {
         if(conn->handler->flags & PROTOPT_NONETWORK) {
@@ -711,10 +727,6 @@ CURLcode Curl_read(struct connectdata *conn, /* connection data */
   char *buffertofill = NULL;
   struct Curl_easy *data = conn->data;
 
-  /* if HTTP/1 pipelining is both wanted and possible */
-  bool pipelining = Curl_pipeline_wanted(data->multi, CURLPIPE_HTTP1) &&
-    (conn->bundle->multiuse == BUNDLE_PIPELINING);
-
   /* Set 'num' to 0 or 1, depending on which socket that has been sent here.
      If it is the second socket, we set num to 1. Otherwise to 0. This lets
      us use the correct ssl handle. */
@@ -722,40 +734,13 @@ CURLcode Curl_read(struct connectdata *conn, /* connection data */
 
   *n = 0; /* reset amount to zero */
 
-  /* If session can pipeline, check connection buffer  */
-  if(pipelining) {
-    size_t bytestocopy = CURLMIN(conn->buf_len - conn->read_pos,
-                                 sizerequested);
-
-    /* Copy from our master buffer first if we have some unread data there*/
-    if(bytestocopy > 0) {
-      memcpy(buf, conn->master_buffer + conn->read_pos, bytestocopy);
-      conn->read_pos += bytestocopy;
-      conn->bits.stream_was_rewound = FALSE;
-
-      *n = (ssize_t)bytestocopy;
-      return CURLE_OK;
-    }
-    /* If we come here, it means that there is no data to read from the buffer,
-     * so we read from the socket */
-    bytesfromsocket = CURLMIN(sizerequested, MASTERBUF_SIZE);
-    buffertofill = conn->master_buffer;
-  }
-  else {
-    bytesfromsocket = CURLMIN(sizerequested, (size_t)data->set.buffer_size);
-    buffertofill = buf;
-  }
+  bytesfromsocket = CURLMIN(sizerequested, (size_t)data->set.buffer_size);
+  buffertofill = buf;
 
   nread = conn->recv[num](conn, num, buffertofill, bytesfromsocket, &result);
   if(nread < 0)
     return result;
 
-  if(pipelining) {
-    memcpy(buf, conn->master_buffer, nread);
-    conn->buf_len = nread;
-    conn->read_pos = nread;
-  }
-
   *n += nread;
 
   return CURLE_OK;
index 22956a2..5f88ad3 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -44,6 +44,7 @@
 #include "http2.h"
 #include "setopt.h"
 #include "multiif.h"
+#include "altsvc.h"
 
 /* The last 3 #include files should be in this order */
 #include "curl_printf.h"
@@ -60,6 +61,13 @@ CURLcode Curl_setstropt(char **charp, const char *s)
   if(s) {
     char *str = strdup(s);
 
+    if(str) {
+      size_t len = strlen(str);
+      if(len > CURL_MAX_INPUT_LENGTH) {
+        free(str);
+        return CURLE_BAD_FUNCTION_ARGUMENT;
+      }
+    }
     if(!str)
       return CURLE_OUT_OF_MEMORY;
 
@@ -111,12 +119,16 @@ static CURLcode setstropt_userpwd(char *option, char **userp, char **passwdp)
 #define C_SSLVERSION_VALUE(x) (x & 0xffff)
 #define C_SSLVERSION_MAX_VALUE(x) (x & 0xffff0000)
 
-CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option,
-                      va_list param)
+/*
+ * Do not make Curl_vsetopt() static: it is called from
+ * packages/OS400/ccsidcurl.c.
+ */
+CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option, va_list param)
 {
   char *argptr;
   CURLcode result = CURLE_OK;
   long arg;
+  unsigned long uarg;
   curl_off_t bigsize;
 
   switch(option) {
@@ -127,23 +139,20 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option,
     data->set.dns_cache_timeout = arg;
     break;
   case CURLOPT_DNS_USE_GLOBAL_CACHE:
-#if 0 /* deprecated */
-    /* remember we want this enabled */
-    arg = va_arg(param, long);
-    data->set.global_dns_cache = (0 != arg) ? TRUE : FALSE;
-#endif
+    /* deprecated */
     break;
   case CURLOPT_SSL_CIPHER_LIST:
     /* set a list of cipher we want to use in the SSL connection */
     result = Curl_setstropt(&data->set.str[STRING_SSL_CIPHER_LIST_ORIG],
                             va_arg(param, char *));
     break;
+#ifndef CURL_DISABLE_PROXY
   case CURLOPT_PROXY_SSL_CIPHER_LIST:
     /* set a list of cipher we want to use in the SSL connection for proxy */
     result = Curl_setstropt(&data->set.str[STRING_SSL_CIPHER_LIST_PROXY],
                             va_arg(param, char *));
     break;
-
+#endif
   case CURLOPT_TLS13_CIPHERS:
     if(Curl_ssl_tls13_ciphersuites()) {
       /* set preferred list of TLS 1.3 cipher suites */
@@ -153,6 +162,7 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option,
     else
       return CURLE_NOT_BUILT_IN;
     break;
+#ifndef CURL_DISABLE_PROXY
   case CURLOPT_PROXY_TLS13_CIPHERS:
     if(Curl_ssl_tls13_ciphersuites()) {
       /* set preferred list of TLS 1.3 cipher suites for proxy */
@@ -162,7 +172,7 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option,
     else
       return CURLE_NOT_BUILT_IN;
     break;
-
+#endif
   case CURLOPT_RANDOM_FILE:
     /*
      * This is the path name to a file that contains random data to seed
@@ -270,27 +280,6 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option,
      */
     data->set.get_filetime = (0 != va_arg(param, long)) ? TRUE : FALSE;
     break;
-  case CURLOPT_FTP_CREATE_MISSING_DIRS:
-    /*
-     * An FTP option that modifies an upload to create missing directories on
-     * the server.
-     */
-    switch(va_arg(param, long)) {
-    case 0:
-      data->set.ftp_create_missing_dirs = 0;
-      break;
-    case 1:
-      data->set.ftp_create_missing_dirs = 1;
-      break;
-    case 2:
-      data->set.ftp_create_missing_dirs = 2;
-      break;
-    default:
-      /* reserve other values for future use */
-      result = CURLE_UNKNOWN_OPTION;
-      break;
-    }
-    break;
   case CURLOPT_SERVER_RESPONSE_TIMEOUT:
     /*
      * Option that specifies how quickly an server response must be obtained
@@ -302,6 +291,7 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option,
     else
       return CURLE_BAD_FUNCTION_ARGUMENT;
     break;
+#ifndef CURL_DISABLE_TFTP
   case CURLOPT_TFTP_NO_OPTIONS:
     /*
      * Option that prevents libcurl from sending TFTP option requests to the
@@ -318,34 +308,14 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option,
       return CURLE_BAD_FUNCTION_ARGUMENT;
     data->set.tftp_blksize = arg;
     break;
-  case CURLOPT_DIRLISTONLY:
-    /*
-     * An option that changes the command to one that asks for a list
-     * only, no file info details.
-     */
-    data->set.ftp_list_only = (0 != va_arg(param, long)) ? TRUE : FALSE;
-    break;
-  case CURLOPT_APPEND:
-    /*
-     * We want to upload and append to an existing file.
-     */
-    data->set.ftp_append = (0 != va_arg(param, long)) ? TRUE : FALSE;
-    break;
-  case CURLOPT_FTP_FILEMETHOD:
-    /*
-     * How do access files over FTP.
-     */
-    arg = va_arg(param, long);
-    if((arg < CURLFTPMETHOD_DEFAULT) || (arg > CURLFTPMETHOD_SINGLECWD))
-      return CURLE_BAD_FUNCTION_ARGUMENT;
-    data->set.ftp_filemethod = (curl_ftpfile)arg;
-    break;
+#endif
+#ifndef CURL_DISABLE_NETRC
   case CURLOPT_NETRC:
     /*
      * Parse the $HOME/.netrc file
      */
     arg = va_arg(param, long);
-    if((arg < CURL_NETRC_IGNORED) || (arg > CURL_NETRC_REQUIRED))
+    if((arg < CURL_NETRC_IGNORED) || (arg >= CURL_NETRC_LAST))
       return CURLE_BAD_FUNCTION_ARGUMENT;
     data->set.use_netrc = (enum CURL_NETRC_OPTION)arg;
     break;
@@ -356,6 +326,7 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option,
     result = Curl_setstropt(&data->set.str[STRING_NETRC_FILE],
                             va_arg(param, char *));
     break;
+#endif
   case CURLOPT_TRANSFERTEXT:
     /*
      * This option was previously named 'FTPASCII'. Renamed to work with
@@ -371,7 +342,7 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option,
      * curl/curl.h header file.
      */
     arg = va_arg(param, long);
-    if((arg < CURL_TIMECOND_NONE) || (arg > CURL_TIMECOND_LASTMOD))
+    if((arg < CURL_TIMECOND_NONE) || (arg >= CURL_TIMECOND_LAST))
       return CURLE_BAD_FUNCTION_ARGUMENT;
     data->set.timecondition = (curl_TimeCond)arg;
     break;
@@ -663,6 +634,7 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option,
     break;
 
 #ifndef CURL_DISABLE_HTTP
+#ifndef CURL_DISABLE_PROXY
   case CURLOPT_PROXYHEADER:
     /*
      * Set a list with proxy headers to use (or replace internals with)
@@ -676,13 +648,13 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option,
      */
     data->set.proxyheaders = va_arg(param, struct curl_slist *);
     break;
-
+#endif
   case CURLOPT_HEADEROPT:
     /*
      * Set header option.
      */
     arg = va_arg(param, long);
-    data->set.sep_headers = (arg & CURLHEADER_SEPARATE)? TRUE: FALSE;
+    data->set.sep_headers = (bool)((arg & CURLHEADER_SEPARATE)? TRUE: FALSE);
     break;
 
   case CURLOPT_HTTP200ALIASES:
@@ -780,7 +752,7 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option,
     }
     else if(strcasecompare(argptr, "FLUSH")) {
       /* flush cookies to file, takes care of the locking */
-      Curl_flush_cookies(data, 0);
+      Curl_flush_cookies(data, FALSE);
     }
     else if(strcasecompare(argptr, "RELOAD")) {
       /* reload cookies from file */
@@ -803,12 +775,12 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option,
         if(checkprefix("Set-Cookie:", argptr))
           /* HTTP Header format line */
           Curl_cookie_add(data, data->cookies, TRUE, FALSE, argptr + 11, NULL,
-                          NULL);
+                          NULL, TRUE);
 
         else
           /* Netscape format line */
           Curl_cookie_add(data, data->cookies, FALSE, FALSE, argptr, NULL,
-                          NULL);
+                          NULL, TRUE);
 
         Curl_share_unlock(data, CURL_LOCK_DATA_COOKIE);
         free(argptr);
@@ -837,11 +809,16 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option,
     arg = va_arg(param, long);
     if(arg < CURL_HTTP_VERSION_NONE)
       return CURLE_BAD_FUNCTION_ARGUMENT;
+#ifdef ENABLE_QUIC
+    if(arg == CURL_HTTP_VERSION_3)
+      ;
+    else
+#endif
 #ifndef USE_NGHTTP2
     if(arg >= CURL_HTTP_VERSION_2)
       return CURLE_UNSUPPORTED_PROTOCOL;
 #else
-    if(arg > CURL_HTTP_VERSION_2_PRIOR_KNOWLEDGE)
+    if(arg >= CURL_HTTP_VERSION_LAST)
       return CURLE_UNSUPPORTED_PROTOCOL;
     if(arg == CURL_HTTP_VERSION_NONE)
       arg = CURL_HTTP_VERSION_2TLS;
@@ -860,6 +837,12 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option,
     data->set.expect_100_timeout = arg;
     break;
 
+  case CURLOPT_HTTP09_ALLOWED:
+    arg = va_arg(param, unsigned long);
+    if(arg > 1L)
+      return CURLE_BAD_FUNCTION_ARGUMENT;
+    data->set.http09_allowed = arg ? TRUE : FALSE;
+    break;
 #endif   /* CURL_DISABLE_HTTP */
 
   case CURLOPT_HTTPAUTH:
@@ -878,7 +861,8 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option,
 
     /* the DIGEST_IE bit is only used to set a special marker, for all the
        rest we need to handle it as normal DIGEST */
-    data->state.authhost.iestyle = (auth & CURLAUTH_DIGEST_IE) ? TRUE : FALSE;
+    data->state.authhost.iestyle =
+      (bool)((auth & CURLAUTH_DIGEST_IE) ? TRUE : FALSE);
 
     if(auth & CURLAUTH_DIGEST_IE) {
       auth |= CURLAUTH_DIGEST; /* set standard digest bit */
@@ -961,7 +945,8 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option,
 
     /* the DIGEST_IE bit is only used to set a special marker, for all the
        rest we need to handle it as normal DIGEST */
-    data->state.authproxy.iestyle = (auth & CURLAUTH_DIGEST_IE) ? TRUE : FALSE;
+    data->state.authproxy.iestyle =
+      (bool)((auth & CURLAUTH_DIGEST_IE) ? TRUE : FALSE);
 
     if(auth & CURLAUTH_DIGEST_IE) {
       auth |= CURLAUTH_DIGEST; /* set standard digest bit */
@@ -1063,7 +1048,7 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option,
     data->set.socks5_gssapi_nec = (0 != va_arg(param, long)) ? TRUE : FALSE;
     break;
 #endif
-
+#ifndef CURL_DISABLE_PROXY
   case CURLOPT_SOCKS5_GSSAPI_SERVICE:
   case CURLOPT_PROXY_SERVICE_NAME:
     /*
@@ -1072,7 +1057,7 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option,
     result = Curl_setstropt(&data->set.str[STRING_PROXY_SERVICE_NAME],
                             va_arg(param, char *));
     break;
-
+#endif
   case CURLOPT_SERVICE_NAME:
     /*
      * Set authentication service name for DIGEST-MD5, Kerberos 5 and SPNEGO
@@ -1101,6 +1086,33 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option,
      */
     data->set.out = va_arg(param, void *);
     break;
+
+  case CURLOPT_DIRLISTONLY:
+    /*
+     * An option that changes the command to one that asks for a list only, no
+     * file info details. Used for FTP, POP3 and SFTP.
+     */
+    data->set.ftp_list_only = (0 != va_arg(param, long)) ? TRUE : FALSE;
+    break;
+
+  case CURLOPT_APPEND:
+    /*
+     * We want to upload and append to an existing file. Used for FTP and
+     * SFTP.
+     */
+    data->set.ftp_append = (0 != va_arg(param, long)) ? TRUE : FALSE;
+    break;
+
+#ifndef CURL_DISABLE_FTP
+  case CURLOPT_FTP_FILEMETHOD:
+    /*
+     * How do access files over FTP.
+     */
+    arg = va_arg(param, long);
+    if((arg < CURLFTPMETHOD_DEFAULT) || (arg >= CURLFTPMETHOD_LAST))
+      return CURLE_BAD_FUNCTION_ARGUMENT;
+    data->set.ftp_filemethod = (curl_ftpfile)arg;
+    break;
   case CURLOPT_FTPPORT:
     /*
      * Use FTP PORT, this also specifies which IP address to use
@@ -1124,7 +1136,7 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option,
 
   case CURLOPT_FTP_SSL_CCC:
     arg = va_arg(param, long);
-    if((arg < CURLFTPSSL_CCC_NONE) || (arg > CURLFTPSSL_CCC_ACTIVE))
+    if((arg < CURLFTPSSL_CCC_NONE) || (arg >= CURLFTPSSL_CCC_LAST))
       return CURLE_BAD_FUNCTION_ARGUMENT;
     data->set.ftp_ccc = (curl_ftpccc)arg;
     break;
@@ -1137,6 +1149,55 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option,
     data->set.ftp_skip_ip = (0 != va_arg(param, long)) ? TRUE : FALSE;
     break;
 
+  case CURLOPT_FTP_ACCOUNT:
+    result = Curl_setstropt(&data->set.str[STRING_FTP_ACCOUNT],
+                            va_arg(param, char *));
+    break;
+
+  case CURLOPT_FTP_ALTERNATIVE_TO_USER:
+    result = Curl_setstropt(&data->set.str[STRING_FTP_ALTERNATIVE_TO_USER],
+                            va_arg(param, char *));
+    break;
+
+  case CURLOPT_FTPSSLAUTH:
+    /*
+     * Set a specific auth for FTP-SSL transfers.
+     */
+    arg = va_arg(param, long);
+    if((arg < CURLFTPAUTH_DEFAULT) || (arg >= CURLFTPAUTH_LAST))
+      return CURLE_BAD_FUNCTION_ARGUMENT;
+    data->set.ftpsslauth = (curl_ftpauth)arg;
+    break;
+  case CURLOPT_KRBLEVEL:
+    /*
+     * A string that defines the kerberos security level.
+     */
+    result = Curl_setstropt(&data->set.str[STRING_KRB_LEVEL],
+                            va_arg(param, char *));
+    data->set.krb = (data->set.str[STRING_KRB_LEVEL]) ? TRUE : FALSE;
+    break;
+#endif
+  case CURLOPT_FTP_CREATE_MISSING_DIRS:
+    /*
+     * An FTP/SFTP option that modifies an upload to create missing
+     * directories on the server.
+     */
+    switch(va_arg(param, long)) {
+    case 0:
+      data->set.ftp_create_missing_dirs = 0;
+      break;
+    case 1:
+      data->set.ftp_create_missing_dirs = 1;
+      break;
+    case 2:
+      data->set.ftp_create_missing_dirs = 2;
+      break;
+    default:
+      /* reserve other values for future use */
+      result = CURLE_UNKNOWN_OPTION;
+      break;
+    }
+    break;
   case CURLOPT_READDATA:
     /*
      * FILE pointer to read the file to be uploaded from. Or possibly
@@ -1204,6 +1265,12 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option,
       return CURLE_BAD_FUNCTION_ARGUMENT;
     data->set.low_speed_time = arg;
     break;
+  case CURLOPT_CURLU:
+    /*
+     * pass CURLU to set URL
+     */
+    data->set.uh = va_arg(param, CURLU *);
+    break;
   case CURLOPT_URL:
     /*
      * The URL to fetch.
@@ -1539,6 +1606,7 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option,
     result = Curl_setstropt(&data->set.str[STRING_CERT_ORIG],
                             va_arg(param, char *));
     break;
+#ifndef CURL_DISABLE_PROXY
   case CURLOPT_PROXY_SSLCERT:
     /*
      * String that holds file name of the SSL certificate to use for proxy
@@ -1546,6 +1614,7 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option,
     result = Curl_setstropt(&data->set.str[STRING_CERT_PROXY],
                             va_arg(param, char *));
     break;
+#endif
   case CURLOPT_SSLCERTTYPE:
     /*
      * String that holds file type of the SSL certificate to use
@@ -1553,6 +1622,7 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option,
     result = Curl_setstropt(&data->set.str[STRING_CERT_TYPE_ORIG],
                             va_arg(param, char *));
     break;
+#ifndef CURL_DISABLE_PROXY
   case CURLOPT_PROXY_SSLCERTTYPE:
     /*
      * String that holds file type of the SSL certificate to use for proxy
@@ -1560,6 +1630,7 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option,
     result = Curl_setstropt(&data->set.str[STRING_CERT_TYPE_PROXY],
                             va_arg(param, char *));
     break;
+#endif
   case CURLOPT_SSLKEY:
     /*
      * String that holds file name of the SSL key to use
@@ -1567,6 +1638,7 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option,
     result = Curl_setstropt(&data->set.str[STRING_KEY_ORIG],
                             va_arg(param, char *));
     break;
+#ifndef CURL_DISABLE_PROXY
   case CURLOPT_PROXY_SSLKEY:
     /*
      * String that holds file name of the SSL key to use for proxy
@@ -1574,6 +1646,7 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option,
     result = Curl_setstropt(&data->set.str[STRING_KEY_PROXY],
                             va_arg(param, char *));
     break;
+#endif
   case CURLOPT_SSLKEYTYPE:
     /*
      * String that holds file type of the SSL key to use
@@ -1581,6 +1654,7 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option,
     result = Curl_setstropt(&data->set.str[STRING_KEY_TYPE_ORIG],
                             va_arg(param, char *));
     break;
+#ifndef CURL_DISABLE_PROXY
   case CURLOPT_PROXY_SSLKEYTYPE:
     /*
      * String that holds file type of the SSL key to use for proxy
@@ -1588,6 +1662,7 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option,
     result = Curl_setstropt(&data->set.str[STRING_KEY_TYPE_PROXY],
                             va_arg(param, char *));
     break;
+#endif
   case CURLOPT_KEYPASSWD:
     /*
      * String that holds the SSL or SSH private key password.
@@ -1595,6 +1670,7 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option,
     result = Curl_setstropt(&data->set.str[STRING_KEY_PASSWD_ORIG],
                             va_arg(param, char *));
     break;
+#ifndef CURL_DISABLE_PROXY
   case CURLOPT_PROXY_KEYPASSWD:
     /*
      * String that holds the SSL private key password for proxy.
@@ -1602,6 +1678,7 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option,
     result = Curl_setstropt(&data->set.str[STRING_KEY_PASSWD_PROXY],
                             va_arg(param, char *));
     break;
+#endif
   case CURLOPT_SSLENGINE:
     /*
      * String that holds the SSL crypto engine.
@@ -1628,14 +1705,14 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option,
      */
     data->set.crlf = (0 != va_arg(param, long)) ? TRUE : FALSE;
     break;
-
+#ifndef CURL_DISABLE_PROXY
   case CURLOPT_HAPROXYPROTOCOL:
     /*
      * Set to send the HAProxy Proxy Protocol header
      */
     data->set.haproxyprotocol = (0 != va_arg(param, long)) ? TRUE : FALSE;
     break;
-
+#endif
   case CURLOPT_INTERFACE:
     /*
      * Set what interface or address/hostname to bind the socket to when
@@ -1662,14 +1739,6 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option,
       return CURLE_BAD_FUNCTION_ARGUMENT;
     data->set.localportrange = curlx_sltosi(arg);
     break;
-  case CURLOPT_KRBLEVEL:
-    /*
-     * A string that defines the kerberos security level.
-     */
-    result = Curl_setstropt(&data->set.str[STRING_KRB_LEVEL],
-                            va_arg(param, char *));
-    data->set.krb = (data->set.str[STRING_KRB_LEVEL]) ? TRUE : FALSE;
-    break;
   case CURLOPT_GSSAPI_DELEGATION:
     /*
      * GSS-API credential delegation bitmask
@@ -1687,11 +1756,12 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option,
       TRUE : FALSE;
 
     /* Update the current connection ssl_config. */
-    if(data->easy_conn) {
-      data->easy_conn->ssl_config.verifypeer =
+    if(data->conn) {
+      data->conn->ssl_config.verifypeer =
         data->set.ssl.primary.verifypeer;
     }
     break;
+#ifndef CURL_DISABLE_PROXY
   case CURLOPT_PROXY_SSL_VERIFYPEER:
     /*
      * Enable peer SSL verifying for proxy.
@@ -1700,11 +1770,12 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option,
       (0 != va_arg(param, long))?TRUE:FALSE;
 
     /* Update the current connection proxy_ssl_config. */
-    if(data->easy_conn) {
-      data->easy_conn->proxy_ssl_config.verifypeer =
+    if(data->conn) {
+      data->conn->proxy_ssl_config.verifypeer =
         data->set.proxy_ssl.primary.verifypeer;
     }
     break;
+#endif
   case CURLOPT_SSL_VERIFYHOST:
     /*
      * Enable verification of the host name in the peer certificate
@@ -1712,47 +1783,33 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option,
     arg = va_arg(param, long);
 
     /* Obviously people are not reading documentation and too many thought
-       this argument took a boolean when it wasn't and misused it. We thus ban
-       1 as a sensible input and we warn about its use. Then we only have the
-       2 action internally stored as TRUE. */
-
-    if(1 == arg) {
-      failf(data, "CURLOPT_SSL_VERIFYHOST no longer supports 1 as value!");
-      return CURLE_BAD_FUNCTION_ARGUMENT;
-    }
-
-    data->set.ssl.primary.verifyhost = (0 != arg) ? TRUE : FALSE;
+       this argument took a boolean when it wasn't and misused it.
+       Treat 1 and 2 the same */
+    data->set.ssl.primary.verifyhost = (bool)((arg & 3) ? TRUE : FALSE);
 
     /* Update the current connection ssl_config. */
-    if(data->easy_conn) {
-      data->easy_conn->ssl_config.verifyhost =
+    if(data->conn) {
+      data->conn->ssl_config.verifyhost =
         data->set.ssl.primary.verifyhost;
     }
     break;
+#ifndef CURL_DISABLE_PROXY
   case CURLOPT_PROXY_SSL_VERIFYHOST:
     /*
      * Enable verification of the host name in the peer certificate for proxy
      */
     arg = va_arg(param, long);
 
-    /* Obviously people are not reading documentation and too many thought
-       this argument took a boolean when it wasn't and misused it. We thus ban
-       1 as a sensible input and we warn about its use. Then we only have the
-       2 action internally stored as TRUE. */
-
-    if(1 == arg) {
-      failf(data, "CURLOPT_SSL_VERIFYHOST no longer supports 1 as value!");
-      return CURLE_BAD_FUNCTION_ARGUMENT;
-    }
-
-    data->set.proxy_ssl.primary.verifyhost = (0 != arg)?TRUE:FALSE;
+    /* Treat both 1 and 2 as TRUE */
+    data->set.proxy_ssl.primary.verifyhost = (bool)((arg & 3)?TRUE:FALSE);
 
     /* Update the current connection proxy_ssl_config. */
-    if(data->easy_conn) {
-      data->easy_conn->proxy_ssl_config.verifyhost =
+    if(data->conn) {
+      data->conn->proxy_ssl_config.verifyhost =
         data->set.proxy_ssl.primary.verifyhost;
     }
     break;
+#endif
   case CURLOPT_SSL_VERIFYSTATUS:
     /*
      * Enable certificate status verifying.
@@ -1766,8 +1823,8 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option,
       TRUE : FALSE;
 
     /* Update the current connection ssl_config. */
-    if(data->easy_conn) {
-      data->easy_conn->ssl_config.verifystatus =
+    if(data->conn) {
+      data->conn->ssl_config.verifystatus =
         data->set.ssl.primary.verifystatus;
     }
     break;
@@ -1825,6 +1882,7 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option,
 #endif
       result = CURLE_NOT_BUILT_IN;
     break;
+#ifndef CURL_DISABLE_PROXY
   case CURLOPT_PROXY_PINNEDPUBLICKEY:
     /*
      * Set pinned public key for SSL connection.
@@ -1838,6 +1896,7 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option,
 #endif
       result = CURLE_NOT_BUILT_IN;
     break;
+#endif
   case CURLOPT_CAINFO:
     /*
      * Set CA info for SSL connection. Specify file name of the CA certificate
@@ -1845,6 +1904,7 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option,
     result = Curl_setstropt(&data->set.str[STRING_SSL_CAFILE_ORIG],
                             va_arg(param, char *));
     break;
+#ifndef CURL_DISABLE_PROXY
   case CURLOPT_PROXY_CAINFO:
     /*
      * Set CA info SSL connection for proxy. Specify file name of the
@@ -1853,6 +1913,7 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option,
     result = Curl_setstropt(&data->set.str[STRING_SSL_CAFILE_PROXY],
                             va_arg(param, char *));
     break;
+#endif
   case CURLOPT_CAPATH:
     /*
      * Set CA path info for SSL connection. Specify directory name of the CA
@@ -1867,6 +1928,7 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option,
 #endif
       result = CURLE_NOT_BUILT_IN;
     break;
+#ifndef CURL_DISABLE_PROXY
   case CURLOPT_PROXY_CAPATH:
     /*
      * Set CA path info for SSL connection proxy. Specify directory name of the
@@ -1881,6 +1943,7 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option,
 #endif
       result = CURLE_NOT_BUILT_IN;
     break;
+#endif
   case CURLOPT_CRLFILE:
     /*
      * Set CRL file info for SSL connection. Specify file name of the CRL
@@ -1889,6 +1952,7 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option,
     result = Curl_setstropt(&data->set.str[STRING_SSL_CRLFILE_ORIG],
                             va_arg(param, char *));
     break;
+#ifndef CURL_DISABLE_PROXY
   case CURLOPT_PROXY_CRLFILE:
     /*
      * Set CRL file info for SSL connection for proxy. Specify file name of the
@@ -1897,6 +1961,7 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option,
     result = Curl_setstropt(&data->set.str[STRING_SSL_CRLFILE_PROXY],
                             va_arg(param, char *));
     break;
+#endif
   case CURLOPT_ISSUERCERT:
     /*
      * Set Issuer certificate file
@@ -1905,13 +1970,14 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option,
     result = Curl_setstropt(&data->set.str[STRING_SSL_ISSUERCERT_ORIG],
                             va_arg(param, char *));
     break;
+#ifndef CURL_DISABLE_TELNET
   case CURLOPT_TELNETOPTIONS:
     /*
      * Set a linked list of telnet options
      */
     data->set.telnet_options = va_arg(param, struct curl_slist *);
     break;
-
+#endif
   case CURLOPT_BUFFERSIZE:
     /*
      * The application kindly asks for a differently sized receive buffer.
@@ -2057,34 +2123,30 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option,
      * Make transfers attempt to use SSL/TLS.
      */
     arg = va_arg(param, long);
-    if((arg < CURLUSESSL_NONE) || (arg > CURLUSESSL_ALL))
+    if((arg < CURLUSESSL_NONE) || (arg >= CURLUSESSL_LAST))
       return CURLE_BAD_FUNCTION_ARGUMENT;
     data->set.use_ssl = (curl_usessl)arg;
     break;
 
   case CURLOPT_SSL_OPTIONS:
     arg = va_arg(param, long);
-    data->set.ssl.enable_beast = arg&CURLSSLOPT_ALLOW_BEAST?TRUE:FALSE;
+    data->set.ssl.enable_beast =
+      (bool)((arg&CURLSSLOPT_ALLOW_BEAST) ? TRUE : FALSE);
     data->set.ssl.no_revoke = !!(arg & CURLSSLOPT_NO_REVOKE);
+    data->set.ssl.no_partialchain = !!(arg & CURLSSLOPT_NO_PARTIALCHAIN);
     break;
 
+#ifndef CURL_DISABLE_PROXY
   case CURLOPT_PROXY_SSL_OPTIONS:
     arg = va_arg(param, long);
-    data->set.proxy_ssl.enable_beast = arg&CURLSSLOPT_ALLOW_BEAST?TRUE:FALSE;
+    data->set.proxy_ssl.enable_beast =
+      (bool)((arg&CURLSSLOPT_ALLOW_BEAST) ? TRUE : FALSE);
     data->set.proxy_ssl.no_revoke = !!(arg & CURLSSLOPT_NO_REVOKE);
+    data->set.proxy_ssl.no_partialchain = !!(arg & CURLSSLOPT_NO_PARTIALCHAIN);
     break;
-
 #endif
-  case CURLOPT_FTPSSLAUTH:
-    /*
-     * Set a specific auth for FTP-SSL transfers.
-     */
-    arg = va_arg(param, long);
-    if((arg < CURLFTPAUTH_DEFAULT) || (arg > CURLFTPAUTH_TLS))
-      return CURLE_BAD_FUNCTION_ARGUMENT;
-    data->set.ftpsslauth = (curl_ftpauth)arg;
-    break;
 
+#endif
   case CURLOPT_IPRESOLVE:
     arg = va_arg(param, long);
     if((arg < CURL_IPRESOLVE_WHATEVER) || (arg > CURL_IPRESOLVE_V6))
@@ -2110,11 +2172,6 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option,
     data->set.tcp_nodelay = (0 != va_arg(param, long)) ? TRUE : FALSE;
     break;
 
-  case CURLOPT_FTP_ACCOUNT:
-    result = Curl_setstropt(&data->set.str[STRING_FTP_ACCOUNT],
-                            va_arg(param, char *));
-    break;
-
   case CURLOPT_IGNORE_CONTENT_LENGTH:
     data->set.ignorecl = (0 != va_arg(param, long)) ? TRUE : FALSE;
     break;
@@ -2126,11 +2183,6 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option,
     data->set.connect_only = (0 != va_arg(param, long)) ? TRUE : FALSE;
     break;
 
-  case CURLOPT_FTP_ALTERNATIVE_TO_USER:
-    result = Curl_setstropt(&data->set.str[STRING_FTP_ALTERNATIVE_TO_USER],
-                            va_arg(param, char *));
-    break;
-
   case CURLOPT_SOCKOPTFUNCTION:
     /*
      * socket callback function: called after socket() but before connect()
@@ -2196,7 +2248,7 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option,
     data->set.proxy_ssl.primary.sessionid = data->set.ssl.primary.sessionid;
     break;
 
-#if defined(USE_LIBSSH2) || defined(USE_LIBSSH)
+#ifdef USE_SSH
     /* we only include SSH options if explicitly built to support SSH */
   case CURLOPT_SSH_AUTH_TYPES:
     data->set.ssh_auth_types = va_arg(param, long);
@@ -2225,7 +2277,7 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option,
     result = Curl_setstropt(&data->set.str[STRING_SSH_HOST_PUBLIC_KEY_MD5],
                             va_arg(param, char *));
     break;
-#ifdef HAVE_LIBSSH2_KNOWNHOST_API
+
   case CURLOPT_SSH_KNOWNHOSTS:
     /*
      * Store the file name to read known hosts from.
@@ -2246,8 +2298,11 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option,
      */
     data->set.ssh_keyfunc_userp = va_arg(param, void *);
     break;
-#endif /* HAVE_LIBSSH2_KNOWNHOST_API */
-#endif /* USE_LIBSSH2 */
+
+  case CURLOPT_SSH_COMPRESSION:
+    data->set.ssh_compression = (0 != va_arg(param, long))?TRUE:FALSE;
+    break;
+#endif /* USE_SSH */
 
   case CURLOPT_HTTP_TRANSFER_DECODING:
     /*
@@ -2263,6 +2318,7 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option,
     data->set.http_ce_skip = (0 == va_arg(param, long)) ? TRUE : FALSE;
     break;
 
+#if !defined(CURL_DISABLE_FTP) || defined(USE_SSH)
   case CURLOPT_NEW_FILE_PERMS:
     /*
      * Uses these permissions instead of 0644
@@ -2282,17 +2338,20 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option,
       return CURLE_BAD_FUNCTION_ARGUMENT;
     data->set.new_directory_perms = arg;
     break;
+#endif
 
   case CURLOPT_ADDRESS_SCOPE:
     /*
-     * We always get longs when passed plain numericals, but for this value we
-     * know that an unsigned int will always hold the value so we blindly
-     * typecast to this type
+     * Use this scope id when using IPv6
+     * We always get longs when passed plain numericals so we should check
+     * that the value fits into an unsigned 32 bit integer.
      */
-    arg = va_arg(param, long);
-    if((arg < 0) || (arg > 0xf))
+    uarg = va_arg(param, unsigned long);
+#if SIZEOF_LONG > 4
+    if(uarg > UINT_MAX)
       return CURLE_BAD_FUNCTION_ARGUMENT;
-    data->set.scope_id = curlx_sltoui(arg);
+#endif
+    data->set.scope_id = (unsigned int)uarg;
     break;
 
   case CURLOPT_PROTOCOLS:
@@ -2306,8 +2365,7 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option,
   case CURLOPT_REDIR_PROTOCOLS:
     /* set the bitmask for the protocols that libcurl is allowed to follow to,
        as a subset of the CURLOPT_PROTOCOLS ones. That means the protocol needs
-       to be set in both bitmasks to be allowed to get redirected to. Defaults
-       to all protocols except FILE and SCP. */
+       to be set in both bitmasks to be allowed to get redirected to. */
     data->set.redir_protocols = va_arg(param, long);
     break;
 
@@ -2316,7 +2374,7 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option,
     result = Curl_setstropt(&data->set.str[STRING_DEFAULT_PROTOCOL],
                             va_arg(param, char *));
     break;
-
+#ifndef CURL_DISABLE_SMTP
   case CURLOPT_MAIL_FROM:
     /* Set the SMTP mail originator */
     result = Curl_setstropt(&data->set.str[STRING_MAIL_FROM],
@@ -2333,12 +2391,19 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option,
     /* Set the list of mail recipients */
     data->set.mail_rcpt = va_arg(param, struct curl_slist *);
     break;
+#endif
+
+  case CURLOPT_SASL_AUTHZID:
+    /* Authorisation identity (identity to act as) */
+    result = Curl_setstropt(&data->set.str[STRING_SASL_AUTHZID],
+                            va_arg(param, char *));
+    break;
 
   case CURLOPT_SASL_IR:
     /* Enable/disable SASL initial response */
     data->set.sasl_ir = (0 != va_arg(param, long)) ? TRUE : FALSE;
     break;
-
+#ifndef CURL_DISABLE_RTSP
   case CURLOPT_RTSP_REQUEST:
   {
     /*
@@ -2437,7 +2502,7 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option,
 
   case CURLOPT_RTSP_SERVER_CSEQ:
     /* Same as the above, but for server-initiated requests */
-    data->state.rtsp_next_client_CSeq = va_arg(param, long);
+    data->state.rtsp_next_server_CSeq = va_arg(param, long);
     break;
 
   case CURLOPT_INTERLEAVEDATA:
@@ -2447,7 +2512,8 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option,
     /* Set the user defined RTP write function */
     data->set.fwrite_rtp = va_arg(param, curl_write_callback);
     break;
-
+#endif
+#ifndef CURL_DISABLE_FTP
   case CURLOPT_WILDCARDMATCH:
     data->set.wildcard_enabled = (0 != va_arg(param, long)) ? TRUE : FALSE;
     break;
@@ -2466,6 +2532,7 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option,
   case CURLOPT_FNMATCH_DATA:
     data->set.fnmatch_data = va_arg(param, void *);
     break;
+#endif
 #ifdef USE_TLS_SRP
   case CURLOPT_TLSAUTH_USERNAME:
     result = Curl_setstropt(&data->set.str[STRING_TLSAUTH_USERNAME_ORIG],
@@ -2510,6 +2577,7 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option,
       data->set.proxy_ssl.authtype = CURL_TLSAUTH_NONE;
     break;
 #endif
+#ifdef USE_ARES
   case CURLOPT_DNS_SERVERS:
     result = Curl_set_dns_servers(data, va_arg(param, char *));
     break;
@@ -2522,7 +2590,7 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option,
   case CURLOPT_DNS_LOCAL_IP6:
     result = Curl_set_dns_local_ip6(data, va_arg(param, char *));
     break;
-
+#endif
   case CURLOPT_TCP_KEEPALIVE:
     data->set.tcp_keepalive = (0 != va_arg(param, long)) ? TRUE : FALSE;
     break;
@@ -2552,7 +2620,6 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option,
   case CURLOPT_SSL_ENABLE_ALPN:
     data->set.ssl_enable_alpn = (0 != va_arg(param, long)) ? TRUE : FALSE;
     break;
-
 #ifdef USE_UNIX_SOCKETS
   case CURLOPT_UNIX_SOCKET_PATH:
     data->set.abstract_unix_socket = FALSE;
@@ -2603,33 +2670,76 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option,
   case CURLOPT_SUPPRESS_CONNECT_HEADERS:
     data->set.suppress_connect_headers = (0 != va_arg(param, long))?TRUE:FALSE;
     break;
-  case CURLOPT_SSH_COMPRESSION:
-    data->set.ssh_compression = (0 != va_arg(param, long))?TRUE:FALSE;
-    break;
   case CURLOPT_HAPPY_EYEBALLS_TIMEOUT_MS:
     arg = va_arg(param, long);
     if(arg < 0)
       return CURLE_BAD_FUNCTION_ARGUMENT;
     data->set.happy_eyeballs_timeout = arg;
     break;
+#ifndef CURL_DISABLE_SHUFFLE_DNS
   case CURLOPT_DNS_SHUFFLE_ADDRESSES:
     data->set.dns_shuffle_addresses = (0 != va_arg(param, long)) ? TRUE:FALSE;
     break;
+#endif
   case CURLOPT_DISALLOW_USERNAME_IN_URL:
     data->set.disallow_username_in_url =
       (0 != va_arg(param, long)) ? TRUE : FALSE;
     break;
+#ifndef CURL_DISABLE_DOH
   case CURLOPT_DOH_URL:
     result = Curl_setstropt(&data->set.str[STRING_DOH],
                             va_arg(param, char *));
     data->set.doh = data->set.str[STRING_DOH]?TRUE:FALSE;
     break;
+#endif
   case CURLOPT_UPKEEP_INTERVAL_MS:
     arg = va_arg(param, long);
     if(arg < 0)
       return CURLE_BAD_FUNCTION_ARGUMENT;
     data->set.upkeep_interval_ms = arg;
     break;
+  case CURLOPT_MAXAGE_CONN:
+    arg = va_arg(param, long);
+    if(arg < 0)
+      return CURLE_BAD_FUNCTION_ARGUMENT;
+    data->set.maxage_conn = arg;
+    break;
+  case CURLOPT_TRAILERFUNCTION:
+#ifndef CURL_DISABLE_HTTP
+    data->set.trailer_callback = va_arg(param, curl_trailer_callback);
+#endif
+    break;
+  case CURLOPT_TRAILERDATA:
+#ifndef CURL_DISABLE_HTTP
+    data->set.trailer_data = va_arg(param, void *);
+#endif
+    break;
+#ifdef USE_ALTSVC
+  case CURLOPT_ALTSVC:
+    if(!data->asi) {
+      data->asi = Curl_altsvc_init();
+      if(!data->asi)
+        return CURLE_OUT_OF_MEMORY;
+    }
+    argptr = va_arg(param, char *);
+    result = Curl_setstropt(&data->set.str[STRING_ALTSVC], argptr);
+    if(result)
+      return result;
+    if(argptr)
+      (void)Curl_altsvc_load(data->asi, argptr);
+    break;
+  case CURLOPT_ALTSVC_CTRL:
+    if(!data->asi) {
+      data->asi = Curl_altsvc_init();
+      if(!data->asi)
+        return CURLE_OUT_OF_MEMORY;
+    }
+    arg = va_arg(param, long);
+    result = Curl_altsvc_ctrl(data->asi, arg);
+    if(result)
+      return result;
+    break;
+#endif
   default:
     /* unknown tag and its companion, just ignore: */
     result = CURLE_UNKNOWN_OPTION;
index c658e04..5e347dd 100644 (file)
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -23,7 +23,6 @@
  ***************************************************************************/
 
 CURLcode Curl_setstropt(char **charp, const char *s);
-CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option,
-                      va_list arg);
+CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option, va_list arg);
 
 #endif /* HEADER_CURL_SETOPT_H */
index a3c2a7b..629fd94 100644 (file)
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -206,11 +206,15 @@ extern int Curl_os400_sendto(int sd, char *buffer, int buflen, int flags,
                              struct sockaddr * dstaddr, int addrlen);
 extern int Curl_os400_recvfrom(int sd, char *buffer, int buflen, int flags,
                                struct sockaddr *fromaddr, int *addrlen);
+extern int Curl_os400_getpeername(int sd, struct sockaddr *addr, int *addrlen);
+extern int Curl_os400_getsockname(int sd, struct sockaddr *addr, int *addrlen);
 
 #define connect                 Curl_os400_connect
 #define bind                    Curl_os400_bind
 #define sendto                  Curl_os400_sendto
 #define recvfrom                Curl_os400_recvfrom
+#define getpeername             Curl_os400_getpeername
+#define getsockname             Curl_os400_getsockname
 
 #ifdef HAVE_LIBZ
 #define zlibVersion             Curl_os400_zlibVersion
index f9287af..bcaaeae 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2018, Florin Petriuc, <petriuc.florin@gmail.com>
+ * Copyright (C) 1998 - 2019, Florin Petriuc, <petriuc.florin@gmail.com>
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
index 800f9d3..3960a13 100644 (file)
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2013, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -23,7 +23,8 @@
  ***************************************************************************/
 #include "curl_setup.h"
 
-#if defined(HAVE_SIGNAL_H) && defined(HAVE_SIGACTION) && defined(USE_OPENSSL)
+#if defined(HAVE_SIGNAL_H) && defined(HAVE_SIGACTION) &&        \
+  (defined(USE_OPENSSL) || defined(USE_MBEDTLS))
 #include <signal.h>
 
 struct sigpipe_ignore {
index 392b84d..d27fbe1 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
index d73dbf6..799b3c0 100644 (file)
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2013, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
index e4f266e..12f9925 100644 (file)
--- a/lib/smb.c
+++ b/lib/smb.c
@@ -6,7 +6,7 @@
  *                             \___|\___/|_| \_\_____|
  *
  * Copyright (C) 2014, Bill Nagel <wnagel@tycoint.com>, Exacq Technologies
- * Copyright (C) 2016-2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 2016-2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -64,8 +64,7 @@ static CURLcode smb_request_state(struct connectdata *conn, bool *done);
 static CURLcode smb_done(struct connectdata *conn, CURLcode status,
                          bool premature);
 static CURLcode smb_disconnect(struct connectdata *conn, bool dead);
-static int smb_getsock(struct connectdata *conn, curl_socket_t *socks,
-                       int numsocks);
+static int smb_getsock(struct connectdata *conn, curl_socket_t *socks);
 static CURLcode smb_parse_url_path(struct connectdata *conn);
 
 /*
@@ -607,6 +606,7 @@ static CURLcode smb_send_and_recv(struct connectdata *conn, void **msg)
 {
   struct smb_conn *smbc = &conn->proto.smbc;
   CURLcode result;
+  *msg = NULL; /* if it returns early */
 
   /* Check if there is data in the transfer buffer */
   if(!smbc->send_size && smbc->upload_size) {
@@ -682,7 +682,8 @@ static CURLcode smb_connection_state(struct connectdata *conn, bool *done)
 
   switch(smbc->state) {
   case SMB_NEGOTIATE:
-    if(h->status || smbc->got < sizeof(*nrsp) + sizeof(smbc->challenge) - 1) {
+    if((smbc->got < sizeof(*nrsp) + sizeof(smbc->challenge) - 1) ||
+       h->status) {
       connclose(conn, "SMB: negotiation failed");
       return CURLE_COULDNT_CONNECT;
     }
@@ -785,6 +786,8 @@ static CURLcode smb_request_state(struct connectdata *conn, bool *done)
   case SMB_OPEN:
     if(h->status || smbc->got < sizeof(struct smb_nt_create_response)) {
       req->result = CURLE_REMOTE_FILE_NOT_FOUND;
+      if(h->status == smb_swap32(SMB_ERR_NOACCESS))
+        req->result = CURLE_REMOTE_ACCESS_DENIED;
       next_state = SMB_TREE_DISCONNECT;
       break;
     }
@@ -934,12 +937,8 @@ static CURLcode smb_disconnect(struct connectdata *conn, bool dead)
   return CURLE_OK;
 }
 
-static int smb_getsock(struct connectdata *conn, curl_socket_t *socks,
-                       int numsocks)
+static int smb_getsock(struct connectdata *conn, curl_socket_t *socks)
 {
-  if(!numsocks)
-    return GETSOCK_BLANK;
-
   socks[0] = conn->sock[FIRSTSOCKET];
   return GETSOCK_READSOCK(0) | GETSOCK_WRITESOCK(0);
 }
@@ -947,29 +946,25 @@ static int smb_getsock(struct connectdata *conn, curl_socket_t *socks,
 static CURLcode smb_do(struct connectdata *conn, bool *done)
 {
   struct smb_conn *smbc = &conn->proto.smbc;
-  struct smb_request *req = conn->data->req.protop;
 
   *done = FALSE;
   if(smbc->share) {
-    req->path = strchr(smbc->share, '\0');
-    if(req->path) {
-      req->path++;
-      return CURLE_OK;
-    }
+    return CURLE_OK;
   }
   return CURLE_URL_MALFORMAT;
 }
 
 static CURLcode smb_parse_url_path(struct connectdata *conn)
 {
-  CURLcode result = CURLE_OK;
   struct Curl_easy *data = conn->data;
+  struct smb_request *req = data->req.protop;
   struct smb_conn *smbc = &conn->proto.smbc;
   char *path;
   char *slash;
 
   /* URL decode the path */
-  result = Curl_urldecode(data, data->state.up.path, 0, &path, NULL, TRUE);
+  CURLcode result = Curl_urldecode(data, data->state.up.path, 0, &path, NULL,
+                                   TRUE);
   if(result)
     return result;
 
@@ -992,6 +987,7 @@ static CURLcode smb_parse_url_path(struct connectdata *conn)
   /* Parse the path for the file path converting any forward slashes into
      backslashes */
   *slash++ = 0;
+  req->path = slash;
 
   for(; *slash; slash++) {
     if(*slash == '/')
index 5875623..65220b0 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -28,6 +28,7 @@
  * RFC4954 SMTP Authentication
  * RFC5321 SMTP protocol
  * RFC6749 OAuth 2.0 Authorization Framework
+ * RFC8314 Use of TLS for Email Submission and Access
  * Draft   SMTP URL Interface   <draft-earhart-url-smtp-00.txt>
  * Draft   LOGIN SASL Mechanism <draft-murchison-sasl-login-00.txt>
  *
@@ -94,8 +95,7 @@ static CURLcode smtp_done(struct connectdata *conn, CURLcode status,
 static CURLcode smtp_connect(struct connectdata *conn, bool *done);
 static CURLcode smtp_disconnect(struct connectdata *conn, bool dead);
 static CURLcode smtp_multi_statemach(struct connectdata *conn, bool *done);
-static int smtp_getsock(struct connectdata *conn, curl_socket_t *socks,
-                        int numsocks);
+static int smtp_getsock(struct connectdata *conn, curl_socket_t *socks);
 static CURLcode smtp_doing(struct connectdata *conn, bool *dophase_done);
 static CURLcode smtp_setup_connection(struct connectdata *conn);
 static CURLcode smtp_parse_url_options(struct connectdata *conn);
@@ -207,8 +207,12 @@ static bool smtp_endofresp(struct connectdata *conn, char *line, size_t len,
      Section 4. Examples of RFC-4954 but some e-mail servers ignore this and
      only send the response code instead as per Section 4.2. */
   if(line[3] == ' ' || len == 5) {
+    char tmpline[6];
+
     result = TRUE;
-    *resp = curlx_sltosi(strtol(line, NULL, 10));
+    memset(tmpline, '\0', sizeof(tmpline));
+    memcpy(tmpline, line, (len == 5 ? 5 : 3));
+    *resp = curlx_sltosi(strtol(tmpline, NULL, 10));
 
     /* Make sure real server never sends internal value */
     if(*resp == 1)
@@ -354,10 +358,8 @@ static CURLcode smtp_perform_helo(struct connectdata *conn)
  */
 static CURLcode smtp_perform_starttls(struct connectdata *conn)
 {
-  CURLcode result = CURLE_OK;
-
   /* Send the STARTTLS command */
-  result = Curl_pp_sendf(&conn->proto.smtpc.pp, "%s", "STARTTLS");
+  CURLcode result = Curl_pp_sendf(&conn->proto.smtpc.pp, "%s", "STARTTLS");
 
   if(!result)
     state(conn, SMTP_STARTTLS);
@@ -373,11 +375,10 @@ static CURLcode smtp_perform_starttls(struct connectdata *conn)
  */
 static CURLcode smtp_perform_upgrade_tls(struct connectdata *conn)
 {
-  CURLcode result = CURLE_OK;
-  struct smtp_conn *smtpc = &conn->proto.smtpc;
-
   /* Start the SSL connection */
-  result = Curl_ssl_connect_nonblocking(conn, FIRSTSOCKET, &smtpc->ssldone);
+  struct smtp_conn *smtpc = &conn->proto.smtpc;
+  CURLcode result = Curl_ssl_connect_nonblocking(conn, FIRSTSOCKET,
+                                                 &smtpc->ssldone);
 
   if(!result) {
     if(smtpc->state != SMTP_UPGRADETLS)
@@ -640,10 +641,8 @@ static CURLcode smtp_perform_rcpt_to(struct connectdata *conn)
  */
 static CURLcode smtp_perform_quit(struct connectdata *conn)
 {
-  CURLcode result = CURLE_OK;
-
   /* Send the QUIT command */
-  result = Curl_pp_sendf(&conn->proto.smtpc.pp, "%s", "QUIT");
+  CURLcode result = Curl_pp_sendf(&conn->proto.smtpc.pp, "%s", "QUIT");
 
   if(!result)
     state(conn, SMTP_QUIT);
@@ -715,7 +714,7 @@ static CURLcode smtp_state_ehlo_resp(struct connectdata *conn, int smtpcode,
       result = CURLE_REMOTE_ACCESS_DENIED;
     }
   }
-  else {
+  else if(len >= 4) {
     line += 4;
     len -= 4;
 
@@ -786,6 +785,10 @@ static CURLcode smtp_state_ehlo_resp(struct connectdata *conn, int smtpcode,
         result = smtp_perform_authentication(conn);
     }
   }
+  else {
+    failf(data, "Unexpectedly short EHLO response");
+    result = CURLE_WEIRD_SERVER_REPLY;
+  }
 
   return result;
 }
@@ -955,7 +958,7 @@ static CURLcode smtp_state_data_resp(struct connectdata *conn, int smtpcode,
     Curl_pgrsSetUploadSize(data, data->state.infilesize);
 
     /* SMTP upload */
-    Curl_setup_transfer(conn, -1, -1, FALSE, NULL, FIRSTSOCKET, NULL);
+    Curl_setup_transfer(data, -1, -1, FALSE, FIRSTSOCKET);
 
     /* End of DO phase */
     state(conn, SMTP_STOP);
@@ -1080,19 +1083,20 @@ static CURLcode smtp_multi_statemach(struct connectdata *conn, bool *done)
       return result;
   }
 
-  result = Curl_pp_statemach(&smtpc->pp, FALSE);
+  result = Curl_pp_statemach(&smtpc->pp, FALSE, FALSE);
   *done = (smtpc->state == SMTP_STOP) ? TRUE : FALSE;
 
   return result;
 }
 
-static CURLcode smtp_block_statemach(struct connectdata *conn)
+static CURLcode smtp_block_statemach(struct connectdata *conn,
+                                     bool disconnecting)
 {
   CURLcode result = CURLE_OK;
   struct smtp_conn *smtpc = &conn->proto.smtpc;
 
   while(smtpc->state != SMTP_STOP && !result)
-    result = Curl_pp_statemach(&smtpc->pp, TRUE);
+    result = Curl_pp_statemach(&smtpc->pp, TRUE, disconnecting);
 
   return result;
 }
@@ -1113,10 +1117,9 @@ static CURLcode smtp_init(struct connectdata *conn)
 }
 
 /* For the SMTP "protocol connect" and "doing" phases only */
-static int smtp_getsock(struct connectdata *conn, curl_socket_t *socks,
-                        int numsocks)
+static int smtp_getsock(struct connectdata *conn, curl_socket_t *socks)
 {
-  return Curl_pp_getsock(&conn->proto.smtpc.pp, socks, numsocks);
+  return Curl_pp_getsock(&conn->proto.smtpc.pp, socks);
 }
 
 /***********************************************************************
@@ -1213,7 +1216,7 @@ static CURLcode smtp_done(struct connectdata *conn, CURLcode status,
        returned CURLE_AGAIN, we duplicate the EOB now rather than when the
        bytes written doesn't equal len. */
     if(smtp->trailing_crlf || !conn->data->state.infilesize) {
-      eob = strdup(SMTP_EOB + 2);
+      eob = strdup(&SMTP_EOB[2]);
       len = SMTP_EOB_LEN - 2;
     }
     else {
@@ -1247,13 +1250,8 @@ static CURLcode smtp_done(struct connectdata *conn, CURLcode status,
 
     state(conn, SMTP_POSTDATA);
 
-    /* Run the state-machine
-
-       TODO: when the multi interface is used, this _really_ should be using
-       the smtp_multi_statemach function but we have no general support for
-       non-blocking DONE operations!
-    */
-    result = smtp_block_statemach(conn);
+    /* Run the state-machine */
+    result = smtp_block_statemach(conn, FALSE);
   }
 
   /* Clear the transfer mode for the next request */
@@ -1360,7 +1358,7 @@ static CURLcode smtp_disconnect(struct connectdata *conn, bool dead_connection)
      point! */
   if(!dead_connection && smtpc->pp.conn && smtpc->pp.conn->bits.protoconnstart)
     if(!smtp_perform_quit(conn))
-      (void)smtp_block_statemach(conn); /* ignore errors on QUIT */
+      (void)smtp_block_statemach(conn, TRUE); /* ignore errors on QUIT */
 
   /* Disconnect from the server */
   Curl_pp_disconnect(&smtpc->pp);
@@ -1383,7 +1381,7 @@ static CURLcode smtp_dophase_done(struct connectdata *conn, bool connected)
 
   if(smtp->transfer != FTPTRANSFER_BODY)
     /* no data to transfer */
-    Curl_setup_transfer(conn, -1, -1, FALSE, NULL, -1, NULL);
+    Curl_setup_transfer(conn->data, -1, -1, FALSE, -1);
 
   return CURLE_OK;
 }
index b67340a..20fc081 100644 (file)
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 2009 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 2009 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
index db14680..b037ee0 100644 (file)
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2009, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
diff --git a/lib/socketpair.c b/lib/socketpair.c
new file mode 100644 (file)
index 0000000..1ec0d75
--- /dev/null
@@ -0,0 +1,121 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+
+#include "curl_setup.h"
+#include "socketpair.h"
+
+#ifndef HAVE_SOCKETPAIR
+#ifdef WIN32
+/*
+ * This is a socketpair() implementation for Windows.
+ */
+#include <string.h>
+#include <winsock2.h>
+#include <ws2tcpip.h>
+#include <windows.h>
+#include <io.h>
+#else
+#ifdef HAVE_NETDB_H
+#include <netdb.h>
+#endif
+#ifdef HAVE_NETINET_IN_H
+#include <netinet/in.h> /* IPPROTO_TCP */
+#endif
+#ifdef HAVE_ARPA_INET_H
+#include <arpa/inet.h>
+#endif
+#ifndef INADDR_LOOPBACK
+#define INADDR_LOOPBACK 0x7f000001
+#endif /* !INADDR_LOOPBACK */
+#endif /* !WIN32 */
+
+/* The last 3 #include files should be in this order */
+#include "curl_printf.h"
+#include "curl_memory.h"
+#include "memdebug.h"
+
+int Curl_socketpair(int domain, int type, int protocol,
+                    curl_socket_t socks[2])
+{
+  union {
+    struct sockaddr_in inaddr;
+    struct sockaddr addr;
+  } a;
+  curl_socket_t listener;
+  curl_socklen_t addrlen = sizeof(a.inaddr);
+  int reuse = 1;
+  char data[2][12];
+  ssize_t dlen;
+  (void)domain;
+  (void)type;
+  (void)protocol;
+
+  listener = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
+  if(listener == CURL_SOCKET_BAD)
+    return -1;
+
+  memset(&a, 0, sizeof(a));
+  a.inaddr.sin_family = AF_INET;
+  a.inaddr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
+  a.inaddr.sin_port = 0;
+
+  socks[0] = socks[1] = CURL_SOCKET_BAD;
+
+  if(setsockopt(listener, SOL_SOCKET, SO_REUSEADDR,
+                (char *)&reuse, (curl_socklen_t)sizeof(reuse)) == -1)
+    goto error;
+  if(bind(listener, &a.addr, sizeof(a.inaddr)) == -1)
+    goto error;
+  if(getsockname(listener, &a.addr, &addrlen) == -1)
+    goto error;
+  if(listen(listener, 1) == -1)
+    goto error;
+  socks[0] = socket(AF_INET, SOCK_STREAM, 0);
+  if(socks[0] == CURL_SOCKET_BAD)
+    goto error;
+  if(connect(socks[0], &a.addr, sizeof(a.inaddr)) == -1)
+    goto error;
+  socks[1] = accept(listener, NULL, NULL);
+  if(socks[1] == CURL_SOCKET_BAD)
+    goto error;
+
+  /* verify that nothing else connected */
+  msnprintf(data[0], sizeof(data[0]), "%p", socks);
+  dlen = strlen(data[0]);
+  if(swrite(socks[0], data[0], dlen) != dlen)
+    goto error;
+  if(sread(socks[1], data[1], sizeof(data[1])) != dlen)
+    goto error;
+  if(memcmp(data[0], data[1], dlen))
+    goto error;
+
+  sclose(listener);
+  return 0;
+
+  error:
+  sclose(listener);
+  sclose(socks[0]);
+  sclose(socks[1]);
+  return -1;
+}
+
+#endif /* ! HAVE_SOCKETPAIR */
diff --git a/lib/socketpair.h b/lib/socketpair.h
new file mode 100644 (file)
index 0000000..be9fb24
--- /dev/null
@@ -0,0 +1,36 @@
+#ifndef HEADER_CURL_SOCKETPAIR_H
+#define HEADER_CURL_SOCKETPAIR_H
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+
+#include "curl_setup.h"
+#ifndef HAVE_SOCKETPAIR
+int Curl_socketpair(int domain, int type, int protocol,
+                    curl_socket_t socks[2]);
+#else
+#define Curl_socketpair(a,b,c,d) socketpair(a,b,c,d)
+#endif
+
+/* Defined here to allow specific build configs to disable it completely */
+#define USE_SOCKETPAIR 1
+
+#endif /* HEADER_CURL_SOCKETPAIR_H */
index d2209ad..6ae9818 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -38,7 +38,9 @@
 #include "timeval.h"
 #include "socks.h"
 
-/* The last #include file should be: */
+/* The last 3 #include files should be in this order */
+#include "curl_printf.h"
+#include "curl_memory.h"
 #include "memdebug.h"
 
 /*
@@ -54,7 +56,7 @@ int Curl_blockread_all(struct connectdata *conn, /* connection data */
                        ssize_t buffersize,       /* max amount to read */
                        ssize_t *n)               /* amount bytes read */
 {
-  ssize_t nread;
+  ssize_t nread = 0;
   ssize_t allread = 0;
   int result;
   *n = 0;
@@ -155,7 +157,7 @@ CURLcode Curl_SOCKS4(const char *proxy_user,
     Curl_addrinfo *hp = NULL;
     int rc;
 
-    rc = Curl_resolv(conn, hostname, remote_port, &dns);
+    rc = Curl_resolv(conn, hostname, remote_port, FALSE, &dns);
 
     if(rc == CURLRESOLV_ERROR)
       return CURLE_COULDNT_RESOLVE_PROXY;
@@ -290,7 +292,7 @@ CURLcode Curl_SOCKS4(const char *proxy_user,
     /* wrong version ? */
     if(socksreq[0] != 0) {
       failf(data,
-            "SOCKS4 reply has wrong version, version should be 4.");
+            "SOCKS4 reply has wrong version, version should be 0.");
       return CURLE_COULDNT_CONNECT;
     }
 
@@ -372,8 +374,9 @@ CURLcode Curl_SOCKS5(const char *proxy_user,
     o  REP    Reply field:
     o  X'00' succeeded
   */
-
-  unsigned char socksreq[600]; /* room for large user/pw (255 max each) */
+#define REQUEST_BUFSIZE 600  /* room for large user/pw (255 max each) */
+  unsigned char socksreq[REQUEST_BUFSIZE];
+  char dest[REQUEST_BUFSIZE] = "unknown";  /* printable hostname:port */
   int idx;
   ssize_t actualread;
   ssize_t written;
@@ -527,12 +530,24 @@ CURLcode Curl_SOCKS5(const char *proxy_user,
     len = 0;
     socksreq[len++] = 1;    /* username/pw subnegotiation version */
     socksreq[len++] = (unsigned char) proxy_user_len;
-    if(proxy_user && proxy_user_len)
+    if(proxy_user && proxy_user_len) {
+      /* the length must fit in a single byte */
+      if(proxy_user_len >= 255) {
+        failf(data, "Excessive user name length for proxy auth");
+        return CURLE_BAD_FUNCTION_ARGUMENT;
+      }
       memcpy(socksreq + len, proxy_user, proxy_user_len);
+    }
     len += proxy_user_len;
     socksreq[len++] = (unsigned char) proxy_password_len;
-    if(proxy_password && proxy_password_len)
+    if(proxy_password && proxy_password_len) {
+      /* the length must fit in a single byte */
+      if(proxy_password_len > 255) {
+        failf(data, "Excessive password length for proxy auth");
+        return CURLE_BAD_FUNCTION_ARGUMENT;
+      }
       memcpy(socksreq + len, proxy_password, proxy_password_len);
+    }
     len += proxy_password_len;
 
     code = Curl_write_plain(conn, sock, (char *)socksreq, len, &written);
@@ -593,11 +608,13 @@ CURLcode Curl_SOCKS5(const char *proxy_user,
     socksreq[len++] = (char) hostname_len; /* address length */
     memcpy(&socksreq[len], hostname, hostname_len); /* address str w/o NULL */
     len += hostname_len;
+    msnprintf(dest, sizeof(dest), "%s:%d", hostname, remote_port);
+    infof(data, "SOCKS5 connect to %s (remotely resolved)\n", dest);
   }
   else {
     struct Curl_dns_entry *dns;
     Curl_addrinfo *hp = NULL;
-    int rc = Curl_resolv(conn, hostname, remote_port, &dns);
+    int rc = Curl_resolv(conn, hostname, remote_port, FALSE, &dns);
 
     if(rc == CURLRESOLV_ERROR)
       return CURLE_COULDNT_RESOLVE_HOST;
@@ -616,8 +633,13 @@ CURLcode Curl_SOCKS5(const char *proxy_user,
     if(dns)
       hp = dns->addr;
     if(hp) {
-      char buf[64];
-      Curl_printable_address(hp, buf, sizeof(buf));
+      if(Curl_printable_address(hp, dest, sizeof(dest))) {
+        size_t destlen = strlen(dest);
+        msnprintf(dest + destlen, sizeof(dest) - destlen, ":%d", remote_port);
+      }
+      else {
+        strcpy(dest, "unknown");
+      }
 
       if(hp->ai_family == AF_INET) {
         int i;
@@ -629,7 +651,7 @@ CURLcode Curl_SOCKS5(const char *proxy_user,
           socksreq[len++] = ((unsigned char *)&saddr_in->sin_addr.s_addr)[i];
         }
 
-        infof(data, "SOCKS5 connect to IPv4 %s (locally resolved)\n", buf);
+        infof(data, "SOCKS5 connect to IPv4 %s (locally resolved)\n", dest);
       }
 #ifdef ENABLE_IPV6
       else if(hp->ai_family == AF_INET6) {
@@ -643,13 +665,13 @@ CURLcode Curl_SOCKS5(const char *proxy_user,
             ((unsigned char *)&saddr_in6->sin6_addr.s6_addr)[i];
         }
 
-        infof(data, "SOCKS5 connect to IPv6 %s (locally resolved)\n", buf);
+        infof(data, "SOCKS5 connect to IPv6 %s (locally resolved)\n", dest);
       }
 #endif
       else {
         hp = NULL; /* fail! */
 
-        failf(data, "SOCKS5 connection to %s not supported\n", buf);
+        failf(data, "SOCKS5 connection to %s not supported\n", dest);
       }
 
       Curl_resolv_unlock(data, dns); /* not used anymore from now on */
@@ -744,42 +766,8 @@ CURLcode Curl_SOCKS5(const char *proxy_user,
 #endif
 
   if(socksreq[1] != 0) { /* Anything besides 0 is an error */
-    if(socksreq[3] == 1) {
-      failf(data,
-            "Can't complete SOCKS5 connection to %d.%d.%d.%d:%d. (%d)",
-            (unsigned char)socksreq[4], (unsigned char)socksreq[5],
-            (unsigned char)socksreq[6], (unsigned char)socksreq[7],
-            (((unsigned char)socksreq[8] << 8) |
-             (unsigned char)socksreq[9]),
-            (unsigned char)socksreq[1]);
-    }
-    else if(socksreq[3] == 3) {
-      unsigned char port_upper = (unsigned char)socksreq[len - 2];
-      socksreq[len - 2] = 0;
-      failf(data,
-            "Can't complete SOCKS5 connection to %s:%d. (%d)",
-            (char *)&socksreq[5],
-            ((port_upper << 8) |
-             (unsigned char)socksreq[len - 1]),
-            (unsigned char)socksreq[1]);
-      socksreq[len - 2] = port_upper;
-    }
-    else if(socksreq[3] == 4) {
-      failf(data,
-            "Can't complete SOCKS5 connection to %02x%02x:%02x%02x:"
-            "%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%d. (%d)",
-            (unsigned char)socksreq[4], (unsigned char)socksreq[5],
-            (unsigned char)socksreq[6], (unsigned char)socksreq[7],
-            (unsigned char)socksreq[8], (unsigned char)socksreq[9],
-            (unsigned char)socksreq[10], (unsigned char)socksreq[11],
-            (unsigned char)socksreq[12], (unsigned char)socksreq[13],
-            (unsigned char)socksreq[14], (unsigned char)socksreq[15],
-            (unsigned char)socksreq[16], (unsigned char)socksreq[17],
-            (unsigned char)socksreq[18], (unsigned char)socksreq[19],
-            (((unsigned char)socksreq[20] << 8) |
-             (unsigned char)socksreq[21]),
-            (unsigned char)socksreq[1]);
-    }
+    failf(data, "Can't complete SOCKS5 connection to %s. (%d)",
+          dest, (unsigned char)socksreq[1]);
     return CURLE_COULDNT_CONNECT;
   }
   infof(data, "SOCKS5 request granted.\n");
index daa07c1..3b319a6 100644 (file)
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
index 96948ac..65294bb 100644 (file)
@@ -6,7 +6,7 @@
  *                             \___|\___/|_| \_\_____|
  *
  * Copyright (C) 2009, Markus Moeller, <markus_moeller@compuserve.com>
- * Copyright (C) 2012 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 2012 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -151,8 +151,8 @@ CURLcode Curl_SOCKS5_gssapi_negotiate(int sockindex,
       return CURLE_OUT_OF_MEMORY;
     service.length = serviceptr_length +
       strlen(conn->socks_proxy.host.name) + 1;
-    snprintf(service.value, service.length + 1, "%s@%s",
-             serviceptr, conn->socks_proxy.host.name);
+    msnprintf(service.value, service.length + 1, "%s@%s",
+              serviceptr, conn->socks_proxy.host.name);
 
     gss_major_status = gss_import_name(&gss_minor_status, &service,
                                        GSS_C_NT_HOSTBASED_SERVICE, &server);
index 34699d3..57027ef 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 2012 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 2012 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  * Copyright (C) 2009, 2011, Markus Moeller, <markus_moeller@compuserve.com>
  *
  * This software is licensed as described in the file COPYING, which
@@ -51,8 +51,9 @@ static int check_sspi_err(struct connectdata *conn,
      status != SEC_I_COMPLETE_AND_CONTINUE &&
      status != SEC_I_COMPLETE_NEEDED &&
      status != SEC_I_CONTINUE_NEEDED) {
+    char buffer[STRERROR_LEN];
     failf(conn->data, "SSPI error: %s failed: %s", function,
-          Curl_sspi_strerror(conn, status));
+          Curl_sspi_strerror(status, buffer, sizeof(buffer)));
     return 1;
   }
   return 0;
@@ -107,9 +108,9 @@ CURLcode Curl_SOCKS5_gssapi_negotiate(int sockindex,
                           strlen(conn->socks_proxy.host.name) + 2);
     if(!service_name)
       return CURLE_OUT_OF_MEMORY;
-    snprintf(service_name, service_length +
-             strlen(conn->socks_proxy.host.name) + 2, "%s/%s",
-             service, conn->socks_proxy.host.name);
+    msnprintf(service_name, service_length +
+              strlen(conn->socks_proxy.host.name) + 2, "%s/%s",
+              service, conn->socks_proxy.host.name);
   }
 
   input_desc.cBuffers = 1;
index baf07e0..0f5fcd1 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1997 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1997 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -198,7 +198,7 @@ struct Curl_tree *Curl_splaygetbest(struct curltime i,
 /* Deletes the very node we point out from the tree if it's there. Stores a
  * pointer to the new resulting tree in 'newroot'.
  *
- * Returns zero on success and non-zero on errors! TODO: document error codes.
+ * Returns zero on success and non-zero on errors!
  * When returning error, it does not touch the 'newroot' pointer.
  *
  * NOTE: when the last node of the tree is removed, there's no tree left so
index 4612ec2..9292f34 100644 (file)
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1997 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1997 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -59,10 +59,4 @@ int Curl_splayremovebyaddr(struct Curl_tree *t,
                                    ( ((i.tv_usec) < (j.tv_usec)) ? -1 : \
                                    ( ((i.tv_usec) > (j.tv_usec)) ?  1 : 0))))
 
-#ifdef DEBUGBUILD
-void Curl_splayprint(struct Curl_tree * t, int d, char output);
-#else
-#define Curl_splayprint(x,y,z) Curl_nop_stmt
-#endif
-
 #endif /* HEADER_CURL_SPLAY_H */
index 24bcca9..a894712 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -93,6 +93,75 @@ char Curl_raw_toupper(char in)
   return in;
 }
 
+
+/* Portable, consistent tolower (remember EBCDIC). Do not use tolower() because
+   its behavior is altered by the current locale. */
+char Curl_raw_tolower(char in)
+{
+#if !defined(CURL_DOES_CONVERSIONS)
+  if(in >= 'A' && in <= 'Z')
+    return (char)('a' + in - 'A');
+#else
+  switch(in) {
+  case 'A':
+    return 'a';
+  case 'B':
+    return 'b';
+  case 'C':
+    return 'c';
+  case 'D':
+    return 'd';
+  case 'E':
+    return 'e';
+  case 'F':
+    return 'f';
+  case 'G':
+    return 'g';
+  case 'H':
+    return 'h';
+  case 'I':
+    return 'i';
+  case 'J':
+    return 'j';
+  case 'K':
+    return 'k';
+  case 'L':
+    return 'l';
+  case 'M':
+    return 'm';
+  case 'N':
+    return 'n';
+  case 'O':
+    return 'o';
+  case 'P':
+    return 'p';
+  case 'Q':
+    return 'q';
+  case 'R':
+    return 'r';
+  case 'S':
+    return 's';
+  case 'T':
+    return 't';
+  case 'U':
+    return 'u';
+  case 'V':
+    return 'v';
+  case 'W':
+    return 'w';
+  case 'X':
+    return 'x';
+  case 'Y':
+    return 'y';
+  case 'Z':
+    return 'z';
+  }
+#endif
+
+  return in;
+}
+
+
 /*
  * Curl_strcasecompare() is for doing "raw" case insensitive strings. This is
  * meant to be locale independent and only compare strings we know are safe
@@ -165,6 +234,21 @@ void Curl_strntoupper(char *dest, const char *src, size_t n)
   } while(*src++ && --n);
 }
 
+/* Copy a lower case version of the string from src to dest.  The
+ * strings may overlap.  No more than n characters of the string are copied
+ * (including any NUL) and the destination string will NOT be
+ * NUL-terminated if that limit is reached.
+ */
+void Curl_strntolower(char *dest, const char *src, size_t n)
+{
+  if(n < 1)
+    return;
+
+  do {
+    *dest++ = Curl_raw_tolower(*src);
+  } while(*src++ && --n);
+}
+
 /* --- public functions --- */
 
 int curl_strequal(const char *first, const char *second)
index 6fee384..baa768b 100644 (file)
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -40,11 +40,13 @@ int Curl_safe_strcasecompare(const char *first, const char *second);
 int Curl_strncasecompare(const char *first, const char *second, size_t max);
 
 char Curl_raw_toupper(char in);
+char Curl_raw_tolower(char in);
 
 /* checkprefix() is a shorter version of the above, used when the first
    argument is zero-byte terminated */
 #define checkprefix(a,b)    curl_strnequal(a,b,strlen(a))
 
 void Curl_strntoupper(char *dest, const char *src, size_t n);
+void Curl_strntolower(char *dest, const char *src, size_t n);
 
 #endif /* HEADER_CURL_STRCASE_H */
index 51e7978..1ab10fd 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
index 47ef44a..29df5aa 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 2004 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 2004 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -311,6 +311,12 @@ curl_easy_strerror(CURLcode error)
   case CURLE_RECURSIVE_API_CALL:
     return "API function called from within callback";
 
+  case CURLE_AUTH_ERROR:
+    return "An authentication function returned an error";
+
+  case CURLE_HTTP3:
+    return "HTTP/3 error";
+
     /* error codes not used by current libcurl */
   case CURLE_OBSOLETE20:
   case CURLE_OBSOLETE24:
@@ -383,6 +389,9 @@ curl_multi_strerror(CURLMcode error)
   case CURLM_RECURSIVE_API_CALL:
     return "API function called from within callback";
 
+  case CURLM_WAKEUP_FAILURE:
+    return "Wakeup is unavailable or failed";
+
   case CURLM_LAST:
     break;
   }
@@ -433,19 +442,26 @@ curl_share_strerror(CURLSHcode error)
 }
 
 #ifdef USE_WINSOCK
-
-/* This function handles most / all (?) Winsock errors curl is able to produce.
+/* This is a helper function for Curl_strerror that converts Winsock error
+ * codes (WSAGetLastError) to error messages.
+ * Returns NULL if no error message was found for error code.
  */
 static const char *
 get_winsock_error (int err, char *buf, size_t len)
 {
-#ifdef PRESERVE_WINDOWS_ERROR_CODE
-  DWORD old_win_err = GetLastError();
-#endif
-  int old_errno = errno;
+#ifndef CURL_DISABLE_VERBOSE_STRINGS
   const char *p;
+#endif
 
-#ifndef CURL_DISABLE_VERBOSE_STRINGS
+  if(!len)
+    return NULL;
+
+  *buf = '\0';
+
+#ifdef CURL_DISABLE_VERBOSE_STRINGS
+  (void)err;
+  return NULL;
+#else
   switch(err) {
   case WSAEINTR:
     p = "Call interrupted";
@@ -614,26 +630,63 @@ get_winsock_error (int err, char *buf, size_t len)
   default:
     return NULL;
   }
-#else
-  if(!err)
-    return NULL;
-  else
-    p = "error";
-#endif
   strncpy(buf, p, len);
   buf [len-1] = '\0';
+  return buf;
+#endif
+}
+#endif   /* USE_WINSOCK */
 
-  if(errno != old_errno)
-    errno = old_errno;
+#if defined(WIN32) || defined(_WIN32_WCE)
+/* This is a helper function for Curl_strerror that converts Windows API error
+ * codes (GetLastError) to error messages.
+ * Returns NULL if no error message was found for error code.
+ */
+static const char *
+get_winapi_error(int err, char *buf, size_t buflen)
+{
+  char *p;
 
-#ifdef PRESERVE_WINDOWS_ERROR_CODE
-  if(old_win_err != GetLastError())
-    SetLastError(old_win_err);
+  if(!buflen)
+    return NULL;
+
+  *buf = '\0';
+
+#ifdef _WIN32_WCE
+  {
+    wchar_t wbuf[256];
+    wbuf[0] = L'\0';
+
+    if(FormatMessage((FORMAT_MESSAGE_FROM_SYSTEM |
+                      FORMAT_MESSAGE_IGNORE_INSERTS), NULL, err,
+                     LANG_NEUTRAL, wbuf, sizeof(wbuf)/sizeof(wchar_t), NULL)) {
+      size_t written = wcstombs(buf, wbuf, buflen - 1);
+      if(written != (size_t)-1)
+        buf[written] = '\0';
+      else
+        *buf = '\0';
+    }
+  }
+#else
+  if(!FormatMessageA((FORMAT_MESSAGE_FROM_SYSTEM |
+                      FORMAT_MESSAGE_IGNORE_INSERTS), NULL, err,
+                     LANG_NEUTRAL, buf, (DWORD)buflen, NULL)) {
+    *buf = '\0';
+  }
 #endif
 
-  return buf;
+  /* Truncate multiple lines */
+  p = strchr(buf, '\n');
+  if(p) {
+    if(p > buf && *(p-1) == '\r')
+      *(p-1) = '\0';
+    else
+      *p = '\0';
+  }
+
+  return (*buf ? buf : NULL);
 }
-#endif   /* USE_WINSOCK */
+#endif /* WIN32 || _WIN32_WCE */
 
 /*
  * Our thread-safe and smart strerror() replacement.
@@ -645,47 +698,48 @@ get_winsock_error (int err, char *buf, size_t len)
  *
  * We don't do range checking (on systems other than Windows) since there is
  * no good reliable and portable way to do it.
+ *
+ * On Windows different types of error codes overlap. This function has an
+ * order of preference when trying to match error codes:
+ * CRT (errno), Winsock (WSAGetLastError), Windows API (GetLastError).
+ *
+ * It may be more correct to call one of the variant functions instead:
+ * Call Curl_sspi_strerror if the error code is definitely Windows SSPI.
+ * Call Curl_winapi_strerror if the error code is definitely Windows API.
  */
-const char *Curl_strerror(struct connectdata *conn, int err)
+const char *Curl_strerror(int err, char *buf, size_t buflen)
 {
 #ifdef PRESERVE_WINDOWS_ERROR_CODE
   DWORD old_win_err = GetLastError();
 #endif
   int old_errno = errno;
-  char *buf, *p;
+  char *p;
   size_t max;
 
-  DEBUGASSERT(conn);
+  if(!buflen)
+    return NULL;
+
   DEBUGASSERT(err >= 0);
 
-  buf = conn->syserr_buf;
-  max = sizeof(conn->syserr_buf)-1;
+  max = buflen - 1;
   *buf = '\0';
 
-#ifdef USE_WINSOCK
-
-#ifdef _WIN32_WCE
-  {
-    wchar_t wbuf[256];
-    wbuf[0] = L'\0';
-
-    FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, err,
-                  LANG_NEUTRAL, wbuf, sizeof(wbuf)/sizeof(wchar_t), NULL);
-    wcstombs(buf, wbuf, max);
-  }
-#else
+#if defined(WIN32) || defined(_WIN32_WCE)
+#if defined(WIN32)
   /* 'sys_nerr' is the maximum errno number, it is not widely portable */
   if(err >= 0 && err < sys_nerr)
     strncpy(buf, strerror(err), max);
-  else {
-    if(!get_winsock_error(err, buf, max) &&
-       !FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM, NULL, err,
-                       LANG_NEUTRAL, buf, (DWORD)max, NULL))
-      snprintf(buf, max, "Unknown error %d (%#x)", err, err);
-  }
+  else
 #endif
-
-#else /* not USE_WINSOCK coming up */
+  {
+    if(
+#ifdef USE_WINSOCK
+       !get_winsock_error(err, buf, max) &&
+#endif
+       !get_winapi_error((DWORD)err, buf, max))
+      msnprintf(buf, max, "Unknown error %d (%#x)", err, err);
+  }
+#else /* not Windows coming up */
 
 #if defined(HAVE_STRERROR_R) && defined(HAVE_POSIX_STRERROR_R)
  /*
@@ -695,7 +749,7 @@ const char *Curl_strerror(struct connectdata *conn, int err)
   */
   if(0 != strerror_r(err, buf, max)) {
     if('\0' == buf[0])
-      snprintf(buf, max, "Unknown error %d", err);
+      msnprintf(buf, max, "Unknown error %d", err);
   }
 #elif defined(HAVE_STRERROR_R) && defined(HAVE_GLIBC_STRERROR_R)
  /*
@@ -709,7 +763,7 @@ const char *Curl_strerror(struct connectdata *conn, int err)
     if(msg)
       strncpy(buf, msg, max);
     else
-      snprintf(buf, max, "Unknown error %d", err);
+      msnprintf(buf, max, "Unknown error %d", err);
   }
 #elif defined(HAVE_STRERROR_R) && defined(HAVE_VXWORKS_STRERROR_R)
  /*
@@ -721,7 +775,7 @@ const char *Curl_strerror(struct connectdata *conn, int err)
     if(OK == strerror_r(err, buffer))
       strncpy(buf, buffer, max);
     else
-      snprintf(buf, max, "Unknown error %d", err);
+      msnprintf(buf, max, "Unknown error %d", err);
   }
 #else
   {
@@ -729,11 +783,11 @@ const char *Curl_strerror(struct connectdata *conn, int err)
     if(msg)
       strncpy(buf, msg, max);
     else
-      snprintf(buf, max, "Unknown error %d", err);
+      msnprintf(buf, max, "Unknown error %d", err);
   }
 #endif
 
-#endif /* end of ! USE_WINSOCK */
+#endif /* end of not Windows */
 
   buf[max] = '\0'; /* make sure the string is zero terminated */
 
@@ -756,28 +810,64 @@ const char *Curl_strerror(struct connectdata *conn, int err)
   return buf;
 }
 
-#ifdef USE_WINDOWS_SSPI
-const char *Curl_sspi_strerror (struct connectdata *conn, int err)
+/*
+ * Curl_winapi_strerror:
+ * Variant of Curl_strerror if the error code is definitely Windows API.
+ */
+#if defined(WIN32) || defined(_WIN32_WCE)
+const char *Curl_winapi_strerror(DWORD err, char *buf, size_t buflen)
 {
 #ifdef PRESERVE_WINDOWS_ERROR_CODE
   DWORD old_win_err = GetLastError();
 #endif
   int old_errno = errno;
-  const char *txt;
-  char *outbuf;
-  size_t outmax;
+
+  if(!buflen)
+    return NULL;
+
+  *buf = '\0';
+
 #ifndef CURL_DISABLE_VERBOSE_STRINGS
-  char txtbuf[80];
-  char msgbuf[sizeof(conn->syserr_buf)];
-  char *p, *str, *msg = NULL;
-  bool msg_formatted = FALSE;
+  if(!get_winapi_error(err, buf, buflen)) {
+    msnprintf(buf, buflen, "Unknown error %u (0x%08X)", err, err);
+  }
+#else
+  {
+    const char *txt = (err == ERROR_SUCCESS) ? "No error" : "Error";
+    strncpy(buf, txt, buflen);
+    buf[buflen - 1] = '\0';
+  }
 #endif
 
-  DEBUGASSERT(conn);
+  if(errno != old_errno)
+    errno = old_errno;
 
-  outbuf = conn->syserr_buf;
-  outmax = sizeof(conn->syserr_buf)-1;
-  *outbuf = '\0';
+#ifdef PRESERVE_WINDOWS_ERROR_CODE
+  if(old_win_err != GetLastError())
+    SetLastError(old_win_err);
+#endif
+
+  return buf;
+}
+#endif /* WIN32 || _WIN32_WCE */
+
+#ifdef USE_WINDOWS_SSPI
+/*
+ * Curl_sspi_strerror:
+ * Variant of Curl_strerror if the error code is definitely Windows SSPI.
+ */
+const char *Curl_sspi_strerror(int err, char *buf, size_t buflen)
+{
+#ifdef PRESERVE_WINDOWS_ERROR_CODE
+  DWORD old_win_err = GetLastError();
+#endif
+  int old_errno = errno;
+  const char *txt;
+
+  if(!buflen)
+    return NULL;
+
+  *buf = '\0';
 
 #ifndef CURL_DISABLE_VERBOSE_STRINGS
 
@@ -785,314 +875,121 @@ const char *Curl_sspi_strerror (struct connectdata *conn, int err)
     case SEC_E_OK:
       txt = "No error";
       break;
-    case CRYPT_E_REVOKED:
-      txt = "CRYPT_E_REVOKED";
-      break;
-    case SEC_E_ALGORITHM_MISMATCH:
-      txt = "SEC_E_ALGORITHM_MISMATCH";
-      break;
-    case SEC_E_BAD_BINDINGS:
-      txt = "SEC_E_BAD_BINDINGS";
-      break;
-    case SEC_E_BAD_PKGID:
-      txt = "SEC_E_BAD_PKGID";
-      break;
-    case SEC_E_BUFFER_TOO_SMALL:
-      txt = "SEC_E_BUFFER_TOO_SMALL";
-      break;
-    case SEC_E_CANNOT_INSTALL:
-      txt = "SEC_E_CANNOT_INSTALL";
-      break;
-    case SEC_E_CANNOT_PACK:
-      txt = "SEC_E_CANNOT_PACK";
-      break;
-    case SEC_E_CERT_EXPIRED:
-      txt = "SEC_E_CERT_EXPIRED";
-      break;
-    case SEC_E_CERT_UNKNOWN:
-      txt = "SEC_E_CERT_UNKNOWN";
-      break;
-    case SEC_E_CERT_WRONG_USAGE:
-      txt = "SEC_E_CERT_WRONG_USAGE";
-      break;
-    case SEC_E_CONTEXT_EXPIRED:
-      txt = "SEC_E_CONTEXT_EXPIRED";
-      break;
-    case SEC_E_CROSSREALM_DELEGATION_FAILURE:
-      txt = "SEC_E_CROSSREALM_DELEGATION_FAILURE";
-      break;
-    case SEC_E_CRYPTO_SYSTEM_INVALID:
-      txt = "SEC_E_CRYPTO_SYSTEM_INVALID";
-      break;
-    case SEC_E_DECRYPT_FAILURE:
-      txt = "SEC_E_DECRYPT_FAILURE";
-      break;
-    case SEC_E_DELEGATION_POLICY:
-      txt = "SEC_E_DELEGATION_POLICY";
-      break;
-    case SEC_E_DELEGATION_REQUIRED:
-      txt = "SEC_E_DELEGATION_REQUIRED";
-      break;
-    case SEC_E_DOWNGRADE_DETECTED:
-      txt = "SEC_E_DOWNGRADE_DETECTED";
-      break;
-    case SEC_E_ENCRYPT_FAILURE:
-      txt = "SEC_E_ENCRYPT_FAILURE";
-      break;
-    case SEC_E_ILLEGAL_MESSAGE:
-      txt = "SEC_E_ILLEGAL_MESSAGE";
-      break;
-    case SEC_E_INCOMPLETE_CREDENTIALS:
-      txt = "SEC_E_INCOMPLETE_CREDENTIALS";
-      break;
-    case SEC_E_INCOMPLETE_MESSAGE:
-      txt = "SEC_E_INCOMPLETE_MESSAGE";
-      break;
-    case SEC_E_INSUFFICIENT_MEMORY:
-      txt = "SEC_E_INSUFFICIENT_MEMORY";
-      break;
-    case SEC_E_INTERNAL_ERROR:
-      txt = "SEC_E_INTERNAL_ERROR";
-      break;
-    case SEC_E_INVALID_HANDLE:
-      txt = "SEC_E_INVALID_HANDLE";
-      break;
-    case SEC_E_INVALID_PARAMETER:
-      txt = "SEC_E_INVALID_PARAMETER";
-      break;
-    case SEC_E_INVALID_TOKEN:
-      txt = "SEC_E_INVALID_TOKEN";
-      break;
-    case SEC_E_ISSUING_CA_UNTRUSTED:
-      txt = "SEC_E_ISSUING_CA_UNTRUSTED";
-      break;
-    case SEC_E_ISSUING_CA_UNTRUSTED_KDC:
-      txt = "SEC_E_ISSUING_CA_UNTRUSTED_KDC";
-      break;
-    case SEC_E_KDC_CERT_EXPIRED:
-      txt = "SEC_E_KDC_CERT_EXPIRED";
-      break;
-    case SEC_E_KDC_CERT_REVOKED:
-      txt = "SEC_E_KDC_CERT_REVOKED";
-      break;
-    case SEC_E_KDC_INVALID_REQUEST:
-      txt = "SEC_E_KDC_INVALID_REQUEST";
-      break;
-    case SEC_E_KDC_UNABLE_TO_REFER:
-      txt = "SEC_E_KDC_UNABLE_TO_REFER";
-      break;
-    case SEC_E_KDC_UNKNOWN_ETYPE:
-      txt = "SEC_E_KDC_UNKNOWN_ETYPE";
-      break;
-    case SEC_E_LOGON_DENIED:
-      txt = "SEC_E_LOGON_DENIED";
-      break;
-    case SEC_E_MAX_REFERRALS_EXCEEDED:
-      txt = "SEC_E_MAX_REFERRALS_EXCEEDED";
-      break;
-    case SEC_E_MESSAGE_ALTERED:
-      txt = "SEC_E_MESSAGE_ALTERED";
-      break;
-    case SEC_E_MULTIPLE_ACCOUNTS:
-      txt = "SEC_E_MULTIPLE_ACCOUNTS";
-      break;
-    case SEC_E_MUST_BE_KDC:
-      txt = "SEC_E_MUST_BE_KDC";
-      break;
-    case SEC_E_NOT_OWNER:
-      txt = "SEC_E_NOT_OWNER";
-      break;
-    case SEC_E_NO_AUTHENTICATING_AUTHORITY:
-      txt = "SEC_E_NO_AUTHENTICATING_AUTHORITY";
-      break;
-    case SEC_E_NO_CREDENTIALS:
-      txt = "SEC_E_NO_CREDENTIALS";
-      break;
-    case SEC_E_NO_IMPERSONATION:
-      txt = "SEC_E_NO_IMPERSONATION";
-      break;
-    case SEC_E_NO_IP_ADDRESSES:
-      txt = "SEC_E_NO_IP_ADDRESSES";
-      break;
-    case SEC_E_NO_KERB_KEY:
-      txt = "SEC_E_NO_KERB_KEY";
-      break;
-    case SEC_E_NO_PA_DATA:
-      txt = "SEC_E_NO_PA_DATA";
-      break;
-    case SEC_E_NO_S4U_PROT_SUPPORT:
-      txt = "SEC_E_NO_S4U_PROT_SUPPORT";
-      break;
-    case SEC_E_NO_TGT_REPLY:
-      txt = "SEC_E_NO_TGT_REPLY";
-      break;
-    case SEC_E_OUT_OF_SEQUENCE:
-      txt = "SEC_E_OUT_OF_SEQUENCE";
-      break;
-    case SEC_E_PKINIT_CLIENT_FAILURE:
-      txt = "SEC_E_PKINIT_CLIENT_FAILURE";
-      break;
-    case SEC_E_PKINIT_NAME_MISMATCH:
-      txt = "SEC_E_PKINIT_NAME_MISMATCH";
-      break;
-    case SEC_E_POLICY_NLTM_ONLY:
-      txt = "SEC_E_POLICY_NLTM_ONLY";
-      break;
-    case SEC_E_QOP_NOT_SUPPORTED:
-      txt = "SEC_E_QOP_NOT_SUPPORTED";
-      break;
-    case SEC_E_REVOCATION_OFFLINE_C:
-      txt = "SEC_E_REVOCATION_OFFLINE_C";
-      break;
-    case SEC_E_REVOCATION_OFFLINE_KDC:
-      txt = "SEC_E_REVOCATION_OFFLINE_KDC";
-      break;
-    case SEC_E_SECPKG_NOT_FOUND:
-      txt = "SEC_E_SECPKG_NOT_FOUND";
-      break;
-    case SEC_E_SECURITY_QOS_FAILED:
-      txt = "SEC_E_SECURITY_QOS_FAILED";
-      break;
-    case SEC_E_SHUTDOWN_IN_PROGRESS:
-      txt = "SEC_E_SHUTDOWN_IN_PROGRESS";
-      break;
-    case SEC_E_SMARTCARD_CERT_EXPIRED:
-      txt = "SEC_E_SMARTCARD_CERT_EXPIRED";
-      break;
-    case SEC_E_SMARTCARD_CERT_REVOKED:
-      txt = "SEC_E_SMARTCARD_CERT_REVOKED";
-      break;
-    case SEC_E_SMARTCARD_LOGON_REQUIRED:
-      txt = "SEC_E_SMARTCARD_LOGON_REQUIRED";
-      break;
-    case SEC_E_STRONG_CRYPTO_NOT_SUPPORTED:
-      txt = "SEC_E_STRONG_CRYPTO_NOT_SUPPORTED";
-      break;
-    case SEC_E_TARGET_UNKNOWN:
-      txt = "SEC_E_TARGET_UNKNOWN";
-      break;
-    case SEC_E_TIME_SKEW:
-      txt = "SEC_E_TIME_SKEW";
-      break;
-    case SEC_E_TOO_MANY_PRINCIPALS:
-      txt = "SEC_E_TOO_MANY_PRINCIPALS";
-      break;
-    case SEC_E_UNFINISHED_CONTEXT_DELETED:
-      txt = "SEC_E_UNFINISHED_CONTEXT_DELETED";
-      break;
-    case SEC_E_UNKNOWN_CREDENTIALS:
-      txt = "SEC_E_UNKNOWN_CREDENTIALS";
-      break;
-    case SEC_E_UNSUPPORTED_FUNCTION:
-      txt = "SEC_E_UNSUPPORTED_FUNCTION";
-      break;
-    case SEC_E_UNSUPPORTED_PREAUTH:
-      txt = "SEC_E_UNSUPPORTED_PREAUTH";
-      break;
-    case SEC_E_UNTRUSTED_ROOT:
-      txt = "SEC_E_UNTRUSTED_ROOT";
-      break;
-    case SEC_E_WRONG_CREDENTIAL_HANDLE:
-      txt = "SEC_E_WRONG_CREDENTIAL_HANDLE";
-      break;
-    case SEC_E_WRONG_PRINCIPAL:
-      txt = "SEC_E_WRONG_PRINCIPAL";
-      break;
-    case SEC_I_COMPLETE_AND_CONTINUE:
-      txt = "SEC_I_COMPLETE_AND_CONTINUE";
-      break;
-    case SEC_I_COMPLETE_NEEDED:
-      txt = "SEC_I_COMPLETE_NEEDED";
-      break;
-    case SEC_I_CONTEXT_EXPIRED:
-      txt = "SEC_I_CONTEXT_EXPIRED";
-      break;
-    case SEC_I_CONTINUE_NEEDED:
-      txt = "SEC_I_CONTINUE_NEEDED";
-      break;
-    case SEC_I_INCOMPLETE_CREDENTIALS:
-      txt = "SEC_I_INCOMPLETE_CREDENTIALS";
-      break;
-    case SEC_I_LOCAL_LOGON:
-      txt = "SEC_I_LOCAL_LOGON";
-      break;
-    case SEC_I_NO_LSA_CONTEXT:
-      txt = "SEC_I_NO_LSA_CONTEXT";
-      break;
-    case SEC_I_RENEGOTIATE:
-      txt = "SEC_I_RENEGOTIATE";
-      break;
-    case SEC_I_SIGNATURE_NEEDED:
-      txt = "SEC_I_SIGNATURE_NEEDED";
-      break;
+#define SEC2TXT(sec) case sec: txt = #sec; break
+    SEC2TXT(CRYPT_E_REVOKED);
+    SEC2TXT(SEC_E_ALGORITHM_MISMATCH);
+    SEC2TXT(SEC_E_BAD_BINDINGS);
+    SEC2TXT(SEC_E_BAD_PKGID);
+    SEC2TXT(SEC_E_BUFFER_TOO_SMALL);
+    SEC2TXT(SEC_E_CANNOT_INSTALL);
+    SEC2TXT(SEC_E_CANNOT_PACK);
+    SEC2TXT(SEC_E_CERT_EXPIRED);
+    SEC2TXT(SEC_E_CERT_UNKNOWN);
+    SEC2TXT(SEC_E_CERT_WRONG_USAGE);
+    SEC2TXT(SEC_E_CONTEXT_EXPIRED);
+    SEC2TXT(SEC_E_CROSSREALM_DELEGATION_FAILURE);
+    SEC2TXT(SEC_E_CRYPTO_SYSTEM_INVALID);
+    SEC2TXT(SEC_E_DECRYPT_FAILURE);
+    SEC2TXT(SEC_E_DELEGATION_POLICY);
+    SEC2TXT(SEC_E_DELEGATION_REQUIRED);
+    SEC2TXT(SEC_E_DOWNGRADE_DETECTED);
+    SEC2TXT(SEC_E_ENCRYPT_FAILURE);
+    SEC2TXT(SEC_E_ILLEGAL_MESSAGE);
+    SEC2TXT(SEC_E_INCOMPLETE_CREDENTIALS);
+    SEC2TXT(SEC_E_INCOMPLETE_MESSAGE);
+    SEC2TXT(SEC_E_INSUFFICIENT_MEMORY);
+    SEC2TXT(SEC_E_INTERNAL_ERROR);
+    SEC2TXT(SEC_E_INVALID_HANDLE);
+    SEC2TXT(SEC_E_INVALID_PARAMETER);
+    SEC2TXT(SEC_E_INVALID_TOKEN);
+    SEC2TXT(SEC_E_ISSUING_CA_UNTRUSTED);
+    SEC2TXT(SEC_E_ISSUING_CA_UNTRUSTED_KDC);
+    SEC2TXT(SEC_E_KDC_CERT_EXPIRED);
+    SEC2TXT(SEC_E_KDC_CERT_REVOKED);
+    SEC2TXT(SEC_E_KDC_INVALID_REQUEST);
+    SEC2TXT(SEC_E_KDC_UNABLE_TO_REFER);
+    SEC2TXT(SEC_E_KDC_UNKNOWN_ETYPE);
+    SEC2TXT(SEC_E_LOGON_DENIED);
+    SEC2TXT(SEC_E_MAX_REFERRALS_EXCEEDED);
+    SEC2TXT(SEC_E_MESSAGE_ALTERED);
+    SEC2TXT(SEC_E_MULTIPLE_ACCOUNTS);
+    SEC2TXT(SEC_E_MUST_BE_KDC);
+    SEC2TXT(SEC_E_NOT_OWNER);
+    SEC2TXT(SEC_E_NO_AUTHENTICATING_AUTHORITY);
+    SEC2TXT(SEC_E_NO_CREDENTIALS);
+    SEC2TXT(SEC_E_NO_IMPERSONATION);
+    SEC2TXT(SEC_E_NO_IP_ADDRESSES);
+    SEC2TXT(SEC_E_NO_KERB_KEY);
+    SEC2TXT(SEC_E_NO_PA_DATA);
+    SEC2TXT(SEC_E_NO_S4U_PROT_SUPPORT);
+    SEC2TXT(SEC_E_NO_TGT_REPLY);
+    SEC2TXT(SEC_E_OUT_OF_SEQUENCE);
+    SEC2TXT(SEC_E_PKINIT_CLIENT_FAILURE);
+    SEC2TXT(SEC_E_PKINIT_NAME_MISMATCH);
+    SEC2TXT(SEC_E_POLICY_NLTM_ONLY);
+    SEC2TXT(SEC_E_QOP_NOT_SUPPORTED);
+    SEC2TXT(SEC_E_REVOCATION_OFFLINE_C);
+    SEC2TXT(SEC_E_REVOCATION_OFFLINE_KDC);
+    SEC2TXT(SEC_E_SECPKG_NOT_FOUND);
+    SEC2TXT(SEC_E_SECURITY_QOS_FAILED);
+    SEC2TXT(SEC_E_SHUTDOWN_IN_PROGRESS);
+    SEC2TXT(SEC_E_SMARTCARD_CERT_EXPIRED);
+    SEC2TXT(SEC_E_SMARTCARD_CERT_REVOKED);
+    SEC2TXT(SEC_E_SMARTCARD_LOGON_REQUIRED);
+    SEC2TXT(SEC_E_STRONG_CRYPTO_NOT_SUPPORTED);
+    SEC2TXT(SEC_E_TARGET_UNKNOWN);
+    SEC2TXT(SEC_E_TIME_SKEW);
+    SEC2TXT(SEC_E_TOO_MANY_PRINCIPALS);
+    SEC2TXT(SEC_E_UNFINISHED_CONTEXT_DELETED);
+    SEC2TXT(SEC_E_UNKNOWN_CREDENTIALS);
+    SEC2TXT(SEC_E_UNSUPPORTED_FUNCTION);
+    SEC2TXT(SEC_E_UNSUPPORTED_PREAUTH);
+    SEC2TXT(SEC_E_UNTRUSTED_ROOT);
+    SEC2TXT(SEC_E_WRONG_CREDENTIAL_HANDLE);
+    SEC2TXT(SEC_E_WRONG_PRINCIPAL);
+    SEC2TXT(SEC_I_COMPLETE_AND_CONTINUE);
+    SEC2TXT(SEC_I_COMPLETE_NEEDED);
+    SEC2TXT(SEC_I_CONTEXT_EXPIRED);
+    SEC2TXT(SEC_I_CONTINUE_NEEDED);
+    SEC2TXT(SEC_I_INCOMPLETE_CREDENTIALS);
+    SEC2TXT(SEC_I_LOCAL_LOGON);
+    SEC2TXT(SEC_I_NO_LSA_CONTEXT);
+    SEC2TXT(SEC_I_RENEGOTIATE);
+    SEC2TXT(SEC_I_SIGNATURE_NEEDED);
     default:
       txt = "Unknown error";
   }
 
-  if(err == SEC_E_OK)
-    strncpy(outbuf, txt, outmax);
-  else if(err == SEC_E_ILLEGAL_MESSAGE)
-    snprintf(outbuf, outmax,
-             "SEC_E_ILLEGAL_MESSAGE (0x%08X) - This error usually occurs "
-             "when a fatal SSL/TLS alert is received (e.g. handshake failed). "
-             "More detail may be available in the Windows System event log.",
-             err);
+  if(err == SEC_E_ILLEGAL_MESSAGE) {
+    msnprintf(buf, buflen,
+              "SEC_E_ILLEGAL_MESSAGE (0x%08X) - This error usually occurs "
+              "when a fatal SSL/TLS alert is received (e.g. handshake failed)."
+              " More detail may be available in the Windows System event log.",
+              err);
+  }
   else {
-    str = txtbuf;
-    snprintf(txtbuf, sizeof(txtbuf), "%s (0x%08X)", txt, err);
-    txtbuf[sizeof(txtbuf)-1] = '\0';
+    char txtbuf[80];
+    char msgbuf[256];
 
-#ifdef _WIN32_WCE
-    {
-      wchar_t wbuf[256];
-      wbuf[0] = L'\0';
-
-      if(FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM |
-                       FORMAT_MESSAGE_IGNORE_INSERTS,
-                       NULL, err, LANG_NEUTRAL,
-                       wbuf, sizeof(wbuf)/sizeof(wchar_t), NULL)) {
-        wcstombs(msgbuf, wbuf, sizeof(msgbuf)-1);
-        msg_formatted = TRUE;
-      }
-    }
-#else
-    if(FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM |
-                      FORMAT_MESSAGE_IGNORE_INSERTS,
-                      NULL, err, LANG_NEUTRAL,
-                      msgbuf, sizeof(msgbuf)-1, NULL)) {
-      msg_formatted = TRUE;
-    }
-#endif
-    if(msg_formatted) {
-      msgbuf[sizeof(msgbuf)-1] = '\0';
-      /* strip trailing '\r\n' or '\n' */
-      p = strrchr(msgbuf, '\n');
-      if(p && (p - msgbuf) >= 2)
-        *p = '\0';
-      p = strrchr(msgbuf, '\r');
-      if(p && (p - msgbuf) >= 1)
-        *p = '\0';
-      msg = msgbuf;
+    msnprintf(txtbuf, sizeof(txtbuf), "%s (0x%08X)", txt, err);
+
+    if(get_winapi_error(err, msgbuf, sizeof(msgbuf)))
+      msnprintf(buf, buflen, "%s - %s", txtbuf, msgbuf);
+    else {
+      strncpy(buf, txtbuf, buflen);
+      buf[buflen - 1] = '\0';
     }
-    if(msg)
-      snprintf(outbuf, outmax, "%s - %s", str, msg);
-    else
-      strncpy(outbuf, str, outmax);
   }
 
 #else
-
   if(err == SEC_E_OK)
     txt = "No error";
   else
     txt = "Error";
-
-  strncpy(outbuf, txt, outmax);
-
+  strncpy(buf, txt, buflen);
+  buf[buflen - 1] = '\0';
 #endif
 
-  outbuf[outmax] = '\0';
-
   if(errno != old_errno)
     errno = old_errno;
 
@@ -1101,6 +998,6 @@ const char *Curl_sspi_strerror (struct connectdata *conn, int err)
     SetLastError(old_win_err);
 #endif
 
-  return outbuf;
+  return buf;
 }
 #endif /* USE_WINDOWS_SSPI */
index 627273e..278c108 100644 (file)
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
 
 #include "urldata.h"
 
-const char *Curl_strerror (struct connectdata *conn, int err);
+#define STRERROR_LEN 128 /* a suitable length */
 
-#ifdef USE_LIBIDN2
-const char *Curl_idn_strerror (struct connectdata *conn, int err);
+const char *Curl_strerror(int err, char *buf, size_t buflen);
+#if defined(WIN32) || defined(_WIN32_WCE)
+const char *Curl_winapi_strerror(DWORD err, char *buf, size_t buflen);
 #endif
-
 #ifdef USE_WINDOWS_SSPI
-const char *Curl_sspi_strerror (struct connectdata *conn, int err);
+const char *Curl_sspi_strerror(int err, char *buf, size_t buflen);
 #endif
 
 #endif /* HEADER_CURL_STRERROR_H */
index 460eb87..be8f481 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2007, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
index 90b831e..e221fa6 100644 (file)
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2010, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
index 546a3ff..96e3820 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
index 6b8004e..52a5fd9 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 2016 - 2017, Steve Holme, <steve_holme@hotmail.com>.
+ * Copyright (C) 2016 - 2019, Steve Holme, <steve_holme@hotmail.com>.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
 
 #include <curl/curl.h>
 #include "system_win32.h"
+#include "curl_sspi.h"
 #include "warnless.h"
 
 /* The last #include files should be: */
 #include "curl_memory.h"
 #include "memdebug.h"
 
-#if defined(USE_WINDOWS_SSPI) || (!defined(CURL_DISABLE_TELNET) && \
-                                  defined(USE_WINSOCK))
+LARGE_INTEGER Curl_freq;
+bool Curl_isVistaOrGreater;
 
+/* Handle of iphlpapp.dll */
+static HMODULE s_hIpHlpApiDll = NULL;
+
+/* Pointer to the if_nametoindex function */
+IF_NAMETOINDEX_FN Curl_if_nametoindex = NULL;
+
+/* Curl_win32_init() performs win32 global initialization */
+CURLcode Curl_win32_init(long flags)
+{
+  /* CURL_GLOBAL_WIN32 controls the *optional* part of the initialization which
+     is just for Winsock at the moment. Any required win32 initialization
+     should take place after this block. */
+  if(flags & CURL_GLOBAL_WIN32) {
+#ifdef USE_WINSOCK
+    WORD wVersionRequested;
+    WSADATA wsaData;
+    int res;
+
+#if defined(ENABLE_IPV6) && (USE_WINSOCK < 2)
+#error IPV6_requires_winsock2
+#endif
+
+    wVersionRequested = MAKEWORD(USE_WINSOCK, USE_WINSOCK);
+
+    res = WSAStartup(wVersionRequested, &wsaData);
+
+    if(res != 0)
+      /* Tell the user that we couldn't find a usable */
+      /* winsock.dll.     */
+      return CURLE_FAILED_INIT;
+
+    /* Confirm that the Windows Sockets DLL supports what we need.*/
+    /* Note that if the DLL supports versions greater */
+    /* than wVersionRequested, it will still return */
+    /* wVersionRequested in wVersion. wHighVersion contains the */
+    /* highest supported version. */
+
+    if(LOBYTE(wsaData.wVersion) != LOBYTE(wVersionRequested) ||
+       HIBYTE(wsaData.wVersion) != HIBYTE(wVersionRequested) ) {
+      /* Tell the user that we couldn't find a usable */
+
+      /* winsock.dll. */
+      WSACleanup();
+      return CURLE_FAILED_INIT;
+    }
+    /* The Windows Sockets DLL is acceptable. Proceed. */
+  #elif defined(USE_LWIPSOCK)
+    lwip_init();
+  #endif
+  } /* CURL_GLOBAL_WIN32 */
+
+#ifdef USE_WINDOWS_SSPI
+  {
+    CURLcode result = Curl_sspi_global_init();
+    if(result)
+      return result;
+  }
+#endif
+
+  s_hIpHlpApiDll = Curl_load_library(TEXT("iphlpapi.dll"));
+  if(s_hIpHlpApiDll) {
+    /* Get the address of the if_nametoindex function */
+    IF_NAMETOINDEX_FN pIfNameToIndex =
+      CURLX_FUNCTION_CAST(IF_NAMETOINDEX_FN,
+                          (GetProcAddress(s_hIpHlpApiDll, "if_nametoindex")));
+
+    if(pIfNameToIndex)
+      Curl_if_nametoindex = pIfNameToIndex;
+  }
+
+  if(Curl_verify_windows_version(6, 0, PLATFORM_WINNT,
+                                 VERSION_GREATER_THAN_EQUAL)) {
+    Curl_isVistaOrGreater = TRUE;
+    QueryPerformanceFrequency(&Curl_freq);
+  }
+  else
+    Curl_isVistaOrGreater = FALSE;
+
+  return CURLE_OK;
+}
+
+/* Curl_win32_cleanup() is the opposite of Curl_win32_init() */
+void Curl_win32_cleanup(long init_flags)
+{
+  if(s_hIpHlpApiDll) {
+    FreeLibrary(s_hIpHlpApiDll);
+    s_hIpHlpApiDll = NULL;
+    Curl_if_nametoindex = NULL;
+  }
+
+#ifdef USE_WINDOWS_SSPI
+  Curl_sspi_global_cleanup();
+#endif
+
+  if(init_flags & CURL_GLOBAL_WIN32) {
+#ifdef USE_WINSOCK
+    WSACleanup();
+#endif
+  }
+}
 
 #if !defined(LOAD_WITH_ALTERED_SEARCH_PATH)
 #define LOAD_WITH_ALTERED_SEARCH_PATH  0x00000008
@@ -58,8 +159,6 @@ typedef HMODULE (APIENTRY *LOADLIBRARYEX_FN)(LPCTSTR, HANDLE, DWORD);
 #  define LOADLIBARYEX    "LoadLibraryExA"
 #endif
 
-#endif /* USE_WINDOWS_SSPI || (!CURL_DISABLE_TELNET && USE_WINSOCK) */
-
 /*
  * Curl_verify_windows_version()
  *
@@ -252,9 +351,6 @@ bool Curl_verify_windows_version(const unsigned int majorVersion,
   return matched;
 }
 
-#if defined(USE_WINDOWS_SSPI) || (!defined(CURL_DISABLE_TELNET) && \
-                                  defined(USE_WINSOCK))
-
 /*
  * Curl_load_library()
  *
@@ -271,6 +367,7 @@ bool Curl_verify_windows_version(const unsigned int majorVersion,
  */
 HMODULE Curl_load_library(LPCTSTR filename)
 {
+#ifndef CURL_WINDOWS_APP
   HMODULE hModule = NULL;
   LOADLIBRARYEX_FN pLoadLibraryEx = NULL;
 
@@ -325,10 +422,12 @@ HMODULE Curl_load_library(LPCTSTR filename)
       free(path);
     }
   }
-
   return hModule;
+#else
+  /* the Universal Windows Platform (UWP) can't do this */
+  (void)filename;
+  return NULL;
+#endif
 }
 
-#endif /* USE_WINDOWS_SSPI || (!CURL_DISABLE_TELNET && USE_WINSOCK) */
-
 #endif /* WIN32 */
index 1e77285..d2882fc 100644 (file)
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 2016, Steve Holme, <steve_holme@hotmail.com>.
+ * Copyright (C) 2016 - 2019, Steve Holme, <steve_holme@hotmail.com>.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
 
 #if defined(WIN32)
 
+extern LARGE_INTEGER Curl_freq;
+extern bool Curl_isVistaOrGreater;
+
+CURLcode Curl_win32_init(long flags);
+void Curl_win32_cleanup(long init_flags);
+
 /* Version condition */
 typedef enum {
   VERSION_LESS_THAN,
@@ -42,20 +48,21 @@ typedef enum {
   PLATFORM_WINNT
 } PlatformIdentifier;
 
+/* We use our own typedef here since some headers might lack this */
+typedef unsigned int(WINAPI *IF_NAMETOINDEX_FN)(const char *);
+
+/* This is used instead of if_nametoindex if available on Windows */
+extern IF_NAMETOINDEX_FN Curl_if_nametoindex;
+
 /* This is used to verify if we are running on a specific windows version */
 bool Curl_verify_windows_version(const unsigned int majorVersion,
                                  const unsigned int minorVersion,
                                  const PlatformIdentifier platform,
                                  const VersionCondition condition);
 
-#if defined(USE_WINDOWS_SSPI) || (!defined(CURL_DISABLE_TELNET) && \
-                                  defined(USE_WINSOCK))
-
 /* This is used to dynamically load DLLs */
 HMODULE Curl_load_library(LPCTSTR filename);
 
-#endif /* USE_WINDOWS_SSPI || (!CURL_DISABLE_TELNET && USE_WINSOCK) */
-
 #endif /* WIN32 */
 
 #endif /* HEADER_CURL_SYSTEM_WIN32_H */
index 05fe744..4bf4c65 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
   do {                                                  \
     x->subend = x->subpointer;                          \
     CURL_SB_CLEAR(x);                                   \
-  } WHILE_FALSE
+  } while(0)
 #define CURL_SB_ACCUM(x,c)                                      \
   do {                                                          \
     if(x->subpointer < (x->subbuffer + sizeof(x->subbuffer)))   \
       *x->subpointer++ = (c);                                   \
-  } WHILE_FALSE
+  } while(0)
 
 #define  CURL_SB_GET(x) ((*x->subpointer++)&0xff)
 #define  CURL_SB_LEN(x) (x->subend - x->subpointer)
@@ -829,7 +829,7 @@ static CURLcode check_telnet_options(struct connectdata *conn)
   /* Add the user name as an environment variable if it
      was given on the command line */
   if(conn->bits.user_passwd) {
-    snprintf(option_arg, sizeof(option_arg), "USER,%s", conn->user);
+    msnprintf(option_arg, sizeof(option_arg), "USER,%s", conn->user);
     beg = curl_slist_append(tn->telnet_vars, option_arg);
     if(!beg) {
       curl_slist_free_all(tn->telnet_vars);
@@ -935,9 +935,9 @@ static void suboption(struct connectdata *conn)
   switch(CURL_SB_GET(tn)) {
     case CURL_TELOPT_TTYPE:
       len = strlen(tn->subopt_ttype) + 4 + 2;
-      snprintf((char *)temp, sizeof(temp),
-               "%c%c%c%c%s%c%c", CURL_IAC, CURL_SB, CURL_TELOPT_TTYPE,
-               CURL_TELQUAL_IS, tn->subopt_ttype, CURL_IAC, CURL_SE);
+      msnprintf((char *)temp, sizeof(temp),
+                "%c%c%c%c%s%c%c", CURL_IAC, CURL_SB, CURL_TELOPT_TTYPE,
+                CURL_TELQUAL_IS, tn->subopt_ttype, CURL_IAC, CURL_SE);
       bytes_written = swrite(conn->sock[FIRSTSOCKET], temp, len);
       if(bytes_written < 0) {
         err = SOCKERRNO;
@@ -947,9 +947,9 @@ static void suboption(struct connectdata *conn)
       break;
     case CURL_TELOPT_XDISPLOC:
       len = strlen(tn->subopt_xdisploc) + 4 + 2;
-      snprintf((char *)temp, sizeof(temp),
-               "%c%c%c%c%s%c%c", CURL_IAC, CURL_SB, CURL_TELOPT_XDISPLOC,
-               CURL_TELQUAL_IS, tn->subopt_xdisploc, CURL_IAC, CURL_SE);
+      msnprintf((char *)temp, sizeof(temp),
+                "%c%c%c%c%s%c%c", CURL_IAC, CURL_SB, CURL_TELOPT_XDISPLOC,
+                CURL_TELQUAL_IS, tn->subopt_xdisploc, CURL_IAC, CURL_SE);
       bytes_written = swrite(conn->sock[FIRSTSOCKET], temp, len);
       if(bytes_written < 0) {
         err = SOCKERRNO;
@@ -958,9 +958,9 @@ static void suboption(struct connectdata *conn)
       printsub(data, '>', &temp[2], len-2);
       break;
     case CURL_TELOPT_NEW_ENVIRON:
-      snprintf((char *)temp, sizeof(temp),
-               "%c%c%c%c", CURL_IAC, CURL_SB, CURL_TELOPT_NEW_ENVIRON,
-               CURL_TELQUAL_IS);
+      msnprintf((char *)temp, sizeof(temp),
+                "%c%c%c%c", CURL_IAC, CURL_SB, CURL_TELOPT_NEW_ENVIRON,
+                CURL_TELQUAL_IS);
       len = 4;
 
       for(v = tn->telnet_vars; v; v = v->next) {
@@ -968,15 +968,15 @@ static void suboption(struct connectdata *conn)
         /* Add the variable only if it fits */
         if(len + tmplen < (int)sizeof(temp)-6) {
           if(sscanf(v->data, "%127[^,],%127s", varname, varval)) {
-            snprintf((char *)&temp[len], sizeof(temp) - len,
-                     "%c%s%c%s", CURL_NEW_ENV_VAR, varname,
-                     CURL_NEW_ENV_VALUE, varval);
+            msnprintf((char *)&temp[len], sizeof(temp) - len,
+                      "%c%s%c%s", CURL_NEW_ENV_VAR, varname,
+                      CURL_NEW_ENV_VALUE, varval);
             len += tmplen;
           }
         }
       }
-      snprintf((char *)&temp[len], sizeof(temp) - len,
-               "%c%c", CURL_IAC, CURL_SE);
+      msnprintf((char *)&temp[len], sizeof(temp) - len,
+                "%c%c", CURL_IAC, CURL_SE);
       len += 2;
       bytes_written = swrite(conn->sock[FIRSTSOCKET], temp, len);
       if(bytes_written < 0) {
@@ -1692,7 +1692,7 @@ static CURLcode telnet_do(struct connectdata *conn, bool *done)
   }
 #endif
   /* mark this as "no further transfer wanted" */
-  Curl_setup_transfer(conn, -1, -1, FALSE, NULL, -1, NULL);
+  Curl_setup_transfer(data, -1, -1, FALSE, -1);
 
   return result;
 }
index 668a78a..431427f 100644 (file)
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2007, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
index 5b74e8e..346f293 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -157,8 +157,7 @@ static CURLcode tftp_done(struct connectdata *conn,
 static CURLcode tftp_setup_connection(struct connectdata * conn);
 static CURLcode tftp_multi_statemach(struct connectdata *conn, bool *done);
 static CURLcode tftp_doing(struct connectdata *conn, bool *dophase_done);
-static int tftp_getsock(struct connectdata *conn, curl_socket_t *socks,
-                        int numsocks);
+static int tftp_getsock(struct connectdata *conn, curl_socket_t *socks);
 static CURLcode tftp_translate_code(tftp_error_t error);
 
 
@@ -404,13 +403,14 @@ static CURLcode tftp_parse_option_ack(tftp_state_data_t *state,
   return CURLE_OK;
 }
 
-static size_t tftp_option_add(tftp_state_data_t *state, size_t csize,
-                              char *buf, const char *option)
+static CURLcode tftp_option_add(tftp_state_data_t *state, size_t *csize,
+                                char *buf, const char *option)
 {
-  if(( strlen(option) + csize + 1) > (size_t)state->blksize)
-    return 0;
+  if(( strlen(option) + *csize + 1) > (size_t)state->blksize)
+    return CURLE_TFTP_ILLEGAL;
   strcpy(buf, option);
-  return strlen(option) + 1;
+  *csize += strlen(option) + 1;
+  return CURLE_OK;
 }
 
 static CURLcode tftp_connect_for_tx(tftp_state_data_t *state,
@@ -496,9 +496,9 @@ static CURLcode tftp_send_first(tftp_state_data_t *state, tftp_event_t event)
       return CURLE_TFTP_ILLEGAL; /* too long file name field */
     }
 
-    snprintf((char *)state->spacket.data + 2,
-             state->blksize,
-             "%s%c%s%c", filename, '\0',  mode, '\0');
+    msnprintf((char *)state->spacket.data + 2,
+              state->blksize,
+              "%s%c%s%c", filename, '\0',  mode, '\0');
     sbytes = 4 + strlen(filename) + strlen(mode);
 
     /* optional addition of TFTP options */
@@ -506,31 +506,43 @@ static CURLcode tftp_send_first(tftp_state_data_t *state, tftp_event_t event)
       char buf[64];
       /* add tsize option */
       if(data->set.upload && (data->state.infilesize != -1))
-        snprintf(buf, sizeof(buf), "%" CURL_FORMAT_CURL_OFF_T,
-                 data->state.infilesize);
+        msnprintf(buf, sizeof(buf), "%" CURL_FORMAT_CURL_OFF_T,
+                  data->state.infilesize);
       else
         strcpy(buf, "0"); /* the destination is large enough */
 
-      sbytes += tftp_option_add(state, sbytes,
-                                (char *)state->spacket.data + sbytes,
-                                TFTP_OPTION_TSIZE);
-      sbytes += tftp_option_add(state, sbytes,
-                                (char *)state->spacket.data + sbytes, buf);
+      result = tftp_option_add(state, &sbytes,
+                               (char *)state->spacket.data + sbytes,
+                               TFTP_OPTION_TSIZE);
+      if(result == CURLE_OK)
+        result = tftp_option_add(state, &sbytes,
+                                 (char *)state->spacket.data + sbytes, buf);
+
       /* add blksize option */
-      snprintf(buf, sizeof(buf), "%d", state->requested_blksize);
-      sbytes += tftp_option_add(state, sbytes,
-                                (char *)state->spacket.data + sbytes,
-                                TFTP_OPTION_BLKSIZE);
-      sbytes += tftp_option_add(state, sbytes,
-                                (char *)state->spacket.data + sbytes, buf);
+      msnprintf(buf, sizeof(buf), "%d", state->requested_blksize);
+      if(result == CURLE_OK)
+        result = tftp_option_add(state, &sbytes,
+                                 (char *)state->spacket.data + sbytes,
+                                 TFTP_OPTION_BLKSIZE);
+      if(result == CURLE_OK)
+        result = tftp_option_add(state, &sbytes,
+                                 (char *)state->spacket.data + sbytes, buf);
 
       /* add timeout option */
-      snprintf(buf, sizeof(buf), "%d", state->retry_time);
-      sbytes += tftp_option_add(state, sbytes,
-                                (char *)state->spacket.data + sbytes,
-                                TFTP_OPTION_INTERVAL);
-      sbytes += tftp_option_add(state, sbytes,
-                                (char *)state->spacket.data + sbytes, buf);
+      msnprintf(buf, sizeof(buf), "%d", state->retry_time);
+      if(result == CURLE_OK)
+        result = tftp_option_add(state, &sbytes,
+                                 (char *)state->spacket.data + sbytes,
+                                 TFTP_OPTION_INTERVAL);
+      if(result == CURLE_OK)
+        result = tftp_option_add(state, &sbytes,
+                                 (char *)state->spacket.data + sbytes, buf);
+
+      if(result != CURLE_OK) {
+        failf(data, "TFTP buffer too small for options");
+        free(filename);
+        return CURLE_TFTP_ILLEGAL;
+      }
     }
 
     /* the typecase for the 3rd argument is mostly for systems that do
@@ -540,7 +552,8 @@ static CURLcode tftp_send_first(tftp_state_data_t *state, tftp_event_t event)
                       state->conn->ip_addr->ai_addr,
                       state->conn->ip_addr->ai_addrlen);
     if(senddata != (ssize_t)sbytes) {
-      failf(data, "%s", Curl_strerror(state->conn, SOCKERRNO));
+      char buffer[STRERROR_LEN];
+      failf(data, "%s", Curl_strerror(SOCKERRNO, buffer, sizeof(buffer)));
     }
     free(filename);
     break;
@@ -590,6 +603,7 @@ static CURLcode tftp_rx(tftp_state_data_t *state, tftp_event_t event)
   ssize_t sbytes;
   int rblock;
   struct Curl_easy *data = state->conn->data;
+  char buffer[STRERROR_LEN];
 
   switch(event) {
 
@@ -622,7 +636,7 @@ static CURLcode tftp_rx(tftp_state_data_t *state, tftp_event_t event)
                     (struct sockaddr *)&state->remote_addr,
                     state->remote_addrlen);
     if(sbytes < 0) {
-      failf(data, "%s", Curl_strerror(state->conn, SOCKERRNO));
+      failf(data, "%s", Curl_strerror(SOCKERRNO, buffer, sizeof(buffer)));
       return CURLE_SEND_ERROR;
     }
 
@@ -647,7 +661,7 @@ static CURLcode tftp_rx(tftp_state_data_t *state, tftp_event_t event)
                     (struct sockaddr *)&state->remote_addr,
                     state->remote_addrlen);
     if(sbytes < 0) {
-      failf(data, "%s", Curl_strerror(state->conn, SOCKERRNO));
+      failf(data, "%s", Curl_strerror(SOCKERRNO, buffer, sizeof(buffer)));
       return CURLE_SEND_ERROR;
     }
 
@@ -673,7 +687,7 @@ static CURLcode tftp_rx(tftp_state_data_t *state, tftp_event_t event)
                       (struct sockaddr *)&state->remote_addr,
                       state->remote_addrlen);
       if(sbytes<0) {
-        failf(data, "%s", Curl_strerror(state->conn, SOCKERRNO));
+        failf(data, "%s", Curl_strerror(SOCKERRNO, buffer, sizeof(buffer)));
         return CURLE_SEND_ERROR;
       }
     }
@@ -713,6 +727,7 @@ static CURLcode tftp_tx(tftp_state_data_t *state, tftp_event_t event)
   CURLcode result = CURLE_OK;
   struct SingleRequest *k = &data->req;
   size_t cb; /* Bytes currently read */
+  char buffer[STRERROR_LEN];
 
   switch(event) {
 
@@ -747,7 +762,8 @@ static CURLcode tftp_tx(tftp_state_data_t *state, tftp_event_t event)
                           state->remote_addrlen);
           /* Check all sbytes were sent */
           if(sbytes<0) {
-            failf(data, "%s", Curl_strerror(state->conn, SOCKERRNO));
+            failf(data, "%s", Curl_strerror(SOCKERRNO,
+                                            buffer, sizeof(buffer)));
             result = CURLE_SEND_ERROR;
           }
         }
@@ -791,7 +807,7 @@ static CURLcode tftp_tx(tftp_state_data_t *state, tftp_event_t event)
                     state->remote_addrlen);
     /* Check all sbytes were sent */
     if(sbytes<0) {
-      failf(data, "%s", Curl_strerror(state->conn, SOCKERRNO));
+      failf(data, "%s", Curl_strerror(SOCKERRNO, buffer, sizeof(buffer)));
       return CURLE_SEND_ERROR;
     }
     /* Update the progress meter */
@@ -817,7 +833,7 @@ static CURLcode tftp_tx(tftp_state_data_t *state, tftp_event_t event)
                       state->remote_addrlen);
       /* Check all sbytes were sent */
       if(sbytes<0) {
-        failf(data, "%s", Curl_strerror(state->conn, SOCKERRNO));
+        failf(data, "%s", Curl_strerror(SOCKERRNO, buffer, sizeof(buffer)));
         return CURLE_SEND_ERROR;
       }
       /* since this was a re-send, we remain at the still byte position */
@@ -969,6 +985,7 @@ static CURLcode tftp_connect(struct connectdata *conn, bool *done)
 {
   tftp_state_data_t *state;
   int blksize;
+  int need_blksize;
 
   blksize = TFTP_BLKSIZE_DEFAULT;
 
@@ -983,15 +1000,20 @@ static CURLcode tftp_connect(struct connectdata *conn, bool *done)
       return CURLE_TFTP_ILLEGAL;
   }
 
+  need_blksize = blksize;
+  /* default size is the fallback when no OACK is received */
+  if(need_blksize < TFTP_BLKSIZE_DEFAULT)
+    need_blksize = TFTP_BLKSIZE_DEFAULT;
+
   if(!state->rpacket.data) {
-    state->rpacket.data = calloc(1, blksize + 2 + 2);
+    state->rpacket.data = calloc(1, need_blksize + 2 + 2);
 
     if(!state->rpacket.data)
       return CURLE_OUT_OF_MEMORY;
   }
 
   if(!state->spacket.data) {
-    state->spacket.data = calloc(1, blksize + 2 + 2);
+    state->spacket.data = calloc(1, need_blksize + 2 + 2);
 
     if(!state->spacket.data)
       return CURLE_OUT_OF_MEMORY;
@@ -1005,7 +1027,7 @@ static CURLcode tftp_connect(struct connectdata *conn, bool *done)
   state->sockfd = state->conn->sock[FIRSTSOCKET];
   state->state = TFTP_STATE_START;
   state->error = TFTP_ERR_NONE;
-  state->blksize = TFTP_BLKSIZE_DEFAULT;
+  state->blksize = TFTP_BLKSIZE_DEFAULT; /* Unless updated by OACK response */
   state->requested_blksize = blksize;
 
   ((struct sockaddr *)&state->local_addr)->sa_family =
@@ -1030,8 +1052,9 @@ static CURLcode tftp_connect(struct connectdata *conn, bool *done)
     int rc = bind(state->sockfd, (struct sockaddr *)&state->local_addr,
                   conn->ip_addr->ai_addrlen);
     if(rc) {
+      char buffer[STRERROR_LEN];
       failf(conn->data, "bind() failed; %s",
-            Curl_strerror(conn, SOCKERRNO));
+            Curl_strerror(SOCKERRNO, buffer, sizeof(buffer)));
       return CURLE_COULDNT_CONNECT;
     }
     conn->bits.bound = TRUE;
@@ -1077,14 +1100,9 @@ static CURLcode tftp_done(struct connectdata *conn, CURLcode status,
  * The getsock callback
  *
  **********************************************************/
-static int tftp_getsock(struct connectdata *conn, curl_socket_t *socks,
-                        int numsocks)
+static int tftp_getsock(struct connectdata *conn, curl_socket_t *socks)
 {
-  if(!numsocks)
-    return GETSOCK_BLANK;
-
   socks[0] = conn->sock[FIRSTSOCKET];
-
   return GETSOCK_READSOCK(0);
 }
 
@@ -1242,7 +1260,7 @@ static CURLcode tftp_multi_statemach(struct connectdata *conn, bool *done)
     *done = (state->state == TFTP_STATE_FIN) ? TRUE : FALSE;
     if(*done)
       /* Tell curl we're done */
-      Curl_setup_transfer(conn, -1, -1, FALSE, NULL, -1, NULL);
+      Curl_setup_transfer(data, -1, -1, FALSE, -1);
   }
   else {
     /* no timeouts to handle, check our socket */
@@ -1251,7 +1269,8 @@ static CURLcode tftp_multi_statemach(struct connectdata *conn, bool *done)
     if(rc == -1) {
       /* bail out */
       int error = SOCKERRNO;
-      failf(data, "%s", Curl_strerror(conn, error));
+      char buffer[STRERROR_LEN];
+      failf(data, "%s", Curl_strerror(error, buffer, sizeof(buffer)));
       state->event = TFTP_EVENT_ERROR;
     }
     else if(rc != 0) {
@@ -1264,7 +1283,7 @@ static CURLcode tftp_multi_statemach(struct connectdata *conn, bool *done)
       *done = (state->state == TFTP_STATE_FIN) ? TRUE : FALSE;
       if(*done)
         /* Tell curl we're done */
-        Curl_setup_transfer(conn, -1, -1, FALSE, NULL, -1, NULL);
+        Curl_setup_transfer(data, -1, -1, FALSE, -1);
     }
     /* if rc == 0, then select() timed out */
   }
@@ -1370,7 +1389,7 @@ static CURLcode tftp_setup_connection(struct connectdata * conn)
   struct Curl_easy *data = conn->data;
   char *type;
 
-  conn->socktype = SOCK_DGRAM;   /* UDP datagram based */
+  conn->transport = TRNSPRT_UDP;
 
   /* TFTP URLs support an extension like ";mode=<typecode>" that
    * we'll try to get now! */
index 1335f64..3334830 100644 (file)
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2007, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
index dce1a76..9b05cf0 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
 
 #if defined(WIN32) && !defined(MSDOS)
 
+/* set in win32_init() */
+extern LARGE_INTEGER Curl_freq;
+extern bool Curl_isVistaOrGreater;
+
 struct curltime Curl_now(void)
 {
-  /*
-  ** GetTickCount() is available on _all_ Windows versions from W95 up
-  ** to nowadays. Returns milliseconds elapsed since last system boot,
-  ** increases monotonically and wraps once 49.7 days have elapsed.
-  */
   struct curltime now;
-#if !defined(_WIN32_WINNT) || !defined(_WIN32_WINNT_VISTA) || \
-    (_WIN32_WINNT < _WIN32_WINNT_VISTA) || \
-    (defined(__MINGW32__) && !defined(__MINGW64_VERSION_MAJOR))
-  DWORD milliseconds = GetTickCount();
-  now.tv_sec = milliseconds / 1000;
-  now.tv_usec = (milliseconds % 1000) * 1000;
-#else
-  ULONGLONG milliseconds = GetTickCount64();
-  now.tv_sec = (time_t) (milliseconds / 1000);
-  now.tv_usec = (unsigned int) (milliseconds % 1000) * 1000;
+  if(Curl_isVistaOrGreater) { /* QPC timer might have issues pre-Vista */
+    LARGE_INTEGER count;
+    QueryPerformanceCounter(&count);
+    now.tv_sec = (time_t)(count.QuadPart / Curl_freq.QuadPart);
+    now.tv_usec = (int)((count.QuadPart % Curl_freq.QuadPart) * 1000000 /
+                        Curl_freq.QuadPart);
+  }
+  else {
+    /* Disable /analyze warning that GetTickCount64 is preferred  */
+#if defined(_MSC_VER)
+#pragma warning(push)
+#pragma warning(disable:28159)
+#endif
+    DWORD milliseconds = GetTickCount();
+#if defined(_MSC_VER)
+#pragma warning(pop)
 #endif
 
+    now.tv_sec = milliseconds / 1000;
+    now.tv_usec = (milliseconds % 1000) * 1000;
+  }
   return now;
 }
 
@@ -58,7 +66,9 @@ struct curltime Curl_now(void)
   ** in any case the time starting point does not change once that the
   ** system has started up.
   */
+#ifdef HAVE_GETTIMEOFDAY
   struct timeval now;
+#endif
   struct curltime cnow;
   struct timespec tsnow;
 
@@ -164,14 +174,6 @@ struct curltime Curl_now(void)
 
 #endif
 
-#if SIZEOF_TIME_T < 8
-#define TIME_MAX INT_MAX
-#define TIME_MIN INT_MIN
-#else
-#define TIME_MAX 9223372036854775807LL
-#define TIME_MIN -9223372036854775807LL
-#endif
-
 /*
  * Returns: time difference in number of milliseconds. For too large diffs it
  * returns max value.
@@ -180,11 +182,11 @@ struct curltime Curl_now(void)
  */
 timediff_t Curl_timediff(struct curltime newer, struct curltime older)
 {
-  timediff_t diff = newer.tv_sec-older.tv_sec;
-  if(diff >= (TIME_MAX/1000))
-    return TIME_MAX;
-  else if(diff <= (TIME_MIN/1000))
-    return TIME_MIN;
+  timediff_t diff = (timediff_t)newer.tv_sec-older.tv_sec;
+  if(diff >= (TIMEDIFF_T_MAX/1000))
+    return TIMEDIFF_T_MAX;
+  else if(diff <= (TIMEDIFF_T_MIN/1000))
+    return TIMEDIFF_T_MIN;
   return diff * 1000 + (newer.tv_usec-older.tv_usec)/1000;
 }
 
@@ -194,10 +196,10 @@ timediff_t Curl_timediff(struct curltime newer, struct curltime older)
  */
 timediff_t Curl_timediff_us(struct curltime newer, struct curltime older)
 {
-  timediff_t diff = newer.tv_sec-older.tv_sec;
-  if(diff >= (TIME_MAX/1000000))
-    return TIME_MAX;
-  else if(diff <= (TIME_MIN/1000000))
-    return TIME_MIN;
+  timediff_t diff = (timediff_t)newer.tv_sec-older.tv_sec;
+  if(diff >= (TIMEDIFF_T_MAX/1000000))
+    return TIMEDIFF_T_MAX;
+  else if(diff <= (TIMEDIFF_T_MIN/1000000))
+    return TIMEDIFF_T_MIN;
   return diff * 1000000 + newer.tv_usec-older.tv_usec;
 }
index fb3f680..53e0636 100644 (file)
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
 
 #include "curl_setup.h"
 
-#if SIZEOF_TIME_T < 8
-typedef int timediff_t;
-#else
+/* Use a larger type even for 32 bit time_t systems so that we can keep
+   microsecond accuracy in it */
 typedef curl_off_t timediff_t;
-#endif
+#define CURL_FORMAT_TIMEDIFF_T CURL_FORMAT_CURL_OFF_T
+
+#define TIMEDIFF_T_MAX CURL_OFF_T_MAX
+#define TIMEDIFF_T_MIN CURL_OFF_T_MIN
 
 struct curltime {
   time_t tv_sec; /* seconds */
index b73f94d..ead8b36 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -117,6 +117,35 @@ CURLcode Curl_get_upload_buffer(struct Curl_easy *data)
   return CURLE_OK;
 }
 
+#ifndef CURL_DISABLE_HTTP
+/*
+ * This function will be called to loop through the trailers buffer
+ * until no more data is available for sending.
+ */
+static size_t Curl_trailers_read(char *buffer, size_t size, size_t nitems,
+                                 void *raw)
+{
+  struct Curl_easy *data = (struct Curl_easy *)raw;
+  Curl_send_buffer *trailers_buf = data->state.trailers_buf;
+  size_t bytes_left = trailers_buf->size_used-data->state.trailers_bytes_sent;
+  size_t to_copy = (size*nitems < bytes_left) ? size*nitems : bytes_left;
+  if(to_copy) {
+    memcpy(buffer,
+           &trailers_buf->buffer[data->state.trailers_bytes_sent],
+           to_copy);
+    data->state.trailers_bytes_sent += to_copy;
+  }
+  return to_copy;
+}
+
+static size_t Curl_trailers_left(void *raw)
+{
+  struct Curl_easy *data = (struct Curl_easy *)raw;
+  Curl_send_buffer *trailers_buf = data->state.trailers_buf;
+  return trailers_buf->size_used - data->state.trailers_bytes_sent;
+}
+#endif
+
 /*
  * This function will call the read callback to fill our buffer with data
  * to upload.
@@ -127,6 +156,10 @@ CURLcode Curl_fillreadbuffer(struct connectdata *conn, size_t bytes,
   struct Curl_easy *data = conn->data;
   size_t buffersize = bytes;
   size_t nread;
+
+  curl_read_callback readfunc = NULL;
+  void *extra_data = NULL;
+
 #ifdef CURL_DOES_CONVERSIONS
   bool sending_http_headers = FALSE;
 
@@ -140,15 +173,76 @@ CURLcode Curl_fillreadbuffer(struct connectdata *conn, size_t bytes,
   }
 #endif
 
-  if(data->req.upload_chunky) {
+#ifndef CURL_DISABLE_HTTP
+  if(data->state.trailers_state == TRAILERS_INITIALIZED) {
+    struct curl_slist *trailers = NULL;
+    CURLcode result;
+    int trailers_ret_code;
+
+    /* at this point we already verified that the callback exists
+       so we compile and store the trailers buffer, then proceed */
+    infof(data,
+          "Moving trailers state machine from initialized to sending.\n");
+    data->state.trailers_state = TRAILERS_SENDING;
+    data->state.trailers_buf = Curl_add_buffer_init();
+    if(!data->state.trailers_buf) {
+      failf(data, "Unable to allocate trailing headers buffer !");
+      return CURLE_OUT_OF_MEMORY;
+    }
+    data->state.trailers_bytes_sent = 0;
+    Curl_set_in_callback(data, true);
+    trailers_ret_code = data->set.trailer_callback(&trailers,
+                                                   data->set.trailer_data);
+    Curl_set_in_callback(data, false);
+    if(trailers_ret_code == CURL_TRAILERFUNC_OK) {
+      result = Curl_http_compile_trailers(trailers, &data->state.trailers_buf,
+                                          data);
+    }
+    else {
+      failf(data, "operation aborted by trailing headers callback");
+      *nreadp = 0;
+      result = CURLE_ABORTED_BY_CALLBACK;
+    }
+    if(result) {
+      Curl_add_buffer_free(&data->state.trailers_buf);
+      curl_slist_free_all(trailers);
+      return result;
+    }
+    infof(data, "Successfully compiled trailers.\r\n");
+    curl_slist_free_all(trailers);
+  }
+#endif
+
+  /* if we are transmitting trailing data, we don't need to write
+     a chunk size so we skip this */
+  if(data->req.upload_chunky &&
+     data->state.trailers_state == TRAILERS_NONE) {
     /* if chunked Transfer-Encoding */
     buffersize -= (8 + 2 + 2);   /* 32bit hex + CRLF + CRLF */
     data->req.upload_fromhere += (8 + 2); /* 32bit hex + CRLF */
   }
 
+#ifndef CURL_DISABLE_HTTP
+  if(data->state.trailers_state == TRAILERS_SENDING) {
+    /* if we're here then that means that we already sent the last empty chunk
+       but we didn't send a final CR LF, so we sent 0 CR LF. We then start
+       pulling trailing data until we have no more at which point we
+       simply return to the previous point in the state machine as if
+       nothing happened.
+       */
+    readfunc = Curl_trailers_read;
+    extra_data = (void *)data;
+  }
+  else
+#endif
+  {
+    readfunc = data->state.fread_func;
+    extra_data = data->state.in;
+  }
+
   Curl_set_in_callback(data, true);
-  nread = data->state.fread_func(data->req.upload_fromhere, 1,
-                                 buffersize, data->state.in);
+  nread = readfunc(data->req.upload_fromhere, 1,
+                   buffersize, extra_data);
   Curl_set_in_callback(data, false);
 
   if(nread == CURL_READFUNC_ABORT) {
@@ -200,10 +294,10 @@ CURLcode Curl_fillreadbuffer(struct connectdata *conn, size_t bytes,
        here, knowing they'll become CRLFs later on.
      */
 
-    char hexbuffer[11];
+    bool added_crlf = FALSE;
+    int hexlen = 0;
     const char *endofline_native;
     const char *endofline_network;
-    int hexlen;
 
     if(
 #ifdef CURL_DO_LINEEND_CONV
@@ -218,20 +312,37 @@ CURLcode Curl_fillreadbuffer(struct connectdata *conn, size_t bytes,
       endofline_native  = "\r\n";
       endofline_network = "\x0d\x0a";
     }
-    hexlen = snprintf(hexbuffer, sizeof(hexbuffer),
-                      "%x%s", nread, endofline_native);
 
-    /* move buffer pointer */
-    data->req.upload_fromhere -= hexlen;
-    nread += hexlen;
+    /* if we're not handling trailing data, proceed as usual */
+    if(data->state.trailers_state != TRAILERS_SENDING) {
+      char hexbuffer[11] = "";
+      hexlen = msnprintf(hexbuffer, sizeof(hexbuffer),
+                         "%zx%s", nread, endofline_native);
+
+      /* move buffer pointer */
+      data->req.upload_fromhere -= hexlen;
+      nread += hexlen;
 
-    /* copy the prefix to the buffer, leaving out the NUL */
-    memcpy(data->req.upload_fromhere, hexbuffer, hexlen);
+      /* copy the prefix to the buffer, leaving out the NUL */
+      memcpy(data->req.upload_fromhere, hexbuffer, hexlen);
 
-    /* always append ASCII CRLF to the data */
-    memcpy(data->req.upload_fromhere + nread,
-           endofline_network,
-           strlen(endofline_network));
+      /* always append ASCII CRLF to the data unless
+         we have a valid trailer callback */
+#ifndef CURL_DISABLE_HTTP
+      if((nread-hexlen) == 0 &&
+          data->set.trailer_callback != NULL &&
+          data->state.trailers_state == TRAILERS_NONE) {
+        data->state.trailers_state = TRAILERS_INITIALIZED;
+      }
+      else
+#endif
+      {
+        memcpy(data->req.upload_fromhere + nread,
+               endofline_network,
+               strlen(endofline_network));
+        added_crlf = TRUE;
+      }
+    }
 
 #ifdef CURL_DOES_CONVERSIONS
     {
@@ -242,22 +353,40 @@ CURLcode Curl_fillreadbuffer(struct connectdata *conn, size_t bytes,
         length = nread;
       else
         /* just translate the protocol portion */
-        length = strlen(hexbuffer);
-      result = Curl_convert_to_network(data, data->req.upload_fromhere,
-                                       length);
-      /* Curl_convert_to_network calls failf if unsuccessful */
-      if(result)
-        return result;
+        length = hexlen;
+      if(length) {
+        result = Curl_convert_to_network(data, data->req.upload_fromhere,
+                                         length);
+        /* Curl_convert_to_network calls failf if unsuccessful */
+        if(result)
+          return result;
+      }
     }
 #endif /* CURL_DOES_CONVERSIONS */
 
-    if((nread - hexlen) == 0) {
-      /* mark this as done once this chunk is transferred */
+#ifndef CURL_DISABLE_HTTP
+    if(data->state.trailers_state == TRAILERS_SENDING &&
+       !Curl_trailers_left(data)) {
+      Curl_add_buffer_free(&data->state.trailers_buf);
+      data->state.trailers_state = TRAILERS_DONE;
+      data->set.trailer_data = NULL;
+      data->set.trailer_callback = NULL;
+      /* mark the transfer as done */
       data->req.upload_done = TRUE;
-      infof(data, "Signaling end of chunked upload via terminating chunk.\n");
+      infof(data, "Signaling end of chunked upload after trailers.\n");
     }
+    else
+#endif
+      if((nread - hexlen) == 0 &&
+         data->state.trailers_state != TRAILERS_INITIALIZED) {
+        /* mark this as done once this chunk is transferred */
+        data->req.upload_done = TRUE;
+        infof(data,
+              "Signaling end of chunked upload via terminating chunk.\n");
+      }
 
-    nread += strlen(endofline_native); /* for the added end of line */
+    if(added_crlf)
+      nread += strlen(endofline_network); /* for the added end of line */
   }
 #ifdef CURL_DOES_CONVERSIONS
   else if((data->set.prefer_ascii) && (!sending_http_headers)) {
@@ -333,7 +462,6 @@ CURLcode Curl_readrewind(struct connectdata *conn)
       infof(data, "the ioctl callback returned %d\n", (int)err);
 
       if(err) {
-        /* FIXME: convert to a human readable error message */
         failf(data, "ioctl callback returned error %d", (int)err);
         return CURLE_SEND_FAIL_REWIND;
       }
@@ -356,8 +484,9 @@ CURLcode Curl_readrewind(struct connectdata *conn)
   return CURLE_OK;
 }
 
-static int data_pending(const struct connectdata *conn)
+static int data_pending(const struct Curl_easy *data)
 {
+  struct connectdata *conn = data->conn;
   /* in the case of libssh2, we can never be really sure that we have emptied
      its internal buffers so we MUST always try until we get EAGAIN back */
   return conn->handler->protocol&(CURLPROTO_SCP|CURLPROTO_SFTP) ||
@@ -370,41 +499,14 @@ static int data_pending(const struct connectdata *conn)
        TRUE. The thing is if we read everything, then http2_recv won't
        be called and we cannot signal the HTTP/2 stream has closed. As
        a workaround, we return nonzero here to call http2_recv. */
-    ((conn->handler->protocol&PROTO_FAMILY_HTTP) && conn->httpversion == 20);
+    ((conn->handler->protocol&PROTO_FAMILY_HTTP) && conn->httpversion >= 20);
+#elif defined(ENABLE_QUIC)
+    Curl_ssl_data_pending(conn, FIRSTSOCKET) || Curl_quic_data_pending(data);
 #else
     Curl_ssl_data_pending(conn, FIRSTSOCKET);
 #endif
 }
 
-static void read_rewind(struct connectdata *conn,
-                        size_t thismuch)
-{
-  DEBUGASSERT(conn->read_pos >= thismuch);
-
-  conn->read_pos -= thismuch;
-  conn->bits.stream_was_rewound = TRUE;
-
-#ifdef DEBUGBUILD
-  {
-    char buf[512 + 1];
-    size_t show;
-
-    show = CURLMIN(conn->buf_len - conn->read_pos, sizeof(buf)-1);
-    if(conn->master_buffer) {
-      memcpy(buf, conn->master_buffer + conn->read_pos, show);
-      buf[show] = '\0';
-    }
-    else {
-      buf[0] = '\0';
-    }
-
-    DEBUGF(infof(conn->data,
-                 "Buffer after stream rewind (read_pos = %zu): [%s]\n",
-                 conn->read_pos, buf));
-  }
-#endif
-}
-
 /*
  * Check to see if CURLOPT_TIMECONDITION was met by comparing the time of the
  * remote document with the time provided by CURLOPT_TIMEVAL
@@ -479,9 +581,7 @@ static CURLcode readwrite_data(struct Curl_easy *data,
          conn->httpversion == 20) &&
 #endif
        k->size != -1 && !k->header) {
-      /* make sure we don't read "too much" if we can help it since we
-         might be pipelining and then someone else might want to read what
-         follows! */
+      /* make sure we don't read too much */
       curl_off_t totalleft = k->size - k->bytecount;
       if(totalleft < (curl_off_t)bytestoread)
         bytestoread = (size_t)totalleft;
@@ -505,7 +605,7 @@ static CURLcode readwrite_data(struct Curl_easy *data,
       nread = 0;
     }
 
-    if((k->bytecount == 0) && (k->writebytecount == 0)) {
+    if(!k->bytecount) {
       Curl_pgrsTime(data, TIMER_STARTTRANSFER);
       if(k->exp100 > EXP100_SEND_DATA)
         /* set time stamp to compare with when waiting for the 100 */
@@ -520,7 +620,7 @@ static CURLcode readwrite_data(struct Curl_easy *data,
     if(0 < nread || is_empty_data) {
       k->buf[nread] = 0;
     }
-    else if(0 >= nread) {
+    else {
       /* if we receive 0 or less here, the server closed the connection
          and we bail out from this! */
       DEBUGF(infof(data, "nread <= 0, server closed connection, bailing\n"));
@@ -563,20 +663,11 @@ static CURLcode readwrite_data(struct Curl_easy *data,
         /* We've stopped dealing with input, get out of the do-while loop */
 
         if(nread > 0) {
-          if(Curl_pipeline_wanted(conn->data->multi, CURLPIPE_HTTP1)) {
-            infof(data,
-                  "Rewinding stream by : %zd"
-                  " bytes on url %s (zero-length body)\n",
-                  nread, data->state.up.path);
-            read_rewind(conn, (size_t)nread);
-          }
-          else {
-            infof(data,
-                  "Excess found in a non pipelined read:"
-                  " excess = %zd"
-                  " url = %s (zero-length body)\n",
-                  nread, data->state.up.path);
-          }
+          infof(data,
+                "Excess found:"
+                " excess = %zd"
+                " url = %s (zero-length body)\n",
+                nread, data->state.up.path);
         }
 
         break;
@@ -688,14 +779,14 @@ static CURLcode readwrite_data(struct Curl_easy *data,
          * and writes away the data. The returned 'nread' holds the number
          * of actual data it wrote to the client.
          */
-
+        CURLcode extra;
         CHUNKcode res =
-          Curl_httpchunk_read(conn, k->str, nread, &nread);
+          Curl_httpchunk_read(conn, k->str, nread, &nread, &extra);
 
         if(CHUNKE_OK < res) {
-          if(CHUNKE_WRITE_ERROR == res) {
-            failf(data, "Failed writing data");
-            return CURLE_WRITE_ERROR;
+          if(CHUNKE_PASSTHRU_ERROR == res) {
+            failf(data, "Failed reading the chunked-encoded stream");
+            return extra;
           }
           failf(data, "%s in chunked-encoding", Curl_chunked_strerror(res));
           return CURLE_RECV_ERROR;
@@ -707,19 +798,12 @@ static CURLcode readwrite_data(struct Curl_easy *data,
 
           /* There are now possibly N number of bytes at the end of the
              str buffer that weren't written to the client.
-
-             We DO care about this data if we are pipelining.
              Push it back to be read on the next pass. */
 
           dataleft = conn->chunk.dataleft;
           if(dataleft != 0) {
             infof(conn->data, "Leftovers after chunking: %zu bytes\n",
                   dataleft);
-            if(Curl_pipeline_wanted(conn->data->multi, CURLPIPE_HTTP1)) {
-              /* only attempt the rewind if we truly are pipelining */
-              infof(conn->data, "Rewinding %zu bytes\n",dataleft);
-              read_rewind(conn, dataleft);
-            }
           }
         }
         /* If it returned OK, we just keep going */
@@ -738,25 +822,13 @@ static CURLcode readwrite_data(struct Curl_easy *data,
 
         excess = (size_t)(k->bytecount + nread - k->maxdownload);
         if(excess > 0 && !k->ignorebody) {
-          if(Curl_pipeline_wanted(conn->data->multi, CURLPIPE_HTTP1)) {
-            infof(data,
-                  "Rewinding stream by : %zu"
-                  " bytes on url %s (size = %" CURL_FORMAT_CURL_OFF_T
-                  ", maxdownload = %" CURL_FORMAT_CURL_OFF_T
-                  ", bytecount = %" CURL_FORMAT_CURL_OFF_T ", nread = %zd)\n",
-                  excess, data->state.up.path,
-                  k->size, k->maxdownload, k->bytecount, nread);
-            read_rewind(conn, excess);
-          }
-          else {
-            infof(data,
-                  "Excess found in a non pipelined read:"
-                  " excess = %zu"
-                  ", size = %" CURL_FORMAT_CURL_OFF_T
-                  ", maxdownload = %" CURL_FORMAT_CURL_OFF_T
-                  ", bytecount = %" CURL_FORMAT_CURL_OFF_T "\n",
-                  excess, k->size, k->maxdownload, k->bytecount);
-          }
+          infof(data,
+                "Excess found in a read:"
+                " excess = %zu"
+                ", size = %" CURL_FORMAT_CURL_OFF_T
+                ", maxdownload = %" CURL_FORMAT_CURL_OFF_T
+                ", bytecount = %" CURL_FORMAT_CURL_OFF_T "\n",
+                excess, k->size, k->maxdownload, k->bytecount);
         }
 
         nread = (ssize_t) (k->maxdownload - k->bytecount);
@@ -844,7 +916,12 @@ static CURLcode readwrite_data(struct Curl_easy *data,
       k->keepon &= ~KEEP_RECV;
     }
 
-  } while(data_pending(conn) && maxloops--);
+    if(k->keepon & KEEP_RECV_PAUSE) {
+      /* this is a paused transfer */
+      break;
+    }
+
+  } while(data_pending(data) && maxloops--);
 
   if(maxloops <= 0) {
     /* we mark it as read-again-please */
@@ -864,12 +941,14 @@ static CURLcode readwrite_data(struct Curl_easy *data,
   return CURLE_OK;
 }
 
-static CURLcode done_sending(struct connectdata *conn,
-                             struct SingleRequest *k)
+CURLcode Curl_done_sending(struct connectdata *conn,
+                           struct SingleRequest *k)
 {
   k->keepon &= ~KEEP_SEND; /* we're done writing */
 
+  /* These functions should be moved into the handler struct! */
   Curl_http2_done_sending(conn);
+  Curl_quic_done_sending(conn);
 
   if(conn->bits.rewindaftersend) {
     CURLcode result = Curl_readrewind(conn);
@@ -920,7 +999,6 @@ static CURLcode readwrite_upload(struct Curl_easy *data,
   *didwhat |= KEEP_SEND;
 
   do {
-
     /* only read more data if there's no upload data already
        present in the upload buffer */
     if(0 == k->upload_present) {
@@ -945,7 +1023,6 @@ static CURLcode readwrite_upload(struct Curl_easy *data,
           k->keepon &= ~KEEP_SEND;         /* disable writing */
           k->start100 = Curl_now();       /* timeout count starts now */
           *didwhat &= ~KEEP_SEND;  /* we didn't write anything actually */
-
           /* set a timeout for the multi interface */
           Curl_expire(data, data->set.expect_100_timeout, EXPIRE_100_TIMEOUT);
           break;
@@ -975,7 +1052,7 @@ static CURLcode readwrite_upload(struct Curl_easy *data,
         break;
       }
       if(nread <= 0) {
-        result = done_sending(conn, k);
+        result = Curl_done_sending(conn, k);
         if(result)
           return result;
         break;
@@ -1065,6 +1142,7 @@ static CURLcode readwrite_upload(struct Curl_easy *data,
                  (size_t)bytes_written);
 
     k->writebytecount += bytes_written;
+    Curl_pgrsSetUploadCounter(data, k->writebytecount);
 
     if((!k->upload_chunky || k->forbidchunk) &&
        (k->writebytecount == data->state.infilesize)) {
@@ -1092,15 +1170,14 @@ static CURLcode readwrite_upload(struct Curl_easy *data,
       k->upload_present = 0; /* no more bytes left */
 
       if(k->upload_done) {
-        result = done_sending(conn, k);
+        result = Curl_done_sending(conn, k);
         if(result)
           return result;
       }
     }
 
-    Curl_pgrsSetUploadCounter(data, k->writebytecount);
 
-  } WHILE_FALSE; /* just to break out from! */
+  } while(0); /* just to break out from! */
 
   return CURLE_OK;
 }
@@ -1176,11 +1253,7 @@ CURLcode Curl_readwrite(struct connectdata *conn,
 
   k->now = Curl_now();
   if(didwhat) {
-    /* Update read/write counters */
-    if(k->bytecountp)
-      *k->bytecountp = k->bytecount; /* read count */
-    if(k->writebytecountp)
-      *k->writebytecountp = k->writebytecount; /* write count */
+    ;
   }
   else {
     /* no read no write, this is a timeout? */
@@ -1219,15 +1292,15 @@ CURLcode Curl_readwrite(struct connectdata *conn,
   if(k->keepon) {
     if(0 > Curl_timeleft(data, &k->now, FALSE)) {
       if(k->size != -1) {
-        failf(data, "Operation timed out after %ld milliseconds with %"
-              CURL_FORMAT_CURL_OFF_T " out of %"
+        failf(data, "Operation timed out after %" CURL_FORMAT_TIMEDIFF_T
+              " milliseconds with %" CURL_FORMAT_CURL_OFF_T " out of %"
               CURL_FORMAT_CURL_OFF_T " bytes received",
               Curl_timediff(k->now, data->progress.t_startsingle),
               k->bytecount, k->size);
       }
       else {
-        failf(data, "Operation timed out after %ld milliseconds with %"
-              CURL_FORMAT_CURL_OFF_T " bytes received",
+        failf(data, "Operation timed out after %" CURL_FORMAT_TIMEDIFF_T
+              " milliseconds with %" CURL_FORMAT_CURL_OFF_T " bytes received",
               Curl_timediff(k->now, data->progress.t_startsingle),
               k->bytecount);
       }
@@ -1287,20 +1360,14 @@ CURLcode Curl_readwrite(struct connectdata *conn,
  * in the proper state to have this information available.
  */
 int Curl_single_getsock(const struct connectdata *conn,
-                        curl_socket_t *sock, /* points to numsocks number
-                                                of sockets */
-                        int numsocks)
+                        curl_socket_t *sock)
 {
   const struct Curl_easy *data = conn->data;
   int bitmap = GETSOCK_BLANK;
   unsigned sockindex = 0;
 
   if(conn->handler->perform_getsock)
-    return conn->handler->perform_getsock(conn, sock, numsocks);
-
-  if(numsocks < 2)
-    /* simple check but we might need two slots */
-    return GETSOCK_BLANK;
+    return conn->handler->perform_getsock(conn, sock);
 
   /* don't include HOLD and PAUSE connections */
   if((data->req.keepon & KEEP_RECVBITS) == KEEP_RECV) {
@@ -1348,17 +1415,30 @@ void Curl_init_CONNECT(struct Curl_easy *data)
 CURLcode Curl_pretransfer(struct Curl_easy *data)
 {
   CURLcode result;
-  if(!data->change.url) {
+
+  if(!data->change.url && !data->set.uh) {
     /* we can't do anything without URL */
     failf(data, "No URL set!");
     return CURLE_URL_MALFORMAT;
   }
+
   /* since the URL may have been redirected in a previous use of this handle */
   if(data->change.url_alloc) {
     /* the already set URL is allocated, free it first! */
     Curl_safefree(data->change.url);
     data->change.url_alloc = FALSE;
   }
+
+  if(!data->change.url && data->set.uh) {
+    CURLUcode uc;
+    uc = curl_url_get(data->set.uh,
+                        CURLUPART_URL, &data->set.str[STRING_SET_URL], 0);
+    if(uc) {
+      failf(data, "No URL set!");
+      return CURLE_URL_MALFORMAT;
+    }
+  }
+
   data->change.url = data->set.str[STRING_SET_URL];
 
   /* Init the SSL session ID cache here. We do it here since we want to do it
@@ -1382,11 +1462,14 @@ CURLcode Curl_pretransfer(struct Curl_easy *data)
 
   if(data->set.httpreq == HTTPREQ_PUT)
     data->state.infilesize = data->set.filesize;
-  else {
+  else if((data->set.httpreq != HTTPREQ_GET) &&
+          (data->set.httpreq != HTTPREQ_HEAD)) {
     data->state.infilesize = data->set.postfieldsize;
     if(data->set.postfields && (data->state.infilesize == -1))
       data->state.infilesize = (curl_off_t)strlen(data->set.postfields);
   }
+  else
+    data->state.infilesize = 0;
 
   /* If there is a list of cookie files to read, do it now! */
   if(data->change.cookielist)
@@ -1414,18 +1497,13 @@ CURLcode Curl_pretransfer(struct Curl_easy *data)
     Curl_pgrsResetTransferSizes(data);
     Curl_pgrsStartNow(data);
 
-    if(data->set.timeout)
-      Curl_expire(data, data->set.timeout, EXPIRE_TIMEOUT);
-
-    if(data->set.connecttimeout)
-      Curl_expire(data, data->set.connecttimeout, EXPIRE_CONNECTTIMEOUT);
-
     /* In case the handle is re-used and an authentication method was picked
        in the session we need to make sure we only use the one(s) we now
        consider to be fine */
     data->state.authhost.picked &= data->state.authhost.want;
     data->state.authproxy.picked &= data->state.authproxy.want;
 
+#ifndef CURL_DISABLE_FTP
     if(data->state.wildcardmatch) {
       struct WildcardData *wc = &data->wildcard;
       if(wc->state < CURLWC_INIT) {
@@ -1434,6 +1512,8 @@ CURLcode Curl_pretransfer(struct Curl_easy *data)
           return CURLE_OUT_OF_MEMORY;
       }
     }
+#endif
+    Curl_http2_init_state(&data->state);
   }
 
   return result;
@@ -1514,13 +1594,25 @@ CURLcode Curl_follow(struct Curl_easy *data,
     disallowport = TRUE;
 
   DEBUGASSERT(data->state.uh);
-  uc = curl_url_set(data->state.uh, CURLUPART_URL, newurl, 0);
-  if(uc)
-    return Curl_uc_to_curlcode(uc);
+  uc = curl_url_set(data->state.uh, CURLUPART_URL, newurl,
+                    (type == FOLLOW_FAKE) ? CURLU_NON_SUPPORT_SCHEME :
+                    ((type == FOLLOW_REDIR) ? CURLU_URLENCODE : 0) );
+  if(uc) {
+    if(type != FOLLOW_FAKE)
+      return Curl_uc_to_curlcode(uc);
+
+    /* the URL could not be parsed for some reason, but since this is FAKE
+       mode, just duplicate the field as-is */
+    newurl = strdup(newurl);
+    if(!newurl)
+      return CURLE_OUT_OF_MEMORY;
+  }
+  else {
 
-  uc = curl_url_get(data->state.uh, CURLUPART_URL, &newurl, 0);
-  if(uc)
-    return Curl_uc_to_curlcode(uc);
+    uc = curl_url_get(data->state.uh, CURLUPART_URL, &newurl, 0);
+    if(uc)
+      return Curl_uc_to_curlcode(uc);
+  }
 
   if(type == FOLLOW_FAKE) {
     /* we're only figuring out the new url if we would've followed locations
@@ -1703,8 +1795,7 @@ CURLcode Curl_retry_request(struct connectdata *conn,
 
 
     if(conn->handler->protocol&PROTO_FAMILY_HTTP) {
-      struct HTTP *http = data->req.protop;
-      if(http->writebytecount) {
+      if(data->req.writebytecount) {
         CURLcode result = Curl_readrewind(conn);
         if(result) {
           Curl_safefree(*url);
@@ -1722,24 +1813,17 @@ CURLcode Curl_retry_request(struct connectdata *conn,
  */
 void
 Curl_setup_transfer(
-  struct connectdata *conn, /* connection data */
+  struct Curl_easy *data,   /* transfer */
   int sockindex,            /* socket index to read from or -1 */
   curl_off_t size,          /* -1 if unknown at this point */
   bool getheader,           /* TRUE if header parsing is wanted */
-  curl_off_t *bytecountp,   /* return number of bytes read or NULL */
-  int writesockindex,       /* socket index to write to, it may very well be
+  int writesockindex        /* socket index to write to, it may very well be
                                the same we read from. -1 disables */
-  curl_off_t *writecountp   /* return number of bytes written or NULL */
   )
 {
-  struct Curl_easy *data;
-  struct SingleRequest *k;
-
+  struct SingleRequest *k = &data->req;
+  struct connectdata *conn = data->conn;
   DEBUGASSERT(conn != NULL);
-
-  data = conn->data;
-  k = &data->req;
-
   DEBUGASSERT((sockindex <= 1) && (sockindex >= -1));
 
   if(conn->bits.multiplex || conn->httpversion == 20) {
@@ -1758,8 +1842,6 @@ Curl_setup_transfer(
   k->getheader = getheader;
 
   k->size = size;
-  k->bytecountp = bytecountp;
-  k->writebytecountp = writecountp;
 
   /* The code sequence below is placed in this function just because all
      necessary input is not always known in do_complete() as this function may
index 9742455..67fd91f 100644 (file)
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -29,7 +29,6 @@ char *Curl_checkheaders(const struct connectdata *conn,
 void Curl_init_CONNECT(struct Curl_easy *data);
 
 CURLcode Curl_pretransfer(struct Curl_easy *data);
-CURLcode Curl_second_connect(struct connectdata *conn);
 CURLcode Curl_posttransfer(struct Curl_easy *data);
 
 typedef enum {
@@ -48,8 +47,7 @@ CURLcode Curl_readwrite(struct connectdata *conn,
                         struct Curl_easy *data, bool *done,
                         bool *comeback);
 int Curl_single_getsock(const struct connectdata *conn,
-                        curl_socket_t *socks,
-                        int numsocks);
+                        curl_socket_t *socks);
 CURLcode Curl_readrewind(struct connectdata *conn);
 CURLcode Curl_fillreadbuffer(struct connectdata *conn, size_t bytes,
                              size_t *nreadp);
@@ -57,17 +55,18 @@ CURLcode Curl_retry_request(struct connectdata *conn, char **url);
 bool Curl_meets_timecondition(struct Curl_easy *data, time_t timeofdoc);
 CURLcode Curl_get_upload_buffer(struct Curl_easy *data);
 
+CURLcode Curl_done_sending(struct connectdata *conn,
+                           struct SingleRequest *k);
+
 /* This sets up a forthcoming transfer */
 void
-Curl_setup_transfer (struct connectdata *data,
-               int sockindex,           /* socket index to read from or -1 */
-               curl_off_t size,         /* -1 if unknown at this point */
-               bool getheader,          /* TRUE if header parsing is wanted */
-               curl_off_t *bytecountp,  /* return number of bytes read */
-               int writesockindex,      /* socket index to write to, it may
-                                           very well be the same we read from.
-                                           -1 disables */
-               curl_off_t *writecountp /* return number of bytes written */
-);
+Curl_setup_transfer (struct Curl_easy *data,
+                     int sockindex,     /* socket index to read from or -1 */
+                     curl_off_t size,   /* -1 if unknown at this point */
+                     bool getheader,    /* TRUE if header parsing is wanted */
+                     int writesockindex /* socket index to write to. May be
+                                           the same we read from. -1
+                                           disables */
+  );
 
 #endif /* HEADER_CURL_TRANSFER_H */
index 0d5a13f..56fb736 100644 (file)
--- a/lib/url.c
+++ b/lib/url.c
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
 #ifdef HAVE_NET_IF_H
 #include <net/if.h>
 #endif
+#ifdef HAVE_IPHLPAPI_H
+#include <Iphlpapi.h>
+#endif
 #ifdef HAVE_SYS_IOCTL_H
 #include <sys/ioctl.h>
 #endif
-
 #ifdef HAVE_SYS_PARAM_H
 #include <sys/param.h>
 #endif
@@ -93,6 +95,7 @@ bool curl_win32_idn_to_ascii(const char *in, char **out);
 #include "inet_pton.h"
 #include "getinfo.h"
 #include "urlapi-int.h"
+#include "system_win32.h"
 
 /* And now for the protocols */
 #include "ftp.h"
@@ -103,23 +106,21 @@ bool curl_win32_idn_to_ascii(const char *in, char **out);
 #include "http2.h"
 #include "file.h"
 #include "curl_ldap.h"
-#include "ssh.h"
+#include "vssh/ssh.h"
 #include "imap.h"
 #include "url.h"
 #include "connect.h"
 #include "inet_ntop.h"
 #include "http_ntlm.h"
-#include "curl_ntlm_wb.h"
-#include "socks.h"
 #include "curl_rtmp.h"
 #include "gopher.h"
 #include "http_proxy.h"
 #include "conncache.h"
 #include "multihandle.h"
-#include "pipeline.h"
 #include "dotdot.h"
 #include "strdup.h"
 #include "setopt.h"
+#include "altsvc.h"
 
 /* The last 3 #include files should be in this order */
 #include "curl_printf.h"
@@ -127,7 +128,7 @@ bool curl_win32_idn_to_ascii(const char *in, char **out);
 #include "memdebug.h"
 
 static void conn_free(struct connectdata *conn);
-static void free_fixed_hostname(struct hostname *host);
+static void free_idnconverted_hostname(struct hostname *host);
 static unsigned int get_protocol_family(unsigned int protocol);
 
 /* Some parts of the code (e.g. chunked encoding) assume this buffer has at
@@ -186,11 +187,11 @@ static const struct Curl_handler * const protocols[] = {
   &Curl_handler_tftp,
 #endif
 
-#if defined(USE_LIBSSH2) || defined(USE_LIBSSH)
+#if defined(USE_SSH)
   &Curl_handler_scp,
 #endif
 
-#if defined(USE_LIBSSH2) || defined(USE_LIBSSH)
+#if defined(USE_SSH)
   &Curl_handler_sftp,
 #endif
 
@@ -292,7 +293,7 @@ void Curl_freeset(struct Curl_easy *data)
 }
 
 /* free the URL pieces */
-void Curl_up_free(struct Curl_easy *data)
+static void up_free(struct Curl_easy *data)
 {
   struct urlpieces *up = &data->state.up;
   Curl_safefree(up->scheme);
@@ -316,13 +317,17 @@ void Curl_up_free(struct Curl_easy *data)
  * when curl_easy_perform() is invoked.
  */
 
-CURLcode Curl_close(struct Curl_easy *data)
+CURLcode Curl_close(struct Curl_easy **datap)
 {
   struct Curl_multi *m;
+  struct Curl_easy *data;
 
-  if(!data)
+  if(!datap || !*datap)
     return CURLE_OK;
 
+  data = *datap;
+  *datap = NULL;
+
   Curl_expire_clear(data); /* shut off timers */
 
   m = data->multi;
@@ -369,12 +374,19 @@ CURLcode Curl_close(struct Curl_easy *data)
   }
   data->change.referer = NULL;
 
-  Curl_up_free(data);
+  up_free(data);
   Curl_safefree(data->state.buffer);
   Curl_safefree(data->state.headerbuff);
   Curl_safefree(data->state.ulbuf);
-  Curl_flush_cookies(data, 1);
-  Curl_digest_cleanup(data);
+  Curl_flush_cookies(data, TRUE);
+#ifdef USE_ALTSVC
+  Curl_altsvc_save(data->asi, data->set.str[STRING_ALTSVC]);
+  Curl_altsvc_cleanup(data->asi);
+  data->asi = NULL;
+#endif
+#if !defined(CURL_DISABLE_HTTP) && !defined(CURL_DISABLE_CRYPTO_AUTH)
+  Curl_http_auth_cleanup_digest(data);
+#endif
   Curl_safefree(data->info.contenttype);
   Curl_safefree(data->info.wouldredirect);
 
@@ -391,6 +403,12 @@ CURLcode Curl_close(struct Curl_easy *data)
     Curl_share_unlock(data, CURL_LOCK_DATA_SHARE);
   }
 
+#ifndef CURL_DISABLE_DOH
+  free(data->req.doh.probe[0].serverdoh.memory);
+  free(data->req.doh.probe[1].serverdoh.memory);
+  curl_slist_free_all(data->req.doh.headers);
+#endif
+
   /* destruct wildcard structures if it is needed */
   Curl_wildcard_dtor(&data->wildcard);
   Curl_freeset(data);
@@ -433,11 +451,12 @@ CURLcode Curl_init_userdefined(struct Curl_easy *data)
 
   set->httpreq = HTTPREQ_GET; /* Default HTTP request */
   set->rtspreq = RTSPREQ_OPTIONS; /* Default RTSP request */
+#ifndef CURL_DISABLE_FTP
   set->ftp_use_epsv = TRUE;   /* FTP defaults to EPSV operations */
   set->ftp_use_eprt = TRUE;   /* FTP defaults to EPRT operations */
   set->ftp_use_pret = FALSE;  /* mainly useful for drftpd servers */
   set->ftp_filemethod = FTPFILE_MULTICWD;
-
+#endif
   set->dns_cache_timeout = 60; /* Timeout every 60 seconds by default */
 
   /* Set the default size of the SSL session ID cache */
@@ -478,9 +497,8 @@ CURLcode Curl_init_userdefined(struct Curl_easy *data)
      define since we internally only use the lower 16 bits for the passed
      in bitmask to not conflict with the private bits */
   set->allowed_protocols = CURLPROTO_ALL;
-  set->redir_protocols = CURLPROTO_ALL &  /* All except FILE, SCP and SMB */
-                          ~(CURLPROTO_FILE | CURLPROTO_SCP | CURLPROTO_SMB |
-                            CURLPROTO_SMBS);
+  set->redir_protocols = CURLPROTO_HTTP | CURLPROTO_HTTPS | CURLPROTO_FTP |
+                         CURLPROTO_FTPS;
 
 #if defined(HAVE_GSSAPI) || defined(USE_WINDOWS_SSPI)
   /*
@@ -492,9 +510,9 @@ CURLcode Curl_init_userdefined(struct Curl_easy *data)
 
   /* Set the default CA cert bundle/path detected/specified at build time.
    *
-   * If Schannel (WinSSL) is the selected SSL backend then these locations
-   * are ignored. We allow setting CA location for schannel only when
-   * explicitly specified by the user via CURLOPT_CAINFO / --cacert.
+   * If Schannel is the selected SSL backend then these locations are
+   * ignored. We allow setting CA location for schannel only when explicitly
+   * specified by the user via CURLOPT_CAINFO / --cacert.
    */
   if(Curl_ssl_backend() != CURLSSLBACKEND_SCHANNEL) {
 #if defined(CURL_CA_BUNDLE)
@@ -536,6 +554,8 @@ CURLcode Curl_init_userdefined(struct Curl_easy *data)
   set->fnmatch = ZERO_NULL;
   set->upkeep_interval_ms = CURL_UPKEEP_INTERVAL_DEFAULT;
   set->maxconnects = DEFAULT_CONNCACHE_SIZE; /* for easy handles */
+  set->maxage_conn = 118;
+  set->http09_allowed = FALSE;
   set->httpversion =
 #ifdef USE_NGHTTP2
     CURL_HTTP_VERSION_2TLS
@@ -570,7 +590,7 @@ CURLcode Curl_open(struct Curl_easy **curl)
 
   data->magic = CURLEASY_MAGIC_NUMBER;
 
-  result = Curl_resolver_init(&data->state.resolver);
+  result = Curl_resolver_init(data, &data->state.resolver);
   if(result) {
     DEBUGF(fprintf(stderr, "Error: resolver_init failed\n"));
     free(data);
@@ -602,8 +622,6 @@ CURLcode Curl_open(struct Curl_easy **curl)
 
       data->progress.flags |= PGRS_HIDE;
       data->state.current_speed = -1; /* init to negative == impossible */
-
-      Curl_http2_init_state(&data->state);
     }
   }
 
@@ -656,14 +674,18 @@ static void conn_reset_all_postponed_data(struct connectdata *conn)
 }
 #else  /* ! USE_RECV_BEFORE_SEND_WORKAROUND */
 /* Use "do-nothing" macro instead of function when workaround not used */
-#define conn_reset_all_postponed_data(c) do {} WHILE_FALSE
+#define conn_reset_all_postponed_data(c) do {} while(0)
 #endif /* ! USE_RECV_BEFORE_SEND_WORKAROUND */
 
-static void conn_free(struct connectdata *conn)
+
+static void conn_shutdown(struct connectdata *conn)
 {
   if(!conn)
     return;
 
+  infof(conn->data, "Closing connection %ld\n", conn->connection_id);
+  DEBUGASSERT(conn->data);
+
   /* possible left-overs from the async name resolvers */
   Curl_resolver_cancel(conn);
 
@@ -682,14 +704,25 @@ static void conn_free(struct connectdata *conn)
   if(CURL_SOCKET_BAD != conn->tempsock[1])
     Curl_closesocket(conn, conn->tempsock[1]);
 
-#if !defined(CURL_DISABLE_HTTP) && defined(USE_NTLM) && \
-    defined(NTLM_WB_ENABLED)
-  Curl_ntlm_wb_cleanup(conn);
-#endif
+  /* unlink ourselves. this should be called last since other shutdown
+     procedures need a valid conn->data and this may clear it. */
+  Curl_conncache_remove_conn(conn->data, conn, TRUE);
+}
+
+static void conn_free(struct connectdata *conn)
+{
+  if(!conn)
+    return;
+
+  free_idnconverted_hostname(&conn->host);
+  free_idnconverted_hostname(&conn->conn_to_host);
+  free_idnconverted_hostname(&conn->http_proxy.host);
+  free_idnconverted_hostname(&conn->socks_proxy.host);
 
   Curl_safefree(conn->user);
   Curl_safefree(conn->passwd);
   Curl_safefree(conn->oauth_bearer);
+  Curl_safefree(conn->sasl_authzid);
   Curl_safefree(conn->options);
   Curl_safefree(conn->http_proxy.user);
   Curl_safefree(conn->socks_proxy.user);
@@ -708,17 +741,14 @@ static void conn_free(struct connectdata *conn)
   Curl_safefree(conn->trailer);
   Curl_safefree(conn->host.rawalloc); /* host name buffer */
   Curl_safefree(conn->conn_to_host.rawalloc); /* host name buffer */
+  Curl_safefree(conn->hostname_resolve);
   Curl_safefree(conn->secondaryhostname);
   Curl_safefree(conn->http_proxy.host.rawalloc); /* http proxy name buffer */
   Curl_safefree(conn->socks_proxy.host.rawalloc); /* socks proxy name buffer */
-  Curl_safefree(conn->master_buffer);
   Curl_safefree(conn->connect_state);
 
   conn_reset_all_postponed_data(conn);
-
-  Curl_llist_destroy(&conn->send_pipe, NULL);
-  Curl_llist_destroy(&conn->recv_pipe, NULL);
-
+  Curl_llist_destroy(&conn->easyq, NULL);
   Curl_safefree(conn->localdev);
   Curl_free_primary_ssl_config(&conn->ssl_config);
   Curl_free_primary_ssl_config(&conn->proxy_ssl_config);
@@ -767,7 +797,6 @@ CURLcode Curl_disconnect(struct Curl_easy *data,
     return CURLE_OK;
   }
 
-  conn->data = data;
   if(conn->dns_entry != NULL) {
     Curl_resolv_unlock(data, conn->dns_entry);
     conn->dns_entry = NULL;
@@ -777,27 +806,26 @@ CURLcode Curl_disconnect(struct Curl_easy *data,
 
 #if !defined(CURL_DISABLE_HTTP) && defined(USE_NTLM)
   /* Cleanup NTLM connection-related data */
-  Curl_http_ntlm_cleanup(conn);
+  Curl_http_auth_cleanup_ntlm(conn);
+#endif
+#if !defined(CURL_DISABLE_HTTP) && defined(USE_SPNEGO)
+  /* Cleanup NEGOTIATE connection-related data */
+  Curl_http_auth_cleanup_negotiate(conn);
 #endif
 
+  /* the protocol specific disconnect handler and conn_shutdown need a transfer
+     for the connection! */
+  conn->data = data;
+
+  if(conn->bits.connect_only)
+    /* treat the connection as dead in CONNECT_ONLY situations */
+    dead_connection = TRUE;
+
   if(conn->handler->disconnect)
     /* This is set if protocol-specific cleanups should be made */
     conn->handler->disconnect(conn, dead_connection);
 
-    /* unlink ourselves! */
-  infof(data, "Closing connection %ld\n", conn->connection_id);
-  Curl_conncache_remove_conn(conn, TRUE);
-
-  free_fixed_hostname(&conn->host);
-  free_fixed_hostname(&conn->conn_to_host);
-  free_fixed_hostname(&conn->http_proxy.host);
-  free_fixed_hostname(&conn->socks_proxy.host);
-
-  DEBUGASSERT(conn->data == data);
-  /* this assumes that the pointer is still there after the connection was
-     detected from the cache */
-  Curl_ssl_close(conn, FIRSTSOCKET);
-
+  conn_shutdown(conn);
   conn_free(conn);
   return CURLE_OK;
 }
@@ -821,28 +849,21 @@ static bool SocketIsDead(curl_socket_t sock)
 }
 
 /*
- * IsPipeliningPossible()
+ * IsMultiplexingPossible()
  *
- * Return a bitmask with the available pipelining and multiplexing options for
- * the given requested connection.
+ * Return a bitmask with the available multiplexing options for the given
+ * requested connection.
  */
-static int IsPipeliningPossible(const struct Curl_easy *handle,
-                                const struct connectdata *conn)
+static int IsMultiplexingPossible(const struct Curl_easy *handle,
+                                  const struct connectdata *conn)
 {
   int avail = 0;
 
-  /* If a HTTP protocol and pipelining is enabled */
+  /* If a HTTP protocol and multiplexing is enabled */
   if((conn->handler->protocol & PROTO_FAMILY_HTTP) &&
      (!conn->bits.protoconnstart || !conn->bits.close)) {
 
-    if(Curl_pipeline_wanted(handle->multi, CURLPIPE_HTTP1) &&
-       (handle->set.httpversion != CURL_HTTP_VERSION_1_0) &&
-       (handle->set.httpreq == HTTPREQ_GET ||
-        handle->set.httpreq == HTTPREQ_HEAD))
-      /* didn't ask for HTTP/1.0 and a GET or HEAD */
-      avail |= CURLPIPE_HTTP1;
-
-    if(Curl_pipeline_wanted(handle->multi, CURLPIPE_MULTIPLEX) &&
+    if(Curl_multiplex_wanted(handle->multi) &&
        (handle->set.httpversion >= CURL_HTTP_VERSION_2))
       /* allows HTTP/2 */
       avail |= CURLPIPE_MULTIPLEX;
@@ -850,84 +871,7 @@ static int IsPipeliningPossible(const struct Curl_easy *handle,
   return avail;
 }
 
-/* Returns non-zero if a handle was removed */
-int Curl_removeHandleFromPipeline(struct Curl_easy *handle,
-                                  struct curl_llist *pipeline)
-{
-  if(pipeline) {
-    struct curl_llist_element *curr;
-
-    curr = pipeline->head;
-    while(curr) {
-      if(curr->ptr == handle) {
-        Curl_llist_remove(pipeline, curr, NULL);
-        return 1; /* we removed a handle */
-      }
-      curr = curr->next;
-    }
-  }
-
-  return 0;
-}
-
-#if 0 /* this code is saved here as it is useful for debugging purposes */
-static void Curl_printPipeline(struct curl_llist *pipeline)
-{
-  struct curl_llist_element *curr;
-
-  curr = pipeline->head;
-  while(curr) {
-    struct Curl_easy *data = (struct Curl_easy *) curr->ptr;
-    infof(data, "Handle in pipeline: %s\n", data->state.path);
-    curr = curr->next;
-  }
-}
-#endif
-
-static struct Curl_easy* gethandleathead(struct curl_llist *pipeline)
-{
-  struct curl_llist_element *curr = pipeline->head;
-#ifdef DEBUGBUILD
-  {
-    struct curl_llist_element *p = pipeline->head;
-    while(p) {
-      struct Curl_easy *e = p->ptr;
-      DEBUGASSERT(GOOD_EASY_HANDLE(e));
-      p = p->next;
-    }
-  }
-#endif
-  if(curr) {
-    return (struct Curl_easy *) curr->ptr;
-  }
-
-  return NULL;
-}
-
-/* remove the specified connection from all (possible) pipelines and related
-   queues */
-void Curl_getoff_all_pipelines(struct Curl_easy *data,
-                               struct connectdata *conn)
-{
-  if(!conn->bundle)
-    return;
-  if(conn->bundle->multiuse == BUNDLE_PIPELINING) {
-    bool recv_head = (conn->readchannel_inuse &&
-                      Curl_recvpipe_head(data, conn));
-    bool send_head = (conn->writechannel_inuse &&
-                      Curl_sendpipe_head(data, conn));
-
-    if(Curl_removeHandleFromPipeline(data, &conn->recv_pipe) && recv_head)
-      Curl_pipeline_leave_read(conn);
-    if(Curl_removeHandleFromPipeline(data, &conn->send_pipe) && send_head)
-      Curl_pipeline_leave_write(conn);
-  }
-  else {
-    (void)Curl_removeHandleFromPipeline(data, &conn->recv_pipe);
-    (void)Curl_removeHandleFromPipeline(data, &conn->send_pipe);
-  }
-}
-
+#ifndef CURL_DISABLE_PROXY
 static bool
 proxy_info_matches(const struct proxy_info* data,
                    const struct proxy_info* needle)
@@ -939,6 +883,30 @@ proxy_info_matches(const struct proxy_info* data,
 
   return FALSE;
 }
+#else
+/* disabled, won't get called */
+#define proxy_info_matches(x,y) FALSE
+#endif
+
+/* A connection has to have been idle for a shorter time than 'maxage_conn' to
+   be subject for reuse. The success rate is just too low after this. */
+
+static bool conn_maxage(struct Curl_easy *data,
+                        struct connectdata *conn,
+                        struct curltime now)
+{
+  if(!conn->data) {
+    timediff_t idletime = Curl_timediff(now, conn->lastused);
+    idletime /= 1000; /* integer seconds is fine */
+
+    if(idletime > data->set.maxage_conn) {
+      infof(data, "Too old connection (%ld seconds), disconnect it\n",
+            idletime);
+      return TRUE;
+    }
+  }
+  return FALSE;
+}
 
 /*
  * This function checks if the given connection is dead and extracts it from
@@ -952,20 +920,22 @@ proxy_info_matches(const struct proxy_info* data,
 static bool extract_if_dead(struct connectdata *conn,
                             struct Curl_easy *data)
 {
-  size_t pipeLen = conn->send_pipe.size + conn->recv_pipe.size;
-  if(!pipeLen && !CONN_INUSE(conn)) {
-    /* The check for a dead socket makes sense only if there are no
-       handles in pipeline and the connection isn't already marked in
+  if(!CONN_INUSE(conn) && !conn->data) {
+    /* The check for a dead socket makes sense only if the connection isn't in
        use */
     bool dead;
-
-    conn->data = data;
-    if(conn->handler->connection_check) {
+    struct curltime now = Curl_now();
+    if(conn_maxage(data, conn, now)) {
+      dead = TRUE;
+    }
+    else if(conn->handler->connection_check) {
       /* The protocol has a special method for checking the state of the
          connection. Use it to check if the connection is dead. */
       unsigned int state;
-
+      struct Curl_easy *olddata = conn->data;
+      conn->data = data; /* use this transfer for now */
       state = conn->handler->connection_check(conn, CONNCHECK_ISDEAD);
+      conn->data = olddata;
       dead = (state & CONNRESULT_DEAD);
     }
     else {
@@ -975,8 +945,7 @@ static bool extract_if_dead(struct connectdata *conn,
 
     if(dead) {
       infof(data, "Connection %ld seems to be dead!\n", conn->connection_id);
-      Curl_conncache_remove_conn(conn, FALSE);
-      conn->data = NULL; /* detach */
+      Curl_conncache_remove_conn(data, conn, FALSE);
       return TRUE;
     }
   }
@@ -1011,7 +980,8 @@ static int call_extract_if_dead(struct connectdata *conn, void *param)
 static void prune_dead_connections(struct Curl_easy *data)
 {
   struct curltime now = Curl_now();
-  time_t elapsed = Curl_timediff(now, data->state.conn_cache->last_cleanup);
+  timediff_t elapsed =
+    Curl_timediff(now, data->state.conn_cache->last_cleanup);
 
   if(elapsed >= 1000L) {
     struct prunedead prune;
@@ -1026,13 +996,6 @@ static void prune_dead_connections(struct Curl_easy *data)
   }
 }
 
-
-static size_t max_pipeline_length(struct Curl_multi *multi)
-{
-  return multi ? multi->max_pipeline_length : 0;
-}
-
-
 /*
  * Given one filled in connection struct (named needle), this function should
  * detect if there already is one that has all the significant details
@@ -1042,8 +1005,7 @@ static size_t max_pipeline_length(struct Curl_multi *multi)
  * connection as 'in-use'. It must later be called with ConnectionDone() to
  * return back to 'idle' (unused) state.
  *
- * The force_reuse flag is set if the connection must be used, even if
- * the pipelining strategy wants to open a new connection instead of reusing.
+ * The force_reuse flag is set if the connection must be used.
  */
 static bool
 ConnectionExists(struct Curl_easy *data,
@@ -1055,8 +1017,9 @@ ConnectionExists(struct Curl_easy *data,
   struct connectdata *check;
   struct connectdata *chosen = 0;
   bool foundPendingCandidate = FALSE;
-  int canpipe = IsPipeliningPossible(data, needle);
+  bool canmultiplex = IsMultiplexingPossible(data, needle);
   struct connectbundle *bundle;
+  const char *hostbundle;
 
 #ifdef USE_NTLM
   bool wantNTLMhttp = ((data->state.authhost.want &
@@ -1071,59 +1034,46 @@ ConnectionExists(struct Curl_easy *data,
   *force_reuse = FALSE;
   *waitpipe = FALSE;
 
-  /* We can't pipeline if the site is blacklisted */
-  if((canpipe & CURLPIPE_HTTP1) &&
-     Curl_pipeline_site_blacklisted(data, needle))
-    canpipe &= ~ CURLPIPE_HTTP1;
-
   /* Look up the bundle with all the connections to this particular host.
      Locks the connection cache, beware of early returns! */
-  bundle = Curl_conncache_find_bundle(needle, data->state.conn_cache);
+  bundle = Curl_conncache_find_bundle(needle, data->state.conn_cache,
+                                      &hostbundle);
   if(bundle) {
     /* Max pipe length is zero (unlimited) for multiplexed connections */
-    size_t max_pipe_len = (bundle->multiuse != BUNDLE_MULTIPLEX)?
-      max_pipeline_length(data->multi):0;
-    size_t best_pipe_len = max_pipe_len;
     struct curl_llist_element *curr;
 
     infof(data, "Found bundle for host %s: %p [%s]\n",
-          (needle->bits.conn_to_host ? needle->conn_to_host.name :
-           needle->host.name), (void *)bundle,
-          (bundle->multiuse == BUNDLE_PIPELINING ?
-           "can pipeline" :
-           (bundle->multiuse == BUNDLE_MULTIPLEX ?
-            "can multiplex" : "serially")));
-
-    /* We can't pipeline if we don't know anything about the server */
-    if(canpipe) {
-      if(bundle->multiuse <= BUNDLE_UNKNOWN) {
-        if((bundle->multiuse == BUNDLE_UNKNOWN) && data->set.pipewait) {
-          infof(data, "Server doesn't support multi-use yet, wait\n");
+          hostbundle, (void *)bundle, (bundle->multiuse == BUNDLE_MULTIPLEX ?
+                                       "can multiplex" : "serially"));
+
+    /* We can't multiplex if we don't know anything about the server */
+    if(canmultiplex) {
+      if(bundle->multiuse == BUNDLE_UNKNOWN) {
+        if(data->set.pipewait) {
+          infof(data, "Server doesn't support multiplex yet, wait\n");
           *waitpipe = TRUE;
-          Curl_conncache_unlock(needle);
+          Curl_conncache_unlock(data);
           return FALSE; /* no re-use */
         }
 
-        infof(data, "Server doesn't support multi-use (yet)\n");
-        canpipe = 0;
-      }
-      if((bundle->multiuse == BUNDLE_PIPELINING) &&
-         !Curl_pipeline_wanted(data->multi, CURLPIPE_HTTP1)) {
-        /* not asked for, switch off */
-        infof(data, "Could pipeline, but not asked to!\n");
-        canpipe = 0;
+        infof(data, "Server doesn't support multiplex (yet)\n");
+        canmultiplex = FALSE;
       }
-      else if((bundle->multiuse == BUNDLE_MULTIPLEX) &&
-              !Curl_pipeline_wanted(data->multi, CURLPIPE_MULTIPLEX)) {
+      if((bundle->multiuse == BUNDLE_MULTIPLEX) &&
+         !Curl_multiplex_wanted(data->multi)) {
         infof(data, "Could multiplex, but not asked to!\n");
-        canpipe = 0;
+        canmultiplex = FALSE;
+      }
+      if(bundle->multiuse == BUNDLE_NO_MULTIUSE) {
+        infof(data, "Can not multiplex, even if we wanted to!\n");
+        canmultiplex = FALSE;
       }
     }
 
     curr = bundle->conn_list.head;
     while(curr) {
       bool match = FALSE;
-      size_t pipeLen;
+      size_t multiplexed;
 
       /*
        * Note that if we use a HTTP proxy in normal mode (no tunneling), we
@@ -1132,35 +1082,18 @@ ConnectionExists(struct Curl_easy *data,
       check = curr->ptr;
       curr = curr->next;
 
-      if(extract_if_dead(check, data)) {
-        /* disconnect it */
-        (void)Curl_disconnect(data, check, /* dead_connection */TRUE);
+      if(check->bits.connect_only || check->bits.close)
+        /* connect-only or to-be-closed connections will not be reused */
         continue;
-      }
-
-      pipeLen = check->send_pipe.size + check->recv_pipe.size;
 
-      if(canpipe) {
-        if(check->bits.protoconnstart && check->bits.close)
-          continue;
+      multiplexed = CONN_INUSE(check) &&
+        (bundle->multiuse == BUNDLE_MULTIPLEX);
 
-        if(!check->bits.multiplex) {
-          /* If not multiplexing, make sure the connection is fine for HTTP/1
-             pipelining */
-          struct Curl_easy* sh = gethandleathead(&check->send_pipe);
-          struct Curl_easy* rh = gethandleathead(&check->recv_pipe);
-          if(sh) {
-            if(!(IsPipeliningPossible(sh, check) & CURLPIPE_HTTP1))
-              continue;
-          }
-          else if(rh) {
-            if(!(IsPipeliningPossible(rh, check) & CURLPIPE_HTTP1))
-              continue;
-          }
-        }
+      if(canmultiplex) {
+        ;
       }
       else {
-        if(pipeLen > 0) {
+        if(multiplexed) {
           /* can only happen within multi handles, and means that another easy
              handle is using this connection */
           continue;
@@ -1177,21 +1110,11 @@ ConnectionExists(struct Curl_easy *data,
           }
         }
 
-        if((check->sock[FIRSTSOCKET] == CURL_SOCKET_BAD) ||
-           check->bits.close) {
-          if(!check->bits.close)
-            foundPendingCandidate = TRUE;
-          /* Don't pick a connection that hasn't connected yet or that is going
-             to get closed. */
+        if(check->sock[FIRSTSOCKET] == CURL_SOCKET_BAD) {
+          foundPendingCandidate = TRUE;
+          /* Don't pick a connection that hasn't connected yet */
           infof(data, "Connection #%ld isn't open enough, can't reuse\n",
                 check->connection_id);
-#ifdef DEBUGBUILD
-          if(check->recv_pipe.size > 0) {
-            infof(data,
-                  "BAD! Unconnected #%ld has a non-empty recv pipeline!\n",
-                  check->connection_id);
-          }
-#endif
           continue;
         }
       }
@@ -1262,14 +1185,14 @@ ConnectionExists(struct Curl_easy *data,
         }
       }
 
-      if(!canpipe && CONN_INUSE(check))
-        /* this request can't be pipelined but the checked connection is
+      if(!canmultiplex && check->data)
+        /* this request can't be multiplexed but the checked connection is
            already in use so we skip it */
         continue;
 
-      if(CONN_INUSE(check) && (check->data->multi != needle->data->multi))
-        /* this could be subject for pipeline/multiplex use, but only
-           if they belong to the same multi handle */
+      if(check->data && (check->data->multi != needle->data->multi))
+        /* this could be subject for multiplex use, but only if they belong to
+         * the same multi handle */
         continue;
 
       if(needle->localdev || needle->localport) {
@@ -1357,10 +1280,16 @@ ConnectionExists(struct Curl_easy *data,
            partway through a handshake!) */
         if(wantNTLMhttp) {
           if(strcmp(needle->user, check->user) ||
-             strcmp(needle->passwd, check->passwd))
+             strcmp(needle->passwd, check->passwd)) {
+
+            /* we prefer a credential match, but this is at least a connection
+               that can be reused and "upgraded" to NTLM */
+            if(check->http_ntlm_state == NTLMSTATE_NONE)
+              chosen = check;
             continue;
+          }
         }
-        else if(check->ntlm.state != NTLMSTATE_NONE) {
+        else if(check->http_ntlm_state != NTLMSTATE_NONE) {
           /* Connection is using NTLM auth but we don't want NTLM */
           continue;
         }
@@ -1376,7 +1305,7 @@ ConnectionExists(struct Curl_easy *data,
              strcmp(needle->http_proxy.passwd, check->http_proxy.passwd))
             continue;
         }
-        else if(check->proxyntlm.state != NTLMSTATE_NONE) {
+        else if(check->proxy_ntlm_state != NTLMSTATE_NONE) {
           /* Proxy connection is using NTLM auth but we don't want NTLM */
           continue;
         }
@@ -1386,9 +1315,9 @@ ConnectionExists(struct Curl_easy *data,
           chosen = check;
 
           if((wantNTLMhttp &&
-             (check->ntlm.state != NTLMSTATE_NONE)) ||
+             (check->http_ntlm_state != NTLMSTATE_NONE)) ||
               (wantProxyNTLMhttp &&
-               (check->proxyntlm.state != NTLMSTATE_NONE))) {
+               (check->proxy_ntlm_state != NTLMSTATE_NONE))) {
             /* We must use this connection, no other */
             *force_reuse = TRUE;
             break;
@@ -1398,55 +1327,32 @@ ConnectionExists(struct Curl_easy *data,
           continue;
         }
 #endif
-        if(canpipe) {
-          /* We can pipeline if we want to. Let's continue looking for
-             the optimal connection to use, i.e the shortest pipe that is not
-             blacklisted. */
+        if(canmultiplex) {
+          /* We can multiplex if we want to. Let's continue looking for
+             the optimal connection to use. */
 
-          if(pipeLen == 0) {
+          if(!multiplexed) {
             /* We have the optimal connection. Let's stop looking. */
             chosen = check;
             break;
           }
 
-          /* We can't use the connection if the pipe is full */
-          if(max_pipe_len && (pipeLen >= max_pipe_len)) {
-            infof(data, "Pipe is full, skip (%zu)\n", pipeLen);
-            continue;
-          }
 #ifdef USE_NGHTTP2
           /* If multiplexed, make sure we don't go over concurrency limit */
           if(check->bits.multiplex) {
             /* Multiplexed connections can only be HTTP/2 for now */
             struct http_conn *httpc = &check->proto.httpc;
-            if(pipeLen >= httpc->settings.max_concurrent_streams) {
+            if(multiplexed >= httpc->settings.max_concurrent_streams) {
               infof(data, "MAX_CONCURRENT_STREAMS reached, skip (%zu)\n",
-                    pipeLen);
+                    multiplexed);
               continue;
             }
           }
 #endif
-          /* We can't use the connection if the pipe is penalized */
-          if(Curl_pipeline_penalized(data, check)) {
-            infof(data, "Penalized, skip\n");
-            continue;
-          }
-
-          if(max_pipe_len) {
-            if(pipeLen < best_pipe_len) {
-              /* This connection has a shorter pipe so far. We'll pick this
-                 and continue searching */
-              chosen = check;
-              best_pipe_len = pipeLen;
-              continue;
-            }
-          }
-          else {
-            /* When not pipelining (== multiplexed), we have a match here! */
-            chosen = check;
-            infof(data, "Multiplexed connection found!\n");
-            break;
-          }
+          /* When not multiplexed, we have a match here! */
+          chosen = check;
+          infof(data, "Multiplexed connection found!\n");
+          break;
         }
         else {
           /* We have found a connection. Let's stop searching. */
@@ -1460,11 +1366,11 @@ ConnectionExists(struct Curl_easy *data,
   if(chosen) {
     /* mark it as used before releasing the lock */
     chosen->data = data; /* own it! */
-    Curl_conncache_unlock(needle);
+    Curl_conncache_unlock(data);
     *usethis = chosen;
     return TRUE; /* yes, we found one to use! */
   }
-  Curl_conncache_unlock(needle);
+  Curl_conncache_unlock(data);
 
   if(foundPendingCandidate && data->set.pipewait) {
     infof(data,
@@ -1475,58 +1381,6 @@ ConnectionExists(struct Curl_easy *data,
   return FALSE; /* no matching connecting exists */
 }
 
-/* after a TCP connection to the proxy has been verified, this function does
-   the next magic step.
-
-   Note: this function's sub-functions call failf()
-
-*/
-CURLcode Curl_connected_proxy(struct connectdata *conn, int sockindex)
-{
-  CURLcode result = CURLE_OK;
-
-  if(conn->bits.socksproxy) {
-#ifndef CURL_DISABLE_PROXY
-    /* for the secondary socket (FTP), use the "connect to host"
-     * but ignore the "connect to port" (use the secondary port)
-     */
-    const char * const host = conn->bits.httpproxy ?
-                              conn->http_proxy.host.name :
-                              conn->bits.conn_to_host ?
-                              conn->conn_to_host.name :
-                              sockindex == SECONDARYSOCKET ?
-                              conn->secondaryhostname : conn->host.name;
-    const int port = conn->bits.httpproxy ? (int)conn->http_proxy.port :
-                     sockindex == SECONDARYSOCKET ? conn->secondary_port :
-                     conn->bits.conn_to_port ? conn->conn_to_port :
-                     conn->remote_port;
-    conn->bits.socksproxy_connecting = TRUE;
-    switch(conn->socks_proxy.proxytype) {
-    case CURLPROXY_SOCKS5:
-    case CURLPROXY_SOCKS5_HOSTNAME:
-      result = Curl_SOCKS5(conn->socks_proxy.user, conn->socks_proxy.passwd,
-                         host, port, sockindex, conn);
-      break;
-
-    case CURLPROXY_SOCKS4:
-    case CURLPROXY_SOCKS4A:
-      result = Curl_SOCKS4(conn->socks_proxy.user, host, port, sockindex,
-                           conn);
-      break;
-
-    default:
-      failf(conn->data, "unknown proxytype option given");
-      result = CURLE_COULDNT_CONNECT;
-    } /* switch proxytype */
-    conn->bits.socksproxy_connecting = FALSE;
-#else
-  (void)sockindex;
-#endif /* CURL_DISABLE_PROXY */
-  }
-
-  return result;
-}
-
 /*
  * verboseconnect() displays verbose information after a connect
  */
@@ -1543,127 +1397,6 @@ void Curl_verboseconnect(struct connectdata *conn)
 }
 #endif
 
-int Curl_protocol_getsock(struct connectdata *conn,
-                          curl_socket_t *socks,
-                          int numsocks)
-{
-  if(conn->handler->proto_getsock)
-    return conn->handler->proto_getsock(conn, socks, numsocks);
-  /* Backup getsock logic. Since there is a live socket in use, we must wait
-     for it or it will be removed from watching when the multi_socket API is
-     used. */
-  socks[0] = conn->sock[FIRSTSOCKET];
-  return GETSOCK_READSOCK(0) | GETSOCK_WRITESOCK(0);
-}
-
-int Curl_doing_getsock(struct connectdata *conn,
-                       curl_socket_t *socks,
-                       int numsocks)
-{
-  if(conn && conn->handler->doing_getsock)
-    return conn->handler->doing_getsock(conn, socks, numsocks);
-  return GETSOCK_BLANK;
-}
-
-/*
- * We are doing protocol-specific connecting and this is being called over and
- * over from the multi interface until the connection phase is done on
- * protocol layer.
- */
-
-CURLcode Curl_protocol_connecting(struct connectdata *conn,
-                                  bool *done)
-{
-  CURLcode result = CURLE_OK;
-
-  if(conn && conn->handler->connecting) {
-    *done = FALSE;
-    result = conn->handler->connecting(conn, done);
-  }
-  else
-    *done = TRUE;
-
-  return result;
-}
-
-/*
- * We are DOING this is being called over and over from the multi interface
- * until the DOING phase is done on protocol layer.
- */
-
-CURLcode Curl_protocol_doing(struct connectdata *conn, bool *done)
-{
-  CURLcode result = CURLE_OK;
-
-  if(conn && conn->handler->doing) {
-    *done = FALSE;
-    result = conn->handler->doing(conn, done);
-  }
-  else
-    *done = TRUE;
-
-  return result;
-}
-
-/*
- * We have discovered that the TCP connection has been successful, we can now
- * proceed with some action.
- *
- */
-CURLcode Curl_protocol_connect(struct connectdata *conn,
-                               bool *protocol_done)
-{
-  CURLcode result = CURLE_OK;
-
-  *protocol_done = FALSE;
-
-  if(conn->bits.tcpconnect[FIRSTSOCKET] && conn->bits.protoconnstart) {
-    /* We already are connected, get back. This may happen when the connect
-       worked fine in the first call, like when we connect to a local server
-       or proxy. Note that we don't know if the protocol is actually done.
-
-       Unless this protocol doesn't have any protocol-connect callback, as
-       then we know we're done. */
-    if(!conn->handler->connecting)
-      *protocol_done = TRUE;
-
-    return CURLE_OK;
-  }
-
-  if(!conn->bits.protoconnstart) {
-
-    result = Curl_proxy_connect(conn, FIRSTSOCKET);
-    if(result)
-      return result;
-
-    if(CONNECT_FIRSTSOCKET_PROXY_SSL())
-      /* wait for HTTPS proxy SSL initialization to complete */
-      return CURLE_OK;
-
-    if(conn->bits.tunnel_proxy && conn->bits.httpproxy &&
-       Curl_connect_ongoing(conn))
-      /* when using an HTTP tunnel proxy, await complete tunnel establishment
-         before proceeding further. Return CURLE_OK so we'll be called again */
-      return CURLE_OK;
-
-    if(conn->handler->connect_it) {
-      /* is there a protocol-specific connect() procedure? */
-
-      /* Call the protocol-specific connect function */
-      result = conn->handler->connect_it(conn, protocol_done);
-    }
-    else
-      *protocol_done = TRUE;
-
-    /* it has started, possibly even completed but that knowledge isn't stored
-       in this bit! */
-    if(!result)
-      conn->bits.protoconnstart = TRUE;
-  }
-
-  return result; /* pass back status */
-}
-
 /*
  * Helpers for IDNA conversions.
  */
@@ -1679,11 +1412,25 @@ static bool is_ASCII_name(const char *hostname)
 }
 
 /*
- * Perform any necessary IDN conversion of hostname
+ * Strip single trailing dot in the hostname,
+ * primarily for SNI and http host header.
  */
-static CURLcode fix_hostname(struct connectdata *conn, struct hostname *host)
+static void strip_trailing_dot(struct hostname *host)
 {
   size_t len;
+  if(!host || !host->name)
+    return;
+  len = strlen(host->name);
+  if(len && (host->name[len-1] == '.'))
+    host->name[len-1] = 0;
+}
+
+/*
+ * Perform any necessary IDN conversion of hostname
+ */
+static CURLcode idnconvert_hostname(struct connectdata *conn,
+                                    struct hostname *host)
+{
   struct Curl_easy *data = conn->data;
 
 #ifndef USE_LIBIDN2
@@ -1696,12 +1443,6 @@ static CURLcode fix_hostname(struct connectdata *conn, struct hostname *host)
   /* set the name we use to display the host name */
   host->dispname = host->name;
 
-  len = strlen(host->name);
-  if(len && (host->name[len-1] == '.'))
-    /* strip off a single trailing dot if present, primarily for SNI but
-       there's no use for it */
-    host->name[len-1] = 0;
-
   /* Check name for non-ASCII and convert hostname to ACE form if we can */
   if(!is_ASCII_name(host->name)) {
 #ifdef USE_LIBIDN2
@@ -1743,22 +1484,13 @@ static CURLcode fix_hostname(struct connectdata *conn, struct hostname *host)
     infof(data, "IDN support not present, can't parse Unicode domains\n");
 #endif
   }
-  {
-    char *hostp;
-    for(hostp = host->name; *hostp; hostp++) {
-      if(*hostp <= 32) {
-        failf(data, "Host name '%s' contains bad letter", host->name);
-        return CURLE_URL_MALFORMAT;
-      }
-    }
-  }
   return CURLE_OK;
 }
 
 /*
- * Frees data allocated by fix_hostname()
+ * Frees data allocated by idnconvert_hostname()
  */
-static void free_fixed_hostname(struct hostname *host)
+static void free_idnconverted_hostname(struct hostname *host)
 {
 #if defined(USE_LIBIDN2)
   if(host->encalloc) {
@@ -1775,13 +1507,6 @@ static void free_fixed_hostname(struct hostname *host)
 #endif
 }
 
-static void llist_dtor(void *user, void *element)
-{
-  (void)user;
-  (void)element;
-  /* Do nothing */
-}
-
 /*
  * Allocate and initialize a new connectdata object.
  */
@@ -1849,16 +1574,7 @@ static struct connectdata *allocate_conn(struct Curl_easy *data)
   conn->http_proxy.proxytype = data->set.proxytype;
   conn->socks_proxy.proxytype = CURLPROXY_SOCKS4;
 
-#ifdef CURL_DISABLE_PROXY
-
-  conn->bits.proxy = FALSE;
-  conn->bits.httpproxy = FALSE;
-  conn->bits.socksproxy = FALSE;
-  conn->bits.proxy_user_passwd = FALSE;
-  conn->bits.tunnel_proxy = FALSE;
-
-#else /* CURL_DISABLE_PROXY */
-
+#if !defined(CURL_DISABLE_PROXY)
   /* note that these two proxy bits are now just on what looks to be
      requested, they may be altered down the road */
   conn->bits.proxy = (data->set.str[STRING_PROXY] &&
@@ -1879,13 +1595,13 @@ static struct connectdata *allocate_conn(struct Curl_easy *data)
   conn->bits.proxy_user_passwd =
     (data->set.str[STRING_PROXYUSERNAME]) ? TRUE : FALSE;
   conn->bits.tunnel_proxy = data->set.tunnel_thru_httpproxy;
-
 #endif /* CURL_DISABLE_PROXY */
 
   conn->bits.user_passwd = (data->set.str[STRING_USERNAME]) ? TRUE : FALSE;
+#ifndef CURL_DISABLE_FTP
   conn->bits.ftp_use_epsv = data->set.ftp_use_epsv;
   conn->bits.ftp_use_eprt = data->set.ftp_use_eprt;
-
+#endif
   conn->ssl_config.verifystatus = data->set.ssl.primary.verifystatus;
   conn->ssl_config.verifypeer = data->set.ssl.primary.verifypeer;
   conn->ssl_config.verifyhost = data->set.ssl.primary.verifyhost;
@@ -1893,28 +1609,17 @@ static struct connectdata *allocate_conn(struct Curl_easy *data)
     data->set.proxy_ssl.primary.verifystatus;
   conn->proxy_ssl_config.verifypeer = data->set.proxy_ssl.primary.verifypeer;
   conn->proxy_ssl_config.verifyhost = data->set.proxy_ssl.primary.verifyhost;
-
   conn->ip_version = data->set.ipver;
+  conn->bits.connect_only = data->set.connect_only;
+  conn->transport = TRNSPRT_TCP; /* most of them are TCP streams */
 
 #if !defined(CURL_DISABLE_HTTP) && defined(USE_NTLM) && \
     defined(NTLM_WB_ENABLED)
   conn->ntlm_auth_hlpr_socket = CURL_SOCKET_BAD;
-  conn->ntlm_auth_hlpr_pid = 0;
-  conn->challenge_header = NULL;
-  conn->response_header = NULL;
 #endif
 
-  if(Curl_pipeline_wanted(data->multi, CURLPIPE_HTTP1) &&
-     !conn->master_buffer) {
-    /* Allocate master_buffer to be used for HTTP/1 pipelining */
-    conn->master_buffer = calloc(MASTERBUF_SIZE, sizeof(char));
-    if(!conn->master_buffer)
-      goto error;
-  }
-
-  /* Initialize the pipeline lists */
-  Curl_llist_init(&conn->send_pipe, (curl_llist_dtor) llist_dtor);
-  Curl_llist_init(&conn->recv_pipe, (curl_llist_dtor) llist_dtor);
+  /* Initialize the easy handle list */
+  Curl_llist_init(&conn->easyq, NULL);
 
 #ifdef HAVE_GSSAPI
   conn->data_prot = PROT_CLEAR;
@@ -1933,14 +1638,12 @@ static struct connectdata *allocate_conn(struct Curl_easy *data)
      it may live on without (this specific) Curl_easy */
   conn->fclosesocket = data->set.fclosesocket;
   conn->closesocket_client = data->set.closesocket_client;
+  conn->lastused = Curl_now(); /* used now */
 
   return conn;
   error:
 
-  Curl_llist_destroy(&conn->send_pipe, NULL);
-  Curl_llist_destroy(&conn->recv_pipe, NULL);
-
-  free(conn->master_buffer);
+  Curl_llist_destroy(&conn->easyq, NULL);
   free(conn->localdev);
 #ifdef USE_SSL
   free(conn->ssl_extra);
@@ -2013,6 +1716,50 @@ CURLcode Curl_uc_to_curlcode(CURLUcode uc)
 }
 
 /*
+ * If the URL was set with an IPv6 numerical address with a zone id part, set
+ * the scope_id based on that!
+ */
+
+static void zonefrom_url(CURLU *uh, struct connectdata *conn)
+{
+  char *zoneid;
+  CURLUcode uc;
+
+  uc = curl_url_get(uh, CURLUPART_ZONEID, &zoneid, 0);
+
+  if(!uc && zoneid) {
+    char *endp;
+    unsigned long scope = strtoul(zoneid, &endp, 10);
+    if(!*endp && (scope < UINT_MAX))
+      /* A plain number, use it directly as a scope id. */
+      conn->scope_id = (unsigned int)scope;
+#if defined(HAVE_IF_NAMETOINDEX)
+    else {
+#elif defined(WIN32)
+    else if(Curl_if_nametoindex) {
+#endif
+
+#if defined(HAVE_IF_NAMETOINDEX) || defined(WIN32)
+      /* Zone identifier is not numeric */
+      unsigned int scopeidx = 0;
+#if defined(WIN32)
+      scopeidx = Curl_if_nametoindex(zoneid);
+#else
+      scopeidx = if_nametoindex(zoneid);
+#endif
+      if(!scopeidx)
+        infof(conn->data, "Invalid zoneid: %s; %s\n", zoneid,
+              strerror(errno));
+      else
+        conn->scope_id = scopeidx;
+    }
+#endif /* HAVE_IF_NAMETOINDEX || WIN32 */
+
+    free(zoneid);
+  }
+}
+
+/*
  * Parse URL and fill in the relevant members of the connection struct.
  */
 static CURLcode parseurlandfillconn(struct Curl_easy *data,
@@ -2023,10 +1770,16 @@ static CURLcode parseurlandfillconn(struct Curl_easy *data,
   CURLUcode uc;
   char *hostname;
 
-  Curl_up_free(data); /* cleanup previous leftovers first */
+  up_free(data); /* cleanup previous leftovers first */
 
   /* parse the URL */
-  uh = data->state.uh = curl_url();
+  if(data->set.uh) {
+    uh = data->state.uh = curl_url_dup(data->set.uh);
+  }
+  else {
+    uh = data->state.uh = curl_url();
+  }
+
   if(!uh)
     return CURLE_OUT_OF_MEMORY;
 
@@ -2043,14 +1796,28 @@ static CURLcode parseurlandfillconn(struct Curl_easy *data,
     data->change.url_alloc = TRUE;
   }
 
-  uc = curl_url_set(uh, CURLUPART_URL, data->change.url,
+  if(!data->set.uh) {
+    char *newurl;
+    uc = curl_url_set(uh, CURLUPART_URL, data->change.url,
                     CURLU_GUESS_SCHEME |
                     CURLU_NON_SUPPORT_SCHEME |
                     (data->set.disallow_username_in_url ?
                      CURLU_DISALLOW_USER : 0) |
                     (data->set.path_as_is ? CURLU_PATH_AS_IS : 0));
-  if(uc)
-    return Curl_uc_to_curlcode(uc);
+    if(uc) {
+      DEBUGF(infof(data, "curl_url_set rejected %s\n", data->change.url));
+      return Curl_uc_to_curlcode(uc);
+    }
+
+    /* after it was parsed, get the generated normalized version */
+    uc = curl_url_get(uh, CURLUPART_URL, &newurl, 0);
+    if(uc)
+      return Curl_uc_to_curlcode(uc);
+    if(data->change.url_alloc)
+      free(data->change.url);
+    data->change.url = newurl;
+    data->change.url_alloc = TRUE;
+  }
 
   uc = curl_url_get(uh, CURLUPART_SCHEME, &data->state.up.scheme, 0);
   if(uc)
@@ -2110,76 +1877,27 @@ static CURLcode parseurlandfillconn(struct Curl_easy *data,
   }
   else {
     unsigned long port = strtoul(data->state.up.port, NULL, 10);
-    conn->remote_port = curlx_ultous(port);
+    conn->port = conn->remote_port = curlx_ultous(port);
   }
 
   (void)curl_url_get(uh, CURLUPART_QUERY, &data->state.up.query, 0);
 
   hostname = data->state.up.hostname;
-  if(!hostname)
-    /* this is for file:// transfers, get a dummy made */
-    hostname = (char *)"";
-
-  if(hostname[0] == '[') {
-    /* This looks like an IPv6 address literal.  See if there is an address
+  if(hostname && hostname[0] == '[') {
+    /* This looks like an IPv6 address literal. See if there is an address
        scope. */
-    char *percent = strchr(++hostname, '%');
+    size_t hlen;
     conn->bits.ipv6_ip = TRUE;
-    if(percent) {
-      unsigned int identifier_offset = 3;
-      char *endp;
-      unsigned long scope;
-      if(strncmp("%25", percent, 3) != 0) {
-        infof(data,
-              "Please URL encode %% as %%25, see RFC 6874.\n");
-        identifier_offset = 1;
-      }
-      scope = strtoul(percent + identifier_offset, &endp, 10);
-      if(*endp == ']') {
-        /* The address scope was well formed.  Knock it out of the
-           hostname. */
-        memmove(percent, endp, strlen(endp) + 1);
-        conn->scope_id = (unsigned int)scope;
-      }
-      else {
-        /* Zone identifier is not numeric */
-#if defined(HAVE_NET_IF_H) && defined(IFNAMSIZ) && defined(HAVE_IF_NAMETOINDEX)
-        char ifname[IFNAMSIZ + 2];
-        char *square_bracket;
-        unsigned int scopeidx = 0;
-        strncpy(ifname, percent + identifier_offset, IFNAMSIZ + 2);
-        /* Ensure nullbyte termination */
-        ifname[IFNAMSIZ + 1] = '\0';
-        square_bracket = strchr(ifname, ']');
-        if(square_bracket) {
-          /* Remove ']' */
-          *square_bracket = '\0';
-          scopeidx = if_nametoindex(ifname);
-          if(scopeidx == 0) {
-            infof(data, "Invalid network interface: %s; %s\n", ifname,
-                  strerror(errno));
-          }
-        }
-        if(scopeidx > 0) {
-          char *p = percent + identifier_offset + strlen(ifname);
+    /* cut off the brackets! */
+    hostname++;
+    hlen = strlen(hostname);
+    hostname[hlen - 1] = 0;
 
-          /* Remove zone identifier from hostname */
-          memmove(percent, p, strlen(p) + 1);
-          conn->scope_id = scopeidx;
-        }
-        else
-#endif /* HAVE_NET_IF_H && IFNAMSIZ */
-          infof(data, "Invalid IPv6 address format\n");
-      }
-    }
-    percent = strchr(hostname, ']');
-    if(percent)
-      /* terminate IPv6 numerical at end bracket */
-      *percent = 0;
+    zonefrom_url(uh, conn);
   }
 
   /* make sure the connect struct gets its own copy of the host name */
-  conn->host.rawalloc = strdup(hostname);
+  conn->host.rawalloc = strdup(hostname ? hostname : "");
   if(!conn->host.rawalloc)
     return CURLE_OUT_OF_MEMORY;
   conn->host.name = conn->host.rawalloc;
@@ -2191,6 +1909,7 @@ static CURLcode parseurlandfillconn(struct Curl_easy *data,
   return CURLE_OK;
 }
 
+
 /*
  * If we're doing a resumed transfer, we need to setup our stuff
  * properly.
@@ -2236,7 +1955,6 @@ static CURLcode setup_connection_internals(struct connectdata *conn)
 {
   const struct Curl_handler * p;
   CURLcode result;
-  conn->socktype = SOCK_STREAM; /* most of them are TCP streams */
 
   /* Perform setup complement if some. */
   p = conn->handler;
@@ -2267,6 +1985,11 @@ void Curl_free_request_state(struct Curl_easy *data)
 {
   Curl_safefree(data->req.protop);
   Curl_safefree(data->req.newurl);
+
+#ifndef CURL_DISABLE_DOH
+  Curl_close(&data->req.doh.probe[0].easy);
+  Curl_close(&data->req.doh.probe[1].easy);
+#endif
 }
 
 
@@ -2437,46 +2160,55 @@ static CURLcode parse_proxy(struct Curl_easy *data,
                             struct connectdata *conn, char *proxy,
                             curl_proxytype proxytype)
 {
-  char *prox_portno;
-  char *endofprot;
-
-  /* We use 'proxyptr' to point to the proxy name from now on... */
-  char *proxyptr;
-  char *portptr;
-  char *atsign;
+  char *portptr = NULL;
   long port = -1;
   char *proxyuser = NULL;
   char *proxypasswd = NULL;
+  char *host;
   bool sockstype;
+  CURLUcode uc;
+  struct proxy_info *proxyinfo;
+  CURLU *uhp = curl_url();
+  CURLcode result = CURLE_OK;
+  char *scheme = NULL;
 
-  /* We do the proxy host string parsing here. We want the host name and the
-   * port name. Accept a protocol:// prefix
-   */
+  /* When parsing the proxy, allowing non-supported schemes since we have
+     these made up ones for proxies. Guess scheme for URLs without it. */
+  uc = curl_url_set(uhp, CURLUPART_URL, proxy,
+                    CURLU_NON_SUPPORT_SCHEME|CURLU_GUESS_SCHEME);
+  if(!uc) {
+    /* parsed okay as a URL */
+    uc = curl_url_get(uhp, CURLUPART_SCHEME, &scheme, 0);
+    if(uc) {
+      result = CURLE_OUT_OF_MEMORY;
+      goto error;
+    }
 
-  /* Parse the protocol part if present */
-  endofprot = strstr(proxy, "://");
-  if(endofprot) {
-    proxyptr = endofprot + 3;
-    if(checkprefix("https", proxy))
+    if(strcasecompare("https", scheme))
       proxytype = CURLPROXY_HTTPS;
-    else if(checkprefix("socks5h", proxy))
+    else if(strcasecompare("socks5h", scheme))
       proxytype = CURLPROXY_SOCKS5_HOSTNAME;
-    else if(checkprefix("socks5", proxy))
+    else if(strcasecompare("socks5", scheme))
       proxytype = CURLPROXY_SOCKS5;
-    else if(checkprefix("socks4a", proxy))
+    else if(strcasecompare("socks4a", scheme))
       proxytype = CURLPROXY_SOCKS4A;
-    else if(checkprefix("socks4", proxy) || checkprefix("socks", proxy))
+    else if(strcasecompare("socks4", scheme) ||
+            strcasecompare("socks", scheme))
       proxytype = CURLPROXY_SOCKS4;
-    else if(checkprefix("http:", proxy))
+    else if(strcasecompare("http", scheme))
       ; /* leave it as HTTP or HTTP/1.0 */
     else {
       /* Any other xxx:// reject! */
       failf(data, "Unsupported proxy scheme for \'%s\'", proxy);
-      return CURLE_COULDNT_CONNECT;
+      result = CURLE_COULDNT_CONNECT;
+      goto error;
     }
   }
-  else
-    proxyptr = proxy; /* No xxx:// head: It's a HTTP proxy */
+  else {
+    failf(data, "Unsupported proxy syntax in \'%s\'", proxy);
+    result = CURLE_COULDNT_RESOLVE_PROXY;
+    goto error;
+  }
 
 #ifdef USE_SSL
   if(!(Curl_ssl->supports & SSLSUPP_HTTPS_PROXY))
@@ -2484,93 +2216,44 @@ static CURLcode parse_proxy(struct Curl_easy *data,
     if(proxytype == CURLPROXY_HTTPS) {
       failf(data, "Unsupported proxy \'%s\', libcurl is built without the "
                   "HTTPS-proxy support.", proxy);
-      return CURLE_NOT_BUILT_IN;
+      result = CURLE_NOT_BUILT_IN;
+      goto error;
     }
 
-  sockstype = proxytype == CURLPROXY_SOCKS5_HOSTNAME ||
-              proxytype == CURLPROXY_SOCKS5 ||
-              proxytype == CURLPROXY_SOCKS4A ||
-              proxytype == CURLPROXY_SOCKS4;
+  sockstype =
+    proxytype == CURLPROXY_SOCKS5_HOSTNAME ||
+    proxytype == CURLPROXY_SOCKS5 ||
+    proxytype == CURLPROXY_SOCKS4A ||
+    proxytype == CURLPROXY_SOCKS4;
 
-  /* Is there a username and password given in this proxy url? */
-  atsign = strchr(proxyptr, '@');
-  if(atsign) {
-    CURLcode result =
-      Curl_parse_login_details(proxyptr, atsign - proxyptr,
-                               &proxyuser, &proxypasswd, NULL);
-    if(result)
-      return result;
-    proxyptr = atsign + 1;
-  }
-
-  /* start scanning for port number at this point */
-  portptr = proxyptr;
+  proxyinfo = sockstype ? &conn->socks_proxy : &conn->http_proxy;
+  proxyinfo->proxytype = proxytype;
 
-  /* detect and extract RFC6874-style IPv6-addresses */
-  if(*proxyptr == '[') {
-    char *ptr = ++proxyptr; /* advance beyond the initial bracket */
-    while(*ptr && (ISXDIGIT(*ptr) || (*ptr == ':') || (*ptr == '.')))
-      ptr++;
-    if(*ptr == '%') {
-      /* There might be a zone identifier */
-      if(strncmp("%25", ptr, 3))
-        infof(data, "Please URL encode %% as %%25, see RFC 6874.\n");
-      ptr++;
-      /* Allow unreserved characters as defined in RFC 3986 */
-      while(*ptr && (ISALPHA(*ptr) || ISXDIGIT(*ptr) || (*ptr == '-') ||
-                     (*ptr == '.') || (*ptr == '_') || (*ptr == '~')))
-        ptr++;
+  /* Is there a username and password given in this proxy url? */
+  curl_url_get(uhp, CURLUPART_USER, &proxyuser, CURLU_URLDECODE);
+  curl_url_get(uhp, CURLUPART_PASSWORD, &proxypasswd, CURLU_URLDECODE);
+  if(proxyuser || proxypasswd) {
+    Curl_safefree(proxyinfo->user);
+    proxyinfo->user = proxyuser;
+    Curl_safefree(proxyinfo->passwd);
+    if(!proxypasswd) {
+      proxypasswd = strdup("");
+      if(!proxypasswd) {
+        result = CURLE_OUT_OF_MEMORY;
+        goto error;
+      }
     }
-    if(*ptr == ']')
-      /* yeps, it ended nicely with a bracket as well */
-      *ptr++ = 0;
-    else
-      infof(data, "Invalid IPv6 address format\n");
-    portptr = ptr;
-    /* Note that if this didn't end with a bracket, we still advanced the
-     * proxyptr first, but I can't see anything wrong with that as no host
-     * name nor a numeric can legally start with a bracket.
-     */
+    proxyinfo->passwd = proxypasswd;
+    conn->bits.proxy_user_passwd = TRUE; /* enable it */
   }
 
-  /* Get port number off proxy.server.com:1080 */
-  prox_portno = strchr(portptr, ':');
-  if(prox_portno) {
-    char *endp = NULL;
+  curl_url_get(uhp, CURLUPART_PORT, &portptr, 0);
 
-    *prox_portno = 0x0; /* cut off number from host name */
-    prox_portno ++;
-    /* now set the local port number */
-    port = strtol(prox_portno, &endp, 10);
-    if((endp && *endp && (*endp != '/') && (*endp != ' ')) ||
-       (port < 0) || (port > 65535)) {
-      /* meant to detect for example invalid IPv6 numerical addresses without
-         brackets: "2a00:fac0:a000::7:13". Accept a trailing slash only
-         because we then allow "URL style" with the number followed by a
-         slash, used in curl test cases already. Space is also an acceptable
-         terminating symbol. */
-      infof(data, "No valid port number in proxy string (%s)\n",
-            prox_portno);
-    }
-    else
-      conn->port = port;
+  if(portptr) {
+    port = strtol(portptr, NULL, 10);
+    free(portptr);
   }
   else {
-    if(proxyptr[0]=='/') {
-      /* If the first character in the proxy string is a slash, fail
-         immediately. The following code will otherwise clear the string which
-         will lead to code running as if no proxy was set! */
-      Curl_safefree(proxyuser);
-      Curl_safefree(proxypasswd);
-      return CURLE_COULDNT_RESOLVE_PROXY;
-    }
-
-    /* without a port number after the host name, some people seem to use
-       a slash so we strip everything from the first slash */
-    atsign = strchr(proxyptr, '/');
-    if(atsign)
-      *atsign = '\0'; /* cut off path part from host name */
-
     if(data->set.proxyport)
       /* None given in the proxy string, then get the default one if it is
          given */
@@ -2582,57 +2265,33 @@ static CURLcode parse_proxy(struct Curl_easy *data,
         port = CURL_DEFAULT_PROXY_PORT;
     }
   }
-
-  if(*proxyptr) {
-    struct proxy_info *proxyinfo =
-      sockstype ? &conn->socks_proxy : &conn->http_proxy;
-    proxyinfo->proxytype = proxytype;
-
-    if(proxyuser) {
-      /* found user and password, rip them out.  note that we are unescaping
-         them, as there is otherwise no way to have a username or password
-         with reserved characters like ':' in them. */
-      Curl_safefree(proxyinfo->user);
-      proxyinfo->user = curl_easy_unescape(data, proxyuser, 0, NULL);
-      Curl_safefree(proxyuser);
-
-      if(!proxyinfo->user) {
-        Curl_safefree(proxypasswd);
-        return CURLE_OUT_OF_MEMORY;
-      }
-
-      Curl_safefree(proxyinfo->passwd);
-      if(proxypasswd && strlen(proxypasswd) < MAX_CURL_PASSWORD_LENGTH)
-        proxyinfo->passwd = curl_easy_unescape(data, proxypasswd, 0, NULL);
-      else
-        proxyinfo->passwd = strdup("");
-      Curl_safefree(proxypasswd);
-
-      if(!proxyinfo->passwd)
-        return CURLE_OUT_OF_MEMORY;
-
-      conn->bits.proxy_user_passwd = TRUE; /* enable it */
-    }
-
-    if(port >= 0) {
-      proxyinfo->port = port;
-      if(conn->port < 0 || sockstype || !conn->socks_proxy.host.rawalloc)
-        conn->port = port;
-    }
-
-    /* now, clone the cleaned proxy host name */
-    Curl_safefree(proxyinfo->host.rawalloc);
-    proxyinfo->host.rawalloc = strdup(proxyptr);
-    proxyinfo->host.name = proxyinfo->host.rawalloc;
-
-    if(!proxyinfo->host.rawalloc)
-      return CURLE_OUT_OF_MEMORY;
+  if(port >= 0) {
+    proxyinfo->port = port;
+    if(conn->port < 0 || sockstype || !conn->socks_proxy.host.rawalloc)
+      conn->port = port;
   }
 
-  Curl_safefree(proxyuser);
-  Curl_safefree(proxypasswd);
+  /* now, clone the proxy host name */
+  uc = curl_url_get(uhp, CURLUPART_HOST, &host, CURLU_URLDECODE);
+  if(uc) {
+    result = CURLE_OUT_OF_MEMORY;
+    goto error;
+  }
+  Curl_safefree(proxyinfo->host.rawalloc);
+  proxyinfo->host.rawalloc = host;
+  if(host[0] == '[') {
+    /* this is a numerical IPv6, strip off the brackets */
+    size_t len = strlen(host);
+    host[len-1] = 0; /* clear the trailing bracket */
+    host++;
+    zonefrom_url(uhp, conn);
+  }
+  proxyinfo->host.name = host;
 
-  return CURLE_OK;
+  error:
+  free(scheme);
+  curl_url_cleanup(uhp);
+  return result;
 }
 
 /*
@@ -2979,7 +2638,7 @@ static CURLcode parse_remote_port(struct Curl_easy *data,
     char portbuf[16];
     CURLUcode uc;
     conn->remote_port = (unsigned short)data->set.use_port;
-    snprintf(portbuf, sizeof(portbuf), "%u", conn->remote_port);
+    msnprintf(portbuf, sizeof(portbuf), "%d", conn->remote_port);
     uc = curl_url_set(data->state.uh, CURLUPART_PORT, portbuf, 0);
     if(uc)
       return CURLE_OUT_OF_MEMORY;
@@ -2999,6 +2658,20 @@ static CURLcode override_login(struct Curl_easy *data,
   bool user_changed = FALSE;
   bool passwd_changed = FALSE;
   CURLUcode uc;
+
+  if(data->set.use_netrc == CURL_NETRC_REQUIRED && conn->bits.user_passwd) {
+    /* ignore user+password in the URL */
+    if(*userp) {
+      Curl_safefree(*userp);
+      user_changed = TRUE;
+    }
+    if(*passwdp) {
+      Curl_safefree(*passwdp);
+      passwd_changed = TRUE;
+    }
+    conn->bits.user_passwd = FALSE; /* disable user+password */
+  }
+
   if(data->set.str[STRING_USERNAME]) {
     free(*userp);
     *userp = strdup(data->set.str[STRING_USERNAME]);
@@ -3025,20 +2698,18 @@ static CURLcode override_login(struct Curl_easy *data,
   }
 
   conn->bits.netrc = FALSE;
-  if(data->set.use_netrc != CURL_NETRC_IGNORED) {
-    char *nuser = NULL;
-    char *npasswd = NULL;
+  if(data->set.use_netrc != CURL_NETRC_IGNORED &&
+      (!*userp || !**userp || !*passwdp || !**passwdp)) {
+    bool netrc_user_changed = FALSE;
+    bool netrc_passwd_changed = FALSE;
     int ret;
 
-    if(data->set.use_netrc == CURL_NETRC_OPTIONAL)
-      nuser = *userp; /* to separate otherwise identical machines */
-
     ret = Curl_parsenetrc(conn->host.name,
-                          &nuser, &npasswd,
+                          userp, passwdp,
+                          &netrc_user_changed, &netrc_passwd_changed,
                           data->set.str[STRING_NETRC_FILE]);
     if(ret > 0) {
-      infof(data, "Couldn't find host %s in the "
-            DOT_CHAR "netrc file; using defaults\n",
+      infof(data, "Couldn't find host %s in the .netrc file; using defaults\n",
             conn->host.name);
     }
     else if(ret < 0) {
@@ -3051,31 +2722,11 @@ static CURLcode override_login(struct Curl_easy *data,
       conn->bits.netrc = TRUE;
       conn->bits.user_passwd = TRUE; /* enable user+password */
 
-      if(data->set.use_netrc == CURL_NETRC_OPTIONAL) {
-        /* prefer credentials outside netrc */
-        if(nuser && !*userp) {
-          free(*userp);
-          *userp = nuser;
-          user_changed = TRUE;
-        }
-        if(npasswd && !*passwdp) {
-          free(*passwdp);
-          *passwdp = npasswd;
-          passwd_changed = TRUE;
-        }
+      if(netrc_user_changed) {
+        user_changed = TRUE;
       }
-      else {
-        /* prefer netrc credentials */
-        if(nuser) {
-          free(*userp);
-          *userp = nuser;
-          user_changed = TRUE;
-        }
-        if(npasswd) {
-          free(*passwdp);
-          *passwdp = npasswd;
-          passwd_changed = TRUE;
-        }
+      if(netrc_passwd_changed) {
+        passwd_changed = TRUE;
       }
     }
   }
@@ -3124,13 +2775,6 @@ static CURLcode set_login(struct connectdata *conn)
       result = CURLE_OUT_OF_MEMORY;
   }
 
-  /* if there's a user without password, consider password blank */
-  if(conn->user && !conn->passwd) {
-    conn->passwd = strdup("");
-    if(!conn->passwd)
-      result = CURLE_OUT_OF_MEMORY;
-  }
-
   return result;
 }
 
@@ -3351,6 +2995,73 @@ static CURLcode parse_connect_to_slist(struct Curl_easy *data,
     conn_to_host = conn_to_host->next;
   }
 
+#ifdef USE_ALTSVC
+  if(data->asi && !host && (port == -1) &&
+     (conn->handler->protocol == CURLPROTO_HTTPS)) {
+    /* no connect_to match, try alt-svc! */
+    enum alpnid srcalpnid;
+    bool hit;
+    struct altsvc *as;
+    const int allowed_versions = ( ALPN_h1
+#ifdef USE_NGHTTP2
+      | ALPN_h2
+#endif
+#ifdef ENABLE_QUIC
+      | ALPN_h3
+#endif
+      ) & data->asi->flags;
+
+    host = conn->host.rawalloc;
+#ifdef USE_NGHTTP2
+    /* with h2 support, check that first */
+    srcalpnid = ALPN_h2;
+    hit = Curl_altsvc_lookup(data->asi,
+                             srcalpnid, host, conn->remote_port, /* from */
+                             &as /* to */,
+                             allowed_versions);
+    if(!hit)
+#endif
+    {
+      srcalpnid = ALPN_h1;
+      hit = Curl_altsvc_lookup(data->asi,
+                               srcalpnid, host, conn->remote_port, /* from */
+                               &as /* to */,
+                               allowed_versions);
+    }
+    if(hit) {
+      char *hostd = strdup((char *)as->dst.host);
+      if(!hostd)
+        return CURLE_OUT_OF_MEMORY;
+      conn->conn_to_host.rawalloc = hostd;
+      conn->conn_to_host.name = hostd;
+      conn->bits.conn_to_host = TRUE;
+      conn->conn_to_port = as->dst.port;
+      conn->bits.conn_to_port = TRUE;
+      conn->bits.altused = TRUE;
+      infof(data, "Alt-svc connecting from [%s]%s:%d to [%s]%s:%d\n",
+            Curl_alpnid2str(srcalpnid), host, conn->remote_port,
+            Curl_alpnid2str(as->dst.alpnid), hostd, as->dst.port);
+      if(srcalpnid != as->dst.alpnid) {
+        /* protocol version switch */
+        switch(as->dst.alpnid) {
+        case ALPN_h1:
+          conn->httpversion = 11;
+          break;
+        case ALPN_h2:
+          conn->httpversion = 20;
+          break;
+        case ALPN_h3:
+          conn->transport = TRNSPRT_QUIC;
+          conn->httpversion = 30;
+          break;
+        default: /* shouldn't be possible */
+          break;
+        }
+      }
+    }
+  }
+#endif
+
   return result;
 }
 
@@ -3364,12 +3075,14 @@ static CURLcode resolve_server(struct Curl_easy *data,
   CURLcode result = CURLE_OK;
   timediff_t timeout_ms = Curl_timeleft(data, NULL, TRUE);
 
+  DEBUGASSERT(conn);
+  DEBUGASSERT(data);
   /*************************************************************
    * Resolve the name of the server or proxy
    *************************************************************/
   if(conn->bits.reuse)
     /* We're reusing the connection - no need to resolve anything, and
-       fix_hostname() was called already in create_conn() for the re-use
+       idnconvert_hostname() was called already in create_conn() for the re-use
        case. */
     *async = FALSE;
 
@@ -3424,7 +3137,10 @@ static CURLcode resolve_server(struct Curl_easy *data,
         conn->port = conn->remote_port;
 
       /* Resolve target host right on */
-      rc = Curl_resolv_timeout(conn, connhost->name, (int)conn->port,
+      conn->hostname_resolve = strdup(connhost->name);
+      if(!conn->hostname_resolve)
+        return CURLE_OUT_OF_MEMORY;
+      rc = Curl_resolv_timeout(conn, conn->hostname_resolve, (int)conn->port,
                                &hostaddr, timeout_ms);
       if(rc == CURLRESOLV_PENDING)
         *async = TRUE;
@@ -3445,7 +3161,10 @@ static CURLcode resolve_server(struct Curl_easy *data,
         &conn->socks_proxy.host : &conn->http_proxy.host;
 
       /* resolve proxy */
-      rc = Curl_resolv_timeout(conn, host->name, (int)conn->port,
+      conn->hostname_resolve = strdup(host->name);
+      if(!conn->hostname_resolve)
+        return CURLE_OUT_OF_MEMORY;
+      rc = Curl_resolv_timeout(conn, conn->hostname_resolve, (int)conn->port,
                                &hostaddr, timeout_ms);
 
       if(rc == CURLRESOLV_PENDING)
@@ -3475,8 +3194,8 @@ static CURLcode resolve_server(struct Curl_easy *data,
 static void reuse_conn(struct connectdata *old_conn,
                        struct connectdata *conn)
 {
-  free_fixed_hostname(&old_conn->http_proxy.host);
-  free_fixed_hostname(&old_conn->socks_proxy.host);
+  free_idnconverted_hostname(&old_conn->http_proxy.host);
+  free_idnconverted_hostname(&old_conn->socks_proxy.host);
 
   free(old_conn->http_proxy.host.rawalloc);
   free(old_conn->socks_proxy.host.rawalloc);
@@ -3520,14 +3239,18 @@ static void reuse_conn(struct connectdata *old_conn,
 
   /* host can change, when doing keepalive with a proxy or if the case is
      different this time etc */
-  free_fixed_hostname(&conn->host);
-  free_fixed_hostname(&conn->conn_to_host);
+  free_idnconverted_hostname(&conn->host);
+  free_idnconverted_hostname(&conn->conn_to_host);
   Curl_safefree(conn->host.rawalloc);
   Curl_safefree(conn->conn_to_host.rawalloc);
   conn->host = old_conn->host;
   conn->conn_to_host = old_conn->conn_to_host;
   conn->conn_to_port = old_conn->conn_to_port;
   conn->remote_port = old_conn->remote_port;
+  Curl_safefree(conn->hostname_resolve);
+
+  conn->hostname_resolve = old_conn->hostname_resolve;
+  old_conn->hostname_resolve = NULL;
 
   /* persist connection info in session handle */
   Curl_persistconninfo(conn);
@@ -3545,11 +3268,7 @@ static void reuse_conn(struct connectdata *old_conn,
   Curl_safefree(old_conn->http_proxy.passwd);
   Curl_safefree(old_conn->socks_proxy.passwd);
   Curl_safefree(old_conn->localdev);
-
-  Curl_llist_destroy(&old_conn->send_pipe, NULL);
-  Curl_llist_destroy(&old_conn->recv_pipe, NULL);
-
-  Curl_safefree(old_conn->master_buffer);
+  Curl_llist_destroy(&old_conn->easyq, NULL);
 
 #ifdef USE_UNIX_SOCKETS
   Curl_safefree(old_conn->unix_domain_socket);
@@ -3587,6 +3306,7 @@ static CURLcode create_conn(struct Curl_easy *data,
   size_t max_total_connections = Curl_multi_max_total_connections(data->multi);
 
   *async = FALSE;
+  *in_connect = NULL;
 
   /*************************************************************
    * Check input data
@@ -3624,6 +3344,14 @@ static CURLcode create_conn(struct Curl_easy *data,
     }
   }
 
+  if(data->set.str[STRING_SASL_AUTHZID]) {
+    conn->sasl_authzid = strdup(data->set.str[STRING_SASL_AUTHZID]);
+    if(!conn->sasl_authzid) {
+      result = CURLE_OUT_OF_MEMORY;
+      goto out;
+    }
+  }
+
 #ifdef USE_UNIX_SOCKETS
   if(data->set.str[STRING_UNIX_SOCKET_PATH]) {
     conn->unix_domain_socket = strdup(data->set.str[STRING_UNIX_SOCKET_PATH]);
@@ -3677,30 +3405,30 @@ static CURLcode create_conn(struct Curl_easy *data,
     goto out;
 
   /*************************************************************
-   * IDN-fix the hostnames
+   * IDN-convert the hostnames
    *************************************************************/
-  result = fix_hostname(conn, &conn->host);
+  result = idnconvert_hostname(conn, &conn->host);
   if(result)
     goto out;
   if(conn->bits.conn_to_host) {
-    result = fix_hostname(conn, &conn->conn_to_host);
+    result = idnconvert_hostname(conn, &conn->conn_to_host);
     if(result)
       goto out;
   }
   if(conn->bits.httpproxy) {
-    result = fix_hostname(conn, &conn->http_proxy.host);
+    result = idnconvert_hostname(conn, &conn->http_proxy.host);
     if(result)
       goto out;
   }
   if(conn->bits.socksproxy) {
-    result = fix_hostname(conn, &conn->socks_proxy.host);
+    result = idnconvert_hostname(conn, &conn->socks_proxy.host);
     if(result)
       goto out;
   }
 
   /*************************************************************
    * Check whether the host and the "connect to host" are equal.
-   * Do this after the hostnames have been IDN-fixed.
+   * Do this after the hostnames have been IDN-converted.
    *************************************************************/
   if(conn->bits.conn_to_host &&
      strcasecompare(conn->conn_to_host.name, conn->host.name)) {
@@ -3752,7 +3480,6 @@ static CURLcode create_conn(struct Curl_easy *data,
 
     /* Setup a "faked" transfer that'll do nothing */
     if(!result) {
-      conn->data = data;
       conn->bits.tcpconnect[FIRSTSOCKET] = TRUE; /* we are "connected */
 
       result = Curl_conncache_add_conn(data->state.conn_cache, conn);
@@ -3769,9 +3496,8 @@ static CURLcode create_conn(struct Curl_easy *data,
         (void)conn->handler->done(conn, result, FALSE);
         goto out;
       }
-
-      Curl_setup_transfer(conn, -1, -1, FALSE, NULL, /* no download */
-                          -1, NULL); /* no upload */
+      Curl_attach_connnection(data, conn);
+      Curl_setup_transfer(data, -1, -1, FALSE, -1);
     }
 
     /* since we skip do_init() */
@@ -3807,6 +3533,10 @@ static CURLcode create_conn(struct Curl_easy *data,
     data->set.str[STRING_SSL_CIPHER13_LIST_ORIG];
   data->set.proxy_ssl.primary.cipher_list13 =
     data->set.str[STRING_SSL_CIPHER13_LIST_PROXY];
+  data->set.ssl.primary.pinned_key =
+    data->set.str[STRING_SSL_PINNEDPUBLICKEY_ORIG];
+  data->set.proxy_ssl.primary.pinned_key =
+    data->set.str[STRING_SSL_PINNEDPUBLICKEY_PROXY];
 
   data->set.ssl.CRLfile = data->set.str[STRING_SSL_CRLFILE_ORIG];
   data->set.proxy_ssl.CRLfile = data->set.str[STRING_SSL_CRLFILE_PROXY];
@@ -3857,31 +3587,13 @@ static CURLcode create_conn(struct Curl_easy *data,
   /* reuse_fresh is TRUE if we are told to use a new connection by force, but
      we only acknowledge this option if this is not a re-used connection
      already (which happens due to follow-location or during a HTTP
-     authentication phase). */
-  if(data->set.reuse_fresh && !data->state.this_is_a_follow)
+     authentication phase). CONNECT_ONLY transfers also refuse reuse. */
+  if((data->set.reuse_fresh && !data->state.this_is_a_follow) ||
+     data->set.connect_only)
     reuse = FALSE;
   else
     reuse = ConnectionExists(data, conn, &conn_temp, &force_reuse, &waitpipe);
 
-  /* If we found a reusable connection that is now marked as in use, we may
-     still want to open a new connection if we are pipelining. */
-  if(reuse && !force_reuse && IsPipeliningPossible(data, conn_temp)) {
-    size_t pipelen = conn_temp->send_pipe.size + conn_temp->recv_pipe.size;
-    if(pipelen > 0) {
-      infof(data, "Found connection %ld, with requests in the pipe (%zu)\n",
-            conn_temp->connection_id, pipelen);
-
-      if(Curl_conncache_bundle_size(conn_temp) < max_host_connections &&
-         Curl_conncache_size(data) < max_total_connections) {
-        /* We want a new connection anyway */
-        reuse = FALSE;
-
-        infof(data, "We can reuse, but we want a new connection anyway\n");
-        Curl_conncache_return_conn(conn_temp);
-      }
-    }
-  }
-
   if(reuse) {
     /*
      * We already have a connection for this, we got the former connection
@@ -3919,13 +3631,14 @@ static CURLcode create_conn(struct Curl_easy *data,
     }
 
     if(waitpipe)
-      /* There is a connection that *might* become usable for pipelining
+      /* There is a connection that *might* become usable for multiplexing
          "soon", and we wait for that */
       connections_available = FALSE;
     else {
       /* this gets a lock on the conncache */
+      const char *bundlehost;
       struct connectbundle *bundle =
-        Curl_conncache_find_bundle(conn, data->state.conn_cache);
+        Curl_conncache_find_bundle(conn, data->state.conn_cache, &bundlehost);
 
       if(max_host_connections > 0 && bundle &&
          (bundle->num_connections >= max_host_connections)) {
@@ -3933,19 +3646,19 @@ static CURLcode create_conn(struct Curl_easy *data,
 
         /* The bundle is full. Extract the oldest connection. */
         conn_candidate = Curl_conncache_extract_bundle(data, bundle);
-        Curl_conncache_unlock(conn);
+        Curl_conncache_unlock(data);
 
         if(conn_candidate)
           (void)Curl_disconnect(data, conn_candidate,
                                 /* dead_connection */ FALSE);
         else {
-          infof(data, "No more connections allowed to host: %zu\n",
-                max_host_connections);
+          infof(data, "No more connections allowed to host %s: %zu\n",
+                bundlehost, max_host_connections);
           connections_available = FALSE;
         }
       }
       else
-        Curl_conncache_unlock(conn);
+        Curl_conncache_unlock(data);
 
     }
 
@@ -4028,6 +3741,15 @@ static CURLcode create_conn(struct Curl_easy *data,
    *************************************************************/
   result = resolve_server(data, conn, async);
 
+  /* Strip trailing dots. resolve_server copied the name. */
+  strip_trailing_dot(&conn->host);
+  if(conn->bits.httpproxy)
+    strip_trailing_dot(&conn->http_proxy.host);
+  if(conn->bits.socksproxy)
+    strip_trailing_dot(&conn->socks_proxy.host);
+  if(conn->bits.conn_to_host)
+    strip_trailing_dot(&conn->conn_to_host);
+
 out:
   return result;
 }
@@ -4092,7 +3814,9 @@ CURLcode Curl_setup_conn(struct connectdata *conn,
   }
   else {
     Curl_pgrsTime(data, TIMER_CONNECT);    /* we're connected already */
-    Curl_pgrsTime(data, TIMER_APPCONNECT); /* we're connected already */
+    if(conn->ssl[FIRSTSOCKET].use ||
+       (conn->handler->protocol & PROTO_FAMILY_SSH))
+      Curl_pgrsTime(data, TIMER_APPCONNECT); /* we're connected already */
     conn->bits.tcpconnect[FIRSTSOCKET] = TRUE;
     *protocol_done = TRUE;
     Curl_updateconninfo(conn, conn->sock[FIRSTSOCKET]);
@@ -4105,11 +3829,11 @@ CURLcode Curl_setup_conn(struct connectdata *conn,
 }
 
 CURLcode Curl_connect(struct Curl_easy *data,
-                      struct connectdata **in_connect,
                       bool *asyncp,
                       bool *protocol_done)
 {
   CURLcode result;
+  struct connectdata *conn;
 
   *asyncp = FALSE; /* assume synchronous resolves by default */
 
@@ -4119,30 +3843,31 @@ CURLcode Curl_connect(struct Curl_easy *data,
   data->req.maxdownload = -1;
 
   /* call the stuff that needs to be called */
-  result = create_conn(data, in_connect, asyncp);
+  result = create_conn(data, &conn, asyncp);
 
   if(!result) {
-    if(CONN_INUSE(*in_connect))
-      /* pipelining */
+    if(CONN_INUSE(conn))
+      /* multiplexed */
       *protocol_done = TRUE;
     else if(!*asyncp) {
       /* DNS resolution is done: that's either because this is a reused
          connection, in which case DNS was unnecessary, or because DNS
          really did finish already (synch resolver/fast async resolve) */
-      result = Curl_setup_conn(*in_connect, protocol_done);
+      result = Curl_setup_conn(conn, protocol_done);
     }
   }
 
   if(result == CURLE_NO_CONNECTION_AVAILABLE) {
-    *in_connect = NULL;
     return result;
   }
-  else if(result && *in_connect) {
+  else if(result && conn) {
     /* We're not allowed to return failure with memory left allocated in the
        connectdata struct, free those here */
-    Curl_disconnect(data, *in_connect, TRUE);
-    *in_connect = NULL; /* return a NULL */
+    Curl_disconnect(data, conn, TRUE);
   }
+  else if(!result && !data->conn)
+    /* FILE: transfers already have the connection attached */
+    Curl_attach_connnection(data, conn);
 
   return result;
 }
@@ -4312,34 +4037,3 @@ static unsigned int get_protocol_family(unsigned int protocol)
 
   return family;
 }
-
-
-/*
- * Wrapper to call functions in Curl_conncache_foreach()
- *
- * Returns always 0.
- */
-static int conn_upkeep(struct connectdata *conn,
-                       void *param)
-{
-  /* Param is unused. */
-  (void)param;
-
-  if(conn->handler->connection_check) {
-    /* Do a protocol-specific keepalive check on the connection. */
-    conn->handler->connection_check(conn, CONNCHECK_KEEPALIVE);
-  }
-
-  return 0; /* continue iteration */
-}
-
-CURLcode Curl_upkeep(struct conncache *conn_cache,
-                          void *data)
-{
-  /* Loop over every connection and make connection alive. */
-  Curl_conncache_foreach(data,
-                         conn_cache,
-                         data,
-                         conn_upkeep);
-  return CURLE_OK;
-}
index 095d638..053fbdf 100644 (file)
--- a/lib/url.h
+++ b/lib/url.h
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -48,48 +48,24 @@ CURLcode Curl_open(struct Curl_easy **curl);
 CURLcode Curl_init_userdefined(struct Curl_easy *data);
 
 void Curl_freeset(struct Curl_easy * data);
-/* free the URL pieces */
-void Curl_up_free(struct Curl_easy *data);
 CURLcode Curl_uc_to_curlcode(CURLUcode uc);
-CURLcode Curl_close(struct Curl_easy *data); /* opposite of curl_open() */
-CURLcode Curl_connect(struct Curl_easy *, struct connectdata **,
-                      bool *async, bool *protocol_connect);
+CURLcode Curl_close(struct Curl_easy **datap); /* opposite of curl_open() */
+CURLcode Curl_connect(struct Curl_easy *, bool *async, bool *protocol_connect);
 CURLcode Curl_disconnect(struct Curl_easy *data,
                          struct connectdata *, bool dead_connection);
-CURLcode Curl_protocol_connect(struct connectdata *conn, bool *done);
-CURLcode Curl_protocol_connecting(struct connectdata *conn, bool *done);
-CURLcode Curl_protocol_doing(struct connectdata *conn, bool *done);
 CURLcode Curl_setup_conn(struct connectdata *conn,
                          bool *protocol_done);
 void Curl_free_request_state(struct Curl_easy *data);
-
-int Curl_protocol_getsock(struct connectdata *conn,
-                          curl_socket_t *socks,
-                          int numsocks);
-int Curl_doing_getsock(struct connectdata *conn,
-                       curl_socket_t *socks,
-                       int numsocks);
 CURLcode Curl_parse_login_details(const char *login, const size_t len,
                                   char **userptr, char **passwdptr,
                                   char **optionsptr);
 
-int Curl_removeHandleFromPipeline(struct Curl_easy *handle,
-                                  struct curl_llist *pipeline);
-/* remove the specified connection from all (possible) pipelines and related
-   queues */
-void Curl_getoff_all_pipelines(struct Curl_easy *data,
-                               struct connectdata *conn);
-
-CURLcode Curl_upkeep(struct conncache *conn_cache, void *data);
-
 const struct Curl_handler *Curl_builtin_scheme(const char *scheme);
 
 #define CURL_DEFAULT_PROXY_PORT 1080 /* default proxy port unless specified */
 #define CURL_DEFAULT_HTTPS_PROXY_PORT 443 /* default https proxy port unless
                                              specified */
 
-CURLcode Curl_connected_proxy(struct connectdata *conn, int sockindex);
-
 #ifdef CURL_DISABLE_VERBOSE_STRINGS
 #define Curl_verboseconnect(x)  Curl_nop_stmt
 #else
index a57d2e2..d14d53d 100644 (file)
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
  *
  ***************************************************************************/
 #include "curl_setup.h"
-/* scheme is not URL encoded, the longest libcurl supported ones are 6
-   letters */
-#define MAX_SCHEME_LEN 8
+/* scheme is not URL encoded, the longest libcurl supported ones are... */
+#define MAX_SCHEME_LEN 40
 
 bool Curl_is_absolute_url(const char *url, char *scheme, size_t buflen);
-char *Curl_concat_url(const char *base, const char *relurl);
-size_t Curl_strlen_url(const char *url, bool relative);
-void Curl_strcpy_url(char *output, const char *url, bool relative);
+
+#ifdef DEBUGBUILD
+CURLUcode Curl_parse_port(struct Curl_URL *u, char *hostname);
+#endif
+
 #endif /* HEADER_CURL_URLAPI_INT_H */
index c53e523..fa514bc 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -29,6 +29,7 @@
 #include "url.h"
 #include "escape.h"
 #include "curl_ctype.h"
+#include "inet_pton.h"
 
 /* The last 3 #include files should be in this order */
 #include "curl_printf.h"
@@ -56,12 +57,14 @@ struct Curl_URL {
   char *password;
   char *options; /* IMAP only? */
   char *host;
+  char *zoneid; /* for numerical IPv6 addresses */
   char *port;
   char *path;
   char *query;
   char *fragment;
 
   char *scratch; /* temporary scratch area */
+  char *temppath; /* temporary path pointer */
   long portnum; /* the numerical version */
 };
 
@@ -74,11 +77,13 @@ static void free_urlhandle(struct Curl_URL *u)
   free(u->password);
   free(u->options);
   free(u->host);
+  free(u->zoneid);
   free(u->port);
   free(u->path);
   free(u->query);
   free(u->fragment);
   free(u->scratch);
+  free(u->temppath);
 }
 
 /* move the full contents of one handle onto another and
@@ -135,7 +140,7 @@ static bool urlchar_needs_escaping(int c)
  * URL encoding should be skipped for host names, otherwise IDN resolution
  * will fail.
  */
-size_t Curl_strlen_url(const char *url, bool relative)
+static size_t strlen_url(const char *url, bool relative)
 {
   const unsigned char *ptr;
   size_t newlen = 0;
@@ -177,7 +182,7 @@ size_t Curl_strlen_url(const char *url, bool relative)
  * URL encoding should be skipped for host names, otherwise IDN resolution
  * will fail.
  */
-void Curl_strcpy_url(char *output, const char *url, bool relative)
+static void strcpy_url(char *output, const char *url, bool relative)
 {
   /* we must add this with whitespace-replacing */
   bool left = TRUE;
@@ -203,7 +208,7 @@ void Curl_strcpy_url(char *output, const char *url, bool relative)
       /* FALLTHROUGH */
     default:
       if(urlchar_needs_escaping(*iptr)) {
-        snprintf(optr, 4, "%%%02x", *iptr);
+        msnprintf(optr, 4, "%%%02x", *iptr);
         optr += 3;
       }
       else
@@ -238,7 +243,7 @@ bool Curl_is_absolute_url(const char *url, char *buf, size_t buflen)
 #endif
   for(i = 0; i < buflen && url[i]; ++i) {
     char s = url[i];
-    if(s == ':') {
+    if((s == ':') && (url[i + 1] == '/')) {
       if(buf)
         buf[i] = 0;
       return TRUE;
@@ -262,7 +267,7 @@ bool Curl_is_absolute_url(const char *url, char *buf, size_t buflen)
  * The returned pointer must be freed by the caller unless NULL
  * (returns NULL on out of memory).
  */
-char *Curl_concat_url(const char *base, const char *relurl)
+static char *concat_url(const char *base, const char *relurl)
 {
   /***
    TRY to append this new path to the old URL
@@ -348,7 +353,7 @@ char *Curl_concat_url(const char *base, const char *relurl)
   else {
     /* We got a new absolute path for this server */
 
-    if((relurl[0] == '/') && (relurl[1] == '/')) {
+    if(relurl[1] == '/') {
       /* the new URL starts with //, just keep the protocol part from the
          original one */
       *protsep = 0;
@@ -386,7 +391,7 @@ char *Curl_concat_url(const char *base, const char *relurl)
      letter we replace each space with %20 while it is replaced with '+'
      on the right side of the '?' letter.
   */
-  newlen = Curl_strlen_url(useurl, !host_changed);
+  newlen = strlen_url(useurl, !host_changed);
 
   urllen = strlen(url_clone);
 
@@ -408,7 +413,7 @@ char *Curl_concat_url(const char *base, const char *relurl)
     newest[urllen++]='/';
 
   /* then append the new piece on the right side */
-  Curl_strcpy_url(&newest[urllen], useurl, !host_changed);
+  strcpy_url(&newest[urllen], useurl, !host_changed);
 
   free(url_clone);
 
@@ -488,19 +493,40 @@ static CURLUcode parse_hostname_login(struct Curl_URL *u,
   return result;
 }
 
-static CURLUcode parse_port(struct Curl_URL *u, char *hostname)
+UNITTEST CURLUcode Curl_parse_port(struct Curl_URL *u, char *hostname)
 {
-  char *portptr;
+  char *portptr = NULL;
   char endbracket;
   int len;
 
-  if((1 == sscanf(hostname, "[%*45[0123456789abcdefABCDEF:.%%]%c%n",
-                  &endbracket, &len)) &&
-     (']' == endbracket)) {
-    /* this is a RFC2732-style specified IP-address */
-    portptr = &hostname[len];
-    if (*portptr != ':')
+  /*
+   * Find the end of an IPv6 address, either on the ']' ending bracket or
+   * a percent-encoded zone index.
+   */
+  if(1 == sscanf(hostname, "[%*45[0123456789abcdefABCDEF:.]%c%n",
+                 &endbracket, &len)) {
+    if(']' == endbracket)
+      portptr = &hostname[len];
+    else if('%' == endbracket) {
+      int zonelen = len;
+      if(1 == sscanf(hostname + zonelen, "%*[^]]%c%n", &endbracket, &len)) {
+        if(']' != endbracket)
+          return CURLUE_MALFORMED_INPUT;
+        portptr = &hostname[--zonelen + len + 1];
+      }
+      else
+        return CURLUE_MALFORMED_INPUT;
+    }
+    else
       return CURLUE_MALFORMED_INPUT;
+
+    /* this is a RFC2732-style specified IP-address */
+    if(portptr && *portptr) {
+      if(*portptr != ':')
+        return CURLUE_MALFORMED_INPUT;
+    }
+    else
+      portptr = NULL;
   }
   else
     portptr = strchr(hostname, ':');
@@ -510,6 +536,14 @@ static CURLUcode parse_port(struct Curl_URL *u, char *hostname)
     long port;
     char portbuf[7];
 
+    /* Browser behavior adaptation. If there's a colon with no digits after,
+       just cut off the name there which makes us ignore the colon and just
+       use the default port. Firefox, Chrome and Safari all do that. */
+    if(!portptr[1]) {
+      *portptr = '\0';
+      return CURLUE_OK;
+    }
+
     if(!ISDIGIT(portptr[1]))
       return CURLUE_BAD_PORT_NUMBER;
 
@@ -523,22 +557,14 @@ static CURLUcode parse_port(struct Curl_URL *u, char *hostname)
     if(rest[0])
       return CURLUE_BAD_PORT_NUMBER;
 
-    if(rest != &portptr[1]) {
-      *portptr++ = '\0'; /* cut off the name there */
-      *rest = 0;
-      /* generate a new to get rid of leading zeroes etc */
-      snprintf(portbuf, sizeof(portbuf), "%ld", port);
-      u->portnum = port;
-      u->port = strdup(portbuf);
-      if(!u->port)
-        return CURLUE_OUT_OF_MEMORY;
-    }
-    else {
-      /* Browser behavior adaptation. If there's a colon with no digits after,
-         just cut off the name there which makes us ignore the colon and just
-         use the default port. Firefox and Chrome both do that. */
-      *portptr = '\0';
-    }
+    *portptr++ = '\0'; /* cut off the name there */
+    *rest = 0;
+    /* generate a new port number string to get rid of leading zeroes etc */
+    msnprintf(portbuf, sizeof(portbuf), "%ld", port);
+    u->portnum = port;
+    u->port = strdup(portbuf);
+    if(!u->port)
+      return CURLUE_OUT_OF_MEMORY;
   }
 
   return CURLUE_OK;
@@ -547,15 +573,15 @@ static CURLUcode parse_port(struct Curl_URL *u, char *hostname)
 /* scan for byte values < 31 or 127 */
 static CURLUcode junkscan(char *part)
 {
-  char badbytes[]={
-    /* */ 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
-    0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
-    0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
-    0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
-    0x7f,
-    0x00 /* zero terminate */
-  };
   if(part) {
+    static const char badbytes[]={
+      /* */ 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
+      0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
+      0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
+      0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
+      0x7f,
+      0x00 /* zero terminate */
+    };
     size_t n = strlen(part);
     size_t nfine = strcspn(part, badbytes);
     if(nfine != n)
@@ -566,25 +592,57 @@ static CURLUcode junkscan(char *part)
   return CURLUE_OK;
 }
 
-static CURLUcode hostname_check(char *hostname, unsigned int flags)
+static CURLUcode hostname_check(struct Curl_URL *u, char *hostname)
 {
-  const char *l = NULL; /* accepted characters */
   size_t len;
   size_t hlen = strlen(hostname);
-  (void)flags;
 
   if(hostname[0] == '[') {
+#ifdef ENABLE_IPV6
+    char dest[16]; /* fits a binary IPv6 address */
+#endif
+    const char *l = "0123456789abcdefABCDEF:.";
+    if(hlen < 5) /* '[::1]' is the shortest possible valid string */
+      return CURLUE_MALFORMED_INPUT;
     hostname++;
-    l = "0123456789abcdefABCDEF::.%";
     hlen -= 2;
-  }
 
-  if(l) {
+    if(hostname[hlen] != ']')
+      return CURLUE_MALFORMED_INPUT;
+
     /* only valid letters are ok */
     len = strspn(hostname, l);
-    if(hlen != len)
-      /* hostname with bad content */
+    if(hlen != len) {
+      hlen = len;
+      if(hostname[len] == '%') {
+        /* this could now be '%[zone id]' */
+        char zoneid[16];
+        int i = 0;
+        char *h = &hostname[len + 1];
+        /* pass '25' if present and is a url encoded percent sign */
+        if(!strncmp(h, "25", 2) && h[2] && (h[2] != ']'))
+          h += 2;
+        while(*h && (*h != ']') && (i < 15))
+          zoneid[i++] = *h++;
+        if(!i || (']' != *h))
+          return CURLUE_MALFORMED_INPUT;
+        zoneid[i] = 0;
+        u->zoneid = strdup(zoneid);
+        if(!u->zoneid)
+          return CURLUE_OUT_OF_MEMORY;
+        hostname[len] = ']'; /* insert end bracket */
+        hostname[len + 1] = 0; /* terminate the hostname */
+      }
+      else
+        return CURLUE_MALFORMED_INPUT;
+      /* hostname is fine */
+    }
+#ifdef ENABLE_IPV6
+    hostname[hlen] = 0; /* end the address there */
+    if(1 != Curl_inet_pton(AF_INET6, hostname, dest))
       return CURLUE_MALFORMED_INPUT;
+    hostname[hlen] = ']'; /* restore ending bracket */
+#endif
   }
   else {
     /* letters from the second string is not ok */
@@ -593,6 +651,8 @@ static CURLUcode hostname_check(char *hostname, unsigned int flags)
       /* hostname with bad content */
       return CURLUE_MALFORMED_INPUT;
   }
+  if(!hostname[0])
+    return CURLUE_NO_HOST;
   return CURLUE_OK;
 }
 
@@ -607,7 +667,7 @@ static CURLUcode seturl(const char *url, CURLU *u, unsigned int flags)
   char *fragment = NULL;
   CURLUcode result;
   bool url_has_scheme = FALSE;
-  char schemebuf[MAX_SCHEME_LEN];
+  char schemebuf[MAX_SCHEME_LEN + 1];
   char *schemep = NULL;
   size_t schemelen = 0;
   size_t urllen;
@@ -621,6 +681,10 @@ static CURLUcode seturl(const char *url, CURLU *u, unsigned int flags)
    ************************************************************/
   /* allocate scratch area */
   urllen = strlen(url);
+  if(urllen > CURL_MAX_INPUT_LENGTH)
+    /* excessive input length */
+    return CURLUE_MALFORMED_INPUT;
+
   path = u->scratch = malloc(urllen * 2 + 2);
   if(!path)
     return CURLUE_OUT_OF_MEMORY;
@@ -726,6 +790,7 @@ static CURLUcode seturl(const char *url, CURLU *u, unsigned int flags)
 
       if(junkscan(schemep))
         return CURLUE_MALFORMED_INPUT;
+
     }
     else {
       /* no scheme! */
@@ -746,11 +811,14 @@ static CURLUcode seturl(const char *url, CURLU *u, unsigned int flags)
       p++;
 
     len = p - hostp;
-    if(!len)
-      return CURLUE_MALFORMED_INPUT;
-
-    memcpy(hostname, hostp, len);
-    hostname[len] = 0;
+    if(len) {
+      memcpy(hostname, hostp, len);
+      hostname[len] = 0;
+    }
+    else {
+      if(!(flags & CURLU_NO_AUTHORITY))
+        return CURLUE_MALFORMED_INPUT;
+    }
 
     if((flags & CURLU_GUESS_SCHEME) && !schemep) {
       /* legacy curl-style guess based on host name */
@@ -785,35 +853,60 @@ static CURLUcode seturl(const char *url, CURLU *u, unsigned int flags)
   if(junkscan(path))
     return CURLUE_MALFORMED_INPUT;
 
-  query = strchr(path, '?');
-  if(query)
-    *query++ = 0;
+  if((flags & CURLU_URLENCODE) && path[0]) {
+    /* worst case output length is 3x the original! */
+    char *newp = malloc(strlen(path) * 3);
+    if(!newp)
+      return CURLUE_OUT_OF_MEMORY;
+    path_alloced = TRUE;
+    strcpy_url(newp, path, TRUE); /* consider it relative */
+    u->temppath = path = newp;
+  }
 
-  fragment = strchr(query?query:path, '#');
-  if(fragment)
+  fragment = strchr(path, '#');
+  if(fragment) {
     *fragment++ = 0;
+    if(fragment[0]) {
+      u->fragment = strdup(fragment);
+      if(!u->fragment)
+        return CURLUE_OUT_OF_MEMORY;
+    }
+  }
+
+  query = strchr(path, '?');
+  if(query) {
+    *query++ = 0;
+    /* done even if the query part is a blank string */
+    u->query = strdup(query);
+    if(!u->query)
+      return CURLUE_OUT_OF_MEMORY;
+  }
 
   if(!path[0])
-    /* if there's no path set, unset */
+    /* if there's no path left set, unset */
     path = NULL;
-  else if(!(flags & CURLU_PATH_AS_IS)) {
-    /* sanitise paths and remove ../ and ./ sequences according to RFC3986 */
-    char *newp = Curl_dedotdotify(path);
-    if(!newp)
-      return CURLUE_OUT_OF_MEMORY;
+  else {
+    if(!(flags & CURLU_PATH_AS_IS)) {
+      /* remove ../ and ./ sequences according to RFC3986 */
+      char *newp = Curl_dedotdotify(path);
+      if(!newp)
+        return CURLUE_OUT_OF_MEMORY;
 
-    if(strcmp(newp, path)) {
-      /* if we got a new version */
-      path = newp;
-      path_alloced = TRUE;
+      if(strcmp(newp, path)) {
+        /* if we got a new version */
+        if(path_alloced)
+          Curl_safefree(u->temppath);
+        u->temppath = path = newp;
+        path_alloced = TRUE;
+      }
+      else
+        free(newp);
     }
-    else
-      free(newp);
-  }
-  if(path) {
+
     u->path = path_alloced?path:strdup(path);
     if(!u->path)
       return CURLUE_OUT_OF_MEMORY;
+    u->temppath = NULL; /* used now */
   }
 
   if(hostname) {
@@ -827,32 +920,26 @@ static CURLUcode seturl(const char *url, CURLU *u, unsigned int flags)
     if(result)
       return result;
 
-    result = parse_port(u, hostname);
+    result = Curl_parse_port(u, hostname);
     if(result)
       return result;
 
-    result = hostname_check(hostname, flags);
-    if(result)
-      return result;
+    if(0 == strlen(hostname) && (flags & CURLU_NO_AUTHORITY)) {
+      /* Skip hostname check, it's allowed to be empty. */
+    }
+    else {
+      result = hostname_check(u, hostname);
+      if(result)
+        return result;
+    }
 
     u->host = strdup(hostname);
     if(!u->host)
       return CURLUE_OUT_OF_MEMORY;
   }
 
-  if(query && query[0]) {
-    u->query = strdup(query);
-    if(!u->query)
-      return CURLUE_OUT_OF_MEMORY;
-  }
-  if(fragment && fragment[0]) {
-    u->fragment = strdup(fragment);
-    if(!u->fragment)
-      return CURLUE_OUT_OF_MEMORY;
-  }
-
-  free(u->scratch);
-  u->scratch = NULL;
+  Curl_safefree(u->scratch);
+  Curl_safefree(u->temppath);
 
   return CURLUE_OK;
 }
@@ -950,6 +1037,9 @@ CURLUcode curl_url_get(CURLU *u, CURLUPart what,
     ptr = u->host;
     ifmissing = CURLUE_NO_HOST;
     break;
+  case CURLUPART_ZONEID:
+    ptr = u->zoneid;
+    break;
   case CURLUPART_PORT:
     ptr = u->port;
     ifmissing = CURLUE_NO_PORT;
@@ -960,7 +1050,7 @@ CURLUcode curl_url_get(CURLU *u, CURLUPart what,
       const struct Curl_handler *h =
         Curl_builtin_scheme(u->scheme);
       if(h) {
-        snprintf(portbuf, sizeof(portbuf), "%ld", h->defport);
+        msnprintf(portbuf, sizeof(portbuf), "%ld", h->defport);
         ptr = portbuf;
       }
     }
@@ -996,6 +1086,7 @@ CURLUcode curl_url_get(CURLU *u, CURLUPart what,
     char *scheme;
     char *options = u->options;
     char *port = u->port;
+    char *allochost = NULL;
     if(u->scheme && strcasecompare("file", u->scheme)) {
       url = aprintf("file://%s%s%s",
                     u->path,
@@ -1013,27 +1104,38 @@ CURLUcode curl_url_get(CURLU *u, CURLUPart what,
       else
         return CURLUE_NO_SCHEME;
 
-      if(scheme) {
-        h = Curl_builtin_scheme(scheme);
-        if(!port && (flags & CURLU_DEFAULT_PORT)) {
-          /* there's no stored port number, but asked to deliver
-             a default one for the scheme */
-          if(h) {
-            snprintf(portbuf, sizeof(portbuf), "%ld", h->defport);
-            port = portbuf;
-          }
-        }
-        else if(port) {
-          /* there is a stored port number, but asked to inhibit if it matches
-             the default one for the scheme */
-          if(h && (h->defport == u->portnum) &&
-             (flags & CURLU_NO_DEFAULT_PORT))
-            port = NULL;
+      h = Curl_builtin_scheme(scheme);
+      if(!port && (flags & CURLU_DEFAULT_PORT)) {
+        /* there's no stored port number, but asked to deliver
+           a default one for the scheme */
+        if(h) {
+          msnprintf(portbuf, sizeof(portbuf), "%ld", h->defport);
+          port = portbuf;
         }
       }
+      else if(port) {
+        /* there is a stored port number, but asked to inhibit if it matches
+           the default one for the scheme */
+        if(h && (h->defport == u->portnum) &&
+           (flags & CURLU_NO_DEFAULT_PORT))
+          port = NULL;
+      }
+
       if(h && !(h->flags & PROTOPT_URLOPTIONS))
         options = NULL;
 
+      if((u->host[0] == '[') && u->zoneid) {
+        /* make it '[ host %25 zoneid ]' */
+        size_t hostlen = strlen(u->host);
+        size_t alen = hostlen + 3 + strlen(u->zoneid) + 1;
+        allochost = malloc(alen);
+        if(!allochost)
+          return CURLUE_OUT_OF_MEMORY;
+        memcpy(allochost, u->host, hostlen - 1);
+        msnprintf(&allochost[hostlen - 1], alen - hostlen + 1,
+                  "%%25%s]", u->zoneid);
+      }
+
       url = aprintf("%s://%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s",
                     scheme,
                     u->user ? u->user : "",
@@ -1042,24 +1144,25 @@ CURLUcode curl_url_get(CURLU *u, CURLUPart what,
                     options ? ";" : "",
                     options ? options : "",
                     (u->user || u->password || options) ? "@": "",
-                    u->host,
+                    allochost ? allochost : u->host,
                     port ? ":": "",
                     port ? port : "",
                     (u->path && (u->path[0] != '/')) ? "/": "",
                     u->path ? u->path : "/",
-                    u->query? "?": "",
-                    u->query? u->query : "",
+                    (u->query && u->query[0]) ? "?": "",
+                    (u->query && u->query[0]) ? u->query : "",
                     u->fragment? "#": "",
                     u->fragment? u->fragment : "");
+      free(allochost);
     }
     if(!url)
       return CURLUE_OUT_OF_MEMORY;
     *part = url;
     return CURLUE_OK;
-    break;
   }
   default:
     ptr = NULL;
+    break;
   }
   if(ptr) {
     *part = strdup(ptr);
@@ -1099,6 +1202,7 @@ CURLUcode curl_url_set(CURLU *u, CURLUPart what,
   bool plusencode = FALSE;
   bool urlskipslash = FALSE;
   bool appendquery = FALSE;
+  bool equalsencode = FALSE;
 
   if(!u)
     return CURLUE_BAD_HANDLE;
@@ -1122,7 +1226,11 @@ CURLUcode curl_url_set(CURLU *u, CURLUPart what,
     case CURLUPART_HOST:
       storep = &u->host;
       break;
+    case CURLUPART_ZONEID:
+      storep = &u->zoneid;
+      break;
     case CURLUPART_PORT:
+      u->portnum = 0;
       storep = &u->port;
       break;
     case CURLUPART_PATH:
@@ -1146,6 +1254,9 @@ CURLUcode curl_url_set(CURLU *u, CURLUPart what,
 
   switch(what) {
   case CURLUPART_SCHEME:
+    if(strlen(part) > MAX_SCHEME_LEN)
+      /* too long */
+      return CURLUE_MALFORMED_INPUT;
     if(!(flags & CURLU_NON_SUPPORT_SCHEME) &&
        /* verify that it is a fine scheme */
        !Curl_builtin_scheme(part))
@@ -1164,14 +1275,25 @@ CURLUcode curl_url_set(CURLU *u, CURLUPart what,
     break;
   case CURLUPART_HOST:
     storep = &u->host;
+    free(u->zoneid);
+    u->zoneid = NULL;
+    break;
+  case CURLUPART_ZONEID:
+    storep = &u->zoneid;
     break;
   case CURLUPART_PORT:
+  {
+    char *endp;
     urlencode = FALSE; /* never */
-    port = strtol(part, NULL, 10);  /* Port number must be decimal */
+    port = strtol(part, &endp, 10);  /* Port number must be decimal */
     if((port <= 0) || (port > 0xffff))
       return CURLUE_BAD_PORT_NUMBER;
+    if(*endp)
+      /* weirdly provided number, not good! */
+      return CURLUE_MALFORMED_INPUT;
     storep = &u->port;
-    break;
+  }
+  break;
   case CURLUPART_PATH:
     urlskipslash = TRUE;
     storep = &u->path;
@@ -1179,6 +1301,7 @@ CURLUcode curl_url_set(CURLU *u, CURLUPart what,
   case CURLUPART_QUERY:
     plusencode = urlencode;
     appendquery = (flags & CURLU_APPENDQUERY)?1:0;
+    equalsencode = appendquery;
     storep = &u->query;
     break;
   case CURLUPART_FRAGMENT:
@@ -1196,7 +1319,7 @@ CURLUcode curl_url_set(CURLU *u, CURLUPart what,
     char *redired_url;
     CURLU *handle2;
 
-    if(Curl_is_absolute_url(part, NULL, MAX_SCHEME_LEN)) {
+    if(Curl_is_absolute_url(part, NULL, MAX_SCHEME_LEN + 1)) {
       handle2 = curl_url();
       if(!handle2)
         return CURLUE_OUT_OF_MEMORY;
@@ -1223,7 +1346,7 @@ CURLUcode curl_url_set(CURLU *u, CURLUPart what,
     }
 
     /* apply the relative part to create a new URL */
-    redired_url = Curl_concat_url(oldurl, part);
+    redired_url = concat_url(oldurl, part);
     free(oldurl);
     if(!redired_url)
       return CURLUE_OUT_OF_MEMORY;
@@ -1245,12 +1368,17 @@ CURLUcode curl_url_set(CURLU *u, CURLUPart what,
   default:
     return CURLUE_UNKNOWN_PART;
   }
-  if(storep) {
+  DEBUGASSERT(storep);
+  {
     const char *newp = part;
     size_t nalloc = strlen(part);
 
+    if(nalloc > CURL_MAX_INPUT_LENGTH)
+      /* excessive input length */
+      return CURLUE_MALFORMED_INPUT;
+
     if(urlencode) {
-      const char *i;
+      const unsigned char *i;
       char *o;
       bool free_part = FALSE;
       char *enc = malloc(nalloc * 3 + 1); /* for worst case! */
@@ -1258,7 +1386,7 @@ CURLUcode curl_url_set(CURLU *u, CURLUPart what,
         return CURLUE_OUT_OF_MEMORY;
       if(plusencode) {
         /* space to plus */
-        i = part;
+        i = (const unsigned char *)part;
         for(o = enc; *i; ++o, ++i)
           *o = (*i == ' ') ? '+' : *i;
         *o = 0; /* zero terminate */
@@ -1269,16 +1397,19 @@ CURLUcode curl_url_set(CURLU *u, CURLUPart what,
         }
         free_part = TRUE;
       }
-      for(i = part, o = enc; *i; i++) {
+      for(i = (const unsigned char *)part, o = enc; *i; i++) {
         if(Curl_isunreserved(*i) ||
            ((*i == '/') && urlskipslash) ||
-           ((*i == '=') && appendquery) ||
+           ((*i == '=') && equalsencode) ||
            ((*i == '+') && plusencode)) {
+          if((*i == '=') && equalsencode)
+            /* only skip the first equals sign */
+            equalsencode = FALSE;
           *o = *i;
           o++;
         }
         else {
-          snprintf(o, 4, "%%%02x", *i);
+          msnprintf(o, 4, "%%%02x", *i);
           o += 3;
         }
       }
@@ -1329,6 +1460,18 @@ CURLUcode curl_url_set(CURLU *u, CURLUPart what,
       }
     }
 
+    if(what == CURLUPART_HOST) {
+      if(0 == strlen(newp) && (flags & CURLU_NO_AUTHORITY)) {
+        /* Skip hostname check, it's allowed to be empty. */
+      }
+      else {
+        if(hostname_check(u, (char *)newp)) {
+          free((char *)newp);
+          return CURLUE_MALFORMED_INPUT;
+        }
+      }
+    }
+
     free(*storep);
     *storep = (char *)newp;
   }
index 11a6a22..3effb16 100644 (file)
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -68,6 +68,7 @@
 #define PROTO_FAMILY_POP3 (CURLPROTO_POP3|CURLPROTO_POP3S)
 #define PROTO_FAMILY_SMB  (CURLPROTO_SMB|CURLPROTO_SMBS)
 #define PROTO_FAMILY_SMTP (CURLPROTO_SMTP|CURLPROTO_SMTPS)
+#define PROTO_FAMILY_SSH  (CURLPROTO_SCP|CURLPROTO_SFTP)
 
 #define DEFAULT_CONNCACHE_SIZE 5
 
 /* Default FTP/IMAP etc response timeout in milliseconds.
    Symbian OS panics when given a timeout much greater than 1/2 hour.
 */
-#define RESP_TIMEOUT (1800*1000)
+#define RESP_TIMEOUT (120*1000)
+
+/* Max string intput length is a precaution against abuse and to detect junk
+   input easier and better. */
+#define CURL_MAX_INPUT_LENGTH 8000000
 
 #include "cookie.h"
 #include "psl.h"
@@ -119,22 +124,25 @@ typedef ssize_t (Curl_recv)(struct connectdata *conn, /* connection data */
 #include "smtp.h"
 #include "ftp.h"
 #include "file.h"
-#include "ssh.h"
+#include "vssh/ssh.h"
 #include "http.h"
 #include "rtsp.h"
 #include "smb.h"
 #include "wildcard.h"
 #include "multihandle.h"
+#include "quic.h"
 
 #ifdef HAVE_GSSAPI
 # ifdef HAVE_GSSGNU
 #  include <gss.h>
-# elif defined HAVE_GSSMIT
+# elif defined HAVE_GSSAPI_GSSAPI_H
 #  include <gssapi/gssapi.h>
-#  include <gssapi/gssapi_generic.h>
 # else
 #  include <gssapi.h>
 # endif
+# ifdef HAVE_GSSAPI_GSSAPI_GENERIC_H
+#  include <gssapi/gssapi_generic.h>
+# endif
 #endif
 
 #ifdef HAVE_LIBSSH2_H
@@ -142,10 +150,6 @@ typedef ssize_t (Curl_recv)(struct connectdata *conn, /* connection data */
 #include <libssh2_sftp.h>
 #endif /* HAVE_LIBSSH2_H */
 
-
-/* The "master buffer" is for HTTP pipelining */
-#define MASTERBUF_SIZE 16384
-
 /* Initial size of the buffer to store headers in, it'll be enlarged in case
    of need. */
 #define HEADERSIZE 256
@@ -154,13 +158,22 @@ typedef ssize_t (Curl_recv)(struct connectdata *conn, /* connection data */
 #define GOOD_EASY_HANDLE(x) \
   ((x) && ((x)->magic == CURLEASY_MAGIC_NUMBER))
 
+/* the type we use for storing a single boolean bit */
+#ifdef _MSC_VER
+typedef bool bit;
+#define BIT(x) bool x
+#else
+typedef unsigned int bit;
+#define BIT(x) bit x:1
+#endif
+
 #ifdef HAVE_GSSAPI
 /* Types needed for krb5-ftp connections */
 struct krb5buffer {
   void *data;
   size_t size;
   size_t index;
-  int eof_flag;
+  BIT(eof_flag);
 };
 
 enum protection_level {
@@ -198,21 +211,17 @@ struct ssl_connect_data {
   /* Use ssl encrypted communications TRUE/FALSE, not necessarily using it atm
      but at least asked to or meaning to use it. See 'state' for the exact
      current state of the connection. */
-  bool use;
   ssl_connection_state state;
   ssl_connect_state connecting_state;
 #if defined(USE_SSL)
   struct ssl_backend_data *backend;
 #endif
+  BIT(use);
 };
 
 struct ssl_primary_config {
   long version;          /* what version the client wants to use */
   long version_max;      /* max supported version the client wants to use*/
-  bool verifypeer;       /* set TRUE if this is desired */
-  bool verifyhost;       /* set TRUE if CN/SAN must match hostname */
-  bool verifystatus;     /* set TRUE if certificate status must be checked */
-  bool sessionid;        /* cache session IDs or not */
   char *CApath;          /* certificate dir (doesn't work on windows) */
   char *CAfile;          /* certificate to verify peer against */
   char *clientcert;
@@ -220,32 +229,35 @@ struct ssl_primary_config {
   char *egdsocket;       /* path to file containing the EGD daemon socket */
   char *cipher_list;     /* list of ciphers to use */
   char *cipher_list13;   /* list of TLS 1.3 cipher suites to use */
+  char *pinned_key;
+  BIT(verifypeer);       /* set TRUE if this is desired */
+  BIT(verifyhost);       /* set TRUE if CN/SAN must match hostname */
+  BIT(verifystatus);     /* set TRUE if certificate status must be checked */
+  BIT(sessionid);        /* cache session IDs or not */
 };
 
 struct ssl_config_data {
   struct ssl_primary_config primary;
-  bool enable_beast; /* especially allow this flaw for interoperability's
-                        sake*/
-  bool no_revoke;    /* disable SSL certificate revocation checks */
   long certverifyresult; /* result from the certificate verification */
   char *CRLfile;   /* CRL to check certificate revocation */
   char *issuercert;/* optional issuer certificate filename */
   curl_ssl_ctx_callback fsslctx; /* function to initialize ssl ctx */
   void *fsslctxp;        /* parameter for call back */
-  bool certinfo;         /* gather lots of certificate info */
-  bool falsestart;
-
   char *cert; /* client certificate file name */
   char *cert_type; /* format for certificate (default: PEM)*/
   char *key; /* private key file name */
   char *key_type; /* format for private key (default: PEM) */
   char *key_passwd; /* plain text private key password */
-
 #ifdef USE_TLS_SRP
   char *username; /* TLS username (for, e.g., SRP) */
   char *password; /* TLS password (for, e.g., SRP) */
   enum CURL_TLSAUTH authtype; /* TLS authentication type (default SRP) */
 #endif
+  BIT(certinfo);     /* gather lots of certificate info */
+  BIT(falsestart);
+  BIT(enable_beast); /* allow this flaw for interoperability's sake*/
+  BIT(no_revoke);    /* disable SSL certificate revocation checks */
+  BIT(no_partialchain); /* don't accept partial certificate chains */
 };
 
 struct ssl_general_config {
@@ -284,12 +296,12 @@ struct digestdata {
   char *cnonce;
   char *realm;
   int algo;
-  bool stale; /* set true for re-negotiation */
   char *opaque;
   char *qop;
   char *algorithm;
   int nc; /* nounce count */
-  bool userhash;
+  BIT(stale); /* set true for re-negotiation */
+  BIT(userhash);
 #endif
 };
 
@@ -301,6 +313,14 @@ typedef enum {
   NTLMSTATE_LAST
 } curlntlm;
 
+typedef enum {
+  GSS_AUTHNONE,
+  GSS_AUTHRECV,
+  GSS_AUTHSENT,
+  GSS_AUTHDONE,
+  GSS_AUTHSUCC
+} curlnegotiate;
+
 #if defined(CURL_DOES_CONVERSIONS) && defined(HAVE_ICONV)
 #include <iconv.h>
 #endif
@@ -326,8 +346,13 @@ struct kerberos5data {
 /* Struct used for NTLM challenge-response authentication */
 #if defined(USE_NTLM)
 struct ntlmdata {
-  curlntlm state;
 #ifdef USE_WINDOWS_SSPI
+/* The sslContext is used for the Schannel bindings. The
+ * api is available on the Windows 7 SDK and later.
+ */
+#ifdef SECPKG_ATTR_ENDPOINT_BINDINGS
+  CtxtHandle *sslContext;
+#endif
   CredHandle *credentials;
   CtxtHandle *context;
   SEC_WINNT_AUTH_IDENTITY identity;
@@ -346,11 +371,9 @@ struct ntlmdata {
 };
 #endif
 
+/* Struct used for Negotiate (SPNEGO) authentication */
 #ifdef USE_SPNEGO
 struct negotiatedata {
-  /* When doing Negotiate (SPNEGO) auth, we first need to send a token
-     and then validate the received one. */
-  enum { GSS_AUTHNONE, GSS_AUTHRECV, GSS_AUTHSENT } state;
 #ifdef HAVE_GSSAPI
   OM_uint32 status;
   gss_ctx_id_t context;
@@ -358,6 +381,9 @@ struct negotiatedata {
   gss_buffer_desc output_token;
 #else
 #ifdef USE_WINDOWS_SSPI
+#ifdef SECPKG_ATTR_ENDPOINT_BINDINGS
+  CtxtHandle *sslContext;
+#endif
   DWORD status;
   CredHandle *credentials;
   CtxtHandle *context;
@@ -369,6 +395,10 @@ struct negotiatedata {
   size_t output_token_length;
 #endif
 #endif
+  BIT(noauthpersist);
+  BIT(havenoauthpersist);
+  BIT(havenegdata);
+  BIT(havemultiplerequests);
 };
 #endif
 
@@ -378,69 +408,68 @@ struct negotiatedata {
  */
 struct ConnectBits {
   /* always modify bits.close with the connclose() and connkeep() macros! */
-  bool close; /* if set, we close the connection after this request */
-  bool reuse; /* if set, this is a re-used connection */
-  bool conn_to_host; /* if set, this connection has a "connect to host"
+  bool proxy_ssl_connected[2]; /* TRUE when SSL initialization for HTTPS proxy
+                                  is complete */
+  bool tcpconnect[2]; /* the TCP layer (or similar) is connected, this is set
+                         the first time on the first connect function call */
+  BIT(close); /* if set, we close the connection after this request */
+  BIT(reuse); /* if set, this is a re-used connection */
+  BIT(altused); /* this is an alt-svc "redirect" */
+  BIT(conn_to_host); /* if set, this connection has a "connect to host"
                         that overrides the host in the URL */
-  bool conn_to_port; /* if set, this connection has a "connect to port"
+  BIT(conn_to_port); /* if set, this connection has a "connect to port"
                         that overrides the port in the URL (remote port) */
-  bool proxy; /* if set, this transfer is done through a proxy - any type */
-  bool httpproxy;    /* if set, this transfer is done through a http proxy */
-  bool socksproxy;   /* if set, this transfer is done through a socks proxy */
-  bool user_passwd;    /* do we use user+password for this connection? */
-  bool proxy_user_passwd; /* user+password for the proxy? */
-  bool ipv6_ip; /* we communicate with a remote site specified with pure IPv6
+  BIT(proxy); /* if set, this transfer is done through a proxy - any type */
+  BIT(httpproxy);  /* if set, this transfer is done through a http proxy */
+  BIT(socksproxy); /* if set, this transfer is done through a socks proxy */
+  BIT(user_passwd); /* do we use user+password for this connection? */
+  BIT(proxy_user_passwd); /* user+password for the proxy? */
+  BIT(ipv6_ip); /* we communicate with a remote site specified with pure IPv6
                    IP address */
-  bool ipv6;    /* we communicate with a site using an IPv6 address */
-
-  bool do_more; /* this is set TRUE if the ->curl_do_more() function is
+  BIT(ipv6);    /* we communicate with a site using an IPv6 address */
+  BIT(do_more); /* this is set TRUE if the ->curl_do_more() function is
                    supposed to be called, after ->curl_do() */
-  bool tcpconnect[2]; /* the TCP layer (or similar) is connected, this is set
-                         the first time on the first connect function call */
-  bool protoconnstart;/* the protocol layer has STARTED its operation after
+  BIT(protoconnstart);/* the protocol layer has STARTED its operation after
                          the TCP layer connect */
-
-  bool retry;         /* this connection is about to get closed and then
+  BIT(retry);         /* this connection is about to get closed and then
                          re-attempted at another connection. */
-  bool tunnel_proxy;  /* if CONNECT is used to "tunnel" through the proxy.
+  BIT(tunnel_proxy);  /* if CONNECT is used to "tunnel" through the proxy.
                          This is implicit when SSL-protocols are used through
                          proxies, but can also be enabled explicitly by
                          apps */
-  bool authneg;       /* TRUE when the auth phase has started, which means
+  BIT(authneg);       /* TRUE when the auth phase has started, which means
                          that we are creating a request with an auth header,
                          but it is not the final request in the auth
                          negotiation. */
-  bool rewindaftersend;/* TRUE when the sending couldn't be stopped even
+  BIT(rewindaftersend);/* TRUE when the sending couldn't be stopped even
                           though it will be discarded. When the whole send
                           operation is done, we must call the data rewind
                           callback. */
-  bool ftp_use_epsv;  /* As set with CURLOPT_FTP_USE_EPSV, but if we find out
+#ifndef CURL_DISABLE_FTP
+  BIT(ftp_use_epsv);  /* As set with CURLOPT_FTP_USE_EPSV, but if we find out
                          EPSV doesn't work we disable it for the forthcoming
                          requests */
-
-  bool ftp_use_eprt;  /* As set with CURLOPT_FTP_USE_EPRT, but if we find out
+  BIT(ftp_use_eprt);  /* As set with CURLOPT_FTP_USE_EPRT, but if we find out
                          EPRT doesn't work we disable it for the forthcoming
                          requests */
-  bool ftp_use_data_ssl; /* Enabled SSL for the data connection */
-  bool netrc;         /* name+password provided by netrc */
-  bool userpwd_in_url; /* name+password found in url */
-  bool stream_was_rewound; /* Indicates that the stream was rewound after a
-                              request read past the end of its response byte
-                              boundary */
-  bool proxy_connect_closed; /* set true if a proxy disconnected the
-                                connection in a CONNECT request with auth, so
-                                that libcurl should reconnect and continue. */
-  bool bound; /* set true if bind() has already been done on this socket/
+  BIT(ftp_use_data_ssl); /* Enabled SSL for the data connection */
+#endif
+  BIT(netrc);         /* name+password provided by netrc */
+  BIT(userpwd_in_url); /* name+password found in url */
+  BIT(stream_was_rewound); /* The stream was rewound after a request read
+                              past the end of its response byte boundary */
+  BIT(proxy_connect_closed); /* TRUE if a proxy disconnected the connection
+                                in a CONNECT request with auth, so that
+                                libcurl should reconnect and continue. */
+  BIT(bound); /* set true if bind() has already been done on this socket/
                  connection */
-  bool type_set;  /* type= was used in the URL */
-  bool multiplex; /* connection is multiplexed */
-
-  bool tcp_fastopen; /* use TCP Fast Open */
-  bool tls_enable_npn;  /* TLS NPN extension? */
-  bool tls_enable_alpn; /* TLS ALPN extension? */
-  bool proxy_ssl_connected[2]; /* TRUE when SSL initialization for HTTPS proxy
-                                  is complete */
-  bool socksproxy_connecting; /* connecting through a socks proxy */
+  BIT(type_set);  /* type= was used in the URL */
+  BIT(multiplex); /* connection is multiplexed */
+  BIT(tcp_fastopen); /* use TCP Fast Open */
+  BIT(tls_enable_npn);  /* TLS NPN extension? */
+  BIT(tls_enable_alpn); /* TLS ALPN extension? */
+  BIT(socksproxy_connecting); /* connecting through a socks proxy */
+  BIT(connect_only);
 };
 
 struct hostname {
@@ -467,14 +496,13 @@ struct hostname {
 #define KEEP_RECVBITS (KEEP_RECV | KEEP_RECV_HOLD | KEEP_RECV_PAUSE)
 #define KEEP_SENDBITS (KEEP_SEND | KEEP_SEND_HOLD | KEEP_SEND_PAUSE)
 
-
 struct Curl_async {
   char *hostname;
   int port;
   struct Curl_dns_entry *dns;
-  bool done;  /* set TRUE when the lookup is complete */
   int status; /* if done is TRUE, this is the status from the callback */
   void *os_specific;  /* 'struct thread_data' for Windows */
+  BIT(done);  /* set TRUE when the lookup is complete */
 };
 
 #define FIRSTSOCKET     0
@@ -501,6 +529,24 @@ enum upgrade101 {
   UPGR101_WORKING             /* talking upgraded protocol */
 };
 
+enum doh_slots {
+  /* Explicit values for first two symbols so as to match hard-coded
+   * constants in existing code
+   */
+  DOH_PROBE_SLOT_IPADDR_V4 = 0, /* make 'V4' stand out for readability */
+  DOH_PROBE_SLOT_IPADDR_V6 = 1, /* 'V6' likewise */
+
+  /* Space here for (possibly build-specific) additional slot definitions */
+
+  /* for example */
+  /* #ifdef WANT_DOH_FOOBAR_TXT */
+  /*   DOH_PROBE_SLOT_FOOBAR_TXT, */
+  /* #endif */
+
+  /* AFTER all slot definitions, establish how many we have */
+  DOH_PROBE_SLOTS
+};
+
 struct dohresponse {
   unsigned char *memory;
   size_t size;
@@ -517,7 +563,7 @@ struct dnsprobe {
 
 struct dohdata {
   struct curl_slist *headers;
-  struct dnsprobe probe[2];
+  struct dnsprobe probe[DOH_PROBE_SLOTS];
   unsigned int pending; /* still outstanding requests */
   const char *host;
   int port;
@@ -532,25 +578,21 @@ struct dohdata {
  */
 struct SingleRequest {
   curl_off_t size;        /* -1 if unknown at this point */
-  curl_off_t *bytecountp; /* return number of bytes read or NULL */
-
   curl_off_t maxdownload; /* in bytes, the maximum amount of data to fetch,
                              -1 means unlimited */
-  curl_off_t *writebytecountp; /* return number of bytes written or NULL */
-
   curl_off_t bytecount;         /* total number of bytes read */
   curl_off_t writebytecount;    /* number of bytes written */
 
-  long headerbytecount;         /* only count received headers */
-  long deductheadercount; /* this amount of bytes doesn't count when we check
-                             if anything has been transferred at the end of a
-                             connection. We use this counter to make only a
-                             100 reply (without a following second response
-                             code) result in a CURLE_GOT_NOTHING error code */
+  curl_off_t headerbytecount;   /* only count received headers */
+  curl_off_t deductheadercount; /* this amount of bytes doesn't count when we
+                                   check if anything has been transferred at
+                                   the end of a connection. We use this
+                                   counter to make only a 100 reply (without a
+                                   following second response code) result in a
+                                   CURLE_GOT_NOTHING error code */
 
   struct curltime start;         /* transfer started at this time */
   struct curltime now;           /* current time */
-  bool header;                  /* incoming data has HTTP header */
   enum {
     HEADER_NORMAL,              /* no bad header at all */
     HEADER_PARTHEADER,          /* part of the chunk is a bad header, the rest
@@ -566,7 +608,6 @@ struct SingleRequest {
   char *str_start;              /* within buf */
   char *end_ptr;                /* within buf */
   char *p;                      /* within headerbuff */
-  bool content_range;           /* set TRUE if Content-Range: was found */
   curl_off_t offset;            /* possible resume offset read from the
                                    Content-Range: header */
   int httpcode;                 /* error code from the 'HTTP/1.? XXX' or
@@ -579,19 +620,8 @@ struct SingleRequest {
                                           /* See sec 3.5, RFC2616. */
   time_t timeofdoc;
   long bodywrites;
-
   char *buf;
-  curl_socket_t maxfd;
-
   int keepon;
-
-  bool upload_done; /* set to TRUE when doing chunked transfer-encoding upload
-                       and we're uploading the last chunk */
-
-  bool ignorebody;  /* we read a response-body but we ignore it! */
-  bool ignorecl;    /* This HTTP response has no body so we ignore the Content-
-                       Length: header */
-
   char *location;   /* This points to an allocated version of the Location:
                        header data */
   char *newurl;     /* Set to the new URL to use when a redirect or a retry is
@@ -601,24 +631,30 @@ struct SingleRequest {
      still left in the buffer, aimed for upload. */
   ssize_t upload_present;
 
-   /* 'upload_fromhere' is used as a read-pointer when we uploaded parts of a
-      buffer, so the next read should read from where this pointer points to,
-      and the 'upload_present' contains the number of bytes available at this
-      position */
+  /* 'upload_fromhere' is used as a read-pointer when we uploaded parts of a
+     buffer, so the next read should read from where this pointer points to,
+     and the 'upload_present' contains the number of bytes available at this
+     position */
   char *upload_fromhere;
-
-  bool chunk; /* if set, this is a chunked transfer-encoding */
-  bool upload_chunky; /* set TRUE if we are doing chunked transfer-encoding
-                         on upload */
-  bool getheader;     /* TRUE if header parsing is wanted */
-
-  bool forbidchunk;   /* used only to explicitly forbid chunk-upload for
-                         specific upload buffers. See readmoredata() in
-                         http.c for details. */
-
   void *protop;       /* Allocated protocol-specific data. Each protocol
                          handler makes sure this points to data it needs. */
+#ifndef CURL_DISABLE_DOH
   struct dohdata doh; /* DoH specific data for this request */
+#endif
+  BIT(header);       /* incoming data has HTTP header */
+  BIT(content_range); /* set TRUE if Content-Range: was found */
+  BIT(upload_done);  /* set to TRUE when doing chunked transfer-encoding
+                        upload and we're uploading the last chunk */
+  BIT(ignorebody);   /* we read a response-body but we ignore it! */
+  BIT(http_bodyless); /* HTTP response status code is between 100 and 199,
+                         204 or 304 */
+  BIT(chunk); /* if set, this is a chunked transfer-encoding */
+  BIT(upload_chunky); /* set TRUE if we are doing chunked transfer-encoding
+                         on upload */
+  BIT(getheader);    /* TRUE if header parsing is wanted */
+  BIT(forbidchunk);  /* used only to explicitly forbid chunk-upload for
+                        specific upload buffers. See readmoredata() in http.c
+                        for details. */
 };
 
 /*
@@ -656,27 +692,23 @@ struct Curl_handler {
   /* Called from the multi interface during the PROTOCONNECT phase, and it
      should then return a proper fd set */
   int (*proto_getsock)(struct connectdata *conn,
-                       curl_socket_t *socks,
-                       int numsocks);
+                       curl_socket_t *socks);
 
   /* Called from the multi interface during the DOING phase, and it should
      then return a proper fd set */
   int (*doing_getsock)(struct connectdata *conn,
-                       curl_socket_t *socks,
-                       int numsocks);
+                       curl_socket_t *socks);
 
   /* Called from the multi interface during the DO_MORE phase, and it should
      then return a proper fd set */
   int (*domore_getsock)(struct connectdata *conn,
-                        curl_socket_t *socks,
-                        int numsocks);
+                        curl_socket_t *socks);
 
   /* Called from the multi interface during the DO_DONE, PERFORM and
      WAITPERFORM phases, and it should then return a proper fd set. Not setting
      this will make libcurl use the generic default one. */
   int (*perform_getsock)(const struct connectdata *conn,
-                         curl_socket_t *socks,
-                         int numsocks);
+                         curl_socket_t *socks);
 
   /* This function *MAY* be set to a protocol-dependent function that is run
    * by the curl_disconnect(), as a step in the disconnection.  If the handler
@@ -766,15 +798,17 @@ struct http_connect_state {
   char *line_start;
   char *ptr; /* where to store more data */
   curl_off_t cl; /* size of content to read and ignore */
-  bool chunked_encoding;
   enum {
     TUNNEL_INIT,    /* init/default/no tunnel state */
     TUNNEL_CONNECT, /* CONNECT has been sent off */
     TUNNEL_COMPLETE /* CONNECT response received completely */
   } tunnel_state;
-  bool close_connection;
+  BIT(chunked_encoding);
+  BIT(close_connection);
 };
 
+struct ldapconninfo;
+
 /*
  * The connectdata struct contains all fields and variables that should be
  * unique for an entire connection.
@@ -796,11 +830,10 @@ struct connectdata {
   void *closesocket_client;
 
   /* This is used by the connection cache logic. If this returns TRUE, this
-     handle is being used by one or more easy handles and can only used by any
+     handle is still used by one or more easy handles and can only used by any
      other easy handle without careful consideration (== only for
-     pipelining/multiplexing) and it cannot be used by another multi
-     handle! */
-#define CONN_INUSE(c) ((c)->send_pipe.size + (c)->recv_pipe.size)
+     multiplexing) and it cannot be used by another multi handle! */
+#define CONN_INUSE(c) ((c)->easyq.size)
 
   /**** Fields set when inited and not modified again */
   long connection_id; /* Contains a unique number to make it easier to
@@ -825,9 +858,19 @@ struct connectdata {
 
   unsigned int scope_id;  /* Scope id for IPv6 */
 
-  int socktype;  /* SOCK_STREAM or SOCK_DGRAM */
+  enum {
+    TRNSPRT_TCP = 3,
+    TRNSPRT_UDP = 4,
+    TRNSPRT_QUIC = 5
+  } transport;
+
+#ifdef ENABLE_QUIC
+  struct quicsocket hequic[2]; /* two, for happy eyeballs! */
+  struct quicsocket *quic;
+#endif
 
   struct hostname host;
+  char *hostname_resolve; /* host name to resolve to address, allocated */
   char *secondaryhostname; /* secondary socket host name (ftp) */
   struct hostname conn_to_host; /* the host to connect to. valid only if
                                    bits.conn_to_host is set */
@@ -863,13 +906,15 @@ struct connectdata {
   char *passwd;  /* password string, allocated */
   char *options; /* options string, allocated */
 
-  char *oauth_bearer; /* bearer token for OAuth 2.0, allocated */
+  char *oauth_bearer;     /* bearer token for OAuth 2.0, allocated */
+  char *sasl_authzid;     /* authorisation identity string, allocated */
 
   int httpversion;        /* the HTTP version*10 reported by the server */
   int rtspversion;        /* the RTSP version*10 reported by the server */
 
   struct curltime now;     /* "current" time */
   struct curltime created; /* creation time */
+  struct curltime lastused; /* when returned to the connection cache */
   curl_socket_t sock[2]; /* two sockets, the second is used for the data
                             transfer when doing FTP */
   curl_socket_t tempsock[2]; /* temporary sockets for happy eyeballs */
@@ -888,8 +933,6 @@ struct connectdata {
 #endif
   struct ssl_primary_config ssl_config;
   struct ssl_primary_config proxy_ssl_config;
-  bool tls_upgraded;
-
   struct ConnectBits bits;    /* various state-flags for this connection */
 
  /* connecttime: when connect() is called on the current IP address. Used to
@@ -898,8 +941,8 @@ struct connectdata {
   struct curltime connecttime;
   /* The two fields below get set in Curl_connecthost */
   int num_addr; /* number of addresses to try to connect to */
-  time_t timeoutms_per_addr; /* how long time in milliseconds to spend on
-                                trying to connect to each IP address */
+  timediff_t timeoutms_per_addr; /* how long time in milliseconds to spend on
+                                    trying to connect to each IP address */
 
   const struct Curl_handler *handler; /* Connection's protocol handler */
   const struct Curl_handler *given;   /* The protocol first given */
@@ -936,7 +979,7 @@ struct connectdata {
   } allocptr;
 
 #ifdef HAVE_GSSAPI
-  int sec_complete; /* if Kerberos is enabled for this connection */
+  BIT(sec_complete); /* if Kerberos is enabled for this connection */
   enum protection_level command_prot;
   enum protection_level data_prot;
   enum protection_level request_data_prot;
@@ -951,30 +994,19 @@ struct connectdata {
   struct kerberos5data krb5;  /* variables into the structure definition, */
 #endif                        /* however, some of them are ftp specific. */
 
-  /* the two following *_inuse fields are only flags, not counters in any way.
-     If TRUE it means the channel is in use, and if FALSE it means the channel
-     is up for grabs by one. */
-
-  bool readchannel_inuse;  /* whether the read channel is in use by an easy
-                              handle */
-  bool writechannel_inuse; /* whether the write channel is in use by an easy
-                              handle */
-  struct curl_llist send_pipe; /* List of handles waiting to send on this
-                                  pipeline */
-  struct curl_llist recv_pipe; /* List of handles waiting to read their
-                                  responses on this pipeline */
-  char *master_buffer; /* The master buffer allocated on-demand;
-                          used for pipelining. */
-  size_t read_pos; /* Current read position in the master buffer */
-  size_t buf_len; /* Length of the buffer?? */
-
-
+  struct curl_llist easyq;    /* List of easy handles using this connection */
   curl_seek_callback seek_func; /* function that seeks the input */
   void *seek_client;            /* pointer to pass to the seek() above */
 
   /*************** Request - specific items ************/
+#if defined(USE_WINDOWS_SSPI) && defined(SECPKG_ATTR_ENDPOINT_BINDINGS)
+  CtxtHandle *sslContext;
+#endif
 
 #if defined(USE_NTLM)
+  curlntlm http_ntlm_state;
+  curlntlm proxy_ntlm_state;
+
   struct ntlmdata ntlm;     /* NTLM differs from other authentication schemes
                                because it authenticates connections, not
                                single requests! */
@@ -989,7 +1021,14 @@ struct connectdata {
 #endif
 #endif
 
-  char syserr_buf [256]; /* buffer for Curl_strerror() */
+#ifdef USE_SPNEGO
+  curlnegotiate http_negotiate_state;
+  curlnegotiate proxy_negotiate_state;
+
+  struct negotiatedata negotiate; /* state data for host Negotiate auth */
+  struct negotiatedata proxyneg; /* state data for proxy Negotiate auth */
+#endif
+
   /* data used for the asynch name resolve callback */
   struct Curl_async async;
 
@@ -1008,7 +1047,8 @@ struct connectdata {
     struct smtp_conn smtpc;
     struct rtsp_conn rtspc;
     struct smb_conn smbc;
-    void *generic; /* RTMP and LDAP use this */
+    void *rtmp;
+    struct ldapconninfo *ldapc;
   } proto;
 
   int cselect_bits; /* bitmask of socket events */
@@ -1032,8 +1072,16 @@ struct connectdata {
 
 #ifdef USE_UNIX_SOCKETS
   char *unix_domain_socket;
-  bool abstract_unix_socket;
+  BIT(abstract_unix_socket);
 #endif
+  BIT(tls_upgraded);
+  /* the two following *_inuse fields are only flags, not counters in any way.
+     If TRUE it means the channel is in use, and if FALSE it means the channel
+     is up for grabs by one. */
+  BIT(readchannel_inuse);  /* whether the read channel is in use by an easy
+                              handle */
+  BIT(writechannel_inuse); /* whether the write channel is in use by an easy
+                              handle */
 };
 
 /* The end of connectdata. */
@@ -1048,15 +1096,14 @@ struct PureInfo {
   int httpversion; /* the http version number X.Y = X*10+Y */
   time_t filetime; /* If requested, this is might get set. Set to -1 if the
                       time was unretrievable. */
-  bool timecond;  /* set to TRUE if the time condition didn't match, which
-                     thus made the document NOT get fetched */
-  long header_size;  /* size of read header(s) in bytes */
-  long request_size; /* the amount of bytes sent in the request(s) */
+  curl_off_t header_size;  /* size of read header(s) in bytes */
+  curl_off_t request_size; /* the amount of bytes sent in the request(s) */
   unsigned long proxyauthavail; /* what proxy auth types were announced */
   unsigned long httpauthavail;  /* what host auth types were announced */
   long numconnects; /* how many new connection did libcurl created */
   char *contenttype; /* the content type of the object */
   char *wouldredirect; /* URL this would've been redirected to if asked to */
+  curl_off_t retry_after; /* info from Retry-After: header */
 
   /* PureInfo members 'conn_primary_ip', 'conn_primary_port', 'conn_local_ip'
      and, 'conn_local_port' are copied over from the connectdata struct in
@@ -1068,16 +1115,16 @@ struct PureInfo {
 
   char conn_primary_ip[MAX_IPADR_LEN];
   long conn_primary_port;
-
   char conn_local_ip[MAX_IPADR_LEN];
   long conn_local_port;
-
   const char *conn_scheme;
   unsigned int conn_protocol;
-
   struct curl_certinfo certs; /* info about the certs, only populated in
-                                 OpenSSL builds. Asked for with
-                                 CURLOPT_CERTINFO / CURLINFO_CERTINFO */
+                                 OpenSSL, GnuTLS, Schannel, NSS and GSKit
+                                 builds. Asked for with CURLOPT_CERTINFO
+                                 / CURLINFO_CERTINFO */
+  BIT(timecond);  /* set to TRUE if the time condition didn't match, which
+                     thus made the document NOT get fetched */
 };
 
 
@@ -1091,28 +1138,26 @@ struct Progress {
 
   curl_off_t current_speed; /* uses the currently fastest transfer */
 
-  bool callback;  /* set when progress callback is used */
   int width; /* screen width at download start */
   int flags; /* see progress.h */
 
-  time_t timespent;
+  timediff_t timespent;
 
   curl_off_t dlspeed;
   curl_off_t ulspeed;
 
-  time_t t_nslookup;
-  time_t t_connect;
-  time_t t_appconnect;
-  time_t t_pretransfer;
-  time_t t_starttransfer;
-  time_t t_redirect;
+  timediff_t t_nslookup;
+  timediff_t t_connect;
+  timediff_t t_appconnect;
+  timediff_t t_pretransfer;
+  timediff_t t_starttransfer;
+  timediff_t t_redirect;
 
   struct curltime start;
   struct curltime t_startsingle;
   struct curltime t_startop;
   struct curltime t_acceptdata;
 
-  bool is_t_startransfer_set;
 
   /* upload speed limit */
   struct curltime ul_limit_start;
@@ -1126,6 +1171,8 @@ struct Progress {
   curl_off_t speeder[ CURR_TIME ];
   struct curltime speeder_time[ CURR_TIME ];
   int speeder_c;
+  BIT(callback);  /* set when progress callback is used */
+  BIT(is_t_startransfer_set);
 };
 
 typedef enum {
@@ -1137,7 +1184,6 @@ typedef enum {
   HTTPREQ_PUT,
   HTTPREQ_HEAD,
   HTTPREQ_OPTIONS,
-  HTTPREQ_CUSTOM,
   HTTPREQ_LAST /* last in list */
 } Curl_HttpReq;
 
@@ -1174,12 +1220,12 @@ struct auth {
   unsigned long picked;
   unsigned long avail; /* Bitmask for what the server reports to support for
                           this resource */
-  bool done;  /* TRUE when the auth phase is done and ready to do the *actual*
-                 request */
-  bool multipass; /* TRUE if this is not yet authenticated but within the
+  BIT(done);  /* TRUE when the auth phase is done and ready to do the
+                 actual request */
+  BIT(multipass); /* TRUE if this is not yet authenticated but within the
                      auth multipass negotiation */
-  bool iestyle; /* TRUE if digest should be done IE-style or FALSE if it should
-                   be RFC compliant */
+  BIT(iestyle); /* TRUE if digest should be done IE-style or FALSE if it
+                   should be RFC compliant */
 };
 
 struct Curl_http2_dep {
@@ -1206,15 +1252,26 @@ typedef enum {
   EXPIRE_ASYNC_NAME,
   EXPIRE_CONNECTTIMEOUT,
   EXPIRE_DNS_PER_NAME,
+  EXPIRE_HAPPY_EYEBALLS_DNS, /* See asyn-ares.c */
   EXPIRE_HAPPY_EYEBALLS,
   EXPIRE_MULTI_PENDING,
   EXPIRE_RUN_NOW,
   EXPIRE_SPEEDCHECK,
   EXPIRE_TIMEOUT,
   EXPIRE_TOOFAST,
+  EXPIRE_QUIC,
   EXPIRE_LAST /* not an actual timer, used as a marker only */
 } expire_id;
 
+
+typedef enum {
+  TRAILERS_NONE,
+  TRAILERS_INITIALIZED,
+  TRAILERS_SENDING,
+  TRAILERS_DONE
+} trailers_state;
+
+
 /*
  * One instance for each timeout an easy handle can set.
  */
@@ -1241,11 +1298,6 @@ struct UrlState {
   /* Points to the connection cache */
   struct conncache *conn_cache;
 
-  /* when curl_easy_perform() is called, the multi handle is "owned" by
-     the easy handle so curl_easy_cleanup() on such an easy handle will
-     also close the multi handle! */
-  bool multi_owned_by_easy;
-
   /* buffers to store authentication data in, as parsed from input options */
   struct curltime keeps_speed; /* for the progress meter really */
 
@@ -1258,8 +1310,6 @@ struct UrlState {
   char *ulbuf; /* allocated upload buffer or NULL */
   curl_off_t current_speed;  /* the ProgressShow() function sets this,
                                 bytes / second */
-  bool this_is_a_follow; /* this is a followed Location: request */
-  bool refused_stream; /* this was refused, try again */
   char *first_host; /* host name of the first (not followed) request.
                        if set, this should be the host name that we will
                        sent authorization to, no else. Used to make Location:
@@ -1272,29 +1322,16 @@ struct UrlState {
   unsigned int tempcount; /* number of entries in use in tempwrite, 0 - 3 */
   struct tempbuf tempwrite[3]; /* BOTH, HEADER, BODY */
   char *scratch; /* huge buffer[set.buffer_size*2] for upload CRLF replacing */
-  bool errorbuf; /* Set to TRUE if the error buffer is already filled in.
-                    This must be set to FALSE every time _easy_perform() is
-                    called. */
   int os_errno;  /* filled in with errno whenever an error occurs */
 #ifdef HAVE_SIGNAL
   /* storage for the previous bag^H^H^HSIGPIPE signal handler :-) */
   void (*prev_signal)(int sig);
 #endif
-  bool allow_port; /* Is set.use_port allowed to take effect or not. This
-                      is always set TRUE when curl_easy_perform() is called. */
   struct digestdata digest;      /* state data for host Digest auth */
   struct digestdata proxydigest; /* state data for proxy Digest auth */
 
-#ifdef USE_SPNEGO
-  struct negotiatedata negotiate; /* state data for host Negotiate auth */
-  struct negotiatedata proxyneg; /* state data for proxy Negotiate auth */
-#endif
-
   struct auth authhost;  /* auth details for host */
   struct auth authproxy; /* auth details for proxy */
-
-  bool authproblem; /* TRUE if there's some problem authenticating */
-
   void *resolver; /* resolver state, if it is used in the URL state -
                      ares_channel f.e. */
 
@@ -1310,27 +1347,18 @@ struct UrlState {
   /* a place to store the most recently set FTP entrypath */
   char *most_recent_ftp_entrypath;
 
-  /* set after initial USER failure, to prevent an authentication loop */
-  bool ftp_trying_alternative;
-  bool wildcardmatch; /* enable wildcard matching */
   int httpversion;       /* the lowest HTTP version*10 reported by any server
                             involved in this request */
-  bool expect100header;  /* TRUE if we added Expect: 100-continue */
 
 #if !defined(WIN32) && !defined(MSDOS) && !defined(__EMX__) && \
     !defined(__SYMBIAN32__)
 /* do FTP line-end conversions on most platforms */
 #define CURL_DO_LINEEND_CONV
   /* for FTP downloads: track CRLF sequences that span blocks */
-  bool prev_block_had_trailing_cr;
+  BIT(prev_block_had_trailing_cr);
   /* for FTP downloads: how many CRLFs did we converted to LFs? */
   curl_off_t crlf_conversions;
 #endif
-  bool slash_removed; /* set TRUE if the 'path' points to a path where the
-                         initial URL slash separator has been taken off */
-  bool use_range;
-  bool rangestringalloc; /* the range string is malloc()'ed */
-
   char *range; /* range, if used. See README for detailed specification on
                   this syntax. */
   curl_off_t resume_from; /* continue [ftp] transfer from here */
@@ -1346,21 +1374,49 @@ struct UrlState {
   size_t drain; /* Increased when this stream has data to read, even if its
                    socket is not necessarily is readable. Decreased when
                    checked. */
-  bool done; /* set to FALSE when Curl_init_do() is called and set to TRUE
-                when multi_done() is called, to prevent multi_done() to get
-                invoked twice when the multi interface is used. */
 
   curl_read_callback fread_func; /* read callback/function */
   void *in;                      /* CURLOPT_READDATA */
 
   struct Curl_easy *stream_depends_on;
-  bool stream_depends_e; /* set or don't set the Exclusive bit */
   int stream_weight;
-#ifdef CURLDEBUG
-  bool conncache_lock;
-#endif
   CURLU *uh; /* URL handle for the current parsed URL */
   struct urlpieces up;
+#ifndef CURL_DISABLE_HTTP
+  size_t trailers_bytes_sent;
+  Curl_send_buffer *trailers_buf; /* a buffer containing the compiled trailing
+                                  headers */
+#endif
+  trailers_state trailers_state; /* whether we are sending trailers
+                                       and what stage are we at */
+#ifdef CURLDEBUG
+  BIT(conncache_lock);
+#endif
+  /* when curl_easy_perform() is called, the multi handle is "owned" by
+     the easy handle so curl_easy_cleanup() on such an easy handle will
+     also close the multi handle! */
+  BIT(multi_owned_by_easy);
+
+  BIT(this_is_a_follow); /* this is a followed Location: request */
+  BIT(refused_stream); /* this was refused, try again */
+  BIT(errorbuf); /* Set to TRUE if the error buffer is already filled in.
+                    This must be set to FALSE every time _easy_perform() is
+                    called. */
+  BIT(allow_port); /* Is set.use_port allowed to take effect or not. This
+                      is always set TRUE when curl_easy_perform() is called. */
+  BIT(authproblem); /* TRUE if there's some problem authenticating */
+  /* set after initial USER failure, to prevent an authentication loop */
+  BIT(ftp_trying_alternative);
+  BIT(wildcardmatch); /* enable wildcard matching */
+  BIT(expect100header);  /* TRUE if we added Expect: 100-continue */
+  BIT(use_range);
+  BIT(rangestringalloc); /* the range string is malloc()'ed */
+  BIT(done); /* set to FALSE when Curl_init_do() is called and set to TRUE
+                  when multi_done() is called, to prevent multi_done() to get
+                  invoked twice when the multi interface is used. */
+  BIT(stream_depends_e); /* set or don't set the Exclusive bit */
+  BIT(previouslypending); /* this transfer WAS in the multi->pending queue */
+  BIT(cookie_engine);
 };
 
 
@@ -1373,13 +1429,15 @@ struct UrlState {
 
 struct DynamicStatic {
   char *url;        /* work URL, copied from UserDefined */
-  bool url_alloc;   /* URL string is malloc()'ed */
   char *referer;    /* referer string */
-  bool referer_alloc; /* referer string is malloc()ed */
   struct curl_slist *cookielist; /* list of cookie files set by
                                     curl_easy_setopt(COOKIEFILE) calls */
   struct curl_slist *resolve; /* set to point to the set.resolve list when
                                  this should be dealt with in pretransfer */
+  BIT(url_alloc);   /* URL string is malloc()'ed */
+  BIT(referer_alloc); /* referer string is malloc()ed */
+  BIT(wildcard_resolve); /* Set to true if any resolve change is a
+                              wildcard */
 };
 
 /*
@@ -1449,7 +1507,7 @@ enum dupstring {
   STRING_RTSP_SESSION_ID, /* Session ID to use */
   STRING_RTSP_STREAM_URI, /* Stream URI for this request */
   STRING_RTSP_TRANSPORT,  /* Transport for this session */
-#if defined(USE_LIBSSH2) || defined(USE_LIBSSH)
+#ifdef USE_SSH
   STRING_SSH_PRIVATE_KEY, /* path to the private key file for auth */
   STRING_SSH_PUBLIC_KEY,  /* path to the public key file for auth */
   STRING_SSH_HOST_PUBLIC_KEY_MD5, /* md5 of host public key in ascii hex */
@@ -1472,6 +1530,13 @@ enum dupstring {
 #endif
   STRING_TARGET,                /* CURLOPT_REQUEST_TARGET */
   STRING_DOH,                   /* CURLOPT_DOH_URL */
+#ifdef USE_ALTSVC
+  STRING_ALTSVC,                /* CURLOPT_ALTSVC */
+#endif
+  STRING_SASL_AUTHZID,          /* CURLOPT_SASL_AUTHZID */
+#ifndef CURL_DISABLE_PROXY
+  STRING_TEMP_URL,              /* temp URL storage for proxy use */
+#endif
   /* -- end of zero-terminated strings -- */
 
   STRING_LASTZEROTERMINATED,
@@ -1509,8 +1574,6 @@ struct UserDefined {
 
   int keep_post;     /* keep POSTs as POSTs after a 30x request; each
                         bit represents a request, from 301 to 303 */
-  bool free_referer; /* set TRUE if 'referer' points to a string we
-                        allocated */
   void *postfields;  /* if POST, set the fields' values here */
   curl_seek_callback seek_func;      /* function that seeks the input */
   curl_off_t postfieldsize; /* if POST, this might have a size to use instead
@@ -1523,8 +1586,6 @@ struct UserDefined {
   curl_write_callback fwrite_header; /* function that stores headers */
   curl_write_callback fwrite_rtp;    /* function that stores interleaved RTP */
   curl_read_callback fread_func_set; /* function that reads the input */
-  int is_fread_set; /* boolean, has read callback been set to non-NULL? */
-  int is_fwrite_set; /* boolean, has write callback been set to non-NULL? */
   curl_progress_callback fprogress; /* OLD and deprecated progress callback  */
   curl_xferinfo_callback fxferinfo; /* progress callback */
   curl_debug_callback fdebug;      /* function that write informational data */
@@ -1555,8 +1616,9 @@ struct UserDefined {
   long accepttimeout;   /* in milliseconds, 0 means no timeout */
   long happy_eyeballs_timeout; /* in milliseconds, 0 is a valid value */
   long server_response_timeout; /* in milliseconds, 0 means no timeout */
+  long maxage_conn;     /* in seconds, max idle time to allow a connection that
+                           is to be reused */
   long tftp_blksize;    /* in bytes, 0 means use default */
-  bool tftp_no_options; /* do not send TFTP options requests */
   curl_off_t filesize;  /* size of file to upload, -1 means unknown */
   long low_speed_limit; /* bytes/second */
   long low_speed_time;  /* number of seconds */
@@ -1568,9 +1630,6 @@ struct UserDefined {
   struct curl_slist *proxyheaders; /* linked list of extra CONNECT headers */
   struct curl_httppost *httppost;  /* linked list of old POST data */
   curl_mimepart mimepost;  /* MIME/POST data. */
-  bool sep_headers;     /* handle host and proxy headers separately */
-  bool cookiesession;   /* new cookie session? */
-  bool crlf;            /* convert crlf on ftp upload(?) */
   struct curl_slist *quote;     /* after connection is established */
   struct curl_slist *postquote; /* after the transfer */
   struct curl_slist *prequote; /* before the transfer, after type */
@@ -1589,7 +1648,6 @@ struct UserDefined {
   Curl_HttpReq httpreq;   /* what kind of HTTP request (if any) is this */
   long httpversion; /* when non-zero, a specific HTTP version requested to
                        be used in the library's request(s) */
-  bool strip_path_slash; /* strip off initial slash from path */
   struct ssl_config_data ssl;  /* user defined SSL stuff */
   struct ssl_config_data proxy_ssl;  /* user defined SSL stuff for proxy */
   struct ssl_general_config general_ssl; /* general user defined SSL stuff */
@@ -1599,87 +1657,35 @@ struct UserDefined {
   size_t upload_buffer_size; /* size of upload buffer to use,
                                 keep it >= CURL_MAX_WRITE_SIZE */
   void *private_data; /* application-private data */
-
   struct curl_slist *http200aliases; /* linked list of aliases for http200 */
-
   long ipver; /* the CURL_IPRESOLVE_* defines in the public header file
                  0 - whatever, 1 - v2, 2 - v6 */
-
   curl_off_t max_filesize; /* Maximum file size to download */
-
+#ifndef CURL_DISABLE_FTP
   curl_ftpfile ftp_filemethod; /* how to get to a file when FTP is used  */
-
+  curl_ftpauth ftpsslauth; /* what AUTH XXX to be attempted */
+  curl_ftpccc ftp_ccc;   /* FTP CCC options */
+#endif
   int ftp_create_missing_dirs; /* 1 - create directories that don't exist
                                   2 - the same but also allow MKD to fail once
                                */
-
   curl_sshkeycallback ssh_keyfunc; /* key matching callback */
   void *ssh_keyfunc_userp;         /* custom pointer to callback */
-  bool ssh_compression;            /* enable SSH compression */
-
-/* Here follows boolean settings that define how to behave during
-   this session. They are STATIC, set by libcurl users or at least initially
-   and they don't change during operations. */
-  bool get_filetime;     /* get the time and get of the remote file */
-  bool tunnel_thru_httpproxy; /* use CONNECT through a HTTP proxy */
-  bool prefer_ascii;     /* ASCII rather than binary */
-  bool ftp_append;       /* append, not overwrite, on upload */
-  bool ftp_list_only;    /* switch FTP command for listing directories */
-  bool ftp_use_port;     /* use the FTP PORT command */
-  bool hide_progress;    /* don't use the progress meter */
-  bool http_fail_on_error;  /* fail on HTTP error codes >= 400 */
-  bool http_keep_sending_on_error; /* for HTTP status codes >= 300 */
-  bool http_follow_location; /* follow HTTP redirects */
-  bool http_transfer_encoding; /* request compressed HTTP transfer-encoding */
-  bool allow_auth_to_other_hosts;
-  bool include_header;   /* include received protocol headers in data output */
-  bool http_set_referer; /* is a custom referer used */
-  bool http_auto_referer; /* set "correct" referer when following location: */
-  bool opt_no_body;      /* as set with CURLOPT_NOBODY */
-  bool upload;           /* upload request */
   enum CURL_NETRC_OPTION
        use_netrc;        /* defined in include/curl.h */
-  bool verbose;          /* output verbosity */
-  bool krb;              /* Kerberos connection requested */
-  bool reuse_forbid;     /* forbidden to be reused, close after use */
-  bool reuse_fresh;      /* do not re-use an existing connection  */
-  bool ftp_use_epsv;     /* if EPSV is to be attempted or not */
-  bool ftp_use_eprt;     /* if EPRT is to be attempted or not */
-  bool ftp_use_pret;     /* if PRET is to be used before PASV or not */
-
   curl_usessl use_ssl;   /* if AUTH TLS is to be attempted etc, for FTP or
                             IMAP or POP3 or others! */
-  curl_ftpauth ftpsslauth; /* what AUTH XXX to be attempted */
-  curl_ftpccc ftp_ccc;   /* FTP CCC options */
-  bool no_signal;        /* do not use any signal/alarm handler */
-  bool global_dns_cache; /* subject for future removal */
-  bool tcp_nodelay;      /* whether to enable TCP_NODELAY or not */
-  bool ignorecl;         /* ignore content length */
-  bool ftp_skip_ip;      /* skip the IP address the FTP server passes on to
-                            us */
-  bool connect_only;     /* make connection, let application use the socket */
-  long ssh_auth_types;   /* allowed SSH auth types */
-  bool http_te_skip;     /* pass the raw body data to the user, even when
-                            transfer-encoded (chunked, compressed) */
-  bool http_ce_skip;     /* pass the raw body data to the user, even when
-                            content-encoded (chunked, compressed) */
   long new_file_perms;    /* Permissions to use when creating remote files */
   long new_directory_perms; /* Permissions to use when creating remote dirs */
-  bool proxy_transfer_mode; /* set transfer mode (;type=<a|i>) when doing FTP
-                               via an HTTP proxy */
+  long ssh_auth_types;   /* allowed SSH auth types */
   char *str[STRING_LAST]; /* array of strings, pointing to allocated memory */
   unsigned int scope_id;  /* Scope id for IPv6 */
   long allowed_protocols;
   long redir_protocols;
-#if defined(HAVE_GSSAPI) || defined(USE_WINDOWS_SSPI)
-  bool socks5_gssapi_nec; /* Flag to support NEC SOCKS5 server */
-#endif
   struct curl_slist *mail_rcpt; /* linked list of mail recipients */
-  bool sasl_ir;         /* Enable/disable SASL initial response */
   /* Common RTSP header options */
   Curl_RtspReq rtspreq; /* RTSP request type */
   long rtspversion; /* like httpversion, for RTSP */
-  bool wildcard_enabled; /* enable wildcard matching */
   curl_chunk_bgn_callback chunk_bgn; /* called before part of transfer
                                         starts */
   curl_chunk_end_callback chunk_end; /* called after part transferring
@@ -1691,50 +1697,107 @@ struct UserDefined {
   long gssapi_delegation; /* GSS-API credential delegation, see the
                              documentation of CURLOPT_GSSAPI_DELEGATION */
 
-  bool tcp_keepalive;    /* use TCP keepalives */
   long tcp_keepidle;     /* seconds in idle before sending keepalive probe */
   long tcp_keepintvl;    /* seconds between TCP keepalive probes */
-  bool tcp_fastopen;     /* use TCP Fast Open */
 
-  size_t maxconnects;  /* Max idle connections in the connection cache */
+  size_t maxconnects;    /* Max idle connections in the connection cache */
 
-  bool ssl_enable_npn;      /* TLS NPN extension? */
-  bool ssl_enable_alpn;     /* TLS ALPN extension? */
-  bool path_as_is;      /* allow dotdots? */
-  bool pipewait;        /* wait for pipe/multiplex status before starting a
-                           new connection */
   long expect_100_timeout; /* in milliseconds */
-  bool suppress_connect_headers;  /* suppress proxy CONNECT response headers
-                                     from user callbacks */
-
-  bool dns_shuffle_addresses; /* whether to shuffle addresses before use */
-
   struct Curl_easy *stream_depends_on;
-  bool stream_depends_e; /* set or don't set the Exclusive bit */
   int stream_weight;
-
-  bool haproxyprotocol; /* whether to send HAProxy PROXY protocol v1 header */
-
   struct Curl_http2_dep *stream_dependents;
 
-  bool abstract_unix_socket;
-
   curl_resolver_start_callback resolver_start; /* optional callback called
                                                   before resolver start */
   void *resolver_start_client; /* pointer to pass to resolver start callback */
-  bool disallow_username_in_url; /* disallow username in url */
   long upkeep_interval_ms;      /* Time between calls for connection upkeep. */
-  bool doh; /* DNS-over-HTTPS enabled */
-  bool doh_get; /* use GET for DoH requests, instead of POST */
   multidone_func fmultidone;
   struct Curl_easy *dohfor; /* this is a DoH request for that transfer */
+  CURLU *uh; /* URL handle for the current parsed URL */
+  void *trailer_data; /* pointer to pass to trailer data callback */
+  curl_trailer_callback trailer_callback; /* trailing data callback */
+  BIT(is_fread_set); /* has read callback been set to non-NULL? */
+  BIT(is_fwrite_set); /* has write callback been set to non-NULL? */
+  BIT(free_referer); /* set TRUE if 'referer' points to a string we
+                        allocated */
+  BIT(tftp_no_options); /* do not send TFTP options requests */
+  BIT(sep_headers);     /* handle host and proxy headers separately */
+  BIT(cookiesession);   /* new cookie session? */
+  BIT(crlf);            /* convert crlf on ftp upload(?) */
+  BIT(strip_path_slash); /* strip off initial slash from path */
+  BIT(ssh_compression);            /* enable SSH compression */
+
+/* Here follows boolean settings that define how to behave during
+   this session. They are STATIC, set by libcurl users or at least initially
+   and they don't change during operations. */
+  BIT(get_filetime);     /* get the time and get of the remote file */
+  BIT(tunnel_thru_httpproxy); /* use CONNECT through a HTTP proxy */
+  BIT(prefer_ascii);     /* ASCII rather than binary */
+  BIT(ftp_append);       /* append, not overwrite, on upload */
+  BIT(ftp_list_only);    /* switch FTP command for listing directories */
+#ifndef CURL_DISABLE_FTP
+  BIT(ftp_use_port);     /* use the FTP PORT command */
+  BIT(ftp_use_epsv);     /* if EPSV is to be attempted or not */
+  BIT(ftp_use_eprt);     /* if EPRT is to be attempted or not */
+  BIT(ftp_use_pret);     /* if PRET is to be used before PASV or not */
+  BIT(ftp_skip_ip);      /* skip the IP address the FTP server passes on to
+                            us */
+#endif
+  BIT(hide_progress);    /* don't use the progress meter */
+  BIT(http_fail_on_error);  /* fail on HTTP error codes >= 400 */
+  BIT(http_keep_sending_on_error); /* for HTTP status codes >= 300 */
+  BIT(http_follow_location); /* follow HTTP redirects */
+  BIT(http_transfer_encoding); /* request compressed HTTP transfer-encoding */
+  BIT(allow_auth_to_other_hosts);
+  BIT(include_header); /* include received protocol headers in data output */
+  BIT(http_set_referer); /* is a custom referer used */
+  BIT(http_auto_referer); /* set "correct" referer when following
+                             location: */
+  BIT(opt_no_body);    /* as set with CURLOPT_NOBODY */
+  BIT(upload);         /* upload request */
+  BIT(verbose);        /* output verbosity */
+  BIT(krb);            /* Kerberos connection requested */
+  BIT(reuse_forbid);   /* forbidden to be reused, close after use */
+  BIT(reuse_fresh);    /* do not re-use an existing connection  */
+  BIT(no_signal);      /* do not use any signal/alarm handler */
+  BIT(tcp_nodelay);    /* whether to enable TCP_NODELAY or not */
+  BIT(ignorecl);       /* ignore content length */
+  BIT(connect_only);   /* make connection, let application use the socket */
+  BIT(http_te_skip);   /* pass the raw body data to the user, even when
+                          transfer-encoded (chunked, compressed) */
+  BIT(http_ce_skip);   /* pass the raw body data to the user, even when
+                          content-encoded (chunked, compressed) */
+  BIT(proxy_transfer_mode); /* set transfer mode (;type=<a|i>) when doing
+                               FTP via an HTTP proxy */
+#if defined(HAVE_GSSAPI) || defined(USE_WINDOWS_SSPI)
+  BIT(socks5_gssapi_nec); /* Flag to support NEC SOCKS5 server */
+#endif
+  BIT(sasl_ir);         /* Enable/disable SASL initial response */
+  BIT(wildcard_enabled); /* enable wildcard matching */
+  BIT(tcp_keepalive);  /* use TCP keepalives */
+  BIT(tcp_fastopen);   /* use TCP Fast Open */
+  BIT(ssl_enable_npn); /* TLS NPN extension? */
+  BIT(ssl_enable_alpn);/* TLS ALPN extension? */
+  BIT(path_as_is);     /* allow dotdots? */
+  BIT(pipewait);       /* wait for multiplex status before starting a new
+                          connection */
+  BIT(suppress_connect_headers); /* suppress proxy CONNECT response headers
+                                    from user callbacks */
+  BIT(dns_shuffle_addresses); /* whether to shuffle addresses before use */
+  BIT(stream_depends_e); /* set or don't set the Exclusive bit */
+  BIT(haproxyprotocol); /* whether to send HAProxy PROXY protocol v1
+                           header */
+  BIT(abstract_unix_socket);
+  BIT(disallow_username_in_url); /* disallow username in url */
+  BIT(doh); /* DNS-over-HTTPS enabled */
+  BIT(doh_get); /* use GET for DoH requests, instead of POST */
+  BIT(http09_allowed); /* allow HTTP/0.9 responses */
 };
 
 struct Names {
   struct curl_hash *hostcache;
   enum {
     HCACHE_NONE,    /* not pointing to anything */
-    HCACHE_GLOBAL,  /* points to the (shrug) global one */
     HCACHE_MULTI,   /* points to a shared one in the multi handle */
     HCACHE_SHARED   /* points to a shared one in a shared object */
   } hostcachetype;
@@ -1755,9 +1818,9 @@ struct Curl_easy {
   struct Curl_easy *next;
   struct Curl_easy *prev;
 
-  struct connectdata *easy_conn;     /* the "unit's" connection */
+  struct connectdata *conn;
   struct curl_llist_element connect_queue;
-  struct curl_llist_element pipeline_queue;
+  struct curl_llist_element conn_queue; /* list per connectdata */
 
   CURLMstate mstate;  /* the handle's state */
   CURLcode result;   /* previous result */
@@ -1769,6 +1832,8 @@ struct Curl_easy {
      the state etc are also kept. This array is mostly used to detect when a
      socket is to be removed from the hash. See singlesocket(). */
   curl_socket_t sockets[MAX_SOCKSPEREASYHANDLE];
+  int actions[MAX_SOCKSPEREASYHANDLE]; /* action for each socket in
+                                          sockets[] */
   int numsocks;
 
   struct Names dns;
@@ -1789,10 +1854,15 @@ struct Curl_easy {
                                   NOTE that the 'cookie' field in the
                                   UserDefined struct defines if the "engine"
                                   is to be used or not. */
+#ifdef USE_ALTSVC
+  struct altsvcinfo *asi;      /* the alt-svc cache */
+#endif
   struct Progress progress;    /* for all the progress meter data */
   struct UrlState state;       /* struct for fields used for state info and
                                   other dynamic purposes */
+#ifndef CURL_DISABLE_FTP
   struct WildcardData wildcard; /* wildcard download state info */
+#endif
   struct PureInfo info;        /* stats, reports and info data */
   struct curl_tlssessioninfo tsi; /* Information about the TLS session, only
                                      valid after a client has asked for it */
index be6d611..6f452c1 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -25,6 +25,9 @@
 
 #include "curl_setup.h"
 
+#if !defined(CURL_DISABLE_IMAP) || !defined(CURL_DISABLE_SMTP) ||       \
+  !defined(CURL_DISABLE_POP3)
+
 #include <curl/curl.h>
 #include "urldata.h"
 
@@ -49,8 +52,9 @@
  * Parameters:
  *
  * data    [in]     - The session handle.
- * userp   [in]     - The user name.
- * passwdp [in]     - The user's password.
+ * authzid [in]     - The authorization identity.
+ * authcid [in]     - The authentication identity.
+ * passwd  [in]     - The password.
  * outptr  [in/out] - The address where a pointer to newly allocated memory
  *                    holding the result will be stored upon completion.
  * outlen  [out]    - The length of the output message.
  * Returns CURLE_OK on success.
  */
 CURLcode Curl_auth_create_plain_message(struct Curl_easy *data,
-                                        const char *userp,
-                                        const char *passwdp,
+                                        const char *authzid,
+                                        const char *authcid,
+                                        const char *passwd,
                                         char **outptr, size_t *outlen)
 {
   CURLcode result;
   char *plainauth;
-  size_t ulen;
+  size_t zlen;
+  size_t clen;
   size_t plen;
   size_t plainlen;
 
   *outlen = 0;
   *outptr = NULL;
-  ulen = strlen(userp);
-  plen = strlen(passwdp);
+  zlen = (authzid == NULL ? 0 : strlen(authzid));
+  clen = strlen(authcid);
+  plen = strlen(passwd);
 
   /* Compute binary message length. Check for overflows. */
-  if((ulen > SIZE_T_MAX/4) || (plen > (SIZE_T_MAX/2 - 2)))
+  if(((zlen + clen) > SIZE_T_MAX/4) || (plen > (SIZE_T_MAX/2 - 2)))
     return CURLE_OUT_OF_MEMORY;
-  plainlen = 2 * ulen + plen + 2;
+  plainlen = zlen + clen + plen + 2;
 
   plainauth = malloc(plainlen);
   if(!plainauth)
     return CURLE_OUT_OF_MEMORY;
 
   /* Calculate the reply */
-  memcpy(plainauth, userp, ulen);
-  plainauth[ulen] = '\0';
-  memcpy(plainauth + ulen + 1, userp, ulen);
-  plainauth[2 * ulen + 1] = '\0';
-  memcpy(plainauth + 2 * ulen + 2, passwdp, plen);
+  if(zlen != 0)
+    memcpy(plainauth, authzid, zlen);
+  plainauth[zlen] = '\0';
+  memcpy(plainauth + zlen + 1, authcid, clen);
+  plainauth[zlen + clen + 1] = '\0';
+  memcpy(plainauth + zlen + clen + 2, passwd, plen);
 
   /* Base64 encode the reply */
   result = Curl_base64_encode(data, plainauth, plainlen, outptr, outlen);
@@ -157,3 +165,5 @@ CURLcode Curl_auth_create_external_message(struct Curl_easy *data,
   /* This is the same formatting as the login message */
   return Curl_auth_create_login_message(data, user, outptr, outlen);
 }
+
+#endif /* if no users */
index d148618..04438fa 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
index ab5156e..8cd4d83 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -143,7 +143,7 @@ static void auth_digest_md5_to_ascii(unsigned char *source, /* 16 bytes */
 {
   int i;
   for(i = 0; i < 16; i++)
-    snprintf((char *) &dest[i * 2], 3, "%02x", source[i]);
+    msnprintf((char *) &dest[i * 2], 3, "%02x", source[i]);
 }
 
 /* Convert sha256 chunk to RFC7616 -suitable ascii string*/
@@ -152,7 +152,7 @@ static void auth_digest_sha256_to_ascii(unsigned char *source, /* 32 bytes */
 {
   int i;
   for(i = 0; i < 32; i++)
-    snprintf((char *) &dest[i * 2], 3, "%02x", source[i]);
+    msnprintf((char *) &dest[i * 2], 3, "%02x", source[i]);
 }
 
 /* Perform quoted-string escaping as described in RFC2616 and its errata */
@@ -357,7 +357,6 @@ CURLcode Curl_auth_create_digest_md5_message(struct Curl_easy *data,
                                              const char *service,
                                              char **outptr, size_t *outlen)
 {
-  CURLcode result = CURLE_OK;
   size_t i;
   MD5_context *ctxt;
   char *response = NULL;
@@ -377,10 +376,12 @@ CURLcode Curl_auth_create_digest_md5_message(struct Curl_easy *data,
   char *spn         = NULL;
 
   /* Decode the challenge message */
-  result = auth_decode_digest_md5_message(chlg64, nonce, sizeof(nonce),
-                                          realm, sizeof(realm),
-                                          algorithm, sizeof(algorithm),
-                                          qop_options, sizeof(qop_options));
+  CURLcode result = auth_decode_digest_md5_message(chlg64, nonce,
+                                                   sizeof(nonce), realm,
+                                                   sizeof(realm), algorithm,
+                                                   sizeof(algorithm),
+                                                   qop_options,
+                                                   sizeof(qop_options));
   if(result)
     return result;
 
@@ -432,7 +433,7 @@ CURLcode Curl_auth_create_digest_md5_message(struct Curl_easy *data,
 
   /* Convert calculated 16 octet hex into 32 bytes string */
   for(i = 0; i < MD5_DIGEST_LEN; i++)
-    snprintf(&HA1_hex[2 * i], 3, "%02x", digest[i]);
+    msnprintf(&HA1_hex[2 * i], 3, "%02x", digest[i]);
 
   /* Generate our SPN */
   spn = Curl_auth_build_spn(service, realm, NULL);
@@ -455,7 +456,7 @@ CURLcode Curl_auth_create_digest_md5_message(struct Curl_easy *data,
   Curl_MD5_final(ctxt, digest);
 
   for(i = 0; i < MD5_DIGEST_LEN; i++)
-    snprintf(&HA2_hex[2 * i], 3, "%02x", digest[i]);
+    msnprintf(&HA2_hex[2 * i], 3, "%02x", digest[i]);
 
   /* Now calculate the response hash */
   ctxt = Curl_MD5_init(Curl_DIGEST_MD5);
@@ -485,7 +486,7 @@ CURLcode Curl_auth_create_digest_md5_message(struct Curl_easy *data,
   Curl_MD5_final(ctxt, digest);
 
   for(i = 0; i < MD5_DIGEST_LEN; i++)
-    snprintf(&resp_hash_hex[2 * i], 3, "%02x", digest[i]);
+    msnprintf(&resp_hash_hex[2 * i], 3, "%02x", digest[i]);
 
   /* Generate the response */
   response = aprintf("username=\"%s\",realm=\"%s\",nonce=\"%s\","
@@ -785,8 +786,7 @@ static CURLcode _Curl_auth_create_digest_http_message(
     return CURLE_OUT_OF_MEMORY;
 
   if(digest->qop && strcasecompare(digest->qop, "auth-int")) {
-    /* We don't support auth-int for PUT or POST at the moment.
-       TODO: replace hash of empty string with entity-body for PUT/POST */
+    /* We don't support auth-int for PUT or POST */
     char hashed[65];
     unsigned char *hashthis2;
 
index 8686c44..cc05fdb 100644 (file)
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
index 9287557..a109056 100644 (file)
@@ -6,7 +6,7 @@
  *                             \___|\___/|_| \_\_____|
  *
  * Copyright (C) 2014 - 2016, Steve Holme, <steve_holme@hotmail.com>.
- * Copyright (C) 2015 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 2015 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -61,6 +61,11 @@ bool Curl_auth_is_digest_supported(void)
   status = s_pSecFn->QuerySecurityPackageInfo((TCHAR *) TEXT(SP_NAME_DIGEST),
                                               &SecurityPackage);
 
+  /* Release the package buffer as it is not required anymore */
+  if(status == SEC_E_OK) {
+    s_pSecFn->FreeContextBuffer(SecurityPackage);
+  }
+
   return (status == SEC_E_OK ? TRUE : FALSE);
 }
 
@@ -146,7 +151,7 @@ CURLcode Curl_auth_create_digest_md5_message(struct Curl_easy *data,
   }
 
   /* Generate our SPN */
-  spn = Curl_auth_build_spn(service, data->easy_conn->host.name, NULL);
+  spn = Curl_auth_build_spn(service, data->conn->host.name, NULL);
   if(!spn) {
     free(output_token);
     free(input_token);
@@ -220,7 +225,10 @@ CURLcode Curl_auth_create_digest_md5_message(struct Curl_easy *data,
     free(output_token);
     free(input_token);
 
-    return CURLE_RECV_ERROR;
+    if(status == SEC_E_INSUFFICIENT_MEMORY)
+      return CURLE_OUT_OF_MEMORY;
+
+    return CURLE_AUTH_ERROR;
   }
 
   /* Base64 encode the response */
@@ -607,7 +615,10 @@ CURLcode Curl_auth_create_digest_http_message(struct Curl_easy *data,
 
       Curl_safefree(digest->http_context);
 
-      return CURLE_OUT_OF_MEMORY;
+      if(status == SEC_E_INSUFFICIENT_MEMORY)
+        return CURLE_OUT_OF_MEMORY;
+
+      return CURLE_AUTH_ERROR;
     }
 
     output_token_len = resp_buf.cbBuffer;
index 55daec1..95bab0e 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 2014 - 2017, Steve Holme, <steve_holme@hotmail.com>.
+ * Copyright (C) 2014 - 2019, Steve Holme, <steve_holme@hotmail.com>.
  * Copyright (C) 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
@@ -121,7 +121,7 @@ CURLcode Curl_auth_create_gssapi_user_message(struct Curl_easy *data,
 
       free(spn);
 
-      return CURLE_OUT_OF_MEMORY;
+      return CURLE_AUTH_ERROR;
     }
 
     free(spn);
@@ -168,7 +168,7 @@ CURLcode Curl_auth_create_gssapi_user_message(struct Curl_easy *data,
     Curl_gss_log_error(data, "gss_init_sec_context() failed: ",
                        major_status, minor_status);
 
-    return CURLE_RECV_ERROR;
+    return CURLE_AUTH_ERROR;
   }
 
   if(output_token.value && output_token.length) {
@@ -252,7 +252,7 @@ CURLcode Curl_auth_create_gssapi_security_message(struct Curl_easy *data,
 
     free(chlg);
 
-    return CURLE_OUT_OF_MEMORY;
+    return CURLE_AUTH_ERROR;
   }
 
   /* Convert the username from internal format to a displayable token */
@@ -264,7 +264,7 @@ CURLcode Curl_auth_create_gssapi_security_message(struct Curl_easy *data,
 
     free(chlg);
 
-    return CURLE_OUT_OF_MEMORY;
+    return CURLE_AUTH_ERROR;
   }
 
   /* Setup the challenge "input" security buffer */
@@ -355,7 +355,7 @@ CURLcode Curl_auth_create_gssapi_security_message(struct Curl_easy *data,
 
     free(message);
 
-    return CURLE_OUT_OF_MEMORY;
+    return CURLE_AUTH_ERROR;
   }
 
   /* Base64 encode the response */
@@ -372,7 +372,7 @@ CURLcode Curl_auth_create_gssapi_security_message(struct Curl_easy *data,
 }
 
 /*
- * Curl_auth_gssapi_cleanup()
+ * Curl_auth_cleanup_gssapi()
  *
  * This is used to clean up the GSSAPI (Kerberos V5) specific data.
  *
@@ -381,7 +381,7 @@ CURLcode Curl_auth_create_gssapi_security_message(struct Curl_easy *data,
  * krb5     [in/out] - The Kerberos 5 data struct being cleaned up.
  *
  */
-void Curl_auth_gssapi_cleanup(struct kerberos5data *krb5)
+void Curl_auth_cleanup_gssapi(struct kerberos5data *krb5)
 {
   OM_uint32 minor_status;
 
index cb11ed9..98041d9 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 2014 - 2017, Steve Holme, <steve_holme@hotmail.com>.
+ * Copyright (C) 2014 - 2019, Steve Holme, <steve_holme@hotmail.com>.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -58,6 +58,11 @@ bool Curl_auth_is_gssapi_supported(void)
                                               TEXT(SP_NAME_KERBEROS),
                                               &SecurityPackage);
 
+  /* Release the package buffer as it is not required anymore */
+  if(status == SEC_E_OK) {
+    s_pSecFn->FreeContextBuffer(SecurityPackage);
+  }
+
   return (status == SEC_E_OK ? TRUE : FALSE);
 }
 
@@ -217,8 +222,12 @@ CURLcode Curl_auth_create_gssapi_user_message(struct Curl_easy *data,
   /* Free the decoded challenge as it is not required anymore */
   free(chlg);
 
+  if(status == SEC_E_INSUFFICIENT_MEMORY) {
+    return CURLE_OUT_OF_MEMORY;
+  }
+
   if(status != SEC_E_OK && status != SEC_I_CONTINUE_NEEDED) {
-    return CURLE_RECV_ERROR;
+    return CURLE_AUTH_ERROR;
   }
 
   if(memcmp(&context, krb5->context, sizeof(context))) {
@@ -309,7 +318,10 @@ CURLcode Curl_auth_create_gssapi_security_message(struct Curl_easy *data,
   if(status != SEC_E_OK) {
     free(chlg);
 
-    return CURLE_OUT_OF_MEMORY;
+    if(status == SEC_E_INSUFFICIENT_MEMORY)
+      return CURLE_OUT_OF_MEMORY;
+
+    return CURLE_AUTH_ERROR;
   }
 
   /* Get the fully qualified username back from the context */
@@ -319,7 +331,10 @@ CURLcode Curl_auth_create_gssapi_security_message(struct Curl_easy *data,
   if(status != SEC_E_OK) {
     free(chlg);
 
-    return CURLE_RECV_ERROR;
+    if(status == SEC_E_INSUFFICIENT_MEMORY)
+      return CURLE_OUT_OF_MEMORY;
+
+    return CURLE_AUTH_ERROR;
   }
 
   /* Setup the "input" security buffer */
@@ -438,7 +453,10 @@ CURLcode Curl_auth_create_gssapi_security_message(struct Curl_easy *data,
     free(message);
     free(trailer);
 
-    return CURLE_OUT_OF_MEMORY;
+    if(status == SEC_E_INSUFFICIENT_MEMORY)
+      return CURLE_OUT_OF_MEMORY;
+
+    return CURLE_AUTH_ERROR;
   }
 
   /* Allocate the encryption (wrap) buffer */
@@ -474,7 +492,7 @@ CURLcode Curl_auth_create_gssapi_security_message(struct Curl_easy *data,
 }
 
 /*
- * Curl_auth_gssapi_cleanup()
+ * Curl_auth_cleanup_gssapi()
  *
  * This is used to clean up the GSSAPI (Kerberos V5) specific data.
  *
@@ -483,7 +501,7 @@ CURLcode Curl_auth_create_gssapi_security_message(struct Curl_easy *data,
  * krb5     [in/out] - The Kerberos 5 data struct being cleaned up.
  *
  */
-void Curl_auth_gssapi_cleanup(struct kerberos5data *krb5)
+void Curl_auth_cleanup_gssapi(struct kerberos5data *krb5)
 {
   /* Free our security context */
   if(krb5->context) {
index 11f42f5..047c2b5 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -182,10 +182,11 @@ static CURLcode ntlm_decode_type2_target(struct Curl_easy *data,
     target_info_len = Curl_read16_le(&buffer[40]);
     target_info_offset = Curl_read32_le(&buffer[44]);
     if(target_info_len > 0) {
-      if(((target_info_offset + target_info_len) > size) ||
+      if((target_info_offset >= size) ||
+         ((target_info_offset + target_info_len) > size) ||
          (target_info_offset < 48)) {
         infof(data, "NTLM handshake failure (bad type-2 message). "
-                    "Target Info Offset Len is set incorrect by the peer\n");
+              "Target Info Offset Len is set incorrect by the peer\n");
         return CURLE_BAD_CONTENT_ENCODING;
       }
 
@@ -402,45 +403,45 @@ CURLcode Curl_auth_create_ntlm_type1_message(struct Curl_easy *data,
   (void)hostname,
 
   /* Clean up any former leftovers and initialise to defaults */
-  Curl_auth_ntlm_cleanup(ntlm);
+  Curl_auth_cleanup_ntlm(ntlm);
 
 #if defined(USE_NTRESPONSES) && defined(USE_NTLM2SESSION)
 #define NTLM2FLAG NTLMFLAG_NEGOTIATE_NTLM2_KEY
 #else
 #define NTLM2FLAG 0
 #endif
-  snprintf((char *)ntlmbuf, NTLM_BUFSIZE,
-           NTLMSSP_SIGNATURE "%c"
-           "\x01%c%c%c" /* 32-bit type = 1 */
-           "%c%c%c%c"   /* 32-bit NTLM flag field */
-           "%c%c"       /* domain length */
-           "%c%c"       /* domain allocated space */
-           "%c%c"       /* domain name offset */
-           "%c%c"       /* 2 zeroes */
-           "%c%c"       /* host length */
-           "%c%c"       /* host allocated space */
-           "%c%c"       /* host name offset */
-           "%c%c"       /* 2 zeroes */
-           "%s"         /* host name */
-           "%s",        /* domain string */
-           0,           /* trailing zero */
-           0, 0, 0,     /* part of type-1 long */
-
-           LONGQUARTET(NTLMFLAG_NEGOTIATE_OEM |
-                       NTLMFLAG_REQUEST_TARGET |
-                       NTLMFLAG_NEGOTIATE_NTLM_KEY |
-                       NTLM2FLAG |
-                       NTLMFLAG_NEGOTIATE_ALWAYS_SIGN),
-           SHORTPAIR(domlen),
-           SHORTPAIR(domlen),
-           SHORTPAIR(domoff),
-           0, 0,
-           SHORTPAIR(hostlen),
-           SHORTPAIR(hostlen),
-           SHORTPAIR(hostoff),
-           0, 0,
-           host,  /* this is empty */
-           domain /* this is empty */);
+  msnprintf((char *)ntlmbuf, NTLM_BUFSIZE,
+            NTLMSSP_SIGNATURE "%c"
+            "\x01%c%c%c" /* 32-bit type = 1 */
+            "%c%c%c%c"   /* 32-bit NTLM flag field */
+            "%c%c"       /* domain length */
+            "%c%c"       /* domain allocated space */
+            "%c%c"       /* domain name offset */
+            "%c%c"       /* 2 zeroes */
+            "%c%c"       /* host length */
+            "%c%c"       /* host allocated space */
+            "%c%c"       /* host name offset */
+            "%c%c"       /* 2 zeroes */
+            "%s"         /* host name */
+            "%s",        /* domain string */
+            0,           /* trailing zero */
+            0, 0, 0,     /* part of type-1 long */
+
+            LONGQUARTET(NTLMFLAG_NEGOTIATE_OEM |
+                        NTLMFLAG_REQUEST_TARGET |
+                        NTLMFLAG_NEGOTIATE_NTLM_KEY |
+                        NTLM2FLAG |
+                        NTLMFLAG_NEGOTIATE_ALWAYS_SIGN),
+            SHORTPAIR(domlen),
+            SHORTPAIR(domlen),
+            SHORTPAIR(domoff),
+            0, 0,
+            SHORTPAIR(hostlen),
+            SHORTPAIR(hostlen),
+            SHORTPAIR(hostoff),
+            0, 0,
+            host,  /* this is empty */
+            domain /* this is empty */);
 
   /* Initial packet length */
   size = 32 + hostlen + domlen;
@@ -562,7 +563,7 @@ CURLcode Curl_auth_create_ntlm_type3_message(struct Curl_easy *data,
   }
 
 #if defined(USE_NTRESPONSES) && defined(USE_NTLM_V2)
-  if(ntlm->target_info_len) {
+  if(ntlm->flags & NTLMFLAG_NEGOTIATE_NTLM2_KEY) {
     unsigned char ntbuffer[0x18];
     unsigned char entropy[8];
     unsigned char ntlmv2hash[0x18];
@@ -599,7 +600,7 @@ CURLcode Curl_auth_create_ntlm_type3_message(struct Curl_easy *data,
 
 #if defined(USE_NTRESPONSES) && defined(USE_NTLM2SESSION)
   /* We don't support NTLM2 if we don't have USE_NTRESPONSES */
-  if(ntlm->flags & NTLMFLAG_NEGOTIATE_NTLM2_KEY) {
+  if(ntlm->flags & NTLMFLAG_NEGOTIATE_NTLM_KEY) {
     unsigned char ntbuffer[0x18];
     unsigned char tmp[0x18];
     unsigned char md5sum[MD5_DIGEST_LENGTH];
@@ -631,7 +632,9 @@ CURLcode Curl_auth_create_ntlm_type3_message(struct Curl_easy *data,
     Curl_ntlm_core_lm_resp(ntbuffer, md5sum, ntresp);
 
     /* End of NTLM2 Session code */
-
+    /* NTLM v2 session security is a misnomer because it is not NTLM v2.
+       It is NTLM v1 using the extended session security that is also
+       in NTLM v2 */
   }
   else
 #endif
@@ -678,88 +681,88 @@ CURLcode Curl_auth_create_ntlm_type3_message(struct Curl_easy *data,
   hostoff = useroff + userlen;
 
   /* Create the big type-3 message binary blob */
-  size = snprintf((char *)ntlmbuf, NTLM_BUFSIZE,
-                  NTLMSSP_SIGNATURE "%c"
-                  "\x03%c%c%c"  /* 32-bit type = 3 */
-
-                  "%c%c"  /* LanManager length */
-                  "%c%c"  /* LanManager allocated space */
-                  "%c%c"  /* LanManager offset */
-                  "%c%c"  /* 2 zeroes */
-
-                  "%c%c"  /* NT-response length */
-                  "%c%c"  /* NT-response allocated space */
-                  "%c%c"  /* NT-response offset */
-                  "%c%c"  /* 2 zeroes */
-
-                  "%c%c"  /* domain length */
-                  "%c%c"  /* domain allocated space */
-                  "%c%c"  /* domain name offset */
-                  "%c%c"  /* 2 zeroes */
-
-                  "%c%c"  /* user length */
-                  "%c%c"  /* user allocated space */
-                  "%c%c"  /* user offset */
-                  "%c%c"  /* 2 zeroes */
-
-                  "%c%c"  /* host length */
-                  "%c%c"  /* host allocated space */
-                  "%c%c"  /* host offset */
-                  "%c%c"  /* 2 zeroes */
-
-                  "%c%c"  /* session key length (unknown purpose) */
-                  "%c%c"  /* session key allocated space (unknown purpose) */
-                  "%c%c"  /* session key offset (unknown purpose) */
-                  "%c%c"  /* 2 zeroes */
-
-                  "%c%c%c%c",  /* flags */
-
-                  /* domain string */
-                  /* user string */
-                  /* host string */
-                  /* LanManager response */
-                  /* NT response */
-
-                  0,                /* zero termination */
-                  0, 0, 0,          /* type-3 long, the 24 upper bits */
-
-                  SHORTPAIR(0x18),  /* LanManager response length, twice */
-                  SHORTPAIR(0x18),
-                  SHORTPAIR(lmrespoff),
-                  0x0, 0x0,
+  size = msnprintf((char *)ntlmbuf, NTLM_BUFSIZE,
+                   NTLMSSP_SIGNATURE "%c"
+                   "\x03%c%c%c"  /* 32-bit type = 3 */
+
+                   "%c%c"  /* LanManager length */
+                   "%c%c"  /* LanManager allocated space */
+                   "%c%c"  /* LanManager offset */
+                   "%c%c"  /* 2 zeroes */
+
+                   "%c%c"  /* NT-response length */
+                   "%c%c"  /* NT-response allocated space */
+                   "%c%c"  /* NT-response offset */
+                   "%c%c"  /* 2 zeroes */
+
+                   "%c%c"  /* domain length */
+                   "%c%c"  /* domain allocated space */
+                   "%c%c"  /* domain name offset */
+                   "%c%c"  /* 2 zeroes */
+
+                   "%c%c"  /* user length */
+                   "%c%c"  /* user allocated space */
+                   "%c%c"  /* user offset */
+                   "%c%c"  /* 2 zeroes */
+
+                   "%c%c"  /* host length */
+                   "%c%c"  /* host allocated space */
+                   "%c%c"  /* host offset */
+                   "%c%c"  /* 2 zeroes */
+
+                   "%c%c"  /* session key length (unknown purpose) */
+                   "%c%c"  /* session key allocated space (unknown purpose) */
+                   "%c%c"  /* session key offset (unknown purpose) */
+                   "%c%c"  /* 2 zeroes */
+
+                   "%c%c%c%c",  /* flags */
+
+                   /* domain string */
+                   /* user string */
+                   /* host string */
+                   /* LanManager response */
+                   /* NT response */
+
+                   0,                /* zero termination */
+                   0, 0, 0,          /* type-3 long, the 24 upper bits */
+
+                   SHORTPAIR(0x18),  /* LanManager response length, twice */
+                   SHORTPAIR(0x18),
+                   SHORTPAIR(lmrespoff),
+                   0x0, 0x0,
 
 #ifdef USE_NTRESPONSES
-                  SHORTPAIR(ntresplen),  /* NT-response length, twice */
-                  SHORTPAIR(ntresplen),
-                  SHORTPAIR(ntrespoff),
-                  0x0, 0x0,
+                   SHORTPAIR(ntresplen),  /* NT-response length, twice */
+                   SHORTPAIR(ntresplen),
+                   SHORTPAIR(ntrespoff),
+                   0x0, 0x0,
 #else
-                  0x0, 0x0,
-                  0x0, 0x0,
-                  0x0, 0x0,
-                  0x0, 0x0,
+                   0x0, 0x0,
+                   0x0, 0x0,
+                   0x0, 0x0,
+                   0x0, 0x0,
 #endif
-                  SHORTPAIR(domlen),
-                  SHORTPAIR(domlen),
-                  SHORTPAIR(domoff),
-                  0x0, 0x0,
+                   SHORTPAIR(domlen),
+                   SHORTPAIR(domlen),
+                   SHORTPAIR(domoff),
+                   0x0, 0x0,
 
-                  SHORTPAIR(userlen),
-                  SHORTPAIR(userlen),
-                  SHORTPAIR(useroff),
-                  0x0, 0x0,
+                   SHORTPAIR(userlen),
+                   SHORTPAIR(userlen),
+                   SHORTPAIR(useroff),
+                   0x0, 0x0,
 
-                  SHORTPAIR(hostlen),
-                  SHORTPAIR(hostlen),
-                  SHORTPAIR(hostoff),
-                  0x0, 0x0,
+                   SHORTPAIR(hostlen),
+                   SHORTPAIR(hostlen),
+                   SHORTPAIR(hostoff),
+                   0x0, 0x0,
 
-                  0x0, 0x0,
-                  0x0, 0x0,
-                  0x0, 0x0,
-                  0x0, 0x0,
+                   0x0, 0x0,
+                   0x0, 0x0,
+                   0x0, 0x0,
+                   0x0, 0x0,
 
-                  LONGQUARTET(ntlm->flags));
+                   LONGQUARTET(ntlm->flags));
 
   DEBUGASSERT(size == 64);
   DEBUGASSERT(size == (size_t)lmrespoff);
@@ -776,11 +779,14 @@ CURLcode Curl_auth_create_ntlm_type3_message(struct Curl_easy *data,
   });
 
 #ifdef USE_NTRESPONSES
-  if(size < (NTLM_BUFSIZE - ntresplen)) {
-    DEBUGASSERT(size == (size_t)ntrespoff);
-    memcpy(&ntlmbuf[size], ptr_ntresp, ntresplen);
-    size += ntresplen;
+  /* ntresplen + size should not be risking an integer overflow here */
+  if(ntresplen + size > sizeof(ntlmbuf)) {
+    failf(data, "incoming NTLM message too big");
+    return CURLE_OUT_OF_MEMORY;
   }
+  DEBUGASSERT(size == (size_t)ntrespoff);
+  memcpy(&ntlmbuf[size], ptr_ntresp, ntresplen);
+  size += ntresplen;
 
   DEBUG_OUT({
     fprintf(stderr, "\n   ntresp=");
@@ -838,22 +844,22 @@ CURLcode Curl_auth_create_ntlm_type3_message(struct Curl_easy *data,
   /* Return with binary blob encoded into base64 */
   result = Curl_base64_encode(data, (char *)ntlmbuf, size, outptr, outlen);
 
-  Curl_auth_ntlm_cleanup(ntlm);
+  Curl_auth_cleanup_ntlm(ntlm);
 
   return result;
 }
 
 /*
-* Curl_auth_ntlm_cleanup()
-*
-* This is used to clean up the NTLM specific data.
-*
-* Parameters:
-*
-* ntlm    [in/out] - The NTLM data struct being cleaned up.
-*
-*/
-void Curl_auth_ntlm_cleanup(struct ntlmdata *ntlm)
+ * Curl_auth_cleanup_ntlm()
+ *
+ * This is used to clean up the NTLM specific data.
+ *
+ * Parameters:
+ *
+ * ntlm    [in/out] - The NTLM data struct being cleaned up.
+ *
+ */
+void Curl_auth_cleanup_ntlm(struct ntlmdata *ntlm)
 {
   /* Free the target info */
   Curl_safefree(ntlm->target_info);
index b66cfe7..cd6cb79 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -56,6 +56,11 @@ bool Curl_auth_is_ntlm_supported(void)
   status = s_pSecFn->QuerySecurityPackageInfo((TCHAR *) TEXT(SP_NAME_NTLM),
                                               &SecurityPackage);
 
+  /* Release the package buffer as it is not required anymore */
+  if(status == SEC_E_OK) {
+    s_pSecFn->FreeContextBuffer(SecurityPackage);
+  }
+
   return (status == SEC_E_OK ? TRUE : FALSE);
 }
 
@@ -95,7 +100,7 @@ CURLcode Curl_auth_create_ntlm_type1_message(struct Curl_easy *data,
   TimeStamp expiry; /* For Windows 9x compatibility of SSPI calls */
 
   /* Clean up any former leftovers and initialise to defaults */
-  Curl_auth_ntlm_cleanup(ntlm);
+  Curl_auth_cleanup_ntlm(ntlm);
 
   /* Query the security package for NTLM */
   status = s_pSecFn->QuerySecurityPackageInfo((TCHAR *) TEXT(SP_NAME_NTLM),
@@ -169,8 +174,10 @@ CURLcode Curl_auth_create_ntlm_type1_message(struct Curl_easy *data,
   if(status == SEC_I_COMPLETE_NEEDED ||
     status == SEC_I_COMPLETE_AND_CONTINUE)
     s_pSecFn->CompleteAuthToken(ntlm->context, &type_1_desc);
+  else if(status == SEC_E_INSUFFICIENT_MEMORY)
+    return CURLE_OUT_OF_MEMORY;
   else if(status != SEC_E_OK && status != SEC_I_CONTINUE_NEEDED)
-    return CURLE_RECV_ERROR;
+    return CURLE_AUTH_ERROR;
 
   /* Base64 encode the response */
   return Curl_base64_encode(data, (char *) ntlm->output_token,
@@ -249,7 +256,7 @@ CURLcode Curl_auth_create_ntlm_type3_message(struct Curl_easy *data,
                                              char **outptr, size_t *outlen)
 {
   CURLcode result = CURLE_OK;
-  SecBuffer type_2_buf;
+  SecBuffer type_2_bufs[2];
   SecBuffer type_3_buf;
   SecBufferDesc type_2_desc;
   SecBufferDesc type_3_desc;
@@ -261,12 +268,39 @@ CURLcode Curl_auth_create_ntlm_type3_message(struct Curl_easy *data,
   (void) userp;
 
   /* Setup the type-2 "input" security buffer */
-  type_2_desc.ulVersion = SECBUFFER_VERSION;
-  type_2_desc.cBuffers  = 1;
-  type_2_desc.pBuffers  = &type_2_buf;
-  type_2_buf.BufferType = SECBUFFER_TOKEN;
-  type_2_buf.pvBuffer   = ntlm->input_token;
-  type_2_buf.cbBuffer   = curlx_uztoul(ntlm->input_token_len);
+  type_2_desc.ulVersion     = SECBUFFER_VERSION;
+  type_2_desc.cBuffers      = 1;
+  type_2_desc.pBuffers      = &type_2_bufs[0];
+  type_2_bufs[0].BufferType = SECBUFFER_TOKEN;
+  type_2_bufs[0].pvBuffer   = ntlm->input_token;
+  type_2_bufs[0].cbBuffer   = curlx_uztoul(ntlm->input_token_len);
+
+#ifdef SECPKG_ATTR_ENDPOINT_BINDINGS
+  /* ssl context comes from schannel.
+  * When extended protection is used in IIS server,
+  * we have to pass a second SecBuffer to the SecBufferDesc
+  * otherwise IIS will not pass the authentication (401 response).
+  * Minimum supported version is Windows 7.
+  * https://docs.microsoft.com/en-us/security-updates
+  * /SecurityAdvisories/2009/973811
+  */
+  if(ntlm->sslContext) {
+    SEC_CHANNEL_BINDINGS channelBindings;
+    SecPkgContext_Bindings pkgBindings;
+    pkgBindings.Bindings = &channelBindings;
+    status = s_pSecFn->QueryContextAttributes(
+      ntlm->sslContext,
+      SECPKG_ATTR_ENDPOINT_BINDINGS,
+      &pkgBindings
+    );
+    if(status == SEC_E_OK) {
+      type_2_desc.cBuffers++;
+      type_2_bufs[1].BufferType = SECBUFFER_CHANNEL_BINDINGS;
+      type_2_bufs[1].cbBuffer = pkgBindings.BindingsLength;
+      type_2_bufs[1].pvBuffer = pkgBindings.Bindings;
+    }
+  }
+#endif
 
   /* Setup the type-3 "output" security buffer */
   type_3_desc.ulVersion = SECBUFFER_VERSION;
@@ -289,20 +323,23 @@ CURLcode Curl_auth_create_ntlm_type3_message(struct Curl_easy *data,
     infof(data, "NTLM handshake failure (type-3 message): Status=%x\n",
           status);
 
-    return CURLE_RECV_ERROR;
+    if(status == SEC_E_INSUFFICIENT_MEMORY)
+      return CURLE_OUT_OF_MEMORY;
+
+    return CURLE_AUTH_ERROR;
   }
 
   /* Base64 encode the response */
   result = Curl_base64_encode(data, (char *) ntlm->output_token,
                               type_3_buf.cbBuffer, outptr, outlen);
 
-  Curl_auth_ntlm_cleanup(ntlm);
+  Curl_auth_cleanup_ntlm(ntlm);
 
   return result;
 }
 
 /*
- * Curl_auth_ntlm_cleanup()
+ * Curl_auth_cleanup_ntlm()
  *
  * This is used to clean up the NTLM specific data.
  *
@@ -311,7 +348,7 @@ CURLcode Curl_auth_create_ntlm_type3_message(struct Curl_easy *data,
  * ntlm    [in/out] - The NTLM data struct being cleaned up.
  *
  */
-void Curl_auth_ntlm_cleanup(struct ntlmdata *ntlm)
+void Curl_auth_cleanup_ntlm(struct ntlmdata *ntlm)
 {
   /* Free our security context */
   if(ntlm->context) {
index 6288f89..b4e9f8e 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -24,6 +24,9 @@
 
 #include "curl_setup.h"
 
+#if !defined(CURL_DISABLE_IMAP) || !defined(CURL_DISABLE_SMTP) || \
+  !defined(CURL_DISABLE_POP3)
+
 #include <curl/curl.h>
 #include "urldata.h"
 
@@ -46,8 +49,8 @@
  *
  * data[in]         - The session handle.
  * user[in]         - The user name.
- * host[in]         - The host name(for OAUTHBEARER).
- * port[in]         - The port(for OAUTHBEARER when not Port 80).
+ * host[in]         - The host name.
+ * port[in]         - The port(when not Port 80).
  * bearer[in]       - The bearer token.
  * outptr[in / out] - The address where a pointer to newly allocated memory
  *                    holding the result will be stored upon completion.
@@ -66,13 +69,11 @@ CURLcode Curl_auth_create_oauth_bearer_message(struct Curl_easy *data,
   char *oauth = NULL;
 
   /* Generate the message */
-  if(host == NULL && (port == 0 || port == 80))
-    oauth = aprintf("user=%s\1auth=Bearer %s\1\1", user, bearer);
-  else if(port == 0 || port == 80)
-    oauth = aprintf("user=%s\1host=%s\1auth=Bearer %s\1\1", user, host,
+  if(port == 0 || port == 80)
+    oauth = aprintf("n,a=%s,\1host=%s\1auth=Bearer %s\1\1", user, host,
                     bearer);
   else
-    oauth = aprintf("user=%s\1host=%s\1port=%ld\1auth=Bearer %s\1\1", user,
+    oauth = aprintf("n,a=%s,\1host=%s\1port=%ld\1auth=Bearer %s\1\1", user,
                     host, port, bearer);
   if(!oauth)
     return CURLE_OUT_OF_MEMORY;
@@ -84,3 +85,42 @@ CURLcode Curl_auth_create_oauth_bearer_message(struct Curl_easy *data,
 
   return result;
 }
+
+/*
+ * Curl_auth_create_xoauth_bearer_message()
+ *
+ * This is used to generate an already encoded XOAuth 2.0 message ready for
+ * sending to the recipient.
+ *
+ * Parameters:
+ *
+ * data[in]         - The session handle.
+ * user[in]         - The user name.
+ * bearer[in]       - The bearer token.
+ * outptr[in / out] - The address where a pointer to newly allocated memory
+ *                    holding the result will be stored upon completion.
+ * outlen[out]      - The length of the output message.
+ *
+ * Returns CURLE_OK on success.
+ */
+CURLcode Curl_auth_create_xoauth_bearer_message(struct Curl_easy *data,
+                                               const char *user,
+                                               const char *bearer,
+                                               char **outptr, size_t *outlen)
+{
+  CURLcode result = CURLE_OK;
+
+  /* Generate the message */
+  char *xoauth = aprintf("user=%s\1auth=Bearer %s\1\1", user, bearer);
+  if(!xoauth)
+    return CURLE_OUT_OF_MEMORY;
+
+  /* Base64 encode the reply */
+  result = Curl_base64_encode(data, xoauth, strlen(xoauth), outptr, outlen);
+
+  free(xoauth);
+
+  return result;
+}
+#endif /* disabled, no users */
+
index 4a48bdd..ed7ce02 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -97,7 +97,7 @@ CURLcode Curl_auth_decode_spnego_message(struct Curl_easy *data,
     /* We finished successfully our part of authentication, but server
      * rejected it (since we're again here). Exit with an error since we
      * can't invent anything better */
-    Curl_auth_spnego_cleanup(nego);
+    Curl_auth_cleanup_spnego(nego);
     return CURLE_LOGIN_DENIED;
   }
 
@@ -121,7 +121,7 @@ CURLcode Curl_auth_decode_spnego_message(struct Curl_easy *data,
 
       free(spn);
 
-      return CURLE_OUT_OF_MEMORY;
+      return CURLE_AUTH_ERROR;
     }
 
     free(spn);
@@ -170,14 +170,14 @@ CURLcode Curl_auth_decode_spnego_message(struct Curl_easy *data,
     Curl_gss_log_error(data, "gss_init_sec_context() failed: ",
                        major_status, minor_status);
 
-    return CURLE_OUT_OF_MEMORY;
+    return CURLE_AUTH_ERROR;
   }
 
   if(!output_token.value || !output_token.length) {
     if(output_token.value)
       gss_release_buffer(&unused_status, &output_token);
 
-    return CURLE_OUT_OF_MEMORY;
+    return CURLE_AUTH_ERROR;
   }
 
   /* Free previous token */
@@ -238,7 +238,7 @@ CURLcode Curl_auth_create_spnego_message(struct Curl_easy *data,
 }
 
 /*
- * Curl_auth_spnego_cleanup()
+ * Curl_auth_cleanup_spnego()
  *
  * This is used to clean up the SPNEGO (Negotiate) specific data.
  *
@@ -247,7 +247,7 @@ CURLcode Curl_auth_create_spnego_message(struct Curl_easy *data,
  * nego     [in/out] - The Negotiate data struct being cleaned up.
  *
  */
-void Curl_auth_spnego_cleanup(struct negotiatedata *nego)
+void Curl_auth_cleanup_spnego(struct negotiatedata *nego)
 {
   OM_uint32 minor_status;
 
@@ -273,6 +273,10 @@ void Curl_auth_spnego_cleanup(struct negotiatedata *nego)
 
   /* Reset any variables */
   nego->status = 0;
+  nego->noauthpersist = FALSE;
+  nego->havenoauthpersist = FALSE;
+  nego->havenegdata = FALSE;
+  nego->havemultiplerequests = FALSE;
 }
 
 #endif /* HAVE_GSSAPI && USE_SPNEGO */
index 77d1895..b9c2cf7 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -59,6 +59,12 @@ bool Curl_auth_is_spnego_supported(void)
                                               TEXT(SP_NAME_NEGOTIATE),
                                               &SecurityPackage);
 
+  /* Release the package buffer as it is not required anymore */
+  if(status == SEC_E_OK) {
+    s_pSecFn->FreeContextBuffer(SecurityPackage);
+  }
+
+
   return (status == SEC_E_OK ? TRUE : FALSE);
 }
 
@@ -92,7 +98,7 @@ CURLcode Curl_auth_decode_spnego_message(struct Curl_easy *data,
   size_t chlglen = 0;
   unsigned char *chlg = NULL;
   PSecPkgInfo SecurityPackage;
-  SecBuffer chlg_buf;
+  SecBuffer chlg_buf[2];
   SecBuffer resp_buf;
   SecBufferDesc chlg_desc;
   SecBufferDesc resp_desc;
@@ -107,7 +113,7 @@ CURLcode Curl_auth_decode_spnego_message(struct Curl_easy *data,
     /* We finished successfully our part of authentication, but server
      * rejected it (since we're again here). Exit with an error since we
      * can't invent anything better */
-    Curl_auth_spnego_cleanup(nego);
+    Curl_auth_cleanup_spnego(nego);
     return CURLE_LOGIN_DENIED;
   }
 
@@ -165,7 +171,7 @@ CURLcode Curl_auth_decode_spnego_message(struct Curl_easy *data,
                                          nego->p_identity, NULL, NULL,
                                          nego->credentials, &expiry);
     if(nego->status != SEC_E_OK)
-      return CURLE_LOGIN_DENIED;
+      return CURLE_AUTH_ERROR;
 
     /* Allocate our new context handle */
     nego->context = calloc(1, sizeof(CtxtHandle));
@@ -189,12 +195,39 @@ CURLcode Curl_auth_decode_spnego_message(struct Curl_easy *data,
     }
 
     /* Setup the challenge "input" security buffer */
-    chlg_desc.ulVersion = SECBUFFER_VERSION;
-    chlg_desc.cBuffers  = 1;
-    chlg_desc.pBuffers  = &chlg_buf;
-    chlg_buf.BufferType = SECBUFFER_TOKEN;
-    chlg_buf.pvBuffer   = chlg;
-    chlg_buf.cbBuffer   = curlx_uztoul(chlglen);
+    chlg_desc.ulVersion    = SECBUFFER_VERSION;
+    chlg_desc.cBuffers     = 1;
+    chlg_desc.pBuffers     = &chlg_buf[0];
+    chlg_buf[0].BufferType = SECBUFFER_TOKEN;
+    chlg_buf[0].pvBuffer   = chlg;
+    chlg_buf[0].cbBuffer   = curlx_uztoul(chlglen);
+
+#ifdef SECPKG_ATTR_ENDPOINT_BINDINGS
+    /* ssl context comes from Schannel.
+    * When extended protection is used in IIS server,
+    * we have to pass a second SecBuffer to the SecBufferDesc
+    * otherwise IIS will not pass the authentication (401 response).
+    * Minimum supported version is Windows 7.
+    * https://docs.microsoft.com/en-us/security-updates
+    * /SecurityAdvisories/2009/973811
+    */
+    if(nego->sslContext) {
+      SEC_CHANNEL_BINDINGS channelBindings;
+      SecPkgContext_Bindings pkgBindings;
+      pkgBindings.Bindings = &channelBindings;
+      nego->status = s_pSecFn->QueryContextAttributes(
+          nego->sslContext,
+          SECPKG_ATTR_ENDPOINT_BINDINGS,
+          &pkgBindings
+      );
+      if(nego->status == SEC_E_OK) {
+        chlg_desc.cBuffers++;
+        chlg_buf[1].BufferType = SECBUFFER_CHANNEL_BINDINGS;
+        chlg_buf[1].cbBuffer   = pkgBindings.BindingsLength;
+        chlg_buf[1].pvBuffer   = pkgBindings.Bindings;
+      }
+    }
+#endif
   }
 
   /* Setup the response "output" security buffer */
@@ -221,16 +254,28 @@ CURLcode Curl_auth_decode_spnego_message(struct Curl_easy *data,
   free(chlg);
 
   if(GSS_ERROR(nego->status)) {
+    char buffer[STRERROR_LEN];
     failf(data, "InitializeSecurityContext failed: %s",
-          Curl_sspi_strerror(data->easy_conn, nego->status));
-    return CURLE_OUT_OF_MEMORY;
+          Curl_sspi_strerror(nego->status, buffer, sizeof(buffer)));
+
+    if(nego->status == (DWORD)SEC_E_INSUFFICIENT_MEMORY)
+      return CURLE_OUT_OF_MEMORY;
+
+    return CURLE_AUTH_ERROR;
   }
 
   if(nego->status == SEC_I_COMPLETE_NEEDED ||
      nego->status == SEC_I_COMPLETE_AND_CONTINUE) {
     nego->status = s_pSecFn->CompleteAuthToken(nego->context, &resp_desc);
     if(GSS_ERROR(nego->status)) {
-      return CURLE_RECV_ERROR;
+      char buffer[STRERROR_LEN];
+      failf(data, "CompleteAuthToken failed: %s",
+            Curl_sspi_strerror(nego->status, buffer, sizeof(buffer)));
+
+      if(nego->status == (DWORD)SEC_E_INSUFFICIENT_MEMORY)
+        return CURLE_OUT_OF_MEMORY;
+
+      return CURLE_AUTH_ERROR;
     }
   }
 
@@ -279,7 +324,7 @@ CURLcode Curl_auth_create_spnego_message(struct Curl_easy *data,
 }
 
 /*
- * Curl_auth_spnego_cleanup()
+ * Curl_auth_cleanup_spnego()
  *
  * This is used to clean up the SPNEGO (Negotiate) specific data.
  *
@@ -288,7 +333,7 @@ CURLcode Curl_auth_create_spnego_message(struct Curl_easy *data,
  * nego     [in/out] - The Negotiate data struct being cleaned up.
  *
  */
-void Curl_auth_spnego_cleanup(struct negotiatedata *nego)
+void Curl_auth_cleanup_spnego(struct negotiatedata *nego)
 {
   /* Free our security context */
   if(nego->context) {
@@ -315,6 +360,10 @@ void Curl_auth_spnego_cleanup(struct negotiatedata *nego)
   /* Reset any variables */
   nego->status = 0;
   nego->token_max = 0;
+  nego->noauthpersist = FALSE;
+  nego->havenoauthpersist = FALSE;
+  nego->havenegdata = FALSE;
+  nego->havemultiplerequests = FALSE;
 }
 
 #endif /* USE_WINDOWS_SSPI && USE_SPNEGO */
index 502d443..a9c5c9c 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 2014 - 2016, Steve Holme, <steve_holme@hotmail.com>.
+ * Copyright (C) 2014 - 2019, Steve Holme, <steve_holme@hotmail.com>.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -105,26 +105,26 @@ TCHAR *Curl_auth_build_spn(const char *service, const char *host,
 #endif /* USE_WINDOWS_SSPI */
 
 /*
-* Curl_auth_user_contains_domain()
-*
-* This is used to test if the specified user contains a Windows domain name as
-* follows:
-*
-* User\Domain (Down-level Logon Name)
-* User/Domain (curl Down-level format - for compatibility with existing code)
-* User@Domain (User Principal Name)
-*
-* Note: The user name may be empty when using a GSS-API library or Windows SSPI
-* as the user and domain are either obtained from the credentials cache when
-* using GSS-API or via the currently logged in user's credentials when using
-* Windows SSPI.
-*
-* Parameters:
-*
-* user  [in] - The user name.
-*
-* Returns TRUE on success; otherwise FALSE.
-*/
+ * Curl_auth_user_contains_domain()
+ *
+ * This is used to test if the specified user contains a Windows domain name as
+ * follows:
+ *
+ * Domain\User (Down-level Logon Name)
+ * Domain/User (curl Down-level format - for compatibility with existing code)
+ * User@Domain (User Principal Name)
+ *
+ * Note: The user name may be empty when using a GSS-API library or Windows
+ * SSPI as the user and domain are either obtained from the credentials cache
+ * when using GSS-API or via the currently logged in user's credentials when
+ * using Windows SSPI.
+ *
+ * Parameters:
+ *
+ * user  [in] - The user name.
+ *
+ * Returns TRUE on success; otherwise FALSE.
+ */
 bool Curl_auth_user_contains_domain(const char *user)
 {
   bool valid = FALSE;
index f430642..a1a557d 100644 (file)
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 2014 - 2017, Steve Holme, <steve_holme@hotmail.com>.
+ * Copyright (C) 2014 - 2019, Steve Holme, <steve_holme@hotmail.com>.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -43,7 +43,7 @@ struct negotiatedata;
 #endif
 
 #if defined(USE_WINDOWS_SSPI)
-#define GSS_ERROR(status) (status & 0x80000000)
+#define GSS_ERROR(status) ((status) & 0x80000000)
 #endif
 
 /* This is used to build a SPN string */
@@ -60,8 +60,9 @@ bool Curl_auth_user_contains_domain(const char *user);
 
 /* This is used to generate a base64 encoded PLAIN cleartext message */
 CURLcode Curl_auth_create_plain_message(struct Curl_easy *data,
-                                        const char *userp,
-                                        const char *passwdp,
+                                        const char *authzid,
+                                        const char *authcid,
+                                        const char *passwd,
                                         char **outptr, size_t *outlen);
 
 /* This is used to generate a base64 encoded LOGIN cleartext message */
@@ -141,7 +142,7 @@ CURLcode Curl_auth_create_ntlm_type3_message(struct Curl_easy *data,
                                              char **outptr, size_t *outlen);
 
 /* This is used to clean up the NTLM specific data */
-void Curl_auth_ntlm_cleanup(struct ntlmdata *ntlm);
+void Curl_auth_cleanup_ntlm(struct ntlmdata *ntlm);
 #endif /* USE_NTLM */
 
 /* This is used to generate a base64 encoded OAuth 2.0 message */
@@ -151,6 +152,13 @@ CURLcode Curl_auth_create_oauth_bearer_message(struct Curl_easy *data,
                                                const long port,
                                                const char *bearer,
                                                char **outptr, size_t *outlen);
+
+/* This is used to generate a base64 encoded XOAuth 2.0 message */
+CURLcode Curl_auth_create_xoauth_bearer_message(struct Curl_easy *data,
+                                                const char *user,
+                                                const char *bearer,
+                                                char **outptr, size_t *outlen);
+
 #if defined(USE_KERBEROS5)
 /* This is used to evaluate if GSSAPI (Kerberos V5) is supported */
 bool Curl_auth_is_gssapi_supported(void);
@@ -176,7 +184,7 @@ CURLcode Curl_auth_create_gssapi_security_message(struct Curl_easy *data,
                                                   size_t *outlen);
 
 /* This is used to clean up the GSSAPI specific data */
-void Curl_auth_gssapi_cleanup(struct kerberos5data *krb5);
+void Curl_auth_cleanup_gssapi(struct kerberos5data *krb5);
 #endif /* USE_KERBEROS5 */
 
 #if defined(USE_SPNEGO)
@@ -200,7 +208,7 @@ CURLcode Curl_auth_create_spnego_message(struct Curl_easy *data,
                                          char **outptr, size_t *outlen);
 
 /* This is used to clean up the SPNEGO specifiec data */
-void Curl_auth_spnego_cleanup(struct negotiatedata *nego);
+void Curl_auth_cleanup_spnego(struct negotiatedata *nego);
 
 #endif /* USE_SPNEGO */
 
index 05c2cd8..6405d36 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
 #include "urldata.h"
 #include "vtls/vtls.h"
 #include "http2.h"
-#include "ssh.h"
+#include "vssh/ssh.h"
+#include "quic.h"
 #include "curl_printf.h"
 
 #ifdef USE_ARES
 #  if defined(CURL_STATICLIB) && !defined(CARES_STATICLIB) && \
-     (defined(WIN32) || defined(_WIN32) || defined(__SYMBIAN32__))
+     (defined(WIN32) || defined(__SYMBIAN32__))
 #    define CARES_STATICLIB
 #  endif
 #  include <ares.h>
 #include <librtmp/rtmp.h>
 #endif
 
-#ifdef USE_LIBSSH2
-#include <libssh2.h>
-#endif
-
-#ifdef HAVE_LIBSSH2_VERSION
-/* get it run-time if possible */
-#define CURL_LIBSSH2_VERSION libssh2_version(0)
-#else
-/* use build-time if run-time not possible */
-#define CURL_LIBSSH2_VERSION LIBSSH2_VERSION
-#endif
-
 #ifdef HAVE_ZLIB_H
 #include <zlib.h>
 #ifdef __SYMBIAN32__
@@ -95,14 +84,14 @@ static size_t brotli_version(char *buf, size_t bufsz)
   unsigned int minor = (brotli_version & 0x00FFFFFF) >> 12;
   unsigned int patch = brotli_version & 0x00000FFF;
 
-  return snprintf(buf, bufsz, "%u.%u.%u", major, minor, patch);
+  return msnprintf(buf, bufsz, "%u.%u.%u", major, minor, patch);
 }
 #endif
 
 char *curl_version(void)
 {
   static bool initialized;
-  static char version[200];
+  static char version[250];
   char *ptr = version;
   size_t len;
   size_t left = sizeof(version);
@@ -115,23 +104,21 @@ char *curl_version(void)
   left -= len;
   ptr += len;
 
-  if(left > 1) {
-    len = Curl_ssl_version(ptr + 1, left - 1);
+  len = Curl_ssl_version(ptr + 1, left - 1);
 
-    if(len > 0) {
-      *ptr = ' ';
-      left -= ++len;
-      ptr += len;
-    }
+  if(len > 0) {
+    *ptr = ' ';
+    left -= ++len;
+    ptr += len;
   }
 
 #ifdef HAVE_LIBZ
-  len = snprintf(ptr, left, " zlib/%s", zlibVersion());
+  len = msnprintf(ptr, left, " zlib/%s", zlibVersion());
   left -= len;
   ptr += len;
 #endif
 #ifdef HAVE_BROTLI
-  len = snprintf(ptr, left, "%s", " brotli/");
+  len = msnprintf(ptr, left, "%s", " brotli/");
   left -= len;
   ptr += len;
   len = brotli_version(ptr, left);
@@ -140,50 +127,54 @@ char *curl_version(void)
 #endif
 #ifdef USE_ARES
   /* this function is only present in c-ares, not in the original ares */
-  len = snprintf(ptr, left, " c-ares/%s", ares_version(NULL));
+  len = msnprintf(ptr, left, " c-ares/%s", ares_version(NULL));
   left -= len;
   ptr += len;
 #endif
 #ifdef USE_LIBIDN2
   if(idn2_check_version(IDN2_VERSION)) {
-    len = snprintf(ptr, left, " libidn2/%s", idn2_check_version(NULL));
+    len = msnprintf(ptr, left, " libidn2/%s", idn2_check_version(NULL));
     left -= len;
     ptr += len;
   }
 #endif
 #ifdef USE_LIBPSL
-  len = snprintf(ptr, left, " libpsl/%s", psl_get_version());
+  len = msnprintf(ptr, left, " libpsl/%s", psl_get_version());
   left -= len;
   ptr += len;
 #endif
 #ifdef USE_WIN32_IDN
-  len = snprintf(ptr, left, " WinIDN");
+  len = msnprintf(ptr, left, " WinIDN");
   left -= len;
   ptr += len;
 #endif
 #if defined(HAVE_ICONV) && defined(CURL_DOES_CONVERSIONS)
 #ifdef _LIBICONV_VERSION
-  len = snprintf(ptr, left, " iconv/%d.%d",
-                 _LIBICONV_VERSION >> 8, _LIBICONV_VERSION & 255);
+  len = msnprintf(ptr, left, " iconv/%d.%d",
+                  _LIBICONV_VERSION >> 8, _LIBICONV_VERSION & 255);
 #else
   /* version unknown */
-  len = snprintf(ptr, left, " iconv");
+  len = msnprintf(ptr, left, " iconv");
 #endif /* _LIBICONV_VERSION */
   left -= len;
   ptr += len;
 #endif
-#ifdef USE_LIBSSH2
-  len = snprintf(ptr, left, " libssh2/%s", CURL_LIBSSH2_VERSION);
+#ifdef USE_SSH
+  if(left) {
+    *ptr++=' ';
+    left--;
+  }
+  len = Curl_ssh_version(ptr, left);
   left -= len;
   ptr += len;
 #endif
-#ifdef USE_LIBSSH
-  len = snprintf(ptr, left, " libssh/%s", CURL_LIBSSH_VERSION);
+#ifdef USE_NGHTTP2
+  len = Curl_http2_ver(ptr, left);
   left -= len;
   ptr += len;
 #endif
-#ifdef USE_NGHTTP2
-  len = Curl_http2_ver(ptr, left);
+#ifdef ENABLE_QUIC
+  len = Curl_quic_ver(ptr, left);
   left -= len;
   ptr += len;
 #endif
@@ -197,14 +188,14 @@ char *curl_version(void)
     else
       suff[0] = '\0';
 
-    snprintf(ptr, left, " librtmp/%d.%d%s",
-             RTMP_LIB_VERSION >> 16, (RTMP_LIB_VERSION >> 8) & 0xff,
-             suff);
+    msnprintf(ptr, left, " librtmp/%d.%d%s",
+              RTMP_LIB_VERSION >> 16, (RTMP_LIB_VERSION >> 8) & 0xff,
+              suff);
 /*
   If another lib version is added below this one, this code would
   also have to do:
 
-    len = what snprintf() returned
+    len = what msnprintf() returned
 
     left -= len;
     ptr += len;
@@ -212,6 +203,10 @@ char *curl_version(void)
   }
 #endif
 
+  /* Silent scan-build even if librtmp is not enabled. */
+  (void) left;
+  (void) ptr;
+
   initialized = true;
   return version;
 }
@@ -270,7 +265,7 @@ static const char * const protocols[] = {
 #ifndef CURL_DISABLE_RTSP
   "rtsp",
 #endif
-#if defined(USE_LIBSSH) || defined(USE_LIBSSH2)
+#if defined(USE_SSH)
   "scp",
   "sftp",
 #endif
@@ -354,6 +349,9 @@ static curl_version_info_data version_info = {
 #if defined(USE_NGHTTP2)
   | CURL_VERSION_HTTP2
 #endif
+#if defined(ENABLE_QUIC)
+  | CURL_VERSION_HTTP3
+#endif
 #if defined(USE_UNIX_SOCKETS)
   | CURL_VERSION_UNIX_SOCKETS
 #endif
@@ -366,6 +364,12 @@ static curl_version_info_data version_info = {
 #if defined(HAVE_BROTLI)
   | CURL_VERSION_BROTLI
 #endif
+#if defined(USE_ALTSVC)
+  | CURL_VERSION_ALTSVC
+#endif
+#ifdef USE_ESNI
+  | CURL_VERSION_ESNI
+#endif
   ,
   NULL, /* ssl_version */
   0,    /* ssl_version_num, this is kept at zero */
@@ -378,17 +382,24 @@ static curl_version_info_data version_info = {
   NULL, /* ssh lib version */
   0,    /* brotli_ver_num */
   NULL, /* brotli version */
+  0,    /* nghttp2 version number */
+  NULL, /* nghttp2 version string */
+  NULL  /* quic library string */
 };
 
 curl_version_info_data *curl_version_info(CURLversion stamp)
 {
   static bool initialized;
-#if defined(USE_LIBSSH) || defined(USE_LIBSSH2)
+#if defined(USE_SSH)
   static char ssh_buffer[80];
 #endif
 #ifdef USE_SSL
+#ifdef CURL_WITH_MULTI_SSL
+  static char ssl_buffer[200];
+#else
   static char ssl_buffer[80];
 #endif
+#endif
 #ifdef HAVE_BROTLI
   static char brotli_buffer[80];
 #endif
@@ -435,11 +446,8 @@ curl_version_info_data *curl_version_info(CURLversion stamp)
 #endif /* _LIBICONV_VERSION */
 #endif
 
-#if defined(USE_LIBSSH2)
-  snprintf(ssh_buffer, sizeof(ssh_buffer), "libssh2/%s", LIBSSH2_VERSION);
-  version_info.libssh_version = ssh_buffer;
-#elif defined(USE_LIBSSH)
-  snprintf(ssh_buffer, sizeof(ssh_buffer), "libssh/%s", CURL_LIBSSH_VERSION);
+#if defined(USE_SSH)
+  Curl_ssh_version(ssh_buffer, sizeof(ssh_buffer));
   version_info.libssh_version = ssh_buffer;
 #endif
 
@@ -449,6 +457,22 @@ curl_version_info_data *curl_version_info(CURLversion stamp)
   version_info.brotli_version = brotli_buffer;
 #endif
 
+#ifdef USE_NGHTTP2
+  {
+    nghttp2_info *h2 = nghttp2_version(0);
+    version_info.nghttp2_ver_num = h2->version_num;
+    version_info.nghttp2_version = h2->version_str;
+  }
+#endif
+
+#ifdef ENABLE_QUIC
+  {
+    static char quicbuffer[80];
+    Curl_quic_ver(quicbuffer, sizeof(quicbuffer));
+    version_info.quic_version = quicbuffer;
+  }
+#endif
+
   (void)stamp; /* avoid compiler warnings, we don't use this */
 
   initialized = true;
diff --git a/lib/vquic/ngtcp2.c b/lib/vquic/ngtcp2.c
new file mode 100644 (file)
index 0000000..e97e9e8
--- /dev/null
@@ -0,0 +1,1765 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+
+#include "curl_setup.h"
+
+#ifdef USE_NGTCP2
+#include <ngtcp2/ngtcp2.h>
+#include <ngtcp2/ngtcp2_crypto.h>
+#include <nghttp3/nghttp3.h>
+#include <openssl/err.h>
+#include "urldata.h"
+#include "sendf.h"
+#include "strdup.h"
+#include "rand.h"
+#include "ngtcp2.h"
+#include "multiif.h"
+#include "strcase.h"
+#include "connect.h"
+#include "strerror.h"
+
+/* The last 3 #include files should be in this order */
+#include "curl_printf.h"
+#include "curl_memory.h"
+#include "memdebug.h"
+
+/* #define DEBUG_NGTCP2 */
+#ifdef CURLDEBUG
+#define DEBUG_HTTP3
+#endif
+#ifdef DEBUG_HTTP3
+#define H3BUGF(x) x
+#else
+#define H3BUGF(x) do { } while(0)
+#endif
+
+/*
+ * This holds outgoing HTTP/3 stream data that is used by nghttp3 until acked.
+ * It is used as a circular buffer. Add new bytes at the end until it reaches
+ * the far end, then start over at index 0 again.
+ */
+
+#define H3_SEND_SIZE (20*1024)
+struct h3out {
+  uint8_t buf[H3_SEND_SIZE];
+  size_t used;   /* number of bytes used in the buffer */
+  size_t windex; /* index in the buffer where to start writing the next
+                    data block */
+};
+
+#define QUIC_MAX_STREAMS (256*1024)
+#define QUIC_MAX_DATA (1*1024*1024)
+#define QUIC_IDLE_TIMEOUT 60000 /* milliseconds */
+#define QUIC_CIPHERS                                                          \
+  "TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_"               \
+  "POLY1305_SHA256:TLS_AES_128_CCM_SHA256"
+#define QUIC_GROUPS "P-256:X25519:P-384:P-521"
+
+static CURLcode ng_process_ingress(struct connectdata *conn,
+                                   curl_socket_t sockfd,
+                                   struct quicsocket *qs);
+static CURLcode ng_flush_egress(struct connectdata *conn, int sockfd,
+                                struct quicsocket *qs);
+static int cb_h3_acked_stream_data(nghttp3_conn *conn, int64_t stream_id,
+                                   size_t datalen, void *user_data,
+                                   void *stream_user_data);
+
+static ngtcp2_tstamp timestamp(void)
+{
+  struct curltime ct = Curl_now();
+  return ct.tv_sec * NGTCP2_SECONDS + ct.tv_usec * NGTCP2_MICROSECONDS;
+}
+
+#ifdef DEBUG_NGTCP2
+static void quic_printf(void *user_data, const char *fmt, ...)
+{
+  va_list ap;
+  (void)user_data; /* TODO, use this to do infof() instead long-term */
+  va_start(ap, fmt);
+  vfprintf(stderr, fmt, ap);
+  va_end(ap);
+  fprintf(stderr, "\n");
+}
+#endif
+
+static ngtcp2_crypto_level
+quic_from_ossl_level(OSSL_ENCRYPTION_LEVEL ossl_level)
+{
+  switch(ossl_level) {
+  case ssl_encryption_initial:
+    return NGTCP2_CRYPTO_LEVEL_INITIAL;
+  case ssl_encryption_early_data:
+    return NGTCP2_CRYPTO_LEVEL_EARLY;
+  case ssl_encryption_handshake:
+    return NGTCP2_CRYPTO_LEVEL_HANDSHAKE;
+  case ssl_encryption_application:
+    return NGTCP2_CRYPTO_LEVEL_APP;
+  default:
+    assert(0);
+  }
+}
+
+static int setup_initial_crypto_context(struct quicsocket *qs)
+{
+  const ngtcp2_cid *dcid = ngtcp2_conn_get_dcid(qs->qconn);
+
+  if(ngtcp2_crypto_derive_and_install_initial_key(
+         qs->qconn, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, dcid,
+         NGTCP2_CRYPTO_SIDE_CLIENT) != 0)
+    return -1;
+
+  return 0;
+}
+
+static void quic_settings(ngtcp2_settings *s,
+                          uint64_t stream_buffer_size)
+{
+  ngtcp2_settings_default(s);
+#ifdef DEBUG_NGTCP2
+  s->log_printf = quic_printf;
+#else
+  s->log_printf = NULL;
+#endif
+  s->initial_ts = timestamp();
+  s->transport_params.initial_max_stream_data_bidi_local = stream_buffer_size;
+  s->transport_params.initial_max_stream_data_bidi_remote = QUIC_MAX_STREAMS;
+  s->transport_params.initial_max_stream_data_uni = QUIC_MAX_STREAMS;
+  s->transport_params.initial_max_data = QUIC_MAX_DATA;
+  s->transport_params.initial_max_streams_bidi = 1;
+  s->transport_params.initial_max_streams_uni = 3;
+  s->transport_params.idle_timeout = QUIC_IDLE_TIMEOUT;
+}
+
+static FILE *keylog_file; /* not thread-safe */
+static void keylog_callback(const SSL *ssl, const char *line)
+{
+  (void)ssl;
+  fputs(line, keylog_file);
+  fputc('\n', keylog_file);
+  fflush(keylog_file);
+}
+
+static int init_ngh3_conn(struct quicsocket *qs);
+
+static int quic_set_encryption_secrets(SSL *ssl,
+                                       OSSL_ENCRYPTION_LEVEL ossl_level,
+                                       const uint8_t *rx_secret,
+                                       const uint8_t *tx_secret,
+                                       size_t secretlen)
+{
+  struct quicsocket *qs = (struct quicsocket *)SSL_get_app_data(ssl);
+  int level = quic_from_ossl_level(ossl_level);
+
+  if(ngtcp2_crypto_derive_and_install_key(
+         qs->qconn, ssl, NULL, NULL, NULL, NULL, NULL, NULL, level, rx_secret,
+         tx_secret, secretlen, NGTCP2_CRYPTO_SIDE_CLIENT) != 0)
+    return 0;
+
+  if(level == NGTCP2_CRYPTO_LEVEL_APP) {
+    if(init_ngh3_conn(qs) != CURLE_OK)
+      return 0;
+  }
+
+  return 1;
+}
+
+static int quic_add_handshake_data(SSL *ssl, OSSL_ENCRYPTION_LEVEL ossl_level,
+                                   const uint8_t *data, size_t len)
+{
+  struct quicsocket *qs = (struct quicsocket *)SSL_get_app_data(ssl);
+  struct quic_handshake *crypto_data;
+  ngtcp2_crypto_level level = quic_from_ossl_level(ossl_level);
+  int rv;
+
+  crypto_data = &qs->crypto_data[level];
+  if(crypto_data->buf == NULL) {
+    crypto_data->buf = malloc(4096);
+    if(!crypto_data->buf)
+      return 0;
+    crypto_data->alloclen = 4096;
+  }
+
+  /* TODO Just pretend that handshake does not grow more than 4KiB for
+     now */
+  assert(crypto_data->len + len <= crypto_data->alloclen);
+
+  memcpy(&crypto_data->buf[crypto_data->len], data, len);
+  crypto_data->len += len;
+
+  rv = ngtcp2_conn_submit_crypto_data(
+    qs->qconn, level, (uint8_t *)(&crypto_data->buf[crypto_data->len] - len),
+    len);
+  if(rv) {
+    H3BUGF(fprintf(stderr, "write_client_handshake failed\n"));
+  }
+  assert(0 == rv);
+
+  return 1;
+}
+
+static int quic_flush_flight(SSL *ssl)
+{
+  (void)ssl;
+  return 1;
+}
+
+static int quic_send_alert(SSL *ssl, enum ssl_encryption_level_t level,
+                           uint8_t alert)
+{
+  struct quicsocket *qs = (struct quicsocket *)SSL_get_app_data(ssl);
+  (void)level;
+
+  qs->tls_alert = alert;
+  return 1;
+}
+
+static SSL_QUIC_METHOD quic_method = {quic_set_encryption_secrets,
+                                      quic_add_handshake_data,
+                                      quic_flush_flight, quic_send_alert};
+
+static SSL_CTX *quic_ssl_ctx(struct Curl_easy *data)
+{
+  SSL_CTX *ssl_ctx = SSL_CTX_new(TLS_method());
+  const char *keylog_filename;
+
+  SSL_CTX_set_min_proto_version(ssl_ctx, TLS1_3_VERSION);
+  SSL_CTX_set_max_proto_version(ssl_ctx, TLS1_3_VERSION);
+
+  SSL_CTX_set_default_verify_paths(ssl_ctx);
+
+  if(SSL_CTX_set_ciphersuites(ssl_ctx, QUIC_CIPHERS) != 1) {
+    char error_buffer[256];
+    ERR_error_string_n(ERR_get_error(), error_buffer, sizeof(error_buffer));
+    failf(data, "SSL_CTX_set_ciphersuites: %s", error_buffer);
+    return NULL;
+  }
+
+  if(SSL_CTX_set1_groups_list(ssl_ctx, QUIC_GROUPS) != 1) {
+    failf(data, "SSL_CTX_set1_groups_list failed");
+    return NULL;
+  }
+
+  SSL_CTX_set_quic_method(ssl_ctx, &quic_method);
+
+  keylog_filename = getenv("SSLKEYLOGFILE");
+  if(keylog_filename) {
+    keylog_file = fopen(keylog_filename, "wb");
+    if(keylog_file) {
+      SSL_CTX_set_keylog_callback(ssl_ctx, keylog_callback);
+    }
+  }
+
+  return ssl_ctx;
+}
+
+/** SSL callbacks ***/
+
+static int quic_init_ssl(struct quicsocket *qs)
+{
+  const uint8_t *alpn = NULL;
+  size_t alpnlen = 0;
+  /* this will need some attention when HTTPS proxy over QUIC get fixed */
+  const char * const hostname = qs->conn->host.name;
+
+  if(qs->ssl)
+    SSL_free(qs->ssl);
+
+  qs->ssl = SSL_new(qs->sslctx);
+
+  SSL_set_app_data(qs->ssl, qs);
+  SSL_set_connect_state(qs->ssl);
+
+  switch(qs->version) {
+#ifdef NGTCP2_PROTO_VER
+  case NGTCP2_PROTO_VER:
+    alpn = (const uint8_t *)NGTCP2_ALPN_H3;
+    alpnlen = sizeof(NGTCP2_ALPN_H3) - 1;
+    break;
+#endif
+  }
+  if(alpn)
+    SSL_set_alpn_protos(qs->ssl, alpn, (int)alpnlen);
+
+  /* set SNI */
+  SSL_set_tlsext_host_name(qs->ssl, hostname);
+  return 0;
+}
+
+static int cb_initial(ngtcp2_conn *quic, void *user_data)
+{
+  struct quicsocket *qs = (struct quicsocket *)user_data;
+
+  if(ngtcp2_crypto_read_write_crypto_data(
+       quic, qs->ssl, NGTCP2_CRYPTO_LEVEL_INITIAL, NULL, 0) != 0)
+    return NGTCP2_ERR_CALLBACK_FAILURE;
+
+  return 0;
+}
+
+static int
+cb_recv_crypto_data(ngtcp2_conn *tconn, ngtcp2_crypto_level crypto_level,
+                    uint64_t offset,
+                    const uint8_t *data, size_t datalen,
+                    void *user_data)
+{
+  struct quicsocket *qs = (struct quicsocket *)user_data;
+  (void)offset;
+
+  if(ngtcp2_crypto_read_write_crypto_data(tconn, qs->ssl, crypto_level, data,
+                                          datalen) != 0)
+    return NGTCP2_ERR_CRYPTO;
+
+  return 0;
+}
+
+static int cb_handshake_completed(ngtcp2_conn *tconn, void *user_data)
+{
+  struct quicsocket *qs = (struct quicsocket *)user_data;
+  (void)tconn;
+  infof(qs->conn->data, "QUIC handshake is completed\n");
+
+  return 0;
+}
+
+static void extend_stream_window(ngtcp2_conn *tconn,
+                                 struct HTTP *stream)
+{
+  size_t thismuch = stream->unacked_window;
+  ngtcp2_conn_extend_max_stream_offset(tconn, stream->stream3_id, thismuch);
+  ngtcp2_conn_extend_max_offset(tconn, thismuch);
+  stream->unacked_window = 0;
+}
+
+
+static int cb_recv_stream_data(ngtcp2_conn *tconn, int64_t stream_id,
+                               int fin, uint64_t offset,
+                               const uint8_t *buf, size_t buflen,
+                               void *user_data, void *stream_user_data)
+{
+  struct quicsocket *qs = (struct quicsocket *)user_data;
+  ssize_t nconsumed;
+  (void)offset;
+  (void)stream_user_data;
+
+  nconsumed =
+    nghttp3_conn_read_stream(qs->h3conn, stream_id, buf, buflen, fin);
+  if(nconsumed < 0) {
+    failf(qs->conn->data, "nghttp3_conn_read_stream returned error: %s\n",
+          nghttp3_strerror((int)nconsumed));
+    return NGTCP2_ERR_CALLBACK_FAILURE;
+  }
+
+  /* number of bytes inside buflen which consists of framing overhead
+   * including QPACK HEADERS. In other words, it does not consume payload of
+   * DATA frame. */
+  ngtcp2_conn_extend_max_stream_offset(tconn, stream_id, nconsumed);
+  ngtcp2_conn_extend_max_offset(tconn, nconsumed);
+
+  return 0;
+}
+
+static int
+cb_acked_stream_data_offset(ngtcp2_conn *tconn, int64_t stream_id,
+                            uint64_t offset, size_t datalen, void *user_data,
+                            void *stream_user_data)
+{
+  struct quicsocket *qs = (struct quicsocket *)user_data;
+  int rv;
+  (void)stream_id;
+  (void)tconn;
+  (void)offset;
+  (void)datalen;
+  (void)stream_user_data;
+
+  rv = nghttp3_conn_add_ack_offset(qs->h3conn, stream_id, datalen);
+  if(rv != 0) {
+    failf(qs->conn->data, "nghttp3_conn_add_ack_offset returned error: %s\n",
+          nghttp3_strerror(rv));
+    return NGTCP2_ERR_CALLBACK_FAILURE;
+  }
+
+  return 0;
+}
+
+static int cb_stream_close(ngtcp2_conn *tconn, int64_t stream_id,
+                           uint64_t app_error_code,
+                           void *user_data, void *stream_user_data)
+{
+  struct quicsocket *qs = (struct quicsocket *)user_data;
+  int rv;
+  (void)tconn;
+  (void)stream_user_data;
+  /* stream is closed... */
+
+  rv = nghttp3_conn_close_stream(qs->h3conn, stream_id,
+                                 app_error_code);
+  if(rv != 0) {
+    failf(qs->conn->data, "nghttp3_conn_close_stream returned error: %s\n",
+          nghttp3_strerror(rv));
+    return NGTCP2_ERR_CALLBACK_FAILURE;
+  }
+
+  return 0;
+}
+
+static int cb_stream_reset(ngtcp2_conn *tconn, int64_t stream_id,
+                           uint64_t final_size, uint64_t app_error_code,
+                           void *user_data, void *stream_user_data)
+{
+  struct quicsocket *qs = (struct quicsocket *)user_data;
+  int rv;
+  (void)tconn;
+  (void)final_size;
+  (void)app_error_code;
+  (void)stream_user_data;
+
+  rv = nghttp3_conn_reset_stream(qs->h3conn, stream_id);
+  if(rv != 0) {
+    failf(qs->conn->data, "nghttp3_conn_reset_stream returned error: %s\n",
+          nghttp3_strerror(rv));
+    return NGTCP2_ERR_CALLBACK_FAILURE;
+  }
+
+  return 0;
+}
+
+static int cb_recv_retry(ngtcp2_conn *tconn, const ngtcp2_pkt_hd *hd,
+                         const ngtcp2_pkt_retry *retry, void *user_data)
+{
+  /* Re-generate handshake secrets here because connection ID might change. */
+  struct quicsocket *qs = (struct quicsocket *)user_data;
+  (void)tconn;
+  (void)hd;
+  (void)retry;
+
+  setup_initial_crypto_context(qs);
+
+  return 0;
+}
+
+static int cb_extend_max_local_streams_bidi(ngtcp2_conn *tconn,
+                                            uint64_t max_streams,
+                                            void *user_data)
+{
+  (void)tconn;
+  (void)max_streams;
+  (void)user_data;
+
+  return 0;
+}
+
+static int cb_extend_max_stream_data(ngtcp2_conn *tconn, int64_t stream_id,
+                                     uint64_t max_data, void *user_data,
+                                     void *stream_user_data)
+{
+  struct quicsocket *qs = (struct quicsocket *)user_data;
+  int rv;
+  (void)tconn;
+  (void)max_data;
+  (void)stream_user_data;
+
+  rv = nghttp3_conn_unblock_stream(qs->h3conn, stream_id);
+  if(rv != 0) {
+    failf(qs->conn->data, "nghttp3_conn_unblock_stream returned error: %s\n",
+          nghttp3_strerror(rv));
+    return NGTCP2_ERR_CALLBACK_FAILURE;
+  }
+
+  return 0;
+}
+
+static int cb_get_new_connection_id(ngtcp2_conn *tconn, ngtcp2_cid *cid,
+                                    uint8_t *token, size_t cidlen,
+                                    void *user_data)
+{
+  struct quicsocket *qs = (struct quicsocket *)user_data;
+  CURLcode result;
+  (void)tconn;
+
+  result = Curl_rand(qs->conn->data, cid->data, cidlen);
+  if(result)
+    return NGTCP2_ERR_CALLBACK_FAILURE;
+  cid->datalen = cidlen;
+
+  result = Curl_rand(qs->conn->data, token, NGTCP2_STATELESS_RESET_TOKENLEN);
+  if(result)
+    return NGTCP2_ERR_CALLBACK_FAILURE;
+
+  return 0;
+}
+
+static ngtcp2_conn_callbacks ng_callbacks = {
+  cb_initial,
+  NULL, /* recv_client_initial */
+  cb_recv_crypto_data,
+  cb_handshake_completed,
+  NULL, /* recv_version_negotiation */
+  ngtcp2_crypto_encrypt_cb,
+  ngtcp2_crypto_decrypt_cb,
+  ngtcp2_crypto_hp_mask_cb,
+  cb_recv_stream_data,
+  NULL, /* acked_crypto_offset */
+  cb_acked_stream_data_offset,
+  NULL, /* stream_open */
+  cb_stream_close,
+  NULL, /* recv_stateless_reset */
+  cb_recv_retry,
+  cb_extend_max_local_streams_bidi,
+  NULL, /* extend_max_local_streams_uni */
+  NULL, /* rand  */
+  cb_get_new_connection_id,
+  NULL, /* remove_connection_id */
+  ngtcp2_crypto_update_key_cb, /* update_key */
+  NULL, /* path_validation */
+  NULL, /* select_preferred_addr */
+  cb_stream_reset,
+  NULL, /* extend_max_remote_streams_bidi */
+  NULL, /* extend_max_remote_streams_uni */
+  cb_extend_max_stream_data,
+};
+
+/*
+ * Might be called twice for happy eyeballs.
+ */
+CURLcode Curl_quic_connect(struct connectdata *conn,
+                           curl_socket_t sockfd,
+                           int sockindex,
+                           const struct sockaddr *addr,
+                           socklen_t addrlen)
+{
+  int rc;
+  int rv;
+  CURLcode result;
+  ngtcp2_path path; /* TODO: this must be initialized properly */
+  struct Curl_easy *data = conn->data;
+  struct quicsocket *qs = &conn->hequic[sockindex];
+  char ipbuf[40];
+  long port;
+  uint8_t paramsbuf[64];
+  ngtcp2_transport_params params;
+  ssize_t nwrite;
+
+  qs->conn = conn;
+
+  /* extract the used address as a string */
+  if(!Curl_addr2string((struct sockaddr*)addr, addrlen, ipbuf, &port)) {
+    char buffer[STRERROR_LEN];
+    failf(data, "ssrem inet_ntop() failed with errno %d: %s",
+          SOCKERRNO, Curl_strerror(SOCKERRNO, buffer, sizeof(buffer)));
+    return CURLE_BAD_FUNCTION_ARGUMENT;
+  }
+
+  infof(data, "Connect socket %d over QUIC to %s:%ld\n",
+        sockfd, ipbuf, port);
+
+  qs->version = NGTCP2_PROTO_VER;
+  qs->sslctx = quic_ssl_ctx(data);
+  if(!qs->sslctx)
+    return CURLE_FAILED_INIT; /* TODO: better return code */
+
+  if(quic_init_ssl(qs))
+    return CURLE_FAILED_INIT; /* TODO: better return code */
+
+  qs->dcid.datalen = NGTCP2_MAX_CIDLEN;
+  result = Curl_rand(data, qs->dcid.data, NGTCP2_MAX_CIDLEN);
+  if(result)
+    return result;
+
+  qs->scid.datalen = NGTCP2_MAX_CIDLEN;
+  result = Curl_rand(data, qs->scid.data, NGTCP2_MAX_CIDLEN);
+  if(result)
+    return result;
+
+  quic_settings(&qs->settings, data->set.buffer_size);
+
+  qs->local_addrlen = sizeof(qs->local_addr);
+  rv = getsockname(sockfd, (struct sockaddr *)&qs->local_addr,
+                   &qs->local_addrlen);
+  if(rv == -1)
+    return CURLE_FAILED_INIT;
+
+  ngtcp2_addr_init(&path.local, (uint8_t *)&qs->local_addr, qs->local_addrlen,
+                   NULL);
+  ngtcp2_addr_init(&path.remote, (uint8_t*)addr, addrlen, NULL);
+
+#ifdef NGTCP2_PROTO_VER
+#define QUICVER NGTCP2_PROTO_VER
+#else
+#error "unsupported ngtcp2 version"
+#endif
+  rc = ngtcp2_conn_client_new(&qs->qconn, &qs->dcid, &qs->scid, &path, QUICVER,
+                              &ng_callbacks, &qs->settings, NULL, qs);
+  if(rc)
+    return CURLE_FAILED_INIT; /* TODO: create a QUIC error code */
+
+  ngtcp2_conn_get_local_transport_params(qs->qconn, &params);
+  nwrite = ngtcp2_encode_transport_params(
+    paramsbuf, sizeof(paramsbuf), NGTCP2_TRANSPORT_PARAMS_TYPE_CLIENT_HELLO,
+    &params);
+  if(nwrite < 0) {
+    failf(data, "ngtcp2_encode_transport_params: %s\n",
+          ngtcp2_strerror((int)nwrite));
+    return CURLE_FAILED_INIT;
+  }
+
+  if(!SSL_set_quic_transport_params(qs->ssl, paramsbuf, nwrite))
+    return CURLE_FAILED_INIT;
+
+  rc = setup_initial_crypto_context(qs);
+  if(rc)
+    return CURLE_FAILED_INIT; /* TODO: better return code */
+
+  return CURLE_OK;
+}
+
+/*
+ * Store ngtp2 version info in this buffer, Prefix with a space.  Return total
+ * length written.
+ */
+int Curl_quic_ver(char *p, size_t len)
+{
+  ngtcp2_info *ng2 = ngtcp2_version(0);
+  nghttp3_info *ht3 = nghttp3_version(0);
+  return msnprintf(p, len, " ngtcp2/%s nghttp3/%s",
+                   ng2->version_str, ht3->version_str);
+}
+
+static int ng_getsock(struct connectdata *conn, curl_socket_t *socks)
+{
+  struct SingleRequest *k = &conn->data->req;
+  int bitmap = GETSOCK_BLANK;
+
+  socks[0] = conn->sock[FIRSTSOCKET];
+
+  /* in a HTTP/2 connection we can basically always get a frame so we should
+     always be ready for one */
+  bitmap |= GETSOCK_READSOCK(FIRSTSOCKET);
+
+  /* we're still uploading or the HTTP/2 layer wants to send data */
+  if((k->keepon & (KEEP_SEND|KEEP_SEND_PAUSE)) == KEEP_SEND)
+    bitmap |= GETSOCK_WRITESOCK(FIRSTSOCKET);
+
+  return bitmap;
+}
+
+static int ng_perform_getsock(const struct connectdata *conn,
+                              curl_socket_t *socks)
+{
+  return ng_getsock((struct connectdata *)conn, socks);
+}
+
+static CURLcode ng_disconnect(struct connectdata *conn,
+                              bool dead_connection)
+{
+  int i;
+  struct quicsocket *qs = &conn->hequic[0];
+  (void)dead_connection;
+  if(qs->ssl)
+    SSL_free(qs->ssl);
+  for(i = 0; i < 3; i++)
+    free(qs->crypto_data[i].buf);
+  nghttp3_conn_del(qs->h3conn);
+  ngtcp2_conn_del(qs->qconn);
+  SSL_CTX_free(qs->sslctx);
+  return CURLE_OK;
+}
+
+static unsigned int ng_conncheck(struct connectdata *conn,
+                                 unsigned int checks_to_perform)
+{
+  (void)conn;
+  (void)checks_to_perform;
+  return CONNRESULT_NONE;
+}
+
+static const struct Curl_handler Curl_handler_http3 = {
+  "HTTPS",                              /* scheme */
+  ZERO_NULL,                            /* setup_connection */
+  Curl_http,                            /* do_it */
+  Curl_http_done,                       /* done */
+  ZERO_NULL,                            /* do_more */
+  ZERO_NULL,                            /* connect_it */
+  ZERO_NULL,                            /* connecting */
+  ZERO_NULL,                            /* doing */
+  ng_getsock,                           /* proto_getsock */
+  ng_getsock,                           /* doing_getsock */
+  ZERO_NULL,                            /* domore_getsock */
+  ng_perform_getsock,                   /* perform_getsock */
+  ng_disconnect,                        /* disconnect */
+  ZERO_NULL,                            /* readwrite */
+  ng_conncheck,                         /* connection_check */
+  PORT_HTTP,                            /* defport */
+  CURLPROTO_HTTPS,                      /* protocol */
+  PROTOPT_SSL | PROTOPT_STREAM          /* flags */
+};
+
+static int cb_h3_stream_close(nghttp3_conn *conn, int64_t stream_id,
+                              uint64_t app_error_code, void *user_data,
+                              void *stream_user_data)
+{
+  struct Curl_easy *data = stream_user_data;
+  struct HTTP *stream = data->req.protop;
+  (void)conn;
+  (void)stream_id;
+  (void)app_error_code;
+  (void)user_data;
+  H3BUGF(infof(data, "cb_h3_stream_close CALLED\n"));
+
+  stream->closed = TRUE;
+  Curl_expire(data, 0, EXPIRE_QUIC);
+  /* make sure that ngh3_stream_recv is called again to complete the transfer
+     even if there are no more packets to be received from the server. */
+  data->state.drain = 1;
+  return 0;
+}
+
+/* Minimum size of the overflow buffer */
+#define OVERFLOWSIZE 1024
+
+/*
+ * allocate_overflow() ensures that there is room for incoming data in the
+ * overflow buffer, growing it to accommodate the new data if necessary. We
+ * may need to use the overflow buffer because we can't precisely limit the
+ * amount of HTTP/3 header data we receive using QUIC flow control mechanisms.
+ */
+static CURLcode allocate_overflow(struct Curl_easy *data,
+                                  struct HTTP *stream,
+                                  size_t length)
+{
+  size_t maxleft;
+  size_t newsize;
+  /* length can be arbitrarily large, so take care not to overflow newsize */
+  maxleft = CURL_MAX_READ_SIZE - stream->overflow_buflen;
+  if(length > maxleft) {
+    /* The reason to have a max limit for this is to avoid the risk of a bad
+       server feeding libcurl with a highly compressed list of headers that
+       will cause our overflow buffer to grow too large */
+    failf(data, "Rejected %zu bytes of overflow data (max is %d)!",
+          stream->overflow_buflen + length, CURL_MAX_READ_SIZE);
+    return CURLE_OUT_OF_MEMORY;
+  }
+  newsize = stream->overflow_buflen + length;
+  if(newsize > stream->overflow_bufsize) {
+    /* We enlarge the overflow buffer as it is too small */
+    char *newbuff;
+    newsize = CURLMAX(newsize * 3 / 2, stream->overflow_bufsize*2);
+    newsize = CURLMIN(CURLMAX(OVERFLOWSIZE, newsize), CURL_MAX_READ_SIZE);
+    newbuff = realloc(stream->overflow_buf, newsize);
+    if(!newbuff) {
+      failf(data, "Failed to alloc memory for overflow buffer!");
+      return CURLE_OUT_OF_MEMORY;
+    }
+    stream->overflow_buf = newbuff;
+    stream->overflow_bufsize = newsize;
+    infof(data, "Grew HTTP/3 overflow buffer to %zu bytes\n", newsize);
+  }
+  return CURLE_OK;
+}
+
+/*
+ * write_data() copies data to the stream's receive buffer. If not enough
+ * space is available in the receive buffer, it copies the rest to the
+ * stream's overflow buffer.
+ */
+static CURLcode write_data(struct Curl_easy *data,
+                           struct HTTP *stream,
+                           const void *mem, size_t memlen)
+{
+  CURLcode result = CURLE_OK;
+  const char *buf = mem;
+  size_t ncopy = memlen;
+  /* copy as much as possible to the receive buffer */
+  if(stream->len) {
+    size_t len = CURLMIN(ncopy, stream->len);
+#if 0 /* extra debugging of incoming h3 data */
+    fprintf(stderr, "!! Copies %zd bytes to %p (total %zd)\n",
+            len, stream->mem, stream->memlen);
+#endif
+    memcpy(stream->mem, buf, len);
+    stream->len -= len;
+    stream->memlen += len;
+    stream->mem += len;
+    buf += len;
+    ncopy -= len;
+  }
+  /* copy the rest to the overflow buffer */
+  if(ncopy) {
+    result = allocate_overflow(data, stream, ncopy);
+    if(result) {
+      return result;
+    }
+#if 0 /* extra debugging of incoming h3 data */
+    fprintf(stderr, "!! Copies %zd overflow bytes to %p (total %zd)\n",
+            ncopy, stream->overflow_buf, stream->overflow_buflen);
+#endif
+    memcpy(stream->overflow_buf + stream->overflow_buflen, buf, ncopy);
+    stream->overflow_buflen += ncopy;
+  }
+#if 0 /* extra debugging of incoming h3 data */
+  {
+    size_t i;
+    for(i = 0; i < memlen; i++) {
+      fprintf(stderr, "!! data[%d]: %02x '%c'\n", i, buf[i], buf[i]);
+    }
+  }
+#endif
+  return result;
+}
+
+static int cb_h3_recv_data(nghttp3_conn *conn, int64_t stream_id,
+                           const uint8_t *buf, size_t buflen,
+                           void *user_data, void *stream_user_data)
+{
+  struct Curl_easy *data = stream_user_data;
+  struct HTTP *stream = data->req.protop;
+  CURLcode result = CURLE_OK;
+  (void)conn;
+
+  result = write_data(data, stream, buf, buflen);
+  if(result) {
+    return -1;
+  }
+  stream->unacked_window += buflen;
+  (void)stream_id;
+  (void)user_data;
+  return 0;
+}
+
+static int cb_h3_deferred_consume(nghttp3_conn *conn, int64_t stream_id,
+                                  size_t consumed, void *user_data,
+                                  void *stream_user_data)
+{
+  struct quicsocket *qs = user_data;
+  (void)conn;
+  (void)stream_user_data;
+  (void)stream_id;
+
+  ngtcp2_conn_extend_max_stream_offset(qs->qconn, stream_id, consumed);
+  ngtcp2_conn_extend_max_offset(qs->qconn, consumed);
+  return 0;
+}
+
+/* Decode HTTP status code.  Returns -1 if no valid status code was
+   decoded. (duplicate from http2.c) */
+static int decode_status_code(const uint8_t *value, size_t len)
+{
+  int i;
+  int res;
+
+  if(len != 3) {
+    return -1;
+  }
+
+  res = 0;
+
+  for(i = 0; i < 3; ++i) {
+    char c = value[i];
+
+    if(c < '0' || c > '9') {
+      return -1;
+    }
+
+    res *= 10;
+    res += c - '0';
+  }
+
+  return res;
+}
+
+static int cb_h3_end_headers(nghttp3_conn *conn, int64_t stream_id,
+                             void *user_data, void *stream_user_data)
+{
+  struct Curl_easy *data = stream_user_data;
+  struct HTTP *stream = data->req.protop;
+  CURLcode result = CURLE_OK;
+  (void)conn;
+  (void)stream_id;
+  (void)user_data;
+
+  /* add a CRLF only if we've received some headers */
+  if(stream->firstheader) {
+    result = write_data(data, stream, "\r\n", 2);
+    if(result) {
+      return -1;
+    }
+  }
+  return 0;
+}
+
+static int cb_h3_recv_header(nghttp3_conn *conn, int64_t stream_id,
+                             int32_t token, nghttp3_rcbuf *name,
+                             nghttp3_rcbuf *value, uint8_t flags,
+                             void *user_data, void *stream_user_data)
+{
+  nghttp3_vec h3name = nghttp3_rcbuf_get_buf(name);
+  nghttp3_vec h3val = nghttp3_rcbuf_get_buf(value);
+  struct Curl_easy *data = stream_user_data;
+  struct HTTP *stream = data->req.protop;
+  CURLcode result = CURLE_OK;
+  (void)conn;
+  (void)stream_id;
+  (void)token;
+  (void)flags;
+  (void)user_data;
+
+  if(h3name.len == sizeof(":status") - 1 &&
+     !memcmp(":status", h3name.base, h3name.len)) {
+    char line[14]; /* status line is always 13 characters long */
+    size_t ncopy;
+    int status = decode_status_code(h3val.base, h3val.len);
+    DEBUGASSERT(status != -1);
+    ncopy = msnprintf(line, sizeof(line), "HTTP/3 %03d \r\n", status);
+    result = write_data(data, stream, line, ncopy);
+    if(result) {
+      return -1;
+    }
+  }
+  else {
+    /* store as a HTTP1-style header */
+    result = write_data(data, stream, h3name.base, h3name.len);
+    if(result) {
+      return -1;
+    }
+    result = write_data(data, stream, ": ", 2);
+    if(result) {
+      return -1;
+    }
+    result = write_data(data, stream, h3val.base, h3val.len);
+    if(result) {
+      return -1;
+    }
+    result = write_data(data, stream, "\r\n", 2);
+    if(result) {
+      return -1;
+    }
+  }
+
+  stream->firstheader = TRUE;
+  return 0;
+}
+
+static int cb_h3_send_stop_sending(nghttp3_conn *conn, int64_t stream_id,
+                                   uint64_t app_error_code,
+                                   void *user_data,
+                                   void *stream_user_data)
+{
+  (void)conn;
+  (void)stream_id;
+  (void)app_error_code;
+  (void)user_data;
+  (void)stream_user_data;
+  return 0;
+}
+
+static nghttp3_conn_callbacks ngh3_callbacks = {
+  cb_h3_acked_stream_data, /* acked_stream_data */
+  cb_h3_stream_close,
+  cb_h3_recv_data,
+  cb_h3_deferred_consume,
+  NULL, /* begin_headers */
+  cb_h3_recv_header,
+  cb_h3_end_headers,
+  NULL, /* begin_trailers */
+  cb_h3_recv_header,
+  NULL, /* end_trailers */
+  NULL, /* http_begin_push_promise */
+  NULL, /* http_recv_push_promise */
+  NULL, /* http_end_push_promise */
+  NULL, /* http_cancel_push */
+  cb_h3_send_stop_sending,
+  NULL, /* push_stream */
+  NULL, /* end_stream */
+};
+
+static int init_ngh3_conn(struct quicsocket *qs)
+{
+  CURLcode result;
+  int rc;
+  int64_t ctrl_stream_id, qpack_enc_stream_id, qpack_dec_stream_id;
+
+  if(ngtcp2_conn_get_max_local_streams_uni(qs->qconn) < 3) {
+    failf(qs->conn->data, "too few available QUIC streams");
+    return CURLE_FAILED_INIT;
+  }
+
+  nghttp3_conn_settings_default(&qs->h3settings);
+
+  rc = nghttp3_conn_client_new(&qs->h3conn,
+                               &ngh3_callbacks,
+                               &qs->h3settings,
+                               nghttp3_mem_default(),
+                               qs);
+  if(rc) {
+    result = CURLE_OUT_OF_MEMORY;
+    goto fail;
+  }
+
+  rc = ngtcp2_conn_open_uni_stream(qs->qconn, &ctrl_stream_id, NULL);
+  if(rc) {
+    result = CURLE_FAILED_INIT;
+    goto fail;
+  }
+
+  rc = nghttp3_conn_bind_control_stream(qs->h3conn, ctrl_stream_id);
+  if(rc) {
+    result = CURLE_FAILED_INIT;
+    goto fail;
+  }
+
+  rc = ngtcp2_conn_open_uni_stream(qs->qconn, &qpack_enc_stream_id, NULL);
+  if(rc) {
+    result = CURLE_FAILED_INIT;
+    goto fail;
+  }
+
+  rc = ngtcp2_conn_open_uni_stream(qs->qconn, &qpack_dec_stream_id, NULL);
+  if(rc) {
+    result = CURLE_FAILED_INIT;
+    goto fail;
+  }
+
+  rc = nghttp3_conn_bind_qpack_streams(qs->h3conn, qpack_enc_stream_id,
+                                       qpack_dec_stream_id);
+  if(rc) {
+    result = CURLE_FAILED_INIT;
+    goto fail;
+  }
+
+  return CURLE_OK;
+  fail:
+
+  return result;
+}
+
+static Curl_recv ngh3_stream_recv;
+static Curl_send ngh3_stream_send;
+
+static size_t drain_overflow_buffer(struct HTTP *stream)
+{
+  size_t ncopy = CURLMIN(stream->overflow_buflen, stream->len);
+  if(ncopy > 0) {
+    memcpy(stream->mem, stream->overflow_buf, ncopy);
+    stream->len -= ncopy;
+    stream->mem += ncopy;
+    stream->memlen += ncopy;
+    stream->overflow_buflen -= ncopy;
+    memmove(stream->overflow_buf, stream->overflow_buf + ncopy,
+            stream->overflow_buflen);
+  }
+  return ncopy;
+}
+
+/* incoming data frames on the h3 stream */
+static ssize_t ngh3_stream_recv(struct connectdata *conn,
+                                int sockindex,
+                                char *buf,
+                                size_t buffersize,
+                                CURLcode *curlcode)
+{
+  curl_socket_t sockfd = conn->sock[sockindex];
+  struct HTTP *stream = conn->data->req.protop;
+  struct quicsocket *qs = conn->quic;
+
+  if(!stream->memlen) {
+    /* remember where to store incoming data for this stream and how big the
+       buffer is */
+    stream->mem = buf;
+    stream->len = buffersize;
+  }
+  /* else, there's data in the buffer already */
+
+  /* if there's data in the overflow buffer from a previous call, copy as much
+     as possible to the receive buffer before receiving more */
+  drain_overflow_buffer(stream);
+
+  if(ng_process_ingress(conn, sockfd, qs)) {
+    *curlcode = CURLE_RECV_ERROR;
+    return -1;
+  }
+  if(ng_flush_egress(conn, sockfd, qs)) {
+    *curlcode = CURLE_SEND_ERROR;
+    return -1;
+  }
+
+  if(stream->memlen) {
+    ssize_t memlen = stream->memlen;
+    /* data arrived */
+    *curlcode = CURLE_OK;
+    /* reset to allow more data to come */
+    stream->memlen = 0;
+    stream->mem = buf;
+    stream->len = buffersize;
+    /* extend the stream window with the data we're consuming and send out
+       any additional packets to tell the server that we can receive more */
+    extend_stream_window(qs->qconn, stream);
+    if(ng_flush_egress(conn, sockfd, qs)) {
+      *curlcode = CURLE_SEND_ERROR;
+      return -1;
+    }
+    return memlen;
+  }
+
+  if(stream->closed) {
+    *curlcode = CURLE_OK;
+    return 0;
+  }
+
+  infof(conn->data, "ngh3_stream_recv returns 0 bytes and EAGAIN\n");
+  *curlcode = CURLE_AGAIN;
+  return -1;
+}
+
+/* this amount of data has now been acked on this stream */
+static int cb_h3_acked_stream_data(nghttp3_conn *conn, int64_t stream_id,
+                                   size_t datalen, void *user_data,
+                                   void *stream_user_data)
+{
+  struct Curl_easy *data = stream_user_data;
+  struct HTTP *stream = data->req.protop;
+  (void)conn;
+  (void)stream_id;
+  (void)user_data;
+
+  if(!data->set.postfields) {
+    stream->h3out->used -= datalen;
+    H3BUGF(infof(data,
+                 "cb_h3_acked_stream_data, %zd bytes, %zd left unacked\n",
+                 datalen, stream->h3out->used));
+    DEBUGASSERT(stream->h3out->used < H3_SEND_SIZE);
+  }
+  return 0;
+}
+
+static ssize_t cb_h3_readfunction(nghttp3_conn *conn, int64_t stream_id,
+                                  nghttp3_vec *vec, size_t veccnt,
+                                  uint32_t *pflags, void *user_data,
+                                  void *stream_user_data)
+{
+  struct Curl_easy *data = stream_user_data;
+  size_t nread;
+  struct HTTP *stream = data->req.protop;
+  (void)conn;
+  (void)stream_id;
+  (void)user_data;
+  (void)veccnt;
+
+  if(data->set.postfields) {
+    vec[0].base = data->set.postfields;
+    vec[0].len = data->state.infilesize;
+    *pflags = NGHTTP3_DATA_FLAG_EOF;
+    return 1;
+  }
+
+  nread = CURLMIN(stream->upload_len, H3_SEND_SIZE - stream->h3out->used);
+  if(nread > 0) {
+    /* nghttp3 wants us to hold on to the data until it tells us it is okay to
+       delete it. Append the data at the end of the h3out buffer. Since we can
+       only return consecutive data, copy the amount that fits and the next
+       part comes in next invoke. */
+    struct h3out *out = stream->h3out;
+    if(nread + out->windex > H3_SEND_SIZE)
+      nread = H3_SEND_SIZE - out->windex;
+
+    memcpy(&out->buf[out->windex], stream->upload_mem, nread);
+    out->windex += nread;
+    out->used += nread;
+
+    /* that's the chunk we return to nghttp3 */
+    vec[0].base = &out->buf[out->windex];
+    vec[0].len = nread;
+
+    if(out->windex == H3_SEND_SIZE)
+      out->windex = 0; /* wrap */
+    stream->upload_mem += nread;
+    stream->upload_len -= nread;
+    if(data->state.infilesize != -1) {
+      stream->upload_left -= nread;
+      if(!stream->upload_left)
+        *pflags = NGHTTP3_DATA_FLAG_EOF;
+    }
+    H3BUGF(infof(data, "cb_h3_readfunction %zd bytes%s (at %zd unacked)\n",
+                 nread, *pflags == NGHTTP3_DATA_FLAG_EOF?" EOF":"",
+                 out->used));
+  }
+  if(stream->upload_done && !stream->upload_len &&
+     (stream->upload_left <= 0)) {
+    H3BUGF(infof(data, "!!!!!!!!! cb_h3_readfunction sets EOF\n"));
+    *pflags = NGHTTP3_DATA_FLAG_EOF;
+    return 0;
+  }
+  else if(!nread) {
+    return NGHTTP3_ERR_WOULDBLOCK;
+  }
+  return 1;
+}
+
+/* Index where :authority header field will appear in request header
+   field list. */
+#define AUTHORITY_DST_IDX 3
+
+static CURLcode http_request(struct connectdata *conn, const void *mem,
+                             size_t len)
+{
+  struct HTTP *stream = conn->data->req.protop;
+  size_t nheader;
+  size_t i;
+  size_t authority_idx;
+  char *hdbuf = (char *)mem;
+  char *end, *line_end;
+  struct quicsocket *qs = conn->quic;
+  CURLcode result = CURLE_OK;
+  struct Curl_easy *data = conn->data;
+  nghttp3_nv *nva = NULL;
+  int64_t stream3_id;
+  int rc;
+  struct h3out *h3out = NULL;
+
+  rc = ngtcp2_conn_open_bidi_stream(qs->qconn, &stream3_id, NULL);
+  if(rc) {
+    failf(conn->data, "can get bidi streams");
+    result = CURLE_SEND_ERROR;
+    goto fail;
+  }
+
+  stream->stream3_id = stream3_id;
+  stream->h3req = TRUE; /* senf off! */
+
+  /* Calculate number of headers contained in [mem, mem + len). Assumes a
+     correctly generated HTTP header field block. */
+  nheader = 0;
+  for(i = 1; i < len; ++i) {
+    if(hdbuf[i] == '\n' && hdbuf[i - 1] == '\r') {
+      ++nheader;
+      ++i;
+    }
+  }
+  if(nheader < 2)
+    goto fail;
+
+  /* We counted additional 2 \r\n in the first and last line. We need 3
+     new headers: :method, :path and :scheme. Therefore we need one
+     more space. */
+  nheader += 1;
+  nva = malloc(sizeof(nghttp3_nv) * nheader);
+  if(!nva) {
+    result = CURLE_OUT_OF_MEMORY;
+    goto fail;
+  }
+
+  /* Extract :method, :path from request line
+     We do line endings with CRLF so checking for CR is enough */
+  line_end = memchr(hdbuf, '\r', len);
+  if(!line_end) {
+    result = CURLE_BAD_FUNCTION_ARGUMENT; /* internal error */
+    goto fail;
+  }
+
+  /* Method does not contain spaces */
+  end = memchr(hdbuf, ' ', line_end - hdbuf);
+  if(!end || end == hdbuf)
+    goto fail;
+  nva[0].name = (unsigned char *)":method";
+  nva[0].namelen = strlen((char *)nva[0].name);
+  nva[0].value = (unsigned char *)hdbuf;
+  nva[0].valuelen = (size_t)(end - hdbuf);
+  nva[0].flags = NGHTTP3_NV_FLAG_NONE;
+
+  hdbuf = end + 1;
+
+  /* Path may contain spaces so scan backwards */
+  end = NULL;
+  for(i = (size_t)(line_end - hdbuf); i; --i) {
+    if(hdbuf[i - 1] == ' ') {
+      end = &hdbuf[i - 1];
+      break;
+    }
+  }
+  if(!end || end == hdbuf)
+    goto fail;
+  nva[1].name = (unsigned char *)":path";
+  nva[1].namelen = strlen((char *)nva[1].name);
+  nva[1].value = (unsigned char *)hdbuf;
+  nva[1].valuelen = (size_t)(end - hdbuf);
+  nva[1].flags = NGHTTP3_NV_FLAG_NONE;
+
+  nva[2].name = (unsigned char *)":scheme";
+  nva[2].namelen = strlen((char *)nva[2].name);
+  if(conn->handler->flags & PROTOPT_SSL)
+    nva[2].value = (unsigned char *)"https";
+  else
+    nva[2].value = (unsigned char *)"http";
+  nva[2].valuelen = strlen((char *)nva[2].value);
+  nva[2].flags = NGHTTP3_NV_FLAG_NONE;
+
+
+  authority_idx = 0;
+  i = 3;
+  while(i < nheader) {
+    size_t hlen;
+
+    hdbuf = line_end + 2;
+
+    /* check for next CR, but only within the piece of data left in the given
+       buffer */
+    line_end = memchr(hdbuf, '\r', len - (hdbuf - (char *)mem));
+    if(!line_end || (line_end == hdbuf))
+      goto fail;
+
+    /* header continuation lines are not supported */
+    if(*hdbuf == ' ' || *hdbuf == '\t')
+      goto fail;
+
+    for(end = hdbuf; end < line_end && *end != ':'; ++end)
+      ;
+    if(end == hdbuf || end == line_end)
+      goto fail;
+    hlen = end - hdbuf;
+
+    if(hlen == 4 && strncasecompare("host", hdbuf, 4)) {
+      authority_idx = i;
+      nva[i].name = (unsigned char *)":authority";
+      nva[i].namelen = strlen((char *)nva[i].name);
+    }
+    else {
+      nva[i].namelen = (size_t)(end - hdbuf);
+      /* Lower case the header name for HTTP/3 */
+      Curl_strntolower((char *)hdbuf, hdbuf, nva[i].namelen);
+      nva[i].name = (unsigned char *)hdbuf;
+    }
+    nva[i].flags = NGHTTP3_NV_FLAG_NONE;
+    hdbuf = end + 1;
+    while(*hdbuf == ' ' || *hdbuf == '\t')
+      ++hdbuf;
+    end = line_end;
+
+#if 0 /* This should probably go in more or less like this */
+    switch(inspect_header((const char *)nva[i].name, nva[i].namelen, hdbuf,
+                          end - hdbuf)) {
+    case HEADERINST_IGNORE:
+      /* skip header fields prohibited by HTTP/2 specification. */
+      --nheader;
+      continue;
+    case HEADERINST_TE_TRAILERS:
+      nva[i].value = (uint8_t*)"trailers";
+      nva[i].value_len = sizeof("trailers") - 1;
+      break;
+    default:
+      nva[i].value = (unsigned char *)hdbuf;
+      nva[i].value_len = (size_t)(end - hdbuf);
+    }
+#endif
+    nva[i].value = (unsigned char *)hdbuf;
+    nva[i].valuelen = (size_t)(end - hdbuf);
+    nva[i].flags = NGHTTP3_NV_FLAG_NONE;
+
+    ++i;
+  }
+
+  /* :authority must come before non-pseudo header fields */
+  if(authority_idx != 0 && authority_idx != AUTHORITY_DST_IDX) {
+    nghttp3_nv authority = nva[authority_idx];
+    for(i = authority_idx; i > AUTHORITY_DST_IDX; --i) {
+      nva[i] = nva[i - 1];
+    }
+    nva[i] = authority;
+  }
+
+  /* Warn stream may be rejected if cumulative length of headers is too
+     large. */
+#define MAX_ACC 60000  /* <64KB to account for some overhead */
+  {
+    size_t acc = 0;
+    for(i = 0; i < nheader; ++i)
+      acc += nva[i].namelen + nva[i].valuelen;
+
+    if(acc > MAX_ACC) {
+      infof(data, "http_request: Warning: The cumulative length of all "
+            "headers exceeds %zu bytes and that could cause the "
+            "stream to be rejected.\n", MAX_ACC);
+    }
+  }
+
+  switch(data->set.httpreq) {
+  case HTTPREQ_POST:
+  case HTTPREQ_POST_FORM:
+  case HTTPREQ_POST_MIME:
+  case HTTPREQ_PUT: {
+    nghttp3_data_reader data_reader;
+    if(data->state.infilesize != -1)
+      stream->upload_left = data->state.infilesize;
+    else
+      /* data sending without specifying the data amount up front */
+      stream->upload_left = -1; /* unknown, but not zero */
+
+    data_reader.read_data = cb_h3_readfunction;
+
+    h3out = calloc(sizeof(struct h3out), 1);
+    if(!h3out) {
+      result = CURLE_OUT_OF_MEMORY;
+      goto fail;
+    }
+    stream->h3out = h3out;
+
+    rc = nghttp3_conn_submit_request(qs->h3conn, stream->stream3_id,
+                                     nva, nheader, &data_reader,
+                                     conn->data);
+    if(rc) {
+      result = CURLE_SEND_ERROR;
+      goto fail;
+    }
+    break;
+  }
+  default:
+    stream->upload_left = 0; /* nothing left to send */
+    rc = nghttp3_conn_submit_request(qs->h3conn, stream->stream3_id,
+                                     nva, nheader,
+                                     NULL, /* no body! */
+                                     conn->data);
+    if(rc) {
+      result = CURLE_SEND_ERROR;
+      goto fail;
+    }
+    break;
+  }
+
+  Curl_safefree(nva);
+
+  infof(data, "Using HTTP/3 Stream ID: %x (easy handle %p)\n",
+        stream3_id, (void *)data);
+
+  return CURLE_OK;
+
+fail:
+  free(nva);
+  return result;
+}
+static ssize_t ngh3_stream_send(struct connectdata *conn,
+                                int sockindex,
+                                const void *mem,
+                                size_t len,
+                                CURLcode *curlcode)
+{
+  ssize_t sent;
+  struct quicsocket *qs = conn->quic;
+  curl_socket_t sockfd = conn->sock[sockindex];
+  struct HTTP *stream = conn->data->req.protop;
+
+  if(!stream->h3req) {
+    CURLcode result = http_request(conn, mem, len);
+    if(result) {
+      *curlcode = CURLE_SEND_ERROR;
+      return -1;
+    }
+    sent = len;
+  }
+  else {
+    H3BUGF(infof(conn->data, "ngh3_stream_send() wants to send %zd bytes\n",
+                 len));
+    if(!stream->upload_len) {
+      stream->upload_mem = mem;
+      stream->upload_len = len;
+      (void)nghttp3_conn_resume_stream(qs->h3conn, stream->stream3_id);
+      sent = len;
+    }
+    else {
+      *curlcode = CURLE_AGAIN;
+      return -1;
+    }
+  }
+
+  if(ng_flush_egress(conn, sockfd, qs)) {
+    *curlcode = CURLE_SEND_ERROR;
+    return -1;
+  }
+
+  *curlcode = CURLE_OK;
+  return sent;
+}
+
+static void ng_has_connected(struct connectdata *conn, int tempindex)
+{
+  conn->recv[FIRSTSOCKET] = ngh3_stream_recv;
+  conn->send[FIRSTSOCKET] = ngh3_stream_send;
+  conn->handler = &Curl_handler_http3;
+  conn->bits.multiplex = TRUE; /* at least potentially multiplexed */
+  conn->httpversion = 30;
+  conn->bundle->multiuse = BUNDLE_MULTIPLEX;
+  conn->quic = &conn->hequic[tempindex];
+  DEBUGF(infof(conn->data, "ngtcp2 established connection!\n"));
+}
+
+/*
+ * There can be multiple connection attempts going on in parallel.
+ */
+CURLcode Curl_quic_is_connected(struct connectdata *conn,
+                                int sockindex,
+                                bool *done)
+{
+  CURLcode result;
+  struct quicsocket *qs = &conn->hequic[sockindex];
+  curl_socket_t sockfd = conn->tempsock[sockindex];
+
+  result = ng_process_ingress(conn, sockfd, qs);
+  if(result)
+    return result;
+
+  result = ng_flush_egress(conn, sockfd, qs);
+  if(result)
+    return result;
+
+  if(ngtcp2_conn_get_handshake_completed(qs->qconn)) {
+    *done = TRUE;
+    ng_has_connected(conn, sockindex);
+  }
+
+  return result;
+}
+
+static CURLcode ng_process_ingress(struct connectdata *conn, int sockfd,
+                                   struct quicsocket *qs)
+{
+  ssize_t recvd;
+  int rv;
+  uint8_t buf[65536];
+  size_t bufsize = sizeof(buf);
+  struct sockaddr_storage remote_addr;
+  socklen_t remote_addrlen;
+  ngtcp2_path path;
+  ngtcp2_tstamp ts = timestamp();
+
+  for(;;) {
+    remote_addrlen = sizeof(remote_addr);
+    while((recvd = recvfrom(sockfd, buf, bufsize, 0,
+                            (struct sockaddr *)&remote_addr,
+                            &remote_addrlen)) == -1 &&
+          SOCKERRNO == EINTR)
+      ;
+    if(recvd == -1) {
+      if(SOCKERRNO == EAGAIN || SOCKERRNO == EWOULDBLOCK)
+        break;
+
+      failf(conn->data, "ngtcp2: recvfrom() unexpectedly returned %d", recvd);
+      return CURLE_RECV_ERROR;
+    }
+
+    ngtcp2_addr_init(&path.local, (uint8_t *)&qs->local_addr,
+                     qs->local_addrlen, NULL);
+    ngtcp2_addr_init(&path.remote, (uint8_t *)&remote_addr, remote_addrlen,
+                     NULL);
+
+    rv = ngtcp2_conn_read_pkt(qs->qconn, &path, buf, recvd, ts);
+    if(rv != 0) {
+      /* TODO Send CONNECTION_CLOSE if possible */
+      return CURLE_RECV_ERROR;
+    }
+  }
+
+  return CURLE_OK;
+}
+
+static CURLcode ng_flush_egress(struct connectdata *conn, int sockfd,
+                                struct quicsocket *qs)
+{
+  int rv;
+  ssize_t sent;
+  ssize_t outlen;
+  uint8_t out[NGTCP2_MAX_PKTLEN_IPV4];
+  size_t pktlen;
+  ngtcp2_path_storage ps;
+  ngtcp2_tstamp ts = timestamp();
+  struct sockaddr_storage remote_addr;
+  ngtcp2_tstamp expiry;
+  ngtcp2_duration timeout;
+  int64_t stream_id;
+  ssize_t veccnt;
+  int fin;
+  nghttp3_vec vec[16];
+  ssize_t ndatalen;
+
+  switch(qs->local_addr.ss_family) {
+  case AF_INET:
+    pktlen = NGTCP2_MAX_PKTLEN_IPV4;
+    break;
+  case AF_INET6:
+    pktlen = NGTCP2_MAX_PKTLEN_IPV6;
+    break;
+  default:
+    assert(0);
+  }
+
+  rv = ngtcp2_conn_handle_expiry(qs->qconn, ts);
+  if(rv != 0) {
+    failf(conn->data, "ngtcp2_conn_handle_expiry returned error: %s\n",
+          ngtcp2_strerror(rv));
+    return CURLE_SEND_ERROR;
+  }
+
+  ngtcp2_path_storage_zero(&ps);
+
+  for(;;) {
+    outlen = -1;
+    if(qs->h3conn && ngtcp2_conn_get_max_data_left(qs->qconn)) {
+      veccnt = nghttp3_conn_writev_stream(qs->h3conn, &stream_id, &fin, vec,
+                                          sizeof(vec) / sizeof(vec[0]));
+      if(veccnt < 0) {
+        failf(conn->data, "nghttp3_conn_writev_stream returned error: %s\n",
+              nghttp3_strerror((int)veccnt));
+        return CURLE_SEND_ERROR;
+      }
+      else if(veccnt > 0) {
+        outlen =
+          ngtcp2_conn_writev_stream(qs->qconn, &ps.path,
+                                    out, pktlen, &ndatalen,
+                                    NGTCP2_WRITE_STREAM_FLAG_MORE,
+                                    stream_id, fin,
+                                    (const ngtcp2_vec *)vec, veccnt, ts);
+        if(outlen == 0) {
+          break;
+        }
+        if(outlen < 0) {
+          if(outlen == NGTCP2_ERR_STREAM_DATA_BLOCKED ||
+             outlen == NGTCP2_ERR_STREAM_SHUT_WR) {
+            rv = nghttp3_conn_block_stream(qs->h3conn, stream_id);
+            if(rv != 0) {
+              failf(conn->data,
+                    "nghttp3_conn_block_stream returned error: %s\n",
+                    nghttp3_strerror(rv));
+              return CURLE_SEND_ERROR;
+            }
+            continue;
+          }
+          else if(outlen == NGTCP2_ERR_WRITE_STREAM_MORE) {
+            assert(ndatalen > 0);
+            rv = nghttp3_conn_add_write_offset(qs->h3conn, stream_id,
+                                               ndatalen);
+            if(rv != 0) {
+              failf(conn->data,
+                    "nghttp3_conn_add_write_offset returned error: %s\n",
+                    nghttp3_strerror(rv));
+              return CURLE_SEND_ERROR;
+            }
+            continue;
+          }
+          else {
+            failf(conn->data, "ngtcp2_conn_writev_stream returned error: %s\n",
+                  ngtcp2_strerror((int)outlen));
+            return CURLE_SEND_ERROR;
+          }
+        }
+        else if(ndatalen >= 0) {
+          rv = nghttp3_conn_add_write_offset(qs->h3conn, stream_id, ndatalen);
+          if(rv != 0) {
+            failf(conn->data,
+                  "nghttp3_conn_add_write_offset returned error: %s\n",
+                  nghttp3_strerror(rv));
+            return CURLE_SEND_ERROR;
+          }
+        }
+      }
+    }
+    if(outlen < 0) {
+      outlen = ngtcp2_conn_write_pkt(qs->qconn, &ps.path, out, pktlen, ts);
+      if(outlen < 0) {
+        failf(conn->data, "ngtcp2_conn_write_pkt returned error: %s\n",
+              ngtcp2_strerror((int)outlen));
+        return CURLE_SEND_ERROR;
+      }
+      if(outlen == 0)
+        break;
+    }
+
+    memcpy(&remote_addr, ps.path.remote.addr, ps.path.remote.addrlen);
+    while((sent = send(sockfd, out, outlen, 0)) == -1 &&
+          SOCKERRNO == EINTR)
+      ;
+
+    if(sent == -1) {
+      if(SOCKERRNO == EAGAIN || SOCKERRNO == EWOULDBLOCK) {
+        /* TODO Cache packet */
+        break;
+      }
+      else {
+        failf(conn->data, "send() returned %zd (errno %d)\n", sent,
+              SOCKERRNO);
+        return CURLE_SEND_ERROR;
+      }
+    }
+  }
+
+  expiry = ngtcp2_conn_get_expiry(qs->qconn);
+  if(expiry != UINT64_MAX) {
+    if(expiry <= ts) {
+      timeout = NGTCP2_MILLISECONDS;
+    }
+    else {
+      timeout = expiry - ts;
+    }
+    Curl_expire(conn->data, timeout / NGTCP2_MILLISECONDS, EXPIRE_QUIC);
+  }
+
+  return CURLE_OK;
+}
+
+/*
+ * Called from transfer.c:done_sending when we stop HTTP/3 uploading.
+ */
+CURLcode Curl_quic_done_sending(struct connectdata *conn)
+{
+  if(conn->handler == &Curl_handler_http3) {
+    /* only for HTTP/3 transfers */
+    struct HTTP *stream = conn->data->req.protop;
+    struct quicsocket *qs = conn->quic;
+    stream->upload_done = TRUE;
+    (void)nghttp3_conn_resume_stream(qs->h3conn, stream->stream3_id);
+  }
+
+  return CURLE_OK;
+}
+
+/*
+ * Called from http.c:Curl_http_done when a request completes.
+ */
+void Curl_quic_done(struct Curl_easy *data, bool premature)
+{
+  (void)premature;
+  if(data->conn->handler == &Curl_handler_http3) {
+    /* only for HTTP/3 transfers */
+    struct HTTP *stream = data->req.protop;
+    Curl_safefree(stream->overflow_buf);
+  }
+}
+
+/*
+ * Called from transfer.c:data_pending to know if we should keep looping
+ * to receive more data from the connection.
+ */
+bool Curl_quic_data_pending(const struct Curl_easy *data)
+{
+  /* We may have received more data than we're able to hold in the receive
+     buffer and allocated an overflow buffer. Since it's possible that
+     there's no more data coming on the socket, we need to keep reading
+     until the overflow buffer is empty. */
+  const struct HTTP *stream = data->req.protop;
+  return stream->overflow_buflen > 0;
+}
+
+#endif
diff --git a/lib/vquic/ngtcp2.h b/lib/vquic/ngtcp2.h
new file mode 100644 (file)
index 0000000..30d442f
--- /dev/null
@@ -0,0 +1,63 @@
+#ifndef HEADER_CURL_VQUIC_NGTCP2_H
+#define HEADER_CURL_VQUIC_NGTCP2_H
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+
+#include "curl_setup.h"
+
+#ifdef USE_NGTCP2
+
+#include <ngtcp2/ngtcp2.h>
+#include <nghttp3/nghttp3.h>
+#include <openssl/ssl.h>
+
+struct quic_handshake {
+  char *buf;       /* pointer to the buffer */
+  size_t alloclen; /* size of allocation */
+  size_t len;      /* size of content in buffer */
+  size_t nread;    /* how many bytes have been read */
+};
+
+struct quicsocket {
+  struct connectdata *conn; /* point back to the connection */
+  ngtcp2_conn *qconn;
+  ngtcp2_cid dcid;
+  ngtcp2_cid scid;
+  uint32_t version;
+  ngtcp2_settings settings;
+  SSL_CTX *sslctx;
+  SSL *ssl;
+  struct quic_handshake crypto_data[3];
+  /* the last TLS alert description generated by the local endpoint */
+  uint8_t tls_alert;
+  struct sockaddr_storage local_addr;
+  socklen_t local_addrlen;
+
+  nghttp3_conn *h3conn;
+  nghttp3_conn_settings h3settings;
+};
+
+#include "urldata.h"
+
+#endif
+
+#endif /* HEADER_CURL_VQUIC_NGTCP2_H */
diff --git a/lib/vquic/quiche.c b/lib/vquic/quiche.c
new file mode 100644 (file)
index 0000000..e2f4323
--- /dev/null
@@ -0,0 +1,807 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+
+#include "curl_setup.h"
+
+#ifdef USE_QUICHE
+#include <quiche.h>
+#include <openssl/err.h>
+#include "urldata.h"
+#include "sendf.h"
+#include "strdup.h"
+#include "rand.h"
+#include "quic.h"
+#include "strcase.h"
+#include "multiif.h"
+#include "connect.h"
+#include "strerror.h"
+
+/* The last 3 #include files should be in this order */
+#include "curl_printf.h"
+#include "curl_memory.h"
+#include "memdebug.h"
+
+#define DEBUG_HTTP3
+/* #define DEBUG_QUICHE */
+#ifdef DEBUG_HTTP3
+#define H3BUGF(x) x
+#else
+#define H3BUGF(x) do { } while(0)
+#endif
+
+#define QUIC_MAX_STREAMS (256*1024)
+#define QUIC_MAX_DATA (1*1024*1024)
+#define QUIC_IDLE_TIMEOUT (60 * 1000) /* milliseconds */
+
+static CURLcode process_ingress(struct connectdata *conn,
+                                curl_socket_t sockfd,
+                                struct quicsocket *qs);
+
+static CURLcode flush_egress(struct connectdata *conn, curl_socket_t sockfd,
+                             struct quicsocket *qs);
+
+static CURLcode http_request(struct connectdata *conn, const void *mem,
+                             size_t len);
+static Curl_recv h3_stream_recv;
+static Curl_send h3_stream_send;
+
+
+static int quiche_getsock(struct connectdata *conn, curl_socket_t *socks)
+{
+  struct SingleRequest *k = &conn->data->req;
+  int bitmap = GETSOCK_BLANK;
+
+  socks[0] = conn->sock[FIRSTSOCKET];
+
+  /* in a HTTP/2 connection we can basically always get a frame so we should
+     always be ready for one */
+  bitmap |= GETSOCK_READSOCK(FIRSTSOCKET);
+
+  /* we're still uploading or the HTTP/2 layer wants to send data */
+  if((k->keepon & (KEEP_SEND|KEEP_SEND_PAUSE)) == KEEP_SEND)
+    bitmap |= GETSOCK_WRITESOCK(FIRSTSOCKET);
+
+  return bitmap;
+}
+
+static int quiche_perform_getsock(const struct connectdata *conn,
+                                  curl_socket_t *socks)
+{
+  return quiche_getsock((struct connectdata *)conn, socks);
+}
+
+static CURLcode quiche_disconnect(struct connectdata *conn,
+                                  bool dead_connection)
+{
+  struct quicsocket *qs = conn->quic;
+  (void)dead_connection;
+  quiche_h3_config_free(qs->h3config);
+  quiche_h3_conn_free(qs->h3c);
+  quiche_config_free(qs->cfg);
+  quiche_conn_free(qs->conn);
+  return CURLE_OK;
+}
+
+static unsigned int quiche_conncheck(struct connectdata *conn,
+                                     unsigned int checks_to_perform)
+{
+  (void)conn;
+  (void)checks_to_perform;
+  return CONNRESULT_NONE;
+}
+
+static CURLcode quiche_do(struct connectdata *conn, bool *done)
+{
+  struct HTTP *stream = conn->data->req.protop;
+  stream->h3req = FALSE; /* not sent */
+  return Curl_http(conn, done);
+}
+
+static const struct Curl_handler Curl_handler_http3 = {
+  "HTTPS",                              /* scheme */
+  ZERO_NULL,                            /* setup_connection */
+  quiche_do,                            /* do_it */
+  Curl_http_done,                       /* done */
+  ZERO_NULL,                            /* do_more */
+  ZERO_NULL,                            /* connect_it */
+  ZERO_NULL,                            /* connecting */
+  ZERO_NULL,                            /* doing */
+  quiche_getsock,                       /* proto_getsock */
+  quiche_getsock,                       /* doing_getsock */
+  ZERO_NULL,                            /* domore_getsock */
+  quiche_perform_getsock,               /* perform_getsock */
+  quiche_disconnect,                    /* disconnect */
+  ZERO_NULL,                            /* readwrite */
+  quiche_conncheck,                     /* connection_check */
+  PORT_HTTP,                            /* defport */
+  CURLPROTO_HTTPS,                      /* protocol */
+  PROTOPT_SSL | PROTOPT_STREAM          /* flags */
+};
+
+#ifdef DEBUG_QUICHE
+static void quiche_debug_log(const char *line, void *argp)
+{
+  (void)argp;
+  fprintf(stderr, "%s\n", line);
+}
+#endif
+
+CURLcode Curl_quic_connect(struct connectdata *conn, curl_socket_t sockfd,
+                           int sockindex,
+                           const struct sockaddr *addr, socklen_t addrlen)
+{
+  CURLcode result;
+  struct quicsocket *qs = &conn->hequic[sockindex];
+  struct Curl_easy *data = conn->data;
+
+#ifdef DEBUG_QUICHE
+  /* initialize debug log callback only once */
+  static int debug_log_init = 0;
+  if(!debug_log_init) {
+    quiche_enable_debug_logging(quiche_debug_log, NULL);
+    debug_log_init = 1;
+  }
+#endif
+
+  (void)addr;
+  (void)addrlen;
+
+  qs->cfg = quiche_config_new(QUICHE_PROTOCOL_VERSION);
+  if(!qs->cfg) {
+    failf(data, "can't create quiche config");
+    return CURLE_FAILED_INIT;
+  }
+
+  quiche_config_set_idle_timeout(qs->cfg, QUIC_IDLE_TIMEOUT);
+  quiche_config_set_initial_max_data(qs->cfg, QUIC_MAX_DATA);
+  quiche_config_set_initial_max_stream_data_bidi_local(qs->cfg, QUIC_MAX_DATA);
+  quiche_config_set_initial_max_stream_data_bidi_remote(qs->cfg,
+                                                        QUIC_MAX_DATA);
+  quiche_config_set_initial_max_stream_data_uni(qs->cfg, QUIC_MAX_DATA);
+  quiche_config_set_initial_max_streams_bidi(qs->cfg, QUIC_MAX_STREAMS);
+  quiche_config_set_initial_max_streams_uni(qs->cfg, QUIC_MAX_STREAMS);
+  quiche_config_set_application_protos(qs->cfg,
+                                       (uint8_t *)
+                                       QUICHE_H3_APPLICATION_PROTOCOL,
+                                       sizeof(QUICHE_H3_APPLICATION_PROTOCOL)
+                                       - 1);
+
+  result = Curl_rand(data, qs->scid, sizeof(qs->scid));
+  if(result)
+    return result;
+
+  if(getenv("SSLKEYLOGFILE"))
+    quiche_config_log_keys(qs->cfg);
+
+  qs->conn = quiche_connect(conn->host.name, (const uint8_t *) qs->scid,
+                            sizeof(qs->scid), qs->cfg);
+  if(!qs->conn) {
+    failf(data, "can't create quiche connection");
+    return CURLE_OUT_OF_MEMORY;
+  }
+
+  result = flush_egress(conn, sockfd, qs);
+  if(result)
+    return result;
+
+  /* store the used address as a string */
+  if(!Curl_addr2string((struct sockaddr*)addr, addrlen,
+                       conn->primary_ip, &conn->primary_port)) {
+    char buffer[STRERROR_LEN];
+    failf(data, "ssrem inet_ntop() failed with errno %d: %s",
+          SOCKERRNO, Curl_strerror(SOCKERRNO, buffer, sizeof(buffer)));
+    return CURLE_BAD_FUNCTION_ARGUMENT;
+  }
+  memcpy(conn->ip_addr_str, conn->primary_ip, MAX_IPADR_LEN);
+  Curl_persistconninfo(conn);
+
+  /* for connection reuse purposes: */
+  conn->ssl[FIRSTSOCKET].state = ssl_connection_complete;
+
+  infof(data, "Sent QUIC client Initial, ALPN: %s\n",
+        QUICHE_H3_APPLICATION_PROTOCOL + 1);
+
+  return CURLE_OK;
+}
+
+static CURLcode quiche_has_connected(struct connectdata *conn,
+                                     int sockindex,
+                                     int tempindex)
+{
+  CURLcode result;
+  struct quicsocket *qs = conn->quic = &conn->hequic[tempindex];
+
+  conn->recv[sockindex] = h3_stream_recv;
+  conn->send[sockindex] = h3_stream_send;
+  conn->handler = &Curl_handler_http3;
+  conn->bits.multiplex = TRUE; /* at least potentially multiplexed */
+  conn->httpversion = 30;
+  conn->bundle->multiuse = BUNDLE_MULTIPLEX;
+
+  qs->h3config = quiche_h3_config_new();
+  if(!qs->h3config)
+    return CURLE_OUT_OF_MEMORY;
+
+  /* Create a new HTTP/3 connection on the QUIC connection. */
+  qs->h3c = quiche_h3_conn_new_with_transport(qs->conn, qs->h3config);
+  if(!qs->h3c) {
+    result = CURLE_OUT_OF_MEMORY;
+    goto fail;
+  }
+  if(conn->hequic[1-tempindex].cfg) {
+    qs = &conn->hequic[1-tempindex];
+    quiche_config_free(qs->cfg);
+    quiche_conn_free(qs->conn);
+    qs->cfg = NULL;
+    qs->conn = NULL;
+  }
+  return CURLE_OK;
+  fail:
+  quiche_h3_config_free(qs->h3config);
+  quiche_h3_conn_free(qs->h3c);
+  return result;
+}
+
+/*
+ * This function gets polled to check if this QUIC connection has connected.
+ */
+CURLcode Curl_quic_is_connected(struct connectdata *conn, int sockindex,
+                                bool *done)
+{
+  CURLcode result;
+  struct quicsocket *qs = &conn->hequic[sockindex];
+  curl_socket_t sockfd = conn->tempsock[sockindex];
+
+  result = process_ingress(conn, sockfd, qs);
+  if(result)
+    return result;
+
+  result = flush_egress(conn, sockfd, qs);
+  if(result)
+    return result;
+
+  if(quiche_conn_is_established(qs->conn)) {
+    *done = TRUE;
+    result = quiche_has_connected(conn, 0, sockindex);
+    DEBUGF(infof(conn->data, "quiche established connection!\n"));
+  }
+
+  return result;
+}
+
+static CURLcode process_ingress(struct connectdata *conn, int sockfd,
+                                struct quicsocket *qs)
+{
+  ssize_t recvd;
+  struct Curl_easy *data = conn->data;
+  uint8_t *buf = (uint8_t *)data->state.buffer;
+  size_t bufsize = data->set.buffer_size;
+
+  /* in case the timeout expired */
+  quiche_conn_on_timeout(qs->conn);
+
+  do {
+    recvd = recv(sockfd, buf, bufsize, 0);
+    if((recvd < 0) && ((SOCKERRNO == EAGAIN) || (SOCKERRNO == EWOULDBLOCK)))
+      break;
+
+    if(recvd < 0) {
+      failf(conn->data, "quiche: recv() unexpectedly returned %d "
+            "(errno: %d, socket %d)", recvd, SOCKERRNO, sockfd);
+      return CURLE_RECV_ERROR;
+    }
+
+    recvd = quiche_conn_recv(qs->conn, buf, recvd);
+    if(recvd == QUICHE_ERR_DONE)
+      break;
+
+    if(recvd < 0) {
+      failf(conn->data, "quiche_conn_recv() == %d", recvd);
+      return CURLE_RECV_ERROR;
+    }
+  } while(1);
+
+  return CURLE_OK;
+}
+
+/*
+ * flush_egress drains the buffers and sends off data.
+ * Calls failf() on errors.
+ */
+static CURLcode flush_egress(struct connectdata *conn, int sockfd,
+                             struct quicsocket *qs)
+{
+  ssize_t sent;
+  static uint8_t out[1200];
+  int64_t timeout_ns;
+
+  do {
+    sent = quiche_conn_send(qs->conn, out, sizeof(out));
+    if(sent == QUICHE_ERR_DONE)
+      break;
+
+    if(sent < 0) {
+      failf(conn->data, "quiche_conn_send returned %zd\n",
+            sent);
+      return CURLE_SEND_ERROR;
+    }
+
+    sent = send(sockfd, out, sent, 0);
+    if(sent < 0) {
+      failf(conn->data, "send() returned %zd\n", sent);
+      return CURLE_SEND_ERROR;
+    }
+  } while(1);
+
+  /* time until the next timeout event, as nanoseconds. */
+  timeout_ns = quiche_conn_timeout_as_nanos(qs->conn);
+  if(timeout_ns)
+    /* expire uses milliseconds */
+    Curl_expire(conn->data, (timeout_ns + 999999) / 1000000, EXPIRE_QUIC);
+
+  return CURLE_OK;
+}
+
+struct h3h1header {
+  char *dest;
+  size_t destlen; /* left to use */
+  size_t nlen; /* used */
+};
+
+static int cb_each_header(uint8_t *name, size_t name_len,
+                          uint8_t *value, size_t value_len,
+                          void *argp)
+{
+  struct h3h1header *headers = (struct h3h1header *)argp;
+  size_t olen = 0;
+
+  if((name_len == 7) && !strncmp(":status", (char *)name, 7)) {
+    msnprintf(headers->dest,
+              headers->destlen, "HTTP/3 %.*s\n",
+              (int) value_len, value);
+  }
+  else if(!headers->nlen) {
+    return CURLE_HTTP3;
+  }
+  else {
+    msnprintf(headers->dest,
+              headers->destlen, "%.*s: %.*s\n",
+              (int)name_len, name, (int) value_len, value);
+  }
+  olen = strlen(headers->dest);
+  headers->destlen -= olen;
+  headers->nlen += olen;
+  headers->dest += olen;
+  return 0;
+}
+
+static ssize_t h3_stream_recv(struct connectdata *conn,
+                              int sockindex,
+                              char *buf,
+                              size_t buffersize,
+                              CURLcode *curlcode)
+{
+  ssize_t recvd = -1;
+  ssize_t rcode;
+  struct quicsocket *qs = conn->quic;
+  curl_socket_t sockfd = conn->sock[sockindex];
+  quiche_h3_event *ev;
+  int rc;
+  struct h3h1header headers;
+  struct Curl_easy *data = conn->data;
+  struct HTTP *stream = data->req.protop;
+  headers.dest = buf;
+  headers.destlen = buffersize;
+  headers.nlen = 0;
+
+  if(process_ingress(conn, sockfd, qs)) {
+    infof(data, "h3_stream_recv returns on ingress\n");
+    *curlcode = CURLE_RECV_ERROR;
+    return -1;
+  }
+
+  while(recvd < 0) {
+    int64_t s = quiche_h3_conn_poll(qs->h3c, qs->conn, &ev);
+    if(s < 0)
+      /* nothing more to do */
+      break;
+
+    if(s != stream->stream3_id) {
+      /* another transfer, ignore for now */
+      infof(data, "Got h3 for stream %u, expects %u\n",
+            s, stream->stream3_id);
+      continue;
+    }
+
+    switch(quiche_h3_event_type(ev)) {
+    case QUICHE_H3_EVENT_HEADERS:
+      rc = quiche_h3_event_for_each_header(ev, cb_each_header, &headers);
+      if(rc) {
+        *curlcode = rc;
+        failf(data, "Error in HTTP/3 response header");
+        break;
+      }
+      recvd = headers.nlen;
+      break;
+    case QUICHE_H3_EVENT_DATA:
+      if(!stream->firstbody) {
+        /* add a header-body separator CRLF */
+        buf[0] = '\r';
+        buf[1] = '\n';
+        buf += 2;
+        buffersize -= 2;
+        stream->firstbody = TRUE;
+        recvd = 2; /* two bytes already */
+      }
+      else
+        recvd = 0;
+      rcode = quiche_h3_recv_body(qs->h3c, qs->conn, s, (unsigned char *)buf,
+                                  buffersize);
+      if(rcode <= 0) {
+        recvd = -1;
+        break;
+      }
+      recvd += rcode;
+      break;
+
+    case QUICHE_H3_EVENT_FINISHED:
+      streamclose(conn, "End of stream");
+      recvd = 0; /* end of stream */
+      break;
+    default:
+      break;
+    }
+
+    quiche_h3_event_free(ev);
+  }
+  if(flush_egress(conn, sockfd, qs)) {
+    *curlcode = CURLE_SEND_ERROR;
+    return -1;
+  }
+
+  *curlcode = (-1 == recvd)? CURLE_AGAIN : CURLE_OK;
+  if(recvd >= 0)
+    /* Get this called again to drain the event queue */
+    Curl_expire(data, 0, EXPIRE_QUIC);
+
+  data->state.drain = (recvd >= 0) ? 1 : 0;
+  return recvd;
+}
+
+static ssize_t h3_stream_send(struct connectdata *conn,
+                              int sockindex,
+                              const void *mem,
+                              size_t len,
+                              CURLcode *curlcode)
+{
+  ssize_t sent;
+  struct quicsocket *qs = conn->quic;
+  curl_socket_t sockfd = conn->sock[sockindex];
+  struct HTTP *stream = conn->data->req.protop;
+
+  if(!stream->h3req) {
+    CURLcode result = http_request(conn, mem, len);
+    if(result) {
+      *curlcode = CURLE_SEND_ERROR;
+      return -1;
+    }
+    sent = len;
+  }
+  else {
+    H3BUGF(infof(conn->data, "Pass on %zd body bytes to quiche\n",
+                 len));
+    sent = quiche_h3_send_body(qs->h3c, qs->conn, stream->stream3_id,
+                               (uint8_t *)mem, len, FALSE);
+    if(sent < 0) {
+      *curlcode = CURLE_SEND_ERROR;
+      return -1;
+    }
+  }
+
+  if(flush_egress(conn, sockfd, qs)) {
+    *curlcode = CURLE_SEND_ERROR;
+    return -1;
+  }
+
+  *curlcode = CURLE_OK;
+  return sent;
+}
+
+/*
+ * Store quiche version info in this buffer, Prefix with a space.  Return total
+ * length written.
+ */
+int Curl_quic_ver(char *p, size_t len)
+{
+  return msnprintf(p, len, " quiche/%s", quiche_version());
+}
+
+/* Index where :authority header field will appear in request header
+   field list. */
+#define AUTHORITY_DST_IDX 3
+
+static CURLcode http_request(struct connectdata *conn, const void *mem,
+                             size_t len)
+{
+  /*
+   */
+  struct HTTP *stream = conn->data->req.protop;
+  size_t nheader;
+  size_t i;
+  size_t authority_idx;
+  char *hdbuf = (char *)mem;
+  char *end, *line_end;
+  int64_t stream3_id;
+  quiche_h3_header *nva = NULL;
+  struct quicsocket *qs = conn->quic;
+  CURLcode result = CURLE_OK;
+  struct Curl_easy *data = conn->data;
+
+  stream->h3req = TRUE; /* senf off! */
+
+  /* Calculate number of headers contained in [mem, mem + len). Assumes a
+     correctly generated HTTP header field block. */
+  nheader = 0;
+  for(i = 1; i < len; ++i) {
+    if(hdbuf[i] == '\n' && hdbuf[i - 1] == '\r') {
+      ++nheader;
+      ++i;
+    }
+  }
+  if(nheader < 2)
+    goto fail;
+
+  /* We counted additional 2 \r\n in the first and last line. We need 3
+     new headers: :method, :path and :scheme. Therefore we need one
+     more space. */
+  nheader += 1;
+  nva = malloc(sizeof(quiche_h3_header) * nheader);
+  if(!nva) {
+    result = CURLE_OUT_OF_MEMORY;
+    goto fail;
+  }
+
+  /* Extract :method, :path from request line
+     We do line endings with CRLF so checking for CR is enough */
+  line_end = memchr(hdbuf, '\r', len);
+  if(!line_end) {
+    result = CURLE_BAD_FUNCTION_ARGUMENT; /* internal error */
+    goto fail;
+  }
+
+  /* Method does not contain spaces */
+  end = memchr(hdbuf, ' ', line_end - hdbuf);
+  if(!end || end == hdbuf)
+    goto fail;
+  nva[0].name = (unsigned char *)":method";
+  nva[0].name_len = strlen((char *)nva[0].name);
+  nva[0].value = (unsigned char *)hdbuf;
+  nva[0].value_len = (size_t)(end - hdbuf);
+
+  hdbuf = end + 1;
+
+  /* Path may contain spaces so scan backwards */
+  end = NULL;
+  for(i = (size_t)(line_end - hdbuf); i; --i) {
+    if(hdbuf[i - 1] == ' ') {
+      end = &hdbuf[i - 1];
+      break;
+    }
+  }
+  if(!end || end == hdbuf)
+    goto fail;
+  nva[1].name = (unsigned char *)":path";
+  nva[1].name_len = strlen((char *)nva[1].name);
+  nva[1].value = (unsigned char *)hdbuf;
+  nva[1].value_len = (size_t)(end - hdbuf);
+
+  nva[2].name = (unsigned char *)":scheme";
+  nva[2].name_len = strlen((char *)nva[2].name);
+  if(conn->handler->flags & PROTOPT_SSL)
+    nva[2].value = (unsigned char *)"https";
+  else
+    nva[2].value = (unsigned char *)"http";
+  nva[2].value_len = strlen((char *)nva[2].value);
+
+
+  authority_idx = 0;
+  i = 3;
+  while(i < nheader) {
+    size_t hlen;
+
+    hdbuf = line_end + 2;
+
+    /* check for next CR, but only within the piece of data left in the given
+       buffer */
+    line_end = memchr(hdbuf, '\r', len - (hdbuf - (char *)mem));
+    if(!line_end || (line_end == hdbuf))
+      goto fail;
+
+    /* header continuation lines are not supported */
+    if(*hdbuf == ' ' || *hdbuf == '\t')
+      goto fail;
+
+    for(end = hdbuf; end < line_end && *end != ':'; ++end)
+      ;
+    if(end == hdbuf || end == line_end)
+      goto fail;
+    hlen = end - hdbuf;
+
+    if(hlen == 4 && strncasecompare("host", hdbuf, 4)) {
+      authority_idx = i;
+      nva[i].name = (unsigned char *)":authority";
+      nva[i].name_len = strlen((char *)nva[i].name);
+    }
+    else {
+      nva[i].name_len = (size_t)(end - hdbuf);
+      /* Lower case the header name for HTTP/3 */
+      Curl_strntolower((char *)hdbuf, hdbuf, nva[i].name_len);
+      nva[i].name = (unsigned char *)hdbuf;
+    }
+    hdbuf = end + 1;
+    while(*hdbuf == ' ' || *hdbuf == '\t')
+      ++hdbuf;
+    end = line_end;
+
+#if 0 /* This should probably go in more or less like this */
+    switch(inspect_header((const char *)nva[i].name, nva[i].namelen, hdbuf,
+                          end - hdbuf)) {
+    case HEADERINST_IGNORE:
+      /* skip header fields prohibited by HTTP/2 specification. */
+      --nheader;
+      continue;
+    case HEADERINST_TE_TRAILERS:
+      nva[i].value = (uint8_t*)"trailers";
+      nva[i].value_len = sizeof("trailers") - 1;
+      break;
+    default:
+      nva[i].value = (unsigned char *)hdbuf;
+      nva[i].value_len = (size_t)(end - hdbuf);
+    }
+#endif
+    nva[i].value = (unsigned char *)hdbuf;
+    nva[i].value_len = (size_t)(end - hdbuf);
+
+    ++i;
+  }
+
+  /* :authority must come before non-pseudo header fields */
+  if(authority_idx != 0 && authority_idx != AUTHORITY_DST_IDX) {
+    quiche_h3_header authority = nva[authority_idx];
+    for(i = authority_idx; i > AUTHORITY_DST_IDX; --i) {
+      nva[i] = nva[i - 1];
+    }
+    nva[i] = authority;
+  }
+
+  /* Warn stream may be rejected if cumulative length of headers is too
+     large. */
+#define MAX_ACC 60000  /* <64KB to account for some overhead */
+  {
+    size_t acc = 0;
+
+    for(i = 0; i < nheader; ++i) {
+      acc += nva[i].name_len + nva[i].value_len;
+
+      H3BUGF(infof(data, "h3 [%.*s: %.*s]\n",
+                   nva[i].name_len, nva[i].name,
+                   nva[i].value_len, nva[i].value));
+    }
+
+    if(acc > MAX_ACC) {
+      infof(data, "http_request: Warning: The cumulative length of all "
+            "headers exceeds %zu bytes and that could cause the "
+            "stream to be rejected.\n", MAX_ACC);
+    }
+  }
+
+  switch(data->set.httpreq) {
+  case HTTPREQ_POST:
+  case HTTPREQ_POST_FORM:
+  case HTTPREQ_POST_MIME:
+  case HTTPREQ_PUT:
+    if(data->state.infilesize != -1)
+      stream->upload_left = data->state.infilesize;
+    else
+      /* data sending without specifying the data amount up front */
+      stream->upload_left = -1; /* unknown, but not zero */
+
+    stream3_id = quiche_h3_send_request(qs->h3c, qs->conn, nva, nheader,
+                                        stream->upload_left ? FALSE: TRUE);
+    if((stream3_id >= 0) && data->set.postfields) {
+      ssize_t sent = quiche_h3_send_body(qs->h3c, qs->conn, stream3_id,
+                                         (uint8_t *)data->set.postfields,
+                                         stream->upload_left, TRUE);
+      if(sent <= 0) {
+        failf(data, "quiche_h3_send_body failed!");
+        result = CURLE_SEND_ERROR;
+      }
+      stream->upload_left = 0; /* nothing left to send */
+    }
+    break;
+  default:
+    stream3_id = quiche_h3_send_request(qs->h3c, qs->conn, nva, nheader,
+                                        TRUE);
+    break;
+  }
+
+  Curl_safefree(nva);
+
+  if(stream3_id < 0) {
+    H3BUGF(infof(data, "quiche_h3_send_request returned %d\n",
+                 stream3_id));
+    result = CURLE_SEND_ERROR;
+    goto fail;
+  }
+
+  infof(data, "Using HTTP/3 Stream ID: %x (easy handle %p)\n",
+        stream3_id, (void *)data);
+  stream->stream3_id = stream3_id;
+
+  return CURLE_OK;
+
+fail:
+  free(nva);
+  return result;
+}
+
+/*
+ * Called from transfer.c:done_sending when we stop HTTP/3 uploading.
+ */
+CURLcode Curl_quic_done_sending(struct connectdata *conn)
+{
+  if(conn->handler == &Curl_handler_http3) {
+    /* only for HTTP/3 transfers */
+    ssize_t sent;
+    struct HTTP *stream = conn->data->req.protop;
+    struct quicsocket *qs = conn->quic;
+    fprintf(stderr, "!!! Curl_quic_done_sending\n");
+    stream->upload_done = TRUE;
+    sent = quiche_h3_send_body(qs->h3c, qs->conn, stream->stream3_id,
+                               NULL, 0, TRUE);
+    if(sent < 0)
+      return CURLE_SEND_ERROR;
+  }
+
+  return CURLE_OK;
+}
+
+/*
+ * Called from http.c:Curl_http_done when a request completes.
+ */
+void Curl_quic_done(struct Curl_easy *data, bool premature)
+{
+  (void)data;
+  (void)premature;
+}
+
+/*
+ * Called from transfer.c:data_pending to know if we should keep looping
+ * to receive more data from the connection.
+ */
+bool Curl_quic_data_pending(const struct Curl_easy *data)
+{
+  (void)data;
+  return FALSE;
+}
+
+#endif
diff --git a/lib/vquic/quiche.h b/lib/vquic/quiche.h
new file mode 100644 (file)
index 0000000..c8d1837
--- /dev/null
@@ -0,0 +1,49 @@
+#ifndef HEADER_CURL_VQUIC_QUICHE_H
+#define HEADER_CURL_VQUIC_QUICHE_H
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+
+#include "curl_setup.h"
+
+#ifdef USE_QUICHE
+
+#include <quiche.h>
+
+struct quic_handshake {
+  char *buf;       /* pointer to the buffer */
+  size_t alloclen; /* size of allocation */
+  size_t len;      /* size of content in buffer */
+  size_t nread;    /* how many bytes have been read */
+};
+
+struct quicsocket {
+  quiche_config *cfg;
+  quiche_conn *conn;
+  quiche_h3_conn *h3c;
+  quiche_h3_config *h3config;
+  uint8_t scid[QUICHE_MAX_CONN_ID_LEN];
+  uint32_t version;
+};
+
+#endif
+
+#endif /* HEADER_CURL_VQUIC_QUICHE_H */
similarity index 96%
rename from lib/ssh-libssh.c
rename to lib/vssh/libssh.c
index 7d59089..62a7f19 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 2017 - 2018 Red Hat, Inc.
+ * Copyright (C) 2017 - 2019 Red Hat, Inc.
  *
  * Authors: Nikos Mavrogiannopoulos, Tomas Mraz, Stanislav Zidek,
  *          Robert Kolcun, Andreas Schneider
 #include "memdebug.h"
 #include "curl_path.h"
 
+/* A recent macro provided by libssh. Or make our own. */
+#ifndef SSH_STRING_FREE_CHAR
+#define SSH_STRING_FREE_CHAR(x)                 \
+  do {                                          \
+    if(x) {                                     \
+      ssh_string_free_char(x);                  \
+      x = NULL;                                 \
+    }                                           \
+  } while(0)
+#endif
+
 /* Local functions: */
 static CURLcode myssh_connect(struct connectdata *conn, bool *done);
 static CURLcode myssh_multi_statemach(struct connectdata *conn,
@@ -119,13 +130,9 @@ CURLcode sftp_perform(struct connectdata *conn,
 
 static void sftp_quote(struct connectdata *conn);
 static void sftp_quote_stat(struct connectdata *conn);
-
-static int myssh_getsock(struct connectdata *conn, curl_socket_t *sock,
-                         int numsocks);
-
+static int myssh_getsock(struct connectdata *conn, curl_socket_t *sock);
 static int myssh_perform_getsock(const struct connectdata *conn,
-                                 curl_socket_t *sock,
-                                 int numsocks);
+                                 curl_socket_t *sock);
 
 static CURLcode myssh_setup_connection(struct connectdata *conn);
 
@@ -490,7 +497,7 @@ restart:
         return SSH_ERROR;
 
       nprompts = ssh_userauth_kbdint_getnprompts(sshc->ssh_session);
-      if(nprompts == SSH_ERROR || nprompts != 1)
+      if(nprompts != 1)
         return SSH_ERROR;
 
       rc = ssh_userauth_kbdint_setanswer(sshc->ssh_session, 0, conn->passwd);
@@ -549,6 +556,7 @@ static CURLcode myssh_statemach_act(struct connectdata *conn, bool *block)
   struct Curl_easy *data = conn->data;
   struct SSHPROTO *protop = data->req.protop;
   struct ssh_conn *sshc = &conn->proto.sshc;
+  curl_socket_t sock = conn->sock[FIRSTSOCKET];
   int rc = SSH_NO_ERROR, err;
   char *new_readdir_line;
   int seekerr = CURL_SEEKFUNC_OK;
@@ -792,7 +800,7 @@ static CURLcode myssh_statemach_act(struct connectdata *conn, bool *block)
 
       Curl_pgrsTime(conn->data, TIMER_APPCONNECT);      /* SSH is connected */
 
-      conn->sockfd = ssh_get_fd(sshc->ssh_session);
+      conn->sockfd = sock;
       conn->writesockfd = CURL_SOCKET_BAD;
 
       if(conn->handler->protocol == CURLPROTO_SFTP) {
@@ -1111,7 +1119,7 @@ static CURLcode myssh_statemach_act(struct connectdata *conn, bool *block)
         flags = O_WRONLY|O_APPEND;
       else
         /* Clear file before writing (normal behaviour) */
-        flags = O_WRONLY|O_APPEND|O_CREAT|O_TRUNC;
+        flags = O_WRONLY|O_CREAT|O_TRUNC;
 
       if(sshc->sftp_file)
         sftp_close(sshc->sftp_file);
@@ -1192,7 +1200,7 @@ static CURLcode myssh_statemach_act(struct connectdata *conn, bool *block)
         Curl_pgrsSetUploadSize(data, data->state.infilesize);
       }
       /* upload data */
-      Curl_setup_transfer(conn, -1, -1, FALSE, NULL, FIRSTSOCKET, NULL);
+      Curl_setup_transfer(data, -1, -1, FALSE, FIRSTSOCKET);
 
       /* not set by Curl_setup_transfer to preserve keepon bits */
       conn->sockfd = conn->writesockfd;
@@ -1342,8 +1350,8 @@ static CURLcode myssh_statemach_act(struct connectdata *conn, bool *block)
               break;
             }
 
-            snprintf(sshc->readdir_linkPath, PATH_MAX, "%s%s", protop->path,
-                     sshc->readdir_filename);
+            msnprintf(sshc->readdir_linkPath, PATH_MAX, "%s%s", protop->path,
+                      sshc->readdir_filename);
 
             state(conn, SSH_SFTP_READDIR_LINK);
             break;
@@ -1352,7 +1360,7 @@ static CURLcode myssh_statemach_act(struct connectdata *conn, bool *block)
           break;
         }
       }
-      else if(sshc->readdir_attrs == NULL && sftp_dir_eof(sshc->sftp_dir)) {
+      else if(sftp_dir_eof(sshc->sftp_dir)) {
         state(conn, SSH_SFTP_READDIR_DONE);
         break;
       }
@@ -1406,12 +1414,12 @@ static CURLcode myssh_statemach_act(struct connectdata *conn, bool *block)
       }
       sshc->readdir_line = new_readdir_line;
 
-      sshc->readdir_currLen += snprintf(sshc->readdir_line +
-                                        sshc->readdir_currLen,
-                                        sshc->readdir_totalLen -
-                                        sshc->readdir_currLen,
-                                        " -> %s",
-                                        sshc->readdir_filename);
+      sshc->readdir_currLen += msnprintf(sshc->readdir_line +
+                                         sshc->readdir_currLen,
+                                         sshc->readdir_totalLen -
+                                         sshc->readdir_currLen,
+                                         " -> %s",
+                                         sshc->readdir_filename);
 
       sftp_attributes_free(sshc->readdir_link_attrs);
       sshc->readdir_link_attrs = NULL;
@@ -1421,10 +1429,10 @@ static CURLcode myssh_statemach_act(struct connectdata *conn, bool *block)
       state(conn, SSH_SFTP_READDIR_BOTTOM);
       /* FALLTHROUGH */
     case SSH_SFTP_READDIR_BOTTOM:
-      sshc->readdir_currLen += snprintf(sshc->readdir_line +
-                                        sshc->readdir_currLen,
-                                        sshc->readdir_totalLen -
-                                        sshc->readdir_currLen, "\n");
+      sshc->readdir_currLen += msnprintf(sshc->readdir_line +
+                                         sshc->readdir_currLen,
+                                         sshc->readdir_totalLen -
+                                         sshc->readdir_currLen, "\n");
       result = Curl_client_write(conn, CLIENTWRITE_BODY,
                                  sshc->readdir_line,
                                  sshc->readdir_currLen);
@@ -1454,7 +1462,7 @@ static CURLcode myssh_statemach_act(struct connectdata *conn, bool *block)
       sshc->sftp_dir = NULL;
 
       /* no data to transfer */
-      Curl_setup_transfer(conn, -1, -1, FALSE, NULL, -1, NULL);
+      Curl_setup_transfer(data, -1, -1, FALSE, -1);
       state(conn, SSH_STOP);
       break;
 
@@ -1595,13 +1603,12 @@ static CURLcode myssh_statemach_act(struct connectdata *conn, bool *block)
     /* Setup the actual download */
     if(data->req.size == 0) {
       /* no data to transfer */
-      Curl_setup_transfer(conn, -1, -1, FALSE, NULL, -1, NULL);
+      Curl_setup_transfer(data, -1, -1, FALSE, -1);
       infof(data, "File already completely downloaded\n");
       state(conn, SSH_STOP);
       break;
     }
-    Curl_setup_transfer(conn, FIRSTSOCKET, data->req.size,
-                        FALSE, NULL, -1, NULL);
+    Curl_setup_transfer(data, FIRSTSOCKET, data->req.size, FALSE, -1);
 
     /* not set by Curl_setup_transfer to preserve keepon bits */
     conn->writesockfd = conn->sockfd;
@@ -1661,7 +1668,7 @@ static CURLcode myssh_statemach_act(struct connectdata *conn, bool *block)
         sshc->sftp_session = NULL;
       }
 
-      Curl_safefree(sshc->homedir);
+      SSH_STRING_FREE_CHAR(sshc->homedir);
       conn->data->state.most_recent_ftp_entrypath = NULL;
 
       state(conn, SSH_SESSION_DISCONNECT);
@@ -1723,8 +1730,7 @@ static CURLcode myssh_statemach_act(struct connectdata *conn, bool *block)
       }
 
       /* upload data */
-      Curl_setup_transfer(conn, -1, data->req.size, FALSE, NULL,
-                          FIRSTSOCKET, NULL);
+      Curl_setup_transfer(data, -1, data->req.size, FALSE, FIRSTSOCKET);
 
       /* not set by Curl_setup_transfer to preserve keepon bits */
       conn->sockfd = conn->writesockfd;
@@ -1767,8 +1773,7 @@ static CURLcode myssh_statemach_act(struct connectdata *conn, bool *block)
         /* download data */
         bytecount = ssh_scp_request_get_size(sshc->scp_session);
         data->req.maxdownload = (curl_off_t) bytecount;
-        Curl_setup_transfer(conn, FIRSTSOCKET, bytecount, FALSE, NULL, -1,
-                            NULL);
+        Curl_setup_transfer(data, FIRSTSOCKET, bytecount, FALSE, -1);
 
         /* not set by Curl_setup_transfer to preserve keepon bits */
         conn->writesockfd = conn->sockfd;
@@ -1829,7 +1834,7 @@ static CURLcode myssh_statemach_act(struct connectdata *conn, bool *block)
 
       ssh_disconnect(sshc->ssh_session);
 
-      Curl_safefree(sshc->homedir);
+      SSH_STRING_FREE_CHAR(sshc->homedir);
       conn->data->state.most_recent_ftp_entrypath = NULL;
 
       state(conn, SSH_SESSION_FREE);
@@ -1866,14 +1871,11 @@ static CURLcode myssh_statemach_act(struct connectdata *conn, bool *block)
 
       Curl_safefree(sshc->rsa_pub);
       Curl_safefree(sshc->rsa);
-
       Curl_safefree(sshc->quote_path1);
       Curl_safefree(sshc->quote_path2);
-
-      Curl_safefree(sshc->homedir);
-
       Curl_safefree(sshc->readdir_line);
       Curl_safefree(sshc->readdir_linkPath);
+      SSH_STRING_FREE_CHAR(sshc->homedir);
 
       /* the code we are about to return */
       result = sshc->actualcode;
@@ -1911,13 +1913,9 @@ static CURLcode myssh_statemach_act(struct connectdata *conn, bool *block)
 /* called by the multi interface to figure out what socket(s) to wait for and
    for what actions in the DO_DONE, PERFORM and WAITPERFORM states */
 static int myssh_perform_getsock(const struct connectdata *conn,
-                                 curl_socket_t *sock,  /* points to numsocks
-                                                          number of sockets */
-                                 int numsocks)
+                                 curl_socket_t *sock)
 {
   int bitmap = GETSOCK_BLANK;
-  (void) numsocks;
-
   sock[0] = conn->sock[FIRSTSOCKET];
 
   if(conn->waitfor & KEEP_RECV)
@@ -1932,26 +1930,23 @@ static int myssh_perform_getsock(const struct connectdata *conn,
 /* Generic function called by the multi interface to figure out what socket(s)
    to wait for and for what actions during the DOING and PROTOCONNECT states*/
 static int myssh_getsock(struct connectdata *conn,
-                         curl_socket_t *sock,  /* points to numsocks
-                                                   number of sockets */
-                         int numsocks)
+                         curl_socket_t *sock)
 {
   /* if we know the direction we can use the generic *_getsock() function even
      for the protocol_connect and doing states */
-  return myssh_perform_getsock(conn, sock, numsocks);
+  return myssh_perform_getsock(conn, sock);
 }
 
 static void myssh_block2waitfor(struct connectdata *conn, bool block)
 {
   struct ssh_conn *sshc = &conn->proto.sshc;
-  int dir;
 
   /* If it didn't block, or nothing was returned by ssh_get_poll_flags
    * have the original set */
   conn->waitfor = sshc->orig_waitfor;
 
   if(block) {
-    dir = ssh_get_poll_flags(sshc->ssh_session);
+    int dir = ssh_get_poll_flags(sshc->ssh_session);
     if(dir & SSH_READ_PENDING) {
       /* translate the libssh define bits into our own bit defines */
       conn->waitfor = KEEP_RECV;
@@ -1967,11 +1962,10 @@ static CURLcode myssh_multi_statemach(struct connectdata *conn,
                                       bool *done)
 {
   struct ssh_conn *sshc = &conn->proto.sshc;
-  CURLcode result = CURLE_OK;
   bool block;    /* we store the status and use that to provide a ssh_getsock()
                     implementation */
+  CURLcode result = myssh_statemach_act(conn, &block);
 
-  result = myssh_statemach_act(conn, &block);
   *done = (sshc->state == SSH_STOP) ? TRUE : FALSE;
   myssh_block2waitfor(conn, block);
 
@@ -2009,10 +2003,8 @@ static CURLcode myssh_block_statemach(struct connectdata *conn,
       }
     }
 
-    if(!result && block) {
-      curl_socket_t sock = conn->sock[FIRSTSOCKET];
-      curl_socket_t fd_read = CURL_SOCKET_BAD;
-      fd_read = sock;
+    if(block) {
+      curl_socket_t fd_read = conn->sock[FIRSTSOCKET];
       /* wait for the socket to become ready */
       (void) Curl_socket_check(fd_read, CURL_SOCKET_BAD,
                                CURL_SOCKET_BAD, left > 1000 ? 1000 : left);
@@ -2048,8 +2040,8 @@ static CURLcode myssh_connect(struct connectdata *conn, bool *done)
 {
   struct ssh_conn *ssh;
   CURLcode result;
+  curl_socket_t sock = conn->sock[FIRSTSOCKET];
   struct Curl_easy *data = conn->data;
-  int rc;
 
   /* initialize per-handle data if not already */
   if(!data->req.protop)
@@ -2076,6 +2068,8 @@ static CURLcode myssh_connect(struct connectdata *conn, bool *done)
     return CURLE_FAILED_INIT;
   }
 
+  ssh_options_set(ssh->ssh_session, SSH_OPTIONS_FD, &sock);
+
   if(conn->user) {
     infof(data, "User: %s\n", conn->user);
     ssh_options_set(ssh->ssh_session, SSH_OPTIONS_USER, conn->user);
@@ -2101,8 +2095,8 @@ static CURLcode myssh_connect(struct connectdata *conn, bool *done)
   ssh->pubkey = NULL;
 
   if(data->set.str[STRING_SSH_PUBLIC_KEY]) {
-    rc = ssh_pki_import_pubkey_file(data->set.str[STRING_SSH_PUBLIC_KEY],
-                                    &ssh->pubkey);
+    int rc = ssh_pki_import_pubkey_file(data->set.str[STRING_SSH_PUBLIC_KEY],
+                                        &ssh->pubkey);
     if(rc != SSH_OK) {
       failf(data, "Could not load public key file");
       /* ignore */
@@ -2222,12 +2216,7 @@ static CURLcode myssh_done(struct connectdata *conn, CURLcode status)
   struct SSHPROTO *protop = conn->data->req.protop;
 
   if(!status) {
-    /* run the state-machine
-
-       TODO: when the multi interface is used, this _really_ should be using
-       the ssh_multi_statemach function but we have no general support for
-       non-blocking DONE operations!
-     */
+    /* run the state-machine */
     result = myssh_block_statemach(conn, FALSE);
   }
   else
@@ -2390,13 +2379,9 @@ static CURLcode sftp_done(struct connectdata *conn, CURLcode status,
     /* Post quote commands are executed after the SFTP_CLOSE state to avoid
        errors that could happen due to open file handles during POSTQUOTE
        operation */
-    if(!status && !premature && conn->data->set.postquote &&
-       !conn->bits.retry) {
+    if(!premature && conn->data->set.postquote && !conn->bits.retry)
       sshc->nextstate = SSH_SFTP_POSTQUOTE_INIT;
-      state(conn, SSH_SFTP_CLOSE);
-    }
-    else
-      state(conn, SSH_SFTP_CLOSE);
+    state(conn, SSH_SFTP_CLOSE);
   }
   return myssh_done(conn, status);
 }
@@ -2744,5 +2729,23 @@ static void sftp_quote_stat(struct connectdata *conn)
   return;
 }
 
+CURLcode Curl_ssh_init(void)
+{
+  if(ssh_init()) {
+    DEBUGF(fprintf(stderr, "Error: libssh_init failed\n"));
+    return CURLE_FAILED_INIT;
+  }
+  return CURLE_OK;
+}
+
+void Curl_ssh_cleanup(void)
+{
+  (void)ssh_finalize();
+}
+
+size_t Curl_ssh_version(char *buffer, size_t buflen)
+{
+  return msnprintf(buffer, buflen, "libssh/%s", CURL_LIBSSH_VERSION);
+}
 
 #endif                          /* USE_LIBSSH */
similarity index 94%
rename from lib/ssh.c
rename to lib/vssh/libssh2.c
index da89619..063f3d2 100644 (file)
--- a/lib/ssh.c
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
 #include "multiif.h"
 #include "select.h"
 #include "warnless.h"
+#include "curl_path.h"
 
 /* The last 3 #include files should be in this order */
 #include "curl_printf.h"
 #include "curl_memory.h"
-#include "curl_path.h"
 #include "memdebug.h"
 
 #if LIBSSH2_VERSION_NUM >= 0x010206
@@ -125,17 +125,9 @@ static
 CURLcode sftp_perform(struct connectdata *conn,
                       bool *connected,
                       bool *dophase_done);
-
-static int ssh_getsock(struct connectdata *conn,
-                       curl_socket_t *sock, /* points to numsocks number
-                                               of sockets */
-                       int numsocks);
-
+static int ssh_getsock(struct connectdata *conn, curl_socket_t *sock);
 static int ssh_perform_getsock(const struct connectdata *conn,
-                               curl_socket_t *sock, /* points to numsocks
-                                                       number of sockets */
-                               int numsocks);
-
+                               curl_socket_t *sock);
 static CURLcode ssh_setup_connection(struct connectdata *conn);
 
 /*
@@ -290,10 +282,6 @@ static CURLcode libssh2_session_error_to_CURLE(int err)
       return CURLE_AGAIN;
   }
 
-  /* TODO: map some more of the libssh2 errors to the more appropriate CURLcode
-     error code, and possibly add a few new SSH-related one. We must however
-     not return or even depend on libssh2 errors in the public libcurl API */
-
   return CURLE_SSH;
 }
 
@@ -478,61 +466,95 @@ static CURLcode ssh_knownhost(struct connectdata *conn)
       struct curl_khkey *knownkeyp = NULL;
       struct curl_khkey foundkey;
 
-      keybit = (keytype == LIBSSH2_HOSTKEY_TYPE_RSA)?
-        LIBSSH2_KNOWNHOST_KEY_SSHRSA:LIBSSH2_KNOWNHOST_KEY_SSHDSS;
-
+      switch(keytype) {
+      case LIBSSH2_HOSTKEY_TYPE_RSA:
+        keybit = LIBSSH2_KNOWNHOST_KEY_SSHRSA;
+        break;
+      case LIBSSH2_HOSTKEY_TYPE_DSS:
+        keybit = LIBSSH2_KNOWNHOST_KEY_SSHDSS;
+        break;
+#ifdef LIBSSH2_HOSTKEY_TYPE_ECDSA_256
+      case LIBSSH2_HOSTKEY_TYPE_ECDSA_256:
+        keybit = LIBSSH2_KNOWNHOST_KEY_ECDSA_256;
+        break;
+#endif
+#ifdef LIBSSH2_HOSTKEY_TYPE_ECDSA_384
+      case LIBSSH2_HOSTKEY_TYPE_ECDSA_384:
+        keybit = LIBSSH2_KNOWNHOST_KEY_ECDSA_384;
+        break;
+#endif
+#ifdef LIBSSH2_HOSTKEY_TYPE_ECDSA_521
+      case LIBSSH2_HOSTKEY_TYPE_ECDSA_521:
+        keybit = LIBSSH2_KNOWNHOST_KEY_ECDSA_521;
+        break;
+#endif
+#ifdef LIBSSH2_HOSTKEY_TYPE_ED25519
+      case LIBSSH2_HOSTKEY_TYPE_ED25519:
+        keybit = LIBSSH2_KNOWNHOST_KEY_ED25519;
+        break;
+#endif
+      default:
+        infof(data, "unsupported key type, can't check knownhosts!\n");
+        keybit = 0;
+        break;
+      }
+      if(!keybit)
+        /* no check means failure! */
+        rc = CURLKHSTAT_REJECT;
+      else {
 #ifdef HAVE_LIBSSH2_KNOWNHOST_CHECKP
-      keycheck = libssh2_knownhost_checkp(sshc->kh,
-                                          conn->host.name,
-                                          (conn->remote_port != PORT_SSH)?
-                                          conn->remote_port:-1,
-                                          remotekey, keylen,
-                                          LIBSSH2_KNOWNHOST_TYPE_PLAIN|
-                                          LIBSSH2_KNOWNHOST_KEYENC_RAW|
-                                          keybit,
-                                          &host);
+        keycheck = libssh2_knownhost_checkp(sshc->kh,
+                                            conn->host.name,
+                                            (conn->remote_port != PORT_SSH)?
+                                            conn->remote_port:-1,
+                                            remotekey, keylen,
+                                            LIBSSH2_KNOWNHOST_TYPE_PLAIN|
+                                            LIBSSH2_KNOWNHOST_KEYENC_RAW|
+                                            keybit,
+                                            &host);
 #else
-      keycheck = libssh2_knownhost_check(sshc->kh,
-                                         conn->host.name,
-                                         remotekey, keylen,
-                                         LIBSSH2_KNOWNHOST_TYPE_PLAIN|
-                                         LIBSSH2_KNOWNHOST_KEYENC_RAW|
-                                         keybit,
-                                         &host);
+        keycheck = libssh2_knownhost_check(sshc->kh,
+                                           conn->host.name,
+                                           remotekey, keylen,
+                                           LIBSSH2_KNOWNHOST_TYPE_PLAIN|
+                                           LIBSSH2_KNOWNHOST_KEYENC_RAW|
+                                           keybit,
+                                           &host);
 #endif
 
-      infof(data, "SSH host check: %d, key: %s\n", keycheck,
-            (keycheck <= LIBSSH2_KNOWNHOST_CHECK_MISMATCH)?
-            host->key:"<none>");
+        infof(data, "SSH host check: %d, key: %s\n", keycheck,
+              (keycheck <= LIBSSH2_KNOWNHOST_CHECK_MISMATCH)?
+              host->key:"<none>");
+
+        /* setup 'knownkey' */
+        if(keycheck <= LIBSSH2_KNOWNHOST_CHECK_MISMATCH) {
+          knownkey.key = host->key;
+          knownkey.len = 0;
+          knownkey.keytype = (keytype == LIBSSH2_HOSTKEY_TYPE_RSA)?
+            CURLKHTYPE_RSA : CURLKHTYPE_DSS;
+          knownkeyp = &knownkey;
+        }
 
-      /* setup 'knownkey' */
-      if(keycheck <= LIBSSH2_KNOWNHOST_CHECK_MISMATCH) {
-        knownkey.key = host->key;
-        knownkey.len = 0;
-        knownkey.keytype = (keytype == LIBSSH2_HOSTKEY_TYPE_RSA)?
+        /* setup 'foundkey' */
+        foundkey.key = remotekey;
+        foundkey.len = keylen;
+        foundkey.keytype = (keytype == LIBSSH2_HOSTKEY_TYPE_RSA)?
           CURLKHTYPE_RSA : CURLKHTYPE_DSS;
-        knownkeyp = &knownkey;
-      }
 
-      /* setup 'foundkey' */
-      foundkey.key = remotekey;
-      foundkey.len = keylen;
-      foundkey.keytype = (keytype == LIBSSH2_HOSTKEY_TYPE_RSA)?
-        CURLKHTYPE_RSA : CURLKHTYPE_DSS;
+        /*
+         * if any of the LIBSSH2_KNOWNHOST_CHECK_* defines and the
+         * curl_khmatch enum are ever modified, we need to introduce a
+         * translation table here!
+         */
+        keymatch = (enum curl_khmatch)keycheck;
 
-      /*
-       * if any of the LIBSSH2_KNOWNHOST_CHECK_* defines and the
-       * curl_khmatch enum are ever modified, we need to introduce a
-       * translation table here!
-       */
-      keymatch = (enum curl_khmatch)keycheck;
-
-      /* Ask the callback how to behave */
-      Curl_set_in_callback(data, true);
-      rc = func(data, knownkeyp, /* from the knownhosts file */
-                &foundkey, /* from the remote host */
-                keymatch, data->set.ssh_keyfunc_userp);
-      Curl_set_in_callback(data, false);
+        /* Ask the callback how to behave */
+        Curl_set_in_callback(data, true);
+        rc = func(data, knownkeyp, /* from the knownhosts file */
+                  &foundkey, /* from the remote host */
+                  keymatch, data->set.ssh_keyfunc_userp);
+        Curl_set_in_callback(data, false);
+      }
     }
     else
       /* no remotekey means failure! */
@@ -591,15 +613,15 @@ static CURLcode ssh_check_fingerprint(struct connectdata *conn)
   struct Curl_easy *data = conn->data;
   const char *pubkey_md5 = data->set.str[STRING_SSH_HOST_PUBLIC_KEY_MD5];
   char md5buffer[33];
-  int i;
 
   const char *fingerprint = libssh2_hostkey_hash(sshc->ssh_session,
       LIBSSH2_HOSTKEY_HASH_MD5);
 
   if(fingerprint) {
     /* The fingerprint points to static storage (!), don't free() it. */
+    int i;
     for(i = 0; i < 16; i++)
-      snprintf(&md5buffer[i*2], 3, "%02x", (unsigned char) fingerprint[i]);
+      msnprintf(&md5buffer[i*2], 3, "%02x", (unsigned char) fingerprint[i]);
     infof(data, "SSH MD5 fingerprint: %s\n", md5buffer);
   }
 
@@ -667,7 +689,10 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
         break;
       }
       if(rc) {
-        failf(data, "Failure establishing ssh session");
+        char *err_msg = NULL;
+        (void)libssh2_session_last_error(sshc->ssh_session, &err_msg, NULL, 0);
+        failf(data, "Failure establishing ssh session: %d, %s", rc, err_msg);
+
         state(conn, SSH_SESSION_FREE);
         sshc->actualcode = CURLE_FAILED_INIT;
         break;
@@ -734,18 +759,17 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
 
       if((data->set.ssh_auth_types & CURLSSH_AUTH_PUBLICKEY) &&
          (strstr(sshc->authlist, "publickey") != NULL)) {
-        char *home = NULL;
         bool out_of_memory = FALSE;
 
         sshc->rsa_pub = sshc->rsa = NULL;
 
-        /* To ponder about: should really the lib be messing about with the
-           HOME environment variable etc? */
-        home = curl_getenv("HOME");
-
         if(data->set.str[STRING_SSH_PRIVATE_KEY])
           sshc->rsa = strdup(data->set.str[STRING_SSH_PRIVATE_KEY]);
         else {
+          /* To ponder about: should really the lib be messing about with the
+             HOME environment variable etc? */
+          char *home = curl_getenv("HOME");
+
           /* If no private key file is specified, try some common paths. */
           if(home) {
             /* Try ~/.ssh first. */
@@ -761,6 +785,7 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
                 Curl_safefree(sshc->rsa);
               }
             }
+            free(home);
           }
           if(!out_of_memory && !sshc->rsa) {
             /* Nothing found; try the current dir. */
@@ -792,7 +817,6 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
         }
 
         if(out_of_memory || sshc->rsa == NULL) {
-          free(home);
           Curl_safefree(sshc->rsa);
           Curl_safefree(sshc->rsa_pub);
           state(conn, SSH_SESSION_FREE);
@@ -804,8 +828,6 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
         if(!sshc->passphrase)
           sshc->passphrase = "";
 
-        free(home);
-
         if(sshc->rsa_pub)
           infof(data, "Using SSH public key file '%s'\n", sshc->rsa_pub);
         infof(data, "Using SSH private key file '%s'\n", sshc->rsa);
@@ -1805,7 +1827,7 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
         Curl_pgrsSetUploadSize(data, data->state.infilesize);
       }
       /* upload data */
-      Curl_setup_transfer(conn, -1, -1, FALSE, NULL, FIRSTSOCKET, NULL);
+      Curl_setup_transfer(data, -1, -1, FALSE, FIRSTSOCKET);
 
       /* not set by Curl_setup_transfer to preserve keepon bits */
       conn->sockfd = conn->writesockfd;
@@ -1999,8 +2021,8 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
               break;
             }
 
-            snprintf(sshc->readdir_linkPath, PATH_MAX, "%s%s", sftp_scp->path,
-                     sshc->readdir_filename);
+            msnprintf(sshc->readdir_linkPath, PATH_MAX, "%s%s", sftp_scp->path,
+                      sshc->readdir_filename);
             state(conn, SSH_SFTP_READDIR_LINK);
             break;
           }
@@ -2055,21 +2077,21 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
       }
       sshc->readdir_line = new_readdir_line;
 
-      sshc->readdir_currLen += snprintf(sshc->readdir_line +
-                                        sshc->readdir_currLen,
-                                        sshc->readdir_totalLen -
-                                        sshc->readdir_currLen,
-                                        " -> %s",
-                                        sshc->readdir_filename);
+      sshc->readdir_currLen += msnprintf(sshc->readdir_line +
+                                         sshc->readdir_currLen,
+                                         sshc->readdir_totalLen -
+                                         sshc->readdir_currLen,
+                                         " -> %s",
+                                         sshc->readdir_filename);
 
       state(conn, SSH_SFTP_READDIR_BOTTOM);
       break;
 
     case SSH_SFTP_READDIR_BOTTOM:
-      sshc->readdir_currLen += snprintf(sshc->readdir_line +
-                                        sshc->readdir_currLen,
-                                        sshc->readdir_totalLen -
-                                        sshc->readdir_currLen, "\n");
+      sshc->readdir_currLen += msnprintf(sshc->readdir_line +
+                                         sshc->readdir_currLen,
+                                         sshc->readdir_totalLen -
+                                         sshc->readdir_currLen, "\n");
       result = Curl_client_write(conn, CLIENTWRITE_BODY,
                                  sshc->readdir_line,
                                  sshc->readdir_currLen);
@@ -2102,7 +2124,7 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
       Curl_safefree(sshc->readdir_longentry);
 
       /* no data to transfer */
-      Curl_setup_transfer(conn, -1, -1, FALSE, NULL, -1, NULL);
+      Curl_setup_transfer(data, -1, -1, FALSE, -1);
       state(conn, SSH_STOP);
       break;
 
@@ -2242,13 +2264,12 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
     /* Setup the actual download */
     if(data->req.size == 0) {
       /* no data to transfer */
-      Curl_setup_transfer(conn, -1, -1, FALSE, NULL, -1, NULL);
+      Curl_setup_transfer(data, -1, -1, FALSE, -1);
       infof(data, "File already completely downloaded\n");
       state(conn, SSH_STOP);
       break;
     }
-    Curl_setup_transfer(conn, FIRSTSOCKET, data->req.size,
-                        FALSE, NULL, -1, NULL);
+    Curl_setup_transfer(data, FIRSTSOCKET, data->req.size, FALSE, -1);
 
     /* not set by Curl_setup_transfer to preserve keepon bits */
     conn->writesockfd = conn->sockfd;
@@ -2392,8 +2413,7 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
       }
 
       /* upload data */
-      Curl_setup_transfer(conn, -1, data->req.size, FALSE, NULL,
-                          FIRSTSOCKET, NULL);
+      Curl_setup_transfer(data, -1, data->req.size, FALSE, FIRSTSOCKET);
 
       /* not set by Curl_setup_transfer to preserve keepon bits */
       conn->sockfd = conn->writesockfd;
@@ -2464,7 +2484,7 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
       /* download data */
       bytecount = (curl_off_t)sb.st_size;
       data->req.maxdownload =  (curl_off_t)sb.st_size;
-      Curl_setup_transfer(conn, FIRSTSOCKET, bytecount, FALSE, NULL, -1, NULL);
+      Curl_setup_transfer(data, FIRSTSOCKET, bytecount, FALSE, -1);
 
       /* not set by Curl_setup_transfer to preserve keepon bits */
       conn->writesockfd = conn->sockfd;
@@ -2706,13 +2726,10 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
 /* called by the multi interface to figure out what socket(s) to wait for and
    for what actions in the DO_DONE, PERFORM and WAITPERFORM states */
 static int ssh_perform_getsock(const struct connectdata *conn,
-                               curl_socket_t *sock, /* points to numsocks
-                                                       number of sockets */
-                               int numsocks)
+                               curl_socket_t *sock)
 {
 #ifdef HAVE_LIBSSH2_SESSION_BLOCK_DIRECTION
   int bitmap = GETSOCK_BLANK;
-  (void)numsocks;
 
   sock[0] = conn->sock[FIRSTSOCKET];
 
@@ -2726,28 +2743,25 @@ static int ssh_perform_getsock(const struct connectdata *conn,
 #else
   /* if we don't know the direction we can use the generic *_getsock()
      function even for the protocol_connect and doing states */
-  return Curl_single_getsock(conn, sock, numsocks);
+  return Curl_single_getsock(conn, sock);
 #endif
 }
 
 /* Generic function called by the multi interface to figure out what socket(s)
    to wait for and for what actions during the DOING and PROTOCONNECT states*/
 static int ssh_getsock(struct connectdata *conn,
-                       curl_socket_t *sock, /* points to numsocks number
-                                               of sockets */
-                       int numsocks)
+                       curl_socket_t *sock)
 {
 #ifndef HAVE_LIBSSH2_SESSION_BLOCK_DIRECTION
   (void)conn;
   (void)sock;
-  (void)numsocks;
   /* if we don't know any direction we can just play along as we used to and
      not provide any sensible info */
   return GETSOCK_BLANK;
 #else
   /* if we know the direction we can use the generic *_getsock() function even
      for the protocol_connect and doing states */
-  return ssh_perform_getsock(conn, sock, numsocks);
+  return ssh_perform_getsock(conn, sock);
 #endif
 }
 
@@ -2788,9 +2802,12 @@ static CURLcode ssh_multi_statemach(struct connectdata *conn, bool *done)
   CURLcode result = CURLE_OK;
   bool block; /* we store the status and use that to provide a ssh_getsock()
                  implementation */
-
-  result = ssh_statemach_act(conn, &block);
-  *done = (sshc->state == SSH_STOP) ? TRUE : FALSE;
+  do {
+    result = ssh_statemach_act(conn, &block);
+    *done = (sshc->state == SSH_STOP) ? TRUE : FALSE;
+    /* if there's no error, it isn't done and it didn't EWOULDBLOCK, then
+       try again */
+  } while(!result && !*done && !block);
   ssh_block2waitfor(conn, block);
 
   return result;
@@ -2828,7 +2845,7 @@ static CURLcode ssh_block_statemach(struct connectdata *conn,
     }
 
 #ifdef HAVE_LIBSSH2_SESSION_BLOCK_DIRECTION
-    if(!result && block) {
+    if(block) {
       int dir = libssh2_session_block_directions(sshc->ssh_session);
       curl_socket_t sock = conn->sock[FIRSTSOCKET];
       curl_socket_t fd_read = CURL_SOCKET_BAD;
@@ -2839,7 +2856,7 @@ static CURLcode ssh_block_statemach(struct connectdata *conn,
         fd_write = sock;
       /* wait for the socket to become ready */
       (void)Curl_socket_check(fd_read, CURL_SOCKET_BAD, fd_write,
-                              left>1000?1000:left); /* ignore result */
+                              left>1000?1000:(time_t)left);
     }
 #endif
 
@@ -3061,12 +3078,7 @@ static CURLcode ssh_done(struct connectdata *conn, CURLcode status)
   struct SSHPROTO *sftp_scp = conn->data->req.protop;
 
   if(!status) {
-    /* run the state-machine
-
-       TODO: when the multi interface is used, this _really_ should be using
-       the ssh_multi_statemach function but we have no general support for
-       non-blocking DONE operations!
-    */
+    /* run the state-machine */
     result = ssh_block_statemach(conn, FALSE);
   }
   else
@@ -3219,13 +3231,9 @@ static CURLcode sftp_done(struct connectdata *conn, CURLcode status,
     /* Post quote commands are executed after the SFTP_CLOSE state to avoid
        errors that could happen due to open file handles during POSTQUOTE
        operation */
-    if(!status && !premature && conn->data->set.postquote &&
-       !conn->bits.retry) {
+    if(!premature && conn->data->set.postquote && !conn->bits.retry)
       sshc->nextstate = SSH_SFTP_POSTQUOTE_INIT;
-      state(conn, SSH_SFTP_CLOSE);
-    }
-    else
-      state(conn, SSH_SFTP_CLOSE);
+    state(conn, SSH_SFTP_CLOSE);
   }
   return ssh_done(conn, status);
 }
@@ -3346,4 +3354,27 @@ static const char *sftp_libssh2_strerror(int err)
   return "Unknown error in libssh2";
 }
 
+CURLcode Curl_ssh_init(void)
+{
+#ifdef HAVE_LIBSSH2_INIT
+  if(libssh2_init(0)) {
+    DEBUGF(fprintf(stderr, "Error: libssh2_init failed\n"));
+    return CURLE_FAILED_INIT;
+  }
+#endif
+  return CURLE_OK;
+}
+
+void Curl_ssh_cleanup(void)
+{
+#ifdef HAVE_LIBSSH2_EXIT
+  (void)libssh2_exit();
+#endif
+}
+
+size_t Curl_ssh_version(char *buffer, size_t buflen)
+{
+  return msnprintf(buffer, buflen, "libssh2/%s", LIBSSH2_VERSION);
+}
+
 #endif /* USE_LIBSSH2 */
similarity index 96%
rename from lib/ssh.h
rename to lib/vssh/ssh.h
index 0620aac..3213c5a 100644 (file)
--- a/lib/ssh.h
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -239,7 +239,16 @@ extern const struct Curl_handler Curl_handler_sftp;
 
 extern const struct Curl_handler Curl_handler_scp;
 extern const struct Curl_handler Curl_handler_sftp;
-
 #endif /* USE_LIBSSH2 */
 
+#ifdef USE_SSH
+/* generic SSH backend functions */
+CURLcode Curl_ssh_init(void);
+void Curl_ssh_cleanup(void);
+size_t Curl_ssh_version(char *buffer, size_t buflen);
+#else
+/* for non-SSH builds */
+#define Curl_ssh_cleanup()
+#endif
+
 #endif /* HEADER_CURL_SSH_H */
diff --git a/lib/vtls/axtls.c b/lib/vtls/axtls.c
deleted file mode 100644 (file)
index b262392..0000000
+++ /dev/null
@@ -1,741 +0,0 @@
-/***************************************************************************
- *                                  _   _ ____  _
- *  Project                     ___| | | |  _ \| |
- *                             / __| | | | |_) | |
- *                            | (__| |_| |  _ <| |___
- *                             \___|\___/|_| \_\_____|
- *
- * Copyright (C) 2010, DirecTV, Contact: Eric Hu, <ehu@directv.com>.
- * Copyright (C) 2010 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
- *
- * This software is licensed as described in the file COPYING, which
- * you should have received as part of this distribution. The terms
- * are also available at https://curl.haxx.se/docs/copyright.html.
- *
- * You may opt to use, copy, modify, merge, publish, distribute and/or sell
- * copies of the Software, and permit persons to whom the Software is
- * furnished to do so, under the terms of the COPYING file.
- *
- * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
- * KIND, either express or implied.
- *
- ***************************************************************************/
-
-/*
- * Source file for all axTLS-specific code for the TLS/SSL layer. No code
- * but vtls.c should ever call or use these functions.
- */
-
-#include "curl_setup.h"
-
-#ifdef USE_AXTLS
-
-#error axTLS support has been disabled in curl due to doubts about quality,
-#error user dedication and a lack of use/testing. We urge users to consider
-#error using a more established TLS backend instead.
-
-#include <axTLS/config.h>
-#include <axTLS/ssl.h>
-#include "axtls.h"
-
-#include "sendf.h"
-#include "inet_pton.h"
-#include "vtls.h"
-#include "parsedate.h"
-#include "connect.h" /* for the connect timeout */
-#include "select.h"
-#include "curl_printf.h"
-#include "hostcheck.h"
-#include <unistd.h>
-
-/* The last #include files should be: */
-#include "curl_memory.h"
-#include "memdebug.h"
-
-struct ssl_backend_data {
-  SSL_CTX* ssl_ctx;
-  SSL*     ssl;
-};
-
-#define BACKEND connssl->backend
-
-static CURLcode map_error_to_curl(int axtls_err)
-{
-  switch(axtls_err) {
-  case SSL_ERROR_NOT_SUPPORTED:
-  case SSL_ERROR_INVALID_VERSION:
-  case -70:                       /* protocol version alert from server */
-    return CURLE_UNSUPPORTED_PROTOCOL;
-    break;
-  case SSL_ERROR_NO_CIPHER:
-    return CURLE_SSL_CIPHER;
-    break;
-  case SSL_ERROR_BAD_CERTIFICATE: /* this may be bad server cert too */
-  case SSL_ERROR_NO_CERT_DEFINED:
-  case -42:                       /* bad certificate alert from server */
-  case -43:                       /* unsupported cert alert from server */
-  case -44:                       /* cert revoked alert from server */
-  case -45:                       /* cert expired alert from server */
-  case -46:                       /* cert unknown alert from server */
-    return CURLE_SSL_CERTPROBLEM;
-    break;
-  case SSL_X509_ERROR(X509_NOT_OK):
-  case SSL_X509_ERROR(X509_VFY_ERROR_NO_TRUSTED_CERT):
-  case SSL_X509_ERROR(X509_VFY_ERROR_BAD_SIGNATURE):
-  case SSL_X509_ERROR(X509_VFY_ERROR_NOT_YET_VALID):
-  case SSL_X509_ERROR(X509_VFY_ERROR_EXPIRED):
-  case SSL_X509_ERROR(X509_VFY_ERROR_SELF_SIGNED):
-  case SSL_X509_ERROR(X509_VFY_ERROR_INVALID_CHAIN):
-  case SSL_X509_ERROR(X509_VFY_ERROR_UNSUPPORTED_DIGEST):
-  case SSL_X509_ERROR(X509_INVALID_PRIV_KEY):
-    return CURLE_PEER_FAILED_VERIFICATION;
-    break;
-  case -48:                       /* unknown ca alert from server */
-    return CURLE_SSL_CACERT;
-    break;
-  case -49:                       /* access denied alert from server */
-    return CURLE_REMOTE_ACCESS_DENIED;
-    break;
-  case SSL_ERROR_CONN_LOST:
-  case SSL_ERROR_SOCK_SETUP_FAILURE:
-  case SSL_ERROR_INVALID_HANDSHAKE:
-  case SSL_ERROR_INVALID_PROT_MSG:
-  case SSL_ERROR_INVALID_HMAC:
-  case SSL_ERROR_INVALID_SESSION:
-  case SSL_ERROR_INVALID_KEY:     /* it's too bad this doesn't map better */
-  case SSL_ERROR_FINISHED_INVALID:
-  case SSL_ERROR_NO_CLIENT_RENOG:
-  default:
-    return CURLE_SSL_CONNECT_ERROR;
-    break;
-  }
-}
-
-static Curl_recv axtls_recv;
-static Curl_send axtls_send;
-
-static void free_ssl_structs(struct ssl_connect_data *connssl)
-{
-  if(BACKEND->ssl) {
-    ssl_free(BACKEND->ssl);
-    BACKEND->ssl = NULL;
-  }
-  if(BACKEND->ssl_ctx) {
-    ssl_ctx_free(BACKEND->ssl_ctx);
-    BACKEND->ssl_ctx = NULL;
-  }
-}
-
-/*
- * For both blocking and non-blocking connects, this function sets up the
- * ssl context and state.  This function is called after the TCP connect
- * has completed.
- */
-static CURLcode connect_prep(struct connectdata *conn, int sockindex)
-{
-  struct ssl_connect_data *connssl = &conn->ssl[sockindex];
-  struct Curl_easy *data = conn->data;
-  SSL_CTX *ssl_ctx;
-  SSL *ssl = NULL;
-  int cert_types[] = {SSL_OBJ_X509_CERT, SSL_OBJ_PKCS12, 0};
-  int key_types[] = {SSL_OBJ_RSA_KEY, SSL_OBJ_PKCS8, SSL_OBJ_PKCS12, 0};
-  int i, ssl_fcn_return;
-
-  /* Assuming users will not compile in custom key/cert to axTLS.
-  *  Also, even for blocking connects, use axTLS non-blocking feature.
-  */
-  uint32_t client_option = SSL_NO_DEFAULT_KEY |
-    SSL_SERVER_VERIFY_LATER |
-    SSL_CONNECT_IN_PARTS;
-
-  if(connssl->state == ssl_connection_complete)
-    /* to make us tolerant against being called more than once for the
-       same connection */
-    return CURLE_OK;
-
-  if(SSL_CONN_CONFIG(version_max) != CURL_SSLVERSION_MAX_NONE) {
-    failf(data, "axtls does not support CURL_SSLVERSION_MAX");
-    return CURLE_SSL_CONNECT_ERROR;
-  }
-
-
-  /* axTLS only supports TLSv1 */
-  /* check to see if we've been told to use an explicit SSL/TLS version */
-  switch(SSL_CONN_CONFIG(version)) {
-  case CURL_SSLVERSION_DEFAULT:
-  case CURL_SSLVERSION_TLSv1:
-    break;
-  default:
-    failf(data, "axTLS only supports TLS 1.0 and 1.1, "
-          "and it cannot be specified which one to use");
-    return CURLE_SSL_CONNECT_ERROR;
-  }
-
-#ifdef  AXTLSDEBUG
-  client_option |= SSL_DISPLAY_STATES | SSL_DISPLAY_RSA | SSL_DISPLAY_CERTS;
-#endif /* AXTLSDEBUG */
-
-  /* Allocate an SSL_CTX struct */
-  ssl_ctx = ssl_ctx_new(client_option, SSL_DEFAULT_CLNT_SESS);
-  if(ssl_ctx == NULL) {
-    failf(data, "unable to create client SSL context");
-    return CURLE_SSL_CONNECT_ERROR;
-  }
-
-  BACKEND->ssl_ctx = ssl_ctx;
-  BACKEND->ssl = NULL;
-
-  /* Load the trusted CA cert bundle file */
-  if(SSL_CONN_CONFIG(CAfile)) {
-    if(ssl_obj_load(ssl_ctx, SSL_OBJ_X509_CACERT,
-                    SSL_CONN_CONFIG(CAfile), NULL) != SSL_OK) {
-      infof(data, "error reading ca cert file %s \n",
-            SSL_CONN_CONFIG(CAfile));
-      if(SSL_CONN_CONFIG(verifypeer)) {
-        return CURLE_SSL_CACERT_BADFILE;
-      }
-    }
-    else
-      infof(data, "found certificates in %s\n", SSL_CONN_CONFIG(CAfile));
-  }
-
-  /* gtls.c tasks we're skipping for now:
-   * 1) certificate revocation list checking
-   * 2) dns name assignment to host
-   * 3) set protocol priority.  axTLS is TLSv1 only, so can probably ignore
-   * 4) set certificate priority.  axTLS ignores type and sends certs in
-   *  order added.  can probably ignore this.
-   */
-
-  /* Load client certificate */
-  if(SSL_SET_OPTION(cert)) {
-    i = 0;
-    /* Instead of trying to analyze cert type here, let axTLS try them all. */
-    while(cert_types[i] != 0) {
-      ssl_fcn_return = ssl_obj_load(ssl_ctx, cert_types[i],
-                                    SSL_SET_OPTION(cert), NULL);
-      if(ssl_fcn_return == SSL_OK) {
-        infof(data, "successfully read cert file %s \n",
-              SSL_SET_OPTION(cert));
-        break;
-      }
-      i++;
-    }
-    /* Tried all cert types, none worked. */
-    if(cert_types[i] == 0) {
-      failf(data, "%s is not x509 or pkcs12 format",
-            SSL_SET_OPTION(cert));
-      return CURLE_SSL_CERTPROBLEM;
-    }
-  }
-
-  /* Load client key.
-     If a pkcs12 file successfully loaded a cert, then there's nothing to do
-     because the key has already been loaded. */
-  if(SSL_SET_OPTION(key) && cert_types[i] != SSL_OBJ_PKCS12) {
-    i = 0;
-    /* Instead of trying to analyze key type here, let axTLS try them all. */
-    while(key_types[i] != 0) {
-      ssl_fcn_return = ssl_obj_load(ssl_ctx, key_types[i],
-                                    SSL_SET_OPTION(key), NULL);
-      if(ssl_fcn_return == SSL_OK) {
-        infof(data, "successfully read key file %s \n",
-              SSL_SET_OPTION(key));
-        break;
-      }
-      i++;
-    }
-    /* Tried all key types, none worked. */
-    if(key_types[i] == 0) {
-      failf(data, "Failure: %s is not a supported key file",
-            SSL_SET_OPTION(key));
-      return CURLE_SSL_CONNECT_ERROR;
-    }
-  }
-
-  /* gtls.c does more here that is being left out for now
-   * 1) set session credentials.  can probably ignore since axtls puts this
-   *    info in the ssl_ctx struct
-   * 2) setting up callbacks.  these seem gnutls specific
-   */
-
-  if(SSL_SET_OPTION(primary.sessionid)) {
-    const uint8_t *ssl_sessionid;
-    size_t ssl_idsize;
-
-    /* In axTLS, handshaking happens inside ssl_client_new. */
-    Curl_ssl_sessionid_lock(conn);
-    if(!Curl_ssl_getsessionid(conn, (void **) &ssl_sessionid, &ssl_idsize,
-                              sockindex)) {
-      /* we got a session id, use it! */
-      infof(data, "SSL re-using session ID\n");
-      ssl = ssl_client_new(ssl_ctx, conn->sock[sockindex],
-                           ssl_sessionid, (uint8_t)ssl_idsize, NULL);
-    }
-    Curl_ssl_sessionid_unlock(conn);
-  }
-
-  if(!ssl)
-    ssl = ssl_client_new(ssl_ctx, conn->sock[sockindex], NULL, 0, NULL);
-
-  BACKEND->ssl = ssl;
-  return CURLE_OK;
-}
-
-static void Curl_axtls_close(struct connectdata *conn, int sockindex)
-{
-  struct ssl_connect_data *connssl = &conn->ssl[sockindex];
-
-  infof(conn->data, "  Curl_axtls_close\n");
-
-    /* line from openssl.c: (void)SSL_shutdown(BACKEND->ssl);
-       axTLS compat layer does nothing for SSL_shutdown */
-
-    /* The following line is from openssl.c.  There seems to be no axTLS
-       equivalent.  ssl_free and ssl_ctx_free close things.
-       SSL_set_connect_state(connssl->handle); */
-
-  free_ssl_structs(connssl);
-}
-
-/*
- * For both blocking and non-blocking connects, this function finalizes the
- * SSL connection.
- */
-static CURLcode connect_finish(struct connectdata *conn, int sockindex)
-{
-  struct Curl_easy *data = conn->data;
-  struct ssl_connect_data *connssl = &conn->ssl[sockindex];
-  SSL *ssl = BACKEND->ssl;
-  const char *peer_CN;
-  uint32_t dns_altname_index;
-  const char *dns_altname;
-  int8_t found_subject_alt_names = 0;
-  int8_t found_subject_alt_name_matching_conn = 0;
-  const char * const hostname = SSL_IS_PROXY() ? conn->http_proxy.host.name :
-    conn->host.name;
-  const char * const dispname = SSL_IS_PROXY() ?
-    conn->http_proxy.host.dispname : conn->host.dispname;
-
-  /* Here, gtls.c gets the peer certificates and fails out depending on
-   * settings in "data."  axTLS api doesn't have get cert chain fcn, so omit?
-   */
-
-  /* Verify server's certificate */
-  if(SSL_CONN_CONFIG(verifypeer)) {
-    if(ssl_verify_cert(ssl) != SSL_OK) {
-      Curl_axtls_close(conn, sockindex);
-      failf(data, "server cert verify failed");
-      return CURLE_PEER_FAILED_VERIFICATION;
-    }
-  }
-  else
-    infof(data, "\t server certificate verification SKIPPED\n");
-
-  /* Here, gtls.c does issuer verification. axTLS has no straightforward
-   * equivalent, so omitting for now.*/
-
-  /* Here, gtls.c does the following
-   * 1) x509 hostname checking per RFC2818.  axTLS doesn't support this, but
-   *    it seems useful. This is now implemented, by Oscar Koeroo
-   * 2) checks cert validity based on time.  axTLS does this in ssl_verify_cert
-   * 3) displays a bunch of cert information.  axTLS doesn't support most of
-   *    this, but a couple fields are available.
-   */
-
-  /* There is no (DNS) Altnames count in the version 1.4.8 API. There is a
-     risk of an inifite loop */
-  for(dns_altname_index = 0; ; dns_altname_index++) {
-    dns_altname = ssl_get_cert_subject_alt_dnsname(ssl, dns_altname_index);
-    if(dns_altname == NULL) {
-      break;
-    }
-    found_subject_alt_names = 1;
-
-    infof(data, "\tComparing subject alt name DNS with hostname: %s <-> %s\n",
-          dns_altname, hostname);
-    if(Curl_cert_hostcheck(dns_altname, hostname)) {
-      found_subject_alt_name_matching_conn = 1;
-      break;
-    }
-  }
-
-  /* RFC2818 checks */
-  if(found_subject_alt_names && !found_subject_alt_name_matching_conn) {
-    if(SSL_CONN_CONFIG(verifyhost)) {
-      /* Break connection ! */
-      Curl_axtls_close(conn, sockindex);
-      failf(data, "\tsubjectAltName(s) do not match %s\n", dispname);
-      return CURLE_PEER_FAILED_VERIFICATION;
-    }
-    else
-      infof(data, "\tsubjectAltName(s) do not match %s\n", dispname);
-  }
-  else if(found_subject_alt_names == 0) {
-    /* Per RFC2818, when no Subject Alt Names were available, examine the peer
-       CN as a legacy fallback */
-    peer_CN = ssl_get_cert_dn(ssl, SSL_X509_CERT_COMMON_NAME);
-    if(peer_CN == NULL) {
-      if(SSL_CONN_CONFIG(verifyhost)) {
-        Curl_axtls_close(conn, sockindex);
-        failf(data, "unable to obtain common name from peer certificate");
-        return CURLE_PEER_FAILED_VERIFICATION;
-      }
-      else
-        infof(data, "unable to obtain common name from peer certificate");
-    }
-    else {
-      if(!Curl_cert_hostcheck((const char *)peer_CN, hostname)) {
-        if(SSL_CONN_CONFIG(verifyhost)) {
-          /* Break connection ! */
-          Curl_axtls_close(conn, sockindex);
-          failf(data, "\tcommon name \"%s\" does not match \"%s\"\n",
-                peer_CN, dispname);
-          return CURLE_PEER_FAILED_VERIFICATION;
-        }
-        else
-          infof(data, "\tcommon name \"%s\" does not match \"%s\"\n",
-                peer_CN, dispname);
-      }
-    }
-  }
-
-  /* General housekeeping */
-  connssl->state = ssl_connection_complete;
-  conn->recv[sockindex] = axtls_recv;
-  conn->send[sockindex] = axtls_send;
-
-  /* Put our freshly minted SSL session in cache */
-  if(SSL_SET_OPTION(primary.sessionid)) {
-    const uint8_t *ssl_sessionid = ssl_get_session_id(ssl);
-    size_t ssl_idsize = ssl_get_session_id_size(ssl);
-    Curl_ssl_sessionid_lock(conn);
-    if(Curl_ssl_addsessionid(conn, (void *) ssl_sessionid, ssl_idsize,
-                             sockindex) != CURLE_OK)
-      infof(data, "failed to add session to cache\n");
-    Curl_ssl_sessionid_unlock(conn);
-  }
-
-  return CURLE_OK;
-}
-
-/*
- * Use axTLS's non-blocking connection feature to open an SSL connection.
- * This is called after a TCP connection is already established.
- */
-static CURLcode Curl_axtls_connect_nonblocking(struct connectdata *conn,
-                                               int sockindex, bool *done)
-{
-  struct ssl_connect_data *connssl = &conn->ssl[sockindex];
-  CURLcode conn_step;
-  int ssl_fcn_return;
-  int i;
-
- *done = FALSE;
-  /* connectdata is calloc'd and connecting_state is only changed in this
-     function, so this is safe, as the state is effectively initialized. */
-  if(connssl->connecting_state == ssl_connect_1) {
-    conn_step = connect_prep(conn, sockindex);
-    if(conn_step != CURLE_OK) {
-      Curl_axtls_close(conn, sockindex);
-      return conn_step;
-    }
-    connssl->connecting_state = ssl_connect_2;
-  }
-
-  if(connssl->connecting_state == ssl_connect_2) {
-    /* Check to make sure handshake was ok. */
-    if(ssl_handshake_status(BACKEND->ssl) != SSL_OK) {
-      /* Loop to perform more work in between sleeps. This is work around the
-         fact that axtls does not expose any knowledge about when work needs
-         to be performed. This can save ~25% of time on SSL handshakes. */
-      for(i = 0; i<5; i++) {
-        ssl_fcn_return = ssl_read(BACKEND->ssl, NULL);
-        if(ssl_fcn_return < 0) {
-          Curl_axtls_close(conn, sockindex);
-          ssl_display_error(ssl_fcn_return); /* goes to stdout. */
-          return map_error_to_curl(ssl_fcn_return);
-        }
-        return CURLE_OK;
-      }
-    }
-    infof(conn->data, "handshake completed successfully\n");
-    connssl->connecting_state = ssl_connect_3;
-  }
-
-  if(connssl->connecting_state == ssl_connect_3) {
-    conn_step = connect_finish(conn, sockindex);
-    if(conn_step != CURLE_OK) {
-      Curl_axtls_close(conn, sockindex);
-      return conn_step;
-    }
-
-    /* Reset connect state */
-    connssl->connecting_state = ssl_connect_1;
-
-    *done = TRUE;
-    return CURLE_OK;
-  }
-
-  /* Unrecognized state.  Things are very bad. */
-  connssl->state  = ssl_connection_none;
-  connssl->connecting_state = ssl_connect_1;
-  /* Return value perhaps not strictly correct, but distinguishes the issue.*/
-  return CURLE_BAD_FUNCTION_ARGUMENT;
-}
-
-
-/*
- * This function is called after the TCP connect has completed. Setup the TLS
- * layer and do all necessary magic for a blocking connect.
- */
-static CURLcode Curl_axtls_connect(struct connectdata *conn, int sockindex)
-{
-  struct Curl_easy *data = conn->data;
-  CURLcode conn_step = connect_prep(conn, sockindex);
-  int ssl_fcn_return;
-  struct ssl_connect_data *connssl = &conn->ssl[sockindex];
-  SSL *ssl = BACKEND->ssl;
-  long timeout_ms;
-
-  if(conn_step != CURLE_OK) {
-    Curl_axtls_close(conn, sockindex);
-    return conn_step;
-  }
-
-  /* Check to make sure handshake was ok. */
-  while(ssl_handshake_status(ssl) != SSL_OK) {
-    /* check allowed time left */
-    timeout_ms = Curl_timeleft(data, NULL, TRUE);
-
-    if(timeout_ms < 0) {
-      /* no need to continue if time already is up */
-      failf(data, "SSL connection timeout");
-      return CURLE_OPERATION_TIMEDOUT;
-    }
-
-    ssl_fcn_return = ssl_read(ssl, NULL);
-    if(ssl_fcn_return < 0) {
-      Curl_axtls_close(conn, sockindex);
-      ssl_display_error(ssl_fcn_return); /* goes to stdout. */
-      return map_error_to_curl(ssl_fcn_return);
-    }
-    /* TODO: avoid polling */
-    Curl_wait_ms(10);
-  }
-  infof(conn->data, "handshake completed successfully\n");
-
-  conn_step = connect_finish(conn, sockindex);
-  if(conn_step != CURLE_OK) {
-    Curl_axtls_close(conn, sockindex);
-    return conn_step;
-  }
-
-  return CURLE_OK;
-}
-
-/* return number of sent (non-SSL) bytes */
-static ssize_t axtls_send(struct connectdata *conn,
-                          int sockindex,
-                          const void *mem,
-                          size_t len,
-                          CURLcode *err)
-{
-  struct ssl_connect_data *connssl = &conn->ssl[sockindex];
-  /* ssl_write() returns 'int' while write() and send() returns 'size_t' */
-  int rc = ssl_write(BACKEND->ssl, mem, (int)len);
-
-  infof(conn->data, "  axtls_send\n");
-
-  if(rc < 0) {
-    *err = map_error_to_curl(rc);
-    rc = -1; /* generic error code for send failure */
-  }
-
-  *err = CURLE_OK;
-  return rc;
-}
-
-/*
- * This function is called to shut down the SSL layer but keep the
- * socket open (CCC - Clear Command Channel)
- */
-static int Curl_axtls_shutdown(struct connectdata *conn, int sockindex)
-{
-  /* Outline taken from openssl.c since functions are in axTLS compat layer.
-     axTLS's error set is much smaller, so a lot of error-handling was removed.
-   */
-  int retval = 0;
-  struct ssl_connect_data *connssl = &conn->ssl[sockindex];
-  struct Curl_easy *data = conn->data;
-  uint8_t *buf;
-  ssize_t nread;
-
-  infof(conn->data, "  Curl_axtls_shutdown\n");
-
-  /* This has only been tested on the proftpd server, and the mod_tls code
-     sends a close notify alert without waiting for a close notify alert in
-     response. Thus we wait for a close notify alert from the server, but
-     we do not send one. Let's hope other servers do the same... */
-
-  /* axTLS compat layer does nothing for SSL_shutdown, so we do nothing too
-  if(data->set.ftp_ccc == CURLFTPSSL_CCC_ACTIVE)
-      (void)SSL_shutdown(BACKEND->ssl);
-  */
-
-  if(BACKEND->ssl) {
-    int what = SOCKET_READABLE(conn->sock[sockindex], SSL_SHUTDOWN_TIMEOUT);
-    if(what > 0) {
-      /* Something to read, let's do it and hope that it is the close
-         notify alert from the server.  buf is managed internally by
-         axTLS and will be released upon calling ssl_free via
-         free_ssl_structs. */
-      nread = (ssize_t)ssl_read(BACKEND->ssl, &buf);
-
-      if(nread < SSL_OK) {
-        failf(data, "close notify alert not received during shutdown");
-        retval = -1;
-      }
-    }
-    else if(0 == what) {
-      /* timeout */
-      failf(data, "SSL shutdown timeout");
-    }
-    else {
-      /* anything that gets here is fatally bad */
-      failf(data, "select/poll on SSL socket, errno: %d", SOCKERRNO);
-      retval = -1;
-    }
-
-    free_ssl_structs(connssl);
-  }
-  return retval;
-}
-
-static ssize_t axtls_recv(struct connectdata *conn, /* connection data */
-                          int num,                  /* socketindex */
-                          char *buf,                /* store read data here */
-                          size_t buffersize,        /* max amount to read */
-                          CURLcode *err)
-{
-  struct ssl_connect_data *connssl = &conn->ssl[num];
-  ssize_t ret = 0;
-  uint8_t *read_buf;
-
-  infof(conn->data, "  axtls_recv\n");
-
-  *err = CURLE_OK;
-  if(connssl) {
-    ret = ssl_read(BACKEND->ssl, &read_buf);
-    if(ret > SSL_OK) {
-      /* ssl_read returns SSL_OK if there is more data to read, so if it is
-         larger, then all data has been read already.  */
-      memcpy(buf, read_buf,
-             (size_t)ret > buffersize ? buffersize : (size_t)ret);
-    }
-    else if(ret == SSL_OK) {
-      /* more data to be read, signal caller to call again */
-      *err = CURLE_AGAIN;
-      ret = -1;
-    }
-    else if(ret == -3) {
-      /* With patched axTLS, SSL_CLOSE_NOTIFY=-3.  Hard-coding until axTLS
-         team approves proposed fix. */
-      Curl_axtls_close(conn, num);
-    }
-    else {
-      failf(conn->data, "axTLS recv error (%d)", ret);
-      *err = map_error_to_curl((int) ret);
-      ret = -1;
-    }
-  }
-
-  return ret;
-}
-
-/*
- * Return codes:
- *     1 means the connection is still in place
- *     0 means the connection has been closed
- *    -1 means the connection status is unknown
- */
-static int Curl_axtls_check_cxn(struct connectdata *conn)
-{
-  /* openssl.c line:
-     rc = SSL_peek(conn->ssl[FIRSTSOCKET].backend->ssl, (void*)&buf, 1);
-     axTLS compat layer always returns the last argument, so connection is
-     always alive? */
-
-  infof(conn->data, "  Curl_axtls_check_cxn\n");
-   return 1; /* connection still in place */
-}
-
-static void Curl_axtls_session_free(void *ptr)
-{
-  (void)ptr;
-  /* free the ID */
-  /* both openssl.c and gtls.c do something here, but axTLS's OpenSSL
-     compatibility layer does nothing, so we do nothing too. */
-}
-
-static size_t Curl_axtls_version(char *buffer, size_t size)
-{
-  return snprintf(buffer, size, "axTLS/%s", ssl_version());
-}
-
-static CURLcode Curl_axtls_random(struct Curl_easy *data,
-                                  unsigned char *entropy, size_t length)
-{
-  static bool ssl_seeded = FALSE;
-  (void)data;
-  if(!ssl_seeded) {
-    ssl_seeded = TRUE;
-    /* Initialize the seed if not already done. This call is not exactly thread
-     * safe (and neither is the ssl_seeded check), but the worst effect of a
-     * race condition is that some global resources will leak. */
-    RNG_initialize();
-  }
-  get_random((int)length, entropy);
-  return CURLE_OK;
-}
-
-static void *Curl_axtls_get_internals(struct ssl_connect_data *connssl,
-                                      CURLINFO info UNUSED_PARAM)
-{
-  (void)info;
-  return BACKEND->ssl;
-}
-
-const struct Curl_ssl Curl_ssl_axtls = {
-  { CURLSSLBACKEND_AXTLS, "axtls" }, /* info */
-  0, /* no fancy stuff */
-  sizeof(struct ssl_backend_data),
-
-  /*
-   * axTLS has no global init.  Everything is done through SSL and SSL_CTX
-   * structs stored in connectdata structure.
-   */
-  Curl_none_init,                 /* init */
-  /* axTLS has no global cleanup. */
-  Curl_none_cleanup,              /* cleanup */
-  Curl_axtls_version,             /* version */
-  Curl_axtls_check_cxn,           /* check_cxn */
-  Curl_axtls_shutdown,            /* shutdown */
-  Curl_none_data_pending,         /* data_pending */
-  Curl_axtls_random,              /* random */
-  Curl_none_cert_status_request,  /* cert_status_request */
-  Curl_axtls_connect,             /* connect */
-  Curl_axtls_connect_nonblocking, /* connect_nonblocking */
-  Curl_axtls_get_internals,       /* get_internals */
-  Curl_axtls_close,               /* close_one */
-  Curl_none_close_all,            /* close_all */
-  Curl_axtls_session_free,        /* session_free */
-  Curl_none_set_engine,           /* set_engine */
-  Curl_none_set_engine_default,   /* set_engine_default */
-  Curl_none_engines_list,         /* engines_list */
-  Curl_none_false_start,          /* false_start */
-  Curl_none_md5sum,               /* md5sum */
-  NULL                            /* sha256sum */
-};
-
-#endif /* USE_AXTLS */
diff --git a/lib/vtls/bearssl.c b/lib/vtls/bearssl.c
new file mode 100644 (file)
index 0000000..67f9458
--- /dev/null
@@ -0,0 +1,866 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 2019, Michael Forney, <mforney@mforney.org>
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+#include "curl_setup.h"
+
+#ifdef USE_BEARSSL
+
+#include <bearssl.h>
+
+#include "bearssl.h"
+#include "urldata.h"
+#include "sendf.h"
+#include "inet_pton.h"
+#include "vtls.h"
+#include "connect.h"
+#include "select.h"
+#include "multiif.h"
+#include "curl_printf.h"
+#include "curl_memory.h"
+
+struct x509_context {
+  const br_x509_class *vtable;
+  br_x509_minimal_context minimal;
+  bool verifyhost;
+  bool verifypeer;
+};
+
+struct ssl_backend_data {
+  br_ssl_client_context ctx;
+  struct x509_context x509;
+  unsigned char buf[BR_SSL_BUFSIZE_BIDI];
+  br_x509_trust_anchor *anchors;
+  size_t anchors_len;
+  const char *protocols[2];
+  /* SSL client context is active */
+  bool active;
+  /* size of pending write, yet to be flushed */
+  size_t pending_write;
+};
+
+#define BACKEND connssl->backend
+
+struct cafile_parser {
+  CURLcode err;
+  bool in_cert;
+  br_x509_decoder_context xc;
+  /* array of trust anchors loaded from CAfile */
+  br_x509_trust_anchor *anchors;
+  size_t anchors_len;
+  /* buffer for DN data */
+  unsigned char dn[1024];
+  size_t dn_len;
+};
+
+static void append_dn(void *ctx, const void *buf, size_t len)
+{
+  struct cafile_parser *ca = ctx;
+
+  if(ca->err != CURLE_OK || !ca->in_cert)
+    return;
+  if(sizeof(ca->dn) - ca->dn_len < len) {
+    ca->err = CURLE_FAILED_INIT;
+    return;
+  }
+  memcpy(ca->dn + ca->dn_len, buf, len);
+  ca->dn_len += len;
+}
+
+static void x509_push(void *ctx, const void *buf, size_t len)
+{
+  struct cafile_parser *ca = ctx;
+
+  if(ca->in_cert)
+    br_x509_decoder_push(&ca->xc, buf, len);
+}
+
+static CURLcode load_cafile(const char *path, br_x509_trust_anchor **anchors,
+                            size_t *anchors_len)
+{
+  struct cafile_parser ca;
+  br_pem_decoder_context pc;
+  br_x509_trust_anchor *ta;
+  size_t ta_size;
+  br_x509_trust_anchor *new_anchors;
+  size_t new_anchors_len;
+  br_x509_pkey *pkey;
+  FILE *fp;
+  unsigned char buf[BUFSIZ], *p;
+  const char *name;
+  size_t n, i, pushed;
+
+  fp = fopen(path, "rb");
+  if(!fp)
+    return CURLE_SSL_CACERT_BADFILE;
+
+  ca.err = CURLE_OK;
+  ca.in_cert = FALSE;
+  ca.anchors = NULL;
+  ca.anchors_len = 0;
+  br_pem_decoder_init(&pc);
+  br_pem_decoder_setdest(&pc, x509_push, &ca);
+  for(;;) {
+    n = fread(buf, 1, sizeof(buf), fp);
+    if(n == 0)
+      break;
+    p = buf;
+    while(n) {
+      pushed = br_pem_decoder_push(&pc, p, n);
+      if(ca.err)
+        goto fail;
+      p += pushed;
+      n -= pushed;
+
+      switch(br_pem_decoder_event(&pc)) {
+      case 0:
+        break;
+      case BR_PEM_BEGIN_OBJ:
+        name = br_pem_decoder_name(&pc);
+        if(strcmp(name, "CERTIFICATE") && strcmp(name, "X509 CERTIFICATE"))
+          break;
+        br_x509_decoder_init(&ca.xc, append_dn, &ca);
+        if(ca.anchors_len == SIZE_MAX / sizeof(ca.anchors[0])) {
+          ca.err = CURLE_OUT_OF_MEMORY;
+          goto fail;
+        }
+        new_anchors_len = ca.anchors_len + 1;
+        new_anchors = realloc(ca.anchors,
+                              new_anchors_len * sizeof(ca.anchors[0]));
+        if(!new_anchors) {
+          ca.err = CURLE_OUT_OF_MEMORY;
+          goto fail;
+        }
+        ca.anchors = new_anchors;
+        ca.anchors_len = new_anchors_len;
+        ca.in_cert = TRUE;
+        ca.dn_len = 0;
+        ta = &ca.anchors[ca.anchors_len - 1];
+        ta->dn.data = NULL;
+        break;
+      case BR_PEM_END_OBJ:
+        if(!ca.in_cert)
+          break;
+        ca.in_cert = FALSE;
+        if(br_x509_decoder_last_error(&ca.xc)) {
+          ca.err = CURLE_SSL_CACERT_BADFILE;
+          goto fail;
+        }
+        ta->flags = 0;
+        if(br_x509_decoder_isCA(&ca.xc))
+          ta->flags |= BR_X509_TA_CA;
+        pkey = br_x509_decoder_get_pkey(&ca.xc);
+        if(!pkey) {
+          ca.err = CURLE_SSL_CACERT_BADFILE;
+          goto fail;
+        }
+        ta->pkey = *pkey;
+
+        /* calculate space needed for trust anchor data */
+        ta_size = ca.dn_len;
+        switch(pkey->key_type) {
+        case BR_KEYTYPE_RSA:
+          ta_size += pkey->key.rsa.nlen + pkey->key.rsa.elen;
+          break;
+        case BR_KEYTYPE_EC:
+          ta_size += pkey->key.ec.qlen;
+          break;
+        default:
+          ca.err = CURLE_FAILED_INIT;
+          goto fail;
+        }
+
+        /* fill in trust anchor DN and public key data */
+        ta->dn.data = malloc(ta_size);
+        if(!ta->dn.data) {
+          ca.err = CURLE_OUT_OF_MEMORY;
+          goto fail;
+        }
+        memcpy(ta->dn.data, ca.dn, ca.dn_len);
+        ta->dn.len = ca.dn_len;
+        switch(pkey->key_type) {
+        case BR_KEYTYPE_RSA:
+          ta->pkey.key.rsa.n = ta->dn.data + ta->dn.len;
+          memcpy(ta->pkey.key.rsa.n, pkey->key.rsa.n, pkey->key.rsa.nlen);
+          ta->pkey.key.rsa.e = ta->pkey.key.rsa.n + ta->pkey.key.rsa.nlen;
+          memcpy(ta->pkey.key.rsa.e, pkey->key.rsa.e, pkey->key.rsa.elen);
+          break;
+        case BR_KEYTYPE_EC:
+          ta->pkey.key.ec.q = ta->dn.data + ta->dn.len;
+          memcpy(ta->pkey.key.ec.q, pkey->key.ec.q, pkey->key.ec.qlen);
+          break;
+        }
+        break;
+      default:
+        ca.err = CURLE_SSL_CACERT_BADFILE;
+        goto fail;
+      }
+    }
+  }
+  if(ferror(fp))
+    ca.err = CURLE_READ_ERROR;
+
+fail:
+  fclose(fp);
+  if(ca.err == CURLE_OK) {
+    *anchors = ca.anchors;
+    *anchors_len = ca.anchors_len;
+  }
+  else {
+    for(i = 0; i < ca.anchors_len; ++i)
+      free(ca.anchors[i].dn.data);
+    free(ca.anchors);
+  }
+
+  return ca.err;
+}
+
+static void x509_start_chain(const br_x509_class **ctx,
+                             const char *server_name)
+{
+  struct x509_context *x509 = (struct x509_context *)ctx;
+
+  if(!x509->verifyhost)
+    server_name = NULL;
+  x509->minimal.vtable->start_chain(&x509->minimal.vtable, server_name);
+}
+
+static void x509_start_cert(const br_x509_class **ctx, uint32_t length)
+{
+  struct x509_context *x509 = (struct x509_context *)ctx;
+
+  x509->minimal.vtable->start_cert(&x509->minimal.vtable, length);
+}
+
+static void x509_append(const br_x509_class **ctx, const unsigned char *buf,
+                        size_t len)
+{
+  struct x509_context *x509 = (struct x509_context *)ctx;
+
+  x509->minimal.vtable->append(&x509->minimal.vtable, buf, len);
+}
+
+static void x509_end_cert(const br_x509_class **ctx)
+{
+  struct x509_context *x509 = (struct x509_context *)ctx;
+
+  x509->minimal.vtable->end_cert(&x509->minimal.vtable);
+}
+
+static unsigned x509_end_chain(const br_x509_class **ctx)
+{
+  struct x509_context *x509 = (struct x509_context *)ctx;
+  unsigned err;
+
+  err = x509->minimal.vtable->end_chain(&x509->minimal.vtable);
+  if(err && !x509->verifypeer) {
+    /* ignore any X.509 errors */
+    err = BR_ERR_OK;
+  }
+
+  return err;
+}
+
+static const br_x509_pkey *x509_get_pkey(const br_x509_class *const *ctx,
+                                         unsigned *usages)
+{
+  struct x509_context *x509 = (struct x509_context *)ctx;
+
+  return x509->minimal.vtable->get_pkey(&x509->minimal.vtable, usages);
+}
+
+static const br_x509_class x509_vtable = {
+  sizeof(struct x509_context),
+  x509_start_chain,
+  x509_start_cert,
+  x509_append,
+  x509_end_cert,
+  x509_end_chain,
+  x509_get_pkey
+};
+
+static CURLcode bearssl_connect_step1(struct connectdata *conn, int sockindex)
+{
+  struct Curl_easy *data = conn->data;
+  struct ssl_connect_data *connssl = &conn->ssl[sockindex];
+  const char * const ssl_cafile = SSL_CONN_CONFIG(CAfile);
+  const char *hostname = SSL_IS_PROXY() ? conn->http_proxy.host.name :
+    conn->host.name;
+  const bool verifypeer = SSL_CONN_CONFIG(verifypeer);
+  const bool verifyhost = SSL_CONN_CONFIG(verifyhost);
+  CURLcode ret;
+  unsigned version_min, version_max;
+#ifdef ENABLE_IPV6
+  struct in6_addr addr;
+#else
+  struct in_addr addr;
+#endif
+
+  switch(SSL_CONN_CONFIG(version)) {
+  case CURL_SSLVERSION_SSLv2:
+    failf(data, "BearSSL does not support SSLv2");
+    return CURLE_SSL_CONNECT_ERROR;
+  case CURL_SSLVERSION_SSLv3:
+    failf(data, "BearSSL does not support SSLv3");
+    return CURLE_SSL_CONNECT_ERROR;
+  case CURL_SSLVERSION_TLSv1_0:
+    version_min = BR_TLS10;
+    version_max = BR_TLS10;
+    break;
+  case CURL_SSLVERSION_TLSv1_1:
+    version_min = BR_TLS11;
+    version_max = BR_TLS11;
+    break;
+  case CURL_SSLVERSION_TLSv1_2:
+    version_min = BR_TLS12;
+    version_max = BR_TLS12;
+    break;
+  case CURL_SSLVERSION_DEFAULT:
+  case CURL_SSLVERSION_TLSv1:
+    version_min = BR_TLS10;
+    version_max = BR_TLS12;
+    break;
+  default:
+    failf(data, "BearSSL: unknown CURLOPT_SSLVERSION");
+    return CURLE_SSL_CONNECT_ERROR;
+  }
+
+  if(ssl_cafile) {
+    ret = load_cafile(ssl_cafile, &BACKEND->anchors, &BACKEND->anchors_len);
+    if(ret != CURLE_OK) {
+      if(verifypeer) {
+        failf(data, "error setting certificate verify locations:\n"
+              "  CAfile: %s\n", ssl_cafile);
+        return ret;
+      }
+      infof(data, "error setting certificate verify locations,"
+            " continuing anyway:\n");
+    }
+  }
+
+  /* initialize SSL context */
+  br_ssl_client_init_full(&BACKEND->ctx, &BACKEND->x509.minimal,
+                          BACKEND->anchors, BACKEND->anchors_len);
+  br_ssl_engine_set_versions(&BACKEND->ctx.eng, version_min, version_max);
+  br_ssl_engine_set_buffer(&BACKEND->ctx.eng, BACKEND->buf,
+                           sizeof(BACKEND->buf), 1);
+
+  /* initialize X.509 context */
+  BACKEND->x509.vtable = &x509_vtable;
+  BACKEND->x509.verifypeer = verifypeer;
+  BACKEND->x509.verifyhost = verifyhost;
+  br_ssl_engine_set_x509(&BACKEND->ctx.eng, &BACKEND->x509.vtable);
+
+  if(SSL_SET_OPTION(primary.sessionid)) {
+    void *session;
+
+    Curl_ssl_sessionid_lock(conn);
+    if(!Curl_ssl_getsessionid(conn, &session, NULL, sockindex)) {
+      br_ssl_engine_set_session_parameters(&BACKEND->ctx.eng, session);
+      infof(data, "BearSSL: re-using session ID\n");
+    }
+    Curl_ssl_sessionid_unlock(conn);
+  }
+
+  if(conn->bits.tls_enable_alpn) {
+    int cur = 0;
+
+    /* NOTE: when adding more protocols here, increase the size of the
+     * protocols array in `struct ssl_backend_data`.
+     */
+
+#ifdef USE_NGHTTP2
+    if(data->set.httpversion >= CURL_HTTP_VERSION_2 &&
+       (!SSL_IS_PROXY() || !conn->bits.tunnel_proxy)) {
+      BACKEND->protocols[cur++] = NGHTTP2_PROTO_VERSION_ID;
+      infof(data, "ALPN, offering %s\n", NGHTTP2_PROTO_VERSION_ID);
+    }
+#endif
+
+    BACKEND->protocols[cur++] = ALPN_HTTP_1_1;
+    infof(data, "ALPN, offering %s\n", ALPN_HTTP_1_1);
+
+    br_ssl_engine_set_protocol_names(&BACKEND->ctx.eng,
+                                     BACKEND->protocols, cur);
+  }
+
+  if((1 == Curl_inet_pton(AF_INET, hostname, &addr))
+#ifdef ENABLE_IPV6
+      || (1 == Curl_inet_pton(AF_INET6, hostname, &addr))
+#endif
+     ) {
+    if(verifyhost) {
+      failf(data, "BearSSL: "
+            "host verification of IP address is not supported");
+      return CURLE_PEER_FAILED_VERIFICATION;
+    }
+    hostname = NULL;
+  }
+
+  if(!br_ssl_client_reset(&BACKEND->ctx, hostname, 0))
+    return CURLE_FAILED_INIT;
+  BACKEND->active = TRUE;
+
+  connssl->connecting_state = ssl_connect_2;
+
+  return CURLE_OK;
+}
+
+static CURLcode bearssl_run_until(struct connectdata *conn, int sockindex,
+                                  unsigned target)
+{
+  struct Curl_easy *data = conn->data;
+  struct ssl_connect_data *connssl = &conn->ssl[sockindex];
+  curl_socket_t sockfd = conn->sock[sockindex];
+  unsigned state;
+  unsigned char *buf;
+  size_t len;
+  ssize_t ret;
+  int err;
+
+  for(;;) {
+    state = br_ssl_engine_current_state(&BACKEND->ctx.eng);
+    if(state & BR_SSL_CLOSED) {
+      err = br_ssl_engine_last_error(&BACKEND->ctx.eng);
+      switch(err) {
+      case BR_ERR_OK:
+        /* TLS close notify */
+        if(connssl->state != ssl_connection_complete) {
+          failf(data, "SSL: connection closed during handshake");
+          return CURLE_SSL_CONNECT_ERROR;
+        }
+        return CURLE_OK;
+      case BR_ERR_X509_EXPIRED:
+        failf(data, "SSL: X.509 verification: "
+              "certificate is expired or not yet valid");
+        return CURLE_PEER_FAILED_VERIFICATION;
+      case BR_ERR_X509_BAD_SERVER_NAME:
+        failf(data, "SSL: X.509 verification: "
+              "expected server name was not found in the chain");
+        return CURLE_PEER_FAILED_VERIFICATION;
+      case BR_ERR_X509_NOT_TRUSTED:
+        failf(data, "SSL: X.509 verification: "
+              "chain could not be linked to a trust anchor");
+        return CURLE_PEER_FAILED_VERIFICATION;
+      }
+      /* X.509 errors are documented to have the range 32..63 */
+      if(err >= 32 && err < 64)
+        return CURLE_PEER_FAILED_VERIFICATION;
+      return CURLE_SSL_CONNECT_ERROR;
+    }
+    if(state & target)
+      return CURLE_OK;
+    if(state & BR_SSL_SENDREC) {
+      buf = br_ssl_engine_sendrec_buf(&BACKEND->ctx.eng, &len);
+      ret = swrite(sockfd, buf, len);
+      if(ret == -1) {
+        if(SOCKERRNO == EAGAIN || SOCKERRNO == EWOULDBLOCK) {
+          if(connssl->state != ssl_connection_complete)
+            connssl->connecting_state = ssl_connect_2_writing;
+          return CURLE_AGAIN;
+        }
+        return CURLE_WRITE_ERROR;
+      }
+      br_ssl_engine_sendrec_ack(&BACKEND->ctx.eng, ret);
+    }
+    else if(state & BR_SSL_RECVREC) {
+      buf = br_ssl_engine_recvrec_buf(&BACKEND->ctx.eng, &len);
+      ret = sread(sockfd, buf, len);
+      if(ret == 0) {
+        failf(data, "SSL: EOF without close notify");
+        return CURLE_READ_ERROR;
+      }
+      if(ret == -1) {
+        if(SOCKERRNO == EAGAIN || SOCKERRNO == EWOULDBLOCK) {
+          if(connssl->state != ssl_connection_complete)
+            connssl->connecting_state = ssl_connect_2_reading;
+          return CURLE_AGAIN;
+        }
+        return CURLE_READ_ERROR;
+      }
+      br_ssl_engine_recvrec_ack(&BACKEND->ctx.eng, ret);
+    }
+  }
+}
+
+static CURLcode bearssl_connect_step2(struct connectdata *conn, int sockindex)
+{
+  struct Curl_easy *data = conn->data;
+  struct ssl_connect_data *connssl = &conn->ssl[sockindex];
+  CURLcode ret;
+
+  ret = bearssl_run_until(conn, sockindex, BR_SSL_SENDAPP | BR_SSL_RECVAPP);
+  if(ret == CURLE_AGAIN)
+    return CURLE_OK;
+  if(ret == CURLE_OK) {
+    if(br_ssl_engine_current_state(&BACKEND->ctx.eng) == BR_SSL_CLOSED) {
+      failf(data, "SSL: connection closed during handshake");
+      return CURLE_SSL_CONNECT_ERROR;
+    }
+    connssl->connecting_state = ssl_connect_3;
+  }
+  return ret;
+}
+
+static CURLcode bearssl_connect_step3(struct connectdata *conn, int sockindex)
+{
+  struct Curl_easy *data = conn->data;
+  struct ssl_connect_data *connssl = &conn->ssl[sockindex];
+  CURLcode ret;
+
+  DEBUGASSERT(ssl_connect_3 == connssl->connecting_state);
+
+  if(conn->bits.tls_enable_alpn) {
+    const char *protocol;
+
+    protocol = br_ssl_engine_get_selected_protocol(&BACKEND->ctx.eng);
+    if(protocol) {
+      infof(data, "ALPN, server accepted to use %s\n", protocol);
+
+#ifdef USE_NGHTTP2
+      if(!strcmp(protocol, NGHTTP2_PROTO_VERSION_ID))
+        conn->negnpn = CURL_HTTP_VERSION_2;
+      else
+#endif
+      if(!strcmp(protocol, ALPN_HTTP_1_1))
+        conn->negnpn = CURL_HTTP_VERSION_1_1;
+      else
+        infof(data, "ALPN, unrecognized protocol %s\n", protocol);
+      Curl_multiuse_state(conn, conn->negnpn == CURL_HTTP_VERSION_2 ?
+                          BUNDLE_MULTIPLEX : BUNDLE_NO_MULTIUSE);
+    }
+    else
+      infof(data, "ALPN, server did not agree to a protocol\n");
+  }
+
+  if(SSL_SET_OPTION(primary.sessionid)) {
+    bool incache;
+    void *oldsession;
+    br_ssl_session_parameters *session;
+
+    session = malloc(sizeof(*session));
+    if(!session)
+      return CURLE_OUT_OF_MEMORY;
+    br_ssl_engine_get_session_parameters(&BACKEND->ctx.eng, session);
+    Curl_ssl_sessionid_lock(conn);
+    incache = !(Curl_ssl_getsessionid(conn, &oldsession, NULL, sockindex));
+    if(incache)
+      Curl_ssl_delsessionid(conn, oldsession);
+    ret = Curl_ssl_addsessionid(conn, session, 0, sockindex);
+    Curl_ssl_sessionid_unlock(conn);
+    if(ret) {
+      free(session);
+      return CURLE_OUT_OF_MEMORY;
+    }
+  }
+
+  connssl->connecting_state = ssl_connect_done;
+
+  return CURLE_OK;
+}
+
+static ssize_t bearssl_send(struct connectdata *conn, int sockindex,
+                            const void *buf, size_t len, CURLcode *err)
+{
+  struct Curl_easy *data = conn->data;
+  struct ssl_connect_data *connssl = &conn->ssl[sockindex];
+  unsigned char *app;
+  size_t applen;
+
+  for(;;) {
+    *err = bearssl_run_until(conn, sockindex, BR_SSL_SENDAPP);
+    if (*err != CURLE_OK)
+      return -1;
+    app = br_ssl_engine_sendapp_buf(&BACKEND->ctx.eng, &applen);
+    if(!app) {
+      failf(data, "SSL: connection closed during write");
+      *err = CURLE_SEND_ERROR;
+      return -1;
+    }
+    if(BACKEND->pending_write) {
+      applen = BACKEND->pending_write;
+      BACKEND->pending_write = 0;
+      return applen;
+    }
+    if(applen > len)
+      applen = len;
+    memcpy(app, buf, applen);
+    br_ssl_engine_sendapp_ack(&BACKEND->ctx.eng, applen);
+    br_ssl_engine_flush(&BACKEND->ctx.eng, 0);
+    BACKEND->pending_write = applen;
+  }
+}
+
+static ssize_t bearssl_recv(struct connectdata *conn, int sockindex,
+                            char *buf, size_t len, CURLcode *err)
+{
+  struct ssl_connect_data *connssl = &conn->ssl[sockindex];
+  unsigned char *app;
+  size_t applen;
+
+  *err = bearssl_run_until(conn, sockindex, BR_SSL_RECVAPP);
+  if(*err != CURLE_OK)
+    return -1;
+  app = br_ssl_engine_recvapp_buf(&BACKEND->ctx.eng, &applen);
+  if(!app)
+    return 0;
+  if(applen > len)
+    applen = len;
+  memcpy(buf, app, applen);
+  br_ssl_engine_recvapp_ack(&BACKEND->ctx.eng, applen);
+
+  return applen;
+}
+
+static CURLcode bearssl_connect_common(struct connectdata *conn,
+                                       int sockindex,
+                                       bool nonblocking,
+                                       bool *done)
+{
+  CURLcode ret;
+  struct Curl_easy *data = conn->data;
+  struct ssl_connect_data *connssl = &conn->ssl[sockindex];
+  curl_socket_t sockfd = conn->sock[sockindex];
+  time_t timeout_ms;
+  int what;
+
+  /* check if the connection has already been established */
+  if(ssl_connection_complete == connssl->state) {
+    *done = TRUE;
+    return CURLE_OK;
+  }
+
+  if(ssl_connect_1 == connssl->connecting_state) {
+    ret = bearssl_connect_step1(conn, sockindex);
+    if(ret)
+      return ret;
+  }
+
+  while(ssl_connect_2 == connssl->connecting_state ||
+        ssl_connect_2_reading == connssl->connecting_state ||
+        ssl_connect_2_writing == connssl->connecting_state) {
+    /* check allowed time left */
+    timeout_ms = Curl_timeleft(data, NULL, TRUE);
+
+    if(timeout_ms < 0) {
+      /* no need to continue if time already is up */
+      failf(data, "SSL connection timeout");
+      return CURLE_OPERATION_TIMEDOUT;
+    }
+
+    /* if ssl is expecting something, check if it's available. */
+    if(ssl_connect_2_reading == connssl->connecting_state ||
+       ssl_connect_2_writing == connssl->connecting_state) {
+
+      curl_socket_t writefd = ssl_connect_2_writing ==
+        connssl->connecting_state?sockfd:CURL_SOCKET_BAD;
+      curl_socket_t readfd = ssl_connect_2_reading ==
+        connssl->connecting_state?sockfd:CURL_SOCKET_BAD;
+
+      what = Curl_socket_check(readfd, CURL_SOCKET_BAD, writefd,
+                               nonblocking?0:timeout_ms);
+      if(what < 0) {
+        /* fatal error */
+        failf(data, "select/poll on SSL socket, errno: %d", SOCKERRNO);
+        return CURLE_SSL_CONNECT_ERROR;
+      }
+      else if(0 == what) {
+        if(nonblocking) {
+          *done = FALSE;
+          return CURLE_OK;
+        }
+        else {
+          /* timeout */
+          failf(data, "SSL connection timeout");
+          return CURLE_OPERATION_TIMEDOUT;
+        }
+      }
+      /* socket is readable or writable */
+    }
+
+    /* Run transaction, and return to the caller if it failed or if this
+     * connection is done nonblocking and this loop would execute again. This
+     * permits the owner of a multi handle to abort a connection attempt
+     * before step2 has completed while ensuring that a client using select()
+     * or epoll() will always have a valid fdset to wait on.
+     */
+    ret = bearssl_connect_step2(conn, sockindex);
+    if(ret || (nonblocking &&
+               (ssl_connect_2 == connssl->connecting_state ||
+                ssl_connect_2_reading == connssl->connecting_state ||
+                ssl_connect_2_writing == connssl->connecting_state)))
+      return ret;
+  }
+
+  if(ssl_connect_3 == connssl->connecting_state) {
+    ret = bearssl_connect_step3(conn, sockindex);
+    if(ret)
+      return ret;
+  }
+
+  if(ssl_connect_done == connssl->connecting_state) {
+    connssl->state = ssl_connection_complete;
+    conn->recv[sockindex] = bearssl_recv;
+    conn->send[sockindex] = bearssl_send;
+    *done = TRUE;
+  }
+  else
+    *done = FALSE;
+
+  /* Reset our connect state machine */
+  connssl->connecting_state = ssl_connect_1;
+
+  return CURLE_OK;
+}
+
+static size_t Curl_bearssl_version(char *buffer, size_t size)
+{
+  return msnprintf(buffer, size, "BearSSL");
+}
+
+static bool Curl_bearssl_data_pending(const struct connectdata *conn,
+                                      int connindex)
+{
+  const struct ssl_connect_data *connssl = &conn->ssl[connindex];
+
+  return br_ssl_engine_current_state(&BACKEND->ctx.eng) & BR_SSL_RECVAPP;
+}
+
+static CURLcode Curl_bearssl_random(struct Curl_easy *data UNUSED_PARAM,
+                                    unsigned char *entropy, size_t length)
+{
+  static br_hmac_drbg_context ctx;
+  static bool seeded = FALSE;
+
+  if(!seeded) {
+    br_prng_seeder seeder;
+
+    br_hmac_drbg_init(&ctx, &br_sha256_vtable, NULL, 0);
+    seeder = br_prng_seeder_system(NULL);
+    if(!seeder || !seeder(&ctx.vtable))
+      return CURLE_FAILED_INIT;
+    seeded = TRUE;
+  }
+  br_hmac_drbg_generate(&ctx, entropy, length);
+
+  return CURLE_OK;
+}
+
+static CURLcode Curl_bearssl_connect(struct connectdata *conn, int sockindex)
+{
+  CURLcode ret;
+  bool done = FALSE;
+
+  ret = bearssl_connect_common(conn, sockindex, FALSE, &done);
+  if(ret)
+    return ret;
+
+  DEBUGASSERT(done);
+
+  return CURLE_OK;
+}
+
+static CURLcode Curl_bearssl_connect_nonblocking(struct connectdata *conn,
+                                                 int sockindex, bool *done)
+{
+  return bearssl_connect_common(conn, sockindex, TRUE, done);
+}
+
+static void *Curl_bearssl_get_internals(struct ssl_connect_data *connssl,
+                                        CURLINFO info UNUSED_PARAM)
+{
+  return &BACKEND->ctx;
+}
+
+static void Curl_bearssl_close(struct connectdata *conn, int sockindex)
+{
+  struct ssl_connect_data *connssl = &conn->ssl[sockindex];
+  size_t i;
+
+  if(BACKEND->active) {
+    br_ssl_engine_close(&BACKEND->ctx.eng);
+    (void)bearssl_run_until(conn, sockindex, BR_SSL_CLOSED);
+  }
+  for(i = 0; i < BACKEND->anchors_len; ++i)
+    free(BACKEND->anchors[i].dn.data);
+  free(BACKEND->anchors);
+}
+
+static void Curl_bearssl_session_free(void *ptr)
+{
+  free(ptr);
+}
+
+static CURLcode Curl_bearssl_md5sum(unsigned char *input,
+                                    size_t inputlen,
+                                    unsigned char *md5sum,
+                                    size_t md5len UNUSED_PARAM)
+{
+  br_md5_context ctx;
+
+  br_md5_init(&ctx);
+  br_md5_update(&ctx, input, inputlen);
+  br_md5_out(&ctx, md5sum);
+  return CURLE_OK;
+}
+
+static CURLcode Curl_bearssl_sha256sum(const unsigned char *input,
+                                       size_t inputlen,
+                                       unsigned char *sha256sum,
+                                       size_t sha256len UNUSED_PARAM)
+{
+  br_sha256_context ctx;
+
+  br_sha256_init(&ctx);
+  br_sha256_update(&ctx, input, inputlen);
+  br_sha256_out(&ctx, sha256sum);
+  return CURLE_OK;
+}
+
+const struct Curl_ssl Curl_ssl_bearssl = {
+  { CURLSSLBACKEND_BEARSSL, "bearssl" },
+
+  0,
+
+  sizeof(struct ssl_backend_data),
+
+  Curl_none_init,
+  Curl_none_cleanup,
+  Curl_bearssl_version,
+  Curl_none_check_cxn,
+  Curl_none_shutdown,
+  Curl_bearssl_data_pending,
+  Curl_bearssl_random,
+  Curl_none_cert_status_request,
+  Curl_bearssl_connect,
+  Curl_bearssl_connect_nonblocking,
+  Curl_bearssl_get_internals,
+  Curl_bearssl_close,
+  Curl_none_close_all,
+  Curl_bearssl_session_free,
+  Curl_none_set_engine,
+  Curl_none_set_engine_default,
+  Curl_none_engines_list,
+  Curl_none_false_start,
+  Curl_bearssl_md5sum,
+  Curl_bearssl_sha256sum
+};
+
+#endif /* USE_BEARSSL */
diff --git a/lib/vtls/bearssl.h b/lib/vtls/bearssl.h
new file mode 100644 (file)
index 0000000..5f94922
--- /dev/null
@@ -0,0 +1,32 @@
+#ifndef HEADER_CURL_BEARSSL_H
+#define HEADER_CURL_BEARSSL_H
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 2019, Michael Forney, <mforney@mforney.org>
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+
+#include "curl_setup.h"
+
+#ifdef USE_BEARSSL
+
+extern const struct Curl_ssl Curl_ssl_bearssl;
+
+#endif /* USE_BEARSSL */
+#endif /* HEADER_CURL_BEARSSL_H */
index 8d1b3d6..32153dd 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -26,6 +26,8 @@
 
 #include <gskssl.h>
 #include <qsoasync.h>
+#undef HAVE_SOCKETPAIR /* because the native one isn't good enough */
+#include "socketpair.h"
 
 /* Some symbols are undefined/unsupported on OS400 versions < V7R1. */
 #ifndef GSK_SSL_EXTN_SERVERNAME_REQUEST
@@ -511,100 +513,6 @@ static void close_async_handshake(struct ssl_connect_data *connssl)
   BACKEND->iocport = -1;
 }
 
-/* SSL over SSL
- * Problems:
- * 1) GSKit can only perform SSL on an AF_INET or AF_INET6 stream socket. To
- *    pipe an SSL stream into another, it is therefore needed to have a pair
- *    of such communicating sockets and handle the pipelining explicitly.
- * 2) OS/400 socketpair() is only implemented for domain AF_UNIX, thus cannot
- *    be used to produce the pipeline.
- * The solution is to simulate socketpair() for AF_INET with low-level API
- *    listen(), bind() and connect().
- */
-
-static int
-inetsocketpair(int sv[2])
-{
-  int lfd;      /* Listening socket. */
-  int sfd;      /* Server socket. */
-  int cfd;      /* Client socket. */
-  int len;
-  struct sockaddr_in addr1;
-  struct sockaddr_in addr2;
-
-  /* Create listening socket on a local dynamic port. */
-  lfd = socket(AF_INET, SOCK_STREAM, 0);
-  if(lfd < 0)
-    return -1;
-  memset((char *) &addr1, 0, sizeof(addr1));
-  addr1.sin_family = AF_INET;
-  addr1.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
-  addr1.sin_port = 0;
-  if(bind(lfd, (struct sockaddr *) &addr1, sizeof(addr1)) ||
-     listen(lfd, 2) < 0) {
-    close(lfd);
-    return -1;
-  }
-
-  /* Get the allocated port. */
-  len = sizeof(addr1);
-  if(getsockname(lfd, (struct sockaddr *) &addr1, &len) < 0) {
-    close(lfd);
-    return -1;
-  }
-
-  /* Create the client socket. */
-  cfd = socket(AF_INET, SOCK_STREAM, 0);
-  if(cfd < 0) {
-    close(lfd);
-    return -1;
-  }
-
-  /* Request unblocking connection to the listening socket. */
-  curlx_nonblock(cfd, TRUE);
-  if(connect(cfd, (struct sockaddr *) &addr1, sizeof(addr1)) < 0 &&
-     errno != EINPROGRESS) {
-    close(lfd);
-    close(cfd);
-    return -1;
-  }
-
-  /* Get the client dynamic port for intrusion check below. */
-  len = sizeof(addr2);
-  if(getsockname(cfd, (struct sockaddr *) &addr2, &len) < 0) {
-    close(lfd);
-    close(cfd);
-    return -1;
-  }
-
-  /* Accept the incoming connection and get the server socket. */
-  curlx_nonblock(lfd, TRUE);
-  for(;;) {
-    len = sizeof(addr1);
-    sfd = accept(lfd, (struct sockaddr *) &addr1, &len);
-    if(sfd < 0) {
-      close(lfd);
-      close(cfd);
-      return -1;
-    }
-
-    /* Check for possible intrusion from an external process. */
-    if(addr1.sin_addr.s_addr == addr2.sin_addr.s_addr &&
-       addr1.sin_port == addr2.sin_port)
-      break;
-
-    /* Intrusion: reject incoming connection. */
-    close(sfd);
-  }
-
-  /* Done, return sockets and succeed. */
-  close(lfd);
-  curlx_nonblock(cfd, FALSE);
-  sv[0] = cfd;
-  sv[1] = sfd;
-  return 0;
-}
-
 static int pipe_ssloverssl(struct connectdata *conn, int sockindex,
                            int directions)
 {
@@ -734,12 +642,11 @@ static ssize_t gskit_recv(struct connectdata *conn, int num, char *buf,
 {
   struct ssl_connect_data *connssl = &conn->ssl[num];
   struct Curl_easy *data = conn->data;
-  int buffsize;
   int nread;
   CURLcode cc = CURLE_RECV_ERROR;
 
   if(pipe_ssloverssl(conn, num, SOS_READ) >= 0) {
-    buffsize = buffersize > (size_t) INT_MAX? INT_MAX: (int) buffersize;
+    int buffsize = buffersize > (size_t) INT_MAX? INT_MAX: (int) buffersize;
     cc = gskit_status(data, gsk_secure_soc_read(BACKEND->handle,
                                                 buf, buffsize, &nread),
                       "gsk_secure_soc_read()", CURLE_RECV_ERROR);
@@ -806,7 +713,6 @@ static CURLcode gskit_connect_step1(struct connectdata *conn, int sockindex)
     conn->host.name;
   const char *sni;
   unsigned int protoflags = 0;
-  long timeout;
   Qso_OverlappedIO_t commarea;
   int sockpair[2];
   static const int sobufsize = CURL_MAX_WRITE_SIZE;
@@ -857,7 +763,7 @@ static CURLcode gskit_connect_step1(struct connectdata *conn, int sockindex)
 
   /* Establish a pipelining socket pair for SSL over SSL. */
   if(conn->proxy_ssl[sockindex].use) {
-    if(inetsocketpair(sockpair))
+    if(Curl_socketpair(0, 0, 0, sockpair))
       return CURLE_SSL_CONNECT_ERROR;
     BACKEND->localfd = sockpair[0];
     BACKEND->remotefd = sockpair[1];
@@ -914,7 +820,7 @@ static CURLcode gskit_connect_step1(struct connectdata *conn, int sockindex)
   if(!result) {
     /* Compute the handshake timeout. Since GSKit granularity is 1 second,
        we round up the required value. */
-    timeout = Curl_timeleft(data, NULL, TRUE);
+    long timeout = Curl_timeleft(data, NULL, TRUE);
     if(timeout < 0)
       result = CURLE_OPERATION_TIMEDOUT;
     else
@@ -1021,14 +927,13 @@ static CURLcode gskit_connect_step2(struct connectdata *conn, int sockindex,
   struct Curl_easy *data = conn->data;
   struct ssl_connect_data *connssl = &conn->ssl[sockindex];
   Qso_OverlappedIO_t cstat;
-  long timeout_ms;
   struct timeval stmv;
   CURLcode result;
 
   /* Poll or wait for end of SSL asynchronous handshake. */
 
   for(;;) {
-    timeout_ms = nonblocking? 0: Curl_timeleft(data, NULL, TRUE);
+    long timeout_ms = nonblocking? 0: Curl_timeleft(data, NULL, TRUE);
     if(timeout_ms < 0)
       timeout_ms = 0;
     stmv.tv_sec = timeout_ms / 1000;
@@ -1077,7 +982,6 @@ static CURLcode gskit_connect_step3(struct connectdata *conn, int sockindex)
   const char *cert = (const char *) NULL;
   const char *certend;
   const char *ptr;
-  int i;
   CURLcode result;
 
   /* SSL handshake done: gather certificate info and verify host. */
@@ -1087,6 +991,8 @@ static CURLcode gskit_connect_step3(struct connectdata *conn, int sockindex)
                                                     &cdev, &cdec),
                   "gsk_attribute_get_cert_info()", CURLE_SSL_CONNECT_ERROR) ==
      CURLE_OK) {
+    int i;
+
     infof(data, "Server certificate:\n");
     p = cdev;
     for(i = 0; i++ < cdec; p++)
@@ -1159,8 +1065,7 @@ static CURLcode gskit_connect_common(struct connectdata *conn, int sockindex,
 {
   struct Curl_easy *data = conn->data;
   struct ssl_connect_data *connssl = &conn->ssl[sockindex];
-  long timeout_ms;
-  Qso_OverlappedIO_t cstat;
+  timediff_t timeout_ms;
   CURLcode result = CURLE_OK;
 
   *done = connssl->state == ssl_connection_complete;
@@ -1262,7 +1167,6 @@ static int Curl_gskit_shutdown(struct connectdata *conn, int sockindex)
 {
   struct ssl_connect_data *connssl = &conn->ssl[sockindex];
   struct Curl_easy *data = conn->data;
-  ssize_t nread;
   int what;
   int rc;
   char buf[120];
@@ -1270,8 +1174,10 @@ static int Curl_gskit_shutdown(struct connectdata *conn, int sockindex)
   if(!BACKEND->handle)
     return 0;
 
+#ifndef CURL_DISABLE_FTP
   if(data->set.ftp_ccc != CURLFTPSSL_CCC_ACTIVE)
     return 0;
+#endif
 
   close_one(connssl, conn, sockindex);
   rc = 0;
@@ -1279,6 +1185,8 @@ static int Curl_gskit_shutdown(struct connectdata *conn, int sockindex)
                          SSL_SHUTDOWN_TIMEOUT);
 
   for(;;) {
+    ssize_t nread;
+
     if(what < 0) {
       /* anything that gets here is fatally bad */
       failf(data, "select/poll on SSL socket, errno: %d", SOCKERRNO);
@@ -1314,7 +1222,7 @@ static int Curl_gskit_shutdown(struct connectdata *conn, int sockindex)
 
 static size_t Curl_gskit_version(char *buffer, size_t size)
 {
-  return snprintf(buffer, size, "GSKit");
+  return msnprintf(buffer, size, "GSKit");
 }
 
 
index 466ee4d..b06b5e1 100644 (file)
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
index 37662a7..3737d7c 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -55,6 +55,7 @@
 #include "strcase.h"
 #include "warnless.h"
 #include "x509asn1.h"
+#include "multiif.h"
 #include "curl_printf.h"
 #include "curl_memory.h"
 /* The last #include file should be: */
@@ -227,17 +228,17 @@ static void showtime(struct Curl_easy *data,
   if(result)
     return;
 
-  snprintf(str,
-           sizeof(str),
-           "\t %s: %s, %02d %s %4d %02d:%02d:%02d GMT",
-           text,
-           Curl_wkday[tm->tm_wday?tm->tm_wday-1:6],
-           tm->tm_mday,
-           Curl_month[tm->tm_mon],
-           tm->tm_year + 1900,
-           tm->tm_hour,
-           tm->tm_min,
-           tm->tm_sec);
+  msnprintf(str,
+            sizeof(str),
+            "\t %s: %s, %02d %s %4d %02d:%02d:%02d GMT",
+            text,
+            Curl_wkday[tm->tm_wday?tm->tm_wday-1:6],
+            tm->tm_mday,
+            Curl_month[tm->tm_mon],
+            tm->tm_year + 1900,
+            tm->tm_hour,
+            tm->tm_min,
+            tm->tm_sec);
   infof(data, "%s\n", str);
 }
 #endif
@@ -285,11 +286,11 @@ static CURLcode handshake(struct connectdata *conn,
   struct ssl_connect_data *connssl = &conn->ssl[sockindex];
   gnutls_session_t session = BACKEND->session;
   curl_socket_t sockfd = conn->sock[sockindex];
-  time_t timeout_ms;
-  int rc;
-  int what;
 
   for(;;) {
+    timediff_t timeout_ms;
+    int rc;
+
     /* check allowed time left */
     timeout_ms = Curl_timeleft(data, NULL, duringconnect);
 
@@ -302,7 +303,7 @@ static CURLcode handshake(struct connectdata *conn,
     /* if ssl is expecting something, check if it's available. */
     if(connssl->connecting_state == ssl_connect_2_reading
        || connssl->connecting_state == ssl_connect_2_writing) {
-
+      int what;
       curl_socket_t writefd = ssl_connect_2_writing ==
         connssl->connecting_state?sockfd:CURL_SOCKET_BAD;
       curl_socket_t readfd = ssl_connect_2_reading ==
@@ -310,7 +311,7 @@ static CURLcode handshake(struct connectdata *conn,
 
       what = Curl_socket_check(readfd, CURL_SOCKET_BAD, writefd,
                                nonblocking?0:
-                               timeout_ms?timeout_ms:1000);
+                               timeout_ms?(time_t)timeout_ms:1000);
       if(what < 0) {
         /* fatal error */
         failf(data, "select/poll on SSL socket, errno: %d", SOCKERRNO);
@@ -956,7 +957,6 @@ static CURLcode pkp_pin_peer_pubkey(struct Curl_easy *data,
   gnutls_pubkey_t key = NULL;
 
   /* Result is returned to caller */
-  int ret = 0;
   CURLcode result = CURLE_SSL_PINNEDPUBKEYNOTMATCH;
 
   /* if a path wasn't specified, don't pin */
@@ -967,6 +967,8 @@ static CURLcode pkp_pin_peer_pubkey(struct Curl_easy *data,
     return result;
 
   do {
+    int ret;
+
     /* Begin Gyrations to get the public key     */
     gnutls_pubkey_init(&key);
 
@@ -1110,7 +1112,7 @@ gtls_connect_step3(struct connectdata *conn,
               "CRLfile: %s", SSL_CONN_CONFIG(CAfile) ? SSL_CONN_CONFIG(CAfile):
               "none",
               SSL_SET_OPTION(CRLfile)?SSL_SET_OPTION(CRLfile):"none");
-        return CURLE_SSL_CACERT;
+        return CURLE_PEER_FAILED_VERIFICATION;
       }
       else
         infof(data, "\t server certificate verification FAILED\n");
@@ -1278,10 +1280,7 @@ gtls_connect_step3(struct connectdata *conn,
     #define use_addr in_addr
 #endif
     unsigned char addrbuf[sizeof(struct use_addr)];
-    unsigned char certaddr[sizeof(struct use_addr)];
-    size_t addrlen = 0, certaddrlen;
-    int i;
-    int ret = 0;
+    size_t addrlen = 0;
 
     if(Curl_inet_pton(AF_INET, hostname, addrbuf) > 0)
       addrlen = 4;
@@ -1291,10 +1290,13 @@ gtls_connect_step3(struct connectdata *conn,
 #endif
 
     if(addrlen) {
+      unsigned char certaddr[sizeof(struct use_addr)];
+      int i;
+
       for(i = 0; ; i++) {
-        certaddrlen = sizeof(certaddr);
-        ret = gnutls_x509_crt_get_subject_alt_name(x509_cert, i, certaddr,
-                                                   &certaddrlen, NULL);
+        size_t certaddrlen = sizeof(certaddr);
+        int ret = gnutls_x509_crt_get_subject_alt_name(x509_cert, i, certaddr,
+                                                       &certaddrlen, NULL);
         /* If this happens, it wasn't an IP address. */
         if(ret == GNUTLS_E_SHORT_MEMORY_BUFFER)
           continue;
@@ -1423,11 +1425,6 @@ gtls_connect_step3(struct connectdata *conn,
   size = sizeof(certbuf);
   gnutls_x509_crt_get_issuer_dn(x509_cert, certbuf, &size);
   infof(data, "\t issuer: %s\n", certbuf);
-
-  /* compression algorithm (if any) */
-  ptr = gnutls_compression_get_name(gnutls_compression_get(session));
-  /* the *_get_name() says "NULL" if GNUTLS_COMP_NULL is returned */
-  infof(data, "\t compression: %s\n", ptr);
 #endif
 
   gnutls_x509_crt_deinit(x509_cert);
@@ -1454,6 +1451,9 @@ gtls_connect_step3(struct connectdata *conn,
     }
     else
       infof(data, "ALPN, server did not agree to a protocol\n");
+
+    Curl_multiuse_state(conn, conn->negnpn == CURL_HTTP_VERSION_2 ?
+                        BUNDLE_MULTIPLEX : BUNDLE_NO_MULTIUSE);
   }
 #endif
 
@@ -1466,8 +1466,6 @@ gtls_connect_step3(struct connectdata *conn,
        already got it from the cache and asked to use it in the connection, it
        might've been rejected and then a new one is in use now and we need to
        detect that. */
-    bool incache;
-    void *ssl_sessionid;
     void *connect_sessionid;
     size_t connect_idsize = 0;
 
@@ -1476,6 +1474,9 @@ gtls_connect_step3(struct connectdata *conn,
     connect_sessionid = malloc(connect_idsize); /* get a buffer for it */
 
     if(connect_sessionid) {
+      bool incache;
+      void *ssl_sessionid;
+
       /* extract session ID to the allocated buffer */
       gnutls_session_get_data(session, connect_sessionid, &connect_idsize);
 
@@ -1607,7 +1608,7 @@ static ssize_t gtls_send(struct connectdata *conn,
 static void close_one(struct ssl_connect_data *connssl)
 {
   if(BACKEND->session) {
-    gnutls_bye(BACKEND->session, GNUTLS_SHUT_RDWR);
+    gnutls_bye(BACKEND->session, GNUTLS_SHUT_WR);
     gnutls_deinit(BACKEND->session);
     BACKEND->session = NULL;
   }
@@ -1636,12 +1637,10 @@ static void Curl_gtls_close(struct connectdata *conn, int sockindex)
 static int Curl_gtls_shutdown(struct connectdata *conn, int sockindex)
 {
   struct ssl_connect_data *connssl = &conn->ssl[sockindex];
-  ssize_t result;
   int retval = 0;
   struct Curl_easy *data = conn->data;
-  bool done = FALSE;
-  char buf[120];
 
+#ifndef CURL_DISABLE_FTP
   /* This has only been tested on the proftpd server, and the mod_tls code
      sends a close notify alert without waiting for a close notify alert in
      response. Thus we wait for a close notify alert from the server, but
@@ -1649,8 +1648,13 @@ static int Curl_gtls_shutdown(struct connectdata *conn, int sockindex)
 
   if(data->set.ftp_ccc == CURLFTPSSL_CCC_ACTIVE)
       gnutls_bye(BACKEND->session, GNUTLS_SHUT_WR);
+#endif
 
   if(BACKEND->session) {
+    ssize_t result;
+    bool done = FALSE;
+    char buf[120];
+
     while(!done) {
       int what = SOCKET_READABLE(conn->sock[sockindex],
                                  SSL_SHUTDOWN_TIMEOUT);
@@ -1748,7 +1752,7 @@ static void Curl_gtls_session_free(void *ptr)
 
 static size_t Curl_gtls_version(char *buffer, size_t size)
 {
-  return snprintf(buffer, size, "GnuTLS/%s", gnutls_check_version(NULL));
+  return msnprintf(buffer, size, "GnuTLS/%s", gnutls_check_version(NULL));
 }
 
 #ifndef USE_GNUTLS_NETTLE
@@ -1763,12 +1767,6 @@ static int Curl_gtls_seed(struct Curl_easy *data)
 
   if(!ssl_seeded || data->set.str[STRING_SSL_RANDOM_FILE] ||
      data->set.str[STRING_SSL_EGDSOCKET]) {
-
-    /* TODO: to a good job seeding the RNG
-       This may involve the gcry_control function and these options:
-       GCRYCTL_SET_RANDOM_SEED_FILE
-       GCRYCTL_SET_RNDEGD_SOCKET
-    */
     ssl_seeded = TRUE;
   }
   return 0;
index c5ed887..e34ec9d 100644 (file)
@@ -6,7 +6,7 @@
  *                             \___|\___/|_| \_\_____|
  *
  * Copyright (C) 2010 - 2011, Hoi-Ho Chan, <hoiho.chan@gmail.com>
- * Copyright (C) 2012 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 2012 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -54,6 +54,7 @@
 #include "parsedate.h"
 #include "connect.h" /* for the connect timeout */
 #include "select.h"
+#include "multiif.h"
 #include "polarssl_threadlock.h"
 
 /* The last 3 #include files should be in this order */
@@ -342,7 +343,8 @@ mbed_connect_step1(struct connectdata *conn,
   if(SSL_SET_OPTION(key)) {
     ret = mbedtls_pk_parse_keyfile(&BACKEND->pk, SSL_SET_OPTION(key),
                                    SSL_SET_OPTION(key_passwd));
-    if(ret == 0 && !mbedtls_pk_can_do(&BACKEND->pk, MBEDTLS_PK_RSA))
+    if(ret == 0 && !(mbedtls_pk_can_do(&BACKEND->pk, MBEDTLS_PK_RSA) ||
+                     mbedtls_pk_can_do(&BACKEND->pk, MBEDTLS_PK_ECKEY)))
       ret = MBEDTLS_ERR_PK_TYPE_MISMATCH;
 
     if(ret) {
@@ -373,7 +375,7 @@ mbed_connect_step1(struct connectdata *conn,
     }
   }
 
-  infof(data, "mbedTLS: Connecting to %s:%d\n", hostname, port);
+  infof(data, "mbedTLS: Connecting to %s:%ld\n", hostname, port);
 
   mbedtls_ssl_config_init(&BACKEND->config);
 
@@ -539,13 +541,6 @@ mbed_connect_step2(struct connectdata *conn,
         data->set.str[STRING_SSL_PINNEDPUBLICKEY_PROXY] :
         data->set.str[STRING_SSL_PINNEDPUBLICKEY_ORIG];
 
-#ifdef HAS_ALPN
-  const char *next_protocol;
-#endif
-
-  char errorbuf[128];
-  errorbuf[0] = 0;
-
   conn->recv[sockindex] = mbed_recv;
   conn->send[sockindex] = mbed_send;
 
@@ -560,6 +555,8 @@ mbed_connect_step2(struct connectdata *conn,
     return CURLE_OK;
   }
   else if(ret) {
+    char errorbuf[128];
+    errorbuf[0] = 0;
 #ifdef MBEDTLS_ERROR_C
     mbedtls_strerror(ret, errorbuf, sizeof(errorbuf));
 #endif /* MBEDTLS_ERROR_C */
@@ -574,21 +571,26 @@ mbed_connect_step2(struct connectdata *conn,
 
   ret = mbedtls_ssl_get_verify_result(&BACKEND->ssl);
 
+  if(!SSL_CONN_CONFIG(verifyhost))
+    /* Ignore hostname errors if verifyhost is disabled */
+    ret &= ~MBEDTLS_X509_BADCERT_CN_MISMATCH;
+
   if(ret && SSL_CONN_CONFIG(verifypeer)) {
     if(ret & MBEDTLS_X509_BADCERT_EXPIRED)
       failf(data, "Cert verify failed: BADCERT_EXPIRED");
 
-    if(ret & MBEDTLS_X509_BADCERT_REVOKED) {
+    else if(ret & MBEDTLS_X509_BADCERT_REVOKED)
       failf(data, "Cert verify failed: BADCERT_REVOKED");
-      return CURLE_SSL_CACERT;
-    }
 
-    if(ret & MBEDTLS_X509_BADCERT_CN_MISMATCH)
+    else if(ret & MBEDTLS_X509_BADCERT_CN_MISMATCH)
       failf(data, "Cert verify failed: BADCERT_CN_MISMATCH");
 
-    if(ret & MBEDTLS_X509_BADCERT_NOT_TRUSTED)
+    else if(ret & MBEDTLS_X509_BADCERT_NOT_TRUSTED)
       failf(data, "Cert verify failed: BADCERT_NOT_TRUSTED");
 
+    else if(ret & MBEDTLS_X509_BADCERT_FUTURE)
+      failf(data, "Cert verify failed: BADCERT_FUTURE");
+
     return CURLE_PEER_FAILED_VERIFICATION;
   }
 
@@ -662,7 +664,7 @@ mbed_connect_step2(struct connectdata *conn,
 
 #ifdef HAS_ALPN
   if(conn->bits.tls_enable_alpn) {
-    next_protocol = mbedtls_ssl_get_alpn_protocol(&BACKEND->ssl);
+    const char *next_protocol = mbedtls_ssl_get_alpn_protocol(&BACKEND->ssl);
 
     if(next_protocol) {
       infof(data, "ALPN, server accepted to use %s\n", next_protocol);
@@ -682,6 +684,8 @@ mbed_connect_step2(struct connectdata *conn,
     else {
       infof(data, "ALPN, server did not agree to a protocol\n");
     }
+    Curl_multiuse_state(conn, conn->negnpn == CURL_HTTP_VERSION_2 ?
+                        BUNDLE_MULTIPLEX : BUNDLE_NO_MULTIUSE);
   }
 #endif
 
@@ -714,6 +718,8 @@ mbed_connect_step3(struct connectdata *conn,
 
     ret = mbedtls_ssl_get_session(&BACKEND->ssl, our_ssl_sessionid);
     if(ret) {
+      if(ret != MBEDTLS_ERR_SSL_ALLOC_FAILED)
+        mbedtls_ssl_session_free(our_ssl_sessionid);
       free(our_ssl_sessionid);
       failf(data, "mbedtls_ssl_get_session returned -0x%x", -ret);
       return CURLE_SSL_CONNECT_ERROR;
@@ -727,6 +733,7 @@ mbed_connect_step3(struct connectdata *conn,
     retcode = Curl_ssl_addsessionid(conn, our_ssl_sessionid, 0, sockindex);
     Curl_ssl_sessionid_unlock(conn);
     if(retcode) {
+      mbedtls_ssl_session_free(our_ssl_sessionid);
       free(our_ssl_sessionid);
       failf(data, "failed to store ssl session");
       return retcode;
@@ -811,9 +818,14 @@ static void Curl_mbedtls_session_free(void *ptr)
 
 static size_t Curl_mbedtls_version(char *buffer, size_t size)
 {
+#ifdef MBEDTLS_VERSION_C
+  /* if mbedtls_version_get_number() is available it is better */
   unsigned int version = mbedtls_version_get_number();
-  return snprintf(buffer, size, "mbedTLS/%u.%u.%u", version>>24,
-                  (version>>16)&0xff, (version>>8)&0xff);
+  return msnprintf(buffer, size, "mbedTLS/%u.%u.%u", version>>24,
+                   (version>>16)&0xff, (version>>8)&0xff);
+#else
+  return msnprintf(buffer, size, "mbedTLS/%s", MBEDTLS_VERSION_STRING);
+#endif
 }
 
 static CURLcode Curl_mbedtls_random(struct Curl_easy *data,
@@ -875,7 +887,7 @@ mbed_connect_common(struct connectdata *conn,
   struct Curl_easy *data = conn->data;
   struct ssl_connect_data *connssl = &conn->ssl[sockindex];
   curl_socket_t sockfd = conn->sock[sockindex];
-  long timeout_ms;
+  timediff_t timeout_ms;
   int what;
 
   /* check if the connection has already been established */
@@ -921,7 +933,7 @@ mbed_connect_common(struct connectdata *conn,
         connssl->connecting_state?sockfd:CURL_SOCKET_BAD;
 
       what = Curl_socket_check(readfd, CURL_SOCKET_BAD, writefd,
-                               nonblocking ? 0 : timeout_ms);
+                               nonblocking ? 0 : (time_t)timeout_ms);
       if(what < 0) {
         /* fatal error */
         failf(data, "select/poll on SSL socket, errno: %d", SOCKERRNO);
index 4a93860..0cc64b3 100644 (file)
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 2012 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 2012 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  * Copyright (C) 2010, Hoi-Ho Chan, <hoiho.chan@gmail.com>
  *
  * This software is licensed as described in the file COPYING, which
index 6a2b67e..cab1e39 100644 (file)
@@ -5,8 +5,8 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 2017-2018, Yiming Jing, <jingyiming@baidu.com>
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 2017 - 2018, Yiming Jing, <jingyiming@baidu.com>
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -73,6 +73,17 @@ struct ssl_backend_data
 static Curl_recv mesalink_recv;
 static Curl_send mesalink_send;
 
+static int do_file_type(const char *type)
+{
+  if(!type || !type[0])
+    return SSL_FILETYPE_PEM;
+  if(strcasecompare(type, "PEM"))
+    return SSL_FILETYPE_PEM;
+  if(strcasecompare(type, "DER"))
+    return SSL_FILETYPE_ASN1;
+  return -1;
+}
+
 /*
  * This function loads all the client/CA certificates and CRLs. Setup the TLS
  * layer and do all necessary magic.
@@ -83,9 +94,6 @@ mesalink_connect_step1(struct connectdata *conn, int sockindex)
   char *ciphers;
   struct Curl_easy *data = conn->data;
   struct ssl_connect_data *connssl = &conn->ssl[sockindex];
-  const bool verifypeer = SSL_CONN_CONFIG(verifypeer);
-  const char *const ssl_cafile = SSL_CONN_CONFIG(CAfile);
-  const char *const ssl_capath = SSL_CONN_CONFIG(CApath);
   struct in_addr addr4;
 #ifdef ENABLE_IPV6
   struct in6_addr addr6;
@@ -142,21 +150,25 @@ mesalink_connect_step1(struct connectdata *conn, int sockindex)
   }
 
   SSL_CTX_set_verify(
-    BACKEND->ctx, verifypeer ? SSL_VERIFY_PEER : SSL_VERIFY_NONE, NULL);
+    BACKEND->ctx, SSL_CONN_CONFIG(verifypeer) ?
+      SSL_VERIFY_PEER : SSL_VERIFY_NONE, NULL);
 
-  if(ssl_cafile || ssl_capath) {
-    if(!SSL_CTX_load_verify_locations(BACKEND->ctx, ssl_cafile, ssl_capath)) {
-      if(verifypeer) {
+  if(SSL_CONN_CONFIG(CAfile) || SSL_CONN_CONFIG(CApath)) {
+    if(!SSL_CTX_load_verify_locations(BACKEND->ctx, SSL_CONN_CONFIG(CAfile),
+                                                    SSL_CONN_CONFIG(CApath))) {
+      if(SSL_CONN_CONFIG(verifypeer)) {
         failf(data,
               "error setting certificate verify locations:\n"
               "  CAfile: %s\n  CApath: %s",
-              ssl_cafile ? ssl_cafile : "none",
-              ssl_capath ? ssl_capath : "none");
+              SSL_CONN_CONFIG(CAfile) ?
+              SSL_CONN_CONFIG(CAfile) : "none",
+              SSL_CONN_CONFIG(CApath) ?
+              SSL_CONN_CONFIG(CApath) : "none");
         return CURLE_SSL_CACERT_BADFILE;
       }
       infof(data,
-            "error setting certificate verify locations,"
-            " continuing anyway:\n");
+          "error setting certificate verify locations,"
+          " continuing anyway:\n");
     }
     else {
       infof(data, "successfully set certificate verify locations:\n");
@@ -164,8 +176,32 @@ mesalink_connect_step1(struct connectdata *conn, int sockindex)
     infof(data,
           "  CAfile: %s\n"
           "  CApath: %s\n",
-          ssl_cafile ? ssl_cafile : "none",
-          ssl_capath ? ssl_capath : "none");
+          SSL_CONN_CONFIG(CAfile)?
+          SSL_CONN_CONFIG(CAfile): "none",
+          SSL_CONN_CONFIG(CApath)?
+          SSL_CONN_CONFIG(CApath): "none");
+  }
+
+  if(SSL_SET_OPTION(cert) && SSL_SET_OPTION(key)) {
+    int file_type = do_file_type(SSL_SET_OPTION(cert_type));
+
+    if(SSL_CTX_use_certificate_chain_file(BACKEND->ctx, SSL_SET_OPTION(cert),
+                                     file_type) != 1) {
+      failf(data, "unable to use client certificate (no key or wrong pass"
+            " phrase?)");
+      return CURLE_SSL_CONNECT_ERROR;
+    }
+
+    file_type = do_file_type(SSL_SET_OPTION(key_type));
+    if(SSL_CTX_use_PrivateKey_file(BACKEND->ctx, SSL_SET_OPTION(key),
+                                    file_type) != 1) {
+      failf(data, "unable to set private key");
+      return CURLE_SSL_CONNECT_ERROR;
+    }
+    infof(data,
+          "client cert: %s\n",
+          SSL_CONN_CONFIG(clientcert)?
+          SSL_CONN_CONFIG(clientcert): "none");
   }
 
   ciphers = SSL_CONN_CONFIG(cipher_list);
@@ -265,14 +301,14 @@ mesalink_connect_step2(struct connectdata *conn, int sockindex)
 
   ret = SSL_connect(BACKEND->handle);
   if(ret != SSL_SUCCESS) {
-    char error_buffer[MESALINK_MAX_ERROR_SZ];
     int detail = SSL_get_error(BACKEND->handle, ret);
 
-    if(SSL_ERROR_WANT_CONNECT == detail) {
+    if(SSL_ERROR_WANT_CONNECT == detail || SSL_ERROR_WANT_READ == detail) {
       connssl->connecting_state = ssl_connect_2_reading;
       return CURLE_OK;
     }
     else {
+      char error_buffer[MESALINK_MAX_ERROR_SZ];
       failf(data,
             "SSL_connect failed with error %d: %s",
             detail,
@@ -424,7 +460,7 @@ mesalink_recv(struct connectdata *conn, int num, char *buf, size_t buffersize,
 static size_t
 Curl_mesalink_version(char *buffer, size_t size)
 {
-  return snprintf(buffer, size, "MesaLink/%s", MESALINK_VERSION_STRING);
+  return msnprintf(buffer, size, "MesaLink/%s", MESALINK_VERSION_STRING);
 }
 
 static int
@@ -458,7 +494,7 @@ mesalink_connect_common(struct connectdata *conn, int sockindex,
   struct Curl_easy *data = conn->data;
   struct ssl_connect_data *connssl = &conn->ssl[sockindex];
   curl_socket_t sockfd = conn->sock[sockindex];
-  time_t timeout_ms;
+  timediff_t timeout_ms;
   int what;
 
   /* check if the connection has already been established */
@@ -507,7 +543,8 @@ mesalink_connect_common(struct connectdata *conn, int sockindex,
                                : CURL_SOCKET_BAD;
 
       what = Curl_socket_check(
-        readfd, CURL_SOCKET_BAD, writefd, nonblocking ? 0 : timeout_ms);
+        readfd, CURL_SOCKET_BAD, writefd,
+        nonblocking ? 0 : (time_t)timeout_ms);
       if(what < 0) {
         /* fatal error */
         failf(data, "select/poll on SSL socket, errno: %d", SOCKERRNO);
index a3d3e58..ef51b0d 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -38,6 +38,7 @@
 #include "select.h"
 #include "vtls.h"
 #include "llist.h"
+#include "multiif.h"
 #include "curl_printf.h"
 #include "nssg.h"
 #include <nspr.h>
@@ -112,7 +113,7 @@ typedef struct {
   ptr->type = (_type);                                      \
   ptr->pValue = (_val);                                     \
   ptr->ulValueLen = (_len);                                 \
-} WHILE_FALSE
+} while(0)
 
 #define CERT_NewTempCertificate __CERT_NewTempCertificate
 
@@ -215,11 +216,19 @@ static const cipher_s cipherlist[] = {
  {"dhe_rsa_chacha20_poly1305_sha_256",
      TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256},
 #endif
+#ifdef TLS_AES_256_GCM_SHA384
+ {"aes_128_gcm_sha_256",              TLS_AES_128_GCM_SHA256},
+ {"aes_256_gcm_sha_384",              TLS_AES_256_GCM_SHA384},
+ {"chacha20_poly1305_sha_256",        TLS_CHACHA20_POLY1305_SHA256},
+#endif
 };
 
-#ifdef WIN32
+#if defined(WIN32)
 static const char *pem_library = "nsspem.dll";
 static const char *trust_library = "nssckbi.dll";
+#elif defined(__APPLE__)
+static const char *pem_library = "libnsspem.dylib";
+static const char *trust_library = "libnssckbi.dylib";
 #else
 static const char *pem_library = "libnsspem.so";
 static const char *trust_library = "libnssckbi.so";
@@ -246,6 +255,32 @@ static void nss_print_error_message(struct Curl_easy *data, PRUint32 err)
   failf(data, "%s", PR_ErrorToString(err, PR_LANGUAGE_I_DEFAULT));
 }
 
+static char *nss_sslver_to_name(PRUint16 nssver)
+{
+  switch(nssver) {
+  case SSL_LIBRARY_VERSION_2:
+    return strdup("SSLv2");
+  case SSL_LIBRARY_VERSION_3_0:
+    return strdup("SSLv3");
+  case SSL_LIBRARY_VERSION_TLS_1_0:
+    return strdup("TLSv1.0");
+#ifdef SSL_LIBRARY_VERSION_TLS_1_1
+  case SSL_LIBRARY_VERSION_TLS_1_1:
+    return strdup("TLSv1.1");
+#endif
+#ifdef SSL_LIBRARY_VERSION_TLS_1_2
+  case SSL_LIBRARY_VERSION_TLS_1_2:
+    return strdup("TLSv1.2");
+#endif
+#ifdef SSL_LIBRARY_VERSION_TLS_1_3
+  case SSL_LIBRARY_VERSION_TLS_1_3:
+    return strdup("TLSv1.3");
+#endif
+  default:
+    return curl_maprintf("0x%04x", nssver);
+  }
+}
+
 static SECStatus set_ciphers(struct Curl_easy *data, PRFileDesc * model,
                              char *cipher_list)
 {
@@ -351,7 +386,7 @@ static int is_file(const char *filename)
     return 0;
 
   if(stat(filename, &st) == 0)
-    if(S_ISREG(st.st_mode))
+    if(S_ISREG(st.st_mode) || S_ISFIFO(st.st_mode) || S_ISCHR(st.st_mode))
       return 1;
 
   return 0;
@@ -546,17 +581,19 @@ static CURLcode nss_cache_crl(SECItem *crl_der)
   /* acquire lock before call of CERT_CacheCRL() and accessing nss_crl_list */
   PR_Lock(nss_crllock);
 
-  /* store the CRL item so that we can free it in Curl_nss_cleanup() */
-  if(insert_wrapped_ptr(&nss_crl_list, crl_der) != CURLE_OK) {
+  if(SECSuccess != CERT_CacheCRL(db, crl_der)) {
+    /* unable to cache CRL */
     SECITEM_FreeItem(crl_der, PR_TRUE);
     PR_Unlock(nss_crllock);
-    return CURLE_OUT_OF_MEMORY;
+    return CURLE_SSL_CRL_BADFILE;
   }
 
-  if(SECSuccess != CERT_CacheCRL(db, crl_der)) {
-    /* unable to cache CRL */
+  /* store the CRL item so that we can free it in Curl_nss_cleanup() */
+  if(insert_wrapped_ptr(&nss_crl_list, crl_der) != CURLE_OK) {
+    if(SECSuccess == CERT_UncacheCRL(db, crl_der))
+      SECITEM_FreeItem(crl_der, PR_TRUE);
     PR_Unlock(nss_crllock);
-    return CURLE_SSL_CRL_BADFILE;
+    return CURLE_OUT_OF_MEMORY;
   }
 
   /* we need to clear session cache, so that the CRL could take effect */
@@ -654,7 +691,10 @@ static CURLcode nss_load_key(struct connectdata *conn, int sockindex,
   tmp = SECMOD_WaitForAnyTokenEvent(pem_module, 0, 0);
   if(tmp)
     PK11_FreeSlot(tmp);
-  PK11_IsPresent(slot);
+  if(!PK11_IsPresent(slot)) {
+    PK11_FreeSlot(slot);
+    return CURLE_SSL_CERTPROBLEM;
+  }
 
   status = PK11_Authenticate(slot, PR_TRUE, SSL_SET_OPTION(key_passwd));
   PK11_FreeSlot(slot);
@@ -817,6 +857,8 @@ static void HandshakeCallback(PRFileDesc *sock, void *arg)
        !memcmp(ALPN_HTTP_1_1, buf, ALPN_HTTP_1_1_LENGTH)) {
       conn->negnpn = CURL_HTTP_VERSION_1_1;
     }
+    Curl_multiuse_state(conn, conn->negnpn == CURL_HTTP_VERSION_2 ?
+                        BUNDLE_MULTIPLEX : BUNDLE_NO_MULTIUSE);
   }
 }
 
@@ -1279,6 +1321,8 @@ static void nss_unload_module(SECMODModule **pmod)
 static CURLcode nss_init_core(struct Curl_easy *data, const char *cert_dir)
 {
   NSSInitParameters initparams;
+  PRErrorCode err;
+  const char *err_name;
 
   if(nss_context != NULL)
     return CURLE_OK;
@@ -1299,7 +1343,9 @@ static CURLcode nss_init_core(struct Curl_easy *data, const char *cert_dir)
     if(nss_context != NULL)
       return CURLE_OK;
 
-    infof(data, "Unable to initialize NSS database\n");
+    err = PR_GetError();
+    err_name = nss_error_to_name(err);
+    infof(data, "Unable to initialize NSS database: %d (%s)\n", err, err_name);
   }
 
   infof(data, "Initializing NSS with certpath: none\n");
@@ -1309,7 +1355,9 @@ static CURLcode nss_init_core(struct Curl_easy *data, const char *cert_dir)
   if(nss_context != NULL)
     return CURLE_OK;
 
-  infof(data, "Unable to initialize NSS\n");
+  err = PR_GetError();
+  err_name = nss_error_to_name(err);
+  failf(data, "Unable to initialize NSS: %d (%s)", err, err_name);
   return CURLE_SSL_CACERT_BADFILE;
 }
 
@@ -1381,7 +1429,7 @@ static int Curl_nss_init(void)
 {
   /* curl_global_init() is not thread-safe so this test is ok */
   if(nss_initlock == NULL) {
-    PR_Init(PR_USER_THREAD, PR_PRIORITY_NORMAL, 256);
+    PR_Init(PR_USER_THREAD, PR_PRIORITY_NORMAL, 0);
     nss_initlock = PR_NewLock();
     nss_crllock = PR_NewLock();
     nss_findslot_lock = PR_NewLock();
@@ -1638,17 +1686,6 @@ static CURLcode nss_load_ca_certificates(struct connectdata *conn,
 static CURLcode nss_sslver_from_curl(PRUint16 *nssver, long version)
 {
   switch(version) {
-  case CURL_SSLVERSION_TLSv1:
-    /* TODO: set sslver->max to SSL_LIBRARY_VERSION_TLS_1_3 once stable */
-#ifdef SSL_LIBRARY_VERSION_TLS_1_2
-    *nssver = SSL_LIBRARY_VERSION_TLS_1_2;
-#elif defined SSL_LIBRARY_VERSION_TLS_1_1
-    *nssver = SSL_LIBRARY_VERSION_TLS_1_1;
-#else
-    *nssver = SSL_LIBRARY_VERSION_TLS_1_0;
-#endif
-    return CURLE_OK;
-
   case CURL_SSLVERSION_SSLv2:
     *nssver = SSL_LIBRARY_VERSION_2;
     return CURLE_OK;
@@ -1697,22 +1734,16 @@ static CURLcode nss_init_sslver(SSLVersionRange *sslver,
   CURLcode result;
   const long min = SSL_CONN_CONFIG(version);
   const long max = SSL_CONN_CONFIG(version_max);
-
-  /* map CURL_SSLVERSION_DEFAULT to NSS default */
-  if(min == CURL_SSLVERSION_DEFAULT || max == CURL_SSLVERSION_MAX_DEFAULT) {
-    /* map CURL_SSLVERSION_DEFAULT to NSS default */
-    if(SSL_VersionRangeGetDefault(ssl_variant_stream, sslver) != SECSuccess)
-      return CURLE_SSL_CONNECT_ERROR;
-    /* ... but make sure we use at least TLSv1.0 according to libcurl API */
-    if(sslver->min < SSL_LIBRARY_VERSION_TLS_1_0)
-      sslver->min = SSL_LIBRARY_VERSION_TLS_1_0;
-  }
+  SSLVersionRange vrange;
 
   switch(min) {
-  case CURL_SSLVERSION_DEFAULT:
-    break;
   case CURL_SSLVERSION_TLSv1:
-    sslver->min = SSL_LIBRARY_VERSION_TLS_1_0;
+  case CURL_SSLVERSION_DEFAULT:
+    /* Bump our minimum TLS version if NSS has stricter requirements. */
+    if(SSL_VersionRangeGetDefault(ssl_variant_stream, &vrange) != SECSuccess)
+      return CURLE_SSL_CONNECT_ERROR;
+    if(sslver->min < vrange.min)
+      sslver->min = vrange.min;
     break;
   default:
     result = nss_sslver_from_curl(&sslver->min, min);
@@ -1789,10 +1820,19 @@ static CURLcode nss_setup_connect(struct connectdata *conn, int sockindex)
   struct ssl_connect_data *connssl = &conn->ssl[sockindex];
   CURLcode result;
   bool second_layer = FALSE;
+  SSLVersionRange sslver_supported;
 
   SSLVersionRange sslver = {
     SSL_LIBRARY_VERSION_TLS_1_0,  /* min */
-    SSL_LIBRARY_VERSION_TLS_1_0   /* max */
+#ifdef SSL_LIBRARY_VERSION_TLS_1_3
+    SSL_LIBRARY_VERSION_TLS_1_3   /* max */
+#elif defined SSL_LIBRARY_VERSION_TLS_1_2
+    SSL_LIBRARY_VERSION_TLS_1_2
+#elif defined SSL_LIBRARY_VERSION_TLS_1_1
+    SSL_LIBRARY_VERSION_TLS_1_1
+#else
+    SSL_LIBRARY_VERSION_TLS_1_0
+#endif
   };
 
   BACKEND->data = data;
@@ -1800,7 +1840,6 @@ static CURLcode nss_setup_connect(struct connectdata *conn, int sockindex)
   /* list of all NSS objects we need to destroy in Curl_nss_close() */
   Curl_llist_init(&BACKEND->obj_list, nss_destroy_object);
 
-  /* FIXME. NSS doesn't support multiple databases open at the same time. */
   PR_Lock(nss_initlock);
   result = nss_init(conn->data);
   if(result) {
@@ -1841,6 +1880,20 @@ static CURLcode nss_setup_connect(struct connectdata *conn, int sockindex)
   /* enable/disable the requested SSL version(s) */
   if(nss_init_sslver(&sslver, data, conn) != CURLE_OK)
     goto error;
+  if(SSL_VersionRangeGetSupported(ssl_variant_stream,
+                                  &sslver_supported) != SECSuccess)
+    goto error;
+  if(sslver_supported.max < sslver.max && sslver_supported.max >= sslver.min) {
+    char *sslver_req_str, *sslver_supp_str;
+    sslver_req_str = nss_sslver_to_name(sslver.max);
+    sslver_supp_str = nss_sslver_to_name(sslver_supported.max);
+    if(sslver_req_str && sslver_supp_str)
+      infof(data, "Falling back from %s to max supported SSL version (%s)\n",
+                  sslver_req_str, sslver_supp_str);
+    free(sslver_req_str);
+    free(sslver_supp_str);
+    sslver.max = sslver_supported.max;
+  }
   if(SSL_VersionRangeSet(model, &sslver) != SECSuccess)
     goto error;
 
@@ -2074,7 +2127,7 @@ static CURLcode nss_do_connect(struct connectdata *conn, int sockindex)
 
 
   /* check timeout situation */
-  const time_t time_left = Curl_timeleft(data, NULL, TRUE);
+  const timediff_t time_left = Curl_timeleft(data, NULL, TRUE);
   if(time_left < 0) {
     failf(data, "timed out before SSL handshake");
     result = CURLE_OPERATION_TIMEDOUT;
@@ -2090,7 +2143,7 @@ static CURLcode nss_do_connect(struct connectdata *conn, int sockindex)
     else if(*certverifyresult == SSL_ERROR_BAD_CERT_DOMAIN)
       result = CURLE_PEER_FAILED_VERIFICATION;
     else if(*certverifyresult != 0)
-      result = CURLE_SSL_CACERT;
+      result = CURLE_PEER_FAILED_VERIFICATION;
     goto error;
   }
 
@@ -2164,7 +2217,7 @@ static CURLcode nss_connect_common(struct connectdata *conn, int sockindex,
     if(!blocking)
       /* CURLE_AGAIN in non-blocking mode is not an error */
       return CURLE_OK;
-    /* fall through */
+    /* FALLTHROUGH */
   default:
     return result;
   }
@@ -2279,7 +2332,7 @@ static ssize_t nss_recv(struct connectdata *conn,  /* connection data */
 
 static size_t Curl_nss_version(char *buffer, size_t size)
 {
-  return snprintf(buffer, size, "NSS/%s", NSS_VERSION);
+  return msnprintf(buffer, size, "NSS/%s", NSS_VERSION);
 }
 
 /* data might be NULL */
index 4c5e8c1..726ff6e 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
  * but vtls.c should ever call or use these functions.
  */
 
-/*
- * The original SSLeay-using code for curl was written by Linas Vepstas and
- * Sampo Kellomaki 1998.
- */
-
 #include "curl_setup.h"
 
 #ifdef USE_OPENSSL
@@ -48,6 +43,8 @@
 #include "vtls.h"
 #include "strcase.h"
 #include "hostcheck.h"
+#include "multiif.h"
+#include "strerror.h"
 #include "curl_printf.h"
 #include <openssl/ssl.h>
 #include <openssl/rand.h>
 #include <openssl/buffer.h>
 #include <openssl/pkcs12.h>
 
+#ifdef USE_AMISSL
+#include "amigaos.h"
+#endif
+
 #if (OPENSSL_VERSION_NUMBER >= 0x0090808fL) && !defined(OPENSSL_NO_OCSP)
 #include <openssl/ocsp.h>
 #endif
 
-#if (OPENSSL_VERSION_NUMBER >= 0x0090800fL) && /* 0.9.8 or later */     \
-  !defined(OPENSSL_NO_ENGINE)
+#if (OPENSSL_VERSION_NUMBER >= 0x0090700fL) && /* 0.9.7 or later */     \
+  !defined(OPENSSL_NO_ENGINE) && !defined(OPENSSL_NO_UI_CONSOLE)
 #define USE_OPENSSL_ENGINE
 #include <openssl/engine.h>
 #endif
 #include "curl_memory.h"
 #include "memdebug.h"
 
+/* Uncomment the ALLOW_RENEG line to a real #define if you want to allow TLS
+   renegotiations when built with BoringSSL. Renegotiating is non-compliant
+   with HTTP/2 and "an extremely dangerous protocol feature". Beware.
+
+#define ALLOW_RENEG 1
+ */
+
 #ifndef OPENSSL_VERSION_NUMBER
 #error "OPENSSL_VERSION_NUMBER not defined"
 #endif
 #endif
 #endif
 
-#ifdef LIBRESSL_VERSION_NUMBER
-#define OpenSSL_version_num() LIBRESSL_VERSION_NUMBER
-#endif
-
 #if (OPENSSL_VERSION_NUMBER >= 0x1000200fL) && /* 1.0.2 or later */ \
     !(defined(LIBRESSL_VERSION_NUMBER) && \
       LIBRESSL_VERSION_NUMBER < 0x20700000L)
 #define HAVE_X509_GET0_SIGNATURE 1
 #endif
 
+#if (OPENSSL_VERSION_NUMBER >= 0x1000200fL) /* 1.0.2 or later */
+#define HAVE_SSL_GET_SHUTDOWN 1
+#endif
+
 #if OPENSSL_VERSION_NUMBER >= 0x10002003L && \
   OPENSSL_VERSION_NUMBER <= 0x10002FFFL && \
   !defined(OPENSSL_NO_COMP)
@@ -380,10 +388,48 @@ static const char *SSL_ERROR_to_str(int err)
  */
 static char *ossl_strerror(unsigned long error, char *buf, size_t size)
 {
+  if(size)
+    *buf = '\0';
+
+#ifdef OPENSSL_IS_BORINGSSL
+  ERR_error_string_n((uint32_t)error, buf, size);
+#else
   ERR_error_string_n(error, buf, size);
+#endif
+
+  if(size > 1 && !*buf) {
+    strncpy(buf, (error ? "Unknown error" : "No error"), size);
+    buf[size - 1] = '\0';
+  }
+
   return buf;
 }
 
+/* Return an extra data index for the connection data.
+ * This index can be used with SSL_get_ex_data() and SSL_set_ex_data().
+ */
+static int ossl_get_ssl_conn_index(void)
+{
+  static int ssl_ex_data_conn_index = -1;
+  if(ssl_ex_data_conn_index < 0) {
+    ssl_ex_data_conn_index = SSL_get_ex_new_index(0, NULL, NULL, NULL, NULL);
+  }
+  return ssl_ex_data_conn_index;
+}
+
+/* Return an extra data index for the sockindex.
+ * This index can be used with SSL_get_ex_data() and SSL_set_ex_data().
+ */
+static int ossl_get_ssl_sockindex_index(void)
+{
+  static int ssl_ex_data_sockindex_index = -1;
+  if(ssl_ex_data_sockindex_index < 0) {
+    ssl_ex_data_sockindex_index = SSL_get_ex_new_index(0, NULL, NULL, NULL,
+        NULL);
+  }
+  return ssl_ex_data_sockindex_index;
+}
+
 static int passwd_callback(char *buf, int num, int encrypting,
                            void *global_passwd)
 {
@@ -788,8 +834,11 @@ int cert_stuff(struct connectdata *conn,
   fail:
       EVP_PKEY_free(pri);
       X509_free(x509);
+#ifdef USE_AMISSL
+      sk_X509_pop_free(ca, Curl_amiga_X509_free);
+#else
       sk_X509_pop_free(ca, X509_free);
-
+#endif
       if(!cert_done)
         return 0; /* failure! */
       break;
@@ -799,15 +848,15 @@ int cert_stuff(struct connectdata *conn,
       return 0;
     }
 
-    file_type = do_file_type(key_type);
+    if(!key_file)
+      key_file = cert_file;
+    else
+      file_type = do_file_type(key_type);
 
     switch(file_type) {
     case SSL_FILETYPE_PEM:
       if(cert_done)
         break;
-      if(!key_file)
-        /* cert & key can only be in PEM case in the same file */
-        key_file = cert_file;
       /* FALLTHROUGH */
     case SSL_FILETYPE_ASN1:
       if(SSL_CTX_use_PrivateKey_file(ctx, key_file, file_type) != 1) {
@@ -982,14 +1031,8 @@ static int Curl_ossl_init(void)
   ENGINE_load_builtin_engines();
 #endif
 
-  /* OPENSSL_config(NULL); is "strongly recommended" to use but unfortunately
-     that function makes an exit() call on wrongly formatted config files
-     which makes it hard to use in some situations. OPENSSL_config() itself
-     calls CONF_modules_load_file() and we use that instead and we ignore
-     its return code! */
-
-  /* CONF_MFLAGS_DEFAULT_SECTION introduced some time between 0.9.8b and
-     0.9.8e */
+/* CONF_MFLAGS_DEFAULT_SECTION was introduced some time between 0.9.8b and
+   0.9.8e */
 #ifndef CONF_MFLAGS_DEFAULT_SECTION
 #define CONF_MFLAGS_DEFAULT_SECTION 0x0
 #endif
@@ -1035,6 +1078,10 @@ static int Curl_ossl_init(void)
   }
 #endif
 
+  /* Initialize the extra data indexes */
+  if(ossl_get_ssl_conn_index() < 0 || ossl_get_ssl_sockindex_index() < 0)
+    return 0;
+
   return 1;
 }
 
@@ -1049,7 +1096,7 @@ static void Curl_ossl_cleanup(void)
   /* Free ciphers and digests lists */
   EVP_cleanup();
 
-#ifdef HAVE_ENGINE_CLEANUP
+#ifdef USE_OPENSSL_ENGINE
   /* Free engine list */
   ENGINE_cleanup();
 #endif
@@ -1264,6 +1311,7 @@ static int Curl_ossl_shutdown(struct connectdata *conn, int sockindex)
   int err;
   bool done = FALSE;
 
+#ifndef CURL_DISABLE_FTP
   /* This has only been tested on the proftpd server, and the mod_tls code
      sends a close notify alert without waiting for a close notify alert in
      response. Thus we wait for a close notify alert from the server, but
@@ -1271,6 +1319,7 @@ static int Curl_ossl_shutdown(struct connectdata *conn, int sockindex)
 
   if(data->set.ftp_ccc == CURLFTPSSL_CCC_ACTIVE)
       (void)SSL_shutdown(BACKEND->handle);
+#endif
 
   if(BACKEND->handle) {
     buffsize = (int)sizeof(buf);
@@ -1490,8 +1539,13 @@ static CURLcode verifyhost(struct connectdata *conn, X509 *server_cert)
   altnames = X509_get_ext_d2i(server_cert, NID_subject_alt_name, NULL, NULL);
 
   if(altnames) {
+#ifdef OPENSSL_IS_BORINGSSL
+    size_t numalts;
+    size_t i;
+#else
     int numalts;
     int i;
+#endif
     bool dnsmatched = FALSE;
     bool ipmatched = FALSE;
 
@@ -1521,11 +1575,10 @@ static CURLcode verifyhost(struct connectdata *conn, X509 *server_cert)
              assumed that the data returned by ASN1_STRING_data() is null
              terminated or does not contain embedded nulls." But also that
              "The actual format of the data will depend on the actual string
-             type itself: for example for and IA5String the data will be ASCII"
+             type itself: for example for an IA5String the data will be ASCII"
 
-             Gisle researched the OpenSSL sources:
-             "I checked the 0.9.6 and 0.9.8 sources before my patch and
-             it always 0-terminates an IA5String."
+             It has been however verified that in 0.9.6 and 0.9.7, IA5String
+             is always zero-terminated.
           */
           if((altlen == strlen(altptr)) &&
              /* if this isn't true, there was an embedded zero in the name
@@ -1589,8 +1642,7 @@ static CURLcode verifyhost(struct connectdata *conn, X509 *server_cert)
       /* In OpenSSL 0.9.7d and earlier, ASN1_STRING_to_UTF8 fails if the input
          is already UTF-8 encoded. We check for this case and copy the raw
          string manually to avoid the problem. This code can be made
-         conditional in the future when OpenSSL has been fixed. Work-around
-         brought by Alexis S. L. Carvalho. */
+         conditional in the future when OpenSSL has been fixed. */
       if(tmp) {
         if(ASN1_STRING_type(tmp) == V_ASN1_UTF8STRING) {
           j = ASN1_STRING_length(tmp);
@@ -1656,6 +1708,7 @@ static CURLcode verifystatus(struct connectdata *conn,
                              struct ssl_connect_data *connssl)
 {
   int i, ocsp_status;
+  unsigned char *status;
   const unsigned char *p;
   CURLcode result = CURLE_OK;
   struct Curl_easy *data = conn->data;
@@ -1665,14 +1718,14 @@ static CURLcode verifystatus(struct connectdata *conn,
   X509_STORE     *st = NULL;
   STACK_OF(X509) *ch = NULL;
 
-  long len = SSL_get_tlsext_status_ocsp_resp(BACKEND->handle, &p);
+  long len = SSL_get_tlsext_status_ocsp_resp(BACKEND->handle, &status);
 
-  if(!p) {
+  if(!status) {
     failf(data, "No OCSP response received");
     result = CURLE_SSL_INVALIDCERTSTATUS;
     goto end;
   }
-
+  p = status;
   rsp = d2i_OCSP_RESPONSE(NULL, &p, len);
   if(!rsp) {
     failf(data, "Invalid OCSP response");
@@ -1867,15 +1920,8 @@ static const char *ssl_msg_type(int ssl_ver, int msg)
   return "Unknown";
 }
 
-static const char *tls_rt_type(int type, const void *buf, size_t buflen)
+static const char *tls_rt_type(int type)
 {
-  (void)buf;
-  (void)buflen;
-#ifdef SSL3_RT_INNER_CONTENT_TYPE
-  if(type == SSL3_RT_INNER_CONTENT_TYPE && buf && buflen >= 1)
-    type = *(unsigned char *)buf;
-#endif
-
   switch(type) {
 #ifdef SSL3_RT_HEADER
   case SSL3_RT_HEADER:
@@ -1945,12 +1991,20 @@ static void ssl_tls_trace(int direction, int ssl_ver, int content_type,
   case 0:
     break;
   default:
-    snprintf(unknown, sizeof(unknown), "(%x)", ssl_ver);
+    msnprintf(unknown, sizeof(unknown), "(%x)", ssl_ver);
     verstr = unknown;
     break;
   }
 
-  if(ssl_ver) {
+  /* Log progress for interesting records only (like Handshake or Alert), skip
+   * all raw record headers (content_type == SSL3_RT_HEADER or ssl_ver == 0).
+   * For TLS 1.3, skip notification of the decrypted inner Content Type.
+   */
+  if(ssl_ver
+#ifdef SSL3_RT_INNER_CONTENT_TYPE
+     && content_type != SSL3_RT_INNER_CONTENT_TYPE
+#endif
+    ) {
     const char *msg_name, *tls_rt_name;
     char ssl_buf[1024];
     int msg_type, txt_len;
@@ -1964,17 +2018,10 @@ static void ssl_tls_trace(int direction, int ssl_ver, int content_type,
      * is at 'buf[0]'.
      */
     if(ssl_ver == SSL3_VERSION_MAJOR && content_type)
-      tls_rt_name = tls_rt_type(content_type, buf, len);
+      tls_rt_name = tls_rt_type(content_type);
     else
       tls_rt_name = "";
 
-#ifdef SSL3_RT_INNER_CONTENT_TYPE
-    if(content_type == SSL3_RT_INNER_CONTENT_TYPE) {
-      msg_type = 0;
-      msg_name = "[no content]";
-    }
-    else
-#endif
     if(content_type == SSL3_RT_CHANGE_CIPHER_SPEC) {
       msg_type = *(char *)buf;
       msg_name = "Change cipher spec";
@@ -1988,9 +2035,9 @@ static void ssl_tls_trace(int direction, int ssl_ver, int content_type,
       msg_name = ssl_msg_type(ssl_ver, msg_type);
     }
 
-    txt_len = snprintf(ssl_buf, sizeof(ssl_buf), "%s (%s), %s, %s (%d):\n",
-                       verstr, direction?"OUT":"IN",
-                       tls_rt_name, msg_name, msg_type);
+    txt_len = msnprintf(ssl_buf, sizeof(ssl_buf), "%s (%s), %s, %s (%d):\n",
+                        verstr, direction?"OUT":"IN",
+                        tls_rt_name, msg_name, msg_type);
     if(0 <= txt_len && (unsigned)txt_len < sizeof(ssl_buf)) {
       Curl_debug(data, CURLINFO_TEXT, ssl_buf, (size_t)txt_len);
     }
@@ -2115,9 +2162,101 @@ get_ssl_version_txt(SSL *ssl)
 }
 #endif
 
+#if (OPENSSL_VERSION_NUMBER >= 0x10100000L) /* 1.1.0 */
+static CURLcode
+set_ssl_version_min_max(SSL_CTX *ctx, struct connectdata *conn)
+{
+  /* first, TLS min version... */
+  long curl_ssl_version_min = SSL_CONN_CONFIG(version);
+  long curl_ssl_version_max;
+
+  /* convert cURL min SSL version option to OpenSSL constant */
+#if defined(OPENSSL_IS_BORINGSSL) || defined(LIBRESSL_VERSION_NUMBER)
+  uint16_t ossl_ssl_version_min = 0;
+  uint16_t ossl_ssl_version_max = 0;
+#else
+  long ossl_ssl_version_min = 0;
+  long ossl_ssl_version_max = 0;
+#endif
+  switch(curl_ssl_version_min) {
+    case CURL_SSLVERSION_TLSv1: /* TLS 1.x */
+    case CURL_SSLVERSION_TLSv1_0:
+      ossl_ssl_version_min = TLS1_VERSION;
+      break;
+    case CURL_SSLVERSION_TLSv1_1:
+      ossl_ssl_version_min = TLS1_1_VERSION;
+      break;
+    case CURL_SSLVERSION_TLSv1_2:
+      ossl_ssl_version_min = TLS1_2_VERSION;
+      break;
+#ifdef TLS1_3_VERSION
+    case CURL_SSLVERSION_TLSv1_3:
+      ossl_ssl_version_min = TLS1_3_VERSION;
+      break;
+#endif
+  }
+
+  /* CURL_SSLVERSION_DEFAULT means that no option was selected.
+     We don't want to pass 0 to SSL_CTX_set_min_proto_version as
+     it would enable all versions down to the lowest supported by
+     the library.
+     So we skip this, and stay with the OS default
+  */
+  if(curl_ssl_version_min != CURL_SSLVERSION_DEFAULT) {
+    if(!SSL_CTX_set_min_proto_version(ctx, ossl_ssl_version_min)) {
+      return CURLE_SSL_CONNECT_ERROR;
+    }
+  }
+
+  /* ... then, TLS max version */
+  curl_ssl_version_max = SSL_CONN_CONFIG(version_max);
+
+  /* convert cURL max SSL version option to OpenSSL constant */
+  ossl_ssl_version_max = 0;
+  switch(curl_ssl_version_max) {
+    case CURL_SSLVERSION_MAX_TLSv1_0:
+      ossl_ssl_version_max = TLS1_VERSION;
+      break;
+    case CURL_SSLVERSION_MAX_TLSv1_1:
+      ossl_ssl_version_max = TLS1_1_VERSION;
+      break;
+    case CURL_SSLVERSION_MAX_TLSv1_2:
+      ossl_ssl_version_max = TLS1_2_VERSION;
+      break;
+#ifdef TLS1_3_VERSION
+    case CURL_SSLVERSION_MAX_TLSv1_3:
+      ossl_ssl_version_max = TLS1_3_VERSION;
+      break;
+#endif
+    case CURL_SSLVERSION_MAX_NONE:  /* none selected */
+    case CURL_SSLVERSION_MAX_DEFAULT:  /* max selected */
+    default:
+      /* SSL_CTX_set_max_proto_version states that:
+        setting the maximum to 0 will enable
+        protocol versions up to the highest version
+        supported by the library */
+      ossl_ssl_version_max = 0;
+      break;
+  }
+
+  if(!SSL_CTX_set_max_proto_version(ctx, ossl_ssl_version_max)) {
+    return CURLE_SSL_CONNECT_ERROR;
+  }
+
+  return CURLE_OK;
+}
+#endif
+
+#ifdef OPENSSL_IS_BORINGSSL
+typedef uint32_t ctx_option_t;
+#else
+typedef long ctx_option_t;
+#endif
+
+#if (OPENSSL_VERSION_NUMBER < 0x10100000L) /* 1.1.0 */
 static CURLcode
-set_ssl_version_min_max(long *ctx_options, struct connectdata *conn,
-                        int sockindex)
+set_ssl_version_min_max_legacy(ctx_option_t *ctx_options,
+                              struct connectdata *conn, int sockindex)
 {
 #if (OPENSSL_VERSION_NUMBER < 0x1000100FL) || !defined(TLS1_3_VERSION)
   /* convoluted #if condition just to avoid compiler warnings on unused
@@ -2137,6 +2276,7 @@ set_ssl_version_min_max(long *ctx_options, struct connectdata *conn,
     }
 #else
       (void)sockindex;
+      (void)ctx_options;
       failf(data, OSSL_PACKAGE " was built without TLS 1.3 support");
       return CURLE_NOT_BUILT_IN;
 #endif
@@ -2188,6 +2328,63 @@ set_ssl_version_min_max(long *ctx_options, struct connectdata *conn,
   }
   return CURLE_OK;
 }
+#endif
+
+/* The "new session" callback must return zero if the session can be removed
+ * or non-zero if the session has been put into the session cache.
+ */
+static int ossl_new_session_cb(SSL *ssl, SSL_SESSION *ssl_sessionid)
+{
+  int res = 0;
+  struct connectdata *conn;
+  struct Curl_easy *data;
+  int sockindex;
+  curl_socket_t *sockindex_ptr;
+  int connectdata_idx = ossl_get_ssl_conn_index();
+  int sockindex_idx = ossl_get_ssl_sockindex_index();
+
+  if(connectdata_idx < 0 || sockindex_idx < 0)
+    return 0;
+
+  conn = (struct connectdata*) SSL_get_ex_data(ssl, connectdata_idx);
+  if(!conn)
+    return 0;
+
+  data = conn->data;
+
+  /* The sockindex has been stored as a pointer to an array element */
+  sockindex_ptr = (curl_socket_t*) SSL_get_ex_data(ssl, sockindex_idx);
+  sockindex = (int)(sockindex_ptr - conn->sock);
+
+  if(SSL_SET_OPTION(primary.sessionid)) {
+    bool incache;
+    void *old_ssl_sessionid = NULL;
+
+    Curl_ssl_sessionid_lock(conn);
+    incache = !(Curl_ssl_getsessionid(conn, &old_ssl_sessionid, NULL,
+                                      sockindex));
+    if(incache) {
+      if(old_ssl_sessionid != ssl_sessionid) {
+        infof(data, "old SSL session ID is stale, removing\n");
+        Curl_ssl_delsessionid(conn, old_ssl_sessionid);
+        incache = FALSE;
+      }
+    }
+
+    if(!incache) {
+      if(!Curl_ssl_addsessionid(conn, ssl_sessionid,
+                                      0 /* unknown size */, sockindex)) {
+        /* the session has been put into the session cache */
+        res = 1;
+      }
+      else
+        failf(data, "failed to store ssl session");
+    }
+    Curl_ssl_sessionid_unlock(conn);
+  }
+
+  return res;
+}
 
 static CURLcode ossl_connect_step1(struct connectdata *conn, int sockindex)
 {
@@ -2198,7 +2395,8 @@ static CURLcode ossl_connect_step1(struct connectdata *conn, int sockindex)
   X509_LOOKUP *lookup = NULL;
   curl_socket_t sockfd = conn->sock[sockindex];
   struct ssl_connect_data *connssl = &conn->ssl[sockindex];
-  long ctx_options = 0;
+  ctx_option_t ctx_options = 0;
+
 #ifdef SSL_CTRL_SET_TLSEXT_HOSTNAME
   bool sni;
   const char * const hostname = SSL_IS_PROXY() ? conn->http_proxy.host.name :
@@ -2361,48 +2559,66 @@ static CURLcode ossl_connect_step1(struct connectdata *conn, int sockindex)
 #endif
 
   switch(ssl_version) {
-  case CURL_SSLVERSION_SSLv3:
-    ctx_options |= SSL_OP_NO_SSLv2;
-    ctx_options |= SSL_OP_NO_TLSv1;
-#if OPENSSL_VERSION_NUMBER >= 0x1000100FL
-    ctx_options |= SSL_OP_NO_TLSv1_1;
-    ctx_options |= SSL_OP_NO_TLSv1_2;
-#ifdef TLS1_3_VERSION
-    ctx_options |= SSL_OP_NO_TLSv1_3;
-#endif
+    /* "--sslv2" option means SSLv2 only, disable all others */
+    case CURL_SSLVERSION_SSLv2:
+#if OPENSSL_VERSION_NUMBER >= 0x10100000L /* 1.1.0 */
+      SSL_CTX_set_min_proto_version(BACKEND->ctx, SSL2_VERSION);
+      SSL_CTX_set_max_proto_version(BACKEND->ctx, SSL2_VERSION);
+#else
+      ctx_options |= SSL_OP_NO_SSLv3;
+      ctx_options |= SSL_OP_NO_TLSv1;
+#  if OPENSSL_VERSION_NUMBER >= 0x1000100FL
+      ctx_options |= SSL_OP_NO_TLSv1_1;
+      ctx_options |= SSL_OP_NO_TLSv1_2;
+#    ifdef TLS1_3_VERSION
+      ctx_options |= SSL_OP_NO_TLSv1_3;
+#    endif
+#  endif
 #endif
-    break;
-
-  case CURL_SSLVERSION_DEFAULT:
-  case CURL_SSLVERSION_TLSv1:
-  case CURL_SSLVERSION_TLSv1_0:
-  case CURL_SSLVERSION_TLSv1_1:
-  case CURL_SSLVERSION_TLSv1_2:
-  case CURL_SSLVERSION_TLSv1_3:
-    /* asking for any TLS version as the minimum, means no SSL versions
-       allowed */
-    ctx_options |= SSL_OP_NO_SSLv2;
-    ctx_options |= SSL_OP_NO_SSLv3;
-    result = set_ssl_version_min_max(&ctx_options, conn, sockindex);
-    if(result != CURLE_OK)
-       return result;
-    break;
+      break;
 
-  case CURL_SSLVERSION_SSLv2:
-    ctx_options |= SSL_OP_NO_SSLv3;
-    ctx_options |= SSL_OP_NO_TLSv1;
-#if OPENSSL_VERSION_NUMBER >= 0x1000100FL
-    ctx_options |= SSL_OP_NO_TLSv1_1;
-    ctx_options |= SSL_OP_NO_TLSv1_2;
-#ifdef TLS1_3_VERSION
-    ctx_options |= SSL_OP_NO_TLSv1_3;
+    /* "--sslv3" option means SSLv3 only, disable all others */
+    case CURL_SSLVERSION_SSLv3:
+#if OPENSSL_VERSION_NUMBER >= 0x10100000L /* 1.1.0 */
+      SSL_CTX_set_min_proto_version(BACKEND->ctx, SSL3_VERSION);
+      SSL_CTX_set_max_proto_version(BACKEND->ctx, SSL3_VERSION);
+#else
+      ctx_options |= SSL_OP_NO_SSLv2;
+      ctx_options |= SSL_OP_NO_TLSv1;
+#  if OPENSSL_VERSION_NUMBER >= 0x1000100FL
+      ctx_options |= SSL_OP_NO_TLSv1_1;
+      ctx_options |= SSL_OP_NO_TLSv1_2;
+#    ifdef TLS1_3_VERSION
+      ctx_options |= SSL_OP_NO_TLSv1_3;
+#    endif
+#  endif
 #endif
+      break;
+
+    /* "--tlsv<x.y>" options mean TLS >= version <x.y> */
+    case CURL_SSLVERSION_DEFAULT:
+    case CURL_SSLVERSION_TLSv1: /* TLS >= version 1.0 */
+    case CURL_SSLVERSION_TLSv1_0: /* TLS >= version 1.0 */
+    case CURL_SSLVERSION_TLSv1_1: /* TLS >= version 1.1 */
+    case CURL_SSLVERSION_TLSv1_2: /* TLS >= version 1.2 */
+    case CURL_SSLVERSION_TLSv1_3: /* TLS >= version 1.3 */
+      /* asking for any TLS version as the minimum, means no SSL versions
+        allowed */
+      ctx_options |= SSL_OP_NO_SSLv2;
+      ctx_options |= SSL_OP_NO_SSLv3;
+
+#if (OPENSSL_VERSION_NUMBER >= 0x10100000L) /* 1.1.0 */
+      result = set_ssl_version_min_max(BACKEND->ctx, conn);
+#else
+      result = set_ssl_version_min_max_legacy(&ctx_options, conn, sockindex);
 #endif
-    break;
+      if(result != CURLE_OK)
+        return result;
+      break;
 
-  default:
-    failf(data, "Unrecognized parameter passed via CURLOPT_SSLVERSION");
-    return CURLE_SSL_CONNECT_ERROR;
+    default:
+      failf(data, "Unrecognized parameter passed via CURLOPT_SSLVERSION");
+      return CURLE_SSL_CONNECT_ERROR;
   }
 
   SSL_CTX_set_options(BACKEND->ctx, ctx_options);
@@ -2557,19 +2773,29 @@ static CURLcode ossl_connect_step1(struct connectdata *conn, int sockindex)
     infof(data, "  CRLfile: %s\n", ssl_crlfile);
   }
 
-  /* Try building a chain using issuers in the trusted store first to avoid
-  problems with server-sent legacy intermediates.
-  Newer versions of OpenSSL do alternate chain checking by default which
-  gives us the same fix without as much of a performance hit (slight), so we
-  prefer that if available.
-  https://rt.openssl.org/Ticket/Display.html?id=3621&user=guest&pass=guest
-  */
-#if defined(X509_V_FLAG_TRUSTED_FIRST) && !defined(X509_V_FLAG_NO_ALT_CHAINS)
   if(verifypeer) {
+    /* Try building a chain using issuers in the trusted store first to avoid
+       problems with server-sent legacy intermediates.  Newer versions of
+       OpenSSL do alternate chain checking by default which gives us the same
+       fix without as much of a performance hit (slight), so we prefer that if
+       available.
+       https://rt.openssl.org/Ticket/Display.html?id=3621&user=guest&pass=guest
+    */
+#if defined(X509_V_FLAG_TRUSTED_FIRST) && !defined(X509_V_FLAG_NO_ALT_CHAINS)
     X509_STORE_set_flags(SSL_CTX_get_cert_store(BACKEND->ctx),
                          X509_V_FLAG_TRUSTED_FIRST);
-  }
 #endif
+#ifdef X509_V_FLAG_PARTIAL_CHAIN
+    if(!SSL_SET_OPTION(no_partialchain)) {
+      /* Have intermediate certificates in the trust store be treated as
+         trust-anchors, in the same way as self-signed root CA certificates
+         are. This allows users to verify servers using the intermediate cert
+         only, instead of needing the whole chain. */
+      X509_STORE_set_flags(SSL_CTX_get_cert_store(BACKEND->ctx),
+                           X509_V_FLAG_PARTIAL_CHAIN);
+    }
+#endif
+  }
 
   /* SSL always tries to verify the peer, this only says whether it should
    * fail to connect if the verification fails, or if it should continue
@@ -2585,10 +2811,20 @@ static CURLcode ossl_connect_step1(struct connectdata *conn, int sockindex)
   }
 #endif
 
+  /* Enable the session cache because it's a prerequisite for the "new session"
+   * callback. Use the "external storage" mode to avoid that OpenSSL creates
+   * an internal session cache.
+   */
+  SSL_CTX_set_session_cache_mode(BACKEND->ctx,
+      SSL_SESS_CACHE_CLIENT | SSL_SESS_CACHE_NO_INTERNAL);
+  SSL_CTX_sess_set_new_cb(BACKEND->ctx, ossl_new_session_cb);
+
   /* give application a chance to interfere with SSL set up. */
   if(data->set.ssl.fsslctx) {
+    Curl_set_in_callback(data, true);
     result = (*data->set.ssl.fsslctx)(data, BACKEND->ctx,
                                       data->set.ssl.fsslctxp);
+    Curl_set_in_callback(data, false);
     if(result) {
       failf(data, "error signaled by ssl ctx callback");
       return result;
@@ -2610,6 +2846,10 @@ static CURLcode ossl_connect_step1(struct connectdata *conn, int sockindex)
     SSL_set_tlsext_status_type(BACKEND->handle, TLSEXT_STATUSTYPE_ocsp);
 #endif
 
+#if defined(OPENSSL_IS_BORINGSSL) && defined(ALLOW_RENEG)
+  SSL_set_renegotiate_mode(BACKEND->handle, ssl_renegotiate_freely);
+#endif
+
   SSL_set_connect_state(BACKEND->handle);
 
   BACKEND->server_cert = 0x0;
@@ -2627,6 +2867,15 @@ static CURLcode ossl_connect_step1(struct connectdata *conn, int sockindex)
   /* Check if there's a cached ID we can/should use here! */
   if(SSL_SET_OPTION(primary.sessionid)) {
     void *ssl_sessionid = NULL;
+    int connectdata_idx = ossl_get_ssl_conn_index();
+    int sockindex_idx = ossl_get_ssl_sockindex_index();
+
+    if(connectdata_idx >= 0 && sockindex_idx >= 0) {
+      /* Store the data needed for the "new session" callback.
+       * The sockindex is stored as a pointer to an array element. */
+      SSL_set_ex_data(BACKEND->handle, connectdata_idx, conn);
+      SSL_set_ex_data(BACKEND->handle, sockindex_idx, conn->sock + sockindex);
+    }
 
     Curl_ssl_sessionid_lock(conn);
     if(!Curl_ssl_getsessionid(conn, &ssl_sessionid, NULL, sockindex)) {
@@ -2699,6 +2948,12 @@ static CURLcode ossl_connect_step2(struct connectdata *conn, int sockindex)
       connssl->connecting_state = ssl_connect_2_writing;
       return CURLE_OK;
     }
+#ifdef SSL_ERROR_WANT_ASYNC
+    if(SSL_ERROR_WANT_ASYNC == detail) {
+      connssl->connecting_state = ssl_connect_2;
+      return CURLE_OK;
+    }
+#endif
     else {
       /* untreated error */
       unsigned long errdetail;
@@ -2721,14 +2976,14 @@ static CURLcode ossl_connect_step2(struct connectdata *conn, int sockindex)
 
       if((lib == ERR_LIB_SSL) &&
          (reason == SSL_R_CERTIFICATE_VERIFY_FAILED)) {
-        result = CURLE_SSL_CACERT;
+        result = CURLE_PEER_FAILED_VERIFICATION;
 
         lerr = SSL_get_verify_result(BACKEND->handle);
         if(lerr != X509_V_OK) {
           *certverifyresult = lerr;
-          snprintf(error_buffer, sizeof(error_buffer),
-                   "SSL certificate problem: %s",
-                   X509_verify_cert_error_string(lerr));
+          msnprintf(error_buffer, sizeof(error_buffer),
+                    "SSL certificate problem: %s",
+                    X509_verify_cert_error_string(lerr));
         }
         else
           /* strcpy() is fine here as long as the string fits within
@@ -2750,8 +3005,13 @@ static CURLcode ossl_connect_step2(struct connectdata *conn, int sockindex)
         const char * const hostname = SSL_IS_PROXY() ?
           conn->http_proxy.host.name : conn->host.name;
         const long int port = SSL_IS_PROXY() ? conn->port : conn->remote_port;
+        char extramsg[80]="";
+        int sockerr = SOCKERRNO;
+        if(sockerr && detail == SSL_ERROR_SYSCALL)
+          Curl_strerror(sockerr, extramsg, sizeof(extramsg));
         failf(data, OSSL_PACKAGE " SSL_connect: %s in connection to %s:%ld ",
-              SSL_ERROR_to_str(detail), hostname, port);
+              extramsg[0] ? extramsg : SSL_ERROR_to_str(detail),
+              hostname, port);
         return result;
       }
 
@@ -2795,6 +3055,9 @@ static CURLcode ossl_connect_step2(struct connectdata *conn, int sockindex)
       }
       else
         infof(data, "ALPN, server did not agree to a protocol\n");
+
+      Curl_multiuse_state(conn, conn->negnpn == CURL_HTTP_VERSION_2 ?
+                          BUNDLE_MULTIPLEX : BUNDLE_NO_MULTIUSE);
     }
 #endif
 
@@ -2824,7 +3087,7 @@ do {                              \
   Curl_ssl_push_certinfo_len(data, _num, _label, ptr, info_len); \
   if(1 != BIO_reset(mem))                                        \
     break;                                                       \
-} WHILE_FALSE
+} while(0)
 
 static void pubkey_show(struct Curl_easy *data,
                         BIO *mem,
@@ -2839,7 +3102,7 @@ static void pubkey_show(struct Curl_easy *data,
   char *ptr;
   char namebuf[32];
 
-  snprintf(namebuf, sizeof(namebuf), "%s(%s)", type, name);
+  msnprintf(namebuf, sizeof(namebuf), "%s(%s)", type, name);
 
   if(bn)
     BN_print(mem, bn);
@@ -2856,7 +3119,7 @@ do {                              \
   if(_type->_name) { \
     pubkey_show(data, mem, _num, #_type, #_name, _type->_name); \
   } \
-} WHILE_FALSE
+} while(0)
 #endif
 
 static int X509V3_ext(struct Curl_easy *data,
@@ -2900,8 +3163,8 @@ static int X509V3_ext(struct Curl_easy *data,
       while((j<(size_t)biomem->length) && (biomem->data[j] == ' '))
         j++;
       if(j<(size_t)biomem->length)
-        ptr += snprintf(ptr, sizeof(buf)-(ptr-buf), "%s%c", sep,
-                        biomem->data[j]);
+        ptr += msnprintf(ptr, sizeof(buf)-(ptr-buf), "%s%c", sep,
+                         biomem->data[j]);
     }
 
     Curl_ssl_push_certinfo(data, certnum, namebuf, buf);
@@ -2912,6 +3175,12 @@ static int X509V3_ext(struct Curl_easy *data,
   return 0; /* all is fine */
 }
 
+#ifdef OPENSSL_IS_BORINGSSL
+typedef size_t numcert_t;
+#else
+typedef int numcert_t;
+#endif
+
 static CURLcode get_cert_chain(struct connectdata *conn,
                                struct ssl_connect_data *connssl)
 
@@ -2920,7 +3189,7 @@ static CURLcode get_cert_chain(struct connectdata *conn,
   STACK_OF(X509) *sk;
   int i;
   struct Curl_easy *data = conn->data;
-  int numcerts;
+  numcert_t numcerts;
   BIO *mem;
 
   sk = SSL_get_peer_cert_chain(BACKEND->handle);
@@ -2930,14 +3199,14 @@ static CURLcode get_cert_chain(struct connectdata *conn,
 
   numcerts = sk_X509_num(sk);
 
-  result = Curl_ssl_init_certinfo(data, numcerts);
+  result = Curl_ssl_init_certinfo(data, (int)numcerts);
   if(result) {
     return result;
   }
 
   mem = BIO_new(BIO_s_mem());
 
-  for(i = 0; i < numcerts; i++) {
+  for(i = 0; i < (int)numcerts; i++) {
     ASN1_INTEGER *num;
     X509 *x = sk_X509_value(sk, i);
     EVP_PKEY *pubkey = NULL;
@@ -2963,18 +3232,25 @@ static CURLcode get_cert_chain(struct connectdata *conn,
 
 #if defined(HAVE_X509_GET0_SIGNATURE) && defined(HAVE_X509_GET0_EXTENSIONS)
     {
-      const X509_ALGOR *palg = NULL;
-      ASN1_STRING *a = ASN1_STRING_new();
-      if(a) {
-        X509_get0_signature(&psig, &palg, x);
-        X509_signature_print(mem, ARG2_X509_signature_print palg, a);
-        ASN1_STRING_free(a);
-
-        if(palg) {
-          i2a_ASN1_OBJECT(mem, palg->algorithm);
+      const X509_ALGOR *sigalg = NULL;
+      X509_PUBKEY *xpubkey = NULL;
+      ASN1_OBJECT *pubkeyoid = NULL;
+
+      X509_get0_signature(&psig, &sigalg, x);
+      if(sigalg) {
+        i2a_ASN1_OBJECT(mem, sigalg->algorithm);
+        push_certinfo("Signature Algorithm", i);
+      }
+
+      xpubkey = X509_get_X509_PUBKEY(x);
+      if(xpubkey) {
+        X509_PUBKEY_get0_param(&pubkeyoid, NULL, NULL, NULL, xpubkey);
+        if(pubkeyoid) {
+          i2a_ASN1_OBJECT(mem, pubkeyoid);
           push_certinfo("Public Key Algorithm", i);
         }
       }
+
       X509V3_ext(data, i, X509_get0_extensions(x));
     }
 #else
@@ -3026,7 +3302,7 @@ static CURLcode get_cert_chain(struct connectdata *conn,
           const BIGNUM *e;
 
           RSA_get0_key(rsa, &n, &e, NULL);
-          BN_print(mem, n);
+          BIO_printf(mem, "%d", BN_num_bits(n));
           push_certinfo("RSA Public Key", i);
           print_pubkey_BN(rsa, n, i);
           print_pubkey_BN(rsa, e, i);
@@ -3101,11 +3377,6 @@ static CURLcode get_cert_chain(struct connectdata *conn,
 #endif
         break;
       }
-#if 0
-      case EVP_PKEY_EC: /* symbol not present in OpenSSL 0.9.6 */
-        /* left TODO */
-        break;
-#endif
       }
       EVP_PKEY_free(pubkey);
     }
@@ -3156,7 +3427,6 @@ static CURLcode pkp_pin_peer_pubkey(struct Curl_easy *data, X509* cert,
     if(len1 < 1)
       break; /* failed */
 
-    /* https://www.openssl.org/docs/crypto/buffer.html */
     buff1 = temp = malloc(len1);
     if(!buff1)
       break; /* failed */
@@ -3178,7 +3448,6 @@ static CURLcode pkp_pin_peer_pubkey(struct Curl_easy *data, X509* cert,
     result = Curl_pin_peer_pubkey(data, pinnedpubkey, buff1, len1);
   } while(0);
 
-  /* https://www.openssl.org/docs/crypto/buffer.html */
   if(buff1)
     free(buff1);
 
@@ -3214,20 +3483,8 @@ static CURLcode servercert(struct connectdata *conn,
     /* we've been asked to gather certificate info! */
     (void)get_cert_chain(conn, connssl);
 
-  fp = BIO_new(BIO_s_file());
-  if(fp == NULL) {
-    failf(data,
-          "BIO_new return NULL, " OSSL_PACKAGE
-          " error %s",
-          ossl_strerror(ERR_get_error(), error_buffer,
-                        sizeof(error_buffer)) );
-    BIO_free(mem);
-    return CURLE_OUT_OF_MEMORY;
-  }
-
   BACKEND->server_cert = SSL_get_peer_certificate(BACKEND->handle);
   if(!BACKEND->server_cert) {
-    BIO_free(fp);
     BIO_free(mem);
     if(!strict)
       return CURLE_OK;
@@ -3262,7 +3519,6 @@ static CURLcode servercert(struct connectdata *conn,
   if(SSL_CONN_CONFIG(verifyhost)) {
     result = verifyhost(conn, BACKEND->server_cert);
     if(result) {
-      BIO_free(fp);
       X509_free(BACKEND->server_cert);
       BACKEND->server_cert = NULL;
       return result;
@@ -3284,6 +3540,18 @@ static CURLcode servercert(struct connectdata *conn,
 
     /* e.g. match issuer name with provided issuer certificate */
     if(SSL_SET_OPTION(issuercert)) {
+      fp = BIO_new(BIO_s_file());
+      if(fp == NULL) {
+        failf(data,
+              "BIO_new return NULL, " OSSL_PACKAGE
+              " error %s",
+              ossl_strerror(ERR_get_error(), error_buffer,
+                            sizeof(error_buffer)) );
+        X509_free(BACKEND->server_cert);
+        BACKEND->server_cert = NULL;
+        return CURLE_OUT_OF_MEMORY;
+      }
+
       if(BIO_read_filename(fp, SSL_SET_OPTION(issuercert)) <= 0) {
         if(strict)
           failf(data, "SSL: Unable to open issuer cert (%s)",
@@ -3319,6 +3587,7 @@ static CURLcode servercert(struct connectdata *conn,
 
       infof(data, " SSL certificate issuer check ok (%s)\n",
             SSL_SET_OPTION(issuercert));
+      BIO_free(fp);
       X509_free(issuer);
     }
 
@@ -3347,7 +3616,6 @@ static CURLcode servercert(struct connectdata *conn,
   if(SSL_CONN_CONFIG(verifystatus)) {
     result = verifystatus(conn, connssl);
     if(result) {
-      BIO_free(fp);
       X509_free(BACKEND->server_cert);
       BACKEND->server_cert = NULL;
       return result;
@@ -3367,7 +3635,6 @@ static CURLcode servercert(struct connectdata *conn,
       failf(data, "SSL: public key does not match pinned public key!");
   }
 
-  BIO_free(fp);
   X509_free(BACKEND->server_cert);
   BACKEND->server_cert = NULL;
   connssl->connecting_state = ssl_connect_done;
@@ -3378,52 +3645,10 @@ static CURLcode servercert(struct connectdata *conn,
 static CURLcode ossl_connect_step3(struct connectdata *conn, int sockindex)
 {
   CURLcode result = CURLE_OK;
-  struct Curl_easy *data = conn->data;
   struct ssl_connect_data *connssl = &conn->ssl[sockindex];
 
   DEBUGASSERT(ssl_connect_3 == connssl->connecting_state);
 
-  if(SSL_SET_OPTION(primary.sessionid)) {
-    bool incache;
-    SSL_SESSION *our_ssl_sessionid;
-    void *old_ssl_sessionid = NULL;
-
-    our_ssl_sessionid = SSL_get1_session(BACKEND->handle);
-
-    /* SSL_get1_session() will increment the reference count and the session
-        will stay in memory until explicitly freed with SSL_SESSION_free(3),
-        regardless of its state. */
-
-    Curl_ssl_sessionid_lock(conn);
-    incache = !(Curl_ssl_getsessionid(conn, &old_ssl_sessionid, NULL,
-                                      sockindex));
-    if(incache) {
-      if(old_ssl_sessionid != our_ssl_sessionid) {
-        infof(data, "old SSL session ID is stale, removing\n");
-        Curl_ssl_delsessionid(conn, old_ssl_sessionid);
-        incache = FALSE;
-      }
-    }
-
-    if(!incache) {
-      result = Curl_ssl_addsessionid(conn, our_ssl_sessionid,
-                                      0 /* unknown size */, sockindex);
-      if(result) {
-        Curl_ssl_sessionid_unlock(conn);
-        failf(data, "failed to store ssl session");
-        return result;
-      }
-    }
-    else {
-      /* Session was incache, so refcount already incremented earlier.
-        * Avoid further increments with each SSL_get1_session() call.
-        * This does not free the session as refcount remains > 0
-        */
-      SSL_SESSION_free(our_ssl_sessionid);
-    }
-    Curl_ssl_sessionid_unlock(conn);
-  }
-
   /*
    * We check certificates to authenticate the server; otherwise we risk
    * man-in-the-middle attack; NEVERTHELESS, if we're told explicitly not to
@@ -3452,7 +3677,7 @@ static CURLcode ossl_connect_common(struct connectdata *conn,
   struct Curl_easy *data = conn->data;
   struct ssl_connect_data *connssl = &conn->ssl[sockindex];
   curl_socket_t sockfd = conn->sock[sockindex];
-  time_t timeout_ms;
+  timediff_t timeout_ms;
   int what;
 
   /* check if the connection has already been established */
@@ -3499,7 +3724,7 @@ static CURLcode ossl_connect_common(struct connectdata *conn,
         connssl->connecting_state?sockfd:CURL_SOCKET_BAD;
 
       what = Curl_socket_check(readfd, CURL_SOCKET_BAD, writefd,
-                               nonblocking?0:timeout_ms);
+                               nonblocking?0:(time_t)timeout_ms);
       if(what < 0) {
         /* fatal error */
         failf(data, "select/poll on SSL socket, errno: %d", SOCKERRNO);
@@ -3623,10 +3848,22 @@ static ssize_t ossl_send(struct connectdata *conn,
       *curlcode = CURLE_AGAIN;
       return -1;
     case SSL_ERROR_SYSCALL:
-      failf(conn->data, "SSL_write() returned SYSCALL, errno = %d",
-            SOCKERRNO);
-      *curlcode = CURLE_SEND_ERROR;
-      return -1;
+      {
+        int sockerr = SOCKERRNO;
+        sslerror = ERR_get_error();
+        if(sslerror)
+          ossl_strerror(sslerror, error_buffer, sizeof(error_buffer));
+        else if(sockerr)
+          Curl_strerror(sockerr, error_buffer, sizeof(error_buffer));
+        else {
+          strncpy(error_buffer, SSL_ERROR_to_str(err), sizeof(error_buffer));
+          error_buffer[sizeof(error_buffer) - 1] = '\0';
+        }
+        failf(conn->data, OSSL_PACKAGE " SSL_write: %s, errno %d",
+              error_buffer, sockerr);
+        *curlcode = CURLE_SEND_ERROR;
+        return -1;
+      }
     case SSL_ERROR_SSL:
       /*  A failure in the SSL library occurred, usually a protocol error.
           The OpenSSL error queue contains more information on the error. */
@@ -3678,7 +3915,13 @@ static ssize_t ossl_recv(struct connectdata *conn, /* connection data */
 
     switch(err) {
     case SSL_ERROR_NONE: /* this is not an error */
+      break;
     case SSL_ERROR_ZERO_RETURN: /* no more data */
+      /* close_notify alert */
+      if(num == FIRSTSOCKET)
+        /* mark the connection for close if it is indeed the control
+           connection */
+        connclose(conn, "TLS close_notify");
       break;
     case SSL_ERROR_WANT_READ:
     case SSL_ERROR_WANT_WRITE:
@@ -3693,14 +3936,44 @@ static ssize_t ossl_recv(struct connectdata *conn, /* connection data */
       if((nread < 0) || sslerror) {
         /* If the return code was negative or there actually is an error in the
            queue */
+        int sockerr = SOCKERRNO;
+        if(sslerror)
+          ossl_strerror(sslerror, error_buffer, sizeof(error_buffer));
+        else if(sockerr && err == SSL_ERROR_SYSCALL)
+          Curl_strerror(sockerr, error_buffer, sizeof(error_buffer));
+        else {
+          strncpy(error_buffer, SSL_ERROR_to_str(err), sizeof(error_buffer));
+          error_buffer[sizeof(error_buffer) - 1] = '\0';
+        }
         failf(conn->data, OSSL_PACKAGE " SSL_read: %s, errno %d",
-              (sslerror ?
-               ossl_strerror(sslerror, error_buffer, sizeof(error_buffer)) :
-               SSL_ERROR_to_str(err)),
-              SOCKERRNO);
+              error_buffer, sockerr);
+        *curlcode = CURLE_RECV_ERROR;
+        return -1;
+      }
+      /* For debug builds be a little stricter and error on any
+         SSL_ERROR_SYSCALL. For example a server may have closed the connection
+         abruptly without a close_notify alert. For compatibility with older
+         peers we don't do this by default. #4624
+
+         We can use this to gauge how many users may be affected, and
+         if it goes ok eventually transition to allow in dev and release with
+         the newest OpenSSL: #if (OPENSSL_VERSION_NUMBER >= 0x10101000L) */
+#ifdef DEBUGBUILD
+      if(err == SSL_ERROR_SYSCALL) {
+        int sockerr = SOCKERRNO;
+        if(sockerr)
+          Curl_strerror(sockerr, error_buffer, sizeof(error_buffer));
+        else {
+          msnprintf(error_buffer, sizeof(error_buffer),
+                    "Connection closed abruptly");
+        }
+        failf(conn->data, OSSL_PACKAGE " SSL_read: %s, errno %d"
+              " (Fatal because this is a curl debug build)",
+              error_buffer, sockerr);
         *curlcode = CURLE_RECV_ERROR;
         return -1;
       }
+#endif
     }
   }
   return nread;
@@ -3708,9 +3981,36 @@ static ssize_t ossl_recv(struct connectdata *conn, /* connection data */
 
 static size_t Curl_ossl_version(char *buffer, size_t size)
 {
-#ifdef OPENSSL_IS_BORINGSSL
-  return snprintf(buffer, size, OSSL_PACKAGE);
-#else /* OPENSSL_IS_BORINGSSL */
+#ifdef LIBRESSL_VERSION_NUMBER
+#if LIBRESSL_VERSION_NUMBER < 0x2070100fL
+  return msnprintf(buffer, size, "%s/%lx.%lx.%lx",
+                   OSSL_PACKAGE,
+                   (LIBRESSL_VERSION_NUMBER>>28)&0xf,
+                   (LIBRESSL_VERSION_NUMBER>>20)&0xff,
+                   (LIBRESSL_VERSION_NUMBER>>12)&0xff);
+#else /* OpenSSL_version() first appeared in LibreSSL 2.7.1 */
+  char *p;
+  int count;
+  const char *ver = OpenSSL_version(OPENSSL_VERSION);
+  const char expected[] = OSSL_PACKAGE " "; /* ie "LibreSSL " */
+  if(Curl_strncasecompare(ver, expected, sizeof(expected) - 1)) {
+    ver += sizeof(expected) - 1;
+  }
+  count = msnprintf(buffer, size, "%s/%s", OSSL_PACKAGE, ver);
+  for(p = buffer; *p; ++p) {
+    if(ISSPACE(*p))
+      *p = '_';
+  }
+  return count;
+#endif
+#elif defined(OPENSSL_IS_BORINGSSL)
+  return msnprintf(buffer, size, OSSL_PACKAGE);
+#elif defined(HAVE_OPENSSL_VERSION) && defined(OPENSSL_VERSION_STRING)
+  return msnprintf(buffer, size, "%s/%s",
+                   OSSL_PACKAGE, OpenSSL_version(OPENSSL_VERSION_STRING));
+#else
+  /* not LibreSSL, BoringSSL and not using OpenSSL_version */
+
   char sub[3];
   unsigned long ssleay_value;
   sub[2]='\0';
@@ -3736,12 +4036,16 @@ static size_t Curl_ossl_version(char *buffer, size_t size)
       sub[0]='\0';
   }
 
-  return snprintf(buffer, size, "%s/%lx.%lx.%lx%s",
-                  OSSL_PACKAGE,
-                  (ssleay_value>>28)&0xf,
-                  (ssleay_value>>20)&0xff,
-                  (ssleay_value>>12)&0xff,
-                  sub);
+  return msnprintf(buffer, size, "%s/%lx.%lx.%lx%s"
+#ifdef OPENSSL_FIPS
+                   "-fips"
+#endif
+                   ,
+                   OSSL_PACKAGE,
+                   (ssleay_value>>28)&0xf,
+                   (ssleay_value>>20)&0xff,
+                   (ssleay_value>>12)&0xff,
+                   sub);
 #endif /* OPENSSL_IS_BORINGSSL */
 }
 
index 27af0cc..9e7dd90 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 2012 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 2012 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  * Copyright (C) 2010 - 2011, Hoi-Ho Chan, <hoiho.chan@gmail.com>
  *
  * This software is licensed as described in the file COPYING, which
@@ -55,6 +55,7 @@
 #include "select.h"
 #include "strcase.h"
 #include "polarssl_threadlock.h"
+#include "multiif.h"
 #include "curl_printf.h"
 #include "curl_memory.h"
 /* The last #include file should be: */
@@ -497,7 +498,7 @@ polarssl_connect_step2(struct connectdata *conn,
 
     if(ret & BADCERT_REVOKED) {
       failf(data, "Cert verify failed: BADCERT_REVOKED");
-      return CURLE_SSL_CACERT;
+      return CURLE_PEER_FAILED_VERIFICATION;
     }
 
     if(ret & BADCERT_CN_MISMATCH)
@@ -593,6 +594,8 @@ polarssl_connect_step2(struct connectdata *conn,
     }
     else
       infof(data, "ALPN, server did not agree to a protocol\n");
+    Curl_multiuse_state(conn, conn->negnpn == CURL_HTTP_VERSION_2 ?
+                        BUNDLE_MULTIPLEX : BUNDLE_NO_MULTIUSE);
   }
 #endif
 
@@ -716,9 +719,9 @@ static void Curl_polarssl_session_free(void *ptr)
 static size_t Curl_polarssl_version(char *buffer, size_t size)
 {
   unsigned int version = version_get_number();
-  return snprintf(buffer, size, "%s/%d.%d.%d",
-                  version >= 0x01030A00?"mbedTLS":"PolarSSL",
-                  version>>24, (version>>16)&0xff, (version>>8)&0xff);
+  return msnprintf(buffer, size, "%s/%d.%d.%d",
+                   version >= 0x01030A00?"mbedTLS":"PolarSSL",
+                   version>>24, (version>>16)&0xff, (version>>8)&0xff);
 }
 
 static CURLcode
@@ -731,7 +734,7 @@ polarssl_connect_common(struct connectdata *conn,
   struct Curl_easy *data = conn->data;
   struct ssl_connect_data *connssl = &conn->ssl[sockindex];
   curl_socket_t sockfd = conn->sock[sockindex];
-  long timeout_ms;
+  timediff_t timeout_ms;
   int what;
 
   /* check if the connection has already been established */
@@ -778,7 +781,7 @@ polarssl_connect_common(struct connectdata *conn,
         connssl->connecting_state?sockfd:CURL_SOCKET_BAD;
 
       what = Curl_socket_check(readfd, CURL_SOCKET_BAD, writefd,
-                               nonblocking?0:timeout_ms);
+                               nonblocking?0:(time_t)timeout_ms);
       if(what < 0) {
         /* fatal error */
         failf(data, "select/poll on SSL socket, errno: %d", SOCKERRNO);
@@ -908,9 +911,7 @@ const struct Curl_ssl Curl_ssl_polarssl = {
   Curl_none_check_cxn,               /* check_cxn */
   Curl_none_shutdown,                /* shutdown */
   Curl_polarssl_data_pending,        /* data_pending */
-  /* This might cause libcurl to use a weeker random!
-   * TODO: use Polarssl's CTR-DRBG or HMAC-DRBG
-  */
+  /* This might cause libcurl to use a weeker random! */
   Curl_none_random,                  /* random */
   Curl_none_cert_status_request,     /* cert_status_request */
   Curl_polarssl_connect,             /* connect */
index 23c3636..f36f24f 100644 (file)
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 2012 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 2012 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  * Copyright (C) 2010, Hoi-Ho Chan, <hoiho.chan@gmail.com>
  *
  * This software is licensed as described in the file COPYING, which
index dd5fbd7..4e269c8 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 2013-2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 2013 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  * Copyright (C) 2010, 2011, Hoi-Ho Chan, <hoiho.chan@gmail.com>
  *
  * This software is licensed as described in the file COPYING, which
 #include "curl_setup.h"
 
 #if (defined(USE_POLARSSL) || defined(USE_MBEDTLS)) && \
-    (defined(USE_THREADS_POSIX) || defined(USE_THREADS_WIN32))
-
-#if defined(USE_THREADS_POSIX)
-#  ifdef HAVE_PTHREAD_H
-#    include <pthread.h>
-#  endif
-#elif defined(USE_THREADS_WIN32)
-#  ifdef HAVE_PROCESS_H
-#    include <process.h>
-#  endif
+    ((defined(USE_THREADS_POSIX) && defined(HAVE_PTHREAD_H)) || \
+     (defined(USE_THREADS_WIN32) && defined(HAVE_PROCESS_H)))
+
+#if defined(USE_THREADS_POSIX) && defined(HAVE_PTHREAD_H)
+#  include <pthread.h>
+#  define POLARSSL_MUTEX_T pthread_mutex_t
+#elif defined(USE_THREADS_WIN32) && defined(HAVE_PROCESS_H)
+#  include <process.h>
+#  define POLARSSL_MUTEX_T HANDLE
 #endif
 
 #include "polarssl_threadlock.h"
@@ -50,25 +49,23 @@ static POLARSSL_MUTEX_T *mutex_buf = NULL;
 int Curl_polarsslthreadlock_thread_setup(void)
 {
   int i;
-  int ret;
 
   mutex_buf = calloc(NUMT * sizeof(POLARSSL_MUTEX_T), 1);
   if(!mutex_buf)
     return 0;     /* error, no number of threads defined */
 
-#ifdef HAVE_PTHREAD_H
   for(i = 0;  i < NUMT;  i++) {
+    int ret;
+#if defined(USE_THREADS_POSIX) && defined(HAVE_PTHREAD_H)
     ret = pthread_mutex_init(&mutex_buf[i], NULL);
     if(ret)
       return 0; /* pthread_mutex_init failed */
-  }
-#elif defined(HAVE_PROCESS_H)
-  for(i = 0;  i < NUMT;  i++) {
+#elif defined(USE_THREADS_WIN32) && defined(HAVE_PROCESS_H)
     mutex_buf[i] = CreateMutex(0, FALSE, 0);
     if(mutex_buf[i] == 0)
       return 0;  /* CreateMutex failed */
+#endif /* USE_THREADS_POSIX && HAVE_PTHREAD_H */
   }
-#endif /* HAVE_PTHREAD_H */
 
   return 1; /* OK */
 }
@@ -76,24 +73,22 @@ int Curl_polarsslthreadlock_thread_setup(void)
 int Curl_polarsslthreadlock_thread_cleanup(void)
 {
   int i;
-  int ret;
 
   if(!mutex_buf)
     return 0; /* error, no threads locks defined */
 
-#ifdef HAVE_PTHREAD_H
   for(i = 0; i < NUMT; i++) {
+    int ret;
+#if defined(USE_THREADS_POSIX) && defined(HAVE_PTHREAD_H)
     ret = pthread_mutex_destroy(&mutex_buf[i]);
     if(ret)
       return 0; /* pthread_mutex_destroy failed */
-  }
-#elif defined(HAVE_PROCESS_H)
-  for(i = 0; i < NUMT; i++) {
+#elif defined(USE_THREADS_WIN32) && defined(HAVE_PROCESS_H)
     ret = CloseHandle(mutex_buf[i]);
     if(!ret)
       return 0; /* CloseHandle failed */
+#endif /* USE_THREADS_POSIX && HAVE_PTHREAD_H */
   }
-#endif /* HAVE_PTHREAD_H */
   free(mutex_buf);
   mutex_buf = NULL;
 
@@ -102,51 +97,47 @@ int Curl_polarsslthreadlock_thread_cleanup(void)
 
 int Curl_polarsslthreadlock_lock_function(int n)
 {
-  int ret;
-#ifdef HAVE_PTHREAD_H
   if(n < NUMT) {
+    int ret;
+#if defined(USE_THREADS_POSIX) && defined(HAVE_PTHREAD_H)
     ret = pthread_mutex_lock(&mutex_buf[n]);
     if(ret) {
       DEBUGF(fprintf(stderr,
                      "Error: polarsslthreadlock_lock_function failed\n"));
       return 0; /* pthread_mutex_lock failed */
     }
-  }
-#elif defined(HAVE_PROCESS_H)
-  if(n < NUMT) {
+#elif defined(USE_THREADS_WIN32) && defined(HAVE_PROCESS_H)
     ret = (WaitForSingleObject(mutex_buf[n], INFINITE) == WAIT_FAILED?1:0);
     if(ret) {
       DEBUGF(fprintf(stderr,
                      "Error: polarsslthreadlock_lock_function failed\n"));
       return 0; /* pthread_mutex_lock failed */
     }
+#endif /* USE_THREADS_POSIX && HAVE_PTHREAD_H */
   }
-#endif /* HAVE_PTHREAD_H */
   return 1; /* OK */
 }
 
 int Curl_polarsslthreadlock_unlock_function(int n)
 {
-  int ret;
-#ifdef HAVE_PTHREAD_H
   if(n < NUMT) {
+    int ret;
+#if defined(USE_THREADS_POSIX) && defined(HAVE_PTHREAD_H)
     ret = pthread_mutex_unlock(&mutex_buf[n]);
     if(ret) {
       DEBUGF(fprintf(stderr,
                      "Error: polarsslthreadlock_unlock_function failed\n"));
       return 0; /* pthread_mutex_unlock failed */
     }
-  }
-#elif defined(HAVE_PROCESS_H)
-  if(n < NUMT) {
+#elif defined(USE_THREADS_WIN32) && defined(HAVE_PROCESS_H)
     ret = ReleaseMutex(mutex_buf[n]);
     if(!ret) {
       DEBUGF(fprintf(stderr,
                      "Error: polarsslthreadlock_unlock_function failed\n"));
       return 0; /* pthread_mutex_lock failed */
     }
+#endif /* USE_THREADS_POSIX && HAVE_PTHREAD_H */
   }
-#endif /* HAVE_PTHREAD_H */
   return 1; /* OK */
 }
 
index dda5359..c1900bf 100644 (file)
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 2013-2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 2013 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  * Copyright (C) 2010, Hoi-Ho Chan, <hoiho.chan@gmail.com>
  *
  * This software is licensed as described in the file COPYING, which
 
 #if (defined USE_POLARSSL) || (defined USE_MBEDTLS)
 
-#if defined(USE_THREADS_POSIX)
-#  define POLARSSL_MUTEX_T       pthread_mutex_t
-#elif defined(USE_THREADS_WIN32)
-#  define POLARSSL_MUTEX_T       HANDLE
-#endif
-
-#if defined(USE_THREADS_POSIX) || defined(USE_THREADS_WIN32)
+#if (defined(USE_THREADS_POSIX) && defined(HAVE_PTHREAD_H)) || \
+    (defined(USE_THREADS_WIN32) && defined(HAVE_PROCESS_H))
 
 int Curl_polarsslthreadlock_thread_setup(void);
 int Curl_polarsslthreadlock_thread_cleanup(void);
index e442692..dc58ed0 100644 (file)
@@ -7,7 +7,7 @@
  *
  * Copyright (C) 2012 - 2016, Marc Hoersken, <info@marc-hoersken.de>
  * Copyright (C) 2012, Mark Salisbury, <mark.salisbury@hp.com>
- * Copyright (C) 2012 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 2012 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -23,9 +23,8 @@
  ***************************************************************************/
 
 /*
- * Source file for all SChannel-specific code for the TLS/SSL layer. No code
+ * Source file for all Schannel-specific code for the TLS/SSL layer. No code
  * but vtls.c should ever call or use these functions.
- *
  */
 
 /*
@@ -59,6 +58,7 @@
 #include "warnless.h"
 #include "x509asn1.h"
 #include "curl_printf.h"
+#include "multiif.h"
 #include "system_win32.h"
 
  /* The last #include file should be: */
@@ -196,7 +196,7 @@ set_ssl_version_min_max(SCHANNEL_CRED *schannel_cred, struct connectdata *conn)
         schannel_cred->grbitEnabledProtocols |= SP_PROT_TLS1_2_CLIENT;
         break;
       case CURL_SSLVERSION_TLSv1_3:
-        failf(data, "Schannel: TLS 1.3 is not yet supported");
+        failf(data, "schannel: TLS 1.3 is not yet supported");
         return CURLE_SSL_CONNECT_ERROR;
     }
   }
@@ -325,6 +325,9 @@ get_alg_id_by_name(char *name)
 #ifdef CALG_ECDSA
   CIPHEROPTION(CALG_ECDSA);
 #endif
+#ifdef CALG_ECDH_EPHEM
+  CIPHEROPTION(CALG_ECDH_EPHEM);
+#endif
   return 0;
 }
 
@@ -357,6 +360,7 @@ get_cert_location(TCHAR *path, DWORD *store_name, TCHAR **store_path,
                   TCHAR **thumbprint)
 {
   TCHAR *sep;
+  TCHAR *store_path_start;
   size_t store_name_len;
 
   sep = _tcschr(path, TEXT('\\'));
@@ -387,13 +391,17 @@ get_cert_location(TCHAR *path, DWORD *store_name, TCHAR **store_path,
   else
     return CURLE_SSL_CERTPROBLEM;
 
-  *store_path = sep + 1;
+  store_path_start = sep + 1;
 
-  sep = _tcschr(*store_path, TEXT('\\'));
+  sep = _tcschr(store_path_start, TEXT('\\'));
   if(sep == NULL)
     return CURLE_SSL_CERTPROBLEM;
 
-  *sep = 0;
+  *sep = TEXT('\0');
+  *store_path = _tcsdup(store_path_start);
+  *sep = TEXT('\\');
+  if(*store_path == NULL)
+    return CURLE_OUT_OF_MEMORY;
 
   *thumbprint = sep + 1;
   if(_tcslen(*thumbprint) != CERT_THUMBPRINT_STR_LEN)
@@ -429,14 +437,15 @@ schannel_connect_step1(struct connectdata *conn, int sockindex)
   char * const hostname = SSL_IS_PROXY() ? conn->http_proxy.host.name :
     conn->host.name;
 
-  infof(data, "schannel: SSL/TLS connection with %s port %hu (step 1/3)\n",
-        hostname, conn->remote_port);
+  DEBUGF(infof(data,
+               "schannel: SSL/TLS connection with %s port %hu (step 1/3)\n",
+               hostname, conn->remote_port));
 
   if(Curl_verify_windows_version(5, 1, PLATFORM_WINNT,
                                  VERSION_LESS_THAN_EQUAL)) {
-     /* SChannel in Windows XP (OS version 5.1) uses legacy handshakes and
+     /* Schannel in Windows XP (OS version 5.1) uses legacy handshakes and
         algorithms that may not be supported by all servers. */
-     infof(data, "schannel: WinSSL version is old and may not be able to "
+     infof(data, "schannel: Windows version is old and may not be able to "
            "connect to some servers due to lack of SNI, algorithms, etc.\n");
   }
 
@@ -490,12 +499,13 @@ schannel_connect_step1(struct connectdata *conn, int sockindex)
     Curl_ssl_sessionid_lock(conn);
     if(!Curl_ssl_getsessionid(conn, (void **)&old_cred, NULL, sockindex)) {
       BACKEND->cred = old_cred;
-      infof(data, "schannel: re-using existing credential handle\n");
+      DEBUGF(infof(data, "schannel: re-using existing credential handle\n"));
 
       /* increment the reference counter of the credential/session handle */
       BACKEND->cred->refcount++;
-      infof(data, "schannel: incremented credential handle refcount = %d\n",
-            BACKEND->cred->refcount);
+      DEBUGF(infof(data,
+                   "schannel: incremented credential handle refcount = %d\n",
+                   BACKEND->cred->refcount));
     }
     Curl_ssl_sessionid_unlock(conn);
   }
@@ -513,40 +523,37 @@ schannel_connect_step1(struct connectdata *conn, int sockindex)
 #endif
         schannel_cred.dwFlags = SCH_CRED_AUTO_CRED_VALIDATION;
 
-      /* TODO s/data->set.ssl.no_revoke/SSL_SET_OPTION(no_revoke)/g */
       if(data->set.ssl.no_revoke) {
         schannel_cred.dwFlags |= SCH_CRED_IGNORE_NO_REVOCATION_CHECK |
           SCH_CRED_IGNORE_REVOCATION_OFFLINE;
 
-        infof(data, "schannel: disabled server certificate revocation "
-                    "checks\n");
+        DEBUGF(infof(data, "schannel: disabled server certificate revocation "
+                     "checks\n"));
       }
       else {
         schannel_cred.dwFlags |= SCH_CRED_REVOCATION_CHECK_CHAIN;
-        infof(data, "schannel: checking server certificate revocation\n");
+        DEBUGF(infof(data,
+                     "schannel: checking server certificate revocation\n"));
       }
     }
     else {
       schannel_cred.dwFlags = SCH_CRED_MANUAL_CRED_VALIDATION |
         SCH_CRED_IGNORE_NO_REVOCATION_CHECK |
         SCH_CRED_IGNORE_REVOCATION_OFFLINE;
-      infof(data, "schannel: disabled server certificate revocation checks\n");
+      DEBUGF(infof(data,
+                   "schannel: disabled server cert revocation checks\n"));
     }
 
     if(!conn->ssl_config.verifyhost) {
       schannel_cred.dwFlags |= SCH_CRED_NO_SERVERNAME_CHECK;
-      infof(data, "schannel: verifyhost setting prevents Schannel from "
-            "comparing the supplied target name with the subject "
-            "names in server certificates.\n");
+      DEBUGF(infof(data, "schannel: verifyhost setting prevents Schannel from "
+                   "comparing the supplied target name with the subject "
+                   "names in server certificates.\n"));
     }
 
     switch(conn->ssl_config.version) {
     case CURL_SSLVERSION_DEFAULT:
     case CURL_SSLVERSION_TLSv1:
-      schannel_cred.grbitEnabledProtocols = SP_PROT_TLS1_0_CLIENT |
-        SP_PROT_TLS1_1_CLIENT |
-        SP_PROT_TLS1_2_CLIENT;
-      break;
     case CURL_SSLVERSION_TLSv1_0:
     case CURL_SSLVERSION_TLSv1_1:
     case CURL_SSLVERSION_TLSv1_2:
@@ -609,9 +616,11 @@ schannel_connect_step1(struct connectdata *conn, int sockindex)
         failf(data, "schannel: Failed to open cert store %x %s, "
               "last error is %x",
               cert_store_name, cert_store_path, GetLastError());
+        free(cert_store_path);
         Curl_unicodefree(cert_path);
         return CURLE_SSL_CERTPROBLEM;
       }
+      free(cert_store_path);
 
       cert_thumbprint.pbData = cert_thumbprint_data;
       cert_thumbprint.cbData = CERT_THUMBPRINT_DATA_LEN;
@@ -674,8 +683,9 @@ schannel_connect_step1(struct connectdata *conn, int sockindex)
       CertFreeCertificateContext(client_certs[0]);
 
     if(sspi_status != SEC_E_OK) {
+      char buffer[STRERROR_LEN];
       failf(data, "schannel: AcquireCredentialsHandle failed: %s",
-            Curl_sspi_strerror(conn, sspi_status));
+            Curl_sspi_strerror(sspi_status, buffer, sizeof(buffer)));
       Curl_safefree(BACKEND->cred);
       switch(sspi_status) {
         case SEC_E_INSUFFICIENT_MEMORY:
@@ -790,15 +800,16 @@ schannel_connect_step1(struct connectdata *conn, int sockindex)
   Curl_unicodefree(host_name);
 
   if(sspi_status != SEC_I_CONTINUE_NEEDED) {
+    char buffer[STRERROR_LEN];
     Curl_safefree(BACKEND->ctxt);
     switch(sspi_status) {
       case SEC_E_INSUFFICIENT_MEMORY:
         failf(data, "schannel: initial InitializeSecurityContext failed: %s",
-              Curl_sspi_strerror(conn, sspi_status));
+              Curl_sspi_strerror(sspi_status, buffer, sizeof(buffer)));
         return CURLE_OUT_OF_MEMORY;
       case SEC_E_WRONG_PRINCIPAL:
         failf(data, "schannel: SNI or certificate check failed: %s",
-              Curl_sspi_strerror(conn, sspi_status));
+              Curl_sspi_strerror(sspi_status, buffer, sizeof(buffer)));
         return CURLE_PEER_FAILED_VERIFICATION;
         /*
       case SEC_E_INVALID_HANDLE:
@@ -813,13 +824,13 @@ schannel_connect_step1(struct connectdata *conn, int sockindex)
         */
       default:
         failf(data, "schannel: initial InitializeSecurityContext failed: %s",
-              Curl_sspi_strerror(conn, sspi_status));
+              Curl_sspi_strerror(sspi_status, buffer, sizeof(buffer)));
         return CURLE_SSL_CONNECT_ERROR;
     }
   }
 
-  infof(data, "schannel: sending initial handshake data: "
-        "sending %lu bytes...\n", outbuf.cbBuffer);
+  DEBUGF(infof(data, "schannel: sending initial handshake data: "
+               "sending %lu bytes...\n", outbuf.cbBuffer));
 
   /* send initial handshake data which is now stored in output buffer */
   result = Curl_write_plain(conn, conn->sock[sockindex], outbuf.pvBuffer,
@@ -831,8 +842,8 @@ schannel_connect_step1(struct connectdata *conn, int sockindex)
     return CURLE_SSL_CONNECT_ERROR;
   }
 
-  infof(data, "schannel: sent initial handshake data: "
-        "sent %zd bytes\n", written);
+  DEBUGF(infof(data, "schannel: sent initial handshake data: "
+               "sent %zd bytes\n", written));
 
   BACKEND->recv_unrecoverable_err = CURLE_OK;
   BACKEND->recv_sspi_close_notify = false;
@@ -853,13 +864,11 @@ schannel_connect_step2(struct connectdata *conn, int sockindex)
   struct Curl_easy *data = conn->data;
   struct ssl_connect_data *connssl = &conn->ssl[sockindex];
   unsigned char *reallocated_buffer;
-  size_t reallocated_length;
   SecBuffer outbuf[3];
   SecBufferDesc outbuf_desc;
   SecBuffer inbuf[2];
   SecBufferDesc inbuf_desc;
   SECURITY_STATUS sspi_status = SEC_E_OK;
-  TCHAR *host_name;
   CURLcode result;
   bool doread;
   char * const hostname = SSL_IS_PROXY() ? conn->http_proxy.host.name :
@@ -868,8 +877,9 @@ schannel_connect_step2(struct connectdata *conn, int sockindex)
 
   doread = (connssl->connecting_state != ssl_connect_2_writing) ? TRUE : FALSE;
 
-  infof(data, "schannel: SSL/TLS connection with %s port %hu (step 2/3)\n",
-        hostname, conn->remote_port);
+  DEBUGF(infof(data,
+               "schannel: SSL/TLS connection with %s port %hu (step 2/3)\n",
+               hostname, conn->remote_port));
 
   if(!BACKEND->cred || !BACKEND->ctxt)
     return CURLE_SSL_CONNECT_ERROR;
@@ -901,7 +911,7 @@ schannel_connect_step2(struct connectdata *conn, int sockindex)
   if(BACKEND->encdata_length - BACKEND->encdata_offset <
      CURL_SCHANNEL_BUFFER_FREE_SIZE) {
     /* increase internal encrypted data buffer */
-    reallocated_length = BACKEND->encdata_offset +
+    size_t reallocated_length = BACKEND->encdata_offset +
       CURL_SCHANNEL_BUFFER_FREE_SIZE;
     reallocated_buffer = realloc(BACKEND->encdata_buffer,
                                  reallocated_length);
@@ -917,6 +927,7 @@ schannel_connect_step2(struct connectdata *conn, int sockindex)
   }
 
   for(;;) {
+    TCHAR *host_name;
     if(doread) {
       /* read encrypted handshake data from socket */
       result = Curl_read_plain(conn->sock[sockindex],
@@ -928,8 +939,8 @@ schannel_connect_step2(struct connectdata *conn, int sockindex)
       if(result == CURLE_AGAIN) {
         if(connssl->connecting_state != ssl_connect_2_writing)
           connssl->connecting_state = ssl_connect_2_reading;
-        infof(data, "schannel: failed to receive handshake, "
-              "need more data\n");
+        DEBUGF(infof(data, "schannel: failed to receive handshake, "
+                     "need more data\n"));
         return CURLE_OK;
       }
       else if((result != CURLE_OK) || (nread == 0)) {
@@ -941,11 +952,12 @@ schannel_connect_step2(struct connectdata *conn, int sockindex)
       /* increase encrypted data buffer offset */
       BACKEND->encdata_offset += nread;
       BACKEND->encdata_is_incomplete = false;
-      infof(data, "schannel: encrypted data got %zd\n", nread);
+      DEBUGF(infof(data, "schannel: encrypted data got %zd\n", nread));
     }
 
-    infof(data, "schannel: encrypted data buffer: offset %zu length %zu\n",
-          BACKEND->encdata_offset, BACKEND->encdata_length);
+    DEBUGF(infof(data,
+                 "schannel: encrypted data buffer: offset %zu length %zu\n",
+                 BACKEND->encdata_offset, BACKEND->encdata_length));
 
     /* setup input buffers */
     InitSecBuffer(&inbuf[0], SECBUFFER_TOKEN, malloc(BACKEND->encdata_offset),
@@ -988,7 +1000,8 @@ schannel_connect_step2(struct connectdata *conn, int sockindex)
     if(sspi_status == SEC_E_INCOMPLETE_MESSAGE) {
       BACKEND->encdata_is_incomplete = true;
       connssl->connecting_state = ssl_connect_2_reading;
-      infof(data, "schannel: received incomplete message, need more data\n");
+      DEBUGF(infof(data,
+                   "schannel: received incomplete message, need more data\n"));
       return CURLE_OK;
     }
 
@@ -999,7 +1012,8 @@ schannel_connect_step2(struct connectdata *conn, int sockindex)
        !(BACKEND->req_flags & ISC_REQ_USE_SUPPLIED_CREDS)) {
       BACKEND->req_flags |= ISC_REQ_USE_SUPPLIED_CREDS;
       connssl->connecting_state = ssl_connect_2_writing;
-      infof(data, "schannel: a client certificate has been requested\n");
+      DEBUGF(infof(data,
+                   "schannel: a client certificate has been requested\n"));
       return CURLE_OK;
     }
 
@@ -1008,8 +1022,8 @@ schannel_connect_step2(struct connectdata *conn, int sockindex)
       for(i = 0; i < 3; i++) {
         /* search for handshake tokens that need to be send */
         if(outbuf[i].BufferType == SECBUFFER_TOKEN && outbuf[i].cbBuffer > 0) {
-          infof(data, "schannel: sending next handshake data: "
-                "sending %lu bytes...\n", outbuf[i].cbBuffer);
+          DEBUGF(infof(data, "schannel: sending next handshake data: "
+                       "sending %lu bytes...\n", outbuf[i].cbBuffer));
 
           /* send handshake token to server */
           result = Curl_write_plain(conn, conn->sock[sockindex],
@@ -1030,14 +1044,15 @@ schannel_connect_step2(struct connectdata *conn, int sockindex)
       }
     }
     else {
+      char buffer[STRERROR_LEN];
       switch(sspi_status) {
         case SEC_E_INSUFFICIENT_MEMORY:
           failf(data, "schannel: next InitializeSecurityContext failed: %s",
-                Curl_sspi_strerror(conn, sspi_status));
+                Curl_sspi_strerror(sspi_status, buffer, sizeof(buffer)));
           return CURLE_OUT_OF_MEMORY;
         case SEC_E_WRONG_PRINCIPAL:
           failf(data, "schannel: SNI or certificate check failed: %s",
-                Curl_sspi_strerror(conn, sspi_status));
+                Curl_sspi_strerror(sspi_status, buffer, sizeof(buffer)));
           return CURLE_PEER_FAILED_VERIFICATION;
           /*
         case SEC_E_INVALID_HANDLE:
@@ -1052,14 +1067,15 @@ schannel_connect_step2(struct connectdata *conn, int sockindex)
           */
         default:
           failf(data, "schannel: next InitializeSecurityContext failed: %s",
-                Curl_sspi_strerror(conn, sspi_status));
+                Curl_sspi_strerror(sspi_status, buffer, sizeof(buffer)));
           return CURLE_SSL_CONNECT_ERROR;
       }
     }
 
     /* check if there was additional remaining encrypted data */
     if(inbuf[1].BufferType == SECBUFFER_EXTRA && inbuf[1].cbBuffer > 0) {
-      infof(data, "schannel: encrypted data length: %lu\n", inbuf[1].cbBuffer);
+      DEBUGF(infof(data, "schannel: encrypted data length: %lu\n",
+                   inbuf[1].cbBuffer));
       /*
         There are two cases where we could be getting extra data here:
         1) If we're renegotiating a connection and the handshake is already
@@ -1098,7 +1114,7 @@ schannel_connect_step2(struct connectdata *conn, int sockindex)
   /* check if the handshake is complete */
   if(sspi_status == SEC_E_OK) {
     connssl->connecting_state = ssl_connect_3;
-    infof(data, "schannel: SSL/TLS handshake complete\n");
+    DEBUGF(infof(data, "schannel: SSL/TLS handshake complete\n"));
   }
 
   pubkey_ptr = SSL_IS_PROXY() ?
@@ -1114,13 +1130,71 @@ schannel_connect_step2(struct connectdata *conn, int sockindex)
 
 #ifdef HAS_MANUAL_VERIFY_API
   if(conn->ssl_config.verifypeer && BACKEND->use_manual_cred_validation) {
-    return verify_certificate(conn, sockindex);
+    return Curl_verify_certificate(conn, sockindex);
   }
 #endif
 
   return CURLE_OK;
 }
 
+static bool
+valid_cert_encoding(const CERT_CONTEXT *cert_context)
+{
+  return (cert_context != NULL) &&
+    ((cert_context->dwCertEncodingType & X509_ASN_ENCODING) != 0) &&
+    (cert_context->pbCertEncoded != NULL) &&
+    (cert_context->cbCertEncoded > 0);
+}
+
+typedef bool(*Read_crt_func)(const CERT_CONTEXT *ccert_context, void *arg);
+
+static void
+traverse_cert_store(const CERT_CONTEXT *context, Read_crt_func func,
+                    void *arg)
+{
+  const CERT_CONTEXT *current_context = NULL;
+  bool should_continue = true;
+  while(should_continue &&
+        (current_context = CertEnumCertificatesInStore(
+          context->hCertStore,
+          current_context)) != NULL)
+    should_continue = func(current_context, arg);
+
+  if(current_context)
+    CertFreeCertificateContext(current_context);
+}
+
+static bool
+cert_counter_callback(const CERT_CONTEXT *ccert_context, void *certs_count)
+{
+  if(valid_cert_encoding(ccert_context))
+    (*(int *)certs_count)++;
+  return true;
+}
+
+struct Adder_args
+{
+  struct connectdata *conn;
+  CURLcode result;
+  int idx;
+  int certs_count;
+};
+
+static bool
+add_cert_to_certinfo(const CERT_CONTEXT *ccert_context, void *raw_arg)
+{
+  struct Adder_args *args = (struct Adder_args*)raw_arg;
+  args->result = CURLE_OK;
+  if(valid_cert_encoding(ccert_context)) {
+    const char *beg = (const char *) ccert_context->pbCertEncoded;
+    const char *end = beg + ccert_context->cbCertEncoded;
+    int insert_index = (args->certs_count - 1) - args->idx;
+    args->result = Curl_extract_certinfo(args->conn, insert_index, beg, end);
+    args->idx++;
+  }
+  return args->result == CURLE_OK;
+}
+
 static CURLcode
 schannel_connect_step3(struct connectdata *conn, int sockindex)
 {
@@ -1129,7 +1203,7 @@ schannel_connect_step3(struct connectdata *conn, int sockindex)
   struct ssl_connect_data *connssl = &conn->ssl[sockindex];
   SECURITY_STATUS sspi_status = SEC_E_OK;
   CERT_CONTEXT *ccert_context = NULL;
-#ifndef CURL_DISABLE_VERBOSE_STRINGS
+#ifdef DEBUGBUILD
   const char * const hostname = SSL_IS_PROXY() ? conn->http_proxy.host.name :
     conn->host.name;
 #endif
@@ -1139,8 +1213,9 @@ schannel_connect_step3(struct connectdata *conn, int sockindex)
 
   DEBUGASSERT(ssl_connect_3 == connssl->connecting_state);
 
-  infof(data, "schannel: SSL/TLS connection with %s port %hu (step 3/3)\n",
-        hostname, conn->remote_port);
+  DEBUGF(infof(data,
+               "schannel: SSL/TLS connection with %s port %hu (step 3/3)\n",
+               hostname, conn->remote_port));
 
   if(!BACKEND->cred)
     return CURLE_SSL_CONNECT_ERROR;
@@ -1192,6 +1267,8 @@ schannel_connect_step3(struct connectdata *conn, int sockindex)
     }
     else
       infof(data, "ALPN, server did not agree to a protocol\n");
+    Curl_multiuse_state(conn, conn->negnpn == CURL_HTTP_VERSION_2 ?
+                        BUNDLE_MULTIPLEX : BUNDLE_NO_MULTIUSE);
   }
 #endif
 
@@ -1205,7 +1282,8 @@ schannel_connect_step3(struct connectdata *conn, int sockindex)
                                       sockindex));
     if(incache) {
       if(old_cred != BACKEND->cred) {
-        infof(data, "schannel: old credential handle is stale, removing\n");
+        DEBUGF(infof(data,
+                     "schannel: old credential handle is stale, removing\n"));
         /* we're not taking old_cred ownership here, no refcount++ is needed */
         Curl_ssl_delsessionid(conn, (void *)old_cred);
         incache = FALSE;
@@ -1223,13 +1301,15 @@ schannel_connect_step3(struct connectdata *conn, int sockindex)
       else {
         /* this cred session is now also referenced by sessionid cache */
         BACKEND->cred->refcount++;
-        infof(data, "schannel: stored credential handle in session cache\n");
+        DEBUGF(infof(data,
+                     "schannel: stored credential handle in session cache\n"));
       }
     }
     Curl_ssl_sessionid_unlock(conn);
   }
 
   if(data->set.ssl.certinfo) {
+    int certs_count = 0;
     sspi_status = s_pSecFn->QueryContextAttributes(&BACKEND->ctxt->ctxt_handle,
       SECPKG_ATTR_REMOTE_CERT_CONTEXT, &ccert_context);
 
@@ -1238,15 +1318,16 @@ schannel_connect_step3(struct connectdata *conn, int sockindex)
       return CURLE_PEER_FAILED_VERIFICATION;
     }
 
-    result = Curl_ssl_init_certinfo(data, 1);
-    if(!result) {
-      if(((ccert_context->dwCertEncodingType & X509_ASN_ENCODING) != 0) &&
-         (ccert_context->cbCertEncoded > 0)) {
+    traverse_cert_store(ccert_context, cert_counter_callback, &certs_count);
 
-        const char *beg = (const char *) ccert_context->pbCertEncoded;
-        const char *end = beg + ccert_context->cbCertEncoded;
-        result = Curl_extract_certinfo(conn, 0, beg, end);
-      }
+    result = Curl_ssl_init_certinfo(data, certs_count);
+    if(!result) {
+      struct Adder_args args;
+      args.conn = conn;
+      args.idx = 0;
+      args.certs_count = certs_count;
+      traverse_cert_store(ccert_context, add_cert_to_certinfo, &args);
+      result = args.result;
     }
     CertFreeCertificateContext(ccert_context);
     if(result)
@@ -1266,7 +1347,7 @@ schannel_connect_common(struct connectdata *conn, int sockindex,
   struct Curl_easy *data = conn->data;
   struct ssl_connect_data *connssl = &conn->ssl[sockindex];
   curl_socket_t sockfd = conn->sock[sockindex];
-  time_t timeout_ms;
+  timediff_t timeout_ms;
   int what;
 
   /* check if the connection has already been established */
@@ -1313,7 +1394,7 @@ schannel_connect_common(struct connectdata *conn, int sockindex,
         connssl->connecting_state ? sockfd : CURL_SOCKET_BAD;
 
       what = Curl_socket_check(readfd, CURL_SOCKET_BAD, writefd,
-                               nonblocking ? 0 : timeout_ms);
+                               nonblocking ? 0 : (time_t)timeout_ms);
       if(what < 0) {
         /* fatal error */
         failf(data, "select/poll on SSL/TLS socket, errno: %d", SOCKERRNO);
@@ -1359,6 +1440,16 @@ schannel_connect_common(struct connectdata *conn, int sockindex,
     connssl->state = ssl_connection_complete;
     conn->recv[sockindex] = schannel_recv;
     conn->send[sockindex] = schannel_send;
+
+#ifdef SECPKG_ATTR_ENDPOINT_BINDINGS
+    /* When SSPI is used in combination with Schannel
+     * we need the Schannel context to create the Schannel
+     * binding to pass the IIS extended protection checks.
+     * Available on Windows 7 or later.
+     */
+    conn->sslContext = &BACKEND->ctxt->ctxt_handle;
+#endif
+
     *done = TRUE;
   }
   else
@@ -1453,7 +1544,7 @@ schannel_send(struct connectdata *conn, int sockindex,
     /* send entire message or fail */
     while(len > (size_t)written) {
       ssize_t this_write;
-      time_t timeleft;
+      timediff_t timeleft;
       int what;
 
       this_write = 0;
@@ -1543,7 +1634,7 @@ schannel_recv(struct connectdata *conn, int sockindex,
    * handled in the cleanup.
    */
 
-  infof(data, "schannel: client wants to read %zu bytes\n", len);
+  DEBUGF(infof(data, "schannel: client wants to read %zu bytes\n", len));
   *err = CURLE_OK;
 
   if(len && len <= BACKEND->decdata_offset) {
@@ -1588,12 +1679,13 @@ schannel_recv(struct connectdata *conn, int sockindex,
       BACKEND->encdata_buffer = reallocated_buffer;
       BACKEND->encdata_length = reallocated_length;
       size = BACKEND->encdata_length - BACKEND->encdata_offset;
-      infof(data, "schannel: encdata_buffer resized %zu\n",
-            BACKEND->encdata_length);
+      DEBUGF(infof(data, "schannel: encdata_buffer resized %zu\n",
+                   BACKEND->encdata_length));
     }
 
-    infof(data, "schannel: encrypted data buffer: offset %zu length %zu\n",
-          BACKEND->encdata_offset, BACKEND->encdata_length);
+    DEBUGF(infof(data,
+                 "schannel: encrypted data buffer: offset %zu length %zu\n",
+                 BACKEND->encdata_offset, BACKEND->encdata_length));
 
     /* read encrypted data from socket */
     *err = Curl_read_plain(conn->sock[sockindex],
@@ -1603,7 +1695,8 @@ schannel_recv(struct connectdata *conn, int sockindex,
     if(*err) {
       nread = -1;
       if(*err == CURLE_AGAIN)
-        infof(data, "schannel: Curl_read_plain returned CURLE_AGAIN\n");
+        DEBUGF(infof(data,
+                     "schannel: Curl_read_plain returned CURLE_AGAIN\n"));
       else if(*err == CURLE_RECV_ERROR)
         infof(data, "schannel: Curl_read_plain returned CURLE_RECV_ERROR\n");
       else
@@ -1611,17 +1704,18 @@ schannel_recv(struct connectdata *conn, int sockindex,
     }
     else if(nread == 0) {
       BACKEND->recv_connection_closed = true;
-      infof(data, "schannel: server closed the connection\n");
+      DEBUGF(infof(data, "schannel: server closed the connection\n"));
     }
     else if(nread > 0) {
       BACKEND->encdata_offset += (size_t)nread;
       BACKEND->encdata_is_incomplete = false;
-      infof(data, "schannel: encrypted data got %zd\n", nread);
+      DEBUGF(infof(data, "schannel: encrypted data got %zd\n", nread));
     }
   }
 
-  infof(data, "schannel: encrypted data buffer: offset %zu length %zu\n",
-        BACKEND->encdata_offset, BACKEND->encdata_length);
+  DEBUGF(infof(data,
+               "schannel: encrypted data buffer: offset %zu length %zu\n",
+               BACKEND->encdata_offset, BACKEND->encdata_length));
 
   /* decrypt loop */
   while(BACKEND->encdata_offset > 0 && sspi_status == SEC_E_OK &&
@@ -1649,8 +1743,8 @@ schannel_recv(struct connectdata *conn, int sockindex,
       /* check for successfully decrypted data, even before actual
          renegotiation or shutdown of the connection context */
       if(inbuf[1].BufferType == SECBUFFER_DATA) {
-        infof(data, "schannel: decrypted data length: %lu\n",
-              inbuf[1].cbBuffer);
+        DEBUGF(infof(data, "schannel: decrypted data length: %lu\n",
+                     inbuf[1].cbBuffer));
 
         /* increase buffer in order to fit the received amount of data */
         size = inbuf[1].cbBuffer > CURL_SCHANNEL_BUFFER_FREE_SIZE ?
@@ -1682,15 +1776,16 @@ schannel_recv(struct connectdata *conn, int sockindex,
           BACKEND->decdata_offset += size;
         }
 
-        infof(data, "schannel: decrypted data added: %zu\n", size);
-        infof(data, "schannel: decrypted data cached: offset %zu length %zu\n",
-              BACKEND->decdata_offset, BACKEND->decdata_length);
+        DEBUGF(infof(data, "schannel: decrypted data added: %zu\n", size));
+        DEBUGF(infof(data,
+                     "schannel: decrypted cached: offset %zu length %zu\n",
+                     BACKEND->decdata_offset, BACKEND->decdata_length));
       }
 
       /* check for remaining encrypted data */
       if(inbuf[3].BufferType == SECBUFFER_EXTRA && inbuf[3].cbBuffer > 0) {
-        infof(data, "schannel: encrypted data length: %lu\n",
-              inbuf[3].cbBuffer);
+        DEBUGF(infof(data, "schannel: encrypted data length: %lu\n",
+                     inbuf[3].cbBuffer));
 
         /* check if the remaining data is less than the total amount
          * and therefore begins after the already processed data
@@ -1704,8 +1799,9 @@ schannel_recv(struct connectdata *conn, int sockindex,
           BACKEND->encdata_offset = inbuf[3].cbBuffer;
         }
 
-        infof(data, "schannel: encrypted data cached: offset %zu length %zu\n",
-              BACKEND->encdata_offset, BACKEND->encdata_length);
+        DEBUGF(infof(data,
+                     "schannel: encrypted cached: offset %zu length %zu\n",
+                     BACKEND->encdata_offset, BACKEND->encdata_length));
       }
       else {
         /* reset encrypted buffer offset, because there is no data remaining */
@@ -1759,22 +1855,27 @@ schannel_recv(struct connectdata *conn, int sockindex,
       goto cleanup;
     }
     else {
+#ifndef CURL_DISABLE_VERBOSE_STRINGS
+      char buffer[STRERROR_LEN];
+#endif
       *err = CURLE_RECV_ERROR;
       infof(data, "schannel: failed to read data from server: %s\n",
-            Curl_sspi_strerror(conn, sspi_status));
+            Curl_sspi_strerror(sspi_status, buffer, sizeof(buffer)));
       goto cleanup;
     }
   }
 
-  infof(data, "schannel: encrypted data buffer: offset %zu length %zu\n",
-        BACKEND->encdata_offset, BACKEND->encdata_length);
+  DEBUGF(infof(data,
+               "schannel: encrypted data buffer: offset %zu length %zu\n",
+               BACKEND->encdata_offset, BACKEND->encdata_length));
 
-  infof(data, "schannel: decrypted data buffer: offset %zu length %zu\n",
-        BACKEND->decdata_offset, BACKEND->decdata_length);
+  DEBUGF(infof(data,
+               "schannel: decrypted data buffer: offset %zu length %zu\n",
+               BACKEND->decdata_offset, BACKEND->decdata_length));
 
 cleanup:
   /* Warning- there is no guarantee the encdata state is valid at this point */
-  infof(data, "schannel: schannel_recv cleanup\n");
+  DEBUGF(infof(data, "schannel: schannel_recv cleanup\n"));
 
   /* Error if the connection has closed without a close_notify.
   Behavior here is a matter of debate. We don't want to be vulnerable to a
@@ -1807,10 +1908,10 @@ cleanup:
     memmove(BACKEND->decdata_buffer, BACKEND->decdata_buffer + size,
             BACKEND->decdata_offset - size);
     BACKEND->decdata_offset -= size;
-
-    infof(data, "schannel: decrypted data returned %zu\n", size);
-    infof(data, "schannel: decrypted data buffer: offset %zu length %zu\n",
-          BACKEND->decdata_offset, BACKEND->decdata_length);
+    DEBUGF(infof(data, "schannel: decrypted data returned %zu\n", size));
+    DEBUGF(infof(data,
+                 "schannel: decrypted data buffer: offset %zu length %zu\n",
+                 BACKEND->decdata_offset, BACKEND->decdata_length));
     *err = CURLE_OK;
     return (ssize_t)size;
   }
@@ -1888,6 +1989,8 @@ static int Curl_schannel_shutdown(struct connectdata *conn, int sockindex)
   char * const hostname = SSL_IS_PROXY() ? conn->http_proxy.host.name :
     conn->host.name;
 
+  DEBUGASSERT(data);
+
   infof(data, "schannel: shutting down SSL/TLS connection with %s port %hu\n",
         hostname, conn->remote_port);
 
@@ -1907,9 +2010,11 @@ static int Curl_schannel_shutdown(struct connectdata *conn, int sockindex)
     sspi_status = s_pSecFn->ApplyControlToken(&BACKEND->ctxt->ctxt_handle,
                                               &BuffDesc);
 
-    if(sspi_status != SEC_E_OK)
+    if(sspi_status != SEC_E_OK) {
+      char buffer[STRERROR_LEN];
       failf(data, "schannel: ApplyControlToken failure: %s",
-            Curl_sspi_strerror(conn, sspi_status));
+            Curl_sspi_strerror(sspi_status, buffer, sizeof(buffer)));
+    }
 
     host_name = Curl_convert_UTF8_to_tchar(hostname);
     if(!host_name)
@@ -1951,13 +2056,18 @@ static int Curl_schannel_shutdown(struct connectdata *conn, int sockindex)
 
   /* free SSPI Schannel API security context handle */
   if(BACKEND->ctxt) {
-    infof(data, "schannel: clear security context handle\n");
+    DEBUGF(infof(data, "schannel: clear security context handle\n"));
     s_pSecFn->DeleteSecurityContext(&BACKEND->ctxt->ctxt_handle);
     Curl_safefree(BACKEND->ctxt);
   }
 
   /* free SSPI Schannel API credential handle */
   if(BACKEND->cred) {
+    /*
+     * When this function is called from Curl_schannel_close() the connection
+     * might not have an associated transfer so the check for conn->data is
+     * necessary.
+     */
     Curl_ssl_sessionid_lock(conn);
     Curl_schannel_session_free(BACKEND->cred);
     Curl_ssl_sessionid_unlock(conn);
@@ -1994,7 +2104,7 @@ static void Curl_schannel_cleanup(void)
 
 static size_t Curl_schannel_version(char *buffer, size_t size)
 {
-  size = snprintf(buffer, size, "WinSSL");
+  size = msnprintf(buffer, size, "Schannel");
 
   return size;
 }
@@ -2022,14 +2132,9 @@ static CURLcode Curl_schannel_random(struct Curl_easy *data UNUSED_PARAM,
 static CURLcode pkp_pin_peer_pubkey(struct connectdata *conn, int sockindex,
                                     const char *pinnedpubkey)
 {
-  SECURITY_STATUS status;
   struct Curl_easy *data = conn->data;
   struct ssl_connect_data *connssl = &conn->ssl[sockindex];
   CERT_CONTEXT *pCertContextServer = NULL;
-  const char *x509_der;
-  DWORD x509_der_len;
-  curl_X509certificate x509_parsed;
-  curl_asn1Element *pubkey;
 
   /* Result is returned to caller */
   CURLcode result = CURLE_SSL_PINNEDPUBKEYNOTMATCH;
@@ -2039,13 +2144,21 @@ static CURLcode pkp_pin_peer_pubkey(struct connectdata *conn, int sockindex,
     return CURLE_OK;
 
   do {
-    status = s_pSecFn->QueryContextAttributes(&BACKEND->ctxt->ctxt_handle,
-                                              SECPKG_ATTR_REMOTE_CERT_CONTEXT,
-                                              &pCertContextServer);
+    SECURITY_STATUS sspi_status;
+    const char *x509_der;
+    DWORD x509_der_len;
+    curl_X509certificate x509_parsed;
+    curl_asn1Element *pubkey;
 
-    if((status != SEC_E_OK) || (pCertContextServer == NULL)) {
+    sspi_status =
+      s_pSecFn->QueryContextAttributes(&BACKEND->ctxt->ctxt_handle,
+                                       SECPKG_ATTR_REMOTE_CERT_CONTEXT,
+                                       &pCertContextServer);
+
+    if((sspi_status != SEC_E_OK) || (pCertContextServer == NULL)) {
+      char buffer[STRERROR_LEN];
       failf(data, "schannel: Failed to read remote certificate context: %s",
-            Curl_sspi_strerror(conn, status));
+            Curl_sspi_strerror(sspi_status, buffer, sizeof(buffer)));
       break; /* failed */
     }
 
@@ -2082,11 +2195,11 @@ static CURLcode pkp_pin_peer_pubkey(struct connectdata *conn, int sockindex,
 }
 
 static void Curl_schannel_checksum(const unsigned char *input,
-                      size_t inputlen,
-                      unsigned char *checksum,
-                      size_t checksumlen,
-                      DWORD provType,
-                      const unsigned int algId)
+                                   size_t inputlen,
+                                   unsigned char *checksum,
+                                   size_t checksumlen,
+                                   DWORD provType,
+                                   const unsigned int algId)
 {
   HCRYPTPROV hProv = 0;
   HCRYPTHASH hHash = 0;
@@ -2136,9 +2249,9 @@ static CURLcode Curl_schannel_md5sum(unsigned char *input,
                                      unsigned char *md5sum,
                                      size_t md5len)
 {
-    Curl_schannel_checksum(input, inputlen, md5sum, md5len,
-                           PROV_RSA_FULL, CALG_MD5);
-    return CURLE_OK;
+  Curl_schannel_checksum(input, inputlen, md5sum, md5len,
+                         PROV_RSA_FULL, CALG_MD5);
+  return CURLE_OK;
 }
 
 static CURLcode Curl_schannel_sha256sum(const unsigned char *input,
@@ -2146,9 +2259,9 @@ static CURLcode Curl_schannel_sha256sum(const unsigned char *input,
                                     unsigned char *sha256sum,
                                     size_t sha256len)
 {
-    Curl_schannel_checksum(input, inputlen, sha256sum, sha256len,
-                           PROV_RSA_AES, CALG_SHA_256);
-    return CURLE_OK;
+  Curl_schannel_checksum(input, inputlen, sha256sum, sha256len,
+                         PROV_RSA_AES, CALG_SHA_256);
+  return CURLE_OK;
 }
 
 static void *Curl_schannel_get_internals(struct ssl_connect_data *connssl,
index e491bd4..ee8d7d4 100644 (file)
@@ -8,7 +8,7 @@
  *                             \___|\___/|_| \_\_____|
  *
  * Copyright (C) 2012, Marc Hoersken, <info@marc-hoersken.de>, et al.
- * Copyright (C) 2012 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 2012 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -53,7 +53,7 @@
 
 extern const struct Curl_ssl Curl_ssl_schannel;
 
-CURLcode verify_certificate(struct connectdata *conn, int sockindex);
+CURLcode Curl_verify_certificate(struct connectdata *conn, int sockindex);
 
 /* structs to expose only in schannel.c and schannel_verify.c */
 #ifdef EXPOSE_SCHANNEL_INTERNAL_STRUCTS
index 2516f56..3a668ad 100644 (file)
@@ -7,7 +7,7 @@
  *
  * Copyright (C) 2012 - 2016, Marc Hoersken, <info@marc-hoersken.de>
  * Copyright (C) 2012, Mark Salisbury, <mark.salisbury@hp.com>
- * Copyright (C) 2012 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 2012 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -23,7 +23,7 @@
  ***************************************************************************/
 
 /*
- * Source file for SChannel-specific certificate verification. This code should
+ * Source file for Schannel-specific certificate verification. This code should
  * only be invoked by code in schannel.c.
  */
 
@@ -87,18 +87,20 @@ static CURLcode add_certs_to_store(HCERTSTORE trust_store,
   LARGE_INTEGER file_size;
   char *ca_file_buffer = NULL;
   char *current_ca_file_ptr = NULL;
-  const TCHAR *ca_file_tstr = NULL;
+  TCHAR *ca_file_tstr = NULL;
   size_t ca_file_bufsize = 0;
   DWORD total_bytes_read = 0;
   bool more_certs = 0;
   int num_certs = 0;
   size_t END_CERT_LEN;
 
-  ca_file_tstr = Curl_convert_UTF8_to_tchar(ca_file);
+  ca_file_tstr = Curl_convert_UTF8_to_tchar((char *)ca_file);
   if(!ca_file_tstr) {
+    char buffer[STRERROR_LEN];
     failf(data,
           "schannel: invalid path name for CA file '%s': %s",
-          ca_file, Curl_strerror(conn, GetLastError()));
+          ca_file,
+          Curl_winapi_strerror(GetLastError(), buffer, sizeof(buffer)));
     result = CURLE_SSL_CACERT_BADFILE;
     goto cleanup;
   }
@@ -110,23 +112,27 @@ static CURLcode add_certs_to_store(HCERTSTORE trust_store,
    */
   ca_file_handle = CreateFile(ca_file_tstr,
                               GENERIC_READ,
-                              0,
+                              FILE_SHARE_READ,
                               NULL,
                               OPEN_EXISTING,
                               FILE_ATTRIBUTE_NORMAL,
                               NULL);
   if(ca_file_handle == INVALID_HANDLE_VALUE) {
+    char buffer[STRERROR_LEN];
     failf(data,
           "schannel: failed to open CA file '%s': %s",
-          ca_file, Curl_strerror(conn, GetLastError()));
+          ca_file,
+          Curl_winapi_strerror(GetLastError(), buffer, sizeof(buffer)));
     result = CURLE_SSL_CACERT_BADFILE;
     goto cleanup;
   }
 
   if(!GetFileSizeEx(ca_file_handle, &file_size)) {
+    char buffer[STRERROR_LEN];
     failf(data,
           "schannel: failed to determine size of CA file '%s': %s",
-          ca_file, Curl_strerror(conn, GetLastError()));
+          ca_file,
+          Curl_winapi_strerror(GetLastError(), buffer, sizeof(buffer)));
     result = CURLE_SSL_CACERT_BADFILE;
     goto cleanup;
   }
@@ -153,10 +159,11 @@ static CURLcode add_certs_to_store(HCERTSTORE trust_store,
 
     if(!ReadFile(ca_file_handle, ca_file_buffer + total_bytes_read,
                  bytes_to_read, &bytes_read, NULL)) {
-
+      char buffer[STRERROR_LEN];
       failf(data,
             "schannel: failed to read from CA file '%s': %s",
-            ca_file, Curl_strerror(conn, GetLastError()));
+            ca_file,
+            Curl_winapi_strerror(GetLastError(), buffer, sizeof(buffer)));
       result = CURLE_SSL_CACERT_BADFILE;
       goto cleanup;
     }
@@ -215,11 +222,12 @@ static CURLcode add_certs_to_store(HCERTSTORE trust_store,
                              NULL,
                              NULL,
                              (const void **)&cert_context)) {
-
+          char buffer[STRERROR_LEN];
           failf(data,
                 "schannel: failed to extract certificate from CA file "
                 "'%s': %s",
-                ca_file, Curl_strerror(conn, GetLastError()));
+                ca_file,
+                Curl_winapi_strerror(GetLastError(), buffer, sizeof(buffer)));
           result = CURLE_SSL_CACERT_BADFILE;
           more_certs = 0;
         }
@@ -243,10 +251,13 @@ static CURLcode add_certs_to_store(HCERTSTORE trust_store,
                                                NULL);
             CertFreeCertificateContext(cert_context);
             if(!add_cert_result) {
+              char buffer[STRERROR_LEN];
               failf(data,
                     "schannel: failed to add certificate from CA file '%s' "
                     "to certificate store: %s",
-                    ca_file, Curl_strerror(conn, GetLastError()));
+                    ca_file,
+                    Curl_winapi_strerror(GetLastError(), buffer,
+                                         sizeof(buffer)));
               result = CURLE_SSL_CACERT_BADFILE;
               more_certs = 0;
             }
@@ -406,9 +417,9 @@ cleanup:
   return result;
 }
 
-CURLcode verify_certificate(struct connectdata *conn, int sockindex)
+CURLcode Curl_verify_certificate(struct connectdata *conn, int sockindex)
 {
-  SECURITY_STATUS status;
+  SECURITY_STATUS sspi_status;
   struct Curl_easy *data = conn->data;
   struct ssl_connect_data *connssl = &conn->ssl[sockindex];
   CURLcode result = CURLE_OK;
@@ -420,13 +431,15 @@ CURLcode verify_certificate(struct connectdata *conn, int sockindex)
     conn->http_proxy.host.name :
     conn->host.name;
 
-  status = s_pSecFn->QueryContextAttributes(&BACKEND->ctxt->ctxt_handle,
-                                            SECPKG_ATTR_REMOTE_CERT_CONTEXT,
-                                            &pCertContextServer);
+  sspi_status =
+    s_pSecFn->QueryContextAttributes(&BACKEND->ctxt->ctxt_handle,
+                                     SECPKG_ATTR_REMOTE_CERT_CONTEXT,
+                                     &pCertContextServer);
 
-  if((status != SEC_E_OK) || (pCertContextServer == NULL)) {
+  if((sspi_status != SEC_E_OK) || (pCertContextServer == NULL)) {
+    char buffer[STRERROR_LEN];
     failf(data, "schannel: Failed to read remote certificate context: %s",
-          Curl_sspi_strerror(conn, status));
+          Curl_sspi_strerror(sspi_status, buffer, sizeof(buffer)));
     result = CURLE_PEER_FAILED_VERIFICATION;
   }
 
@@ -450,8 +463,9 @@ CURLcode verify_certificate(struct connectdata *conn, int sockindex)
                                   CERT_STORE_CREATE_NEW_FLAG,
                                   NULL);
       if(!trust_store) {
+        char buffer[STRERROR_LEN];
         failf(data, "schannel: failed to create certificate store: %s",
-              Curl_strerror(conn, GetLastError()));
+              Curl_winapi_strerror(GetLastError(), buffer, sizeof(buffer)));
         result = CURLE_SSL_CACERT_BADFILE;
       }
       else {
@@ -477,9 +491,10 @@ CURLcode verify_certificate(struct connectdata *conn, int sockindex)
         CertCreateCertificateChainEngine(
           (CERT_CHAIN_ENGINE_CONFIG *)&engine_config, &cert_chain_engine);
       if(!create_engine_result) {
+        char buffer[STRERROR_LEN];
         failf(data,
               "schannel: failed to create certificate chain engine: %s",
-              Curl_strerror(conn, GetLastError()));
+              Curl_winapi_strerror(GetLastError(), buffer, sizeof(buffer)));
         result = CURLE_SSL_CACERT_BADFILE;
       }
     }
@@ -500,8 +515,9 @@ CURLcode verify_certificate(struct connectdata *conn, int sockindex)
                                  CERT_CHAIN_REVOCATION_CHECK_CHAIN),
                                 NULL,
                                 &pChainContext)) {
+      char buffer[STRERROR_LEN];
       failf(data, "schannel: CertGetCertificateChain failed: %s",
-            Curl_sspi_strerror(conn, GetLastError()));
+            Curl_winapi_strerror(GetLastError(), buffer, sizeof(buffer)));
       pChainContext = NULL;
       result = CURLE_PEER_FAILED_VERIFICATION;
     }
similarity index 94%
rename from lib/vtls/darwinssl.c
rename to lib/vtls/sectransp.c
index e8116b8..4eece89 100644 (file)
@@ -6,7 +6,7 @@
  *                             \___|\___/|_| \_\_____|
  *
  * Copyright (C) 2012 - 2017, Nick Zitzmann, <nickzman@gmail.com>.
- * Copyright (C) 2012 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 2012 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -31,8 +31,9 @@
 #include "urldata.h" /* for the Curl_easy definition */
 #include "curl_base64.h"
 #include "strtok.h"
+#include "multiif.h"
 
-#ifdef USE_DARWINSSL
+#ifdef USE_SECTRANSP
 
 #ifdef __clang__
 #pragma clang diagnostic push
@@ -59,7 +60,7 @@
 #if (TARGET_OS_MAC && !(TARGET_OS_EMBEDDED || TARGET_OS_IPHONE))
 
 #if MAC_OS_X_VERSION_MAX_ALLOWED < 1050
-#error "The darwinssl back-end requires Leopard or later."
+#error "The Secure Transport back-end requires Leopard or later."
 #endif /* MAC_OS_X_VERSION_MAX_ALLOWED < 1050 */
 
 #define CURL_BUILD_IOS 0
@@ -78,7 +79,7 @@
 /* These macros mean "the following code is present to allow runtime backward
    compatibility with at least this cat or earlier":
    (You set this at build-time using the compiler command line option
-   "-mmacos-version-min.") */
+   "-mmacosx-version-min.") */
 #define CURL_SUPPORT_MAC_10_5 MAC_OS_X_VERSION_MIN_REQUIRED <= 1050
 #define CURL_SUPPORT_MAC_10_6 MAC_OS_X_VERSION_MIN_REQUIRED <= 1060
 #define CURL_SUPPORT_MAC_10_7 MAC_OS_X_VERSION_MIN_REQUIRED <= 1070
 #define CURL_SUPPORT_MAC_10_9 0
 
 #else
-#error "The darwinssl back-end requires iOS or OS X."
+#error "The Secure Transport back-end requires iOS or macOS."
 #endif /* (TARGET_OS_MAC && !(TARGET_OS_EMBEDDED || TARGET_OS_IPHONE)) */
 
 #if CURL_BUILD_MAC
 #include "connect.h"
 #include "select.h"
 #include "vtls.h"
-#include "darwinssl.h"
+#include "sectransp.h"
 #include "curl_printf.h"
 #include "strdup.h"
 
@@ -144,20 +145,20 @@ struct ssl_backend_data {
 /* version 1 supports macOS 10.12+ and iOS 10+ */
 #if ((TARGET_OS_IPHONE && __IPHONE_OS_VERSION_MIN_REQUIRED >= 100000) || \
     (!TARGET_OS_IPHONE && __MAC_OS_X_VERSION_MIN_REQUIRED  >= 101200))
-#define DARWIN_SSL_PINNEDPUBKEY_V1 1
+#define SECTRANSP_PINNEDPUBKEY_V1 1
 #endif
 
 /* version 2 supports MacOSX 10.7+ */
 #if (!TARGET_OS_IPHONE && __MAC_OS_X_VERSION_MIN_REQUIRED >= 1070)
-#define DARWIN_SSL_PINNEDPUBKEY_V2 1
+#define SECTRANSP_PINNEDPUBKEY_V2 1
 #endif
 
-#if defined(DARWIN_SSL_PINNEDPUBKEY_V1) || defined(DARWIN_SSL_PINNEDPUBKEY_V2)
+#if defined(SECTRANSP_PINNEDPUBKEY_V1) || defined(SECTRANSP_PINNEDPUBKEY_V2)
 /* this backend supports CURLOPT_PINNEDPUBLICKEY */
-#define DARWIN_SSL_PINNEDPUBKEY 1
-#endif /* DARWIN_SSL_PINNEDPUBKEY */
+#define SECTRANSP_PINNEDPUBKEY 1
+#endif /* SECTRANSP_PINNEDPUBKEY */
 
-#ifdef DARWIN_SSL_PINNEDPUBKEY
+#ifdef SECTRANSP_PINNEDPUBKEY
 /* both new and old APIs return rsa keys missing the spki header (not DER) */
 static const unsigned char rsa4096SpkiHeader[] = {
                                        0x30, 0x82, 0x02, 0x22, 0x30, 0x0d,
@@ -170,7 +171,7 @@ static const unsigned char rsa2048SpkiHeader[] = {
                                        0x06, 0x09, 0x2a, 0x86, 0x48, 0x86,
                                        0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05,
                                        0x00, 0x03, 0x82, 0x01, 0x0f, 0x00};
-#ifdef DARWIN_SSL_PINNEDPUBKEY_V1
+#ifdef SECTRANSP_PINNEDPUBKEY_V1
 /* the *new* version doesn't return DER encoded ecdsa certs like the old... */
 static const unsigned char ecDsaSecp256r1SpkiHeader[] = {
                                        0x30, 0x59, 0x30, 0x13, 0x06, 0x07,
@@ -184,8 +185,8 @@ static const unsigned char ecDsaSecp384r1SpkiHeader[] = {
                                        0x2a, 0x86, 0x48, 0xce, 0x3d, 0x02,
                                        0x01, 0x06, 0x05, 0x2b, 0x81, 0x04,
                                        0x00, 0x22, 0x03, 0x62, 0x00};
-#endif /* DARWIN_SSL_PINNEDPUBKEY_V1 */
-#endif /* DARWIN_SSL_PINNEDPUBKEY */
+#endif /* SECTRANSP_PINNEDPUBKEY_V1 */
+#endif /* SECTRANSP_PINNEDPUBKEY */
 
 /* The following two functions were ripped from Apple sample code,
  * with some modifications: */
@@ -950,7 +951,7 @@ static CURLcode CopyCertSubject(struct Curl_easy *data,
 
   if(!c) {
     failf(data, "SSL: invalid CA certificate subject");
-    return CURLE_SSL_CACERT;
+    return CURLE_PEER_FAILED_VERIFICATION;
   }
 
   /* If the subject is already available as UTF-8 encoded (ie 'direct') then
@@ -970,7 +971,7 @@ static CURLcode CopyCertSubject(struct Curl_easy *data,
       if(!CFStringGetCString(c, cbuf, cbuf_size,
                              kCFStringEncodingUTF8)) {
         failf(data, "SSL: invalid CA certificate subject");
-        result = CURLE_SSL_CACERT;
+        result = CURLE_PEER_FAILED_VERIFICATION;
       }
       else
         /* pass back the buffer */
@@ -1242,7 +1243,7 @@ CF_INLINE bool is_file(const char *filename)
 }
 
 #if CURL_BUILD_MAC_10_8 || CURL_BUILD_IOS
-static CURLcode darwinssl_version_from_curl(SSLProtocol *darwinver,
+static CURLcode sectransp_version_from_curl(SSLProtocol *darwinver,
                                             long ssl_version)
 {
   switch(ssl_version) {
@@ -1298,7 +1299,6 @@ set_ssl_version_min_max(struct connectdata *conn, int sockindex)
     case CURL_SSLVERSION_DEFAULT:
     case CURL_SSLVERSION_TLSv1:
       ssl_version = CURL_SSLVERSION_TLSv1_0;
-      ssl_version_max = max_supported_version_by_os;
       break;
   }
 
@@ -1313,13 +1313,13 @@ set_ssl_version_min_max(struct connectdata *conn, int sockindex)
   if(SSLSetProtocolVersionMax != NULL) {
     SSLProtocol darwin_ver_min = kTLSProtocol1;
     SSLProtocol darwin_ver_max = kTLSProtocol1;
-    CURLcode result = darwinssl_version_from_curl(&darwin_ver_min,
+    CURLcode result = sectransp_version_from_curl(&darwin_ver_min,
                                                   ssl_version);
     if(result) {
       failf(data, "unsupported min version passed via CURLOPT_SSLVERSION");
       return result;
     }
-    result = darwinssl_version_from_curl(&darwin_ver_max,
+    result = sectransp_version_from_curl(&darwin_ver_max,
                                          ssl_version_max >> 16);
     if(result) {
       failf(data, "unsupported max version passed via CURLOPT_SSLVERSION");
@@ -1362,12 +1362,12 @@ set_ssl_version_min_max(struct connectdata *conn, int sockindex)
 #endif  /* CURL_SUPPORT_MAC_10_8 */
   }
 #endif  /* CURL_BUILD_MAC_10_8 || CURL_BUILD_IOS */
-  failf(data, "DarwinSSL: cannot set SSL protocol");
+  failf(data, "Secure Transport: cannot set SSL protocol");
   return CURLE_SSL_CONNECT_ERROR;
 }
 
 
-static CURLcode darwinssl_connect_step1(struct connectdata *conn,
+static CURLcode sectransp_connect_step1(struct connectdata *conn,
                                         int sockindex)
 {
   struct Curl_easy *data = conn->data;
@@ -1430,7 +1430,6 @@ static CURLcode darwinssl_connect_step1(struct connectdata *conn,
 #if CURL_BUILD_MAC_10_8 || CURL_BUILD_IOS
   if(SSLSetProtocolVersionMax != NULL) {
     switch(conn->ssl_config.version) {
-    case CURL_SSLVERSION_DEFAULT:
     case CURL_SSLVERSION_TLSv1:
       (void)SSLSetProtocolVersionMin(BACKEND->ssl_ctx, kTLSProtocol1);
 #if (CURL_BUILD_MAC_10_13 || CURL_BUILD_IOS_11) && HAVE_BUILTIN_AVAILABLE == 1
@@ -1445,6 +1444,7 @@ static CURLcode darwinssl_connect_step1(struct connectdata *conn,
 #endif /* (CURL_BUILD_MAC_10_13 || CURL_BUILD_IOS_11) &&
           HAVE_BUILTIN_AVAILABLE == 1 */
       break;
+    case CURL_SSLVERSION_DEFAULT:
     case CURL_SSLVERSION_TLSv1_0:
     case CURL_SSLVERSION_TLSv1_1:
     case CURL_SSLVERSION_TLSv1_2:
@@ -1578,7 +1578,7 @@ static CURLcode darwinssl_connect_step1(struct connectdata *conn,
 
 #if (CURL_BUILD_MAC_10_13 || CURL_BUILD_IOS_11) && HAVE_BUILTIN_AVAILABLE == 1
   if(conn->bits.tls_enable_alpn) {
-    if(__builtin_available(macOS 10.13.4, iOS 11, *)) {
+    if(__builtin_available(macOS 10.13.4, iOS 11, tvOS 11, *)) {
       CFMutableArrayRef alpnArr = CFArrayCreateMutable(NULL, 0,
                                                        &kCFTypeArrayCallBacks);
 
@@ -1649,7 +1649,7 @@ static CURLcode darwinssl_connect_step1(struct connectdata *conn,
         }
 
         CFRelease(cert);
-        if(result == CURLE_SSL_CACERT)
+        if(result == CURLE_PEER_FAILED_VERIFICATION)
           return CURLE_SSL_CERTPROBLEM;
         if(result)
           return result;
@@ -1903,7 +1903,6 @@ static CURLcode darwinssl_connect_step1(struct connectdata *conn,
   /* We want to enable 1/n-1 when using a CBC cipher unless the user
      specifically doesn't want us doing that: */
   if(SSLSetSessionOption != NULL) {
-    /* TODO s/data->set.ssl.enable_beast/SSL_SET_OPTION(enable_beast)/g */
     SSLSetSessionOption(BACKEND->ssl_ctx, kSSLSessionOptionSendOneByteRecord,
                       !data->set.ssl.enable_beast);
     SSLSetSessionOption(BACKEND->ssl_ctx, kSSLSessionOptionFalseStart,
@@ -2112,8 +2111,8 @@ static int append_cert_to_array(struct Curl_easy *data,
     return CURLE_OK;
 }
 
-static int verify_cert(const char *cafile, struct Curl_easy *data,
-                       SSLContextRef ctx)
+static CURLcode verify_cert(const char *cafile, struct Curl_easy *data,
+                            SSLContextRef ctx)
 {
   int n = 0, rc;
   long res;
@@ -2235,7 +2234,7 @@ static int verify_cert(const char *cafile, struct Curl_easy *data,
   }
 }
 
-#ifdef DARWIN_SSL_PINNEDPUBKEY
+#ifdef SECTRANSP_PINNEDPUBKEY
 static CURLcode pkp_pin_peer_pubkey(struct Curl_easy *data,
                                     SSLContextRef ctx,
                                     const char *pinnedpubkey)
@@ -2267,14 +2266,14 @@ static CURLcode pkp_pin_peer_pubkey(struct Curl_easy *data,
     if(keyRef == NULL)
       break;
 
-#ifdef DARWIN_SSL_PINNEDPUBKEY_V1
+#ifdef SECTRANSP_PINNEDPUBKEY_V1
 
     publicKeyBits = SecKeyCopyExternalRepresentation(keyRef, NULL);
     CFRelease(keyRef);
     if(publicKeyBits == NULL)
       break;
 
-#elif DARWIN_SSL_PINNEDPUBKEY_V2
+#elif SECTRANSP_PINNEDPUBKEY_V2
 
     OSStatus success = SecItemExport(keyRef, kSecFormatOpenSSL, 0, NULL,
                                      &publicKeyBits);
@@ -2282,7 +2281,7 @@ static CURLcode pkp_pin_peer_pubkey(struct Curl_easy *data,
     if(success != errSecSuccess || publicKeyBits == NULL)
       break;
 
-#endif /* DARWIN_SSL_PINNEDPUBKEY_V2 */
+#endif /* SECTRANSP_PINNEDPUBKEY_V2 */
 
     pubkeylen = CFDataGetLength(publicKeyBits);
     pubkey = (unsigned char *)CFDataGetBytePtr(publicKeyBits);
@@ -2296,7 +2295,7 @@ static CURLcode pkp_pin_peer_pubkey(struct Curl_easy *data,
         /* 2048 bit RSA pubkeylen == 270 */
         spkiHeader = rsa2048SpkiHeader;
         break;
-#ifdef DARWIN_SSL_PINNEDPUBKEY_V1
+#ifdef SECTRANSP_PINNEDPUBKEY_V1
       case 65:
         /* ecDSA secp256r1 pubkeylen == 65 */
         spkiHeader = ecDsaSecp256r1SpkiHeader;
@@ -2309,7 +2308,7 @@ static CURLcode pkp_pin_peer_pubkey(struct Curl_easy *data,
         break;
       default:
         infof(data, "SSL: unhandled public key length: %d\n", pubkeylen);
-#elif DARWIN_SSL_PINNEDPUBKEY_V2
+#elif SECTRANSP_PINNEDPUBKEY_V2
       default:
         /* ecDSA secp256r1 pubkeylen == 91 header already included?
          * ecDSA secp384r1 header already included too
@@ -2317,7 +2316,7 @@ static CURLcode pkp_pin_peer_pubkey(struct Curl_easy *data,
          */
         result = Curl_pin_peer_pubkey(data, pinnedpubkey, pubkey,
                                     pubkeylen);
-#endif /* DARWIN_SSL_PINNEDPUBKEY_V2 */
+#endif /* SECTRANSP_PINNEDPUBKEY_V2 */
         continue; /* break from loop */
     }
 
@@ -2340,10 +2339,10 @@ static CURLcode pkp_pin_peer_pubkey(struct Curl_easy *data,
 
   return result;
 }
-#endif /* DARWIN_SSL_PINNEDPUBKEY */
+#endif /* SECTRANSP_PINNEDPUBKEY */
 
 static CURLcode
-darwinssl_connect_step2(struct connectdata *conn, int sockindex)
+sectransp_connect_step2(struct connectdata *conn, int sockindex)
 {
   struct Curl_easy *data = conn->data;
   struct ssl_connect_data *connssl = &conn->ssl[sockindex];
@@ -2371,13 +2370,13 @@ darwinssl_connect_step2(struct connectdata *conn, int sockindex)
         Leopard's headers */
       case -9841:
         if(SSL_CONN_CONFIG(CAfile) && SSL_CONN_CONFIG(verifypeer)) {
-          int res = verify_cert(SSL_CONN_CONFIG(CAfile), data,
-                                BACKEND->ssl_ctx);
-          if(res != CURLE_OK)
-            return res;
+          CURLcode result = verify_cert(SSL_CONN_CONFIG(CAfile), data,
+                                        BACKEND->ssl_ctx);
+          if(result)
+            return result;
         }
         /* the documentation says we need to call SSLHandshake() again */
-        return darwinssl_connect_step2(conn, sockindex);
+        return sectransp_connect_step2(conn, sockindex);
 
       /* Problem with encrypt / decrypt */
       case errSSLPeerDecodeError:
@@ -2429,37 +2428,37 @@ darwinssl_connect_step2(struct connectdata *conn, int sockindex)
       /* These are all certificate problems with the server: */
       case errSSLXCertChainInvalid:
         failf(data, "SSL certificate problem: Invalid certificate chain");
-        return CURLE_SSL_CACERT;
+        return CURLE_PEER_FAILED_VERIFICATION;
       case errSSLUnknownRootCert:
         failf(data, "SSL certificate problem: Untrusted root certificate");
-        return CURLE_SSL_CACERT;
+        return CURLE_PEER_FAILED_VERIFICATION;
       case errSSLNoRootCert:
         failf(data, "SSL certificate problem: No root certificate");
-        return CURLE_SSL_CACERT;
+        return CURLE_PEER_FAILED_VERIFICATION;
       case errSSLCertNotYetValid:
         failf(data, "SSL certificate problem: The certificate chain had a "
                     "certificate that is not yet valid");
-        return CURLE_SSL_CACERT;
+        return CURLE_PEER_FAILED_VERIFICATION;
       case errSSLCertExpired:
       case errSSLPeerCertExpired:
         failf(data, "SSL certificate problem: Certificate chain had an "
               "expired certificate");
-        return CURLE_SSL_CACERT;
+        return CURLE_PEER_FAILED_VERIFICATION;
       case errSSLBadCert:
       case errSSLPeerBadCert:
         failf(data, "SSL certificate problem: Couldn't understand the server "
               "certificate format");
-        return CURLE_SSL_CACERT;
+        return CURLE_PEER_FAILED_VERIFICATION;
       case errSSLPeerUnsupportedCert:
         failf(data, "SSL certificate problem: An unsupported certificate "
                     "format was encountered");
-        return CURLE_SSL_CACERT;
+        return CURLE_PEER_FAILED_VERIFICATION;
       case errSSLPeerCertRevoked:
         failf(data, "SSL certificate problem: The certificate was revoked");
-        return CURLE_SSL_CACERT;
+        return CURLE_PEER_FAILED_VERIFICATION;
       case errSSLPeerCertUnknown:
         failf(data, "SSL certificate problem: The certificate is unknown");
-        return CURLE_SSL_CACERT;
+        return CURLE_PEER_FAILED_VERIFICATION;
 
       /* These are all certificate problems with the client: */
       case errSecAuthFailed:
@@ -2579,7 +2578,7 @@ darwinssl_connect_step2(struct connectdata *conn, int sockindex)
     /* we have been connected fine, we're not waiting for anything else. */
     connssl->connecting_state = ssl_connect_3;
 
-#ifdef DARWIN_SSL_PINNEDPUBKEY
+#ifdef SECTRANSP_PINNEDPUBKEY
     if(data->set.str[STRING_SSL_PINNEDPUBLICKEY_ORIG]) {
       CURLcode result = pkp_pin_peer_pubkey(data, BACKEND->ssl_ctx,
                             data->set.str[STRING_SSL_PINNEDPUBLICKEY_ORIG]);
@@ -2588,7 +2587,7 @@ darwinssl_connect_step2(struct connectdata *conn, int sockindex)
         return result;
       }
     }
-#endif /* DARWIN_SSL_PINNEDPUBKEY */
+#endif /* SECTRANSP_PINNEDPUBKEY */
 
     /* Informational message */
     (void)SSLGetNegotiatedCipher(BACKEND->ssl_ctx, &cipher);
@@ -2629,7 +2628,7 @@ darwinssl_connect_step2(struct connectdata *conn, int sockindex)
 
 #if(CURL_BUILD_MAC_10_13 || CURL_BUILD_IOS_11) && HAVE_BUILTIN_AVAILABLE == 1
     if(conn->bits.tls_enable_alpn) {
-      if(__builtin_available(macOS 10.13.4, iOS 11, *)) {
+      if(__builtin_available(macOS 10.13.4, iOS 11, tvOS 11, *)) {
         CFArrayRef alpnArr = NULL;
         CFStringRef chosenProtocol = NULL;
         err = SSLCopyALPNProtocols(BACKEND->ssl_ctx, &alpnArr);
@@ -2652,6 +2651,9 @@ darwinssl_connect_step2(struct connectdata *conn, int sockindex)
         else
           infof(data, "ALPN, server did not agree to a protocol\n");
 
+        Curl_multiuse_state(conn, conn->negnpn == CURL_HTTP_VERSION_2 ?
+                            BUNDLE_MULTIPLEX : BUNDLE_NO_MULTIUSE);
+
         /* chosenProtocol is a reference to the string within alpnArr
            and doesn't need to be freed separately */
         if(alpnArr)
@@ -2772,7 +2774,7 @@ show_verbose_server_cert(struct connectdata *conn,
 #endif /* !CURL_DISABLE_VERBOSE_STRINGS */
 
 static CURLcode
-darwinssl_connect_step3(struct connectdata *conn,
+sectransp_connect_step3(struct connectdata *conn,
                         int sockindex)
 {
   struct Curl_easy *data = conn->data;
@@ -2790,11 +2792,11 @@ darwinssl_connect_step3(struct connectdata *conn,
   return CURLE_OK;
 }
 
-static Curl_recv darwinssl_recv;
-static Curl_send darwinssl_send;
+static Curl_recv sectransp_recv;
+static Curl_send sectransp_send;
 
 static CURLcode
-darwinssl_connect_common(struct connectdata *conn,
+sectransp_connect_common(struct connectdata *conn,
                          int sockindex,
                          bool nonblocking,
                          bool *done)
@@ -2803,7 +2805,7 @@ darwinssl_connect_common(struct connectdata *conn,
   struct Curl_easy *data = conn->data;
   struct ssl_connect_data *connssl = &conn->ssl[sockindex];
   curl_socket_t sockfd = conn->sock[sockindex];
-  long timeout_ms;
+  timediff_t timeout_ms;
   int what;
 
   /* check if the connection has already been established */
@@ -2822,7 +2824,7 @@ darwinssl_connect_common(struct connectdata *conn,
       return CURLE_OPERATION_TIMEDOUT;
     }
 
-    result = darwinssl_connect_step1(conn, sockindex);
+    result = sectransp_connect_step1(conn, sockindex);
     if(result)
       return result;
   }
@@ -2850,7 +2852,7 @@ darwinssl_connect_common(struct connectdata *conn,
       connssl->connecting_state?sockfd:CURL_SOCKET_BAD;
 
       what = Curl_socket_check(readfd, CURL_SOCKET_BAD, writefd,
-                               nonblocking?0:timeout_ms);
+                               nonblocking?0:(time_t)timeout_ms);
       if(what < 0) {
         /* fatal error */
         failf(data, "select/poll on SSL socket, errno: %d", SOCKERRNO);
@@ -2876,7 +2878,7 @@ darwinssl_connect_common(struct connectdata *conn,
      * before step2 has completed while ensuring that a client using select()
      * or epoll() will always have a valid fdset to wait on.
      */
-    result = darwinssl_connect_step2(conn, sockindex);
+    result = sectransp_connect_step2(conn, sockindex);
     if(result || (nonblocking &&
                   (ssl_connect_2 == connssl->connecting_state ||
                    ssl_connect_2_reading == connssl->connecting_state ||
@@ -2887,15 +2889,15 @@ darwinssl_connect_common(struct connectdata *conn,
 
 
   if(ssl_connect_3 == connssl->connecting_state) {
-    result = darwinssl_connect_step3(conn, sockindex);
+    result = sectransp_connect_step3(conn, sockindex);
     if(result)
       return result;
   }
 
   if(ssl_connect_done == connssl->connecting_state) {
     connssl->state = ssl_connection_complete;
-    conn->recv[sockindex] = darwinssl_recv;
-    conn->send[sockindex] = darwinssl_send;
+    conn->recv[sockindex] = sectransp_recv;
+    conn->send[sockindex] = sectransp_send;
     *done = TRUE;
   }
   else
@@ -2907,18 +2909,18 @@ darwinssl_connect_common(struct connectdata *conn,
   return CURLE_OK;
 }
 
-static CURLcode Curl_darwinssl_connect_nonblocking(struct connectdata *conn,
+static CURLcode Curl_sectransp_connect_nonblocking(struct connectdata *conn,
                                                    int sockindex, bool *done)
 {
-  return darwinssl_connect_common(conn, sockindex, TRUE, done);
+  return sectransp_connect_common(conn, sockindex, TRUE, done);
 }
 
-static CURLcode Curl_darwinssl_connect(struct connectdata *conn, int sockindex)
+static CURLcode Curl_sectransp_connect(struct connectdata *conn, int sockindex)
 {
   CURLcode result;
   bool done = FALSE;
 
-  result = darwinssl_connect_common(conn, sockindex, FALSE, &done);
+  result = sectransp_connect_common(conn, sockindex, FALSE, &done);
 
   if(result)
     return result;
@@ -2928,7 +2930,7 @@ static CURLcode Curl_darwinssl_connect(struct connectdata *conn, int sockindex)
   return CURLE_OK;
 }
 
-static void Curl_darwinssl_close(struct connectdata *conn, int sockindex)
+static void Curl_sectransp_close(struct connectdata *conn, int sockindex)
 {
   struct ssl_connect_data *connssl = &conn->ssl[sockindex];
 
@@ -2949,7 +2951,7 @@ static void Curl_darwinssl_close(struct connectdata *conn, int sockindex)
   BACKEND->ssl_sockfd = 0;
 }
 
-static int Curl_darwinssl_shutdown(struct connectdata *conn, int sockindex)
+static int Curl_sectransp_shutdown(struct connectdata *conn, int sockindex)
 {
   struct ssl_connect_data *connssl = &conn->ssl[sockindex];
   struct Curl_easy *data = conn->data;
@@ -2961,10 +2963,12 @@ static int Curl_darwinssl_shutdown(struct connectdata *conn, int sockindex)
   if(!BACKEND->ssl_ctx)
     return 0;
 
+#ifndef CURL_DISABLE_FTP
   if(data->set.ftp_ccc != CURLFTPSSL_CCC_ACTIVE)
     return 0;
+#endif
 
-  Curl_darwinssl_close(conn, sockindex);
+  Curl_sectransp_close(conn, sockindex);
 
   rc = 0;
 
@@ -3002,20 +3006,20 @@ static int Curl_darwinssl_shutdown(struct connectdata *conn, int sockindex)
   return rc;
 }
 
-static void Curl_darwinssl_session_free(void *ptr)
+static void Curl_sectransp_session_free(void *ptr)
 {
   /* ST, as of iOS 5 and Mountain Lion, has no public method of deleting a
      cached session ID inside the Security framework. There is a private
      function that does this, but I don't want to have to explain to you why I
      got your application rejected from the App Store due to the use of a
      private API, so the best we can do is free up our own char array that we
-     created way back in darwinssl_connect_step1... */
+     created way back in sectransp_connect_step1... */
   Curl_safefree(ptr);
 }
 
-static size_t Curl_darwinssl_version(char *buffer, size_t size)
+static size_t Curl_sectransp_version(char *buffer, size_t size)
 {
-  return snprintf(buffer, size, "SecureTransport");
+  return msnprintf(buffer, size, "SecureTransport");
 }
 
 /*
@@ -3026,7 +3030,7 @@ static size_t Curl_darwinssl_version(char *buffer, size_t size)
  *     0 means the connection has been closed
  *    -1 means the connection status is unknown
  */
-static int Curl_darwinssl_check_cxn(struct connectdata *conn)
+static int Curl_sectransp_check_cxn(struct connectdata *conn)
 {
   struct ssl_connect_data *connssl = &conn->ssl[FIRSTSOCKET];
   OSStatus err;
@@ -3041,7 +3045,7 @@ static int Curl_darwinssl_check_cxn(struct connectdata *conn)
   return 0;
 }
 
-static bool Curl_darwinssl_data_pending(const struct connectdata *conn,
+static bool Curl_sectransp_data_pending(const struct connectdata *conn,
                                         int connindex)
 {
   const struct ssl_connect_data *connssl = &conn->ssl[connindex];
@@ -3058,7 +3062,7 @@ static bool Curl_darwinssl_data_pending(const struct connectdata *conn,
     return false;
 }
 
-static CURLcode Curl_darwinssl_random(struct Curl_easy *data UNUSED_PARAM,
+static CURLcode Curl_sectransp_random(struct Curl_easy *data UNUSED_PARAM,
                                       unsigned char *entropy, size_t length)
 {
   /* arc4random_buf() isn't available on cats older than Lion, so let's
@@ -3078,7 +3082,7 @@ static CURLcode Curl_darwinssl_random(struct Curl_easy *data UNUSED_PARAM,
   return CURLE_OK;
 }
 
-static CURLcode Curl_darwinssl_md5sum(unsigned char *tmp, /* input */
+static CURLcode Curl_sectransp_md5sum(unsigned char *tmp, /* input */
                                       size_t tmplen,
                                       unsigned char *md5sum, /* output */
                                       size_t md5len)
@@ -3088,7 +3092,7 @@ static CURLcode Curl_darwinssl_md5sum(unsigned char *tmp, /* input */
   return CURLE_OK;
 }
 
-static CURLcode Curl_darwinssl_sha256sum(const unsigned char *tmp, /* input */
+static CURLcode Curl_sectransp_sha256sum(const unsigned char *tmp, /* input */
                                      size_t tmplen,
                                      unsigned char *sha256sum, /* output */
                                      size_t sha256len)
@@ -3098,7 +3102,7 @@ static CURLcode Curl_darwinssl_sha256sum(const unsigned char *tmp, /* input */
   return CURLE_OK;
 }
 
-static bool Curl_darwinssl_false_start(void)
+static bool Curl_sectransp_false_start(void)
 {
 #if CURL_BUILD_MAC_10_9 || CURL_BUILD_IOS_7
   if(SSLSetSessionOption != NULL)
@@ -3107,7 +3111,7 @@ static bool Curl_darwinssl_false_start(void)
   return FALSE;
 }
 
-static ssize_t darwinssl_send(struct connectdata *conn,
+static ssize_t sectransp_send(struct connectdata *conn,
                               int sockindex,
                               const void *mem,
                               size_t len,
@@ -3173,7 +3177,7 @@ static ssize_t darwinssl_send(struct connectdata *conn,
   return (ssize_t)processed;
 }
 
-static ssize_t darwinssl_recv(struct connectdata *conn,
+static ssize_t sectransp_recv(struct connectdata *conn,
                               int num,
                               char *buf,
                               size_t buffersize,
@@ -3182,7 +3186,10 @@ static ssize_t darwinssl_recv(struct connectdata *conn,
   /*struct Curl_easy *data = conn->data;*/
   struct ssl_connect_data *connssl = &conn->ssl[num];
   size_t processed = 0UL;
-  OSStatus err = SSLRead(BACKEND->ssl_ctx, buf, buffersize, &processed);
+  OSStatus err;
+
+  again:
+  err = SSLRead(BACKEND->ssl_ctx, buf, buffersize, &processed);
 
   if(err != noErr) {
     switch(err) {
@@ -3203,6 +3210,16 @@ static ssize_t darwinssl_recv(struct connectdata *conn,
         return -1L;
         break;
 
+        /* The below is errSSLPeerAuthCompleted; it's not defined in
+           Leopard's headers */
+      case -9841:
+        if(SSL_CONN_CONFIG(CAfile) && SSL_CONN_CONFIG(verifypeer)) {
+          CURLcode result = verify_cert(SSL_CONN_CONFIG(CAfile), conn->data,
+                                        BACKEND->ssl_ctx);
+          if(result)
+            return result;
+        }
+        goto again;
       default:
         failf(conn->data, "SSLRead() return error %d", err);
         *curlcode = CURLE_RECV_ERROR;
@@ -3213,48 +3230,48 @@ static ssize_t darwinssl_recv(struct connectdata *conn,
   return (ssize_t)processed;
 }
 
-static void *Curl_darwinssl_get_internals(struct ssl_connect_data *connssl,
+static void *Curl_sectransp_get_internals(struct ssl_connect_data *connssl,
                                           CURLINFO info UNUSED_PARAM)
 {
   (void)info;
   return BACKEND->ssl_ctx;
 }
 
-const struct Curl_ssl Curl_ssl_darwinssl = {
-  { CURLSSLBACKEND_DARWINSSL, "darwinssl" }, /* info */
+const struct Curl_ssl Curl_ssl_sectransp = {
+  { CURLSSLBACKEND_SECURETRANSPORT, "secure-transport" }, /* info */
 
-#ifdef DARWIN_SSL_PINNEDPUBKEY
+#ifdef SECTRANSP_PINNEDPUBKEY
   SSLSUPP_PINNEDPUBKEY,
 #else
   0,
-#endif /* DARWIN_SSL_PINNEDPUBKEY */
+#endif /* SECTRANSP_PINNEDPUBKEY */
 
   sizeof(struct ssl_backend_data),
 
   Curl_none_init,                     /* init */
   Curl_none_cleanup,                  /* cleanup */
-  Curl_darwinssl_version,             /* version */
-  Curl_darwinssl_check_cxn,           /* check_cxn */
-  Curl_darwinssl_shutdown,            /* shutdown */
-  Curl_darwinssl_data_pending,        /* data_pending */
-  Curl_darwinssl_random,              /* random */
+  Curl_sectransp_version,             /* version */
+  Curl_sectransp_check_cxn,           /* check_cxn */
+  Curl_sectransp_shutdown,            /* shutdown */
+  Curl_sectransp_data_pending,        /* data_pending */
+  Curl_sectransp_random,              /* random */
   Curl_none_cert_status_request,      /* cert_status_request */
-  Curl_darwinssl_connect,             /* connect */
-  Curl_darwinssl_connect_nonblocking, /* connect_nonblocking */
-  Curl_darwinssl_get_internals,       /* get_internals */
-  Curl_darwinssl_close,               /* close_one */
+  Curl_sectransp_connect,             /* connect */
+  Curl_sectransp_connect_nonblocking, /* connect_nonblocking */
+  Curl_sectransp_get_internals,       /* get_internals */
+  Curl_sectransp_close,               /* close_one */
   Curl_none_close_all,                /* close_all */
-  Curl_darwinssl_session_free,        /* session_free */
+  Curl_sectransp_session_free,        /* session_free */
   Curl_none_set_engine,               /* set_engine */
   Curl_none_set_engine_default,       /* set_engine_default */
   Curl_none_engines_list,             /* engines_list */
-  Curl_darwinssl_false_start,         /* false_start */
-  Curl_darwinssl_md5sum,              /* md5sum */
-  Curl_darwinssl_sha256sum            /* sha256sum */
+  Curl_sectransp_false_start,         /* false_start */
+  Curl_sectransp_md5sum,              /* md5sum */
+  Curl_sectransp_sha256sum            /* sha256sum */
 };
 
 #ifdef __clang__
 #pragma clang diagnostic pop
 #endif
 
-#endif /* USE_DARWINSSL */
+#endif /* USE_SECTRANSP */
similarity index 80%
rename from lib/vtls/darwinssl.h
rename to lib/vtls/sectransp.h
index 23c7f70..5cec797 100644 (file)
@@ -1,5 +1,5 @@
-#ifndef HEADER_CURL_DARWINSSL_H
-#define HEADER_CURL_DARWINSSL_H
+#ifndef HEADER_CURL_SECTRANSP_H
+#define HEADER_CURL_SECTRANSP_H
 /***************************************************************************
  *                                  _   _ ____  _
  *  Project                     ___| | | |  _ \| |
@@ -8,7 +8,7 @@
  *                             \___|\___/|_| \_\_____|
  *
  * Copyright (C) 2012 - 2014, Nick Zitzmann, <nickzman@gmail.com>.
- * Copyright (C) 2012 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 2012 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -24,9 +24,9 @@
  ***************************************************************************/
 #include "curl_setup.h"
 
-#ifdef USE_DARWINSSL
+#ifdef USE_SECTRANSP
 
-extern const struct Curl_ssl Curl_ssl_darwinssl;
+extern const struct Curl_ssl Curl_ssl_sectransp;
 
-#endif /* USE_DARWINSSL */
-#endif /* HEADER_CURL_DARWINSSL_H */
+#endif /* USE_SECTRANSP */
+#endif /* HEADER_CURL_SECTRANSP_H */
index 6af39fe..c493b15 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -97,7 +97,8 @@ Curl_ssl_config_matches(struct ssl_primary_config* data,
      Curl_safe_strcasecompare(data->random_file, needle->random_file) &&
      Curl_safe_strcasecompare(data->egdsocket, needle->egdsocket) &&
      Curl_safe_strcasecompare(data->cipher_list, needle->cipher_list) &&
-     Curl_safe_strcasecompare(data->cipher_list13, needle->cipher_list13))
+     Curl_safe_strcasecompare(data->cipher_list13, needle->cipher_list13) &&
+     Curl_safe_strcasecompare(data->pinned_key, needle->pinned_key))
     return TRUE;
 
   return FALSE;
@@ -121,6 +122,7 @@ Curl_clone_primary_ssl_config(struct ssl_primary_config *source,
   CLONE_STRING(egdsocket);
   CLONE_STRING(cipher_list);
   CLONE_STRING(cipher_list13);
+  CLONE_STRING(pinned_key);
 
   return TRUE;
 }
@@ -134,6 +136,7 @@ void Curl_free_primary_ssl_config(struct ssl_primary_config* sslc)
   Curl_safefree(sslc->egdsocket);
   Curl_safefree(sslc->cipher_list);
   Curl_safefree(sslc->cipher_list13);
+  Curl_safefree(sslc->pinned_key);
 }
 
 #ifdef USE_SSL
@@ -248,7 +251,7 @@ Curl_ssl_connect(struct connectdata *conn, int sockindex)
   conn->ssl[sockindex].use = TRUE;
   conn->ssl[sockindex].state = ssl_connection_negotiating;
 
-  result = Curl_ssl->connect(conn, sockindex);
+  result = Curl_ssl->connect_blocking(conn, sockindex);
 
   if(!result)
     Curl_pgrsTime(conn->data, TIMER_APPCONNECT); /* SSL is connected */
@@ -498,9 +501,9 @@ CURLcode Curl_ssl_addsessionid(struct connectdata *conn,
 
 void Curl_ssl_close_all(struct Curl_easy *data)
 {
-  size_t i;
   /* kill the session ID cache if not shared */
   if(data->state.session && !SSLSESSION_SHARED(data)) {
+    size_t i;
     for(i = 0; i < data->set.general_ssl.max_ssl_sessions; i++)
       /* the single-killer function handles empty table slots */
       Curl_ssl_kill_session(&data->state.session[i]);
@@ -513,16 +516,12 @@ void Curl_ssl_close_all(struct Curl_easy *data)
 }
 
 #if defined(USE_OPENSSL) || defined(USE_GNUTLS) || defined(USE_SCHANNEL) || \
-  defined(USE_DARWINSSL) || defined(USE_POLARSSL) || defined(USE_NSS) || \
-  defined(USE_MBEDTLS) || defined(USE_CYASSL)
-int Curl_ssl_getsock(struct connectdata *conn, curl_socket_t *socks,
-                     int numsocks)
+  defined(USE_SECTRANSP) || defined(USE_POLARSSL) || defined(USE_NSS) || \
+  defined(USE_MBEDTLS) || defined(USE_WOLFSSL) || defined(USE_BEARSSL)
+int Curl_ssl_getsock(struct connectdata *conn, curl_socket_t *socks)
 {
   struct ssl_connect_data *connssl = &conn->ssl[FIRSTSOCKET];
 
-  if(!numsocks)
-    return GETSOCK_BLANK;
-
   if(connssl->connecting_state == ssl_connect_2_writing) {
     /* write mode */
     socks[0] = conn->sock[FIRSTSOCKET];
@@ -538,15 +537,13 @@ int Curl_ssl_getsock(struct connectdata *conn, curl_socket_t *socks,
 }
 #else
 int Curl_ssl_getsock(struct connectdata *conn,
-                     curl_socket_t *socks,
-                     int numsocks)
+                     curl_socket_t *socks)
 {
   (void)conn;
   (void)socks;
-  (void)numsocks;
   return GETSOCK_BLANK;
 }
-/* USE_OPENSSL || USE_GNUTLS || USE_SCHANNEL || USE_DARWINSSL || USE_NSS */
+/* USE_OPENSSL || USE_GNUTLS || USE_SCHANNEL || USE_SECTRANSP || USE_NSS */
 #endif
 
 void Curl_ssl_close(struct connectdata *conn, int sockindex)
@@ -557,7 +554,7 @@ void Curl_ssl_close(struct connectdata *conn, int sockindex)
 
 CURLcode Curl_ssl_shutdown(struct connectdata *conn, int sockindex)
 {
-  if(Curl_ssl->shutdown(conn, sockindex))
+  if(Curl_ssl->shut_down(conn, sockindex))
     return CURLE_SSL_SHUTDOWN_FAILED;
 
   conn->ssl[sockindex].use = FALSE; /* get back to ordinary socket usage */
@@ -644,11 +641,11 @@ bool Curl_ssl_data_pending(const struct connectdata *conn,
 
 void Curl_ssl_free_certinfo(struct Curl_easy *data)
 {
-  int i;
   struct curl_certinfo *ci = &data->info.certs;
 
   if(ci->num_of_certs) {
     /* free all individual lists used */
+    int i;
     for(i = 0; i<ci->num_of_certs; i++) {
       curl_slist_free_all(ci->certinfo[i]);
       ci->certinfo[i] = NULL;
@@ -700,7 +697,7 @@ CURLcode Curl_ssl_push_certinfo_len(struct Curl_easy *data,
     return CURLE_OUT_OF_MEMORY;
 
   /* sprintf the label and colon */
-  snprintf(output, outlen, "%s:", label);
+  msnprintf(output, outlen, "%s:", label);
 
   /* memcpy the value (it might not be zero terminated) */
   memcpy(&output[labellen + 1], value, valuelen);
@@ -808,14 +805,7 @@ CURLcode Curl_pin_peer_pubkey(struct Curl_easy *data,
 {
   FILE *fp;
   unsigned char *buf = NULL, *pem_ptr = NULL;
-  long filesize;
-  size_t size, pem_len;
-  CURLcode pem_read;
   CURLcode result = CURLE_SSL_PINNEDPUBKEYNOTMATCH;
-  CURLcode encode;
-  size_t encodedlen, pinkeylen;
-  char *encoded, *pinkeycopy, *begin_pos, *end_pos;
-  unsigned char *sha256sumdigest = NULL;
 
   /* if a path wasn't specified, don't pin */
   if(!pinnedpubkey)
@@ -825,6 +815,11 @@ CURLcode Curl_pin_peer_pubkey(struct Curl_easy *data,
 
   /* only do this if pinnedpubkey starts with "sha256//", length 8 */
   if(strncmp(pinnedpubkey, "sha256//", 8) == 0) {
+    CURLcode encode;
+    size_t encodedlen, pinkeylen;
+    char *encoded, *pinkeycopy, *begin_pos, *end_pos;
+    unsigned char *sha256sumdigest;
+
     if(!Curl_ssl->sha256sum) {
       /* without sha256 support, this cannot match */
       return result;
@@ -895,6 +890,10 @@ CURLcode Curl_pin_peer_pubkey(struct Curl_easy *data,
     return result;
 
   do {
+    long filesize;
+    size_t size, pem_len;
+    CURLcode pem_read;
+
     /* Determine the file's size */
     if(fseek(fp, 0, SEEK_END))
       break;
@@ -1114,7 +1113,7 @@ static CURLcode Curl_multissl_connect(struct connectdata *conn, int sockindex)
 {
   if(multissl_init(NULL))
     return CURLE_FAILED_INIT;
-  return Curl_ssl->connect(conn, sockindex);
+  return Curl_ssl->connect_blocking(conn, sockindex);
 }
 
 static CURLcode Curl_multissl_connect_nonblocking(struct connectdata *conn,
@@ -1170,12 +1169,10 @@ static const struct Curl_ssl Curl_ssl_multi = {
 const struct Curl_ssl *Curl_ssl =
 #if defined(CURL_WITH_MULTI_SSL)
   &Curl_ssl_multi;
-#elif defined(USE_AXTLS)
-  &Curl_ssl_axtls;
-#elif defined(USE_CYASSL)
-  &Curl_ssl_cyassl;
-#elif defined(USE_DARWINSSL)
-  &Curl_ssl_darwinssl;
+#elif defined(USE_WOLFSSL)
+  &Curl_ssl_wolfssl;
+#elif defined(USE_SECTRANSP)
+  &Curl_ssl_sectransp;
 #elif defined(USE_GNUTLS)
   &Curl_ssl_gnutls;
 #elif defined(USE_GSKIT)
@@ -1192,19 +1189,18 @@ const struct Curl_ssl *Curl_ssl =
   &Curl_ssl_schannel;
 #elif defined(USE_MESALINK)
   &Curl_ssl_mesalink;
+#elif defined(USE_BEARSSL)
+  &Curl_ssl_bearssl;
 #else
 #error "Missing struct Curl_ssl for selected SSL backend"
 #endif
 
 static const struct Curl_ssl *available_backends[] = {
-#if defined(USE_AXTLS)
-  &Curl_ssl_axtls,
-#endif
-#if defined(USE_CYASSL)
-  &Curl_ssl_cyassl,
+#if defined(USE_WOLFSSL)
+  &Curl_ssl_wolfssl,
 #endif
-#if defined(USE_DARWINSSL)
-  &Curl_ssl_darwinssl,
+#if defined(USE_SECTRANSP)
+  &Curl_ssl_sectransp,
 #endif
 #if defined(USE_GNUTLS)
   &Curl_ssl_gnutls,
@@ -1230,6 +1226,9 @@ static const struct Curl_ssl *available_backends[] = {
 #if defined(USE_MESALINK)
   &Curl_ssl_mesalink,
 #endif
+#if defined(USE_BEARSSL)
+  &Curl_ssl_bearssl,
+#endif
   NULL
 };
 
@@ -1244,16 +1243,17 @@ static size_t Curl_multissl_version(char *buffer, size_t size)
 
   if(current != selected) {
     char *p = backends;
+    char *end = backends + sizeof(backends);
     int i;
 
     selected = current;
 
-    for(i = 0; available_backends[i]; i++) {
+    for(i = 0; available_backends[i] && p < (end - 4); i++) {
       if(i)
         *(p++) = ' ';
       if(selected != available_backends[i])
         *(p++) = '(';
-      p += available_backends[i]->version(p, backends + sizeof(backends) - p);
+      p += available_backends[i]->version(p, end - p - 2);
       if(selected != available_backends[i])
         *(p++) = ')';
     }
@@ -1261,21 +1261,20 @@ static size_t Curl_multissl_version(char *buffer, size_t size)
     total = p - backends;
   }
 
-  if(size < total)
+  if(size > total)
     memcpy(buffer, backends, total + 1);
   else {
     memcpy(buffer, backends, size - 1);
     buffer[size - 1] = '\0';
   }
 
-  return total;
+  return CURLMIN(size - 1, total);
 }
 
 static int multissl_init(const struct Curl_ssl *backend)
 {
   const char *env;
   char *env_tmp;
-  int i;
 
   if(Curl_ssl != &Curl_ssl_multi)
     return 1;
@@ -1294,6 +1293,7 @@ static int multissl_init(const struct Curl_ssl *backend)
     env = CURL_DEFAULT_SSL_BACKEND;
 #endif
   if(env) {
+    int i;
     for(i = 0; available_backends[i]; i++) {
       if(strcasecompare(env, available_backends[i]->info.name)) {
         Curl_ssl = available_backends[i];
@@ -1318,7 +1318,14 @@ CURLsslset curl_global_sslset(curl_sslbackend id, const char *name,
     *avail = (const curl_ssl_backend **)&available_backends;
 
   if(Curl_ssl != &Curl_ssl_multi)
-    return id == Curl_ssl->info.id ? CURLSSLSET_OK : CURLSSLSET_TOO_LATE;
+    return id == Curl_ssl->info.id ||
+           (name && strcasecompare(name, Curl_ssl->info.name)) ?
+           CURLSSLSET_OK :
+#if defined(CURL_WITH_MULTI_SSL)
+           CURLSSLSET_TOO_LATE;
+#else
+           CURLSSLSET_UNKNOWN_BACKEND;
+#endif
 
   for(i = 0; available_backends[i]; i++) {
     if(available_backends[i]->info.id == id ||
index 5cd1160..976cc43 100644 (file)
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -47,7 +47,7 @@ struct Curl_ssl {
 
   size_t (*version)(char *buffer, size_t size);
   int (*check_cxn)(struct connectdata *cxn);
-  int (*shutdown)(struct connectdata *conn, int sockindex);
+  int (*shut_down)(struct connectdata *conn, int sockindex);
   bool (*data_pending)(const struct connectdata *conn,
                        int connindex);
 
@@ -56,7 +56,7 @@ struct Curl_ssl {
                      size_t length);
   bool (*cert_status_request)(void);
 
-  CURLcode (*connect)(struct connectdata *conn, int sockindex);
+  CURLcode (*connect_blocking)(struct connectdata *conn, int sockindex);
   CURLcode (*connect_nonblocking)(struct connectdata *conn, int sockindex,
                                   bool *done);
   void *(*get_internals)(struct ssl_connect_data *connssl, CURLINFO info);
@@ -103,12 +103,12 @@ CURLcode Curl_none_md5sum(unsigned char *input, size_t inputlen,
 #include "nssg.h"           /* NSS versions */
 #include "gskit.h"          /* Global Secure ToolKit versions */
 #include "polarssl.h"       /* PolarSSL versions */
-#include "axtls.h"          /* axTLS versions */
-#include "cyassl.h"         /* CyaSSL versions */
+#include "wolfssl.h"        /* wolfSSL versions */
 #include "schannel.h"       /* Schannel SSPI version */
-#include "darwinssl.h"      /* SecureTransport (Darwin) version */
+#include "sectransp.h"      /* SecureTransport (Darwin) version */
 #include "mbedtls.h"        /* mbedTLS versions */
 #include "mesalink.h"       /* MesaLink versions */
+#include "bearssl.h"        /* BearSSL versions */
 
 #ifndef MAX_PINNED_PUBKEY_SIZE
 #define MAX_PINNED_PUBKEY_SIZE 1048576 /* 1MB */
@@ -144,8 +144,7 @@ bool Curl_ssl_config_matches(struct ssl_primary_config* data,
 bool Curl_clone_primary_ssl_config(struct ssl_primary_config *source,
                                    struct ssl_primary_config *dest);
 void Curl_free_primary_ssl_config(struct ssl_primary_config* sslc);
-int Curl_ssl_getsock(struct connectdata *conn, curl_socket_t *socks,
-                     int numsocks);
+int Curl_ssl_getsock(struct connectdata *conn, curl_socket_t *socks);
 
 int Curl_ssl_backend(void);
 
similarity index 78%
rename from lib/vtls/cyassl.c
rename to lib/vtls/wolfssl.c
index e10398a..890bcbf 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
  ***************************************************************************/
 
 /*
- * Source file for all CyaSSL-specific code for the TLS/SSL layer. No code
+ * Source file for all wolfSSL specific code for the TLS/SSL layer. No code
  * but vtls.c should ever call or use these functions.
  *
  */
 
 #include "curl_setup.h"
 
-#ifdef USE_CYASSL
+#ifdef USE_WOLFSSL
 
 #define WOLFSSL_OPTIONS_IGNORE_SYS
-/* CyaSSL's version.h, which should contain only the version, should come
-before all other CyaSSL includes and be immediately followed by build config
-aka options.h. https://curl.haxx.se/mail/lib-2015-04/0069.html */
-#include <cyassl/version.h>
-#if defined(HAVE_CYASSL_OPTIONS_H) && (LIBCYASSL_VERSION_HEX > 0x03004008)
-#if defined(CYASSL_API) || defined(WOLFSSL_API)
-/* Safety measure. If either is defined some API include was already included
-and that's a problem since options.h hasn't been included yet. */
-#error "CyaSSL API was included before the CyaSSL build options."
-#endif
-#include <cyassl/options.h>
-#endif
+#include <wolfssl/version.h>
+#include <wolfssl/options.h>
 
 /* To determine what functions are available we rely on one or both of:
-   - the user's options.h generated by CyaSSL/wolfSSL
+   - the user's options.h generated by wolfSSL
    - the symbols detected by curl's configure
    Since they are markedly different from one another, and one or the other may
    not be available, we do some checking below to bring things in sync. */
@@ -61,21 +51,12 @@ and that's a problem since options.h hasn't been included yet. */
    options.h, but is only seen in >= 3.6.6 since that's when they started
    disabling SSLv3 by default. */
 #ifndef WOLFSSL_ALLOW_SSLV3
-#if (LIBCYASSL_VERSION_HEX < 0x03006006) || \
-    defined(HAVE_WOLFSSLV3_CLIENT_METHOD)
+#if (LIBWOLFSSL_VERSION_HEX < 0x03006006) || \
+  defined(HAVE_WOLFSSLV3_CLIENT_METHOD)
 #define WOLFSSL_ALLOW_SSLV3
 #endif
 #endif
 
-/* HAVE_SUPPORTED_CURVES is wolfSSL's build time symbol for enabling the ECC
-   supported curve extension in options.h. Note ECC is enabled separately. */
-#ifndef HAVE_SUPPORTED_CURVES
-#if defined(HAVE_CYASSL_CTX_USESUPPORTEDCURVE) || \
-    defined(HAVE_WOLFSSL_CTX_USESUPPORTEDCURVE)
-#define HAVE_SUPPORTED_CURVES
-#endif
-#endif
-
 #include <limits.h>
 
 #include "urldata.h"
@@ -88,34 +69,23 @@ and that's a problem since options.h hasn't been included yet. */
 #include "strcase.h"
 #include "x509asn1.h"
 #include "curl_printf.h"
+#include "multiif.h"
 
-#include <cyassl/openssl/ssl.h>
-#include <cyassl/ssl.h>
-#ifdef HAVE_CYASSL_ERROR_SSL_H
-#include <cyassl/error-ssl.h>
-#else
-#include <cyassl/error.h>
-#endif
-#include <cyassl/ctaocrypt/random.h>
-#include <cyassl/ctaocrypt/sha256.h>
-
-#include "cyassl.h"
+#include <wolfssl/openssl/ssl.h>
+#include <wolfssl/ssl.h>
+#include <wolfssl/error-ssl.h>
+#include "wolfssl.h"
 
 /* The last #include files should be: */
 #include "curl_memory.h"
 #include "memdebug.h"
 
-#if LIBCYASSL_VERSION_HEX < 0x02007002 /* < 2.7.2 */
-#define CYASSL_MAX_ERROR_SZ 80
-#endif
-
 /* KEEP_PEER_CERT is a product of the presence of build time symbol
    OPENSSL_EXTRA without NO_CERTS, depending on the version. KEEP_PEER_CERT is
    in wolfSSL's settings.h, and the latter two are build time symbols in
    options.h. */
 #ifndef KEEP_PEER_CERT
-#if defined(HAVE_CYASSL_GET_PEER_CERTIFICATE) || \
-    defined(HAVE_WOLFSSL_GET_PEER_CERTIFICATE) || \
+#if defined(HAVE_WOLFSSL_GET_PEER_CERTIFICATE) || \
     (defined(OPENSSL_EXTRA) && !defined(NO_CERTS))
 #define KEEP_PEER_CERT
 #endif
@@ -128,8 +98,8 @@ struct ssl_backend_data {
 
 #define BACKEND connssl->backend
 
-static Curl_recv cyassl_recv;
-static Curl_send cyassl_send;
+static Curl_recv wolfssl_recv;
+static Curl_send wolfssl_send;
 
 
 static int do_file_type(const char *type)
@@ -148,10 +118,9 @@ static int do_file_type(const char *type)
  * layer and do all necessary magic.
  */
 static CURLcode
-cyassl_connect_step1(struct connectdata *conn,
+wolfssl_connect_step1(struct connectdata *conn,
                      int sockindex)
 {
-  char error_buffer[CYASSL_MAX_ERROR_SZ];
   char *ciphers;
   struct Curl_easy *data = conn->data;
   struct ssl_connect_data* connssl = &conn->ssl[sockindex];
@@ -168,7 +137,7 @@ cyassl_connect_step1(struct connectdata *conn,
     return CURLE_OK;
 
   if(SSL_CONN_CONFIG(version_max) != CURL_SSLVERSION_MAX_NONE) {
-    failf(data, "CyaSSL does not support to set maximum SSL/TLS version");
+    failf(data, "wolfSSL does not support to set maximum SSL/TLS version");
     return CURLE_SSL_CONNECT_ERROR;
   }
 
@@ -176,11 +145,11 @@ cyassl_connect_step1(struct connectdata *conn,
   switch(SSL_CONN_CONFIG(version)) {
   case CURL_SSLVERSION_DEFAULT:
   case CURL_SSLVERSION_TLSv1:
-#if LIBCYASSL_VERSION_HEX >= 0x03003000 /* >= 3.3.0 */
+#if LIBWOLFSSL_VERSION_HEX >= 0x03003000 /* >= 3.3.0 */
     /* minimum protocol version is set later after the CTX object is created */
     req_method = SSLv23_client_method();
 #else
-    infof(data, "CyaSSL <3.3.0 cannot be configured to use TLS 1.0-1.2, "
+    infof(data, "wolfSSL <3.3.0 cannot be configured to use TLS 1.0-1.2, "
           "TLS 1.0 is used exclusively\n");
     req_method = TLSv1_client_method();
 #endif
@@ -191,7 +160,7 @@ cyassl_connect_step1(struct connectdata *conn,
     req_method = TLSv1_client_method();
     use_sni(TRUE);
 #else
-    failf(data, "CyaSSL does not support TLS 1.0");
+    failf(data, "wolfSSL does not support TLS 1.0");
     return CURLE_NOT_BUILT_IN;
 #endif
     break;
@@ -209,7 +178,7 @@ cyassl_connect_step1(struct connectdata *conn,
     use_sni(TRUE);
     break;
 #else
-    failf(data, "CyaSSL: TLS 1.3 is not yet supported");
+    failf(data, "wolfSSL: TLS 1.3 is not yet supported");
     return CURLE_SSL_CONNECT_ERROR;
 #endif
   case CURL_SSLVERSION_SSLv3:
@@ -217,12 +186,12 @@ cyassl_connect_step1(struct connectdata *conn,
     req_method = SSLv3_client_method();
     use_sni(FALSE);
 #else
-    failf(data, "CyaSSL does not support SSLv3");
+    failf(data, "wolfSSL does not support SSLv3");
     return CURLE_NOT_BUILT_IN;
 #endif
     break;
   case CURL_SSLVERSION_SSLv2:
-    failf(data, "CyaSSL does not support SSLv2");
+    failf(data, "wolfSSL does not support SSLv2");
     return CURLE_SSL_CONNECT_ERROR;
   default:
     failf(data, "Unrecognized parameter passed via CURLOPT_SSLVERSION");
@@ -246,13 +215,12 @@ cyassl_connect_step1(struct connectdata *conn,
   switch(SSL_CONN_CONFIG(version)) {
   case CURL_SSLVERSION_DEFAULT:
   case CURL_SSLVERSION_TLSv1:
-#if LIBCYASSL_VERSION_HEX > 0x03004006 /* > 3.4.6 */
-    /* Versions 3.3.0 to 3.4.6 we know the minimum protocol version is whatever
-    minimum version of TLS was built in and at least TLS 1.0. For later library
-    versions that could change (eg TLS 1.0 built in but defaults to TLS 1.1) so
-    we have this short circuit evaluation to find the minimum supported TLS
-    version. We use wolfSSL_CTX_SetMinVersion and not CyaSSL_SetMinVersion
-    because only the former will work before the user's CTX callback is called.
+#if LIBWOLFSSL_VERSION_HEX > 0x03004006 /* > 3.4.6 */
+    /* Versions 3.3.0 to 3.4.6 we know the minimum protocol version is
+     * whatever minimum version of TLS was built in and at least TLS 1.0. For
+     * later library versions that could change (eg TLS 1.0 built in but
+     * defaults to TLS 1.1) so we have this short circuit evaluation to find
+     * the minimum supported TLS version.
     */
     if((wolfSSL_CTX_SetMinVersion(BACKEND->ctx, WOLFSSL_TLSV1) != 1) &&
        (wolfSSL_CTX_SetMinVersion(BACKEND->ctx, WOLFSSL_TLSV1_1) != 1) &&
@@ -356,7 +324,7 @@ cyassl_connect_step1(struct connectdata *conn,
 #ifdef ENABLE_IPV6
        (0 == Curl_inet_pton(AF_INET6, hostname, &addr6)) &&
 #endif
-       (CyaSSL_CTX_UseSNI(BACKEND->ctx, CYASSL_SNI_HOST_NAME, hostname,
+       (wolfSSL_CTX_UseSNI(BACKEND->ctx, WOLFSSL_SNI_HOST_NAME, hostname,
                           (unsigned short)hostname_len) != 1)) {
       infof(data, "WARNING: failed to configure server name indication (SNI) "
             "TLS extension\n");
@@ -364,21 +332,10 @@ cyassl_connect_step1(struct connectdata *conn,
   }
 #endif
 
-#ifdef HAVE_SUPPORTED_CURVES
-  /* CyaSSL/wolfSSL does not send the supported ECC curves ext automatically:
-     https://github.com/wolfSSL/wolfssl/issues/366
-     The supported curves below are those also supported by OpenSSL 1.0.2 and
-     in the same order. */
-  CyaSSL_CTX_UseSupportedCurve(BACKEND->ctx, 0x17); /* secp256r1 */
-  CyaSSL_CTX_UseSupportedCurve(BACKEND->ctx, 0x19); /* secp521r1 */
-  CyaSSL_CTX_UseSupportedCurve(BACKEND->ctx, 0x18); /* secp384r1 */
-#endif
-
   /* give application a chance to interfere with SSL set up. */
   if(data->set.ssl.fsslctx) {
-    CURLcode result = CURLE_OK;
-    result = (*data->set.ssl.fsslctx)(data, BACKEND->ctx,
-                                      data->set.ssl.fsslctxp);
+    CURLcode result = (*data->set.ssl.fsslctx)(data, BACKEND->ctx,
+                                               data->set.ssl.fsslctxp);
     if(result) {
       failf(data, "error signaled by ssl ctx callback");
       return result;
@@ -386,7 +343,7 @@ cyassl_connect_step1(struct connectdata *conn,
   }
 #ifdef NO_FILESYSTEM
   else if(SSL_CONN_CONFIG(verifypeer)) {
-    failf(data, "SSL: Certificates couldn't be loaded because CyaSSL was built"
+    failf(data, "SSL: Certificates can't be loaded because wolfSSL was built"
           " with \"no filesystem\". Either disable peer verification"
           " (insecure) or if you are building an application with libcurl you"
           " can load certificates via CURLOPT_SSL_CTX_FUNCTION.");
@@ -438,10 +395,11 @@ cyassl_connect_step1(struct connectdata *conn,
     if(!Curl_ssl_getsessionid(conn, &ssl_sessionid, NULL, sockindex)) {
       /* we got a session id, use it! */
       if(!SSL_set_session(BACKEND->handle, ssl_sessionid)) {
+        char error_buffer[WOLFSSL_MAX_ERROR_SZ];
         Curl_ssl_sessionid_unlock(conn);
         failf(data, "SSL: SSL_set_session failed: %s",
               ERR_error_string(SSL_get_error(BACKEND->handle, 0),
-              error_buffer));
+                               error_buffer));
         return CURLE_SSL_CONNECT_ERROR;
       }
       /* Informational message */
@@ -462,7 +420,7 @@ cyassl_connect_step1(struct connectdata *conn,
 
 
 static CURLcode
-cyassl_connect_step2(struct connectdata *conn,
+wolfssl_connect_step2(struct connectdata *conn,
                      int sockindex)
 {
   int ret = -1;
@@ -476,19 +434,19 @@ cyassl_connect_step2(struct connectdata *conn,
                         data->set.str[STRING_SSL_PINNEDPUBLICKEY_PROXY] :
                         data->set.str[STRING_SSL_PINNEDPUBLICKEY_ORIG];
 
-  conn->recv[sockindex] = cyassl_recv;
-  conn->send[sockindex] = cyassl_send;
+  conn->recv[sockindex] = wolfssl_recv;
+  conn->send[sockindex] = wolfssl_send;
 
   /* Enable RFC2818 checks */
   if(SSL_CONN_CONFIG(verifyhost)) {
-    ret = CyaSSL_check_domain_name(BACKEND->handle, hostname);
+    ret = wolfSSL_check_domain_name(BACKEND->handle, hostname);
     if(ret == SSL_FAILURE)
       return CURLE_OUT_OF_MEMORY;
   }
 
   ret = SSL_connect(BACKEND->handle);
   if(ret != 1) {
-    char error_buffer[CYASSL_MAX_ERROR_SZ];
+    char error_buffer[WOLFSSL_MAX_ERROR_SZ];
     int  detail = SSL_get_error(BACKEND->handle, ret);
 
     if(SSL_ERROR_WANT_READ == detail) {
@@ -508,11 +466,12 @@ cyassl_connect_step2(struct connectdata *conn,
             dispname);
       return CURLE_PEER_FAILED_VERIFICATION;
 #else
-      /* When the CyaSSL_check_domain_name() is used and you desire to continue
-       * on a DOMAIN_NAME_MISMATCH, i.e. 'conn->ssl_config.verifyhost == 0',
-       * CyaSSL version 2.4.0 will fail with an INCOMPLETE_DATA error. The only
-       * way to do this is currently to switch the CyaSSL_check_domain_name()
-       * in and out based on the 'conn->ssl_config.verifyhost' value. */
+      /* When the wolfssl_check_domain_name() is used and you desire to
+       * continue on a DOMAIN_NAME_MISMATCH, i.e. 'conn->ssl_config.verifyhost
+       * == 0', CyaSSL version 2.4.0 will fail with an INCOMPLETE_DATA
+       * error. The only way to do this is currently to switch the
+       * Wolfssl_check_domain_name() in and out based on the
+       * 'conn->ssl_config.verifyhost' value. */
       if(SSL_CONN_CONFIG(verifyhost)) {
         failf(data,
               "\tsubject alt name(s) or common name do not match \"%s\"\n",
@@ -527,7 +486,7 @@ cyassl_connect_step2(struct connectdata *conn,
       }
 #endif
     }
-#if LIBCYASSL_VERSION_HEX >= 0x02007000 /* 2.7.0 */
+#if LIBWOLFSSL_VERSION_HEX >= 0x02007000 /* 2.7.0 */
     else if(ASN_NO_SIGNER_E == detail) {
       if(SSL_CONN_CONFIG(verifypeer)) {
         failf(data, "\tCA signer not available for verification\n");
@@ -563,7 +522,7 @@ cyassl_connect_step2(struct connectdata *conn,
       return CURLE_SSL_PINNEDPUBKEYNOTMATCH;
     }
 
-    x509_der = (const char *)CyaSSL_X509_get_der(x509, &x509_der_len);
+    x509_der = (const char *)wolfSSL_X509_get_der(x509, &x509_der_len);
     if(!x509_der) {
       failf(data, "SSL: failed retrieving ASN.1 server certificate");
       return CURLE_SSL_PINNEDPUBKEYNOTMATCH;
@@ -618,6 +577,8 @@ cyassl_connect_step2(struct connectdata *conn,
       else
         infof(data, "ALPN, unrecognized protocol %.*s\n", protocol_len,
               protocol);
+      Curl_multiuse_state(conn, conn->negnpn == CURL_HTTP_VERSION_2 ?
+                          BUNDLE_MULTIPLEX : BUNDLE_NO_MULTIUSE);
     }
     else if(rc == SSL_ALPN_NOT_FOUND)
       infof(data, "ALPN, server did not agree to a protocol\n");
@@ -629,7 +590,7 @@ cyassl_connect_step2(struct connectdata *conn,
 #endif /* HAVE_ALPN */
 
   connssl->connecting_state = ssl_connect_3;
-#if (LIBCYASSL_VERSION_HEX >= 0x03009010)
+#if (LIBWOLFSSL_VERSION_HEX >= 0x03009010)
   infof(data, "SSL connection using %s / %s\n",
         wolfSSL_get_version(BACKEND->handle),
         wolfSSL_get_cipher_name(BACKEND->handle));
@@ -642,7 +603,7 @@ cyassl_connect_step2(struct connectdata *conn,
 
 
 static CURLcode
-cyassl_connect_step3(struct connectdata *conn,
+wolfssl_connect_step3(struct connectdata *conn,
                      int sockindex)
 {
   CURLcode result = CURLE_OK;
@@ -687,14 +648,14 @@ cyassl_connect_step3(struct connectdata *conn,
 }
 
 
-static ssize_t cyassl_send(struct connectdata *conn,
+static ssize_t wolfssl_send(struct connectdata *conn,
                            int sockindex,
                            const void *mem,
                            size_t len,
                            CURLcode *curlcode)
 {
   struct ssl_connect_data *connssl = &conn->ssl[sockindex];
-  char error_buffer[CYASSL_MAX_ERROR_SZ];
+  char error_buffer[WOLFSSL_MAX_ERROR_SZ];
   int  memlen = (len > (size_t)INT_MAX) ? INT_MAX : (int)len;
   int  rc     = SSL_write(BACKEND->handle, mem, memlen);
 
@@ -718,7 +679,7 @@ static ssize_t cyassl_send(struct connectdata *conn,
   return rc;
 }
 
-static void Curl_cyassl_close(struct connectdata *conn, int sockindex)
+static void Curl_wolfssl_close(struct connectdata *conn, int sockindex)
 {
   struct ssl_connect_data *connssl = &conn->ssl[sockindex];
 
@@ -733,14 +694,14 @@ static void Curl_cyassl_close(struct connectdata *conn, int sockindex)
   }
 }
 
-static ssize_t cyassl_recv(struct connectdata *conn,
+static ssize_t wolfssl_recv(struct connectdata *conn,
                            int num,
                            char *buf,
                            size_t buffersize,
                            CURLcode *curlcode)
 {
   struct ssl_connect_data *connssl = &conn->ssl[num];
-  char error_buffer[CYASSL_MAX_ERROR_SZ];
+  char error_buffer[WOLFSSL_MAX_ERROR_SZ];
   int  buffsize = (buffersize > (size_t)INT_MAX) ? INT_MAX : (int)buffersize;
   int  nread    = SSL_read(BACKEND->handle, buf, buffsize);
 
@@ -767,34 +728,36 @@ static ssize_t cyassl_recv(struct connectdata *conn,
 }
 
 
-static void Curl_cyassl_session_free(void *ptr)
+static void Curl_wolfssl_session_free(void *ptr)
 {
   (void)ptr;
-  /* CyaSSL reuses sessions on own, no free */
+  /* wolfSSL reuses sessions on own, no free */
 }
 
 
-static size_t Curl_cyassl_version(char *buffer, size_t size)
+static size_t Curl_wolfssl_version(char *buffer, size_t size)
 {
-#if LIBCYASSL_VERSION_HEX >= 0x03006000
-  return snprintf(buffer, size, "wolfSSL/%s", wolfSSL_lib_version());
+#if LIBWOLFSSL_VERSION_HEX >= 0x03006000
+  return msnprintf(buffer, size, "wolfSSL/%s", wolfSSL_lib_version());
 #elif defined(WOLFSSL_VERSION)
-  return snprintf(buffer, size, "wolfSSL/%s", WOLFSSL_VERSION);
-#elif defined(CYASSL_VERSION)
-  return snprintf(buffer, size, "CyaSSL/%s", CYASSL_VERSION);
-#else
-  return snprintf(buffer, size, "CyaSSL/%s", "<1.8.8");
+  return msnprintf(buffer, size, "wolfSSL/%s", WOLFSSL_VERSION);
 #endif
 }
 
 
-static int Curl_cyassl_init(void)
+static int Curl_wolfssl_init(void)
+{
+  return (wolfSSL_Init() == SSL_SUCCESS);
+}
+
+
+static void Curl_wolfssl_cleanup(void)
 {
-  return (CyaSSL_Init() == SSL_SUCCESS);
+  wolfSSL_Cleanup();
 }
 
 
-static bool Curl_cyassl_data_pending(const struct connectdata* conn,
+static bool Curl_wolfssl_data_pending(const struct connectdata* conn,
                                      int connindex)
 {
   const struct ssl_connect_data *connssl = &conn->ssl[connindex];
@@ -809,7 +772,7 @@ static bool Curl_cyassl_data_pending(const struct connectdata* conn,
  * This function is called to shut down the SSL layer but keep the
  * socket open (CCC - Clear Command Channel)
  */
-static int Curl_cyassl_shutdown(struct connectdata *conn, int sockindex)
+static int Curl_wolfssl_shutdown(struct connectdata *conn, int sockindex)
 {
   int retval = 0;
   struct ssl_connect_data *connssl = &conn->ssl[sockindex];
@@ -823,7 +786,7 @@ static int Curl_cyassl_shutdown(struct connectdata *conn, int sockindex)
 
 
 static CURLcode
-cyassl_connect_common(struct connectdata *conn,
+wolfssl_connect_common(struct connectdata *conn,
                       int sockindex,
                       bool nonblocking,
                       bool *done)
@@ -851,7 +814,7 @@ cyassl_connect_common(struct connectdata *conn,
       return CURLE_OPERATION_TIMEDOUT;
     }
 
-    result = cyassl_connect_step1(conn, sockindex);
+    result = wolfssl_connect_step1(conn, sockindex);
     if(result)
       return result;
   }
@@ -906,7 +869,7 @@ cyassl_connect_common(struct connectdata *conn,
      * ensuring that a client using select() or epoll() will always
      * have a valid fdset to wait on.
      */
-    result = cyassl_connect_step2(conn, sockindex);
+    result = wolfssl_connect_step2(conn, sockindex);
     if(result || (nonblocking &&
                   (ssl_connect_2 == connssl->connecting_state ||
                    ssl_connect_2_reading == connssl->connecting_state ||
@@ -915,15 +878,15 @@ cyassl_connect_common(struct connectdata *conn,
   } /* repeat step2 until all transactions are done. */
 
   if(ssl_connect_3 == connssl->connecting_state) {
-    result = cyassl_connect_step3(conn, sockindex);
+    result = wolfssl_connect_step3(conn, sockindex);
     if(result)
       return result;
   }
 
   if(ssl_connect_done == connssl->connecting_state) {
     connssl->state = ssl_connection_complete;
-    conn->recv[sockindex] = cyassl_recv;
-    conn->send[sockindex] = cyassl_send;
+    conn->recv[sockindex] = wolfssl_recv;
+    conn->send[sockindex] = wolfssl_send;
     *done = TRUE;
   }
   else
@@ -936,19 +899,19 @@ cyassl_connect_common(struct connectdata *conn,
 }
 
 
-static CURLcode Curl_cyassl_connect_nonblocking(struct connectdata *conn,
+static CURLcode Curl_wolfssl_connect_nonblocking(struct connectdata *conn,
                                                 int sockindex, bool *done)
 {
-  return cyassl_connect_common(conn, sockindex, TRUE, done);
+  return wolfssl_connect_common(conn, sockindex, TRUE, done);
 }
 
 
-static CURLcode Curl_cyassl_connect(struct connectdata *conn, int sockindex)
+static CURLcode Curl_wolfssl_connect(struct connectdata *conn, int sockindex)
 {
   CURLcode result;
   bool done = FALSE;
 
-  result = cyassl_connect_common(conn, sockindex, FALSE, &done);
+  result = wolfssl_connect_common(conn, sockindex, FALSE, &done);
   if(result)
     return result;
 
@@ -957,43 +920,43 @@ static CURLcode Curl_cyassl_connect(struct connectdata *conn, int sockindex)
   return CURLE_OK;
 }
 
-static CURLcode Curl_cyassl_random(struct Curl_easy *data,
+static CURLcode Curl_wolfssl_random(struct Curl_easy *data,
                                    unsigned char *entropy, size_t length)
 {
   RNG rng;
   (void)data;
-  if(InitRng(&rng))
+  if(wc_InitRng(&rng))
     return CURLE_FAILED_INIT;
   if(length > UINT_MAX)
     return CURLE_FAILED_INIT;
-  if(RNG_GenerateBlock(&rng, entropy, (unsigned)length))
+  if(wc_RNG_GenerateBlock(&rng, entropy, (unsigned)length))
     return CURLE_FAILED_INIT;
-  if(FreeRng(&rng))
+  if(wc_FreeRng(&rng))
     return CURLE_FAILED_INIT;
   return CURLE_OK;
 }
 
-static CURLcode Curl_cyassl_sha256sum(const unsigned char *tmp, /* input */
+static CURLcode Curl_wolfssl_sha256sum(const unsigned char *tmp, /* input */
                                   size_t tmplen,
                                   unsigned char *sha256sum /* output */,
                                   size_t unused)
 {
   Sha256 SHA256pw;
   (void)unused;
-  InitSha256(&SHA256pw);
-  Sha256Update(&SHA256pw, tmp, (word32)tmplen);
-  Sha256Final(&SHA256pw, sha256sum);
+  wc_InitSha256(&SHA256pw);
+  wc_Sha256Update(&SHA256pw, tmp, (word32)tmplen);
+  wc_Sha256Final(&SHA256pw, sha256sum);
   return CURLE_OK;
 }
 
-static void *Curl_cyassl_get_internals(struct ssl_connect_data *connssl,
+static void *Curl_wolfssl_get_internals(struct ssl_connect_data *connssl,
                                        CURLINFO info UNUSED_PARAM)
 {
   (void)info;
   return BACKEND->handle;
 }
 
-const struct Curl_ssl Curl_ssl_cyassl = {
+const struct Curl_ssl Curl_ssl_wolfssl = {
   { CURLSSLBACKEND_WOLFSSL, "WolfSSL" }, /* info */
 
 #ifdef KEEP_PEER_CERT
@@ -1003,26 +966,26 @@ const struct Curl_ssl Curl_ssl_cyassl = {
 
   sizeof(struct ssl_backend_data),
 
-  Curl_cyassl_init,                /* init */
-  Curl_none_cleanup,               /* cleanup */
-  Curl_cyassl_version,             /* version */
+  Curl_wolfssl_init,                /* init */
+  Curl_wolfssl_cleanup,             /* cleanup */
+  Curl_wolfssl_version,             /* version */
   Curl_none_check_cxn,             /* check_cxn */
-  Curl_cyassl_shutdown,            /* shutdown */
-  Curl_cyassl_data_pending,        /* data_pending */
-  Curl_cyassl_random,              /* random */
+  Curl_wolfssl_shutdown,            /* shutdown */
+  Curl_wolfssl_data_pending,        /* data_pending */
+  Curl_wolfssl_random,              /* random */
   Curl_none_cert_status_request,   /* cert_status_request */
-  Curl_cyassl_connect,             /* connect */
-  Curl_cyassl_connect_nonblocking, /* connect_nonblocking */
-  Curl_cyassl_get_internals,       /* get_internals */
-  Curl_cyassl_close,               /* close_one */
+  Curl_wolfssl_connect,             /* connect */
+  Curl_wolfssl_connect_nonblocking, /* connect_nonblocking */
+  Curl_wolfssl_get_internals,       /* get_internals */
+  Curl_wolfssl_close,               /* close_one */
   Curl_none_close_all,             /* close_all */
-  Curl_cyassl_session_free,        /* session_free */
+  Curl_wolfssl_session_free,        /* session_free */
   Curl_none_set_engine,            /* set_engine */
   Curl_none_set_engine_default,    /* set_engine_default */
   Curl_none_engines_list,          /* engines_list */
   Curl_none_false_start,           /* false_start */
   Curl_none_md5sum,                /* md5sum */
-  Curl_cyassl_sha256sum            /* sha256sum */
+  Curl_wolfssl_sha256sum            /* sha256sum */
 };
 
 #endif
similarity index 79%
rename from lib/vtls/cyassl.h
rename to lib/vtls/wolfssl.h
index 01e11cc..2b9673c 100644 (file)
@@ -1,5 +1,5 @@
-#ifndef HEADER_CURL_CYASSL_H
-#define HEADER_CURL_CYASSL_H
+#ifndef HEADER_CURL_WOLFSSL_H
+#define HEADER_CURL_WOLFSSL_H
 /***************************************************************************
  *                                  _   _ ____  _
  *  Project                     ___| | | |  _ \| |
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -23,9 +23,9 @@
  ***************************************************************************/
 #include "curl_setup.h"
 
-#ifdef USE_CYASSL
+#ifdef USE_WOLFSSL
 
-extern const struct Curl_ssl Curl_ssl_cyassl;
+extern const struct Curl_ssl Curl_ssl_wolfssl;
 
-#endif /* USE_CYASSL */
-#endif /* HEADER_CURL_CYASSL_H */
+#endif /* USE_WOLFSSL */
+#endif /* HEADER_CURL_WOLFSSL_H */
index 05d9038..cfd5e8e 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -401,44 +401,6 @@ unsigned short curlx_uitous(unsigned int uinum)
 }
 
 /*
-** unsigned int to unsigned char
-*/
-
-unsigned char curlx_uitouc(unsigned int uinum)
-{
-#ifdef __INTEL_COMPILER
-#  pragma warning(push)
-#  pragma warning(disable:810) /* conversion may lose significant bits */
-#endif
-
-  DEBUGASSERT(uinum <= (unsigned int) CURL_MASK_UCHAR);
-  return (unsigned char) (uinum & (unsigned int) CURL_MASK_UCHAR);
-
-#ifdef __INTEL_COMPILER
-#  pragma warning(pop)
-#endif
-}
-
-/*
-** unsigned int to signed int
-*/
-
-int curlx_uitosi(unsigned int uinum)
-{
-#ifdef __INTEL_COMPILER
-#  pragma warning(push)
-#  pragma warning(disable:810) /* conversion may lose significant bits */
-#endif
-
-  DEBUGASSERT(uinum <= (unsigned int) CURL_MASK_SINT);
-  return (int) (uinum & (unsigned int) CURL_MASK_SINT);
-
-#ifdef __INTEL_COMPILER
-#  pragma warning(pop)
-#endif
-}
-
-/*
 ** signed int to unsigned size_t
 */
 
index 284ea1e..ea4c439 100644 (file)
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -57,10 +57,6 @@ int curlx_sztosi(ssize_t sznum);
 
 unsigned short curlx_uitous(unsigned int uinum);
 
-unsigned char curlx_uitouc(unsigned int uinum);
-
-int curlx_uitosi(unsigned int uinum);
-
 size_t curlx_sitouz(int sinum);
 
 #ifdef USE_WINSOCK
index 8ba0989..e94d3c5 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -22,6 +22,8 @@
 
 #include "curl_setup.h"
 
+#ifndef CURL_DISABLE_FTP
+
 #include "wildcard.h"
 #include "llist.h"
 #include "fileinfo.h"
@@ -67,3 +69,5 @@ void Curl_wildcard_dtor(struct WildcardData *wc)
   wc->customptr = NULL;
   wc->state = CURLWC_INIT;
 }
+
+#endif /* if disabled */
index b782612..306c8c9 100644 (file)
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 2010 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 2010 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -22,8 +22,9 @@
  *
  ***************************************************************************/
 
-#include <curl/curl.h>
+#include "curl_setup.h"
 
+#ifndef CURL_DISABLE_FTP
 #include "llist.h"
 
 /* list of wildcard process states */
@@ -58,4 +59,9 @@ void Curl_wildcard_dtor(struct WildcardData *wc);
 
 struct Curl_easy;
 
+#else
+/* FTP is disabled */
+#define Curl_wildcard_dtor(x)
+#endif
+
 #endif /* HEADER_CURL_WILDCARD_H */
index a576fc7..ece5364 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -23,7 +23,7 @@
 #include "curl_setup.h"
 
 #if defined(USE_GSKIT) || defined(USE_NSS) || defined(USE_GNUTLS) || \
-    defined(USE_CYASSL) || defined(USE_SCHANNEL)
+    defined(USE_WOLFSSL) || defined(USE_SCHANNEL)
 
 #include <curl/curl.h>
 #include "urldata.h"
@@ -120,7 +120,7 @@ static const char *getASN1Element(curl_asn1Element *elem,
      if an error occurs. */
   if(!beg || !end || beg >= end || !*beg ||
      (size_t)(end - beg) > CURL_ASN1_MAX)
-    return (const char *) NULL;
+    return NULL;
 
   /* Process header byte. */
   elem->header = beg;
@@ -129,12 +129,12 @@ static const char *getASN1Element(curl_asn1Element *elem,
   elem->class = (b >> 6) & 3;
   b &= 0x1F;
   if(b == 0x1F)
-    return (const char *) NULL; /* Long tag values not supported here. */
+    return NULL; /* Long tag values not supported here. */
   elem->tag = b;
 
   /* Process length. */
   if(beg >= end)
-    return (const char *) NULL;
+    return NULL;
   b = (unsigned char) *beg++;
   if(!(b & 0x80))
     len = b;
@@ -142,74 +142,77 @@ static const char *getASN1Element(curl_asn1Element *elem,
     /* Unspecified length. Since we have all the data, we can determine the
        effective length by skipping element until an end element is found. */
     if(!elem->constructed)
-      return (const char *) NULL;
+      return NULL;
     elem->beg = beg;
     while(beg < end && *beg) {
       beg = getASN1Element(&lelem, beg, end);
       if(!beg)
-        return (const char *) NULL;
+        return NULL;
     }
     if(beg >= end)
-      return (const char *) NULL;
+      return NULL;
     elem->end = beg;
     return beg + 1;
   }
   else if((unsigned)b > (size_t)(end - beg))
-    return (const char *) NULL; /* Does not fit in source. */
+    return NULL; /* Does not fit in source. */
   else {
     /* Get long length. */
     len = 0;
     do {
       if(len & 0xFF000000L)
-        return (const char *) NULL;  /* Lengths > 32 bits are not supported. */
+        return NULL;  /* Lengths > 32 bits are not supported. */
       len = (len << 8) | (unsigned char) *beg++;
     } while(--b);
   }
   if(len > (size_t)(end - beg))
-    return (const char *) NULL;  /* Element data does not fit in source. */
+    return NULL;  /* Element data does not fit in source. */
   elem->beg = beg;
   elem->end = beg + len;
   return elem->end;
 }
 
+/*
+ * Search the null terminated OID or OID identifier in local table.
+ * Return the table entry pointer or NULL if not found.
+ */
 static const curl_OID * searchOID(const char *oid)
 {
   const curl_OID *op;
-
-  /* Search the null terminated OID or OID identifier in local table.
-     Return the table entry pointer or NULL if not found. */
-
   for(op = OIDtable; op->numoid; op++)
     if(!strcmp(op->numoid, oid) || strcasecompare(op->textoid, oid))
       return op;
 
-  return (const curl_OID *) NULL;
+  return NULL;
 }
 
+/*
+ * Convert an ASN.1 Boolean value into its string representation.  Return the
+ * dynamically allocated string, or NULL if source is not an ASN.1 Boolean
+ * value.
+ */
+
 static const char *bool2str(const char *beg, const char *end)
 {
-  /* Convert an ASN.1 Boolean value into its string representation.
-     Return the dynamically allocated string, or NULL if source is not an
-     ASN.1 Boolean value. */
-
   if(end - beg != 1)
-    return (const char *) NULL;
+    return NULL;
   return strdup(*beg? "TRUE": "FALSE");
 }
 
+/*
+ * Convert an ASN.1 octet string to a printable string.
+ * Return the dynamically allocated string, or NULL if an error occurs.
+ */
 static const char *octet2str(const char *beg, const char *end)
 {
   size_t n = end - beg;
   char *buf = NULL;
 
-  /* Convert an ASN.1 octet string to a printable string.
-     Return the dynamically allocated string, or NULL if an error occurs. */
-
   if(n <= (SIZE_T_MAX - 1) / 3) {
     buf = malloc(3 * n + 1);
     if(buf)
       for(n = 0; beg < end; n += 3)
-        snprintf(buf + n, 4, "%02x:", *(const unsigned char *) beg++);
+        msnprintf(buf + n, 4, "%02x:", *(const unsigned char *) beg++);
   }
   return buf;
 }
@@ -220,21 +223,22 @@ static const char *bit2str(const char *beg, const char *end)
      Return the dynamically allocated string, or NULL if an error occurs. */
 
   if(++beg > end)
-    return (const char *) NULL;
+    return NULL;
   return octet2str(beg, end);
 }
 
+/*
+ * Convert an ASN.1 integer value into its string representation.
+ * Return the dynamically allocated string, or NULL if source is not an
+ * ASN.1 integer value.
+ */
 static const char *int2str(const char *beg, const char *end)
 {
   unsigned long val = 0;
   size_t n = end - beg;
 
-  /* Convert an ASN.1 integer value into its string representation.
-     Return the dynamically allocated string, or NULL if source is not an
-     ASN.1 integer value. */
-
   if(!n)
-    return (const char *) NULL;
+    return NULL;
 
   if(n > 4)
     return octet2str(beg, end);
@@ -249,23 +253,22 @@ static const char *int2str(const char *beg, const char *end)
   return curl_maprintf("%s%lx", val >= 10? "0x": "", val);
 }
 
+/*
+ * Perform a lazy conversion from an ASN.1 typed string to UTF8. Allocate the
+ * destination buffer dynamically. The allocation size will normally be too
+ * large: this is to avoid buffer overflows.
+ * Terminate the string with a nul byte and return the converted
+ * string length.
+ */
 static ssize_t
 utf8asn1str(char **to, int type, const char *from, const char *end)
 {
   size_t inlength = end - from;
   int size = 1;
   size_t outlength;
-  int charsize;
-  unsigned int wc;
   char *buf;
 
-  /* Perform a lazy conversion from an ASN.1 typed string to UTF8. Allocate the
-     destination buffer dynamically. The allocation size will normally be too
-     large: this is to avoid buffer overflows.
-     Terminate the string with a nul byte and return the converted
-     string length. */
-
-  *to = (char *) NULL;
+  *to = NULL;
   switch(type) {
   case CURL_ASN1_BMP_STRING:
     size = 2;
@@ -300,6 +303,9 @@ utf8asn1str(char **to, int type, const char *from, const char *end)
   }
   else {
     for(outlength = 0; from < end;) {
+      int charsize;
+      unsigned int wc;
+
       wc = 0;
       switch(size) {
       case 4:
@@ -341,96 +347,105 @@ utf8asn1str(char **to, int type, const char *from, const char *end)
   return outlength;
 }
 
+/*
+ * Convert an ASN.1 String into its UTF-8 string representation.
+ * Return the dynamically allocated string, or NULL if an error occurs.
+ */
 static const char *string2str(int type, const char *beg, const char *end)
 {
   char *buf;
-
-  /* Convert an ASN.1 String into its UTF-8 string representation.
-     Return the dynamically allocated string, or NULL if an error occurs. */
-
   if(utf8asn1str(&buf, type, beg, end) < 0)
-    return (const char *) NULL;
+    return NULL;
   return buf;
 }
 
-static int encodeUint(char *buf, int n, unsigned int x)
+/*
+ * Decimal ASCII encode unsigned integer `x' into the buflen sized buffer at
+ * buf.  Return the total number of encoded digits, even if larger than
+ * `buflen'.
+ */
+static size_t encodeUint(char *buf, size_t buflen, unsigned int x)
 {
-  int i = 0;
+  size_t i = 0;
   unsigned int y = x / 10;
 
-  /* Decimal ASCII encode unsigned integer `x' in the `n'-byte buffer at `buf'.
-     Return the total number of encoded digits, even if larger than `n'. */
-
   if(y) {
-    i += encodeUint(buf, n, y);
+    i = encodeUint(buf, buflen, y);
     x -= y * 10;
   }
-  if(i < n)
+  if(i < buflen)
     buf[i] = (char) ('0' + x);
   i++;
-  if(i < n)
+  if(i < buflen)
     buf[i] = '\0';      /* Store a terminator if possible. */
   return i;
 }
 
-static int encodeOID(char *buf, int n, const char *beg, const char *end)
+/*
+ * Convert an ASN.1 OID into its dotted string representation.
+ * Store the result in th `n'-byte buffer at `buf'.
+ * Return the converted string length, or 0 on errors.
+ */
+static size_t encodeOID(char *buf, size_t buflen,
+                        const char *beg, const char *end)
 {
-  int i = 0;
+  size_t i;
   unsigned int x;
   unsigned int y;
 
-  /* Convert an ASN.1 OID into its dotted string representation.
-     Store the result in th `n'-byte buffer at `buf'.
-     Return the converted string length, or -1 if an error occurs. */
-
   /* Process the first two numbers. */
   y = *(const unsigned char *) beg++;
   x = y / 40;
   y -= x * 40;
-  i += encodeUint(buf + i, n - i, x);
-  if(i < n)
+  i = encodeUint(buf, buflen, x);
+  if(i < buflen)
     buf[i] = '.';
   i++;
-  i += encodeUint(buf + i, n - i, y);
+  if(i >= buflen)
+    i += encodeUint(NULL, 0, y);
+  else
+    i += encodeUint(buf + i, buflen - i, y);
 
   /* Process the trailing numbers. */
   while(beg < end) {
-    if(i < n)
+    if(i < buflen)
       buf[i] = '.';
     i++;
     x = 0;
     do {
       if(x & 0xFF000000)
-        return -1;
+        return 0;
       y = *(const unsigned char *) beg++;
       x = (x << 7) | (y & 0x7F);
     } while(y & 0x80);
-    i += encodeUint(buf + i, n - i, x);
+    if(i >= buflen)
+      i += encodeUint(NULL, 0, x);
+    else
+      i += encodeUint(buf + i, buflen - i, x);
   }
-  if(i < n)
+  if(i < buflen)
     buf[i] = '\0';
   return i;
 }
 
+/*
+ * Convert an ASN.1 OID into its dotted or symbolic string representation.
+ * Return the dynamically allocated string, or NULL if an error occurs.
+ */
+
 static const char *OID2str(const char *beg, const char *end, bool symbolic)
 {
-  char *buf = (char *) NULL;
-  const curl_OID * op;
-  int n;
-
-  /* Convert an ASN.1 OID into its dotted or symbolic string representation.
-     Return the dynamically allocated string, or NULL if an error occurs. */
-
+  char *buf = NULL;
   if(beg < end) {
-    n = encodeOID((char *) NULL, -1, beg, end);
-    if(n >= 0) {
-      buf = malloc(n + 1);
+    size_t buflen = encodeOID(NULL, 0, beg, end);
+    if(buflen) {
+      buf = malloc(buflen + 1); /* one extra for the zero byte */
       if(buf) {
-        encodeOID(buf, n, beg, end);
-        buf[n] = '\0';
+        encodeOID(buf, buflen, beg, end);
+        buf[buflen] = '\0';
 
         if(symbolic) {
-          op = searchOID(buf);
+          const curl_OID *op = searchOID(buf);
           if(op) {
             free(buf);
             buf = strdup(op->textoid);
@@ -470,7 +485,7 @@ static const char *GTime2str(const char *beg, const char *end)
     sec2 = fracp[-1];
     break;
   default:
-    return (const char *) NULL;
+    return NULL;
   }
 
   /* Scan for timezone, measure fractional seconds. */
@@ -506,15 +521,16 @@ static const char *GTime2str(const char *beg, const char *end)
                        sep, tzl, tzp);
 }
 
+/*
+ *  Convert an ASN.1 UTC time to a printable string.
+ * Return the dynamically allocated string, or NULL if an error occurs.
+ */
 static const char *UTime2str(const char *beg, const char *end)
 {
   const char *tzp;
   size_t tzl;
   const char *sec;
 
-  /* Convert an ASN.1 UTC time to a printable string.
-     Return the dynamically allocated string, or NULL if an error occurs. */
-
   for(tzp = beg; tzp < end && *tzp >= '0' && *tzp <= '9'; tzp++)
     ;
   /* Get the seconds. */
@@ -525,12 +541,12 @@ static const char *UTime2str(const char *beg, const char *end)
   case 2:
     break;
   default:
-    return (const char *) NULL;
+    return NULL;
   }
 
   /* Process timezone. */
   if(tzp >= end)
-    return (const char *) NULL;
+    return NULL;
   if(*tzp == 'Z') {
     tzp = "GMT";
     end = tzp + 3;
@@ -545,13 +561,14 @@ static const char *UTime2str(const char *beg, const char *end)
                        tzl, tzp);
 }
 
+/*
+ * Convert an ASN.1 element to a printable string.
+ * Return the dynamically allocated string, or NULL if an error occurs.
+ */
 static const char *ASN1tostr(curl_asn1Element *elem, int type)
 {
-  /* Convert an ASN.1 element to a printable string.
-     Return the dynamically allocated string, or NULL if an error occurs. */
-
   if(elem->constructed)
-    return (const char *) NULL; /* No conversion of structured elements. */
+    return NULL; /* No conversion of structured elements. */
 
   if(!type)
     type = elem->tag;   /* Type not forced: use element tag as type. */
@@ -585,10 +602,14 @@ static const char *ASN1tostr(curl_asn1Element *elem, int type)
     return string2str(type, elem->beg, elem->end);
   }
 
-  return (const char *) NULL;   /* Unsupported. */
+  return NULL;   /* Unsupported. */
 }
 
-static ssize_t encodeDN(char *buf, size_t n, curl_asn1Element *dn)
+/*
+ * ASCII encode distinguished name at `dn' into the `buflen'-sized buffer at
+ * `buf'.  Return the total string length, even if larger than `buflen'.
+ */
+static ssize_t encodeDN(char *buf, size_t buflen, curl_asn1Element *dn)
 {
   curl_asn1Element rdn;
   curl_asn1Element atv;
@@ -600,9 +621,6 @@ static ssize_t encodeDN(char *buf, size_t n, curl_asn1Element *dn)
   const char *p3;
   const char *str;
 
-  /* ASCII encode distinguished name at `dn' into the `n'-byte buffer at `buf'.
-     Return the total string length, even if larger than `n'. */
-
   for(p1 = dn->beg; p1 < dn->end;) {
     p1 = getASN1Element(&rdn, p1, dn->end);
     if(!p1)
@@ -626,7 +644,7 @@ static ssize_t encodeDN(char *buf, size_t n, curl_asn1Element *dn)
         for(p3 = str; isupper(*p3); p3++)
           ;
         for(p3 = (*p3 || p3 - str > 2)? "/": ", "; *p3; p3++) {
-          if(l < n)
+          if(l < buflen)
             buf[l] = *p3;
           l++;
         }
@@ -634,14 +652,14 @@ static ssize_t encodeDN(char *buf, size_t n, curl_asn1Element *dn)
 
       /* Encode attribute name. */
       for(p3 = str; *p3; p3++) {
-        if(l < n)
+        if(l < buflen)
           buf[l] = *p3;
         l++;
       }
       free((char *) str);
 
       /* Generate equal sign. */
-      if(l < n)
+      if(l < buflen)
         buf[l] = '=';
       l++;
 
@@ -650,7 +668,7 @@ static ssize_t encodeDN(char *buf, size_t n, curl_asn1Element *dn)
       if(!str)
         return -1;
       for(p3 = str; *p3; p3++) {
-        if(l < n)
+        if(l < buflen)
           buf[l] = *p3;
         l++;
       }
@@ -661,28 +679,30 @@ static ssize_t encodeDN(char *buf, size_t n, curl_asn1Element *dn)
   return l;
 }
 
+/*
+ * Convert an ASN.1 distinguished name into a printable string.
+ * Return the dynamically allocated string, or NULL if an error occurs.
+ */
 static const char *DNtostr(curl_asn1Element *dn)
 {
-  char *buf = (char *) NULL;
-  ssize_t n = encodeDN(buf, 0, dn);
-
-  /* Convert an ASN.1 distinguished name into a printable string.
-     Return the dynamically allocated string, or NULL if an error occurs. */
+  char *buf = NULL;
+  ssize_t buflen = encodeDN(NULL, 0, dn);
 
-  if(n >= 0) {
-    buf = malloc(n + 1);
+  if(buflen >= 0) {
+    buf = malloc(buflen + 1);
     if(buf) {
-      encodeDN(buf, n + 1, dn);
-      buf[n] = '\0';
+      encodeDN(buf, buflen + 1, dn);
+      buf[buflen] = '\0';
     }
   }
-  return (const char *) buf;
+  return buf;
 }
 
 /*
- * X509 parser.
+ * ASN.1 parse an X509 certificate into structure subfields.
+ * Syntax is assumed to have already been checked by the SSL backend.
+ * See RFC 5280.
  */
-
 int Curl_parseX509(curl_X509certificate *cert,
                    const char *beg, const char *end)
 {
@@ -691,10 +711,6 @@ int Curl_parseX509(curl_X509certificate *cert,
   const char *ccp;
   static const char defaultVersion = 0;  /* v1. */
 
-  /* ASN.1 parse an X509 certificate into structure subfields.
-     Syntax is assumed to have already been checked by the SSL backend.
-     See RFC 5280. */
-
   cert->certificate.header = NULL;
   cert->certificate.beg = beg;
   cert->certificate.end = end;
@@ -801,13 +817,14 @@ int Curl_parseX509(curl_X509certificate *cert,
   return 0;
 }
 
+
+/*
+ * Copy at most 64-characters, terminate with a newline and returns the
+ * effective number of stored characters.
+ */
 static size_t copySubstring(char *to, const char *from)
 {
   size_t i;
-
-  /* Copy at most 64-characters, terminate with a newline and returns the
-     effective number of stored characters. */
-
   for(i = 0; i < 64; i++) {
     to[i] = *from;
     if(!*from++)
@@ -861,9 +878,6 @@ static void do_pubkey(struct Curl_easy *data, int certnum,
   curl_asn1Element elem;
   curl_asn1Element pk;
   const char *p;
-  const char *q;
-  unsigned long len;
-  unsigned int i;
 
   /* Generate all information records for the public key. */
 
@@ -872,6 +886,9 @@ static void do_pubkey(struct Curl_easy *data, int certnum,
     return;
 
   if(strcasecompare(algo, "rsaEncryption")) {
+    const char *q;
+    unsigned long len;
+
     p = getASN1Element(&elem, pk.beg, pk.end);
     if(!p)
       return;
@@ -880,9 +897,11 @@ static void do_pubkey(struct Curl_easy *data, int certnum,
     for(q = elem.beg; !*q && q < elem.end; q++)
       ;
     len = (unsigned long)((elem.end - q) * 8);
-    if(len)
+    if(len) {
+      unsigned int i;
       for(i = *(unsigned char *) q; !(i & 0x80); i <<= 1)
         len--;
+    }
     if(len > 32)
       elem.beg = q;     /* Strip leading zero bytes. */
     if(!certnum)
@@ -1040,8 +1059,6 @@ CURLcode Curl_extract_certinfo(struct connectdata *conn,
   do_pubkey(data, certnum, ccp, &param, &cert.subjectPublicKey);
   free((char *) ccp);
 
-/* TODO: extensions. */
-
   /* Signature. */
   ccp = ASN1tostr(&cert.signature, 0);
   if(!ccp)
@@ -1087,7 +1104,7 @@ CURLcode Curl_extract_certinfo(struct connectdata *conn,
   return CURLE_OK;
 }
 
-#endif /* USE_GSKIT or USE_NSS or USE_GNUTLS or USE_CYASSL or USE_SCHANNEL */
+#endif /* USE_GSKIT or USE_NSS or USE_GNUTLS or USE_WOLFSSL or USE_SCHANNEL */
 
 #if defined(USE_GSKIT)
 
@@ -1104,15 +1121,15 @@ static const char *checkOID(const char *beg, const char *end,
 
   ccp = getASN1Element(&e, beg, end);
   if(!ccp || e.tag != CURL_ASN1_OBJECT_IDENTIFIER)
-    return (const char *) NULL;
+    return NULL;
 
   p = OID2str(e.beg, e.end, FALSE);
   if(!p)
-    return (const char *) NULL;
+    return NULL;
 
   matched = !strcmp(p, oid);
   free((char *) p);
-  return matched? ccp: (const char *) NULL;
+  return matched? ccp: NULL;
 }
 
 CURLcode Curl_verifyhost(struct connectdata *conn,
index ce40297..205fdc0 100644 (file)
@@ -8,7 +8,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -26,7 +26,7 @@
 #include "curl_setup.h"
 
 #if defined(USE_GSKIT) || defined(USE_NSS) || defined(USE_GNUTLS) || \
-    defined(USE_CYASSL) || defined(USE_SCHANNEL)
+    defined(USE_WOLFSSL) || defined(USE_SCHANNEL)
 
 #include "urldata.h"
 
@@ -130,5 +130,5 @@ CURLcode Curl_extract_certinfo(struct connectdata *conn, int certnum,
                                const char *beg, const char *end);
 CURLcode Curl_verifyhost(struct connectdata *conn,
                          const char *beg, const char *end);
-#endif /* USE_GSKIT or USE_NSS or USE_GNUTLS or USE_CYASSL or USE_SCHANNEL */
+#endif /* USE_GSKIT or USE_NSS or USE_GNUTLS or USE_WOLFSSL or USE_SCHANNEL */
 #endif /* HEADER_CURL_X509ASN1_H */
index 68fd36c..d11f1e0 100644 (file)
--- a/ltmain.sh
+++ b/ltmain.sh
@@ -31,7 +31,7 @@
 
 PROGRAM=libtool
 PACKAGE=libtool
-VERSION="2.4.6 Debian-2.4.6-6"
+VERSION="2.4.6 Debian-2.4.6-11"
 package_revision=2.4.6
 
 
@@ -64,7 +64,7 @@ package_revision=2.4.6
 # libraries, which are installed to $pkgauxdir.
 
 # Set a version string for this script.
-scriptversion=2015-10-04.22; # UTC
+scriptversion=2015-01-20.17; # UTC
 
 # General shell script boiler plate, and helper functions.
 # Written by Gary V. Vaughan, 2004
@@ -1091,57 +1091,6 @@ func_relative_path ()
 }
 
 
-# func_quote ARG
-# --------------
-# Aesthetically quote one ARG, store the result into $func_quote_result.  Note
-# that we keep attention to performance here (so far O(N) complexity as long as
-# func_append is O(1)).
-func_quote ()
-{
-    $debug_cmd
-
-    func_quote_result=$1
-
-    case $func_quote_result in
-      *[\\\`\"\$]*)
-        case $func_quote_result in
-          *[\[\*\?]*)
-            func_quote_result=`$ECHO "$func_quote_result" | $SED "$sed_quote_subst"`
-            return 0
-            ;;
-        esac
-
-        func_quote_old_IFS=$IFS
-        for _G_char in '\' '`' '"' '$'
-        do
-          # STATE($1) PREV($2) SEPARATOR($3)
-          set start "" ""
-          func_quote_result=dummy"$_G_char$func_quote_result$_G_char"dummy
-          IFS=$_G_char
-          for _G_part in $func_quote_result
-          do
-            case $1 in
-            quote)
-              func_append func_quote_result "$3$2"
-              set quote "$_G_part" "\\$_G_char"
-              ;;
-            start)
-              set first "" ""
-              func_quote_result=
-              ;;
-            first)
-              set quote "$_G_part" ""
-              ;;
-            esac
-          done
-          IFS=$func_quote_old_IFS
-        done
-        ;;
-      *) ;;
-    esac
-}
-
-
 # func_quote_for_eval ARG...
 # --------------------------
 # Aesthetically quote ARGs to be evaled later.
@@ -1158,8 +1107,12 @@ func_quote_for_eval ()
     func_quote_for_eval_unquoted_result=
     func_quote_for_eval_result=
     while test 0 -lt $#; do
-      func_quote "$1"
-      _G_unquoted_arg=$func_quote_result
+      case $1 in
+        *[\\\`\"\$]*)
+         _G_unquoted_arg=`printf '%s\n' "$1" |$SED "$sed_quote_subst"` ;;
+        *)
+          _G_unquoted_arg=$1 ;;
+      esac
       if test -n "$func_quote_for_eval_unquoted_result"; then
        func_append func_quote_for_eval_unquoted_result " $_G_unquoted_arg"
       else
@@ -2188,7 +2141,7 @@ include the following information:
        compiler:       $LTCC
        compiler flags: $LTCFLAGS
        linker:         $LD (gnu? $with_gnu_ld)
-       version:        $progname $scriptversion Debian-2.4.6-6
+       version:        $progname $scriptversion Debian-2.4.6-11
        automake:       `($AUTOMAKE --version) 2>/dev/null |$SED 1q`
        autoconf:       `($AUTOCONF --version) 2>/dev/null |$SED 1q`
 
@@ -5397,8 +5350,7 @@ else
   if test \"\$libtool_execute_magic\" != \"$magic\"; then
     file=\"\$0\""
 
-    func_quote "$ECHO"
-    qECHO=$func_quote_result
+    qECHO=`$ECHO "$ECHO" | $SED "$sed_quote_subst"`
     $ECHO "\
 
 # A function that is used when there is no print builtin or printf.
@@ -7415,10 +7367,11 @@ func_mode_link ()
       # -specs=*             GCC specs files
       # -stdlib=*            select c++ std lib with clang
       # -fsanitize=*         Clang/GCC memory and address sanitizer
+      # -fuse-ld=*           Linker select flags for GCC
       -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \
       -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*|--sysroot=*| \
       -O*|-g*|-flto*|-fwhopr*|-fuse-linker-plugin|-fstack-protector*|-stdlib=*| \
-      -specs=*|-fsanitize=*)
+      -specs=*|-fsanitize=*|-fuse-ld=*)
         func_quote_for_eval "$arg"
        arg=$func_quote_for_eval_result
         func_append compile_command " $arg"
@@ -10655,8 +10608,8 @@ EOF
            relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command"
          fi
        done
-       func_quote "(cd `pwd`; $relink_command)"
-       relink_command=$func_quote_result
+       relink_command="(cd `pwd`; $relink_command)"
+       relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"`
       fi
 
       # Only actually do things if not in dry run mode.
@@ -10902,8 +10855,7 @@ EOF
       done
       # Quote the link command for shipping.
       relink_command="(cd `pwd`; $SHELL \"$progpath\" $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)"
-      func_quote "$relink_command"
-      relink_command=$func_quote_result
+      relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"`
       if test yes = "$hardcode_automatic"; then
        relink_command=
       fi
diff --git a/m4/ax_code_coverage.m4 b/m4/ax_code_coverage.m4
deleted file mode 100644 (file)
index 6484f03..0000000
+++ /dev/null
@@ -1,264 +0,0 @@
-# ===========================================================================
-#     https://www.gnu.org/software/autoconf-archive/ax_code_coverage.html
-# ===========================================================================
-#
-# SYNOPSIS
-#
-#   AX_CODE_COVERAGE()
-#
-# DESCRIPTION
-#
-#   Defines CODE_COVERAGE_CPPFLAGS, CODE_COVERAGE_CFLAGS,
-#   CODE_COVERAGE_CXXFLAGS and CODE_COVERAGE_LIBS which should be included
-#   in the CPPFLAGS, CFLAGS CXXFLAGS and LIBS/LIBADD variables of every
-#   build target (program or library) which should be built with code
-#   coverage support. Also defines CODE_COVERAGE_RULES which should be
-#   substituted in your Makefile; and $enable_code_coverage which can be
-#   used in subsequent configure output. CODE_COVERAGE_ENABLED is defined
-#   and substituted, and corresponds to the value of the
-#   --enable-code-coverage option, which defaults to being disabled.
-#
-#   Test also for gcov program and create GCOV variable that could be
-#   substituted.
-#
-#   Note that all optimization flags in CFLAGS must be disabled when code
-#   coverage is enabled.
-#
-#   Usage example:
-#
-#   configure.ac:
-#
-#     AX_CODE_COVERAGE
-#
-#   Makefile.am:
-#
-#     @CODE_COVERAGE_RULES@
-#     my_program_LIBS = ... $(CODE_COVERAGE_LIBS) ...
-#     my_program_CPPFLAGS = ... $(CODE_COVERAGE_CPPFLAGS) ...
-#     my_program_CFLAGS = ... $(CODE_COVERAGE_CFLAGS) ...
-#     my_program_CXXFLAGS = ... $(CODE_COVERAGE_CXXFLAGS) ...
-#
-#   This results in a "check-code-coverage" rule being added to any
-#   Makefile.am which includes "@CODE_COVERAGE_RULES@" (assuming the module
-#   has been configured with --enable-code-coverage). Running `make
-#   check-code-coverage` in that directory will run the module's test suite
-#   (`make check`) and build a code coverage report detailing the code which
-#   was touched, then print the URI for the report.
-#
-#   In earlier versions of this macro, CODE_COVERAGE_LDFLAGS was defined
-#   instead of CODE_COVERAGE_LIBS. They are both still defined, but use of
-#   CODE_COVERAGE_LIBS is preferred for clarity; CODE_COVERAGE_LDFLAGS is
-#   deprecated. They have the same value.
-#
-#   This code was derived from Makefile.decl in GLib, originally licenced
-#   under LGPLv2.1+.
-#
-# LICENSE
-#
-#   Copyright (c) 2012, 2016 Philip Withnall
-#   Copyright (c) 2012 Xan Lopez
-#   Copyright (c) 2012 Christian Persch
-#   Copyright (c) 2012 Paolo Borelli
-#   Copyright (c) 2012 Dan Winship
-#   Copyright (c) 2015 Bastien ROUCARIES
-#
-#   This library is free software; you can redistribute it and/or modify it
-#   under the terms of the GNU Lesser General Public License as published by
-#   the Free Software Foundation; either version 2.1 of the License, or (at
-#   your option) any later version.
-#
-#   This library is distributed in the hope that it will be useful, but
-#   WITHOUT ANY WARRANTY; without even the implied warranty of
-#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser
-#   General Public License for more details.
-#
-#   You should have received a copy of the GNU Lesser General Public License
-#   along with this program. If not, see <https://www.gnu.org/licenses/>.
-
-#serial 25
-
-AC_DEFUN([AX_CODE_COVERAGE],[
-       dnl Check for --enable-code-coverage
-       AC_REQUIRE([AC_PROG_SED])
-
-       # allow to override gcov location
-       AC_ARG_WITH([gcov],
-         [AS_HELP_STRING([--with-gcov[=GCOV]], [use given GCOV for coverage (GCOV=gcov).])],
-         [_AX_CODE_COVERAGE_GCOV_PROG_WITH=$with_gcov],
-         [_AX_CODE_COVERAGE_GCOV_PROG_WITH=gcov])
-
-       AC_MSG_CHECKING([whether to build with code coverage support])
-       AC_ARG_ENABLE([code-coverage],
-         AS_HELP_STRING([--enable-code-coverage],
-         [Whether to enable code coverage support]),,
-         enable_code_coverage=no)
-
-       AM_CONDITIONAL([CODE_COVERAGE_ENABLED], [test x$enable_code_coverage = xyes])
-       AC_SUBST([CODE_COVERAGE_ENABLED], [$enable_code_coverage])
-       AC_MSG_RESULT($enable_code_coverage)
-
-       AS_IF([ test "$enable_code_coverage" = "yes" ], [
-               # check for gcov
-               AC_CHECK_TOOL([GCOV],
-                 [$_AX_CODE_COVERAGE_GCOV_PROG_WITH],
-                 [:])
-               AS_IF([test "X$GCOV" = "X:"],
-                 [AC_MSG_ERROR([gcov is needed to do coverage])])
-               AC_SUBST([GCOV])
-
-               dnl Check if gcc is being used
-               AS_IF([ test "$GCC" = "no" ], [
-                       AC_MSG_ERROR([not compiling with gcc, which is required for gcov code coverage])
-               ])
-
-               AC_CHECK_PROG([LCOV], [lcov], [lcov])
-               AC_CHECK_PROG([GENHTML], [genhtml], [genhtml])
-
-               AS_IF([ test -z "$LCOV" ], [
-                       AC_MSG_ERROR([To enable code coverage reporting you must have lcov installed])
-               ])
-
-               AS_IF([ test -z "$GENHTML" ], [
-                       AC_MSG_ERROR([Could not find genhtml from the lcov package])
-               ])
-
-               dnl Build the code coverage flags
-               dnl Define CODE_COVERAGE_LDFLAGS for backwards compatibility
-               CODE_COVERAGE_CPPFLAGS="-DNDEBUG"
-               CODE_COVERAGE_CFLAGS="-O0 -g -fprofile-arcs -ftest-coverage"
-               CODE_COVERAGE_CXXFLAGS="-O0 -g -fprofile-arcs -ftest-coverage"
-               CODE_COVERAGE_LIBS="-lgcov"
-               CODE_COVERAGE_LDFLAGS="$CODE_COVERAGE_LIBS"
-
-               AC_SUBST([CODE_COVERAGE_CPPFLAGS])
-               AC_SUBST([CODE_COVERAGE_CFLAGS])
-               AC_SUBST([CODE_COVERAGE_CXXFLAGS])
-               AC_SUBST([CODE_COVERAGE_LIBS])
-               AC_SUBST([CODE_COVERAGE_LDFLAGS])
-
-               [CODE_COVERAGE_RULES_CHECK='
-       -$(A''M_V_at)$(MAKE) $(AM_MAKEFLAGS) -k check
-       $(A''M_V_at)$(MAKE) $(AM_MAKEFLAGS) code-coverage-capture
-']
-               [CODE_COVERAGE_RULES_CAPTURE='
-       $(code_coverage_v_lcov_cap)$(LCOV) $(code_coverage_quiet) $(addprefix --directory ,$(CODE_COVERAGE_DIRECTORY)) --capture --output-file "$(CODE_COVERAGE_OUTPUT_FILE).tmp" --test-name "$(call code_coverage_sanitize,$(PACKAGE_NAME)-$(PACKAGE_VERSION))" --no-checksum --compat-libtool $(CODE_COVERAGE_LCOV_SHOPTS) $(CODE_COVERAGE_LCOV_OPTIONS)
-       $(code_coverage_v_lcov_ign)$(LCOV) $(code_coverage_quiet) $(addprefix --directory ,$(CODE_COVERAGE_DIRECTORY)) --remove "$(CODE_COVERAGE_OUTPUT_FILE).tmp" "/tmp/*" $(CODE_COVERAGE_IGNORE_PATTERN) --output-file "$(CODE_COVERAGE_OUTPUT_FILE)" $(CODE_COVERAGE_LCOV_SHOPTS) $(CODE_COVERAGE_LCOV_RMOPTS)
-       -@rm -f $(CODE_COVERAGE_OUTPUT_FILE).tmp
-       $(code_coverage_v_genhtml)LANG=C $(GENHTML) $(code_coverage_quiet) $(addprefix --prefix ,$(CODE_COVERAGE_DIRECTORY)) --output-directory "$(CODE_COVERAGE_OUTPUT_DIRECTORY)" --title "$(PACKAGE_NAME)-$(PACKAGE_VERSION) Code Coverage" --legend --show-details "$(CODE_COVERAGE_OUTPUT_FILE)" $(CODE_COVERAGE_GENHTML_OPTIONS)
-       @echo "file://$(abs_builddir)/$(CODE_COVERAGE_OUTPUT_DIRECTORY)/index.html"
-']
-               [CODE_COVERAGE_RULES_CLEAN='
-clean: code-coverage-clean
-distclean: code-coverage-clean
-code-coverage-clean:
-       -$(LCOV) --directory $(top_builddir) -z
-       -rm -rf $(CODE_COVERAGE_OUTPUT_FILE) $(CODE_COVERAGE_OUTPUT_FILE).tmp $(CODE_COVERAGE_OUTPUT_DIRECTORY)
-       -find . \( -name "*.gcda" -o -name "*.gcno" -o -name "*.gcov" \) -delete
-']
-       ], [
-               [CODE_COVERAGE_RULES_CHECK='
-       @echo "Need to reconfigure with --enable-code-coverage"
-']
-               CODE_COVERAGE_RULES_CAPTURE="$CODE_COVERAGE_RULES_CHECK"
-               CODE_COVERAGE_RULES_CLEAN=''
-       ])
-
-[CODE_COVERAGE_RULES='
-# Code coverage
-#
-# Optional:
-#  - CODE_COVERAGE_DIRECTORY: Top-level directory for code coverage reporting.
-#    Multiple directories may be specified, separated by whitespace.
-#    (Default: $(top_builddir))
-#  - CODE_COVERAGE_OUTPUT_FILE: Filename and path for the .info file generated
-#    by lcov for code coverage. (Default:
-#    $(PACKAGE_NAME)-$(PACKAGE_VERSION)-coverage.info)
-#  - CODE_COVERAGE_OUTPUT_DIRECTORY: Directory for generated code coverage
-#    reports to be created. (Default:
-#    $(PACKAGE_NAME)-$(PACKAGE_VERSION)-coverage)
-#  - CODE_COVERAGE_BRANCH_COVERAGE: Set to 1 to enforce branch coverage,
-#    set to 0 to disable it and leave empty to stay with the default.
-#    (Default: empty)
-#  - CODE_COVERAGE_LCOV_SHOPTS_DEFAULT: Extra options shared between both lcov
-#    instances. (Default: based on $CODE_COVERAGE_BRANCH_COVERAGE)
-#  - CODE_COVERAGE_LCOV_SHOPTS: Extra options to shared between both lcov
-#    instances. (Default: $CODE_COVERAGE_LCOV_SHOPTS_DEFAULT)
-#  - CODE_COVERAGE_LCOV_OPTIONS_GCOVPATH: --gcov-tool pathtogcov
-#  - CODE_COVERAGE_LCOV_OPTIONS_DEFAULT: Extra options to pass to the
-#    collecting lcov instance. (Default: $CODE_COVERAGE_LCOV_OPTIONS_GCOVPATH)
-#  - CODE_COVERAGE_LCOV_OPTIONS: Extra options to pass to the collecting lcov
-#    instance. (Default: $CODE_COVERAGE_LCOV_OPTIONS_DEFAULT)
-#  - CODE_COVERAGE_LCOV_RMOPTS_DEFAULT: Extra options to pass to the filtering
-#    lcov instance. (Default: empty)
-#  - CODE_COVERAGE_LCOV_RMOPTS: Extra options to pass to the filtering lcov
-#    instance. (Default: $CODE_COVERAGE_LCOV_RMOPTS_DEFAULT)
-#  - CODE_COVERAGE_GENHTML_OPTIONS_DEFAULT: Extra options to pass to the
-#    genhtml instance. (Default: based on $CODE_COVERAGE_BRANCH_COVERAGE)
-#  - CODE_COVERAGE_GENHTML_OPTIONS: Extra options to pass to the genhtml
-#    instance. (Default: $CODE_COVERAGE_GENHTML_OPTIONS_DEFAULT)
-#  - CODE_COVERAGE_IGNORE_PATTERN: Extra glob pattern of files to ignore
-#
-# The generated report will be titled using the $(PACKAGE_NAME) and
-# $(PACKAGE_VERSION). In order to add the current git hash to the title,
-# use the git-version-gen script, available online.
-
-# Optional variables
-CODE_COVERAGE_DIRECTORY ?= $(top_builddir)
-CODE_COVERAGE_OUTPUT_FILE ?= $(PACKAGE_NAME)-$(PACKAGE_VERSION)-coverage.info
-CODE_COVERAGE_OUTPUT_DIRECTORY ?= $(PACKAGE_NAME)-$(PACKAGE_VERSION)-coverage
-CODE_COVERAGE_BRANCH_COVERAGE ?=
-CODE_COVERAGE_LCOV_SHOPTS_DEFAULT ?= $(if $(CODE_COVERAGE_BRANCH_COVERAGE),\
---rc lcov_branch_coverage=$(CODE_COVERAGE_BRANCH_COVERAGE))
-CODE_COVERAGE_LCOV_SHOPTS ?= $(CODE_COVERAGE_LCOV_SHOPTS_DEFAULT)
-CODE_COVERAGE_LCOV_OPTIONS_GCOVPATH ?= --gcov-tool "$(GCOV)"
-CODE_COVERAGE_LCOV_OPTIONS_DEFAULT ?= $(CODE_COVERAGE_LCOV_OPTIONS_GCOVPATH)
-CODE_COVERAGE_LCOV_OPTIONS ?= $(CODE_COVERAGE_LCOV_OPTIONS_DEFAULT)
-CODE_COVERAGE_LCOV_RMOPTS_DEFAULT ?=
-CODE_COVERAGE_LCOV_RMOPTS ?= $(CODE_COVERAGE_LCOV_RMOPTS_DEFAULT)
-CODE_COVERAGE_GENHTML_OPTIONS_DEFAULT ?=\
-$(if $(CODE_COVERAGE_BRANCH_COVERAGE),\
---rc genhtml_branch_coverage=$(CODE_COVERAGE_BRANCH_COVERAGE))
-CODE_COVERAGE_GENHTML_OPTIONS ?= $(CODE_COVERAGE_GENHTML_OPTIONS_DEFAULT)
-CODE_COVERAGE_IGNORE_PATTERN ?=
-
-GITIGNOREFILES ?=
-GITIGNOREFILES += $(CODE_COVERAGE_OUTPUT_FILE) $(CODE_COVERAGE_OUTPUT_DIRECTORY)
-
-code_coverage_v_lcov_cap = $(code_coverage_v_lcov_cap_$(V))
-code_coverage_v_lcov_cap_ = $(code_coverage_v_lcov_cap_$(AM_DEFAULT_VERBOSITY))
-code_coverage_v_lcov_cap_0 = @echo "  LCOV   --capture"\
- $(CODE_COVERAGE_OUTPUT_FILE);
-code_coverage_v_lcov_ign = $(code_coverage_v_lcov_ign_$(V))
-code_coverage_v_lcov_ign_ = $(code_coverage_v_lcov_ign_$(AM_DEFAULT_VERBOSITY))
-code_coverage_v_lcov_ign_0 = @echo "  LCOV   --remove /tmp/*"\
- $(CODE_COVERAGE_IGNORE_PATTERN);
-code_coverage_v_genhtml = $(code_coverage_v_genhtml_$(V))
-code_coverage_v_genhtml_ = $(code_coverage_v_genhtml_$(AM_DEFAULT_VERBOSITY))
-code_coverage_v_genhtml_0 = @echo "  GEN   " $(CODE_COVERAGE_OUTPUT_DIRECTORY);
-code_coverage_quiet = $(code_coverage_quiet_$(V))
-code_coverage_quiet_ = $(code_coverage_quiet_$(AM_DEFAULT_VERBOSITY))
-code_coverage_quiet_0 = --quiet
-
-# sanitizes the test-name: replaces with underscores: dashes and dots
-code_coverage_sanitize = $(subst -,_,$(subst .,_,$(1)))
-
-# Use recursive makes in order to ignore errors during check
-check-code-coverage:'"$CODE_COVERAGE_RULES_CHECK"'
-
-# Capture code coverage data
-code-coverage-capture: code-coverage-capture-hook'"$CODE_COVERAGE_RULES_CAPTURE"'
-
-# Hook rule executed before code-coverage-capture, overridable by the user
-code-coverage-capture-hook:
-
-'"$CODE_COVERAGE_RULES_CLEAN"'
-
-A''M_DISTCHECK_CONFIGURE_FLAGS ?=
-A''M_DISTCHECK_CONFIGURE_FLAGS += --disable-code-coverage
-
-.PHONY: check-code-coverage code-coverage-capture code-coverage-capture-hook code-coverage-clean
-']
-
-       AC_SUBST([CODE_COVERAGE_RULES])
-       m4_ifdef([_AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE([CODE_COVERAGE_RULES])])
-])
index 6418043..c64db4b 100644 (file)
@@ -5,7 +5,7 @@
 #                            | (__| |_| |  _ <| |___
 #                             \___|\___/|_| \_\_____|
 #
-# Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 #
 # This software is licensed as described in the file COPYING, which
 # you should have received as part of this distribution. The terms
@@ -83,7 +83,16 @@ AC_DEFUN([CURL_CHECK_COMPILER_CLANG], [
   CURL_CHECK_DEF([__clang__], [], [silent])
   if test "$curl_cv_have_def___clang__" = "yes"; then
     AC_MSG_RESULT([yes])
-    compiler_id="CLANG"
+    AC_MSG_CHECKING([if compiler is xlclang])
+    CURL_CHECK_DEF([__ibmxl__], [], [silent])
+    if test "$curl_cv_have_def___ibmxl__" = "yes" ; then
+      dnl IBM's almost-compatible clang version
+      AC_MSG_RESULT([yes])
+      compiler_id="XLCLANG"
+    else
+      AC_MSG_RESULT([no])
+      compiler_id="CLANG"
+    fi
     fullclangver=`$CC -v 2>&1 | grep version`
     clangver=`echo $fullclangver | grep "based on LLVM " | "$SED" 's/.*(based on LLVM \(@<:@0-9@:>@*\.@<:@0-9@:>@*\).*)/\1/'`
     if test -z "$clangver"; then
index a0f477a..af15a85 100644 (file)
@@ -5,7 +5,7 @@
 #                            | (__| |_| |  _ <| |___
 #                             \___|\___/|_| \_\_____|
 #
-# Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 #
 # This software is licensed as described in the file COPYING, which
 # you should have received as part of this distribution. The terms
@@ -321,7 +321,7 @@ dnl ])
 
 dnl CURL_CHECK_OPTION_RT
 dnl -------------------------------------------------
-dnl Verify if configure has been involed with option
+dnl Verify if configure has been invoked with option
 dnl --disable-rt and set shell variable dontwant_rt
 dnl as appropriate.
 
@@ -648,3 +648,39 @@ AC_DEFUN([CURL_CHECK_NTLM_WB], [
     NTLM_WB_ENABLED=1
   fi
 ])
+
+dnl CURL_CHECK_OPTION_ESNI
+dnl -----------------------------------------------------
+dnl Verify whether configure has been invoked with option
+dnl --enable-esni or --disable-esni, and set
+dnl shell variable want_esni as appropriate.
+
+AC_DEFUN([CURL_CHECK_OPTION_ESNI], [
+  AC_MSG_CHECKING([whether to enable ESNI support])
+  OPT_ESNI="default"
+  AC_ARG_ENABLE(esni,
+AC_HELP_STRING([--enable-esni],[Enable ESNI support])
+AC_HELP_STRING([--disable-esni],[Disable ESNI support]),
+  OPT_ESNI=$enableval)
+  case "$OPT_ESNI" in
+    no)
+      dnl --disable-esni option used
+      want_esni="no"
+      curl_esni_msg="no      (--enable-esni)"
+      AC_MSG_RESULT([no])
+      ;;
+    default)
+      dnl configure option not specified
+      want_esni="no"
+      curl_esni_msg="no      (--enable-esni)"
+      AC_MSG_RESULT([no])
+      ;;
+    *)
+      dnl --enable-esni option used
+      want_esni="yes"
+      curl_esni_msg="enabled (--disable-esni)"
+      experimental="esni"
+      AC_MSG_RESULT([yes])
+      ;;
+  esac
+])
index 275b67b..9020f39 100644 (file)
@@ -5,7 +5,7 @@
 #                            | (__| |_| |  _ <| |___
 #                             \___|\___/|_| \_\_____|
 #
-# Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 #
 # This software is licensed as described in the file COPYING, which
 # you should have received as part of this distribution. The terms
@@ -545,6 +545,42 @@ curl_includes_ws2tcpip="\
 ])
 
 
+dnl CURL_INCLUDES_BSDSOCKET
+dnl -------------------------------------------------
+dnl Set up variable with list of headers that must be
+dnl included when bsdsocket.h is to be included.
+
+AC_DEFUN([CURL_INCLUDES_BSDSOCKET], [
+curl_includes_bsdsocket="\
+/* includes start */
+#ifdef HAVE_PROTO_BSDSOCKET_H
+#  include <proto/bsdsocket.h>
+  struct Library *SocketBase = NULL;
+#endif
+/* includes end */"
+  AC_CHECK_HEADERS(
+    proto/bsdsocket.h,
+    [], [], [      $curl_includes_bsdsocket])
+])
+
+dnl CURL_INCLUDES_NETIF
+dnl -------------------------------------------------
+dnl Set up variable with list of headers that must be
+dnl included when net/if.h is to be included.
+
+AC_DEFUN([CURL_INCLUDES_NETIF], [
+curl_includes_netif="\
+/* includes start */
+#ifdef HAVE_NET_IF_H
+#  include <net/if.h>
+#endif
+/* includes end */"
+  AC_CHECK_HEADERS(
+    net/if.h,
+    [], [], [$curl_includes_netif])
+])
+
+
 dnl CURL_PREPROCESS_CALLCONV
 dnl -------------------------------------------------
 dnl Set up variable with a preprocessor block which
@@ -759,6 +795,7 @@ AC_DEFUN([CURL_CHECK_FUNC_CLOSESOCKET], [
   AC_LINK_IFELSE([
     AC_LANG_PROGRAM([[
       $curl_includes_winsock2
+      $curl_includes_bsdsocket
       $curl_includes_socket
     ]],[[
       if(0 != closesocket(0))
@@ -776,6 +813,7 @@ AC_DEFUN([CURL_CHECK_FUNC_CLOSESOCKET], [
     AC_MSG_CHECKING([if closesocket is prototyped])
     AC_EGREP_CPP([closesocket],[
       $curl_includes_winsock2
+      $curl_includes_bsdsocket
       $curl_includes_socket
     ],[
       AC_MSG_RESULT([yes])
@@ -791,6 +829,7 @@ AC_DEFUN([CURL_CHECK_FUNC_CLOSESOCKET], [
     AC_COMPILE_IFELSE([
       AC_LANG_PROGRAM([[
         $curl_includes_winsock2
+      $curl_includes_bsdsocket
         $curl_includes_socket
       ]],[[
         if(0 != closesocket(0))
@@ -944,6 +983,7 @@ AC_DEFUN([CURL_CHECK_FUNC_CONNECT], [
   AC_LINK_IFELSE([
     AC_LANG_PROGRAM([[
       $curl_includes_winsock2
+      $curl_includes_bsdsocket
       $curl_includes_sys_socket
       $curl_includes_socket
     ]],[[
@@ -962,6 +1002,7 @@ AC_DEFUN([CURL_CHECK_FUNC_CONNECT], [
     AC_MSG_CHECKING([if connect is prototyped])
     AC_EGREP_CPP([connect],[
       $curl_includes_winsock2
+      $curl_includes_bsdsocket
       $curl_includes_sys_socket
       $curl_includes_socket
     ],[
@@ -978,6 +1019,7 @@ AC_DEFUN([CURL_CHECK_FUNC_CONNECT], [
     AC_COMPILE_IFELSE([
       AC_LANG_PROGRAM([[
         $curl_includes_winsock2
+      $curl_includes_bsdsocket
         $curl_includes_sys_socket
         $curl_includes_socket
       ]],[[
@@ -1168,92 +1210,6 @@ AC_DEFUN([CURL_CHECK_FUNC_FCNTL_O_NONBLOCK], [
   fi
 ])
 
-
-dnl CURL_CHECK_FUNC_FDOPEN
-dnl -------------------------------------------------
-dnl Verify if fdopen is available, prototyped, and
-dnl can be compiled. If all of these are true, and
-dnl usage has not been previously disallowed with
-dnl shell variable curl_disallow_fdopen, then
-dnl HAVE_FDOPEN will be defined.
-
-AC_DEFUN([CURL_CHECK_FUNC_FDOPEN], [
-  AC_REQUIRE([CURL_INCLUDES_STDIO])dnl
-  #
-  tst_links_fdopen="unknown"
-  tst_proto_fdopen="unknown"
-  tst_compi_fdopen="unknown"
-  tst_allow_fdopen="unknown"
-  #
-  AC_MSG_CHECKING([if fdopen can be linked])
-  AC_LINK_IFELSE([
-    AC_LANG_FUNC_LINK_TRY([fdopen])
-  ],[
-    AC_MSG_RESULT([yes])
-    tst_links_fdopen="yes"
-  ],[
-    AC_MSG_RESULT([no])
-    tst_links_fdopen="no"
-  ])
-  #
-  if test "$tst_links_fdopen" = "yes"; then
-    AC_MSG_CHECKING([if fdopen is prototyped])
-    AC_EGREP_CPP([fdopen],[
-      $curl_includes_stdio
-    ],[
-      AC_MSG_RESULT([yes])
-      tst_proto_fdopen="yes"
-    ],[
-      AC_MSG_RESULT([no])
-      tst_proto_fdopen="no"
-    ])
-  fi
-  #
-  if test "$tst_proto_fdopen" = "yes"; then
-    AC_MSG_CHECKING([if fdopen is compilable])
-    AC_COMPILE_IFELSE([
-      AC_LANG_PROGRAM([[
-        $curl_includes_stdio
-      ]],[[
-        if(0 != fdopen(0, 0))
-          return 1;
-      ]])
-    ],[
-      AC_MSG_RESULT([yes])
-      tst_compi_fdopen="yes"
-    ],[
-      AC_MSG_RESULT([no])
-      tst_compi_fdopen="no"
-    ])
-  fi
-  #
-  if test "$tst_compi_fdopen" = "yes"; then
-    AC_MSG_CHECKING([if fdopen usage allowed])
-    if test "x$curl_disallow_fdopen" != "xyes"; then
-      AC_MSG_RESULT([yes])
-      tst_allow_fdopen="yes"
-    else
-      AC_MSG_RESULT([no])
-      tst_allow_fdopen="no"
-    fi
-  fi
-  #
-  AC_MSG_CHECKING([if fdopen might be used])
-  if test "$tst_links_fdopen" = "yes" &&
-     test "$tst_proto_fdopen" = "yes" &&
-     test "$tst_compi_fdopen" = "yes" &&
-     test "$tst_allow_fdopen" = "yes"; then
-    AC_MSG_RESULT([yes])
-    AC_DEFINE_UNQUOTED(HAVE_FDOPEN, 1,
-      [Define to 1 if you have the fdopen function.])
-    curl_cv_func_fdopen="yes"
-  else
-    AC_MSG_RESULT([no])
-    curl_cv_func_fdopen="no"
-  fi
-])
-
-
 dnl CURL_CHECK_FUNC_FGETXATTR
 dnl -------------------------------------------------
 dnl Verify if fgetxattr is available, prototyped, and
@@ -2292,6 +2248,7 @@ AC_DEFUN([CURL_CHECK_FUNC_GETHOSTBYADDR], [
   AC_LINK_IFELSE([
     AC_LANG_PROGRAM([[
       $curl_includes_winsock2
+      $curl_includes_bsdsocket
       $curl_includes_netdb
     ]],[[
       if(0 != gethostbyaddr(0, 0, 0))
@@ -2309,6 +2266,7 @@ AC_DEFUN([CURL_CHECK_FUNC_GETHOSTBYADDR], [
     AC_MSG_CHECKING([if gethostbyaddr is prototyped])
     AC_EGREP_CPP([gethostbyaddr],[
       $curl_includes_winsock2
+      $curl_includes_bsdsocket
       $curl_includes_netdb
     ],[
       AC_MSG_RESULT([yes])
@@ -2324,6 +2282,7 @@ AC_DEFUN([CURL_CHECK_FUNC_GETHOSTBYADDR], [
     AC_COMPILE_IFELSE([
       AC_LANG_PROGRAM([[
         $curl_includes_winsock2
+      $curl_includes_bsdsocket
         $curl_includes_netdb
       ]],[[
         if(0 != gethostbyaddr(0, 0, 0))
@@ -2385,6 +2344,7 @@ AC_DEFUN([CURL_CHECK_FUNC_GAI_STRERROR], [
   AC_LINK_IFELSE([
     AC_LANG_PROGRAM([[
       $curl_includes_winsock2
+      $curl_includes_bsdsocket
       $curl_includes_netdb
     ]],[[
       if(0 != gai_strerror(0))
@@ -2402,6 +2362,7 @@ AC_DEFUN([CURL_CHECK_FUNC_GAI_STRERROR], [
     AC_MSG_CHECKING([if gai_strerror is prototyped])
     AC_EGREP_CPP([gai_strerror],[
       $curl_includes_winsock2
+      $curl_includes_bsdsocket
       $curl_includes_netdb
     ],[
       AC_MSG_RESULT([yes])
@@ -2417,6 +2378,7 @@ AC_DEFUN([CURL_CHECK_FUNC_GAI_STRERROR], [
     AC_COMPILE_IFELSE([
       AC_LANG_PROGRAM([[
         $curl_includes_winsock2
+      $curl_includes_bsdsocket
         $curl_includes_netdb
       ]],[[
         if(0 != gai_strerror(0))
@@ -2621,6 +2583,7 @@ AC_DEFUN([CURL_CHECK_FUNC_GETHOSTBYNAME], [
   AC_LINK_IFELSE([
     AC_LANG_PROGRAM([[
       $curl_includes_winsock2
+      $curl_includes_bsdsocket
       $curl_includes_netdb
     ]],[[
       if(0 != gethostbyname(0))
@@ -2638,6 +2601,7 @@ AC_DEFUN([CURL_CHECK_FUNC_GETHOSTBYNAME], [
     AC_MSG_CHECKING([if gethostbyname is prototyped])
     AC_EGREP_CPP([gethostbyname],[
       $curl_includes_winsock2
+      $curl_includes_bsdsocket
       $curl_includes_netdb
     ],[
       AC_MSG_RESULT([yes])
@@ -2653,6 +2617,7 @@ AC_DEFUN([CURL_CHECK_FUNC_GETHOSTBYNAME], [
     AC_COMPILE_IFELSE([
       AC_LANG_PROGRAM([[
         $curl_includes_winsock2
+      $curl_includes_bsdsocket
         $curl_includes_netdb
       ]],[[
         if(0 != gethostbyname(0))
@@ -2848,6 +2813,7 @@ AC_DEFUN([CURL_CHECK_FUNC_GETHOSTNAME], [
   AC_REQUIRE([CURL_INCLUDES_WINSOCK2])dnl
   AC_REQUIRE([CURL_INCLUDES_UNISTD])dnl
   AC_REQUIRE([CURL_PREPROCESS_CALLCONV])dnl
+  AC_REQUIRE([CURL_INCLUDES_BSDSOCKET])dnl
   #
   tst_links_gethostname="unknown"
   tst_proto_gethostname="unknown"
@@ -2858,6 +2824,7 @@ AC_DEFUN([CURL_CHECK_FUNC_GETHOSTNAME], [
   AC_LINK_IFELSE([
     AC_LANG_PROGRAM([[
       $curl_includes_winsock2
+      $curl_includes_bsdsocket
       $curl_includes_unistd
     ]],[[
       if(0 != gethostname(0, 0))
@@ -2875,6 +2842,7 @@ AC_DEFUN([CURL_CHECK_FUNC_GETHOSTNAME], [
     AC_MSG_CHECKING([if gethostname is prototyped])
     AC_EGREP_CPP([gethostname],[
       $curl_includes_winsock2
+      $curl_includes_bsdsocket
       $curl_includes_unistd
     ],[
       AC_MSG_RESULT([yes])
@@ -2890,6 +2858,7 @@ AC_DEFUN([CURL_CHECK_FUNC_GETHOSTNAME], [
     AC_COMPILE_IFELSE([
       AC_LANG_PROGRAM([[
         $curl_includes_winsock2
+      $curl_includes_bsdsocket
         $curl_includes_unistd
       ]],[[
         if(0 != gethostname(0, 0))
@@ -2913,6 +2882,7 @@ AC_DEFUN([CURL_CHECK_FUNC_GETHOSTNAME], [
           AC_COMPILE_IFELSE([
             AC_LANG_PROGRAM([[
               $curl_includes_winsock2
+      $curl_includes_bsdsocket
               $curl_includes_unistd
               $curl_preprocess_callconv
               extern int FUNCALLCONV gethostname($tst_arg1, $tst_arg2);
@@ -2959,6 +2929,297 @@ AC_DEFUN([CURL_CHECK_FUNC_GETHOSTNAME], [
   fi
 ])
 
+dnl CURL_CHECK_FUNC_GETPEERNAME
+dnl -------------------------------------------------
+dnl Verify if getpeername is available, prototyped, and
+dnl can be compiled. If all of these are true, and
+dnl usage has not been previously disallowed with
+dnl shell variable curl_disallow_getpeername, then
+dnl HAVE_GETPEERNAME will be defined.
+
+AC_DEFUN([CURL_CHECK_FUNC_GETPEERNAME], [
+  AC_REQUIRE([CURL_INCLUDES_WINSOCK2])dnl
+  AC_REQUIRE([CURL_INCLUDES_UNISTD])dnl
+  AC_REQUIRE([CURL_PREPROCESS_CALLCONV])dnl
+  AC_REQUIRE([CURL_INCLUDES_BSDSOCKET])dnl
+  #
+  tst_links_getpeername="unknown"
+  tst_proto_getpeername="unknown"
+  tst_compi_getpeername="unknown"
+  tst_allow_getpeername="unknown"
+  #
+  AC_MSG_CHECKING([if getpeername can be linked])
+  AC_LINK_IFELSE([
+    AC_LANG_PROGRAM([[
+      $curl_includes_winsock2
+      $curl_includes_bsdsocket
+      $curl_includes_sys_socket
+    ]],[[
+      if(0 != getpeername(0, (void *)0, (void *)0))
+        return 1;
+    ]])
+  ],[
+    AC_MSG_RESULT([yes])
+    tst_links_getpeername="yes"
+  ],[
+    AC_MSG_RESULT([no])
+    tst_links_getpeername="no"
+  ])
+  #
+  if test "$tst_links_getpeername" = "yes"; then
+    AC_MSG_CHECKING([if getpeername is prototyped])
+    AC_EGREP_CPP([getpeername],[
+      $curl_includes_winsock2
+      $curl_includes_bsdsocket
+      $curl_includes_sys_socket
+    ],[
+      AC_MSG_RESULT([yes])
+      tst_proto_getpeername="yes"
+    ],[
+      AC_MSG_RESULT([no])
+      tst_proto_getpeername="no"
+    ])
+  fi
+  #
+  if test "$tst_proto_getpeername" = "yes"; then
+    AC_MSG_CHECKING([if getpeername is compilable])
+    AC_COMPILE_IFELSE([
+      AC_LANG_PROGRAM([[
+        $curl_includes_winsock2
+        $curl_includes_bsdsocket
+        $curl_includes_sys_socket
+      ]],[[
+        if(0 != getpeername(0, (void *)0, (void *)0))
+          return 1;
+      ]])
+    ],[
+      AC_MSG_RESULT([yes])
+      tst_compi_getpeername="yes"
+    ],[
+      AC_MSG_RESULT([no])
+      tst_compi_getpeername="no"
+    ])
+  fi
+  #
+  if test "$tst_compi_getpeername" = "yes"; then
+    AC_MSG_CHECKING([if getpeername usage allowed])
+    if test "x$curl_disallow_getpeername" != "xyes"; then
+      AC_MSG_RESULT([yes])
+      tst_allow_getpeername="yes"
+    else
+      AC_MSG_RESULT([no])
+      tst_allow_getpeername="no"
+    fi
+  fi
+  #
+  AC_MSG_CHECKING([if getpeername might be used])
+  if test "$tst_links_getpeername" = "yes" &&
+     test "$tst_proto_getpeername" = "yes" &&
+     test "$tst_compi_getpeername" = "yes" &&
+     test "$tst_allow_getpeername" = "yes"; then
+    AC_MSG_RESULT([yes])
+    AC_DEFINE_UNQUOTED(HAVE_GETPEERNAME, 1,
+      [Define to 1 if you have the getpeername function.])
+    curl_cv_func_getpeername="yes"
+  else
+    AC_MSG_RESULT([no])
+    curl_cv_func_getpeername="no"
+  fi
+])
+
+dnl CURL_CHECK_FUNC_GETSOCKNAME
+dnl -------------------------------------------------
+dnl Verify if getsockname is available, prototyped, and
+dnl can be compiled. If all of these are true, and
+dnl usage has not been previously disallowed with
+dnl shell variable curl_disallow_getsockname, then
+dnl HAVE_GETSOCKNAME will be defined.
+
+AC_DEFUN([CURL_CHECK_FUNC_GETSOCKNAME], [
+  AC_REQUIRE([CURL_INCLUDES_WINSOCK2])dnl
+  AC_REQUIRE([CURL_INCLUDES_UNISTD])dnl
+  AC_REQUIRE([CURL_PREPROCESS_CALLCONV])dnl
+  AC_REQUIRE([CURL_INCLUDES_BSDSOCKET])dnl
+  #
+  tst_links_getsockname="unknown"
+  tst_proto_getsockname="unknown"
+  tst_compi_getsockname="unknown"
+  tst_allow_getsockname="unknown"
+  #
+  AC_MSG_CHECKING([if getsockname can be linked])
+  AC_LINK_IFELSE([
+    AC_LANG_PROGRAM([[
+      $curl_includes_winsock2
+      $curl_includes_bsdsocket
+      $curl_includes_sys_socket
+    ]],[[
+      if(0 != getsockname(0, (void *)0, (void *)0))
+        return 1;
+    ]])
+  ],[
+    AC_MSG_RESULT([yes])
+    tst_links_getsockname="yes"
+  ],[
+    AC_MSG_RESULT([no])
+    tst_links_getsockname="no"
+  ])
+  #
+  if test "$tst_links_getsockname" = "yes"; then
+    AC_MSG_CHECKING([if getsockname is prototyped])
+    AC_EGREP_CPP([getsockname],[
+      $curl_includes_winsock2
+      $curl_includes_bsdsocket
+      $curl_includes_sys_socket
+    ],[
+      AC_MSG_RESULT([yes])
+      tst_proto_getsockname="yes"
+    ],[
+      AC_MSG_RESULT([no])
+      tst_proto_getsockname="no"
+    ])
+  fi
+  #
+  if test "$tst_proto_getsockname" = "yes"; then
+    AC_MSG_CHECKING([if getsockname is compilable])
+    AC_COMPILE_IFELSE([
+      AC_LANG_PROGRAM([[
+        $curl_includes_winsock2
+        $curl_includes_bsdsocket
+        $curl_includes_sys_socket
+      ]],[[
+        if(0 != getsockname(0, (void *)0, (void *)0))
+          return 1;
+      ]])
+    ],[
+      AC_MSG_RESULT([yes])
+      tst_compi_getsockname="yes"
+    ],[
+      AC_MSG_RESULT([no])
+      tst_compi_getsockname="no"
+    ])
+  fi
+  #
+  if test "$tst_compi_getsockname" = "yes"; then
+    AC_MSG_CHECKING([if getsockname usage allowed])
+    if test "x$curl_disallow_getsockname" != "xyes"; then
+      AC_MSG_RESULT([yes])
+      tst_allow_getsockname="yes"
+    else
+      AC_MSG_RESULT([no])
+      tst_allow_getsockname="no"
+    fi
+  fi
+  #
+  AC_MSG_CHECKING([if getsockname might be used])
+  if test "$tst_links_getsockname" = "yes" &&
+     test "$tst_proto_getsockname" = "yes" &&
+     test "$tst_compi_getsockname" = "yes" &&
+     test "$tst_allow_getsockname" = "yes"; then
+    AC_MSG_RESULT([yes])
+    AC_DEFINE_UNQUOTED(HAVE_GETSOCKNAME, 1,
+      [Define to 1 if you have the getsockname function.])
+    curl_cv_func_getsockname="yes"
+  else
+    AC_MSG_RESULT([no])
+    curl_cv_func_getsockname="no"
+  fi
+])
+
+dnl CURL_CHECK_FUNC_IF_NAMETOINDEX
+dnl -------------------------------------------------
+dnl Verify if if_nametoindex is available, prototyped, and
+dnl can be compiled. If all of these are true, and
+dnl usage has not been previously disallowed with
+dnl shell variable curl_disallow_if_nametoindex, then
+dnl HAVE_IF_NAMETOINDEX will be defined.
+
+AC_DEFUN([CURL_CHECK_FUNC_IF_NAMETOINDEX], [
+  AC_REQUIRE([CURL_INCLUDES_WINSOCK2])dnl
+  AC_REQUIRE([CURL_INCLUDES_NETIF])dnl
+  AC_REQUIRE([CURL_PREPROCESS_CALLCONV])dnl
+  #
+  tst_links_if_nametoindex="unknown"
+  tst_proto_if_nametoindex="unknown"
+  tst_compi_if_nametoindex="unknown"
+  tst_allow_if_nametoindex="unknown"
+  #
+  AC_MSG_CHECKING([if if_nametoindex can be linked])
+  AC_LINK_IFELSE([
+    AC_LANG_PROGRAM([[
+      $curl_includes_winsock2
+      $curl_includes_bsdsocket
+      #include <net/if.h>
+    ]],[[
+      if(0 != if_nametoindex(""))
+        return 1;
+    ]])
+  ],[
+    AC_MSG_RESULT([yes])
+    tst_links_if_nametoindex="yes"
+  ],[
+    AC_MSG_RESULT([no])
+    tst_links_if_nametoindex="no"
+  ])
+  #
+  if test "$tst_links_if_nametoindex" = "yes"; then
+    AC_MSG_CHECKING([if if_nametoindex is prototyped])
+    AC_EGREP_CPP([if_nametoindex],[
+      $curl_includes_winsock2
+      $curl_includes_netif
+    ],[
+      AC_MSG_RESULT([yes])
+      tst_proto_if_nametoindex="yes"
+    ],[
+      AC_MSG_RESULT([no])
+      tst_proto_if_nametoindex="no"
+    ])
+  fi
+  #
+  if test "$tst_proto_if_nametoindex" = "yes"; then
+    AC_MSG_CHECKING([if if_nametoindex is compilable])
+    AC_COMPILE_IFELSE([
+      AC_LANG_PROGRAM([[
+        $curl_includes_winsock2
+        $curl_includes_netif
+      ]],[[
+        if(0 != if_nametoindex(""))
+          return 1;
+      ]])
+    ],[
+      AC_MSG_RESULT([yes])
+      tst_compi_if_nametoindex="yes"
+    ],[
+      AC_MSG_RESULT([no])
+      tst_compi_if_nametoindex="no"
+    ])
+  fi
+  #
+  if test "$tst_compi_if_nametoindex" = "yes"; then
+    AC_MSG_CHECKING([if if_nametoindex usage allowed])
+    if test "x$curl_disallow_if_nametoindex" != "xyes"; then
+      AC_MSG_RESULT([yes])
+      tst_allow_if_nametoindex="yes"
+    else
+      AC_MSG_RESULT([no])
+      tst_allow_if_nametoindex="no"
+    fi
+  fi
+  #
+  AC_MSG_CHECKING([if if_nametoindex might be used])
+  if test "$tst_links_if_nametoindex" = "yes" &&
+     test "$tst_proto_if_nametoindex" = "yes" &&
+     test "$tst_compi_if_nametoindex" = "yes" &&
+     test "$tst_allow_if_nametoindex" = "yes"; then
+    AC_MSG_RESULT([yes])
+    AC_DEFINE_UNQUOTED(HAVE_IF_NAMETOINDEX, 1,
+      [Define to 1 if you have the if_nametoindex function.])
+    curl_cv_func_if_nametoindex="yes"
+  else
+    AC_MSG_RESULT([no])
+    curl_cv_func_if_nametoindex="no"
+  fi
+])
+
 
 dnl CURL_CHECK_FUNC_GETIFADDRS
 dnl -------------------------------------------------
@@ -4109,6 +4370,7 @@ AC_DEFUN([CURL_CHECK_FUNC_IOCTLSOCKET], [
   AC_LINK_IFELSE([
     AC_LANG_PROGRAM([[
       $curl_includes_winsock2
+      $curl_includes_bsdsocket
     ]],[[
       if(0 != ioctlsocket(0, 0, 0))
         return 1;
@@ -4125,6 +4387,7 @@ AC_DEFUN([CURL_CHECK_FUNC_IOCTLSOCKET], [
     AC_MSG_CHECKING([if ioctlsocket is prototyped])
     AC_EGREP_CPP([ioctlsocket],[
       $curl_includes_winsock2
+      $curl_includes_bsdsocket
     ],[
       AC_MSG_RESULT([yes])
       tst_proto_ioctlsocket="yes"
@@ -4139,6 +4402,7 @@ AC_DEFUN([CURL_CHECK_FUNC_IOCTLSOCKET], [
     AC_COMPILE_IFELSE([
       AC_LANG_PROGRAM([[
         $curl_includes_winsock2
+      $curl_includes_bsdsocket
       ]],[[
         if(0 != ioctlsocket(0, 0, 0))
           return 1;
@@ -4197,6 +4461,7 @@ AC_DEFUN([CURL_CHECK_FUNC_IOCTLSOCKET_FIONBIO], [
     AC_COMPILE_IFELSE([
       AC_LANG_PROGRAM([[
         $curl_includes_winsock2
+      $curl_includes_bsdsocket
       ]],[[
         int flags = 0;
         if(0 != ioctlsocket(0, FIONBIO, &flags))
@@ -5011,6 +5276,7 @@ AC_DEFUN([CURL_CHECK_FUNC_SETSOCKOPT], [
   AC_LINK_IFELSE([
     AC_LANG_PROGRAM([[
       $curl_includes_winsock2
+      $curl_includes_bsdsocket
       $curl_includes_sys_socket
     ]],[[
       if(0 != setsockopt(0, 0, 0, 0, 0))
@@ -5028,6 +5294,7 @@ AC_DEFUN([CURL_CHECK_FUNC_SETSOCKOPT], [
     AC_MSG_CHECKING([if setsockopt is prototyped])
     AC_EGREP_CPP([setsockopt],[
       $curl_includes_winsock2
+      $curl_includes_bsdsocket
       $curl_includes_sys_socket
     ],[
       AC_MSG_RESULT([yes])
@@ -5043,6 +5310,7 @@ AC_DEFUN([CURL_CHECK_FUNC_SETSOCKOPT], [
     AC_COMPILE_IFELSE([
       AC_LANG_PROGRAM([[
         $curl_includes_winsock2
+      $curl_includes_bsdsocket
         $curl_includes_sys_socket
       ]],[[
         if(0 != setsockopt(0, 0, 0, 0, 0))
@@ -5102,6 +5370,7 @@ AC_DEFUN([CURL_CHECK_FUNC_SETSOCKOPT_SO_NONBLOCK], [
     AC_COMPILE_IFELSE([
       AC_LANG_PROGRAM([[
         $curl_includes_winsock2
+      $curl_includes_bsdsocket
         $curl_includes_sys_socket
       ]],[[
         if(0 != setsockopt(0, SOL_SOCKET, SO_NONBLOCK, 0, 0))
@@ -5647,6 +5916,7 @@ AC_DEFUN([CURL_CHECK_FUNC_SOCKET], [
   AC_LINK_IFELSE([
     AC_LANG_PROGRAM([[
       $curl_includes_winsock2
+      $curl_includes_bsdsocket
       $curl_includes_sys_socket
       $curl_includes_socket
     ]],[[
@@ -5665,6 +5935,7 @@ AC_DEFUN([CURL_CHECK_FUNC_SOCKET], [
     AC_MSG_CHECKING([if socket is prototyped])
     AC_EGREP_CPP([socket],[
       $curl_includes_winsock2
+      $curl_includes_bsdsocket
       $curl_includes_sys_socket
       $curl_includes_socket
     ],[
@@ -5681,6 +5952,7 @@ AC_DEFUN([CURL_CHECK_FUNC_SOCKET], [
     AC_COMPILE_IFELSE([
       AC_LANG_PROGRAM([[
         $curl_includes_winsock2
+      $curl_includes_bsdsocket
         $curl_includes_sys_socket
         $curl_includes_socket
       ]],[[
@@ -7025,3 +7297,42 @@ AC_DEFUN([CURL_RUN_IFELSE], [
    AC_RUN_IFELSE([AC_LANG_SOURCE([$1])], $2, $3, $4)
    LD_LIBRARY_PATH=$old # restore
 ])
+
+dnl CURL_COVERAGE
+dnl --------------------------------------------------
+dnl Switch on options and libs to build with gcc's code coverage.
+dnl
+
+AC_DEFUN([CURL_COVERAGE],[
+  AC_REQUIRE([AC_PROG_SED])
+  AC_REQUIRE([AC_ARG_ENABLE])
+  AC_MSG_CHECKING([for code coverage support])
+  coverage="no"
+  curl_coverage_msg="disabled"
+
+  dnl check if enabled by argument
+  AC_ARG_ENABLE(code-coverage,
+     AC_HELP_STRING([--enable-code-coverage], [Provide code coverage]),
+     coverage="$enableval")
+
+  dnl if not gcc switch off again
+  AS_IF([ test "$GCC" != "yes" ], coverage="no" )
+  AC_MSG_RESULT($coverage)
+
+  if test "x$coverage" = "xyes"; then
+    curl_coverage_msg="enabled"
+
+    AC_CHECK_TOOL([GCOV], [gcov], [gcov])
+    if test -z "$GCOV"; then
+      AC_MSG_ERROR([needs gcov for code coverage])
+    fi
+    AC_CHECK_PROG([LCOV], [lcov], [lcov])
+    if test -z "$LCOV"; then
+      AC_MSG_ERROR([needs lcov for code coverage])
+    fi
+
+    CPPFLAGS="$CPPFLAGS -DNDEBUG"
+    CFLAGS="$CLAGS -O0 -g -fprofile-arcs -ftest-coverage"
+    LIBS="$LIBS -lgcov"
+  fi
+])
index 0130746..90924a6 100644 (file)
@@ -4704,6 +4704,12 @@ m4_if([$1], [CXX], [
        _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
        _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
         ;;
+      # flang / f18. f95 an alias for gfortran or flang on Debian
+      flang* | f18* | f95*)
+       _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+       _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+       _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+        ;;
       # icc used to be incompatible with GCC.
       # ICC 10 doesn't accept -KPIC any more.
       icc* | ifort*)
diff --git a/packages/AIX/Makefile.am b/packages/AIX/Makefile.am
deleted file mode 100644 (file)
index 4b038ed..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-SUBDIRS = RPM
-
-EXTRA_DIST = Makefile.am
diff --git a/packages/AIX/Makefile.in b/packages/AIX/Makefile.in
deleted file mode 100644 (file)
index ff6d303..0000000
+++ /dev/null
@@ -1,725 +0,0 @@
-# Makefile.in generated by automake 1.16.1 from Makefile.am.
-# @configure_input@
-
-# Copyright (C) 1994-2018 Free Software Foundation, Inc.
-
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
-@SET_MAKE@
-VPATH = @srcdir@
-am__is_gnu_make = { \
-  if test -z '$(MAKELEVEL)'; then \
-    false; \
-  elif test -n '$(MAKE_HOST)'; then \
-    true; \
-  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
-    true; \
-  else \
-    false; \
-  fi; \
-}
-am__make_running_with_option = \
-  case $${target_option-} in \
-      ?) ;; \
-      *) echo "am__make_running_with_option: internal error: invalid" \
-              "target option '$${target_option-}' specified" >&2; \
-         exit 1;; \
-  esac; \
-  has_opt=no; \
-  sane_makeflags=$$MAKEFLAGS; \
-  if $(am__is_gnu_make); then \
-    sane_makeflags=$$MFLAGS; \
-  else \
-    case $$MAKEFLAGS in \
-      *\\[\ \  ]*) \
-        bs=\\; \
-        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
-          | sed "s/$$bs$$bs[$$bs $$bs  ]*//g"`;; \
-    esac; \
-  fi; \
-  skip_next=no; \
-  strip_trailopt () \
-  { \
-    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
-  }; \
-  for flg in $$sane_makeflags; do \
-    test $$skip_next = yes && { skip_next=no; continue; }; \
-    case $$flg in \
-      *=*|--*) continue;; \
-        -*I) strip_trailopt 'I'; skip_next=yes;; \
-      -*I?*) strip_trailopt 'I';; \
-        -*O) strip_trailopt 'O'; skip_next=yes;; \
-      -*O?*) strip_trailopt 'O';; \
-        -*l) strip_trailopt 'l'; skip_next=yes;; \
-      -*l?*) strip_trailopt 'l';; \
-      -[dEDm]) skip_next=yes;; \
-      -[JT]) skip_next=yes;; \
-    esac; \
-    case $$flg in \
-      *$$target_option*) has_opt=yes; break;; \
-    esac; \
-  done; \
-  test $$has_opt = yes
-am__make_dryrun = (target_option=n; $(am__make_running_with_option))
-am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
-pkgdatadir = $(datadir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkglibexecdir = $(libexecdir)/@PACKAGE@
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-build_triplet = @build@
-host_triplet = @host@
-subdir = packages/AIX
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/ax_code_coverage.m4 \
-       $(top_srcdir)/m4/ax_compile_check_sizeof.m4 \
-       $(top_srcdir)/m4/curl-compilers.m4 \
-       $(top_srcdir)/m4/curl-confopts.m4 \
-       $(top_srcdir)/m4/curl-functions.m4 \
-       $(top_srcdir)/m4/curl-openssl.m4 \
-       $(top_srcdir)/m4/curl-override.m4 \
-       $(top_srcdir)/m4/curl-reentrant.m4 $(top_srcdir)/m4/libtool.m4 \
-       $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
-       $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
-       $(top_srcdir)/m4/xc-am-iface.m4 \
-       $(top_srcdir)/m4/xc-cc-check.m4 \
-       $(top_srcdir)/m4/xc-lt-iface.m4 \
-       $(top_srcdir)/m4/xc-translit.m4 \
-       $(top_srcdir)/m4/xc-val-flgs.m4 \
-       $(top_srcdir)/m4/zz40-xc-ovr.m4 \
-       $(top_srcdir)/m4/zz50-xc-ovr.m4 \
-       $(top_srcdir)/m4/zz60-xc-ovr.m4 $(top_srcdir)/acinclude.m4 \
-       $(top_srcdir)/configure.ac
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
-       $(ACLOCAL_M4)
-DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
-mkinstalldirs = $(install_sh) -d
-CONFIG_HEADER = $(top_builddir)/lib/curl_config.h
-CONFIG_CLEAN_FILES =
-CONFIG_CLEAN_VPATH_FILES =
-AM_V_P = $(am__v_P_@AM_V@)
-am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
-am__v_P_0 = false
-am__v_P_1 = :
-AM_V_GEN = $(am__v_GEN_@AM_V@)
-am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
-am__v_GEN_0 = @echo "  GEN     " $@;
-am__v_GEN_1 = 
-AM_V_at = $(am__v_at_@AM_V@)
-am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
-am__v_at_0 = @
-am__v_at_1 = 
-SOURCES =
-DIST_SOURCES =
-RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \
-       ctags-recursive dvi-recursive html-recursive info-recursive \
-       install-data-recursive install-dvi-recursive \
-       install-exec-recursive install-html-recursive \
-       install-info-recursive install-pdf-recursive \
-       install-ps-recursive install-recursive installcheck-recursive \
-       installdirs-recursive pdf-recursive ps-recursive \
-       tags-recursive uninstall-recursive
-am__can_run_installinfo = \
-  case $$AM_UPDATE_INFO_DIR in \
-    n|no|NO) false;; \
-    *) (install-info --version) >/dev/null 2>&1;; \
-  esac
-RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive        \
-  distclean-recursive maintainer-clean-recursive
-am__recursive_targets = \
-  $(RECURSIVE_TARGETS) \
-  $(RECURSIVE_CLEAN_TARGETS) \
-  $(am__extra_recursive_targets)
-AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \
-       distdir distdir-am
-am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
-# Read a list of newline-separated strings from the standard input,
-# and print each of them once, without duplicates.  Input order is
-# *not* preserved.
-am__uniquify_input = $(AWK) '\
-  BEGIN { nonempty = 0; } \
-  { items[$$0] = 1; nonempty = 1; } \
-  END { if (nonempty) { for (i in items) print i; }; } \
-'
-# Make sure the list of sources is unique.  This is necessary because,
-# e.g., the same source file might be shared among _SOURCES variables
-# for different programs/libraries.
-am__define_uniq_tagged_files = \
-  list='$(am__tagged_files)'; \
-  unique=`for i in $$list; do \
-    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-  done | $(am__uniquify_input)`
-ETAGS = etags
-CTAGS = ctags
-DIST_SUBDIRS = $(SUBDIRS)
-am__DIST_COMMON = $(srcdir)/Makefile.in
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-am__relativize = \
-  dir0=`pwd`; \
-  sed_first='s,^\([^/]*\)/.*$$,\1,'; \
-  sed_rest='s,^[^/]*/*,,'; \
-  sed_last='s,^.*/\([^/]*\)$$,\1,'; \
-  sed_butlast='s,/*[^/]*$$,,'; \
-  while test -n "$$dir1"; do \
-    first=`echo "$$dir1" | sed -e "$$sed_first"`; \
-    if test "$$first" != "."; then \
-      if test "$$first" = ".."; then \
-        dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \
-        dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \
-      else \
-        first2=`echo "$$dir2" | sed -e "$$sed_first"`; \
-        if test "$$first2" = "$$first"; then \
-          dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \
-        else \
-          dir2="../$$dir2"; \
-        fi; \
-        dir0="$$dir0"/"$$first"; \
-      fi; \
-    fi; \
-    dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \
-  done; \
-  reldir="$$dir2"
-ACLOCAL = @ACLOCAL@
-AMTAR = @AMTAR@
-AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
-AR = @AR@
-AR_FLAGS = @AR_FLAGS@
-AS = @AS@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-BLANK_AT_MAKETIME = @BLANK_AT_MAKETIME@
-CC = @CC@
-CCDEPMODE = @CCDEPMODE@
-CFLAGS = @CFLAGS@
-CFLAG_CURL_SYMBOL_HIDING = @CFLAG_CURL_SYMBOL_HIDING@
-CODE_COVERAGE_CFLAGS = @CODE_COVERAGE_CFLAGS@
-CODE_COVERAGE_CPPFLAGS = @CODE_COVERAGE_CPPFLAGS@
-CODE_COVERAGE_CXXFLAGS = @CODE_COVERAGE_CXXFLAGS@
-CODE_COVERAGE_ENABLED = @CODE_COVERAGE_ENABLED@
-CODE_COVERAGE_LDFLAGS = @CODE_COVERAGE_LDFLAGS@
-CODE_COVERAGE_LIBS = @CODE_COVERAGE_LIBS@
-CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@
-CPP = @CPP@
-CPPFLAGS = @CPPFLAGS@
-CPPFLAG_CURL_STATICLIB = @CPPFLAG_CURL_STATICLIB@
-CURLVERSION = @CURLVERSION@
-CURL_CA_BUNDLE = @CURL_CA_BUNDLE@
-CURL_CFLAG_EXTRAS = @CURL_CFLAG_EXTRAS@
-CURL_DISABLE_DICT = @CURL_DISABLE_DICT@
-CURL_DISABLE_FILE = @CURL_DISABLE_FILE@
-CURL_DISABLE_FTP = @CURL_DISABLE_FTP@
-CURL_DISABLE_GOPHER = @CURL_DISABLE_GOPHER@
-CURL_DISABLE_HTTP = @CURL_DISABLE_HTTP@
-CURL_DISABLE_IMAP = @CURL_DISABLE_IMAP@
-CURL_DISABLE_LDAP = @CURL_DISABLE_LDAP@
-CURL_DISABLE_LDAPS = @CURL_DISABLE_LDAPS@
-CURL_DISABLE_POP3 = @CURL_DISABLE_POP3@
-CURL_DISABLE_PROXY = @CURL_DISABLE_PROXY@
-CURL_DISABLE_RTSP = @CURL_DISABLE_RTSP@
-CURL_DISABLE_SMB = @CURL_DISABLE_SMB@
-CURL_DISABLE_SMTP = @CURL_DISABLE_SMTP@
-CURL_DISABLE_TELNET = @CURL_DISABLE_TELNET@
-CURL_DISABLE_TFTP = @CURL_DISABLE_TFTP@
-CURL_LT_SHLIB_VERSIONED_FLAVOUR = @CURL_LT_SHLIB_VERSIONED_FLAVOUR@
-CURL_NETWORK_AND_TIME_LIBS = @CURL_NETWORK_AND_TIME_LIBS@
-CURL_NETWORK_LIBS = @CURL_NETWORK_LIBS@
-CURL_WITH_MULTI_SSL = @CURL_WITH_MULTI_SSL@
-CYGPATH_W = @CYGPATH_W@
-DEFAULT_SSL_BACKEND = @DEFAULT_SSL_BACKEND@
-DEFS = @DEFS@
-DEPDIR = @DEPDIR@
-DLLTOOL = @DLLTOOL@
-DSYMUTIL = @DSYMUTIL@
-DUMPBIN = @DUMPBIN@
-ECHO_C = @ECHO_C@
-ECHO_N = @ECHO_N@
-ECHO_T = @ECHO_T@
-EGREP = @EGREP@
-ENABLE_SHARED = @ENABLE_SHARED@
-ENABLE_STATIC = @ENABLE_STATIC@
-EXEEXT = @EXEEXT@
-FGREP = @FGREP@
-GCOV = @GCOV@
-GENHTML = @GENHTML@
-GREP = @GREP@
-HAVE_BROTLI = @HAVE_BROTLI@
-HAVE_GNUTLS_SRP = @HAVE_GNUTLS_SRP@
-HAVE_LDAP_SSL = @HAVE_LDAP_SSL@
-HAVE_LIBZ = @HAVE_LIBZ@
-HAVE_OPENSSL_SRP = @HAVE_OPENSSL_SRP@
-IDN_ENABLED = @IDN_ENABLED@
-INSTALL = @INSTALL@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-IPV6_ENABLED = @IPV6_ENABLED@
-LCOV = @LCOV@
-LD = @LD@
-LDFLAGS = @LDFLAGS@
-LIBCURL_LIBS = @LIBCURL_LIBS@
-LIBMETALINK_CPPFLAGS = @LIBMETALINK_CPPFLAGS@
-LIBMETALINK_LDFLAGS = @LIBMETALINK_LDFLAGS@
-LIBMETALINK_LIBS = @LIBMETALINK_LIBS@
-LIBOBJS = @LIBOBJS@
-LIBS = @LIBS@
-LIBTOOL = @LIBTOOL@
-LIPO = @LIPO@
-LN_S = @LN_S@
-LTLIBOBJS = @LTLIBOBJS@
-LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
-MAINT = @MAINT@
-MAKEINFO = @MAKEINFO@
-MANIFEST_TOOL = @MANIFEST_TOOL@
-MANOPT = @MANOPT@
-MKDIR_P = @MKDIR_P@
-NM = @NM@
-NMEDIT = @NMEDIT@
-NROFF = @NROFF@
-NSS_LIBS = @NSS_LIBS@
-OBJDUMP = @OBJDUMP@
-OBJEXT = @OBJEXT@
-OTOOL = @OTOOL@
-OTOOL64 = @OTOOL64@
-PACKAGE = @PACKAGE@
-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
-PACKAGE_NAME = @PACKAGE_NAME@
-PACKAGE_STRING = @PACKAGE_STRING@
-PACKAGE_TARNAME = @PACKAGE_TARNAME@
-PACKAGE_URL = @PACKAGE_URL@
-PACKAGE_VERSION = @PACKAGE_VERSION@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-PERL = @PERL@
-PKGADD_NAME = @PKGADD_NAME@
-PKGADD_PKG = @PKGADD_PKG@
-PKGADD_VENDOR = @PKGADD_VENDOR@
-PKGCONFIG = @PKGCONFIG@
-RANDOM_FILE = @RANDOM_FILE@
-RANLIB = @RANLIB@
-REQUIRE_LIB_DEPS = @REQUIRE_LIB_DEPS@
-SED = @SED@
-SET_MAKE = @SET_MAKE@
-SHELL = @SHELL@
-SSL_BACKENDS = @SSL_BACKENDS@
-SSL_ENABLED = @SSL_ENABLED@
-SSL_LIBS = @SSL_LIBS@
-STRIP = @STRIP@
-SUPPORT_FEATURES = @SUPPORT_FEATURES@
-SUPPORT_PROTOCOLS = @SUPPORT_PROTOCOLS@
-USE_ARES = @USE_ARES@
-USE_AXTLS = @USE_AXTLS@
-USE_CYASSL = @USE_CYASSL@
-USE_DARWINSSL = @USE_DARWINSSL@
-USE_GNUTLS = @USE_GNUTLS@
-USE_GNUTLS_NETTLE = @USE_GNUTLS_NETTLE@
-USE_LIBRTMP = @USE_LIBRTMP@
-USE_LIBSSH = @USE_LIBSSH@
-USE_LIBSSH2 = @USE_LIBSSH2@
-USE_MBEDTLS = @USE_MBEDTLS@
-USE_MESALINK = @USE_MESALINK@
-USE_NGHTTP2 = @USE_NGHTTP2@
-USE_NSS = @USE_NSS@
-USE_OPENLDAP = @USE_OPENLDAP@
-USE_POLARSSL = @USE_POLARSSL@
-USE_SCHANNEL = @USE_SCHANNEL@
-USE_UNIX_SOCKETS = @USE_UNIX_SOCKETS@
-USE_WINDOWS_SSPI = @USE_WINDOWS_SSPI@
-VERSION = @VERSION@
-VERSIONNUM = @VERSIONNUM@
-ZLIB_LIBS = @ZLIB_LIBS@
-ZSH_FUNCTIONS_DIR = @ZSH_FUNCTIONS_DIR@
-abs_builddir = @abs_builddir@
-abs_srcdir = @abs_srcdir@
-abs_top_builddir = @abs_top_builddir@
-abs_top_srcdir = @abs_top_srcdir@
-ac_ct_AR = @ac_ct_AR@
-ac_ct_CC = @ac_ct_CC@
-ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
-am__include = @am__include@
-am__leading_dot = @am__leading_dot@
-am__quote = @am__quote@
-am__tar = @am__tar@
-am__untar = @am__untar@
-bindir = @bindir@
-build = @build@
-build_alias = @build_alias@
-build_cpu = @build_cpu@
-build_os = @build_os@
-build_vendor = @build_vendor@
-builddir = @builddir@
-datadir = @datadir@
-datarootdir = @datarootdir@
-docdir = @docdir@
-dvidir = @dvidir@
-exec_prefix = @exec_prefix@
-host = @host@
-host_alias = @host_alias@
-host_cpu = @host_cpu@
-host_os = @host_os@
-host_vendor = @host_vendor@
-htmldir = @htmldir@
-includedir = @includedir@
-infodir = @infodir@
-install_sh = @install_sh@
-libdir = @libdir@
-libexecdir = @libexecdir@
-libext = @libext@
-localedir = @localedir@
-localstatedir = @localstatedir@
-mandir = @mandir@
-mkdir_p = @mkdir_p@
-oldincludedir = @oldincludedir@
-pdfdir = @pdfdir@
-prefix = @prefix@
-program_transform_name = @program_transform_name@
-psdir = @psdir@
-runstatedir = @runstatedir@
-sbindir = @sbindir@
-sharedstatedir = @sharedstatedir@
-srcdir = @srcdir@
-subdirs = @subdirs@
-sysconfdir = @sysconfdir@
-target_alias = @target_alias@
-top_build_prefix = @top_build_prefix@
-top_builddir = @top_builddir@
-top_srcdir = @top_srcdir@
-SUBDIRS = RPM
-EXTRA_DIST = Makefile.am
-all: all-recursive
-
-.SUFFIXES:
-$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
-       @for dep in $?; do \
-         case '$(am__configure_deps)' in \
-           *$$dep*) \
-             ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
-               && { if test -f $@; then exit 0; else break; fi; }; \
-             exit 1;; \
-         esac; \
-       done; \
-       echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign packages/AIX/Makefile'; \
-       $(am__cd) $(top_srcdir) && \
-         $(AUTOMAKE) --foreign packages/AIX/Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
-       @case '$?' in \
-         *config.status*) \
-           cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
-         *) \
-           echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \
-           cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
-       esac;
-
-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
-       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-
-$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
-       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
-       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(am__aclocal_m4_deps):
-
-mostlyclean-libtool:
-       -rm -f *.lo
-
-clean-libtool:
-       -rm -rf .libs _libs
-
-# This directory's subdirectories are mostly independent; you can cd
-# into them and run 'make' without going through this Makefile.
-# To change the values of 'make' variables: instead of editing Makefiles,
-# (1) if the variable is set in 'config.status', edit 'config.status'
-#     (which will cause the Makefiles to be regenerated when you run 'make');
-# (2) otherwise, pass the desired values on the 'make' command line.
-$(am__recursive_targets):
-       @fail=; \
-       if $(am__make_keepgoing); then \
-         failcom='fail=yes'; \
-       else \
-         failcom='exit 1'; \
-       fi; \
-       dot_seen=no; \
-       target=`echo $@ | sed s/-recursive//`; \
-       case "$@" in \
-         distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
-         *) list='$(SUBDIRS)' ;; \
-       esac; \
-       for subdir in $$list; do \
-         echo "Making $$target in $$subdir"; \
-         if test "$$subdir" = "."; then \
-           dot_seen=yes; \
-           local_target="$$target-am"; \
-         else \
-           local_target="$$target"; \
-         fi; \
-         ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
-         || eval $$failcom; \
-       done; \
-       if test "$$dot_seen" = "no"; then \
-         $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
-       fi; test -z "$$fail"
-
-ID: $(am__tagged_files)
-       $(am__define_uniq_tagged_files); mkid -fID $$unique
-tags: tags-recursive
-TAGS: tags
-
-tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
-       set x; \
-       here=`pwd`; \
-       if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
-         include_option=--etags-include; \
-         empty_fix=.; \
-       else \
-         include_option=--include; \
-         empty_fix=; \
-       fi; \
-       list='$(SUBDIRS)'; for subdir in $$list; do \
-         if test "$$subdir" = .; then :; else \
-           test ! -f $$subdir/TAGS || \
-             set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
-         fi; \
-       done; \
-       $(am__define_uniq_tagged_files); \
-       shift; \
-       if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
-         test -n "$$unique" || unique=$$empty_fix; \
-         if test $$# -gt 0; then \
-           $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-             "$$@" $$unique; \
-         else \
-           $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-             $$unique; \
-         fi; \
-       fi
-ctags: ctags-recursive
-
-CTAGS: ctags
-ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
-       $(am__define_uniq_tagged_files); \
-       test -z "$(CTAGS_ARGS)$$unique" \
-         || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
-            $$unique
-
-GTAGS:
-       here=`$(am__cd) $(top_builddir) && pwd` \
-         && $(am__cd) $(top_srcdir) \
-         && gtags -i $(GTAGS_ARGS) "$$here"
-cscopelist: cscopelist-recursive
-
-cscopelist-am: $(am__tagged_files)
-       list='$(am__tagged_files)'; \
-       case "$(srcdir)" in \
-         [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
-         *) sdir=$(subdir)/$(srcdir) ;; \
-       esac; \
-       for i in $$list; do \
-         if test -f "$$i"; then \
-           echo "$(subdir)/$$i"; \
-         else \
-           echo "$$sdir/$$i"; \
-         fi; \
-       done >> $(top_builddir)/cscope.files
-
-distclean-tags:
-       -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-
-distdir: $(BUILT_SOURCES)
-       $(MAKE) $(AM_MAKEFLAGS) distdir-am
-
-distdir-am: $(DISTFILES)
-       @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-       topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-       list='$(DISTFILES)'; \
-         dist_files=`for file in $$list; do echo $$file; done | \
-         sed -e "s|^$$srcdirstrip/||;t" \
-             -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
-       case $$dist_files in \
-         */*) $(MKDIR_P) `echo "$$dist_files" | \
-                          sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
-                          sort -u` ;; \
-       esac; \
-       for file in $$dist_files; do \
-         if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
-         if test -d $$d/$$file; then \
-           dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
-           if test -d "$(distdir)/$$file"; then \
-             find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-           fi; \
-           if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-             cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
-             find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-           fi; \
-           cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
-         else \
-           test -f "$(distdir)/$$file" \
-           || cp -p $$d/$$file "$(distdir)/$$file" \
-           || exit 1; \
-         fi; \
-       done
-       @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
-         if test "$$subdir" = .; then :; else \
-           $(am__make_dryrun) \
-             || test -d "$(distdir)/$$subdir" \
-             || $(MKDIR_P) "$(distdir)/$$subdir" \
-             || exit 1; \
-           dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
-           $(am__relativize); \
-           new_distdir=$$reldir; \
-           dir1=$$subdir; dir2="$(top_distdir)"; \
-           $(am__relativize); \
-           new_top_distdir=$$reldir; \
-           echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \
-           echo "     am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \
-           ($(am__cd) $$subdir && \
-             $(MAKE) $(AM_MAKEFLAGS) \
-               top_distdir="$$new_top_distdir" \
-               distdir="$$new_distdir" \
-               am__remove_distdir=: \
-               am__skip_length_check=: \
-               am__skip_mode_fix=: \
-               distdir) \
-             || exit 1; \
-         fi; \
-       done
-check-am: all-am
-check: check-recursive
-all-am: Makefile
-installdirs: installdirs-recursive
-installdirs-am:
-install: install-recursive
-install-exec: install-exec-recursive
-install-data: install-data-recursive
-uninstall: uninstall-recursive
-
-install-am: all-am
-       @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-recursive
-install-strip:
-       if test -z '$(STRIP)'; then \
-         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-             install; \
-       else \
-         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-           "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
-       fi
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
-       -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
-       -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
-
-maintainer-clean-generic:
-       @echo "This command is intended for maintainers to use"
-       @echo "it deletes files that may require special tools to rebuild."
-clean: clean-recursive
-
-clean-am: clean-generic clean-libtool mostlyclean-am
-
-distclean: distclean-recursive
-       -rm -f Makefile
-distclean-am: clean-am distclean-generic distclean-tags
-
-dvi: dvi-recursive
-
-dvi-am:
-
-html: html-recursive
-
-html-am:
-
-info: info-recursive
-
-info-am:
-
-install-data-am:
-
-install-dvi: install-dvi-recursive
-
-install-dvi-am:
-
-install-exec-am:
-
-install-html: install-html-recursive
-
-install-html-am:
-
-install-info: install-info-recursive
-
-install-info-am:
-
-install-man:
-
-install-pdf: install-pdf-recursive
-
-install-pdf-am:
-
-install-ps: install-ps-recursive
-
-install-ps-am:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-recursive
-       -rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-recursive
-
-mostlyclean-am: mostlyclean-generic mostlyclean-libtool
-
-pdf: pdf-recursive
-
-pdf-am:
-
-ps: ps-recursive
-
-ps-am:
-
-uninstall-am:
-
-.MAKE: $(am__recursive_targets) install-am install-strip
-
-.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \
-       check-am clean clean-generic clean-libtool cscopelist-am ctags \
-       ctags-am distclean distclean-generic distclean-libtool \
-       distclean-tags distdir dvi dvi-am html html-am info info-am \
-       install install-am install-data install-data-am install-dvi \
-       install-dvi-am install-exec install-exec-am install-html \
-       install-html-am install-info install-info-am install-man \
-       install-pdf install-pdf-am install-ps install-ps-am \
-       install-strip installcheck installcheck-am installdirs \
-       installdirs-am maintainer-clean maintainer-clean-generic \
-       mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \
-       ps ps-am tags tags-am uninstall uninstall-am
-
-.PRECIOUS: Makefile
-
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/packages/AIX/RPM/Makefile.am b/packages/AIX/RPM/Makefile.am
deleted file mode 100644 (file)
index 71e854f..0000000
+++ /dev/null
@@ -1 +0,0 @@
-EXTRA_DIST = README curl.spec.in
diff --git a/packages/AIX/RPM/Makefile.in b/packages/AIX/RPM/Makefile.in
deleted file mode 100644 (file)
index 4009a94..0000000
+++ /dev/null
@@ -1,546 +0,0 @@
-# Makefile.in generated by automake 1.16.1 from Makefile.am.
-# @configure_input@
-
-# Copyright (C) 1994-2018 Free Software Foundation, Inc.
-
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
-@SET_MAKE@
-VPATH = @srcdir@
-am__is_gnu_make = { \
-  if test -z '$(MAKELEVEL)'; then \
-    false; \
-  elif test -n '$(MAKE_HOST)'; then \
-    true; \
-  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
-    true; \
-  else \
-    false; \
-  fi; \
-}
-am__make_running_with_option = \
-  case $${target_option-} in \
-      ?) ;; \
-      *) echo "am__make_running_with_option: internal error: invalid" \
-              "target option '$${target_option-}' specified" >&2; \
-         exit 1;; \
-  esac; \
-  has_opt=no; \
-  sane_makeflags=$$MAKEFLAGS; \
-  if $(am__is_gnu_make); then \
-    sane_makeflags=$$MFLAGS; \
-  else \
-    case $$MAKEFLAGS in \
-      *\\[\ \  ]*) \
-        bs=\\; \
-        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
-          | sed "s/$$bs$$bs[$$bs $$bs  ]*//g"`;; \
-    esac; \
-  fi; \
-  skip_next=no; \
-  strip_trailopt () \
-  { \
-    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
-  }; \
-  for flg in $$sane_makeflags; do \
-    test $$skip_next = yes && { skip_next=no; continue; }; \
-    case $$flg in \
-      *=*|--*) continue;; \
-        -*I) strip_trailopt 'I'; skip_next=yes;; \
-      -*I?*) strip_trailopt 'I';; \
-        -*O) strip_trailopt 'O'; skip_next=yes;; \
-      -*O?*) strip_trailopt 'O';; \
-        -*l) strip_trailopt 'l'; skip_next=yes;; \
-      -*l?*) strip_trailopt 'l';; \
-      -[dEDm]) skip_next=yes;; \
-      -[JT]) skip_next=yes;; \
-    esac; \
-    case $$flg in \
-      *$$target_option*) has_opt=yes; break;; \
-    esac; \
-  done; \
-  test $$has_opt = yes
-am__make_dryrun = (target_option=n; $(am__make_running_with_option))
-am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
-pkgdatadir = $(datadir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkglibexecdir = $(libexecdir)/@PACKAGE@
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-build_triplet = @build@
-host_triplet = @host@
-subdir = packages/AIX/RPM
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/ax_code_coverage.m4 \
-       $(top_srcdir)/m4/ax_compile_check_sizeof.m4 \
-       $(top_srcdir)/m4/curl-compilers.m4 \
-       $(top_srcdir)/m4/curl-confopts.m4 \
-       $(top_srcdir)/m4/curl-functions.m4 \
-       $(top_srcdir)/m4/curl-openssl.m4 \
-       $(top_srcdir)/m4/curl-override.m4 \
-       $(top_srcdir)/m4/curl-reentrant.m4 $(top_srcdir)/m4/libtool.m4 \
-       $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
-       $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
-       $(top_srcdir)/m4/xc-am-iface.m4 \
-       $(top_srcdir)/m4/xc-cc-check.m4 \
-       $(top_srcdir)/m4/xc-lt-iface.m4 \
-       $(top_srcdir)/m4/xc-translit.m4 \
-       $(top_srcdir)/m4/xc-val-flgs.m4 \
-       $(top_srcdir)/m4/zz40-xc-ovr.m4 \
-       $(top_srcdir)/m4/zz50-xc-ovr.m4 \
-       $(top_srcdir)/m4/zz60-xc-ovr.m4 $(top_srcdir)/acinclude.m4 \
-       $(top_srcdir)/configure.ac
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
-       $(ACLOCAL_M4)
-DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
-mkinstalldirs = $(install_sh) -d
-CONFIG_HEADER = $(top_builddir)/lib/curl_config.h
-CONFIG_CLEAN_FILES = curl.spec
-CONFIG_CLEAN_VPATH_FILES =
-AM_V_P = $(am__v_P_@AM_V@)
-am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
-am__v_P_0 = false
-am__v_P_1 = :
-AM_V_GEN = $(am__v_GEN_@AM_V@)
-am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
-am__v_GEN_0 = @echo "  GEN     " $@;
-am__v_GEN_1 = 
-AM_V_at = $(am__v_at_@AM_V@)
-am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
-am__v_at_0 = @
-am__v_at_1 = 
-SOURCES =
-DIST_SOURCES =
-am__can_run_installinfo = \
-  case $$AM_UPDATE_INFO_DIR in \
-    n|no|NO) false;; \
-    *) (install-info --version) >/dev/null 2>&1;; \
-  esac
-am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
-am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/curl.spec.in README
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-ACLOCAL = @ACLOCAL@
-AMTAR = @AMTAR@
-AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
-AR = @AR@
-AR_FLAGS = @AR_FLAGS@
-AS = @AS@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-BLANK_AT_MAKETIME = @BLANK_AT_MAKETIME@
-CC = @CC@
-CCDEPMODE = @CCDEPMODE@
-CFLAGS = @CFLAGS@
-CFLAG_CURL_SYMBOL_HIDING = @CFLAG_CURL_SYMBOL_HIDING@
-CODE_COVERAGE_CFLAGS = @CODE_COVERAGE_CFLAGS@
-CODE_COVERAGE_CPPFLAGS = @CODE_COVERAGE_CPPFLAGS@
-CODE_COVERAGE_CXXFLAGS = @CODE_COVERAGE_CXXFLAGS@
-CODE_COVERAGE_ENABLED = @CODE_COVERAGE_ENABLED@
-CODE_COVERAGE_LDFLAGS = @CODE_COVERAGE_LDFLAGS@
-CODE_COVERAGE_LIBS = @CODE_COVERAGE_LIBS@
-CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@
-CPP = @CPP@
-CPPFLAGS = @CPPFLAGS@
-CPPFLAG_CURL_STATICLIB = @CPPFLAG_CURL_STATICLIB@
-CURLVERSION = @CURLVERSION@
-CURL_CA_BUNDLE = @CURL_CA_BUNDLE@
-CURL_CFLAG_EXTRAS = @CURL_CFLAG_EXTRAS@
-CURL_DISABLE_DICT = @CURL_DISABLE_DICT@
-CURL_DISABLE_FILE = @CURL_DISABLE_FILE@
-CURL_DISABLE_FTP = @CURL_DISABLE_FTP@
-CURL_DISABLE_GOPHER = @CURL_DISABLE_GOPHER@
-CURL_DISABLE_HTTP = @CURL_DISABLE_HTTP@
-CURL_DISABLE_IMAP = @CURL_DISABLE_IMAP@
-CURL_DISABLE_LDAP = @CURL_DISABLE_LDAP@
-CURL_DISABLE_LDAPS = @CURL_DISABLE_LDAPS@
-CURL_DISABLE_POP3 = @CURL_DISABLE_POP3@
-CURL_DISABLE_PROXY = @CURL_DISABLE_PROXY@
-CURL_DISABLE_RTSP = @CURL_DISABLE_RTSP@
-CURL_DISABLE_SMB = @CURL_DISABLE_SMB@
-CURL_DISABLE_SMTP = @CURL_DISABLE_SMTP@
-CURL_DISABLE_TELNET = @CURL_DISABLE_TELNET@
-CURL_DISABLE_TFTP = @CURL_DISABLE_TFTP@
-CURL_LT_SHLIB_VERSIONED_FLAVOUR = @CURL_LT_SHLIB_VERSIONED_FLAVOUR@
-CURL_NETWORK_AND_TIME_LIBS = @CURL_NETWORK_AND_TIME_LIBS@
-CURL_NETWORK_LIBS = @CURL_NETWORK_LIBS@
-CURL_WITH_MULTI_SSL = @CURL_WITH_MULTI_SSL@
-CYGPATH_W = @CYGPATH_W@
-DEFAULT_SSL_BACKEND = @DEFAULT_SSL_BACKEND@
-DEFS = @DEFS@
-DEPDIR = @DEPDIR@
-DLLTOOL = @DLLTOOL@
-DSYMUTIL = @DSYMUTIL@
-DUMPBIN = @DUMPBIN@
-ECHO_C = @ECHO_C@
-ECHO_N = @ECHO_N@
-ECHO_T = @ECHO_T@
-EGREP = @EGREP@
-ENABLE_SHARED = @ENABLE_SHARED@
-ENABLE_STATIC = @ENABLE_STATIC@
-EXEEXT = @EXEEXT@
-FGREP = @FGREP@
-GCOV = @GCOV@
-GENHTML = @GENHTML@
-GREP = @GREP@
-HAVE_BROTLI = @HAVE_BROTLI@
-HAVE_GNUTLS_SRP = @HAVE_GNUTLS_SRP@
-HAVE_LDAP_SSL = @HAVE_LDAP_SSL@
-HAVE_LIBZ = @HAVE_LIBZ@
-HAVE_OPENSSL_SRP = @HAVE_OPENSSL_SRP@
-IDN_ENABLED = @IDN_ENABLED@
-INSTALL = @INSTALL@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-IPV6_ENABLED = @IPV6_ENABLED@
-LCOV = @LCOV@
-LD = @LD@
-LDFLAGS = @LDFLAGS@
-LIBCURL_LIBS = @LIBCURL_LIBS@
-LIBMETALINK_CPPFLAGS = @LIBMETALINK_CPPFLAGS@
-LIBMETALINK_LDFLAGS = @LIBMETALINK_LDFLAGS@
-LIBMETALINK_LIBS = @LIBMETALINK_LIBS@
-LIBOBJS = @LIBOBJS@
-LIBS = @LIBS@
-LIBTOOL = @LIBTOOL@
-LIPO = @LIPO@
-LN_S = @LN_S@
-LTLIBOBJS = @LTLIBOBJS@
-LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
-MAINT = @MAINT@
-MAKEINFO = @MAKEINFO@
-MANIFEST_TOOL = @MANIFEST_TOOL@
-MANOPT = @MANOPT@
-MKDIR_P = @MKDIR_P@
-NM = @NM@
-NMEDIT = @NMEDIT@
-NROFF = @NROFF@
-NSS_LIBS = @NSS_LIBS@
-OBJDUMP = @OBJDUMP@
-OBJEXT = @OBJEXT@
-OTOOL = @OTOOL@
-OTOOL64 = @OTOOL64@
-PACKAGE = @PACKAGE@
-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
-PACKAGE_NAME = @PACKAGE_NAME@
-PACKAGE_STRING = @PACKAGE_STRING@
-PACKAGE_TARNAME = @PACKAGE_TARNAME@
-PACKAGE_URL = @PACKAGE_URL@
-PACKAGE_VERSION = @PACKAGE_VERSION@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-PERL = @PERL@
-PKGADD_NAME = @PKGADD_NAME@
-PKGADD_PKG = @PKGADD_PKG@
-PKGADD_VENDOR = @PKGADD_VENDOR@
-PKGCONFIG = @PKGCONFIG@
-RANDOM_FILE = @RANDOM_FILE@
-RANLIB = @RANLIB@
-REQUIRE_LIB_DEPS = @REQUIRE_LIB_DEPS@
-SED = @SED@
-SET_MAKE = @SET_MAKE@
-SHELL = @SHELL@
-SSL_BACKENDS = @SSL_BACKENDS@
-SSL_ENABLED = @SSL_ENABLED@
-SSL_LIBS = @SSL_LIBS@
-STRIP = @STRIP@
-SUPPORT_FEATURES = @SUPPORT_FEATURES@
-SUPPORT_PROTOCOLS = @SUPPORT_PROTOCOLS@
-USE_ARES = @USE_ARES@
-USE_AXTLS = @USE_AXTLS@
-USE_CYASSL = @USE_CYASSL@
-USE_DARWINSSL = @USE_DARWINSSL@
-USE_GNUTLS = @USE_GNUTLS@
-USE_GNUTLS_NETTLE = @USE_GNUTLS_NETTLE@
-USE_LIBRTMP = @USE_LIBRTMP@
-USE_LIBSSH = @USE_LIBSSH@
-USE_LIBSSH2 = @USE_LIBSSH2@
-USE_MBEDTLS = @USE_MBEDTLS@
-USE_MESALINK = @USE_MESALINK@
-USE_NGHTTP2 = @USE_NGHTTP2@
-USE_NSS = @USE_NSS@
-USE_OPENLDAP = @USE_OPENLDAP@
-USE_POLARSSL = @USE_POLARSSL@
-USE_SCHANNEL = @USE_SCHANNEL@
-USE_UNIX_SOCKETS = @USE_UNIX_SOCKETS@
-USE_WINDOWS_SSPI = @USE_WINDOWS_SSPI@
-VERSION = @VERSION@
-VERSIONNUM = @VERSIONNUM@
-ZLIB_LIBS = @ZLIB_LIBS@
-ZSH_FUNCTIONS_DIR = @ZSH_FUNCTIONS_DIR@
-abs_builddir = @abs_builddir@
-abs_srcdir = @abs_srcdir@
-abs_top_builddir = @abs_top_builddir@
-abs_top_srcdir = @abs_top_srcdir@
-ac_ct_AR = @ac_ct_AR@
-ac_ct_CC = @ac_ct_CC@
-ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
-am__include = @am__include@
-am__leading_dot = @am__leading_dot@
-am__quote = @am__quote@
-am__tar = @am__tar@
-am__untar = @am__untar@
-bindir = @bindir@
-build = @build@
-build_alias = @build_alias@
-build_cpu = @build_cpu@
-build_os = @build_os@
-build_vendor = @build_vendor@
-builddir = @builddir@
-datadir = @datadir@
-datarootdir = @datarootdir@
-docdir = @docdir@
-dvidir = @dvidir@
-exec_prefix = @exec_prefix@
-host = @host@
-host_alias = @host_alias@
-host_cpu = @host_cpu@
-host_os = @host_os@
-host_vendor = @host_vendor@
-htmldir = @htmldir@
-includedir = @includedir@
-infodir = @infodir@
-install_sh = @install_sh@
-libdir = @libdir@
-libexecdir = @libexecdir@
-libext = @libext@
-localedir = @localedir@
-localstatedir = @localstatedir@
-mandir = @mandir@
-mkdir_p = @mkdir_p@
-oldincludedir = @oldincludedir@
-pdfdir = @pdfdir@
-prefix = @prefix@
-program_transform_name = @program_transform_name@
-psdir = @psdir@
-runstatedir = @runstatedir@
-sbindir = @sbindir@
-sharedstatedir = @sharedstatedir@
-srcdir = @srcdir@
-subdirs = @subdirs@
-sysconfdir = @sysconfdir@
-target_alias = @target_alias@
-top_build_prefix = @top_build_prefix@
-top_builddir = @top_builddir@
-top_srcdir = @top_srcdir@
-EXTRA_DIST = README curl.spec.in
-all: all-am
-
-.SUFFIXES:
-$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
-       @for dep in $?; do \
-         case '$(am__configure_deps)' in \
-           *$$dep*) \
-             ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
-               && { if test -f $@; then exit 0; else break; fi; }; \
-             exit 1;; \
-         esac; \
-       done; \
-       echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign packages/AIX/RPM/Makefile'; \
-       $(am__cd) $(top_srcdir) && \
-         $(AUTOMAKE) --foreign packages/AIX/RPM/Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
-       @case '$?' in \
-         *config.status*) \
-           cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
-         *) \
-           echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \
-           cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
-       esac;
-
-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
-       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-
-$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
-       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
-       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(am__aclocal_m4_deps):
-curl.spec: $(top_builddir)/config.status $(srcdir)/curl.spec.in
-       cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
-
-mostlyclean-libtool:
-       -rm -f *.lo
-
-clean-libtool:
-       -rm -rf .libs _libs
-tags TAGS:
-
-ctags CTAGS:
-
-cscope cscopelist:
-
-
-distdir: $(BUILT_SOURCES)
-       $(MAKE) $(AM_MAKEFLAGS) distdir-am
-
-distdir-am: $(DISTFILES)
-       @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-       topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-       list='$(DISTFILES)'; \
-         dist_files=`for file in $$list; do echo $$file; done | \
-         sed -e "s|^$$srcdirstrip/||;t" \
-             -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
-       case $$dist_files in \
-         */*) $(MKDIR_P) `echo "$$dist_files" | \
-                          sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
-                          sort -u` ;; \
-       esac; \
-       for file in $$dist_files; do \
-         if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
-         if test -d $$d/$$file; then \
-           dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
-           if test -d "$(distdir)/$$file"; then \
-             find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-           fi; \
-           if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-             cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
-             find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-           fi; \
-           cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
-         else \
-           test -f "$(distdir)/$$file" \
-           || cp -p $$d/$$file "$(distdir)/$$file" \
-           || exit 1; \
-         fi; \
-       done
-check-am: all-am
-check: check-am
-all-am: Makefile
-installdirs:
-install: install-am
-install-exec: install-exec-am
-install-data: install-data-am
-uninstall: uninstall-am
-
-install-am: all-am
-       @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-am
-install-strip:
-       if test -z '$(STRIP)'; then \
-         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-             install; \
-       else \
-         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-           "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
-       fi
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
-       -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
-       -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
-
-maintainer-clean-generic:
-       @echo "This command is intended for maintainers to use"
-       @echo "it deletes files that may require special tools to rebuild."
-clean: clean-am
-
-clean-am: clean-generic clean-libtool mostlyclean-am
-
-distclean: distclean-am
-       -rm -f Makefile
-distclean-am: clean-am distclean-generic
-
-dvi: dvi-am
-
-dvi-am:
-
-html: html-am
-
-html-am:
-
-info: info-am
-
-info-am:
-
-install-data-am:
-
-install-dvi: install-dvi-am
-
-install-dvi-am:
-
-install-exec-am:
-
-install-html: install-html-am
-
-install-html-am:
-
-install-info: install-info-am
-
-install-info-am:
-
-install-man:
-
-install-pdf: install-pdf-am
-
-install-pdf-am:
-
-install-ps: install-ps-am
-
-install-ps-am:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-am
-       -rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-am
-
-mostlyclean-am: mostlyclean-generic mostlyclean-libtool
-
-pdf: pdf-am
-
-pdf-am:
-
-ps: ps-am
-
-ps-am:
-
-uninstall-am:
-
-.MAKE: install-am install-strip
-
-.PHONY: all all-am check check-am clean clean-generic clean-libtool \
-       cscopelist-am ctags-am distclean distclean-generic \
-       distclean-libtool distdir dvi dvi-am html html-am info info-am \
-       install install-am install-data install-data-am install-dvi \
-       install-dvi-am install-exec install-exec-am install-html \
-       install-html-am install-info install-info-am install-man \
-       install-pdf install-pdf-am install-ps install-ps-am \
-       install-strip installcheck installcheck-am installdirs \
-       maintainer-clean maintainer-clean-generic mostlyclean \
-       mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
-       tags-am uninstall uninstall-am
-
-.PRECIOUS: Makefile
-
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/packages/AIX/RPM/README b/packages/AIX/RPM/README
deleted file mode 100644 (file)
index c2c31bd..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-                             _   _ ____  _
-                         ___| | | |  _ \| |
-                        / __| | | | |_) | |
-                       ( (__| |_| |  _ <| |___
-                        \___|\___/|_| \_\_____|
-                            for AIX Toolbox
-
-Author: Tor Arntsen
-
-The spec file in this directory is based on the Linux ssl and non-ssl
-curl spec files, plus additions to make it AIX Toolbox compatible.
-
-The AIX Toolbox setup (installs into /opt/freeware, with symlinks in
-/usr/bin,/usr/lib,/usr/include) are based on IBM's aixtoolbox spec
-file written by David Clissold <cliss@austin.ibm.com>, see
-
-https://public.dhe.ibm.com/aix/freeSoftware/aixtoolbox/SPECS/curl-7.61.0-1.spec
-
-This spec file is designed to be a drop-in replacement for the
-old spec file found at the above link. Thus, like the old spec file
-this version is also a unified ssl/non-ssl  version. To get non-ssl
-RPMs just pass --define 'nossl 1' to the command line when building
-the RPM, e.g.
-
-rpm -bb --define 'nossl 1' curl.spec
-
-Default is to build with ssl support.
-
-Lastly, the spec file expects the Curl source distribution file to be
-in .tar.bz2 format.
-
-The nifty curl header of this README is a ripoff of the vms/readme file.
diff --git a/packages/AIX/RPM/curl.spec.in b/packages/AIX/RPM/curl.spec.in
deleted file mode 100644 (file)
index 634fc71..0000000
+++ /dev/null
@@ -1,134 +0,0 @@
-# Use --define 'nossl 1' on the command line to disable SSL detection
-%{!?nossl:%define SSL 1}
-%{?nossl:%define SSL 0}
-
-%define name curl
-%define version @VERSION@
-%define release 1%{!?nossl:ssl}
-
-%define curlroot %{_builddir}/%{name}-%{version}
-
-Summary: get a file from a FTP or HTTP server.
-Name: %{name}
-Version: %{version}
-Release: %{release}
-License: MIT/X derivate
-Vendor: Daniel Stenberg <Daniel.Stenberg@haxx.se>
-Group: Applications/Internet
-Source: %{name}-%{version}.tar.bz2
-URL: https://curl.haxx.se/
-Provides: curl
-BuildRoot: %{_tmppath}/%{name}-%{version}-root
-Prefix: %{_prefix}
-
-%description
-curl is a client to get documents/files from servers, using any of the
-supported protocols.  The command is designed to work without user
-interaction or any kind of interactivity.
-
-curl offers many useful tricks like proxy support, user authentication,
-ftp upload, HTTP post, file transfer resume and more.
-
-%if %{SSL} == 1
-Note: this version is compiled with SSL support.
-%else
-Note: this version is compiled without SSL support.
-%endif
-
-%package       devel
-Summary:       Development files for the curl library
-Group:         Development/Libraries
-%if %{SSL} == 1
-Requires: openssl >= 0.9.5
-%endif
-Requires:      curl = %{version}
-Provides:      curl-devel
-
-%description devel
-libcurl is the core engine of curl; this packages contains all the
-libs, headers, and manual pages to develop applications using libcurl.
-
-%define DEFCC xlc
-
-%prep
-rm -rf %{curlroot}
-%setup -q
-
-%build
-
-# Use the default compiler for this platform - gcc otherwise
-if [[ -z "$CC" ]]
-then
-    if test "X`type %{DEFCC} 2>/dev/null`" != 'X'; then
-       export CC=%{DEFCC}
-    else
-       export CC=gcc
-    fi
-fi
-
-cd %{curlroot} && (if [ -f configure.in ]; then mv -f configure.in configure.in.
-rpm; fi)
-
-./configure --prefix=%{prefix} \
-%if %{SSL} == 1
-        --with-ssl
-%else
-        --without-ssl
-%endif
-
-make
-
-%install
-[ "%{buildroot}" != "/" ] && rm -rf %{buildroot}
-make DESTDIR=%{buildroot} install-strip
-
-( cd $RPM_BUILD_ROOT   # same as %{buildroot}
-
- for dir in bin include
- do
-    mkdir -p usr/$dir
-    cd usr/$dir
-    ln -sf ../..%{prefix}/$dir/* .
-    cd -
- done
-
- mkdir -p usr/lib
- cd usr/lib
- ln -sf ../..%{prefix}/lib/* .
- cd -
-)
-
-%clean
-[ "%{buildroot}" != "/" ] && rm -rf %{buildroot}
-
-%files
-%defattr(-,root,root)
-%attr(0755,root,root) %{_bindir}/curl
-%attr(0644,root,root) %{_mandir}/man1/curl.1*
-%attr(0644,root,root) %{_mandir}/man1/mk-ca-bundle.1
-%{_libdir}/libcurl.a
-%if %{SSL} == 1
-%{_datadir}/curl/curl-ca-bundle.crt
-%endif
-%doc CHANGES COPYING README RELEASE-NOTES
-%doc docs/BUGS docs/CONTRIBUTE docs/FAQ docs/FEATURES docs/HISTORY
-%doc docs/INSTALL docs/KNOWN_BUGS
-%doc docs/MANUAL docs/RESOURCES docs/THANKS docs/VERSIONS docs/TODO
-%doc docs/TheArtOfHttpScripting
-%if %{SSL} == 1
-%doc docs/SSLCERTS
-%endif
-/usr/bin/curl
-/usr/lib/libcurl.a
-
-%files devel
-%defattr(-,root,root)
-%attr(0755,root,root) %{_bindir}/curl-config
-%attr(0644,root,root) %{_mandir}/man1/curl-config.1*
-%attr(0644,root,root) %{_mandir}/man1/mk-ca-bundle.1
-%attr(0644,root,root) %{_mandir}/man3/*
-%attr(0644,root,root) %{_includedir}/curl/*
-%{_libdir}/libcurl.la
-%doc docs/BINDINGS docs/INTERNALS docs/LICENSE-MIXING
-/usr/bin/curl-config
-/usr/include/curl
index e069ce6..c97b216 100644 (file)
@@ -96,7 +96,7 @@ CFLAGS = -g -O2 -I. -I$(TOPDIR)/include -I$(TOPDIR)/lib \
          -I$(WATT32_ROOT)/inc -Wall -DHAVE_CONFIG_H
 
 ifeq ($(USE_SSL),1)
-  CFLAGS += -DUSE_SSLEAY -DUSE_OPENSSL -I$(OPENSSL_ROOT)
+  CFLAGS += -DUSE_OPENSSL -I$(OPENSSL_ROOT)
 endif
 
 ifeq ($(USE_ZLIB),1)
diff --git a/packages/Linux/Makefile.am b/packages/Linux/Makefile.am
deleted file mode 100644 (file)
index 5753055..0000000
+++ /dev/null
@@ -1 +0,0 @@
-SUBDIRS = RPM
diff --git a/packages/Linux/Makefile.in b/packages/Linux/Makefile.in
deleted file mode 100644 (file)
index c78168c..0000000
+++ /dev/null
@@ -1,724 +0,0 @@
-# Makefile.in generated by automake 1.16.1 from Makefile.am.
-# @configure_input@
-
-# Copyright (C) 1994-2018 Free Software Foundation, Inc.
-
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
-@SET_MAKE@
-VPATH = @srcdir@
-am__is_gnu_make = { \
-  if test -z '$(MAKELEVEL)'; then \
-    false; \
-  elif test -n '$(MAKE_HOST)'; then \
-    true; \
-  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
-    true; \
-  else \
-    false; \
-  fi; \
-}
-am__make_running_with_option = \
-  case $${target_option-} in \
-      ?) ;; \
-      *) echo "am__make_running_with_option: internal error: invalid" \
-              "target option '$${target_option-}' specified" >&2; \
-         exit 1;; \
-  esac; \
-  has_opt=no; \
-  sane_makeflags=$$MAKEFLAGS; \
-  if $(am__is_gnu_make); then \
-    sane_makeflags=$$MFLAGS; \
-  else \
-    case $$MAKEFLAGS in \
-      *\\[\ \  ]*) \
-        bs=\\; \
-        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
-          | sed "s/$$bs$$bs[$$bs $$bs  ]*//g"`;; \
-    esac; \
-  fi; \
-  skip_next=no; \
-  strip_trailopt () \
-  { \
-    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
-  }; \
-  for flg in $$sane_makeflags; do \
-    test $$skip_next = yes && { skip_next=no; continue; }; \
-    case $$flg in \
-      *=*|--*) continue;; \
-        -*I) strip_trailopt 'I'; skip_next=yes;; \
-      -*I?*) strip_trailopt 'I';; \
-        -*O) strip_trailopt 'O'; skip_next=yes;; \
-      -*O?*) strip_trailopt 'O';; \
-        -*l) strip_trailopt 'l'; skip_next=yes;; \
-      -*l?*) strip_trailopt 'l';; \
-      -[dEDm]) skip_next=yes;; \
-      -[JT]) skip_next=yes;; \
-    esac; \
-    case $$flg in \
-      *$$target_option*) has_opt=yes; break;; \
-    esac; \
-  done; \
-  test $$has_opt = yes
-am__make_dryrun = (target_option=n; $(am__make_running_with_option))
-am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
-pkgdatadir = $(datadir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkglibexecdir = $(libexecdir)/@PACKAGE@
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-build_triplet = @build@
-host_triplet = @host@
-subdir = packages/Linux
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/ax_code_coverage.m4 \
-       $(top_srcdir)/m4/ax_compile_check_sizeof.m4 \
-       $(top_srcdir)/m4/curl-compilers.m4 \
-       $(top_srcdir)/m4/curl-confopts.m4 \
-       $(top_srcdir)/m4/curl-functions.m4 \
-       $(top_srcdir)/m4/curl-openssl.m4 \
-       $(top_srcdir)/m4/curl-override.m4 \
-       $(top_srcdir)/m4/curl-reentrant.m4 $(top_srcdir)/m4/libtool.m4 \
-       $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
-       $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
-       $(top_srcdir)/m4/xc-am-iface.m4 \
-       $(top_srcdir)/m4/xc-cc-check.m4 \
-       $(top_srcdir)/m4/xc-lt-iface.m4 \
-       $(top_srcdir)/m4/xc-translit.m4 \
-       $(top_srcdir)/m4/xc-val-flgs.m4 \
-       $(top_srcdir)/m4/zz40-xc-ovr.m4 \
-       $(top_srcdir)/m4/zz50-xc-ovr.m4 \
-       $(top_srcdir)/m4/zz60-xc-ovr.m4 $(top_srcdir)/acinclude.m4 \
-       $(top_srcdir)/configure.ac
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
-       $(ACLOCAL_M4)
-DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
-mkinstalldirs = $(install_sh) -d
-CONFIG_HEADER = $(top_builddir)/lib/curl_config.h
-CONFIG_CLEAN_FILES =
-CONFIG_CLEAN_VPATH_FILES =
-AM_V_P = $(am__v_P_@AM_V@)
-am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
-am__v_P_0 = false
-am__v_P_1 = :
-AM_V_GEN = $(am__v_GEN_@AM_V@)
-am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
-am__v_GEN_0 = @echo "  GEN     " $@;
-am__v_GEN_1 = 
-AM_V_at = $(am__v_at_@AM_V@)
-am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
-am__v_at_0 = @
-am__v_at_1 = 
-SOURCES =
-DIST_SOURCES =
-RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \
-       ctags-recursive dvi-recursive html-recursive info-recursive \
-       install-data-recursive install-dvi-recursive \
-       install-exec-recursive install-html-recursive \
-       install-info-recursive install-pdf-recursive \
-       install-ps-recursive install-recursive installcheck-recursive \
-       installdirs-recursive pdf-recursive ps-recursive \
-       tags-recursive uninstall-recursive
-am__can_run_installinfo = \
-  case $$AM_UPDATE_INFO_DIR in \
-    n|no|NO) false;; \
-    *) (install-info --version) >/dev/null 2>&1;; \
-  esac
-RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive        \
-  distclean-recursive maintainer-clean-recursive
-am__recursive_targets = \
-  $(RECURSIVE_TARGETS) \
-  $(RECURSIVE_CLEAN_TARGETS) \
-  $(am__extra_recursive_targets)
-AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \
-       distdir distdir-am
-am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
-# Read a list of newline-separated strings from the standard input,
-# and print each of them once, without duplicates.  Input order is
-# *not* preserved.
-am__uniquify_input = $(AWK) '\
-  BEGIN { nonempty = 0; } \
-  { items[$$0] = 1; nonempty = 1; } \
-  END { if (nonempty) { for (i in items) print i; }; } \
-'
-# Make sure the list of sources is unique.  This is necessary because,
-# e.g., the same source file might be shared among _SOURCES variables
-# for different programs/libraries.
-am__define_uniq_tagged_files = \
-  list='$(am__tagged_files)'; \
-  unique=`for i in $$list; do \
-    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-  done | $(am__uniquify_input)`
-ETAGS = etags
-CTAGS = ctags
-DIST_SUBDIRS = $(SUBDIRS)
-am__DIST_COMMON = $(srcdir)/Makefile.in
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-am__relativize = \
-  dir0=`pwd`; \
-  sed_first='s,^\([^/]*\)/.*$$,\1,'; \
-  sed_rest='s,^[^/]*/*,,'; \
-  sed_last='s,^.*/\([^/]*\)$$,\1,'; \
-  sed_butlast='s,/*[^/]*$$,,'; \
-  while test -n "$$dir1"; do \
-    first=`echo "$$dir1" | sed -e "$$sed_first"`; \
-    if test "$$first" != "."; then \
-      if test "$$first" = ".."; then \
-        dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \
-        dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \
-      else \
-        first2=`echo "$$dir2" | sed -e "$$sed_first"`; \
-        if test "$$first2" = "$$first"; then \
-          dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \
-        else \
-          dir2="../$$dir2"; \
-        fi; \
-        dir0="$$dir0"/"$$first"; \
-      fi; \
-    fi; \
-    dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \
-  done; \
-  reldir="$$dir2"
-ACLOCAL = @ACLOCAL@
-AMTAR = @AMTAR@
-AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
-AR = @AR@
-AR_FLAGS = @AR_FLAGS@
-AS = @AS@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-BLANK_AT_MAKETIME = @BLANK_AT_MAKETIME@
-CC = @CC@
-CCDEPMODE = @CCDEPMODE@
-CFLAGS = @CFLAGS@
-CFLAG_CURL_SYMBOL_HIDING = @CFLAG_CURL_SYMBOL_HIDING@
-CODE_COVERAGE_CFLAGS = @CODE_COVERAGE_CFLAGS@
-CODE_COVERAGE_CPPFLAGS = @CODE_COVERAGE_CPPFLAGS@
-CODE_COVERAGE_CXXFLAGS = @CODE_COVERAGE_CXXFLAGS@
-CODE_COVERAGE_ENABLED = @CODE_COVERAGE_ENABLED@
-CODE_COVERAGE_LDFLAGS = @CODE_COVERAGE_LDFLAGS@
-CODE_COVERAGE_LIBS = @CODE_COVERAGE_LIBS@
-CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@
-CPP = @CPP@
-CPPFLAGS = @CPPFLAGS@
-CPPFLAG_CURL_STATICLIB = @CPPFLAG_CURL_STATICLIB@
-CURLVERSION = @CURLVERSION@
-CURL_CA_BUNDLE = @CURL_CA_BUNDLE@
-CURL_CFLAG_EXTRAS = @CURL_CFLAG_EXTRAS@
-CURL_DISABLE_DICT = @CURL_DISABLE_DICT@
-CURL_DISABLE_FILE = @CURL_DISABLE_FILE@
-CURL_DISABLE_FTP = @CURL_DISABLE_FTP@
-CURL_DISABLE_GOPHER = @CURL_DISABLE_GOPHER@
-CURL_DISABLE_HTTP = @CURL_DISABLE_HTTP@
-CURL_DISABLE_IMAP = @CURL_DISABLE_IMAP@
-CURL_DISABLE_LDAP = @CURL_DISABLE_LDAP@
-CURL_DISABLE_LDAPS = @CURL_DISABLE_LDAPS@
-CURL_DISABLE_POP3 = @CURL_DISABLE_POP3@
-CURL_DISABLE_PROXY = @CURL_DISABLE_PROXY@
-CURL_DISABLE_RTSP = @CURL_DISABLE_RTSP@
-CURL_DISABLE_SMB = @CURL_DISABLE_SMB@
-CURL_DISABLE_SMTP = @CURL_DISABLE_SMTP@
-CURL_DISABLE_TELNET = @CURL_DISABLE_TELNET@
-CURL_DISABLE_TFTP = @CURL_DISABLE_TFTP@
-CURL_LT_SHLIB_VERSIONED_FLAVOUR = @CURL_LT_SHLIB_VERSIONED_FLAVOUR@
-CURL_NETWORK_AND_TIME_LIBS = @CURL_NETWORK_AND_TIME_LIBS@
-CURL_NETWORK_LIBS = @CURL_NETWORK_LIBS@
-CURL_WITH_MULTI_SSL = @CURL_WITH_MULTI_SSL@
-CYGPATH_W = @CYGPATH_W@
-DEFAULT_SSL_BACKEND = @DEFAULT_SSL_BACKEND@
-DEFS = @DEFS@
-DEPDIR = @DEPDIR@
-DLLTOOL = @DLLTOOL@
-DSYMUTIL = @DSYMUTIL@
-DUMPBIN = @DUMPBIN@
-ECHO_C = @ECHO_C@
-ECHO_N = @ECHO_N@
-ECHO_T = @ECHO_T@
-EGREP = @EGREP@
-ENABLE_SHARED = @ENABLE_SHARED@
-ENABLE_STATIC = @ENABLE_STATIC@
-EXEEXT = @EXEEXT@
-FGREP = @FGREP@
-GCOV = @GCOV@
-GENHTML = @GENHTML@
-GREP = @GREP@
-HAVE_BROTLI = @HAVE_BROTLI@
-HAVE_GNUTLS_SRP = @HAVE_GNUTLS_SRP@
-HAVE_LDAP_SSL = @HAVE_LDAP_SSL@
-HAVE_LIBZ = @HAVE_LIBZ@
-HAVE_OPENSSL_SRP = @HAVE_OPENSSL_SRP@
-IDN_ENABLED = @IDN_ENABLED@
-INSTALL = @INSTALL@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-IPV6_ENABLED = @IPV6_ENABLED@
-LCOV = @LCOV@
-LD = @LD@
-LDFLAGS = @LDFLAGS@
-LIBCURL_LIBS = @LIBCURL_LIBS@
-LIBMETALINK_CPPFLAGS = @LIBMETALINK_CPPFLAGS@
-LIBMETALINK_LDFLAGS = @LIBMETALINK_LDFLAGS@
-LIBMETALINK_LIBS = @LIBMETALINK_LIBS@
-LIBOBJS = @LIBOBJS@
-LIBS = @LIBS@
-LIBTOOL = @LIBTOOL@
-LIPO = @LIPO@
-LN_S = @LN_S@
-LTLIBOBJS = @LTLIBOBJS@
-LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
-MAINT = @MAINT@
-MAKEINFO = @MAKEINFO@
-MANIFEST_TOOL = @MANIFEST_TOOL@
-MANOPT = @MANOPT@
-MKDIR_P = @MKDIR_P@
-NM = @NM@
-NMEDIT = @NMEDIT@
-NROFF = @NROFF@
-NSS_LIBS = @NSS_LIBS@
-OBJDUMP = @OBJDUMP@
-OBJEXT = @OBJEXT@
-OTOOL = @OTOOL@
-OTOOL64 = @OTOOL64@
-PACKAGE = @PACKAGE@
-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
-PACKAGE_NAME = @PACKAGE_NAME@
-PACKAGE_STRING = @PACKAGE_STRING@
-PACKAGE_TARNAME = @PACKAGE_TARNAME@
-PACKAGE_URL = @PACKAGE_URL@
-PACKAGE_VERSION = @PACKAGE_VERSION@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-PERL = @PERL@
-PKGADD_NAME = @PKGADD_NAME@
-PKGADD_PKG = @PKGADD_PKG@
-PKGADD_VENDOR = @PKGADD_VENDOR@
-PKGCONFIG = @PKGCONFIG@
-RANDOM_FILE = @RANDOM_FILE@
-RANLIB = @RANLIB@
-REQUIRE_LIB_DEPS = @REQUIRE_LIB_DEPS@
-SED = @SED@
-SET_MAKE = @SET_MAKE@
-SHELL = @SHELL@
-SSL_BACKENDS = @SSL_BACKENDS@
-SSL_ENABLED = @SSL_ENABLED@
-SSL_LIBS = @SSL_LIBS@
-STRIP = @STRIP@
-SUPPORT_FEATURES = @SUPPORT_FEATURES@
-SUPPORT_PROTOCOLS = @SUPPORT_PROTOCOLS@
-USE_ARES = @USE_ARES@
-USE_AXTLS = @USE_AXTLS@
-USE_CYASSL = @USE_CYASSL@
-USE_DARWINSSL = @USE_DARWINSSL@
-USE_GNUTLS = @USE_GNUTLS@
-USE_GNUTLS_NETTLE = @USE_GNUTLS_NETTLE@
-USE_LIBRTMP = @USE_LIBRTMP@
-USE_LIBSSH = @USE_LIBSSH@
-USE_LIBSSH2 = @USE_LIBSSH2@
-USE_MBEDTLS = @USE_MBEDTLS@
-USE_MESALINK = @USE_MESALINK@
-USE_NGHTTP2 = @USE_NGHTTP2@
-USE_NSS = @USE_NSS@
-USE_OPENLDAP = @USE_OPENLDAP@
-USE_POLARSSL = @USE_POLARSSL@
-USE_SCHANNEL = @USE_SCHANNEL@
-USE_UNIX_SOCKETS = @USE_UNIX_SOCKETS@
-USE_WINDOWS_SSPI = @USE_WINDOWS_SSPI@
-VERSION = @VERSION@
-VERSIONNUM = @VERSIONNUM@
-ZLIB_LIBS = @ZLIB_LIBS@
-ZSH_FUNCTIONS_DIR = @ZSH_FUNCTIONS_DIR@
-abs_builddir = @abs_builddir@
-abs_srcdir = @abs_srcdir@
-abs_top_builddir = @abs_top_builddir@
-abs_top_srcdir = @abs_top_srcdir@
-ac_ct_AR = @ac_ct_AR@
-ac_ct_CC = @ac_ct_CC@
-ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
-am__include = @am__include@
-am__leading_dot = @am__leading_dot@
-am__quote = @am__quote@
-am__tar = @am__tar@
-am__untar = @am__untar@
-bindir = @bindir@
-build = @build@
-build_alias = @build_alias@
-build_cpu = @build_cpu@
-build_os = @build_os@
-build_vendor = @build_vendor@
-builddir = @builddir@
-datadir = @datadir@
-datarootdir = @datarootdir@
-docdir = @docdir@
-dvidir = @dvidir@
-exec_prefix = @exec_prefix@
-host = @host@
-host_alias = @host_alias@
-host_cpu = @host_cpu@
-host_os = @host_os@
-host_vendor = @host_vendor@
-htmldir = @htmldir@
-includedir = @includedir@
-infodir = @infodir@
-install_sh = @install_sh@
-libdir = @libdir@
-libexecdir = @libexecdir@
-libext = @libext@
-localedir = @localedir@
-localstatedir = @localstatedir@
-mandir = @mandir@
-mkdir_p = @mkdir_p@
-oldincludedir = @oldincludedir@
-pdfdir = @pdfdir@
-prefix = @prefix@
-program_transform_name = @program_transform_name@
-psdir = @psdir@
-runstatedir = @runstatedir@
-sbindir = @sbindir@
-sharedstatedir = @sharedstatedir@
-srcdir = @srcdir@
-subdirs = @subdirs@
-sysconfdir = @sysconfdir@
-target_alias = @target_alias@
-top_build_prefix = @top_build_prefix@
-top_builddir = @top_builddir@
-top_srcdir = @top_srcdir@
-SUBDIRS = RPM
-all: all-recursive
-
-.SUFFIXES:
-$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
-       @for dep in $?; do \
-         case '$(am__configure_deps)' in \
-           *$$dep*) \
-             ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
-               && { if test -f $@; then exit 0; else break; fi; }; \
-             exit 1;; \
-         esac; \
-       done; \
-       echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign packages/Linux/Makefile'; \
-       $(am__cd) $(top_srcdir) && \
-         $(AUTOMAKE) --foreign packages/Linux/Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
-       @case '$?' in \
-         *config.status*) \
-           cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
-         *) \
-           echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \
-           cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
-       esac;
-
-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
-       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-
-$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
-       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
-       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(am__aclocal_m4_deps):
-
-mostlyclean-libtool:
-       -rm -f *.lo
-
-clean-libtool:
-       -rm -rf .libs _libs
-
-# This directory's subdirectories are mostly independent; you can cd
-# into them and run 'make' without going through this Makefile.
-# To change the values of 'make' variables: instead of editing Makefiles,
-# (1) if the variable is set in 'config.status', edit 'config.status'
-#     (which will cause the Makefiles to be regenerated when you run 'make');
-# (2) otherwise, pass the desired values on the 'make' command line.
-$(am__recursive_targets):
-       @fail=; \
-       if $(am__make_keepgoing); then \
-         failcom='fail=yes'; \
-       else \
-         failcom='exit 1'; \
-       fi; \
-       dot_seen=no; \
-       target=`echo $@ | sed s/-recursive//`; \
-       case "$@" in \
-         distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
-         *) list='$(SUBDIRS)' ;; \
-       esac; \
-       for subdir in $$list; do \
-         echo "Making $$target in $$subdir"; \
-         if test "$$subdir" = "."; then \
-           dot_seen=yes; \
-           local_target="$$target-am"; \
-         else \
-           local_target="$$target"; \
-         fi; \
-         ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
-         || eval $$failcom; \
-       done; \
-       if test "$$dot_seen" = "no"; then \
-         $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
-       fi; test -z "$$fail"
-
-ID: $(am__tagged_files)
-       $(am__define_uniq_tagged_files); mkid -fID $$unique
-tags: tags-recursive
-TAGS: tags
-
-tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
-       set x; \
-       here=`pwd`; \
-       if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
-         include_option=--etags-include; \
-         empty_fix=.; \
-       else \
-         include_option=--include; \
-         empty_fix=; \
-       fi; \
-       list='$(SUBDIRS)'; for subdir in $$list; do \
-         if test "$$subdir" = .; then :; else \
-           test ! -f $$subdir/TAGS || \
-             set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
-         fi; \
-       done; \
-       $(am__define_uniq_tagged_files); \
-       shift; \
-       if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
-         test -n "$$unique" || unique=$$empty_fix; \
-         if test $$# -gt 0; then \
-           $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-             "$$@" $$unique; \
-         else \
-           $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-             $$unique; \
-         fi; \
-       fi
-ctags: ctags-recursive
-
-CTAGS: ctags
-ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
-       $(am__define_uniq_tagged_files); \
-       test -z "$(CTAGS_ARGS)$$unique" \
-         || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
-            $$unique
-
-GTAGS:
-       here=`$(am__cd) $(top_builddir) && pwd` \
-         && $(am__cd) $(top_srcdir) \
-         && gtags -i $(GTAGS_ARGS) "$$here"
-cscopelist: cscopelist-recursive
-
-cscopelist-am: $(am__tagged_files)
-       list='$(am__tagged_files)'; \
-       case "$(srcdir)" in \
-         [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
-         *) sdir=$(subdir)/$(srcdir) ;; \
-       esac; \
-       for i in $$list; do \
-         if test -f "$$i"; then \
-           echo "$(subdir)/$$i"; \
-         else \
-           echo "$$sdir/$$i"; \
-         fi; \
-       done >> $(top_builddir)/cscope.files
-
-distclean-tags:
-       -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-
-distdir: $(BUILT_SOURCES)
-       $(MAKE) $(AM_MAKEFLAGS) distdir-am
-
-distdir-am: $(DISTFILES)
-       @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-       topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-       list='$(DISTFILES)'; \
-         dist_files=`for file in $$list; do echo $$file; done | \
-         sed -e "s|^$$srcdirstrip/||;t" \
-             -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
-       case $$dist_files in \
-         */*) $(MKDIR_P) `echo "$$dist_files" | \
-                          sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
-                          sort -u` ;; \
-       esac; \
-       for file in $$dist_files; do \
-         if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
-         if test -d $$d/$$file; then \
-           dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
-           if test -d "$(distdir)/$$file"; then \
-             find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-           fi; \
-           if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-             cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
-             find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-           fi; \
-           cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
-         else \
-           test -f "$(distdir)/$$file" \
-           || cp -p $$d/$$file "$(distdir)/$$file" \
-           || exit 1; \
-         fi; \
-       done
-       @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
-         if test "$$subdir" = .; then :; else \
-           $(am__make_dryrun) \
-             || test -d "$(distdir)/$$subdir" \
-             || $(MKDIR_P) "$(distdir)/$$subdir" \
-             || exit 1; \
-           dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
-           $(am__relativize); \
-           new_distdir=$$reldir; \
-           dir1=$$subdir; dir2="$(top_distdir)"; \
-           $(am__relativize); \
-           new_top_distdir=$$reldir; \
-           echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \
-           echo "     am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \
-           ($(am__cd) $$subdir && \
-             $(MAKE) $(AM_MAKEFLAGS) \
-               top_distdir="$$new_top_distdir" \
-               distdir="$$new_distdir" \
-               am__remove_distdir=: \
-               am__skip_length_check=: \
-               am__skip_mode_fix=: \
-               distdir) \
-             || exit 1; \
-         fi; \
-       done
-check-am: all-am
-check: check-recursive
-all-am: Makefile
-installdirs: installdirs-recursive
-installdirs-am:
-install: install-recursive
-install-exec: install-exec-recursive
-install-data: install-data-recursive
-uninstall: uninstall-recursive
-
-install-am: all-am
-       @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-recursive
-install-strip:
-       if test -z '$(STRIP)'; then \
-         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-             install; \
-       else \
-         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-           "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
-       fi
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
-       -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
-       -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
-
-maintainer-clean-generic:
-       @echo "This command is intended for maintainers to use"
-       @echo "it deletes files that may require special tools to rebuild."
-clean: clean-recursive
-
-clean-am: clean-generic clean-libtool mostlyclean-am
-
-distclean: distclean-recursive
-       -rm -f Makefile
-distclean-am: clean-am distclean-generic distclean-tags
-
-dvi: dvi-recursive
-
-dvi-am:
-
-html: html-recursive
-
-html-am:
-
-info: info-recursive
-
-info-am:
-
-install-data-am:
-
-install-dvi: install-dvi-recursive
-
-install-dvi-am:
-
-install-exec-am:
-
-install-html: install-html-recursive
-
-install-html-am:
-
-install-info: install-info-recursive
-
-install-info-am:
-
-install-man:
-
-install-pdf: install-pdf-recursive
-
-install-pdf-am:
-
-install-ps: install-ps-recursive
-
-install-ps-am:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-recursive
-       -rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-recursive
-
-mostlyclean-am: mostlyclean-generic mostlyclean-libtool
-
-pdf: pdf-recursive
-
-pdf-am:
-
-ps: ps-recursive
-
-ps-am:
-
-uninstall-am:
-
-.MAKE: $(am__recursive_targets) install-am install-strip
-
-.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \
-       check-am clean clean-generic clean-libtool cscopelist-am ctags \
-       ctags-am distclean distclean-generic distclean-libtool \
-       distclean-tags distdir dvi dvi-am html html-am info info-am \
-       install install-am install-data install-data-am install-dvi \
-       install-dvi-am install-exec install-exec-am install-html \
-       install-html-am install-info install-info-am install-man \
-       install-pdf install-pdf-am install-ps install-ps-am \
-       install-strip installcheck installcheck-am installdirs \
-       installdirs-am maintainer-clean maintainer-clean-generic \
-       mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \
-       ps ps-am tags tags-am uninstall uninstall-am
-
-.PRECIOUS: Makefile
-
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/packages/Linux/RPM/Makefile.am b/packages/Linux/RPM/Makefile.am
deleted file mode 100644 (file)
index 89f43d5..0000000
+++ /dev/null
@@ -1 +0,0 @@
-EXTRA_DIST = README curl-ssl.spec.in curl.spec.in make_curl_rpm
diff --git a/packages/Linux/RPM/Makefile.in b/packages/Linux/RPM/Makefile.in
deleted file mode 100644 (file)
index 130835c..0000000
+++ /dev/null
@@ -1,549 +0,0 @@
-# Makefile.in generated by automake 1.16.1 from Makefile.am.
-# @configure_input@
-
-# Copyright (C) 1994-2018 Free Software Foundation, Inc.
-
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
-@SET_MAKE@
-VPATH = @srcdir@
-am__is_gnu_make = { \
-  if test -z '$(MAKELEVEL)'; then \
-    false; \
-  elif test -n '$(MAKE_HOST)'; then \
-    true; \
-  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
-    true; \
-  else \
-    false; \
-  fi; \
-}
-am__make_running_with_option = \
-  case $${target_option-} in \
-      ?) ;; \
-      *) echo "am__make_running_with_option: internal error: invalid" \
-              "target option '$${target_option-}' specified" >&2; \
-         exit 1;; \
-  esac; \
-  has_opt=no; \
-  sane_makeflags=$$MAKEFLAGS; \
-  if $(am__is_gnu_make); then \
-    sane_makeflags=$$MFLAGS; \
-  else \
-    case $$MAKEFLAGS in \
-      *\\[\ \  ]*) \
-        bs=\\; \
-        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
-          | sed "s/$$bs$$bs[$$bs $$bs  ]*//g"`;; \
-    esac; \
-  fi; \
-  skip_next=no; \
-  strip_trailopt () \
-  { \
-    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
-  }; \
-  for flg in $$sane_makeflags; do \
-    test $$skip_next = yes && { skip_next=no; continue; }; \
-    case $$flg in \
-      *=*|--*) continue;; \
-        -*I) strip_trailopt 'I'; skip_next=yes;; \
-      -*I?*) strip_trailopt 'I';; \
-        -*O) strip_trailopt 'O'; skip_next=yes;; \
-      -*O?*) strip_trailopt 'O';; \
-        -*l) strip_trailopt 'l'; skip_next=yes;; \
-      -*l?*) strip_trailopt 'l';; \
-      -[dEDm]) skip_next=yes;; \
-      -[JT]) skip_next=yes;; \
-    esac; \
-    case $$flg in \
-      *$$target_option*) has_opt=yes; break;; \
-    esac; \
-  done; \
-  test $$has_opt = yes
-am__make_dryrun = (target_option=n; $(am__make_running_with_option))
-am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
-pkgdatadir = $(datadir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkglibexecdir = $(libexecdir)/@PACKAGE@
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-build_triplet = @build@
-host_triplet = @host@
-subdir = packages/Linux/RPM
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/ax_code_coverage.m4 \
-       $(top_srcdir)/m4/ax_compile_check_sizeof.m4 \
-       $(top_srcdir)/m4/curl-compilers.m4 \
-       $(top_srcdir)/m4/curl-confopts.m4 \
-       $(top_srcdir)/m4/curl-functions.m4 \
-       $(top_srcdir)/m4/curl-openssl.m4 \
-       $(top_srcdir)/m4/curl-override.m4 \
-       $(top_srcdir)/m4/curl-reentrant.m4 $(top_srcdir)/m4/libtool.m4 \
-       $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
-       $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
-       $(top_srcdir)/m4/xc-am-iface.m4 \
-       $(top_srcdir)/m4/xc-cc-check.m4 \
-       $(top_srcdir)/m4/xc-lt-iface.m4 \
-       $(top_srcdir)/m4/xc-translit.m4 \
-       $(top_srcdir)/m4/xc-val-flgs.m4 \
-       $(top_srcdir)/m4/zz40-xc-ovr.m4 \
-       $(top_srcdir)/m4/zz50-xc-ovr.m4 \
-       $(top_srcdir)/m4/zz60-xc-ovr.m4 $(top_srcdir)/acinclude.m4 \
-       $(top_srcdir)/configure.ac
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
-       $(ACLOCAL_M4)
-DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
-mkinstalldirs = $(install_sh) -d
-CONFIG_HEADER = $(top_builddir)/lib/curl_config.h
-CONFIG_CLEAN_FILES = curl.spec curl-ssl.spec
-CONFIG_CLEAN_VPATH_FILES =
-AM_V_P = $(am__v_P_@AM_V@)
-am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
-am__v_P_0 = false
-am__v_P_1 = :
-AM_V_GEN = $(am__v_GEN_@AM_V@)
-am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
-am__v_GEN_0 = @echo "  GEN     " $@;
-am__v_GEN_1 = 
-AM_V_at = $(am__v_at_@AM_V@)
-am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
-am__v_at_0 = @
-am__v_at_1 = 
-SOURCES =
-DIST_SOURCES =
-am__can_run_installinfo = \
-  case $$AM_UPDATE_INFO_DIR in \
-    n|no|NO) false;; \
-    *) (install-info --version) >/dev/null 2>&1;; \
-  esac
-am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
-am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/curl-ssl.spec.in \
-       $(srcdir)/curl.spec.in README
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-ACLOCAL = @ACLOCAL@
-AMTAR = @AMTAR@
-AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
-AR = @AR@
-AR_FLAGS = @AR_FLAGS@
-AS = @AS@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-BLANK_AT_MAKETIME = @BLANK_AT_MAKETIME@
-CC = @CC@
-CCDEPMODE = @CCDEPMODE@
-CFLAGS = @CFLAGS@
-CFLAG_CURL_SYMBOL_HIDING = @CFLAG_CURL_SYMBOL_HIDING@
-CODE_COVERAGE_CFLAGS = @CODE_COVERAGE_CFLAGS@
-CODE_COVERAGE_CPPFLAGS = @CODE_COVERAGE_CPPFLAGS@
-CODE_COVERAGE_CXXFLAGS = @CODE_COVERAGE_CXXFLAGS@
-CODE_COVERAGE_ENABLED = @CODE_COVERAGE_ENABLED@
-CODE_COVERAGE_LDFLAGS = @CODE_COVERAGE_LDFLAGS@
-CODE_COVERAGE_LIBS = @CODE_COVERAGE_LIBS@
-CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@
-CPP = @CPP@
-CPPFLAGS = @CPPFLAGS@
-CPPFLAG_CURL_STATICLIB = @CPPFLAG_CURL_STATICLIB@
-CURLVERSION = @CURLVERSION@
-CURL_CA_BUNDLE = @CURL_CA_BUNDLE@
-CURL_CFLAG_EXTRAS = @CURL_CFLAG_EXTRAS@
-CURL_DISABLE_DICT = @CURL_DISABLE_DICT@
-CURL_DISABLE_FILE = @CURL_DISABLE_FILE@
-CURL_DISABLE_FTP = @CURL_DISABLE_FTP@
-CURL_DISABLE_GOPHER = @CURL_DISABLE_GOPHER@
-CURL_DISABLE_HTTP = @CURL_DISABLE_HTTP@
-CURL_DISABLE_IMAP = @CURL_DISABLE_IMAP@
-CURL_DISABLE_LDAP = @CURL_DISABLE_LDAP@
-CURL_DISABLE_LDAPS = @CURL_DISABLE_LDAPS@
-CURL_DISABLE_POP3 = @CURL_DISABLE_POP3@
-CURL_DISABLE_PROXY = @CURL_DISABLE_PROXY@
-CURL_DISABLE_RTSP = @CURL_DISABLE_RTSP@
-CURL_DISABLE_SMB = @CURL_DISABLE_SMB@
-CURL_DISABLE_SMTP = @CURL_DISABLE_SMTP@
-CURL_DISABLE_TELNET = @CURL_DISABLE_TELNET@
-CURL_DISABLE_TFTP = @CURL_DISABLE_TFTP@
-CURL_LT_SHLIB_VERSIONED_FLAVOUR = @CURL_LT_SHLIB_VERSIONED_FLAVOUR@
-CURL_NETWORK_AND_TIME_LIBS = @CURL_NETWORK_AND_TIME_LIBS@
-CURL_NETWORK_LIBS = @CURL_NETWORK_LIBS@
-CURL_WITH_MULTI_SSL = @CURL_WITH_MULTI_SSL@
-CYGPATH_W = @CYGPATH_W@
-DEFAULT_SSL_BACKEND = @DEFAULT_SSL_BACKEND@
-DEFS = @DEFS@
-DEPDIR = @DEPDIR@
-DLLTOOL = @DLLTOOL@
-DSYMUTIL = @DSYMUTIL@
-DUMPBIN = @DUMPBIN@
-ECHO_C = @ECHO_C@
-ECHO_N = @ECHO_N@
-ECHO_T = @ECHO_T@
-EGREP = @EGREP@
-ENABLE_SHARED = @ENABLE_SHARED@
-ENABLE_STATIC = @ENABLE_STATIC@
-EXEEXT = @EXEEXT@
-FGREP = @FGREP@
-GCOV = @GCOV@
-GENHTML = @GENHTML@
-GREP = @GREP@
-HAVE_BROTLI = @HAVE_BROTLI@
-HAVE_GNUTLS_SRP = @HAVE_GNUTLS_SRP@
-HAVE_LDAP_SSL = @HAVE_LDAP_SSL@
-HAVE_LIBZ = @HAVE_LIBZ@
-HAVE_OPENSSL_SRP = @HAVE_OPENSSL_SRP@
-IDN_ENABLED = @IDN_ENABLED@
-INSTALL = @INSTALL@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-IPV6_ENABLED = @IPV6_ENABLED@
-LCOV = @LCOV@
-LD = @LD@
-LDFLAGS = @LDFLAGS@
-LIBCURL_LIBS = @LIBCURL_LIBS@
-LIBMETALINK_CPPFLAGS = @LIBMETALINK_CPPFLAGS@
-LIBMETALINK_LDFLAGS = @LIBMETALINK_LDFLAGS@
-LIBMETALINK_LIBS = @LIBMETALINK_LIBS@
-LIBOBJS = @LIBOBJS@
-LIBS = @LIBS@
-LIBTOOL = @LIBTOOL@
-LIPO = @LIPO@
-LN_S = @LN_S@
-LTLIBOBJS = @LTLIBOBJS@
-LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
-MAINT = @MAINT@
-MAKEINFO = @MAKEINFO@
-MANIFEST_TOOL = @MANIFEST_TOOL@
-MANOPT = @MANOPT@
-MKDIR_P = @MKDIR_P@
-NM = @NM@
-NMEDIT = @NMEDIT@
-NROFF = @NROFF@
-NSS_LIBS = @NSS_LIBS@
-OBJDUMP = @OBJDUMP@
-OBJEXT = @OBJEXT@
-OTOOL = @OTOOL@
-OTOOL64 = @OTOOL64@
-PACKAGE = @PACKAGE@
-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
-PACKAGE_NAME = @PACKAGE_NAME@
-PACKAGE_STRING = @PACKAGE_STRING@
-PACKAGE_TARNAME = @PACKAGE_TARNAME@
-PACKAGE_URL = @PACKAGE_URL@
-PACKAGE_VERSION = @PACKAGE_VERSION@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-PERL = @PERL@
-PKGADD_NAME = @PKGADD_NAME@
-PKGADD_PKG = @PKGADD_PKG@
-PKGADD_VENDOR = @PKGADD_VENDOR@
-PKGCONFIG = @PKGCONFIG@
-RANDOM_FILE = @RANDOM_FILE@
-RANLIB = @RANLIB@
-REQUIRE_LIB_DEPS = @REQUIRE_LIB_DEPS@
-SED = @SED@
-SET_MAKE = @SET_MAKE@
-SHELL = @SHELL@
-SSL_BACKENDS = @SSL_BACKENDS@
-SSL_ENABLED = @SSL_ENABLED@
-SSL_LIBS = @SSL_LIBS@
-STRIP = @STRIP@
-SUPPORT_FEATURES = @SUPPORT_FEATURES@
-SUPPORT_PROTOCOLS = @SUPPORT_PROTOCOLS@
-USE_ARES = @USE_ARES@
-USE_AXTLS = @USE_AXTLS@
-USE_CYASSL = @USE_CYASSL@
-USE_DARWINSSL = @USE_DARWINSSL@
-USE_GNUTLS = @USE_GNUTLS@
-USE_GNUTLS_NETTLE = @USE_GNUTLS_NETTLE@
-USE_LIBRTMP = @USE_LIBRTMP@
-USE_LIBSSH = @USE_LIBSSH@
-USE_LIBSSH2 = @USE_LIBSSH2@
-USE_MBEDTLS = @USE_MBEDTLS@
-USE_MESALINK = @USE_MESALINK@
-USE_NGHTTP2 = @USE_NGHTTP2@
-USE_NSS = @USE_NSS@
-USE_OPENLDAP = @USE_OPENLDAP@
-USE_POLARSSL = @USE_POLARSSL@
-USE_SCHANNEL = @USE_SCHANNEL@
-USE_UNIX_SOCKETS = @USE_UNIX_SOCKETS@
-USE_WINDOWS_SSPI = @USE_WINDOWS_SSPI@
-VERSION = @VERSION@
-VERSIONNUM = @VERSIONNUM@
-ZLIB_LIBS = @ZLIB_LIBS@
-ZSH_FUNCTIONS_DIR = @ZSH_FUNCTIONS_DIR@
-abs_builddir = @abs_builddir@
-abs_srcdir = @abs_srcdir@
-abs_top_builddir = @abs_top_builddir@
-abs_top_srcdir = @abs_top_srcdir@
-ac_ct_AR = @ac_ct_AR@
-ac_ct_CC = @ac_ct_CC@
-ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
-am__include = @am__include@
-am__leading_dot = @am__leading_dot@
-am__quote = @am__quote@
-am__tar = @am__tar@
-am__untar = @am__untar@
-bindir = @bindir@
-build = @build@
-build_alias = @build_alias@
-build_cpu = @build_cpu@
-build_os = @build_os@
-build_vendor = @build_vendor@
-builddir = @builddir@
-datadir = @datadir@
-datarootdir = @datarootdir@
-docdir = @docdir@
-dvidir = @dvidir@
-exec_prefix = @exec_prefix@
-host = @host@
-host_alias = @host_alias@
-host_cpu = @host_cpu@
-host_os = @host_os@
-host_vendor = @host_vendor@
-htmldir = @htmldir@
-includedir = @includedir@
-infodir = @infodir@
-install_sh = @install_sh@
-libdir = @libdir@
-libexecdir = @libexecdir@
-libext = @libext@
-localedir = @localedir@
-localstatedir = @localstatedir@
-mandir = @mandir@
-mkdir_p = @mkdir_p@
-oldincludedir = @oldincludedir@
-pdfdir = @pdfdir@
-prefix = @prefix@
-program_transform_name = @program_transform_name@
-psdir = @psdir@
-runstatedir = @runstatedir@
-sbindir = @sbindir@
-sharedstatedir = @sharedstatedir@
-srcdir = @srcdir@
-subdirs = @subdirs@
-sysconfdir = @sysconfdir@
-target_alias = @target_alias@
-top_build_prefix = @top_build_prefix@
-top_builddir = @top_builddir@
-top_srcdir = @top_srcdir@
-EXTRA_DIST = README curl-ssl.spec.in curl.spec.in make_curl_rpm
-all: all-am
-
-.SUFFIXES:
-$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
-       @for dep in $?; do \
-         case '$(am__configure_deps)' in \
-           *$$dep*) \
-             ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
-               && { if test -f $@; then exit 0; else break; fi; }; \
-             exit 1;; \
-         esac; \
-       done; \
-       echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign packages/Linux/RPM/Makefile'; \
-       $(am__cd) $(top_srcdir) && \
-         $(AUTOMAKE) --foreign packages/Linux/RPM/Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
-       @case '$?' in \
-         *config.status*) \
-           cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
-         *) \
-           echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \
-           cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
-       esac;
-
-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
-       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-
-$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
-       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
-       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(am__aclocal_m4_deps):
-curl.spec: $(top_builddir)/config.status $(srcdir)/curl.spec.in
-       cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
-curl-ssl.spec: $(top_builddir)/config.status $(srcdir)/curl-ssl.spec.in
-       cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
-
-mostlyclean-libtool:
-       -rm -f *.lo
-
-clean-libtool:
-       -rm -rf .libs _libs
-tags TAGS:
-
-ctags CTAGS:
-
-cscope cscopelist:
-
-
-distdir: $(BUILT_SOURCES)
-       $(MAKE) $(AM_MAKEFLAGS) distdir-am
-
-distdir-am: $(DISTFILES)
-       @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-       topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-       list='$(DISTFILES)'; \
-         dist_files=`for file in $$list; do echo $$file; done | \
-         sed -e "s|^$$srcdirstrip/||;t" \
-             -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
-       case $$dist_files in \
-         */*) $(MKDIR_P) `echo "$$dist_files" | \
-                          sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
-                          sort -u` ;; \
-       esac; \
-       for file in $$dist_files; do \
-         if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
-         if test -d $$d/$$file; then \
-           dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
-           if test -d "$(distdir)/$$file"; then \
-             find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-           fi; \
-           if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-             cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
-             find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-           fi; \
-           cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
-         else \
-           test -f "$(distdir)/$$file" \
-           || cp -p $$d/$$file "$(distdir)/$$file" \
-           || exit 1; \
-         fi; \
-       done
-check-am: all-am
-check: check-am
-all-am: Makefile
-installdirs:
-install: install-am
-install-exec: install-exec-am
-install-data: install-data-am
-uninstall: uninstall-am
-
-install-am: all-am
-       @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-am
-install-strip:
-       if test -z '$(STRIP)'; then \
-         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-             install; \
-       else \
-         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-           "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
-       fi
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
-       -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
-       -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
-
-maintainer-clean-generic:
-       @echo "This command is intended for maintainers to use"
-       @echo "it deletes files that may require special tools to rebuild."
-clean: clean-am
-
-clean-am: clean-generic clean-libtool mostlyclean-am
-
-distclean: distclean-am
-       -rm -f Makefile
-distclean-am: clean-am distclean-generic
-
-dvi: dvi-am
-
-dvi-am:
-
-html: html-am
-
-html-am:
-
-info: info-am
-
-info-am:
-
-install-data-am:
-
-install-dvi: install-dvi-am
-
-install-dvi-am:
-
-install-exec-am:
-
-install-html: install-html-am
-
-install-html-am:
-
-install-info: install-info-am
-
-install-info-am:
-
-install-man:
-
-install-pdf: install-pdf-am
-
-install-pdf-am:
-
-install-ps: install-ps-am
-
-install-ps-am:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-am
-       -rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-am
-
-mostlyclean-am: mostlyclean-generic mostlyclean-libtool
-
-pdf: pdf-am
-
-pdf-am:
-
-ps: ps-am
-
-ps-am:
-
-uninstall-am:
-
-.MAKE: install-am install-strip
-
-.PHONY: all all-am check check-am clean clean-generic clean-libtool \
-       cscopelist-am ctags-am distclean distclean-generic \
-       distclean-libtool distdir dvi dvi-am html html-am info info-am \
-       install install-am install-data install-data-am install-dvi \
-       install-dvi-am install-exec install-exec-am install-html \
-       install-html-am install-info install-info-am install-man \
-       install-pdf install-pdf-am install-ps install-ps-am \
-       install-strip installcheck installcheck-am installdirs \
-       maintainer-clean maintainer-clean-generic mostlyclean \
-       mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
-       tags-am uninstall uninstall-am
-
-.PRECIOUS: Makefile
-
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/packages/Linux/RPM/README b/packages/Linux/RPM/README
deleted file mode 100644 (file)
index a6936ba..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-Author: Daniel (I'm not trustworthy, replace this!)
-
-Paul Marquis's 'make_curl_rpm' script is a fine example on how to automate the
-jobs. You need to fill in your own name and email at least.
diff --git a/packages/Linux/RPM/curl-ssl.spec.in b/packages/Linux/RPM/curl-ssl.spec.in
deleted file mode 100644 (file)
index 5b45bb1..0000000
+++ /dev/null
@@ -1,85 +0,0 @@
-%define name curl-ssl
-%define tarball curl
-%define version 7.11.0
-%define release 1
-
-%define curlroot %{_builddir}/%{tarball}-%{version}
-
-Summary: get a file from an FTP or HTTP server.
-Name: %{name}
-Version: %{version}
-Release: %{release}
-Copyright: MIT/X derivate
-Vendor: Daniel Stenberg <Daniel.Stenberg@haxx.se>
-Packager: Troy Engel <tengel@sonic.net>
-Group: Utilities/Console
-Source: %{tarball}-%{version}.tar.gz
-URL: https://curl.haxx.se/
-Provides: curl
-Obsoletes: curl
-BuildRoot: %{_tmppath}/%{tarball}-%{version}-root
-Requires: openssl >= 0.9.5
-
-%description
-curl is a client to get documents/files from servers, using any of the
-supported protocols. The command is designed to work without user
-interaction or any kind of interactivity.
-
-curl offers a busload of useful tricks like proxy support, user
-authentication, ftp upload, HTTP post, file transfer resume and more.
-
-%package       devel
-Summary:       The includes, libs, and man pages to develop with libcurl
-Group:         Development/Libraries
-Requires:      openssl-devel >= 0.9.5
-Provides:      curl-devel
-
-%description devel
-libcurl is the core engine of curl; this packages contains all the libs,
-headers, and manual pages to develop applications using libcurl.
-
-%prep
-
-%setup -q -n %{tarball}-%{version}
-
-%build
-cd %{curlroot} && (if [ -f configure.in ]; then mv -f configure.in configure.in.rpm; fi)
-%configure
-cd %{curlroot} && (if [ -f configure.in.rpm ]; then mv -f configure.in.rpm configure.in; fi)
-make
-
-%install
-[ "%{buildroot}" != "/" ] && rm -rf %{buildroot}
-make DESTDIR=%{buildroot} install-strip
-
-%clean
-[ "%{buildroot}" != "/" ] && rm -rf %{buildroot}
-[ "%{curlroot}" != "/" ] && rm -rf %{curlroot}
-
-%post
-/sbin/ldconfig
-
-%postun
-/sbin/ldconfig
-
-%files
-%defattr(-,root,root)
-%attr(0755,root,root) %{_bindir}/curl
-%attr(0644,root,root) %{_mandir}/man1/curl.1*
-%attr(0644,root,root) %{_mandir}/man1/mk-ca-bundle.1
-%{_libdir}/libcurl.so*
-%{_datadir}/curl/curl-ca-bundle.crt
-%doc CHANGES COPYING README testcurl.sh docs/BUGS docs/SSLCERTS
-%doc docs/CONTRIBUTE docs/FAQ docs/FEATURES docs/HISTORY docs/INSTALL
-%doc docs/KNOWN_BUGS docs/MANUAL docs/RESOURCES docs/THANKS
-%doc docs/TODO docs/VERSIONS docs/TheArtOfHttpScripting tests
-
-%files devel
-%defattr(-,root,root)
-%attr(0755,root,root) %{_bindir}/curl-config
-%attr(0644,root,root) %{_mandir}/man1/curl-config.1*
-%attr(0644,root,root) %{_mandir}/man3/*
-%attr(0644,root,root) %{_includedir}/curl/*
-%{_libdir}/libcurl.a
-%{_libdir}/libcurl.la
-%doc docs/BINDINGS docs/INTERNALS docs/examples/* docs/libcurl-the-guide
diff --git a/packages/Linux/RPM/curl.spec.in b/packages/Linux/RPM/curl.spec.in
deleted file mode 100644 (file)
index 7d0b918..0000000
+++ /dev/null
@@ -1,83 +0,0 @@
-%define name curl
-%define version @VERSION@
-%define release 1
-%define prefix /usr
-
-%define builddir $RPM_BUILD_DIR/%{name}-%{version}
-
-Summary: get a file from an FTP or HTTP server.
-Name: %{name}
-Version: %{version}
-Release: %{release}
-Copyright: MPL
-Vendor: Daniel Stenberg <Daniel.Stenberg@haxx.se>
-Packager: Loic Dachary <loic@senga.org>
-Group: Utilities/Console
-Source: %{name}-%{version}.tar.gz
-URL: https://curl.haxx.se/
-BuildRoot: /tmp/%{name}-%{version}-root
-
-%description
-curl is a client to get documents/files from servers, using any of the
-supported protocols. The command is designed to work without user
-interaction or any kind of interactivity.
-
-curl offers a busload of useful tricks like proxy support, user
-authentication, ftp upload, HTTP post, file transfer resume and more.
-
-Note: this version is compiled without SSL (https:) support.
-
-%package       devel
-Summary:       The includes, libs, and man pages to develop with libcurl
-Group:         Development/Libraries
-
-%description devel
-libcurl is the core engine of curl; this packages contains all the libs,
-headers, and manual pages to develop applications using libcurl.
-
-%prep
-rm -rf %{builddir}
-
-%setup
-
-%build
-%configure --without-ssl --prefix=%{prefix}
-make
-
-%install
-rm -rf $RPM_BUILD_ROOT
-make DESTDIR=$RPM_BUILD_ROOT install-strip
-
-%clean
-rm -rf $RPM_BUILD_ROOT
-rm -rf %{builddir}
-
-%post
-/sbin/ldconfig
-
-%postun
-/sbin/ldconfig
-
-%files
-%defattr(-,root,root)
-%attr(0755,root,root) %{_bindir}/curl
-%attr(0644,root,root) %{_mandir}/man1/*
-%{prefix}/lib/libcurl.so*
-%doc CHANGES LEGAL MITX.txt MPL-1.1.txt README docs/BUGS
-%doc docs/CONTRIBUTE docs/FAQ docs/FEATURES docs/INSTALL docs/INTERNALS
-%doc docs/LIBCURL docs/MANUAL docs/README* docs/RESOURCES docs/TODO
-%doc docs/TheArtOfHttpScripting
-
-%files devel
-%defattr(-,root,root)
-%attr(0644,root,root) %{_mandir}/man3/*
-%attr(0644,root,root) %{_includedir}/curl/*
-%{prefix}/lib/libcurl.a
-%{prefix}/lib/libcurl.la
-%doc docs/examples/*
-
-%changelog
-* Sun Jan  7 2001 Loic Dachary  <loic@senga.org>
-
-        - use _mandir instead of prefix to locate man pages because
-         _mandir is not always prefix/man/man?.
diff --git a/packages/Linux/RPM/make_curl_rpm b/packages/Linux/RPM/make_curl_rpm
deleted file mode 100644 (file)
index 544a23b..0000000
+++ /dev/null
@@ -1,62 +0,0 @@
-#! /bin/sh
-# script to build curl RPM from src RPM (SSL and non-SSL versions)
-
-# initialize
-top_dir=/usr/src/redhat
-sources_dir=$top_dir/SOURCES
-specs_dir=$top_dir/SPECS
-rpms_dir=$top_dir/RPMS
-arch=`rpm --showrc | awk 'NF == 3 && $2 == "_arch" { print $3 }'`
-
-# fill in your own name and email here
-packager_name="Mr Joe Packager Person"
-packager_email='<Joe@packager.person>'
-
-# make sure we're running as root
-if test `id -u` -ne `id -u root`
-then
-   echo "you must build the RPM as root"
-   exit 1
-fi
-
-# get version and release number
-if test $# -lt 1
-then
-   echo "version number?"
-   read version
-else
-   version=$1
-fi
-
-if test $# -lt 2
-then
-   echo "release number?"
-   read release
-else
-   release=$2
-fi
-
-# build all the files
-targets="curl curl-ssl"
-for target in $targets
-do
-   # make sure src RPM exist
-   src_rpm="$target-$version-$release.src.rpm"
-   if test -f $src_rpm
-   then
-      rpm -ivh $src_rpm
-
-      # replace packager in spec file
-      sed -e 's/^Packager: .*/Packager: $packager_name $packager_email/' $specs_dir/$target.spec > $specs_dir/$target-$version-$arch.spec
-
-      # build it
-      if ! rpm -ba $specs_dir/$target-$version-$arch.spec
-      then
-         echo "error building $target for $arch -- check output above"
-      fi
-
-      echo "$target rpm is now in $rpms_dir/$arch"
-   else
-      echo $src_rpm does not exist
-   fi
-done
index b2e7228..9a2af06 100644 (file)
@@ -1,10 +1,8 @@
-SUBDIRS = Win32 Linux Solaris AIX vms
+SUBDIRS = vms
 
 EXTRA_DIST = README \
   DOS/README \
   DOS/common.dj \
-  NetWare/get_ver.awk \
-  NetWare/get_exp.awk \
   OS400/README.OS400 \
   OS400/ccsidcurl.c \
   OS400/ccsidcurl.h \
index 6465b29..6d1b80c 100644 (file)
@@ -89,8 +89,7 @@ build_triplet = @build@
 host_triplet = @host@
 subdir = packages
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/ax_code_coverage.m4 \
-       $(top_srcdir)/m4/ax_compile_check_sizeof.m4 \
+am__aclocal_m4_deps = $(top_srcdir)/m4/ax_compile_check_sizeof.m4 \
        $(top_srcdir)/m4/curl-compilers.m4 \
        $(top_srcdir)/m4/curl-confopts.m4 \
        $(top_srcdir)/m4/curl-functions.m4 \
@@ -212,12 +211,6 @@ CC = @CC@
 CCDEPMODE = @CCDEPMODE@
 CFLAGS = @CFLAGS@
 CFLAG_CURL_SYMBOL_HIDING = @CFLAG_CURL_SYMBOL_HIDING@
-CODE_COVERAGE_CFLAGS = @CODE_COVERAGE_CFLAGS@
-CODE_COVERAGE_CPPFLAGS = @CODE_COVERAGE_CPPFLAGS@
-CODE_COVERAGE_CXXFLAGS = @CODE_COVERAGE_CXXFLAGS@
-CODE_COVERAGE_ENABLED = @CODE_COVERAGE_ENABLED@
-CODE_COVERAGE_LDFLAGS = @CODE_COVERAGE_LDFLAGS@
-CODE_COVERAGE_LIBS = @CODE_COVERAGE_LIBS@
 CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
@@ -259,14 +252,15 @@ ENABLE_SHARED = @ENABLE_SHARED@
 ENABLE_STATIC = @ENABLE_STATIC@
 EXEEXT = @EXEEXT@
 FGREP = @FGREP@
+FISH_FUNCTIONS_DIR = @FISH_FUNCTIONS_DIR@
 GCOV = @GCOV@
-GENHTML = @GENHTML@
 GREP = @GREP@
 HAVE_BROTLI = @HAVE_BROTLI@
 HAVE_GNUTLS_SRP = @HAVE_GNUTLS_SRP@
 HAVE_LDAP_SSL = @HAVE_LDAP_SSL@
 HAVE_LIBZ = @HAVE_LIBZ@
 HAVE_OPENSSL_SRP = @HAVE_OPENSSL_SRP@
+HAVE_PROTO_BSDSOCKET_H = @HAVE_PROTO_BSDSOCKET_H@
 IDN_ENABLED = @IDN_ENABLED@
 INSTALL = @INSTALL@
 INSTALL_DATA = @INSTALL_DATA@
@@ -327,9 +321,7 @@ STRIP = @STRIP@
 SUPPORT_FEATURES = @SUPPORT_FEATURES@
 SUPPORT_PROTOCOLS = @SUPPORT_PROTOCOLS@
 USE_ARES = @USE_ARES@
-USE_AXTLS = @USE_AXTLS@
-USE_CYASSL = @USE_CYASSL@
-USE_DARWINSSL = @USE_DARWINSSL@
+USE_BEARSSL = @USE_BEARSSL@
 USE_GNUTLS = @USE_GNUTLS@
 USE_GNUTLS_NETTLE = @USE_GNUTLS_NETTLE@
 USE_LIBRTMP = @USE_LIBRTMP@
@@ -338,12 +330,17 @@ USE_LIBSSH2 = @USE_LIBSSH2@
 USE_MBEDTLS = @USE_MBEDTLS@
 USE_MESALINK = @USE_MESALINK@
 USE_NGHTTP2 = @USE_NGHTTP2@
+USE_NGHTTP3 = @USE_NGHTTP3@
+USE_NGTCP2 = @USE_NGTCP2@
+USE_NGTCP2_CRYPTO_OPENSSL = @USE_NGTCP2_CRYPTO_OPENSSL@
 USE_NSS = @USE_NSS@
 USE_OPENLDAP = @USE_OPENLDAP@
-USE_POLARSSL = @USE_POLARSSL@
+USE_QUICHE = @USE_QUICHE@
 USE_SCHANNEL = @USE_SCHANNEL@
+USE_SECTRANSP = @USE_SECTRANSP@
 USE_UNIX_SOCKETS = @USE_UNIX_SOCKETS@
 USE_WINDOWS_SSPI = @USE_WINDOWS_SSPI@
+USE_WOLFSSL = @USE_WOLFSSL@
 VERSION = @VERSION@
 VERSIONNUM = @VERSIONNUM@
 ZLIB_LIBS = @ZLIB_LIBS@
@@ -403,12 +400,10 @@ target_alias = @target_alias@
 top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
-SUBDIRS = Win32 Linux Solaris AIX vms
+SUBDIRS = vms
 EXTRA_DIST = README \
   DOS/README \
   DOS/common.dj \
-  NetWare/get_ver.awk \
-  NetWare/get_exp.awk \
   OS400/README.OS400 \
   OS400/ccsidcurl.c \
   OS400/ccsidcurl.h \
diff --git a/packages/NetWare/get_exp.awk b/packages/NetWare/get_exp.awk
deleted file mode 100644 (file)
index 9bbb012..0000000
+++ /dev/null
@@ -1,71 +0,0 @@
-# ***************************************************************************
-# *                                  _   _ ____  _
-# *  Project                     ___| | | |  _ \| |
-# *                             / __| | | | |_) | |
-# *                            | (__| |_| |  _ <| |___
-# *                             \___|\___/|_| \_\_____|
-# *
-# * Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al.
-# *
-# * This software is licensed as described in the file COPYING, which
-# * you should have received as part of this distribution. The terms
-# * are also available at https://curl.haxx.se/docs/copyright.html.
-# *
-# * You may opt to use, copy, modify, merge, publish, distribute and/or sell
-# * copies of the Software, and permit persons to whom the Software is
-# * furnished to do so, under the terms of the COPYING file.
-# *
-# * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
-# * KIND, either express or implied.
-# *
-# ***************************************************************************
-# awk script which fetches curl function symbols from public header input
-# files and write them to STDOUT. Here you can get an awk version for Win32:
-# http://www.gknw.net/development/prgtools/awk-20100523.zip
-#
-BEGIN {
-  add_symbol("curl_strequal")
-  add_symbol("curl_strnequal")
-}
-
-function add_symbol(sym_name) {
-  sub(" ", "", sym_name)
-  exports[++idx] = sym_name
-}
-
-
-/^CURL_EXTERN .* [*]?curl_.*[(]/ {
-  sub("[(].*", "")
-  sub("^.* ", "")
-  sub("^[*]", "")
-  add_symbol($0)
-}
-
-END {
-  printf("Added %d symbols to export list.\n", idx) > "/dev/stderr"
-  # sort symbols with shell sort
-  increment = int(idx / 2)
-  while (increment > 0) {
-    for (i = increment+1; i <= idx; i++) {
-      j = i
-      temp = exports[i]
-      while ((j >= increment+1) && (exports[j-increment] > temp)) {
-        exports[j] = exports[j-increment]
-        j -= increment
-      }
-      exports[j] = temp
-    }
-    if (increment == 2)
-      increment = 1
-    else
-      increment = int(increment*5/11)
-  }
-  # print the array
-  if (EXPPREFIX) {
-    printf(" (%s)\n", EXPPREFIX)
-  }
-  while (x < idx - 1) {
-    printf(" %s,\n", exports[++x])
-  }
-  printf(" %s\n", exports[++x])
-}
diff --git a/packages/NetWare/get_ver.awk b/packages/NetWare/get_ver.awk
deleted file mode 100644 (file)
index 2db2be9..0000000
+++ /dev/null
@@ -1,43 +0,0 @@
-# ***************************************************************************
-# *                                  _   _ ____  _
-# *  Project                     ___| | | |  _ \| |
-# *                             / __| | | | |_) | |
-# *                            | (__| |_| |  _ <| |___
-# *                             \___|\___/|_| \_\_____|
-# *
-# * Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al.
-# *
-# * This software is licensed as described in the file COPYING, which
-# * you should have received as part of this distribution. The terms
-# * are also available at https://curl.haxx.se/docs/copyright.html.
-# *
-# * You may opt to use, copy, modify, merge, publish, distribute and/or sell
-# * copies of the Software, and permit persons to whom the Software is
-# * furnished to do so, under the terms of the COPYING file.
-# *
-# * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
-# * KIND, either express or implied.
-# *
-# ***************************************************************************
-# awk script which fetches curl version number and copyright string from input
-# file and writes them to STDOUT. Here you can get an awk version for Win32:
-# http://www.gknw.net/development/prgtools/awk-20100523.zip
-#
-BEGIN {
-  while ((getline < ARGV[1]) > 0) {
-    sub("\r", "") # make MSYS gawk work with CRLF header input.
-    if (match ($0, /^#define LIBCURL_COPYRIGHT "([^"]+)"$/))
-      copyright_string = substr($0, 28, length($0)-28)
-    else if (match ($0, /^#define LIBCURL_VERSION "[^"]+"$/))
-      version_string = substr($3, 2, length($3)-2)
-    else if (match ($0, /^#define LIBCURL_VERSION_MAJOR [0-9]+$/))
-      version_major = $3
-    else if (match ($0, /^#define LIBCURL_VERSION_MINOR [0-9]+$/))
-      version_minor = $3
-    else if (match ($0, /^#define LIBCURL_VERSION_PATCH [0-9]+$/))
-      version_patch = $3
-  }
-  print "LIBCURL_VERSION = " version_major "," version_minor "," version_patch
-  print "LIBCURL_VERSION_STR = " version_string
-  print "LIBCURL_COPYRIGHT_STR = " copyright_string
-}
index 2f99103..95a5584 100644 (file)
@@ -64,6 +64,7 @@ _ curl_easy_setopt_ccsid()
   Variable arguments are a string pointer and a CCSID (unsigned int) for
 options:
         CURLOPT_ABSTRACT_UNIX_SOCKET
+        CURLOPT_ALTSVC
         CURLOPT_CAINFO
         CURLOPT_CAPATH
         CURLOPT_COOKIE
@@ -75,6 +76,7 @@ options:
         CURLOPT_CUSTOMREQUEST
         CURLOPT_DEFAULT_PROTOCOL
         CURLOPT_DNS_SERVERS
+        CURLOPT_DOH_URL
         CURLOPT_EGDSOCKET
         CURLOPT_ENCODING
         CURLOPT_FTPPORT
@@ -118,6 +120,7 @@ options:
         CURLOPT_RTSP_SESSION_UID
         CURLOPT_RTSP_STREAM_URI
         CURLOPT_RTSP_TRANSPORT
+        CURLOPT_SASL_AUTHZID
         CURLOPT_SERVICE_NAME
         CURLOPT_SOCKS5_GSSAPI_SERVICE
         CURLOPT_SSH_HOST_PUBLIC_KEY_MD5
index af53f67..11e4c77 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -94,7 +94,7 @@ iconv_open_CCSID(unsigned int ccsidout, unsigned int ccsidin,
 
   makeOS400IconvCode(fromcode, ccsidin);
   makeOS400IconvCode(tocode, ccsidout);
-  memset(tocode + 13, 0, sizeof tocode - 13);   /* Dest. code id format. */
+  memset(tocode + 13, 0, sizeof(tocode) - 13);   /* Dest. code id format. */
 
   if(cstr)
     fromcode[18] = '1';                         /* Set null-terminator flag. */
@@ -104,8 +104,8 @@ iconv_open_CCSID(unsigned int ccsidout, unsigned int ccsidin,
 
 
 static int
-convert(char * d, size_t dlen, int dccsid,
-        const char * s, int slen, int sccsid)
+convert(char *d, size_t dlen, int dccsid,
+        const char *s, int slen, int sccsid)
 
 {
   int i;
@@ -161,11 +161,11 @@ convert(char * d, size_t dlen, int dccsid,
 
 
 static char *
-dynconvert(int dccsid, const char * s, int slen, int sccsid)
+dynconvert(int dccsid, const char *s, int slen, int sccsid)
 
 {
-  char * d;
-  char * cp;
+  char *d;
+  char *cp;
   size_t dlen;
   int l;
   static const char nullbyte = 0;
@@ -213,19 +213,26 @@ dynconvert(int dccsid, const char * s, int slen, int sccsid)
 
 
 static struct curl_slist *
-slist_convert(int dccsid, struct curl_slist * from, int sccsid)
+slist_convert(int dccsid, struct curl_slist *from, int sccsid)
 
 {
-  struct curl_slist * to = (struct curl_slist *) NULL;
+  struct curl_slist *to = (struct curl_slist *) NULL;
 
   for(; from; from = from->next) {
-    char * cp = dynconvert(dccsid, from->data, -1, sccsid);
+    struct curl_slist *nl;
+    char *cp = dynconvert(dccsid, from->data, -1, sccsid);
 
     if(!cp) {
       curl_slist_free_all(to);
       return (struct curl_slist *) NULL;
     }
-    to = Curl_slist_append_nodup(to, cp);
+    nl = Curl_slist_append_nodup(to, cp);
+    if(!nl) {
+      curl_slist_free_all(to);
+      free(cp);
+      return NULL;
+    }
+    to = nl;
   }
   return to;
 }
@@ -236,8 +243,8 @@ curl_version_ccsid(unsigned int ccsid)
 
 {
   int i;
-  char * aversion;
-  char * eversion;
+  char *aversion;
+  char *eversion;
 
   aversion = curl_version();
 
@@ -247,7 +254,8 @@ curl_version_ccsid(unsigned int ccsid)
   i = strlen(aversion) + 1;
   i *= MAX_CONV_EXPANSION;
 
-  if(!(eversion = Curl_thread_buffer(LK_CURL_VERSION, i)))
+  eversion = Curl_thread_buffer(LK_CURL_VERSION, i);
+  if(!eversion)
     return (char *) NULL;
 
   if(convert(eversion, i, ccsid, aversion, -1, ASCII_CCSID) < 0)
@@ -258,12 +266,12 @@ curl_version_ccsid(unsigned int ccsid)
 
 
 char *
-curl_easy_escape_ccsid(CURL * handle, const char * string, int length,
+curl_easy_escape_ccsid(CURL *handle, const char *string, int length,
                        unsigned int sccsid, unsigned int dccsid)
 
 {
-  char * s;
-  char * d;
+  char *s;
+  char *d;
 
   if(!string) {
     errno = EINVAL;
@@ -288,13 +296,13 @@ curl_easy_escape_ccsid(CURL * handle, const char * string, int length,
 
 
 char *
-curl_easy_unescape_ccsid(CURL * handle, const char * string, int length,
-                         int * outlength,
+curl_easy_unescape_ccsid(CURL *handle, const char *string, int length,
+                         int *outlength,
                          unsigned int sccsid, unsigned int dccsid)
 
 {
-  char * s;
-  char * d;
+  char *s;
+  char *d;
 
   if(!string) {
     errno = EINVAL;
@@ -323,11 +331,11 @@ curl_easy_unescape_ccsid(CURL * handle, const char * string, int length,
 
 
 struct curl_slist *
-curl_slist_append_ccsid(struct curl_slist * list,
-                        const char * data, unsigned int ccsid)
+curl_slist_append_ccsid(struct curl_slist *list,
+                        const char *data, unsigned int ccsid)
 
 {
-  char * s;
+  char *s;
 
   s = (char *) NULL;
 
@@ -346,10 +354,10 @@ curl_slist_append_ccsid(struct curl_slist * list,
 
 
 time_t
-curl_getdate_ccsid(const char * p, const time_t * unused, unsigned int ccsid)
+curl_getdate_ccsid(const char *p, const time_t * unused, unsigned int ccsid)
 
 {
-  char * s;
+  char *s;
   time_t t;
 
   if(!p)
@@ -368,7 +376,7 @@ curl_getdate_ccsid(const char * p, const time_t * unused, unsigned int ccsid)
 
 static int
 convert_version_info_string(const char * * stringp,
-                            char * * bufp, int * left, unsigned int ccsid)
+                            char * * bufp, int *left, unsigned int ccsid)
 
 {
   /* Helper for curl_version_info_ccsid(): convert a string if defined.
@@ -396,7 +404,7 @@ curl_version_info_ccsid(CURLversion stamp, unsigned int ccsid)
 
 {
   curl_version_info_data * p;
-  char * cp;
+  char *cp;
   int n;
   int nproto;
   curl_version_info_data * id;
@@ -461,17 +469,17 @@ curl_version_info_ccsid(CURLversion stamp, unsigned int ccsid)
 
   cp = Curl_thread_buffer(LK_VERSION_INFO_DATA, n);
   id = (curl_version_info_data *) Curl_thread_buffer(LK_VERSION_INFO,
-                                                     sizeof *id);
+                                                     sizeof(*id));
 
   if(!id || !cp)
     return (curl_version_info_data *) NULL;
 
   /* Copy data and convert strings. */
 
-  memcpy((char *) id, (char *) p, sizeof *p);
+  memcpy((char *) id, (char *) p, sizeof(*p));
 
   if(id->protocols) {
-    int i = nproto * sizeof id->protocols[0];
+    int i = nproto * sizeof(id->protocols[0]);
 
     id->protocols = (const char * const *) cp;
     memcpy(cp, (char *) p->protocols, i);
@@ -514,8 +522,8 @@ curl_easy_strerror_ccsid(CURLcode error, unsigned int ccsid)
 
 {
   int i;
-  const char * s;
-  char * buf;
+  const char *s;
+  char *buf;
 
   s = curl_easy_strerror(error);
 
@@ -524,7 +532,8 @@ curl_easy_strerror_ccsid(CURLcode error, unsigned int ccsid)
 
   i = MAX_CONV_EXPANSION * (strlen(s) + 1);
 
-  if(!(buf = Curl_thread_buffer(LK_EASY_STRERROR, i)))
+  buf = Curl_thread_buffer(LK_EASY_STRERROR, i);
+  if(!buf)
     return (const char *) NULL;
 
   if(convert(buf, i, ccsid, s, -1, ASCII_CCSID) < 0)
@@ -539,8 +548,8 @@ curl_share_strerror_ccsid(CURLSHcode error, unsigned int ccsid)
 
 {
   int i;
-  const char * s;
-  char * buf;
+  const char *s;
+  char *buf;
 
   s = curl_share_strerror(error);
 
@@ -549,7 +558,8 @@ curl_share_strerror_ccsid(CURLSHcode error, unsigned int ccsid)
 
   i = MAX_CONV_EXPANSION * (strlen(s) + 1);
 
-  if(!(buf = Curl_thread_buffer(LK_SHARE_STRERROR, i)))
+  buf = Curl_thread_buffer(LK_SHARE_STRERROR, i);
+  if(!buf)
     return (const char *) NULL;
 
   if(convert(buf, i, ccsid, s, -1, ASCII_CCSID) < 0)
@@ -564,8 +574,8 @@ curl_multi_strerror_ccsid(CURLMcode error, unsigned int ccsid)
 
 {
   int i;
-  const char * s;
-  char * buf;
+  const char *s;
+  char *buf;
 
   s = curl_multi_strerror(error);
 
@@ -574,7 +584,8 @@ curl_multi_strerror_ccsid(CURLMcode error, unsigned int ccsid)
 
   i = MAX_CONV_EXPANSION * (strlen(s) + 1);
 
-  if(!(buf = Curl_thread_buffer(LK_MULTI_STRERROR, i)))
+  buf = Curl_thread_buffer(LK_MULTI_STRERROR, i);
+  if(!buf)
     return (const char *) NULL;
 
   if(convert(buf, i, ccsid, s, -1, ASCII_CCSID) < 0)
@@ -603,18 +614,13 @@ curl_certinfo_free_all(struct curl_certinfo *info)
 
 
 CURLcode
-curl_easy_getinfo_ccsid(CURL * curl, CURLINFO info, ...)
+curl_easy_getinfo_ccsid(CURL *curl, CURLINFO info, ...)
 
 {
   va_list arg;
-  void * paramp;
+  void *paramp;
   CURLcode ret;
-  unsigned int ccsid;
-  char * * cpp;
   struct Curl_easy * data;
-  struct curl_slist * * slp;
-  struct curl_certinfo * cipf;
-  struct curl_certinfo * cipt;
 
   /* WARNING: unlike curl_easy_getinfo(), the strings returned by this
      procedure have to be free'ed. */
@@ -624,8 +630,14 @@ curl_easy_getinfo_ccsid(CURL * curl, CURLINFO info, ...)
   paramp = va_arg(arg, void *);
   ret = Curl_getinfo(data, info, paramp);
 
-  if(ret == CURLE_OK)
-    switch ((int) info & CURLINFO_TYPEMASK) {
+  if(ret == CURLE_OK) {
+    unsigned int ccsid;
+    char **cpp;
+    struct curl_slist **slp;
+    struct curl_certinfo *cipf;
+    struct curl_certinfo *cipt;
+
+    switch((int) info & CURLINFO_TYPEMASK) {
 
     case CURLINFO_STRING:
       ccsid = va_arg(arg, unsigned int);
@@ -642,16 +654,17 @@ curl_easy_getinfo_ccsid(CURL * curl, CURLINFO info, ...)
 
     case CURLINFO_SLIST:
       ccsid = va_arg(arg, unsigned int);
-      switch (info) {
+      switch(info) {
       case CURLINFO_CERTINFO:
         cipf = *(struct curl_certinfo * *) paramp;
         if(cipf) {
-          if(!(cipt = (struct curl_certinfo *) malloc(sizeof *cipt)))
+          cipt = (struct curl_certinfo *) malloc(sizeof(*cipt));
+          if(!cipt)
             ret = CURLE_OUT_OF_MEMORY;
           else {
-            cipt->certinfo = (struct curl_slist * *)
-                             calloc(cipf->num_of_certs +
-                                    1, sizeof(struct curl_slist *));
+            cipt->certinfo = (struct curl_slist **)
+              calloc(cipf->num_of_certs +
+                     1, sizeof(struct curl_slist *));
             if(!cipt->certinfo)
               ret = CURLE_OUT_OF_MEMORY;
             else {
@@ -685,13 +698,16 @@ curl_easy_getinfo_ccsid(CURL * curl, CURLINFO info, ...)
         break;
 
       default:
-        slp = (struct curl_slist * *) paramp;
-        if(*slp)
-          if(!(*slp = slist_convert(ccsid, *slp, ASCII_CCSID)))
+        slp = (struct curl_slist **) paramp;
+        if(*slp) {
+          *slp = slist_convert(ccsid, *slp, ASCII_CCSID);
+          if(!*slp)
             ret = CURLE_OUT_OF_MEMORY;
+        }
         break;
       }
     }
+  }
 
   va_end(arg);
   return ret;
@@ -702,7 +718,7 @@ static int
 Curl_is_formadd_string(CURLformoption option)
 
 {
-  switch (option) {
+  switch(option) {
 
   case CURLFORM_FILENAME:
   case CURLFORM_CONTENTTYPE:
@@ -738,8 +754,8 @@ Curl_formadd_convert(struct curl_forms * forms,
 
 {
   int l;
-  char * cp;
-  char * cp2;
+  char *cp;
+  char *cp2;
 
   if(formx < 0 || !forms[formx].value)
     return 0;
@@ -788,7 +804,7 @@ curl_formadd_ccsid(struct curl_httppost * * httppost,
   struct curl_forms * lforms;
   struct curl_forms * tforms;
   unsigned int lformlen;
-  const char * value;
+  const char *value;
   unsigned int ccsid;
   int nargs;
   int namex;
@@ -816,7 +832,7 @@ curl_formadd_ccsid(struct curl_httppost * * httppost,
   /* Allocate the local curl_forms array. */
 
   lformlen = ALLOC_GRANULE;
-  lforms = malloc(lformlen * sizeof *lforms);
+  lforms = malloc(lformlen * sizeof(*lforms));
 
   if(!lforms)
     return CURL_FORMADD_MEMORY;
@@ -838,7 +854,7 @@ curl_formadd_ccsid(struct curl_httppost * * httppost,
 
     if(nargs >= lformlen) {
       lformlen += ALLOC_GRANULE;
-      tforms = realloc(lforms, lformlen * sizeof *lforms);
+      tforms = realloc(lforms, lformlen * sizeof(*lforms));
 
       if(!tforms) {
         result = CURL_FORMADD_MEMORY;
@@ -868,7 +884,7 @@ curl_formadd_ccsid(struct curl_httppost * * httppost,
 
     /* Dispatch by option. */
 
-    switch (option) {
+    switch(option) {
 
     case CURLFORM_END:
       forms = (struct curl_forms *) NULL;       /* Leave array mode. */
@@ -1058,11 +1074,11 @@ typedef struct {
 
 
 static size_t
-Curl_formget_callback_ccsid(void * arg, const char * buf, size_t len)
+Curl_formget_callback_ccsid(void *arg, const char *buf, size_t len)
 
 {
   cfcdata * p;
-  char * b;
+  char *b;
   int l;
   size_t ret;
 
@@ -1090,7 +1106,7 @@ Curl_formget_callback_ccsid(void * arg, const char * buf, size_t len)
 
 
 int
-curl_formget_ccsid(struct curl_httppost * form, void * arg,
+curl_formget_ccsid(struct curl_httppost *form, void *arg,
                    curl_formget_callback append, unsigned int ccsid)
 
 {
@@ -1104,14 +1120,14 @@ curl_formget_ccsid(struct curl_httppost * form, void * arg,
 
 
 CURLcode
-curl_easy_setopt_ccsid(CURL * curl, CURLoption tag, ...)
+curl_easy_setopt_ccsid(CURL *curl, CURLoption tag, ...)
 
 {
   CURLcode result;
   va_list arg;
-  struct Curl_easy * data;
-  char * s;
-  char * cp;
+  struct Curl_easy *data;
+  char *s;
+  char *cp;
   unsigned int ccsid;
   curl_off_t pfsize;
   static char testwarn = 1;
@@ -1125,18 +1141,19 @@ curl_easy_setopt_ccsid(CURL * curl, CURLoption tag, ...)
   if(testwarn) {
     testwarn = 0;
 
-    if((int) STRING_LASTZEROTERMINATED != (int) STRING_TARGET + 1 ||
+    if((int) STRING_LASTZEROTERMINATED != (int) STRING_SASL_AUTHZID + 1 ||
        (int) STRING_LAST != (int) STRING_COPYPOSTFIELDS + 1)
       curl_mfprintf(stderr,
        "*** WARNING: curl_easy_setopt_ccsid() should be reworked ***\n");
-    }
+  }
 
   data = (struct Curl_easy *) curl;
   va_start(arg, tag);
 
-  switch (tag) {
+  switch(tag) {
 
   case CURLOPT_ABSTRACT_UNIX_SOCKET:
+  case CURLOPT_ALTSVC:
   case CURLOPT_CAINFO:
   case CURLOPT_CAPATH:
   case CURLOPT_COOKIE:
@@ -1147,6 +1164,7 @@ curl_easy_setopt_ccsid(CURL * curl, CURLoption tag, ...)
   case CURLOPT_CUSTOMREQUEST:
   case CURLOPT_DEFAULT_PROTOCOL:
   case CURLOPT_DNS_SERVERS:
+  case CURLOPT_DOH_URL:
   case CURLOPT_EGDSOCKET:
   case CURLOPT_ENCODING:
   case CURLOPT_FTPPORT:
@@ -1190,6 +1208,7 @@ curl_easy_setopt_ccsid(CURL * curl, CURLoption tag, ...)
   case CURLOPT_RTSP_SESSION_ID:
   case CURLOPT_RTSP_STREAM_URI:
   case CURLOPT_RTSP_TRANSPORT:
+  case CURLOPT_SASL_AUTHZID:
   case CURLOPT_SERVICE_NAME:
   case CURLOPT_SOCKS5_GSSAPI_SERVICE:
   case CURLOPT_SSH_HOST_PUBLIC_KEY_MD5:
@@ -1221,8 +1240,8 @@ curl_easy_setopt_ccsid(CURL * curl, CURLoption tag, ...)
       if(!s) {
         result = CURLE_OUT_OF_MEMORY;
         break;
-        }
       }
+    }
 
     result = curl_easy_setopt(curl, tag, s);
     free(s);
@@ -1240,7 +1259,7 @@ curl_easy_setopt_ccsid(CURL * curl, CURLoption tag, ...)
     if(!s || !pfsize || ccsid == NOCONV_CCSID || ccsid == ASCII_CCSID) {
       result = curl_easy_setopt(curl, CURLOPT_COPYPOSTFIELDS, s);
       break;
-      }
+    }
 
     if(pfsize == -1) {
       /* Data is null-terminated. */
@@ -1258,7 +1277,7 @@ curl_easy_setopt_ccsid(CURL * curl, CURLoption tag, ...)
       if(pfsize < 0 || pfsize > SIZE_MAX) {
         result = CURLE_OUT_OF_MEMORY;
         break;
-        }
+      }
 
       len = pfsize;
       pfsize = len * MAX_CONV_EXPANSION;
@@ -1271,7 +1290,7 @@ curl_easy_setopt_ccsid(CURL * curl, CURLoption tag, ...)
       if(!cp) {
         result = CURLE_OUT_OF_MEMORY;
         break;
-        }
+      }
 
       pfsize = convert(cp, pfsize, ASCII_CCSID, s, len, ccsid);
 
@@ -1279,11 +1298,11 @@ curl_easy_setopt_ccsid(CURL * curl, CURLoption tag, ...)
         free(cp);
         result = CURLE_OUT_OF_MEMORY;
         break;
-        }
+      }
 
       data->set.postfieldsize = pfsize;         /* Replace data size. */
       s = cp;
-      }
+    }
 
     result = curl_easy_setopt(curl, CURLOPT_POSTFIELDS, s);
     data->set.str[STRING_COPYPOSTFIELDS] = s;   /* Give to library. */
@@ -1291,9 +1310,9 @@ curl_easy_setopt_ccsid(CURL * curl, CURLoption tag, ...)
 
   case CURLOPT_ERRORBUFFER:                     /* This is an output buffer. */
   default:
-    result = Curl_vsetopt(data, tag, arg);
+    result = Curl_vsetopt(curl, tag, arg);
     break;
-    }
+  }
 
   va_end(arg);
   return result;
@@ -1331,13 +1350,12 @@ curl_pushheader_byname_ccsid(struct curl_pushheaders *h, const char *header,
 
 {
   char *d = (char *) NULL;
-  char *s;
 
   if(header) {
     header = dynconvert(ASCII_CCSID, header, -1, ccsidin);
 
     if(header) {
-      s = curl_pushheader_byname(h, header);
+      char *s = curl_pushheader_byname(h, header);
       free((char *) header);
 
       if(s)
@@ -1424,3 +1442,47 @@ curl_mime_data_ccsid(curl_mimepart *part,
   free(s);
   return result;
 }
+
+CURLUcode
+curl_url_get_ccsid(CURLU *handle, CURLUPart what, char **part,
+                   unsigned int flags, unsigned int ccsid)
+
+{
+  char *s = (char *)NULL;
+  CURLUcode result;
+
+  if(!part)
+    return CURLUE_BAD_PARTPOINTER;
+
+  *part = (char *)NULL;
+  result = curl_url_get(handle, what, &s, flags);
+  if(result == CURLUE_OK) {
+    if(s) {
+      *part = dynconvert(ccsid, s, -1, ASCII_CCSID);
+      if(!*part)
+        result = CURLUE_OUT_OF_MEMORY;
+    }
+  }
+  if(s)
+    free(s);
+  return result;
+}
+
+CURLUcode
+curl_url_set_ccsid(CURLU *handle, CURLUPart what, const char *part,
+                   unsigned int flags, unsigned int ccsid)
+
+{
+  char *s = (char *)NULL;
+  CURLUcode result;
+
+  if(part) {
+    s = dynconvert(ASCII_CCSID, part, -1, ccsid);
+    if(!s)
+      return CURLUE_OUT_OF_MEMORY;
+  }
+  result = curl_url_set(handle, what, s, flags);
+  if(s)
+    free(s);
+  return result;
+}
index a65dfbc..9594f66 100644 (file)
@@ -1,3 +1,5 @@
+#ifndef CURLINC_CCSIDCURL_H
+#define CURLINC_CCSIDCURL_H
 /***************************************************************************
  *                                  _   _ ____  _
  *  Project                     ___| | | |  _ \| |
@@ -5,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
  *
  *
  ***************************************************************************/
-
-#ifndef __CURL_CCSIDCURL_H
-#define __CURL_CCSIDCURL_H
-
 #include "curl.h"
 #include "easy.h"
 #include "multi.h"
@@ -85,5 +83,11 @@ CURL_EXTERN CURLcode curl_mime_filedata_ccsid(curl_mimepart *part,
 CURL_EXTERN CURLcode curl_mime_data_ccsid(curl_mimepart *part,
                                           const char *data, size_t datasize,
                                           unsigned int ccsid);
+CURL_EXTERN CURLUcode curl_url_get_ccsid(CURLU *handle, CURLUPart what,
+                                         char **part, unsigned int flags,
+                                         unsigned int ccsid);
+CURL_EXTERN CURLUcode curl_url_set_ccsid(CURLU *handle, CURLUPart what,
+                                         const char *part, unsigned int flags,
+                                         unsigned int ccsid);
 
 #endif
index 2cf7899..4e34de1 100644 (file)
@@ -5,7 +5,7 @@
       *                            | (__| |_| |  _ <| |___
       *                             \___|\___/|_| \_\_____|
       *
-      * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+      * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
       *
       * This software is licensed as described in the file COPYING, which
       * you should have received as part of this distribution. The terms
      d                 c                   X'00200000'
      d CURL_VERSION_MULTI_SSL...
      d                 c                   X'00400000'
+     d CURL_VERSION_BROTLI...
+     d                 c                   X'00800000'
+     d CURL_VERSION_ALTSVC...
+     d                 c                   X'01000000'
+     d CURL_VERSION_HTTP3...
+     d                 c                   X'02000000'
       *
      d CURL_HTTPPOST_FILENAME...
      d                 c                   X'00000001'
      d CURL_WRITEFUNC_PAUSE...
      d                 c                   X'10000001'
       *
+     d CURL_TRAILERFUNC_OK...
+     d                 c                   0
+     d CURL_TRAILERFUNC_ABORT...
+     d                 c                   1
+      *
      d CURLAUTH_NONE   c                   X'00000000'
      d CURLAUTH_BASIC  c                   X'00000001'
      d CURLAUTH_DIGEST...
      d CURL_WAIT_POLLOUT...
      d                 c                   X'0004'
       *
+     d CURLU_DEFAULT_PORT...
+     d                 c                   X'00000001'
+     d CURLU_NO_DEFAULT_PORT...
+     d                 c                   X'00000002'
+     d CURLU_DEFAULT_SCHEME...
+     d                 c                   X'00000004'
+     d CURLU_NON_SUPPORT_SCHEME...
+     d                 c                   X'00000008'
+     d CURLU_PATH_AS_IS...
+     d                 c                   X'00000010'
+     d CURLU_DISALLOW_USER...
+     d                 c                   X'00000020'
+     d CURLU_URLDECODE...
+     d                 c                   X'00000040'
+     d CURLU_URLENCODE...
+     d                 c                   X'00000080'
+     d CURLU_APPENDQUERY...
+     d                 c                   X'00000100'
+     d CURLU_GUESS_SCHEME...
+     d                 c                   X'00000200'
+      *
       **************************************************************************
       *                                Types
       **************************************************************************
      d                 c                   49
      d  CURLE_OBSOLETE50...
      d                 c                   50
-     d  CURLE_PEER_FAILED_VERIFICATION...
+     d  CURLE_OBSOLETE51...
      d                 c                   51
      d  CURLE_GOT_NOTHING...
      d                 c                   52
      d                 c                   58
      d  CURLE_SSL_CIPHER...
      d                 c                   59
-     d  CURLE_SSL_CACERT...
+     d  CURLE_PEER_FAILED_VERIFICATION...
      d                 c                   60
      d  CURLE_BAD_CONTENT_ENCODING...
      d                 c                   61
      d                 c                   91
      d  CURLE_HTTP2_STREAM...
      d                 c                   92
+     d  CURLE_RECURSIVE_API_CALL...
+     d                 c                   93
+     d  CURLE_AUTH_ERROR...
+     d                 c                   94
+     d  CURLE_HTTP3...
+     d                 c                   95
       *
       /if not defined(CURL_NO_OLDIES)
      d  CURLE_URL_MALFORMAT_USER...
      d                 c                   51
      d  CURLE_SHARE_IN_USE...
      d                 c                   57
+     d  CURLE_SSL_CACERT...
+     d                 c                   60
      d  CURLE_FTP_SSL_FAILED...
      d                 c                   64
      d  CURLE_TFTP_DISKFULL...
      d                 c                   X'0001'
      d CURLSSLOPT_NO_REVOKE...
      d                 c                   X'0002'
+     d CURLSSLOPT_NO_PARTIALCHAIN...
+     d                 c                   X'0004'
+      *
+     d CURL_HET_DEFAULT...
+     d                 c                   200
+      *
+     d CURL_UPKEEP_INTERVAL_DEFAULT...
+     d                 c                   60000
       *
       /if not defined(CURL_NO_OLDIES)
      d curl_ftpssl     s                   like(curl_usessl)
      d  CURLHEADER_SEPARATE...
      d                 c                   X'00000001'
       *
+     d  CURLALTSVC_IMMEDIATELY...
+     d                 c                   X'00000001'
+     d  CURLALTSVC_ALTUSED...
+     d                 c                   X'00000002'
+     d  CURLALTSVC_READONLYFILE...
+     d                 c                   X'00000004'
+     d  CURLALTSVC_H1...
+     d                 c                   X'00000008'
+     d  CURLALTSVC_H2...
+     d                 c                   X'00000010'
+     d  CURLALTSVC_H3...
+     d                 c                   X'00000020'
+      *
      d  CURLPROTO_HTTP...
      d                 c                   X'00000001'
      d  CURLPROTO_HTTPS...
      d                 c                   10277
      d  CURLOPT_DISALLOW_USERNAME_IN_URL...
      d                 c                   00278
+     d  CURLOPT_DOH_URL...
+     d                 c                   10279
+     d  CURLOPT_UPLOAD_BUFFERSIZE...
+     d                 c                   00280
+     d  CURLOPT_UPKEEP_INTERVAL_MS...
+     d                 c                   00281
+     d  CURLOPT_CURLU  c                   10282
+     d  CURLOPT_TRAILERFUNCTION...
+     d                 c                   20283
+     d  CURLOPT_TRAILERDATA...
+     d                 c                   10284
+     d  CURLOPT_HTTP09_ALLOWED...
+     d                 c                   00285
+     d  CURLOPT_ALTSVC_CTRL...
+     d                 c                   00286
+     d  CURLOPT_ALTSVC...
+     d                 c                   10287
+     d  CURLOPT_MAXAGE_CONN...
+     d                 c                   00288
+     d  CURLOPT_SASL_AUTHZID...
+     d                 c                   10289
       *
       /if not defined(CURL_NO_OLDIES)
      d  CURLOPT_FILE   c                   10001
      d                 c                   6
      d  CURLM_ADDED_ALREADY...
      d                 c                   7
-     d  CURLM_LAST     c                   8
+     d  CURLM_RECURSIVE_API_CALL...
+     d                 c                   8
+     d  CURLM_WAKEUP_FAILURE...
+     d                 c                   9
+     d  CURLM_LAST     c                   10
       *
      d CURLMSG         s             10i 0 based(######ptr######)               Enum
      d  CURLMSG_NONE   c                   0
      d                 c                   20014
      d  CURLMOPT_PUSHDATA...
      d                 c                   10015
+     d  CURLMOPT_MAX_CONCURRENT_STREAMS...
+     d                 c                   10016
       *
       * Bitmask bits for CURLMOPT_PIPELING.
       *
      d                 c                   12
      d CURL_RTSPREQ_LAST...
      d                 c                   13
-
+      *
+     d CURLUcode       s             10i 0 based(######ptr######)               Enum
+     d  CURLUE_OK      c                   0
+     d  CURLUE_BAD_HANDLE...
+     d                 c                   1
+     d  CURLUE_BAD_PARTPOINTER...
+     d                 c                   2
+     d  CURLUE_MALFORMED_INPUT...
+     d                 c                   3
+     d  CURLUE_BAD_PORT_NUMBER...
+     d                 c                   4
+     d  CURLUE_UNSUPPORTED_SCHEME...
+     d                 c                   5
+     d  CURLUE_URLDECODE...
+     d                 c                   6
+     d  CURLUE_OUT_OF_MEMORY...
+     d                 c                   7
+     d  CURLUE_USER_NOT_ALLOWED...
+     d                 c                   8
+     d  CURLUE_UNKNOWN_PART...
+     d                 c                   9
+     d  CURLUE_NO_SCHEME...
+     d                 c                   10
+     d  CURLUE_NO_USER...
+     d                 c                   11
+     d  CURLUE_NO_PASSWORD...
+     d                 c                   12
+     d  CURLUE_NO_OPTIONS...
+     d                 c                   13
+     d  CURLUE_NO_HOST...
+     d                 c                   14
+     d  CURLUE_NO_PORT...
+     d                 c                   15
+     d  CURLUE_NO_QUERY...
+     d                 c                   16
+     d  CURLUE_NO_FRAGMENT...
+     d                 c                   17
+      *
+     d CURLUPart       s             10i 0 based(######ptr######)               Enum
+     d  CURLUPART_URL  c                   0
+     d  CURLUPART_SCHEME...
+     d                 c                   1
+     d  CURLUPART_USER...
+     d                 c                   2
+     d  CURLUPART_PASSWORD...
+     d                 c                   3
+     d  CURLUPART_OPTIONS...
+     d                 c                   4
+     d  CURLUPART_HOST...
+     d                 c                   5
+     d  CURLUPART_PORT...
+     d                 c                   6
+     d  CURLUPART_PATH...
+     d                 c                   7
+     d  CURLUPART_QUERY...
+     d                 c                   8
+     d  CURLUPART_FRAGMENT...
+     d                 c                   9
       *
       *  Renaming CURLMsg to CURL_Msg to avoid case-insensivity name clash.
       *
      d curl_read_callback...
      d                 s               *   based(######ptr######) procptr
       *
+     d curl_trailer_callback...
+     d                 s               *   based(######ptr######) procptr
+      *
      d curl_write_callback...
      d                 s               *   based(######ptr######) procptr
       *
       *
      d curl_easy_pause...
      d                 pr                  extproc('curl_easy_pause')
+     d                                     like(CURLcode)
      d  curl                           *   value                                CURL *
      d  bitmask                      10i 0 value
       *
+     d curl_easy_upkeep...
+     d                 pr                  extproc('curl_easy_upkeep')
+     d                                     like(CURLcode)
+     d  curl                           *   value                                CURL *
+      *
      d curl_multi_init...
      d                 pr              *   extproc('curl_multi_init')           CURLM *
       *
      d  sockfd                             value like(curl_socket_t)
      d  sockp                          *   value                                void *
       *
+     d curl_url        pr              *   extproc('curl_url')                  CURLU *
+      *
+     d curl_url_cleanup...
+     d                 pr                  extproc('curl_url_cleanup')
+     d  handle                         *   value                                CURLU *
+      *
+     d curl_url_dup    pr              *   extproc('curl_url_dup')              CURLU *
+     d  in                             *   value                                CURLU *
+      *
+     d curl_url_get    pr                  extproc('curl_url_get')
+     d                                     like(CURLUcode)
+     d  handle                         *   value                                CURLU *
+     d  what                               value like(CURLUPart)
+     d  part                           *                                        char **
+     d  flags                        10u 0 value
+      *
+     d curl_url_set    pr                  extproc('curl_url_set')
+     d                                     like(CURLUcode)
+     d  handle                         *   value                                CURLU *
+     d  what                               value like(CURLUPart)
+     d  part                           *   value options(*string)
+     d  flags                        10u 0 value
+      *
       **************************************************************************
       *                CCSID wrapper procedure prototypes
       **************************************************************************
      d  filename                       *   value options(*string)
      d  ccsid                        10u 0 value
       *
+     d curl_url_get_ccsid...
+     d                 pr                  extproc('curl_url_get_ccsid')
+     d                                     like(CURLUcode)
+     d  handle                         *   value                                CURLU *
+     d  what                               value like(CURLUPart)
+     d  part                           *                                        char **
+     d  flags                        10u 0 value
+     d  ccsid                        10u 0 value
+      *
+     d curl_url_set_ccsid...
+     d                 pr                  extproc('curl_url_set_ccsid')
+     d                                     like(CURLUcode)
+     d  handle                         *   value                                CURLU *
+     d  what                               value like(CURLUPart)
+     d  part                           *   value options(*string)
+     d  flags                        10u 0 value
+     d  ccsid                        10u 0 value
+      *
       /endif
index c80f010..3490fc7 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -195,7 +195,7 @@ buffer_threaded(localkey_t key, long size)
 
     /* Allocate buffer descriptors for the current thread. */
 
-    bufs = calloc((size_t) LK_LAST, sizeof *bufs);
+    bufs = calloc((size_t) LK_LAST, sizeof(*bufs));
     if(!bufs)
       return (char *) NULL;
 
@@ -224,7 +224,7 @@ buffer_undef(localkey_t key, long size)
   if(Curl_thread_buffer == buffer_undef) {      /* If unchanged during lock. */
     if(!pthread_key_create(&thdkey, thdbufdestroy))
       Curl_thread_buffer = buffer_threaded;
-    else if(!(locbufs = calloc((size_t) LK_LAST, sizeof *locbufs))) {
+    else if(!(locbufs = calloc((size_t) LK_LAST, sizeof(*locbufs)))) {
       pthread_mutex_unlock(&mutex);
       return (char *) NULL;
       }
@@ -268,13 +268,9 @@ Curl_getnameinfo_a(const struct sockaddr * sa, curl_socklen_t salen,
               int flags)
 
 {
-  char * enodename;
-  char * eservname;
+  char *enodename = NULL;
+  char *eservname = NULL;
   int status;
-  int i;
-
-  enodename = (char *) NULL;
-  eservname = (char *) NULL;
 
   if(nodename && nodenamelen) {
     enodename = malloc(nodenamelen);
@@ -294,6 +290,7 @@ Curl_getnameinfo_a(const struct sockaddr * sa, curl_socklen_t salen,
                        eservname, servnamelen, flags);
 
   if(!status) {
+    int i;
     if(enodename) {
       i = QadrtConvertE2A(nodename, enodename,
         nodenamelen - 1, strlen(enodename));
@@ -389,12 +386,11 @@ Curl_gsk_environment_open(gsk_handle * my_env_handle)
 
 {
   struct Curl_gsk_descriptor * p;
-  gsk_handle h;
   int rc;
 
   if(!my_env_handle)
     return GSK_OS400_ERROR_INVALID_POINTER;
-  p = (struct Curl_gsk_descriptor *) malloc(sizeof *p);
+  p = (struct Curl_gsk_descriptor *) malloc(sizeof(*p));
   if(!p)
     return GSK_INSUFFICIENT_STORAGE;
   p->strlist = (struct gskstrlist *) NULL;
@@ -421,7 +417,7 @@ Curl_gsk_secure_soc_open(gsk_handle my_env_handle,
   if(!my_session_handle)
     return GSK_OS400_ERROR_INVALID_POINTER;
   h = ((struct Curl_gsk_descriptor *) my_env_handle)->h;
-  p = (struct Curl_gsk_descriptor *) malloc(sizeof *p);
+  p = (struct Curl_gsk_descriptor *) malloc(sizeof(*p));
   if(!p)
     return GSK_INSUFFICIENT_STORAGE;
   p->strlist = (struct gskstrlist *) NULL;
@@ -602,7 +598,7 @@ cachestring(struct Curl_gsk_descriptor * p,
     if(sp->ebcdicstr == ebcdicbuf)
       break;
   if(!sp) {
-    sp = (struct gskstrlist *) malloc(sizeof *sp);
+    sp = (struct gskstrlist *) malloc(sizeof(*sp));
     if(!sp)
       return GSK_INSUFFICIENT_STORAGE;
     asciibuf = malloc(bufsize + 1);
@@ -767,16 +763,13 @@ static int
 Curl_gss_convert_in_place(OM_uint32 * minor_status, gss_buffer_t buf)
 
 {
-  unsigned int i;
-  char * t;
+  unsigned int i = buf->length;
 
   /* Convert `buf' in place, from EBCDIC to ASCII.
      If error, release the buffer and return -1. Else return 0. */
 
-  i = buf->length;
-
   if(i) {
-    t = malloc(i);
+    char *t = malloc(i);
     if(!t) {
       gss_release_buffer(minor_status, buf);
 
@@ -807,7 +800,7 @@ Curl_gss_import_name_a(OM_uint32 * minor_status, gss_buffer_t in_name,
   if(!in_name || !in_name->value || !in_name->length)
     return gss_import_name(minor_status, in_name, in_name_type, out_name);
 
-  memcpy((char *) &in, (char *) in_name, sizeof in);
+  memcpy((char *) &in, (char *) in_name, sizeof(in));
   i = in.length;
 
   in.value = malloc(i + 1);
@@ -866,7 +859,6 @@ Curl_gss_init_sec_context_a(OM_uint32 * minor_status,
 
 {
   int rc;
-  unsigned int i;
   gss_buffer_desc in;
   gss_buffer_t inp;
 
@@ -875,7 +867,7 @@ Curl_gss_init_sec_context_a(OM_uint32 * minor_status,
 
   if(inp) {
     if(inp->length && inp->value) {
-      i = inp->length;
+      unsigned int i = inp->length;
 
       in.value = malloc(i + 1);
       if(!in.value) {
@@ -1056,7 +1048,7 @@ Curl_ldap_search_s_a(void * ld, char * base, int scope, char * filter,
     for(i = 0; attrs[i++];)
       ;
 
-    eattrs = calloc(i, sizeof *eattrs);
+    eattrs = calloc(i, sizeof(*eattrs));
     if(!eattrs)
       status = LDAP_NO_MEMORY;
     else {
@@ -1235,19 +1227,18 @@ Curl_ldap_next_attribute_a(void * ld,
 
 
 static int
-convert_sockaddr(struct sockaddr_storage * dstaddr,
-                                const struct sockaddr * srcaddr, int srclen)
-
+sockaddr2ebcdic(struct sockaddr_storage *dstaddr,
+                const struct sockaddr *srcaddr, int srclen)
 {
-  const struct sockaddr_un * srcu;
-  struct sockaddr_un * dstu;
+  const struct sockaddr_un *srcu;
+  struct sockaddr_un *dstu;
   unsigned int i;
   unsigned int dstsize;
 
-  /* Convert a socket address into job CCSID, if needed. */
+  /* Convert a socket address to job CCSID, if needed. */
 
   if(!srcaddr || srclen < offsetof(struct sockaddr, sa_family) +
-     sizeof srcaddr->sa_family || srclen > sizeof *dstaddr) {
+     sizeof(srcaddr->sa_family) || srclen > sizeof(*dstaddr)) {
     errno = EINVAL;
     return -1;
     }
@@ -1259,13 +1250,55 @@ convert_sockaddr(struct sockaddr_storage * dstaddr,
   case AF_UNIX:
     srcu = (const struct sockaddr_un *) srcaddr;
     dstu = (struct sockaddr_un *) dstaddr;
-    dstsize = sizeof *dstaddr - offsetof(struct sockaddr_un, sun_path);
+    dstsize = sizeof(*dstaddr) - offsetof(struct sockaddr_un, sun_path);
     srclen -= offsetof(struct sockaddr_un, sun_path);
     i = QadrtConvertA2E(dstu->sun_path, srcu->sun_path, dstsize - 1, srclen);
     dstu->sun_path[i] = '\0';
-    i += offsetof(struct sockaddr_un, sun_path);
-    srclen = i;
+    srclen = i + offsetof(struct sockaddr_un, sun_path);
+    }
+
+  return srclen;
+}
+
+
+static int
+sockaddr2ascii(struct sockaddr *dstaddr, int dstlen,
+               const struct sockaddr_storage *srcaddr, int srclen)
+{
+  const struct sockaddr_un *srcu;
+  struct sockaddr_un *dstu;
+  unsigned int dstsize;
+
+  /* Convert a socket address to ASCII, if needed. */
+
+  if(!srclen)
+    return 0;
+  if(srclen > dstlen)
+    srclen = dstlen;
+  if(!srcaddr || srclen < 0) {
+    errno = EINVAL;
+    return -1;
+    }
+
+  memcpy((char *) dstaddr, (char *) srcaddr, srclen);
+
+  if(srclen >= offsetof(struct sockaddr_storage, ss_family) +
+     sizeof(srcaddr->ss_family)) {
+    switch (srcaddr->ss_family) {
+
+    case AF_UNIX:
+      srcu = (const struct sockaddr_un *) srcaddr;
+      dstu = (struct sockaddr_un *) dstaddr;
+      dstsize = dstlen - offsetof(struct sockaddr_un, sun_path);
+      srclen -= offsetof(struct sockaddr_un, sun_path);
+      if(dstsize > 0 && srclen > 0) {
+        srclen = QadrtConvertE2A(dstu->sun_path, srcu->sun_path,
+                                 dstsize - 1, srclen);
+        dstu->sun_path[srclen] = '\0';
+      }
+      srclen += offsetof(struct sockaddr_un, sun_path);
     }
+  }
 
   return srclen;
 }
@@ -1273,12 +1306,11 @@ convert_sockaddr(struct sockaddr_storage * dstaddr,
 
 int
 Curl_os400_connect(int sd, struct sockaddr * destaddr, int addrlen)
-
 {
   int i;
   struct sockaddr_storage laddr;
 
-  i = convert_sockaddr(&laddr, destaddr, addrlen);
+  i = sockaddr2ebcdic(&laddr, destaddr, addrlen);
 
   if(i < 0)
     return -1;
@@ -1289,12 +1321,11 @@ Curl_os400_connect(int sd, struct sockaddr * destaddr, int addrlen)
 
 int
 Curl_os400_bind(int sd, struct sockaddr * localaddr, int addrlen)
-
 {
   int i;
   struct sockaddr_storage laddr;
 
-  i = convert_sockaddr(&laddr, localaddr, addrlen);
+  i = sockaddr2ebcdic(&laddr, localaddr, addrlen);
 
   if(i < 0)
     return -1;
@@ -1306,12 +1337,11 @@ Curl_os400_bind(int sd, struct sockaddr * localaddr, int addrlen)
 int
 Curl_os400_sendto(int sd, char * buffer, int buflen, int flags,
                                 struct sockaddr * dstaddr, int addrlen)
-
 {
   int i;
   struct sockaddr_storage laddr;
 
-  i = convert_sockaddr(&laddr, dstaddr, addrlen);
+  i = sockaddr2ebcdic(&laddr, dstaddr, addrlen);
 
   if(i < 0)
     return -1;
@@ -1323,19 +1353,14 @@ Curl_os400_sendto(int sd, char * buffer, int buflen, int flags,
 int
 Curl_os400_recvfrom(int sd, char * buffer, int buflen, int flags,
                                 struct sockaddr * fromaddr, int * addrlen)
-
 {
-  int i;
   int rcvlen;
-  int laddrlen;
-  const struct sockaddr_un * srcu;
-  struct sockaddr_un * dstu;
   struct sockaddr_storage laddr;
+  int laddrlen = sizeof(laddr);
 
   if(!fromaddr || !addrlen || *addrlen <= 0)
     return recvfrom(sd, buffer, buflen, flags, fromaddr, addrlen);
 
-  laddrlen = sizeof laddr;
   laddr.ss_family = AF_UNSPEC;          /* To detect if unused. */
   rcvlen = recvfrom(sd, buffer, buflen, flags,
                     (struct sockaddr *) &laddr, &laddrlen);
@@ -1343,36 +1368,51 @@ Curl_os400_recvfrom(int sd, char * buffer, int buflen, int flags,
   if(rcvlen < 0)
     return rcvlen;
 
-  switch (laddr.ss_family) {
-
-  case AF_UNIX:
-    srcu = (const struct sockaddr_un *) &laddr;
-    dstu = (struct sockaddr_un *) fromaddr;
-    i = *addrlen - offsetof(struct sockaddr_un, sun_path);
-    laddrlen -= offsetof(struct sockaddr_un, sun_path);
-    i = QadrtConvertE2A(dstu->sun_path, srcu->sun_path, i, laddrlen);
-    laddrlen = i + offsetof(struct sockaddr_un, sun_path);
-
-    if(laddrlen < *addrlen)
-      dstu->sun_path[i] = '\0';
+  if(laddr.ss_family == AF_UNSPEC)
+    laddrlen = 0;
+  else {
+    laddrlen = sockaddr2ascii(fromaddr, *addrlen, &laddr, laddrlen);
+    if(laddrlen < 0)
+      return laddrlen;
+  }
+  *addrlen = laddrlen;
+  return rcvlen;
+}
 
-    break;
 
-  case AF_UNSPEC:
-    break;
+int
+Curl_os400_getpeername(int sd, struct sockaddr *addr, int *addrlen)
+{
+  struct sockaddr_storage laddr;
+  int laddrlen = sizeof(laddr);
+  int retcode = getpeername(sd, (struct sockaddr *) &laddr, &laddrlen);
+
+  if(!retcode) {
+    laddrlen = sockaddr2ascii(addr, *addrlen, &laddr, laddrlen);
+    if(laddrlen < 0)
+      return laddrlen;
+    *addrlen = laddrlen;
+  }
 
-  default:
-    if(laddrlen > *addrlen)
-      laddrlen = *addrlen;
+  return retcode;
+}
 
-    if(laddrlen)
-      memcpy((char *) fromaddr, (char *) &laddr, laddrlen);
 
-    break;
-    }
+int
+Curl_os400_getsockname(int sd, struct sockaddr *addr, int *addrlen)
+{
+  struct sockaddr_storage laddr;
+  int laddrlen = sizeof(laddr);
+  int retcode = getsockname(sd, (struct sockaddr *) &laddr, &laddrlen);
+
+  if(!retcode) {
+    laddrlen = sockaddr2ascii(addr, *addrlen, &laddr, laddrlen);
+    if(laddrlen < 0)
+      return laddrlen;
+    *addrlen = laddrlen;
+  }
 
-  *addrlen = laddrlen;
-  return rcvlen;
+  return retcode;
 }
 
 
diff --git a/packages/Solaris/Makefile.am b/packages/Solaris/Makefile.am
deleted file mode 100644 (file)
index d012947..0000000
+++ /dev/null
@@ -1,38 +0,0 @@
-#
-#
-
-PKGADD_PKG="@PKGADD_PKG@"
-PKGADD_NAME="@PACKAGE@-@VERSION@ - @PKGADD_NAME@"
-PKGADD_VENDOR="@PKGADD_VENDOR@"
-PKGADD_ARCH="@host_cpu@"
-PKGADD_DESC="@PACKAGE@-@VERSION@ - @PKGADD_NAME@"
-PKGADD_CLASSES=none
-PKGADD_BASEDIR=/
-
-PKGADD_FILE=${PKGADD_PKG}-@PACKAGE@-@VERSION@-@host@.pkg
-
-package:
-       if [ ! -f release ]; then echo 0 > release; fi
-       if [ `find root -newer release -print|wc -l` -gt 0 ]; then expr `cat release` + 1 > release; fi
-       echo PKG=${PKGADD_PKG} > pkginfo
-       echo NAME=${PKGADD_NAME} >> pkginfo
-       echo VENDOR=${PKGADD_VENDOR} >> pkginfo
-       echo ARCH=${PKGADD_ARCH} >> pkginfo
-       echo DESC=${PKGADD_DESC} >> pkginfo
-       echo CLASSES=${PKGADD_CLASSES} >> pkginfo
-       echo BASEDIR=${PKGADD_BASEDIR} >> pkginfo
-       echo CATEGORY=application >> pkginfo
-       echo VERSION=`cat ./release` >> pkginfo
-       echo > prototype
-       for subdir in opt var etc usr; \
-       do if [ -d root/$$subdir ]; then \
-               pkgproto root/$$subdir=$$subdir >> prototype;\
-       fi; done
-       for file in pkginfo preinstall postinstall copyright; \
-       do if [ -f $$file ]; then \
-               echo "i $$file=$$file" >> prototype; \
-       fi; done
-       rm -rf ./tmp
-       mkdir ./tmp
-       pkgmk -o -d ./tmp
-       pkgtrans -so ./tmp ${top_srcdir}/../${PKGADD_FILE} ${PKGADD_PKG}
diff --git a/packages/Solaris/Makefile.in b/packages/Solaris/Makefile.in
deleted file mode 100644 (file)
index 2ea0368..0000000
+++ /dev/null
@@ -1,577 +0,0 @@
-# Makefile.in generated by automake 1.16.1 from Makefile.am.
-# @configure_input@
-
-# Copyright (C) 1994-2018 Free Software Foundation, Inc.
-
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
-@SET_MAKE@
-
-#
-#
-VPATH = @srcdir@
-am__is_gnu_make = { \
-  if test -z '$(MAKELEVEL)'; then \
-    false; \
-  elif test -n '$(MAKE_HOST)'; then \
-    true; \
-  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
-    true; \
-  else \
-    false; \
-  fi; \
-}
-am__make_running_with_option = \
-  case $${target_option-} in \
-      ?) ;; \
-      *) echo "am__make_running_with_option: internal error: invalid" \
-              "target option '$${target_option-}' specified" >&2; \
-         exit 1;; \
-  esac; \
-  has_opt=no; \
-  sane_makeflags=$$MAKEFLAGS; \
-  if $(am__is_gnu_make); then \
-    sane_makeflags=$$MFLAGS; \
-  else \
-    case $$MAKEFLAGS in \
-      *\\[\ \  ]*) \
-        bs=\\; \
-        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
-          | sed "s/$$bs$$bs[$$bs $$bs  ]*//g"`;; \
-    esac; \
-  fi; \
-  skip_next=no; \
-  strip_trailopt () \
-  { \
-    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
-  }; \
-  for flg in $$sane_makeflags; do \
-    test $$skip_next = yes && { skip_next=no; continue; }; \
-    case $$flg in \
-      *=*|--*) continue;; \
-        -*I) strip_trailopt 'I'; skip_next=yes;; \
-      -*I?*) strip_trailopt 'I';; \
-        -*O) strip_trailopt 'O'; skip_next=yes;; \
-      -*O?*) strip_trailopt 'O';; \
-        -*l) strip_trailopt 'l'; skip_next=yes;; \
-      -*l?*) strip_trailopt 'l';; \
-      -[dEDm]) skip_next=yes;; \
-      -[JT]) skip_next=yes;; \
-    esac; \
-    case $$flg in \
-      *$$target_option*) has_opt=yes; break;; \
-    esac; \
-  done; \
-  test $$has_opt = yes
-am__make_dryrun = (target_option=n; $(am__make_running_with_option))
-am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
-pkgdatadir = $(datadir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkglibexecdir = $(libexecdir)/@PACKAGE@
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-build_triplet = @build@
-host_triplet = @host@
-subdir = packages/Solaris
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/ax_code_coverage.m4 \
-       $(top_srcdir)/m4/ax_compile_check_sizeof.m4 \
-       $(top_srcdir)/m4/curl-compilers.m4 \
-       $(top_srcdir)/m4/curl-confopts.m4 \
-       $(top_srcdir)/m4/curl-functions.m4 \
-       $(top_srcdir)/m4/curl-openssl.m4 \
-       $(top_srcdir)/m4/curl-override.m4 \
-       $(top_srcdir)/m4/curl-reentrant.m4 $(top_srcdir)/m4/libtool.m4 \
-       $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
-       $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
-       $(top_srcdir)/m4/xc-am-iface.m4 \
-       $(top_srcdir)/m4/xc-cc-check.m4 \
-       $(top_srcdir)/m4/xc-lt-iface.m4 \
-       $(top_srcdir)/m4/xc-translit.m4 \
-       $(top_srcdir)/m4/xc-val-flgs.m4 \
-       $(top_srcdir)/m4/zz40-xc-ovr.m4 \
-       $(top_srcdir)/m4/zz50-xc-ovr.m4 \
-       $(top_srcdir)/m4/zz60-xc-ovr.m4 $(top_srcdir)/acinclude.m4 \
-       $(top_srcdir)/configure.ac
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
-       $(ACLOCAL_M4)
-DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
-mkinstalldirs = $(install_sh) -d
-CONFIG_HEADER = $(top_builddir)/lib/curl_config.h
-CONFIG_CLEAN_FILES =
-CONFIG_CLEAN_VPATH_FILES =
-AM_V_P = $(am__v_P_@AM_V@)
-am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
-am__v_P_0 = false
-am__v_P_1 = :
-AM_V_GEN = $(am__v_GEN_@AM_V@)
-am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
-am__v_GEN_0 = @echo "  GEN     " $@;
-am__v_GEN_1 = 
-AM_V_at = $(am__v_at_@AM_V@)
-am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
-am__v_at_0 = @
-am__v_at_1 = 
-SOURCES =
-DIST_SOURCES =
-am__can_run_installinfo = \
-  case $$AM_UPDATE_INFO_DIR in \
-    n|no|NO) false;; \
-    *) (install-info --version) >/dev/null 2>&1;; \
-  esac
-am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
-am__DIST_COMMON = $(srcdir)/Makefile.in
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-ACLOCAL = @ACLOCAL@
-AMTAR = @AMTAR@
-AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
-AR = @AR@
-AR_FLAGS = @AR_FLAGS@
-AS = @AS@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-BLANK_AT_MAKETIME = @BLANK_AT_MAKETIME@
-CC = @CC@
-CCDEPMODE = @CCDEPMODE@
-CFLAGS = @CFLAGS@
-CFLAG_CURL_SYMBOL_HIDING = @CFLAG_CURL_SYMBOL_HIDING@
-CODE_COVERAGE_CFLAGS = @CODE_COVERAGE_CFLAGS@
-CODE_COVERAGE_CPPFLAGS = @CODE_COVERAGE_CPPFLAGS@
-CODE_COVERAGE_CXXFLAGS = @CODE_COVERAGE_CXXFLAGS@
-CODE_COVERAGE_ENABLED = @CODE_COVERAGE_ENABLED@
-CODE_COVERAGE_LDFLAGS = @CODE_COVERAGE_LDFLAGS@
-CODE_COVERAGE_LIBS = @CODE_COVERAGE_LIBS@
-CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@
-CPP = @CPP@
-CPPFLAGS = @CPPFLAGS@
-CPPFLAG_CURL_STATICLIB = @CPPFLAG_CURL_STATICLIB@
-CURLVERSION = @CURLVERSION@
-CURL_CA_BUNDLE = @CURL_CA_BUNDLE@
-CURL_CFLAG_EXTRAS = @CURL_CFLAG_EXTRAS@
-CURL_DISABLE_DICT = @CURL_DISABLE_DICT@
-CURL_DISABLE_FILE = @CURL_DISABLE_FILE@
-CURL_DISABLE_FTP = @CURL_DISABLE_FTP@
-CURL_DISABLE_GOPHER = @CURL_DISABLE_GOPHER@
-CURL_DISABLE_HTTP = @CURL_DISABLE_HTTP@
-CURL_DISABLE_IMAP = @CURL_DISABLE_IMAP@
-CURL_DISABLE_LDAP = @CURL_DISABLE_LDAP@
-CURL_DISABLE_LDAPS = @CURL_DISABLE_LDAPS@
-CURL_DISABLE_POP3 = @CURL_DISABLE_POP3@
-CURL_DISABLE_PROXY = @CURL_DISABLE_PROXY@
-CURL_DISABLE_RTSP = @CURL_DISABLE_RTSP@
-CURL_DISABLE_SMB = @CURL_DISABLE_SMB@
-CURL_DISABLE_SMTP = @CURL_DISABLE_SMTP@
-CURL_DISABLE_TELNET = @CURL_DISABLE_TELNET@
-CURL_DISABLE_TFTP = @CURL_DISABLE_TFTP@
-CURL_LT_SHLIB_VERSIONED_FLAVOUR = @CURL_LT_SHLIB_VERSIONED_FLAVOUR@
-CURL_NETWORK_AND_TIME_LIBS = @CURL_NETWORK_AND_TIME_LIBS@
-CURL_NETWORK_LIBS = @CURL_NETWORK_LIBS@
-CURL_WITH_MULTI_SSL = @CURL_WITH_MULTI_SSL@
-CYGPATH_W = @CYGPATH_W@
-DEFAULT_SSL_BACKEND = @DEFAULT_SSL_BACKEND@
-DEFS = @DEFS@
-DEPDIR = @DEPDIR@
-DLLTOOL = @DLLTOOL@
-DSYMUTIL = @DSYMUTIL@
-DUMPBIN = @DUMPBIN@
-ECHO_C = @ECHO_C@
-ECHO_N = @ECHO_N@
-ECHO_T = @ECHO_T@
-EGREP = @EGREP@
-ENABLE_SHARED = @ENABLE_SHARED@
-ENABLE_STATIC = @ENABLE_STATIC@
-EXEEXT = @EXEEXT@
-FGREP = @FGREP@
-GCOV = @GCOV@
-GENHTML = @GENHTML@
-GREP = @GREP@
-HAVE_BROTLI = @HAVE_BROTLI@
-HAVE_GNUTLS_SRP = @HAVE_GNUTLS_SRP@
-HAVE_LDAP_SSL = @HAVE_LDAP_SSL@
-HAVE_LIBZ = @HAVE_LIBZ@
-HAVE_OPENSSL_SRP = @HAVE_OPENSSL_SRP@
-IDN_ENABLED = @IDN_ENABLED@
-INSTALL = @INSTALL@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-IPV6_ENABLED = @IPV6_ENABLED@
-LCOV = @LCOV@
-LD = @LD@
-LDFLAGS = @LDFLAGS@
-LIBCURL_LIBS = @LIBCURL_LIBS@
-LIBMETALINK_CPPFLAGS = @LIBMETALINK_CPPFLAGS@
-LIBMETALINK_LDFLAGS = @LIBMETALINK_LDFLAGS@
-LIBMETALINK_LIBS = @LIBMETALINK_LIBS@
-LIBOBJS = @LIBOBJS@
-LIBS = @LIBS@
-LIBTOOL = @LIBTOOL@
-LIPO = @LIPO@
-LN_S = @LN_S@
-LTLIBOBJS = @LTLIBOBJS@
-LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
-MAINT = @MAINT@
-MAKEINFO = @MAKEINFO@
-MANIFEST_TOOL = @MANIFEST_TOOL@
-MANOPT = @MANOPT@
-MKDIR_P = @MKDIR_P@
-NM = @NM@
-NMEDIT = @NMEDIT@
-NROFF = @NROFF@
-NSS_LIBS = @NSS_LIBS@
-OBJDUMP = @OBJDUMP@
-OBJEXT = @OBJEXT@
-OTOOL = @OTOOL@
-OTOOL64 = @OTOOL64@
-PACKAGE = @PACKAGE@
-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
-PACKAGE_NAME = @PACKAGE_NAME@
-PACKAGE_STRING = @PACKAGE_STRING@
-PACKAGE_TARNAME = @PACKAGE_TARNAME@
-PACKAGE_URL = @PACKAGE_URL@
-PACKAGE_VERSION = @PACKAGE_VERSION@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-PERL = @PERL@
-PKGADD_NAME = "@PACKAGE@-@VERSION@ - @PKGADD_NAME@"
-PKGADD_PKG = "@PKGADD_PKG@"
-PKGADD_VENDOR = "@PKGADD_VENDOR@"
-PKGCONFIG = @PKGCONFIG@
-RANDOM_FILE = @RANDOM_FILE@
-RANLIB = @RANLIB@
-REQUIRE_LIB_DEPS = @REQUIRE_LIB_DEPS@
-SED = @SED@
-SET_MAKE = @SET_MAKE@
-SHELL = @SHELL@
-SSL_BACKENDS = @SSL_BACKENDS@
-SSL_ENABLED = @SSL_ENABLED@
-SSL_LIBS = @SSL_LIBS@
-STRIP = @STRIP@
-SUPPORT_FEATURES = @SUPPORT_FEATURES@
-SUPPORT_PROTOCOLS = @SUPPORT_PROTOCOLS@
-USE_ARES = @USE_ARES@
-USE_AXTLS = @USE_AXTLS@
-USE_CYASSL = @USE_CYASSL@
-USE_DARWINSSL = @USE_DARWINSSL@
-USE_GNUTLS = @USE_GNUTLS@
-USE_GNUTLS_NETTLE = @USE_GNUTLS_NETTLE@
-USE_LIBRTMP = @USE_LIBRTMP@
-USE_LIBSSH = @USE_LIBSSH@
-USE_LIBSSH2 = @USE_LIBSSH2@
-USE_MBEDTLS = @USE_MBEDTLS@
-USE_MESALINK = @USE_MESALINK@
-USE_NGHTTP2 = @USE_NGHTTP2@
-USE_NSS = @USE_NSS@
-USE_OPENLDAP = @USE_OPENLDAP@
-USE_POLARSSL = @USE_POLARSSL@
-USE_SCHANNEL = @USE_SCHANNEL@
-USE_UNIX_SOCKETS = @USE_UNIX_SOCKETS@
-USE_WINDOWS_SSPI = @USE_WINDOWS_SSPI@
-VERSION = @VERSION@
-VERSIONNUM = @VERSIONNUM@
-ZLIB_LIBS = @ZLIB_LIBS@
-ZSH_FUNCTIONS_DIR = @ZSH_FUNCTIONS_DIR@
-abs_builddir = @abs_builddir@
-abs_srcdir = @abs_srcdir@
-abs_top_builddir = @abs_top_builddir@
-abs_top_srcdir = @abs_top_srcdir@
-ac_ct_AR = @ac_ct_AR@
-ac_ct_CC = @ac_ct_CC@
-ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
-am__include = @am__include@
-am__leading_dot = @am__leading_dot@
-am__quote = @am__quote@
-am__tar = @am__tar@
-am__untar = @am__untar@
-bindir = @bindir@
-build = @build@
-build_alias = @build_alias@
-build_cpu = @build_cpu@
-build_os = @build_os@
-build_vendor = @build_vendor@
-builddir = @builddir@
-datadir = @datadir@
-datarootdir = @datarootdir@
-docdir = @docdir@
-dvidir = @dvidir@
-exec_prefix = @exec_prefix@
-host = @host@
-host_alias = @host_alias@
-host_cpu = @host_cpu@
-host_os = @host_os@
-host_vendor = @host_vendor@
-htmldir = @htmldir@
-includedir = @includedir@
-infodir = @infodir@
-install_sh = @install_sh@
-libdir = @libdir@
-libexecdir = @libexecdir@
-libext = @libext@
-localedir = @localedir@
-localstatedir = @localstatedir@
-mandir = @mandir@
-mkdir_p = @mkdir_p@
-oldincludedir = @oldincludedir@
-pdfdir = @pdfdir@
-prefix = @prefix@
-program_transform_name = @program_transform_name@
-psdir = @psdir@
-runstatedir = @runstatedir@
-sbindir = @sbindir@
-sharedstatedir = @sharedstatedir@
-srcdir = @srcdir@
-subdirs = @subdirs@
-sysconfdir = @sysconfdir@
-target_alias = @target_alias@
-top_build_prefix = @top_build_prefix@
-top_builddir = @top_builddir@
-top_srcdir = @top_srcdir@
-PKGADD_ARCH = "@host_cpu@"
-PKGADD_DESC = "@PACKAGE@-@VERSION@ - @PKGADD_NAME@"
-PKGADD_CLASSES = none
-PKGADD_BASEDIR = /
-PKGADD_FILE = ${PKGADD_PKG}-@PACKAGE@-@VERSION@-@host@.pkg
-all: all-am
-
-.SUFFIXES:
-$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
-       @for dep in $?; do \
-         case '$(am__configure_deps)' in \
-           *$$dep*) \
-             ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
-               && { if test -f $@; then exit 0; else break; fi; }; \
-             exit 1;; \
-         esac; \
-       done; \
-       echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign packages/Solaris/Makefile'; \
-       $(am__cd) $(top_srcdir) && \
-         $(AUTOMAKE) --foreign packages/Solaris/Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
-       @case '$?' in \
-         *config.status*) \
-           cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
-         *) \
-           echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \
-           cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
-       esac;
-
-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
-       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-
-$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
-       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
-       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(am__aclocal_m4_deps):
-
-mostlyclean-libtool:
-       -rm -f *.lo
-
-clean-libtool:
-       -rm -rf .libs _libs
-tags TAGS:
-
-ctags CTAGS:
-
-cscope cscopelist:
-
-
-distdir: $(BUILT_SOURCES)
-       $(MAKE) $(AM_MAKEFLAGS) distdir-am
-
-distdir-am: $(DISTFILES)
-       @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-       topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-       list='$(DISTFILES)'; \
-         dist_files=`for file in $$list; do echo $$file; done | \
-         sed -e "s|^$$srcdirstrip/||;t" \
-             -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
-       case $$dist_files in \
-         */*) $(MKDIR_P) `echo "$$dist_files" | \
-                          sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
-                          sort -u` ;; \
-       esac; \
-       for file in $$dist_files; do \
-         if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
-         if test -d $$d/$$file; then \
-           dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
-           if test -d "$(distdir)/$$file"; then \
-             find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-           fi; \
-           if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-             cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
-             find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-           fi; \
-           cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
-         else \
-           test -f "$(distdir)/$$file" \
-           || cp -p $$d/$$file "$(distdir)/$$file" \
-           || exit 1; \
-         fi; \
-       done
-check-am: all-am
-check: check-am
-all-am: Makefile
-installdirs:
-install: install-am
-install-exec: install-exec-am
-install-data: install-data-am
-uninstall: uninstall-am
-
-install-am: all-am
-       @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-am
-install-strip:
-       if test -z '$(STRIP)'; then \
-         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-             install; \
-       else \
-         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-           "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
-       fi
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
-       -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
-       -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
-
-maintainer-clean-generic:
-       @echo "This command is intended for maintainers to use"
-       @echo "it deletes files that may require special tools to rebuild."
-clean: clean-am
-
-clean-am: clean-generic clean-libtool mostlyclean-am
-
-distclean: distclean-am
-       -rm -f Makefile
-distclean-am: clean-am distclean-generic
-
-dvi: dvi-am
-
-dvi-am:
-
-html: html-am
-
-html-am:
-
-info: info-am
-
-info-am:
-
-install-data-am:
-
-install-dvi: install-dvi-am
-
-install-dvi-am:
-
-install-exec-am:
-
-install-html: install-html-am
-
-install-html-am:
-
-install-info: install-info-am
-
-install-info-am:
-
-install-man:
-
-install-pdf: install-pdf-am
-
-install-pdf-am:
-
-install-ps: install-ps-am
-
-install-ps-am:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-am
-       -rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-am
-
-mostlyclean-am: mostlyclean-generic mostlyclean-libtool
-
-pdf: pdf-am
-
-pdf-am:
-
-ps: ps-am
-
-ps-am:
-
-uninstall-am:
-
-.MAKE: install-am install-strip
-
-.PHONY: all all-am check check-am clean clean-generic clean-libtool \
-       cscopelist-am ctags-am distclean distclean-generic \
-       distclean-libtool distdir dvi dvi-am html html-am info info-am \
-       install install-am install-data install-data-am install-dvi \
-       install-dvi-am install-exec install-exec-am install-html \
-       install-html-am install-info install-info-am install-man \
-       install-pdf install-pdf-am install-ps install-ps-am \
-       install-strip installcheck installcheck-am installdirs \
-       maintainer-clean maintainer-clean-generic mostlyclean \
-       mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
-       tags-am uninstall uninstall-am
-
-.PRECIOUS: Makefile
-
-
-package:
-       if [ ! -f release ]; then echo 0 > release; fi
-       if [ `find root -newer release -print|wc -l` -gt 0 ]; then expr `cat release` + 1 > release; fi
-       echo PKG=${PKGADD_PKG} > pkginfo
-       echo NAME=${PKGADD_NAME} >> pkginfo
-       echo VENDOR=${PKGADD_VENDOR} >> pkginfo
-       echo ARCH=${PKGADD_ARCH} >> pkginfo
-       echo DESC=${PKGADD_DESC} >> pkginfo
-       echo CLASSES=${PKGADD_CLASSES} >> pkginfo
-       echo BASEDIR=${PKGADD_BASEDIR} >> pkginfo
-       echo CATEGORY=application >> pkginfo
-       echo VERSION=`cat ./release` >> pkginfo
-       echo > prototype
-       for subdir in opt var etc usr; \
-       do if [ -d root/$$subdir ]; then \
-               pkgproto root/$$subdir=$$subdir >> prototype;\
-       fi; done
-       for file in pkginfo preinstall postinstall copyright; \
-       do if [ -f $$file ]; then \
-               echo "i $$file=$$file" >> prototype; \
-       fi; done
-       rm -rf ./tmp
-       mkdir ./tmp
-       pkgmk -o -d ./tmp
-       pkgtrans -so ./tmp ${top_srcdir}/../${PKGADD_FILE} ${PKGADD_PKG}
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
index ba70de3..6e94d84 100644 (file)
@@ -35,7 +35,7 @@ SOURCE \
   socks_sspi.c curl_sspi.c slist.c nonblock.c curl_memrchr.c imap.c    \
   pop3.c smtp.c pingpong.c rtsp.c curl_threads.c warnless.c hmac.c     \
   vtls/polarssl.c curl_rtmp.c openldap.c curl_gethostname.c gopher.c   \
-  vtls/axtls.c idn_win32.c vtls/cyassl.c http_proxy.c non-ascii.c      \
+  idn_win32.c vtls/cyassl.c http_proxy.c non-ascii.c                   \
   asyn-ares.c asyn-thread.c curl_gssapi.c http_ntlm.c curl_ntlm_wb.c   \
   curl_ntlm_core.c curl_sasl.c vtls/schannel.c curl_multibyte.c        \
   vtls/darwinssl.c conncache.c curl_sasl_sspi.c smb.c curl_endian.c    \
diff --git a/packages/Win32/Makefile.am b/packages/Win32/Makefile.am
deleted file mode 100644 (file)
index 93350ea..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-SUBDIRS = cygwin
-
-EXTRA_DIST = README
diff --git a/packages/Win32/Makefile.in b/packages/Win32/Makefile.in
deleted file mode 100644 (file)
index 665df57..0000000
+++ /dev/null
@@ -1,725 +0,0 @@
-# Makefile.in generated by automake 1.16.1 from Makefile.am.
-# @configure_input@
-
-# Copyright (C) 1994-2018 Free Software Foundation, Inc.
-
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
-@SET_MAKE@
-VPATH = @srcdir@
-am__is_gnu_make = { \
-  if test -z '$(MAKELEVEL)'; then \
-    false; \
-  elif test -n '$(MAKE_HOST)'; then \
-    true; \
-  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
-    true; \
-  else \
-    false; \
-  fi; \
-}
-am__make_running_with_option = \
-  case $${target_option-} in \
-      ?) ;; \
-      *) echo "am__make_running_with_option: internal error: invalid" \
-              "target option '$${target_option-}' specified" >&2; \
-         exit 1;; \
-  esac; \
-  has_opt=no; \
-  sane_makeflags=$$MAKEFLAGS; \
-  if $(am__is_gnu_make); then \
-    sane_makeflags=$$MFLAGS; \
-  else \
-    case $$MAKEFLAGS in \
-      *\\[\ \  ]*) \
-        bs=\\; \
-        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
-          | sed "s/$$bs$$bs[$$bs $$bs  ]*//g"`;; \
-    esac; \
-  fi; \
-  skip_next=no; \
-  strip_trailopt () \
-  { \
-    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
-  }; \
-  for flg in $$sane_makeflags; do \
-    test $$skip_next = yes && { skip_next=no; continue; }; \
-    case $$flg in \
-      *=*|--*) continue;; \
-        -*I) strip_trailopt 'I'; skip_next=yes;; \
-      -*I?*) strip_trailopt 'I';; \
-        -*O) strip_trailopt 'O'; skip_next=yes;; \
-      -*O?*) strip_trailopt 'O';; \
-        -*l) strip_trailopt 'l'; skip_next=yes;; \
-      -*l?*) strip_trailopt 'l';; \
-      -[dEDm]) skip_next=yes;; \
-      -[JT]) skip_next=yes;; \
-    esac; \
-    case $$flg in \
-      *$$target_option*) has_opt=yes; break;; \
-    esac; \
-  done; \
-  test $$has_opt = yes
-am__make_dryrun = (target_option=n; $(am__make_running_with_option))
-am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
-pkgdatadir = $(datadir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkglibexecdir = $(libexecdir)/@PACKAGE@
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-build_triplet = @build@
-host_triplet = @host@
-subdir = packages/Win32
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/ax_code_coverage.m4 \
-       $(top_srcdir)/m4/ax_compile_check_sizeof.m4 \
-       $(top_srcdir)/m4/curl-compilers.m4 \
-       $(top_srcdir)/m4/curl-confopts.m4 \
-       $(top_srcdir)/m4/curl-functions.m4 \
-       $(top_srcdir)/m4/curl-openssl.m4 \
-       $(top_srcdir)/m4/curl-override.m4 \
-       $(top_srcdir)/m4/curl-reentrant.m4 $(top_srcdir)/m4/libtool.m4 \
-       $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
-       $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
-       $(top_srcdir)/m4/xc-am-iface.m4 \
-       $(top_srcdir)/m4/xc-cc-check.m4 \
-       $(top_srcdir)/m4/xc-lt-iface.m4 \
-       $(top_srcdir)/m4/xc-translit.m4 \
-       $(top_srcdir)/m4/xc-val-flgs.m4 \
-       $(top_srcdir)/m4/zz40-xc-ovr.m4 \
-       $(top_srcdir)/m4/zz50-xc-ovr.m4 \
-       $(top_srcdir)/m4/zz60-xc-ovr.m4 $(top_srcdir)/acinclude.m4 \
-       $(top_srcdir)/configure.ac
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
-       $(ACLOCAL_M4)
-DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
-mkinstalldirs = $(install_sh) -d
-CONFIG_HEADER = $(top_builddir)/lib/curl_config.h
-CONFIG_CLEAN_FILES =
-CONFIG_CLEAN_VPATH_FILES =
-AM_V_P = $(am__v_P_@AM_V@)
-am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
-am__v_P_0 = false
-am__v_P_1 = :
-AM_V_GEN = $(am__v_GEN_@AM_V@)
-am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
-am__v_GEN_0 = @echo "  GEN     " $@;
-am__v_GEN_1 = 
-AM_V_at = $(am__v_at_@AM_V@)
-am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
-am__v_at_0 = @
-am__v_at_1 = 
-SOURCES =
-DIST_SOURCES =
-RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \
-       ctags-recursive dvi-recursive html-recursive info-recursive \
-       install-data-recursive install-dvi-recursive \
-       install-exec-recursive install-html-recursive \
-       install-info-recursive install-pdf-recursive \
-       install-ps-recursive install-recursive installcheck-recursive \
-       installdirs-recursive pdf-recursive ps-recursive \
-       tags-recursive uninstall-recursive
-am__can_run_installinfo = \
-  case $$AM_UPDATE_INFO_DIR in \
-    n|no|NO) false;; \
-    *) (install-info --version) >/dev/null 2>&1;; \
-  esac
-RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive        \
-  distclean-recursive maintainer-clean-recursive
-am__recursive_targets = \
-  $(RECURSIVE_TARGETS) \
-  $(RECURSIVE_CLEAN_TARGETS) \
-  $(am__extra_recursive_targets)
-AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \
-       distdir distdir-am
-am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
-# Read a list of newline-separated strings from the standard input,
-# and print each of them once, without duplicates.  Input order is
-# *not* preserved.
-am__uniquify_input = $(AWK) '\
-  BEGIN { nonempty = 0; } \
-  { items[$$0] = 1; nonempty = 1; } \
-  END { if (nonempty) { for (i in items) print i; }; } \
-'
-# Make sure the list of sources is unique.  This is necessary because,
-# e.g., the same source file might be shared among _SOURCES variables
-# for different programs/libraries.
-am__define_uniq_tagged_files = \
-  list='$(am__tagged_files)'; \
-  unique=`for i in $$list; do \
-    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-  done | $(am__uniquify_input)`
-ETAGS = etags
-CTAGS = ctags
-DIST_SUBDIRS = $(SUBDIRS)
-am__DIST_COMMON = $(srcdir)/Makefile.in README
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-am__relativize = \
-  dir0=`pwd`; \
-  sed_first='s,^\([^/]*\)/.*$$,\1,'; \
-  sed_rest='s,^[^/]*/*,,'; \
-  sed_last='s,^.*/\([^/]*\)$$,\1,'; \
-  sed_butlast='s,/*[^/]*$$,,'; \
-  while test -n "$$dir1"; do \
-    first=`echo "$$dir1" | sed -e "$$sed_first"`; \
-    if test "$$first" != "."; then \
-      if test "$$first" = ".."; then \
-        dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \
-        dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \
-      else \
-        first2=`echo "$$dir2" | sed -e "$$sed_first"`; \
-        if test "$$first2" = "$$first"; then \
-          dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \
-        else \
-          dir2="../$$dir2"; \
-        fi; \
-        dir0="$$dir0"/"$$first"; \
-      fi; \
-    fi; \
-    dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \
-  done; \
-  reldir="$$dir2"
-ACLOCAL = @ACLOCAL@
-AMTAR = @AMTAR@
-AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
-AR = @AR@
-AR_FLAGS = @AR_FLAGS@
-AS = @AS@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-BLANK_AT_MAKETIME = @BLANK_AT_MAKETIME@
-CC = @CC@
-CCDEPMODE = @CCDEPMODE@
-CFLAGS = @CFLAGS@
-CFLAG_CURL_SYMBOL_HIDING = @CFLAG_CURL_SYMBOL_HIDING@
-CODE_COVERAGE_CFLAGS = @CODE_COVERAGE_CFLAGS@
-CODE_COVERAGE_CPPFLAGS = @CODE_COVERAGE_CPPFLAGS@
-CODE_COVERAGE_CXXFLAGS = @CODE_COVERAGE_CXXFLAGS@
-CODE_COVERAGE_ENABLED = @CODE_COVERAGE_ENABLED@
-CODE_COVERAGE_LDFLAGS = @CODE_COVERAGE_LDFLAGS@
-CODE_COVERAGE_LIBS = @CODE_COVERAGE_LIBS@
-CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@
-CPP = @CPP@
-CPPFLAGS = @CPPFLAGS@
-CPPFLAG_CURL_STATICLIB = @CPPFLAG_CURL_STATICLIB@
-CURLVERSION = @CURLVERSION@
-CURL_CA_BUNDLE = @CURL_CA_BUNDLE@
-CURL_CFLAG_EXTRAS = @CURL_CFLAG_EXTRAS@
-CURL_DISABLE_DICT = @CURL_DISABLE_DICT@
-CURL_DISABLE_FILE = @CURL_DISABLE_FILE@
-CURL_DISABLE_FTP = @CURL_DISABLE_FTP@
-CURL_DISABLE_GOPHER = @CURL_DISABLE_GOPHER@
-CURL_DISABLE_HTTP = @CURL_DISABLE_HTTP@
-CURL_DISABLE_IMAP = @CURL_DISABLE_IMAP@
-CURL_DISABLE_LDAP = @CURL_DISABLE_LDAP@
-CURL_DISABLE_LDAPS = @CURL_DISABLE_LDAPS@
-CURL_DISABLE_POP3 = @CURL_DISABLE_POP3@
-CURL_DISABLE_PROXY = @CURL_DISABLE_PROXY@
-CURL_DISABLE_RTSP = @CURL_DISABLE_RTSP@
-CURL_DISABLE_SMB = @CURL_DISABLE_SMB@
-CURL_DISABLE_SMTP = @CURL_DISABLE_SMTP@
-CURL_DISABLE_TELNET = @CURL_DISABLE_TELNET@
-CURL_DISABLE_TFTP = @CURL_DISABLE_TFTP@
-CURL_LT_SHLIB_VERSIONED_FLAVOUR = @CURL_LT_SHLIB_VERSIONED_FLAVOUR@
-CURL_NETWORK_AND_TIME_LIBS = @CURL_NETWORK_AND_TIME_LIBS@
-CURL_NETWORK_LIBS = @CURL_NETWORK_LIBS@
-CURL_WITH_MULTI_SSL = @CURL_WITH_MULTI_SSL@
-CYGPATH_W = @CYGPATH_W@
-DEFAULT_SSL_BACKEND = @DEFAULT_SSL_BACKEND@
-DEFS = @DEFS@
-DEPDIR = @DEPDIR@
-DLLTOOL = @DLLTOOL@
-DSYMUTIL = @DSYMUTIL@
-DUMPBIN = @DUMPBIN@
-ECHO_C = @ECHO_C@
-ECHO_N = @ECHO_N@
-ECHO_T = @ECHO_T@
-EGREP = @EGREP@
-ENABLE_SHARED = @ENABLE_SHARED@
-ENABLE_STATIC = @ENABLE_STATIC@
-EXEEXT = @EXEEXT@
-FGREP = @FGREP@
-GCOV = @GCOV@
-GENHTML = @GENHTML@
-GREP = @GREP@
-HAVE_BROTLI = @HAVE_BROTLI@
-HAVE_GNUTLS_SRP = @HAVE_GNUTLS_SRP@
-HAVE_LDAP_SSL = @HAVE_LDAP_SSL@
-HAVE_LIBZ = @HAVE_LIBZ@
-HAVE_OPENSSL_SRP = @HAVE_OPENSSL_SRP@
-IDN_ENABLED = @IDN_ENABLED@
-INSTALL = @INSTALL@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-IPV6_ENABLED = @IPV6_ENABLED@
-LCOV = @LCOV@
-LD = @LD@
-LDFLAGS = @LDFLAGS@
-LIBCURL_LIBS = @LIBCURL_LIBS@
-LIBMETALINK_CPPFLAGS = @LIBMETALINK_CPPFLAGS@
-LIBMETALINK_LDFLAGS = @LIBMETALINK_LDFLAGS@
-LIBMETALINK_LIBS = @LIBMETALINK_LIBS@
-LIBOBJS = @LIBOBJS@
-LIBS = @LIBS@
-LIBTOOL = @LIBTOOL@
-LIPO = @LIPO@
-LN_S = @LN_S@
-LTLIBOBJS = @LTLIBOBJS@
-LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
-MAINT = @MAINT@
-MAKEINFO = @MAKEINFO@
-MANIFEST_TOOL = @MANIFEST_TOOL@
-MANOPT = @MANOPT@
-MKDIR_P = @MKDIR_P@
-NM = @NM@
-NMEDIT = @NMEDIT@
-NROFF = @NROFF@
-NSS_LIBS = @NSS_LIBS@
-OBJDUMP = @OBJDUMP@
-OBJEXT = @OBJEXT@
-OTOOL = @OTOOL@
-OTOOL64 = @OTOOL64@
-PACKAGE = @PACKAGE@
-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
-PACKAGE_NAME = @PACKAGE_NAME@
-PACKAGE_STRING = @PACKAGE_STRING@
-PACKAGE_TARNAME = @PACKAGE_TARNAME@
-PACKAGE_URL = @PACKAGE_URL@
-PACKAGE_VERSION = @PACKAGE_VERSION@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-PERL = @PERL@
-PKGADD_NAME = @PKGADD_NAME@
-PKGADD_PKG = @PKGADD_PKG@
-PKGADD_VENDOR = @PKGADD_VENDOR@
-PKGCONFIG = @PKGCONFIG@
-RANDOM_FILE = @RANDOM_FILE@
-RANLIB = @RANLIB@
-REQUIRE_LIB_DEPS = @REQUIRE_LIB_DEPS@
-SED = @SED@
-SET_MAKE = @SET_MAKE@
-SHELL = @SHELL@
-SSL_BACKENDS = @SSL_BACKENDS@
-SSL_ENABLED = @SSL_ENABLED@
-SSL_LIBS = @SSL_LIBS@
-STRIP = @STRIP@
-SUPPORT_FEATURES = @SUPPORT_FEATURES@
-SUPPORT_PROTOCOLS = @SUPPORT_PROTOCOLS@
-USE_ARES = @USE_ARES@
-USE_AXTLS = @USE_AXTLS@
-USE_CYASSL = @USE_CYASSL@
-USE_DARWINSSL = @USE_DARWINSSL@
-USE_GNUTLS = @USE_GNUTLS@
-USE_GNUTLS_NETTLE = @USE_GNUTLS_NETTLE@
-USE_LIBRTMP = @USE_LIBRTMP@
-USE_LIBSSH = @USE_LIBSSH@
-USE_LIBSSH2 = @USE_LIBSSH2@
-USE_MBEDTLS = @USE_MBEDTLS@
-USE_MESALINK = @USE_MESALINK@
-USE_NGHTTP2 = @USE_NGHTTP2@
-USE_NSS = @USE_NSS@
-USE_OPENLDAP = @USE_OPENLDAP@
-USE_POLARSSL = @USE_POLARSSL@
-USE_SCHANNEL = @USE_SCHANNEL@
-USE_UNIX_SOCKETS = @USE_UNIX_SOCKETS@
-USE_WINDOWS_SSPI = @USE_WINDOWS_SSPI@
-VERSION = @VERSION@
-VERSIONNUM = @VERSIONNUM@
-ZLIB_LIBS = @ZLIB_LIBS@
-ZSH_FUNCTIONS_DIR = @ZSH_FUNCTIONS_DIR@
-abs_builddir = @abs_builddir@
-abs_srcdir = @abs_srcdir@
-abs_top_builddir = @abs_top_builddir@
-abs_top_srcdir = @abs_top_srcdir@
-ac_ct_AR = @ac_ct_AR@
-ac_ct_CC = @ac_ct_CC@
-ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
-am__include = @am__include@
-am__leading_dot = @am__leading_dot@
-am__quote = @am__quote@
-am__tar = @am__tar@
-am__untar = @am__untar@
-bindir = @bindir@
-build = @build@
-build_alias = @build_alias@
-build_cpu = @build_cpu@
-build_os = @build_os@
-build_vendor = @build_vendor@
-builddir = @builddir@
-datadir = @datadir@
-datarootdir = @datarootdir@
-docdir = @docdir@
-dvidir = @dvidir@
-exec_prefix = @exec_prefix@
-host = @host@
-host_alias = @host_alias@
-host_cpu = @host_cpu@
-host_os = @host_os@
-host_vendor = @host_vendor@
-htmldir = @htmldir@
-includedir = @includedir@
-infodir = @infodir@
-install_sh = @install_sh@
-libdir = @libdir@
-libexecdir = @libexecdir@
-libext = @libext@
-localedir = @localedir@
-localstatedir = @localstatedir@
-mandir = @mandir@
-mkdir_p = @mkdir_p@
-oldincludedir = @oldincludedir@
-pdfdir = @pdfdir@
-prefix = @prefix@
-program_transform_name = @program_transform_name@
-psdir = @psdir@
-runstatedir = @runstatedir@
-sbindir = @sbindir@
-sharedstatedir = @sharedstatedir@
-srcdir = @srcdir@
-subdirs = @subdirs@
-sysconfdir = @sysconfdir@
-target_alias = @target_alias@
-top_build_prefix = @top_build_prefix@
-top_builddir = @top_builddir@
-top_srcdir = @top_srcdir@
-SUBDIRS = cygwin
-EXTRA_DIST = README
-all: all-recursive
-
-.SUFFIXES:
-$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
-       @for dep in $?; do \
-         case '$(am__configure_deps)' in \
-           *$$dep*) \
-             ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
-               && { if test -f $@; then exit 0; else break; fi; }; \
-             exit 1;; \
-         esac; \
-       done; \
-       echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign packages/Win32/Makefile'; \
-       $(am__cd) $(top_srcdir) && \
-         $(AUTOMAKE) --foreign packages/Win32/Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
-       @case '$?' in \
-         *config.status*) \
-           cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
-         *) \
-           echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \
-           cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
-       esac;
-
-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
-       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-
-$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
-       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
-       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(am__aclocal_m4_deps):
-
-mostlyclean-libtool:
-       -rm -f *.lo
-
-clean-libtool:
-       -rm -rf .libs _libs
-
-# This directory's subdirectories are mostly independent; you can cd
-# into them and run 'make' without going through this Makefile.
-# To change the values of 'make' variables: instead of editing Makefiles,
-# (1) if the variable is set in 'config.status', edit 'config.status'
-#     (which will cause the Makefiles to be regenerated when you run 'make');
-# (2) otherwise, pass the desired values on the 'make' command line.
-$(am__recursive_targets):
-       @fail=; \
-       if $(am__make_keepgoing); then \
-         failcom='fail=yes'; \
-       else \
-         failcom='exit 1'; \
-       fi; \
-       dot_seen=no; \
-       target=`echo $@ | sed s/-recursive//`; \
-       case "$@" in \
-         distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
-         *) list='$(SUBDIRS)' ;; \
-       esac; \
-       for subdir in $$list; do \
-         echo "Making $$target in $$subdir"; \
-         if test "$$subdir" = "."; then \
-           dot_seen=yes; \
-           local_target="$$target-am"; \
-         else \
-           local_target="$$target"; \
-         fi; \
-         ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
-         || eval $$failcom; \
-       done; \
-       if test "$$dot_seen" = "no"; then \
-         $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
-       fi; test -z "$$fail"
-
-ID: $(am__tagged_files)
-       $(am__define_uniq_tagged_files); mkid -fID $$unique
-tags: tags-recursive
-TAGS: tags
-
-tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
-       set x; \
-       here=`pwd`; \
-       if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
-         include_option=--etags-include; \
-         empty_fix=.; \
-       else \
-         include_option=--include; \
-         empty_fix=; \
-       fi; \
-       list='$(SUBDIRS)'; for subdir in $$list; do \
-         if test "$$subdir" = .; then :; else \
-           test ! -f $$subdir/TAGS || \
-             set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
-         fi; \
-       done; \
-       $(am__define_uniq_tagged_files); \
-       shift; \
-       if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
-         test -n "$$unique" || unique=$$empty_fix; \
-         if test $$# -gt 0; then \
-           $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-             "$$@" $$unique; \
-         else \
-           $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-             $$unique; \
-         fi; \
-       fi
-ctags: ctags-recursive
-
-CTAGS: ctags
-ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
-       $(am__define_uniq_tagged_files); \
-       test -z "$(CTAGS_ARGS)$$unique" \
-         || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
-            $$unique
-
-GTAGS:
-       here=`$(am__cd) $(top_builddir) && pwd` \
-         && $(am__cd) $(top_srcdir) \
-         && gtags -i $(GTAGS_ARGS) "$$here"
-cscopelist: cscopelist-recursive
-
-cscopelist-am: $(am__tagged_files)
-       list='$(am__tagged_files)'; \
-       case "$(srcdir)" in \
-         [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
-         *) sdir=$(subdir)/$(srcdir) ;; \
-       esac; \
-       for i in $$list; do \
-         if test -f "$$i"; then \
-           echo "$(subdir)/$$i"; \
-         else \
-           echo "$$sdir/$$i"; \
-         fi; \
-       done >> $(top_builddir)/cscope.files
-
-distclean-tags:
-       -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-
-distdir: $(BUILT_SOURCES)
-       $(MAKE) $(AM_MAKEFLAGS) distdir-am
-
-distdir-am: $(DISTFILES)
-       @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-       topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-       list='$(DISTFILES)'; \
-         dist_files=`for file in $$list; do echo $$file; done | \
-         sed -e "s|^$$srcdirstrip/||;t" \
-             -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
-       case $$dist_files in \
-         */*) $(MKDIR_P) `echo "$$dist_files" | \
-                          sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
-                          sort -u` ;; \
-       esac; \
-       for file in $$dist_files; do \
-         if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
-         if test -d $$d/$$file; then \
-           dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
-           if test -d "$(distdir)/$$file"; then \
-             find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-           fi; \
-           if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-             cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
-             find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-           fi; \
-           cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
-         else \
-           test -f "$(distdir)/$$file" \
-           || cp -p $$d/$$file "$(distdir)/$$file" \
-           || exit 1; \
-         fi; \
-       done
-       @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
-         if test "$$subdir" = .; then :; else \
-           $(am__make_dryrun) \
-             || test -d "$(distdir)/$$subdir" \
-             || $(MKDIR_P) "$(distdir)/$$subdir" \
-             || exit 1; \
-           dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
-           $(am__relativize); \
-           new_distdir=$$reldir; \
-           dir1=$$subdir; dir2="$(top_distdir)"; \
-           $(am__relativize); \
-           new_top_distdir=$$reldir; \
-           echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \
-           echo "     am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \
-           ($(am__cd) $$subdir && \
-             $(MAKE) $(AM_MAKEFLAGS) \
-               top_distdir="$$new_top_distdir" \
-               distdir="$$new_distdir" \
-               am__remove_distdir=: \
-               am__skip_length_check=: \
-               am__skip_mode_fix=: \
-               distdir) \
-             || exit 1; \
-         fi; \
-       done
-check-am: all-am
-check: check-recursive
-all-am: Makefile
-installdirs: installdirs-recursive
-installdirs-am:
-install: install-recursive
-install-exec: install-exec-recursive
-install-data: install-data-recursive
-uninstall: uninstall-recursive
-
-install-am: all-am
-       @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-recursive
-install-strip:
-       if test -z '$(STRIP)'; then \
-         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-             install; \
-       else \
-         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-           "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
-       fi
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
-       -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
-       -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
-
-maintainer-clean-generic:
-       @echo "This command is intended for maintainers to use"
-       @echo "it deletes files that may require special tools to rebuild."
-clean: clean-recursive
-
-clean-am: clean-generic clean-libtool mostlyclean-am
-
-distclean: distclean-recursive
-       -rm -f Makefile
-distclean-am: clean-am distclean-generic distclean-tags
-
-dvi: dvi-recursive
-
-dvi-am:
-
-html: html-recursive
-
-html-am:
-
-info: info-recursive
-
-info-am:
-
-install-data-am:
-
-install-dvi: install-dvi-recursive
-
-install-dvi-am:
-
-install-exec-am:
-
-install-html: install-html-recursive
-
-install-html-am:
-
-install-info: install-info-recursive
-
-install-info-am:
-
-install-man:
-
-install-pdf: install-pdf-recursive
-
-install-pdf-am:
-
-install-ps: install-ps-recursive
-
-install-ps-am:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-recursive
-       -rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-recursive
-
-mostlyclean-am: mostlyclean-generic mostlyclean-libtool
-
-pdf: pdf-recursive
-
-pdf-am:
-
-ps: ps-recursive
-
-ps-am:
-
-uninstall-am:
-
-.MAKE: $(am__recursive_targets) install-am install-strip
-
-.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \
-       check-am clean clean-generic clean-libtool cscopelist-am ctags \
-       ctags-am distclean distclean-generic distclean-libtool \
-       distclean-tags distdir dvi dvi-am html html-am info info-am \
-       install install-am install-data install-data-am install-dvi \
-       install-dvi-am install-exec install-exec-am install-html \
-       install-html-am install-info install-info-am install-man \
-       install-pdf install-pdf-am install-ps install-ps-am \
-       install-strip installcheck installcheck-am installdirs \
-       installdirs-am maintainer-clean maintainer-clean-generic \
-       mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \
-       ps ps-am tags tags-am uninstall uninstall-am
-
-.PRECIOUS: Makefile
-
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/packages/Win32/README b/packages/Win32/README
deleted file mode 100644 (file)
index f219674..0000000
+++ /dev/null
@@ -1,53 +0,0 @@
-Author: Jörn Hartroth
-
-DESCRIPTION
-
-(If you're only looking for precompiled win32 binaries, go visit
-https://curl.haxx.se/download.html)
-
-Packaging of the curl binaries for Win32 should at this point in time be based
-on the InfoZip (zip/unzip) archiver family as the de-facto standard for
-Windows archives. A package should contain the main binary curl.exe along with
-the appropriate documentation and license information files. For development
-releases, you should also include the header directory and probably the
-compiled binaries of libcurl and the appropriate Makefiles/project definition
-files for the compiler used.
-
-A simple packaging mechanism can be based on a set of batch files which call
-zip.exe with the appropriate files from the curl distribution - see the
-samples included below (Long lines have been split with "\" as the split
-marker, you'll want to rejoin the pieces to be all on one line in the batch
-file). Call any of these batch files - after compiling the curl binaries -
-with a single parameter specifying the name of the archive file to be created.
-
-It is implicitly assumed that all of the binary files (curl.exe, libcurl.a,
-etc) have previously been copied to the main directory of the curl source
-package (the directory where the main README resides), because that is where
-they should end up in the zip archive. The archive should *not* be built with
-absolute path information because the user will want to locally extract the
-archive contents and shift the binaries to his executable directory.
-
-SCRIPT_TEMPLATES
-
-curlpkg.bat:
-       zip -9 %1 curl.exe CHANGES LEGAL MPL-1.0.txt README \
-        docs/FAQ docs/FEATURES docs/README.curl docs/README.win32 docs/TODO
-
-curldevpkg.bat:
-       zip -9 %1 curl.exe include\README include\curl\*.h CHANGES docs\* \
-         curl.spec curl-ssl.spec LEGAL lib/Makefile.m32 src/Makefile.m32 \
-         libcurl.a libcurl.dll libcurldll.a MPL-1.0.txt README
-
-PROCEDURE_EXAMPLE
-
-A standard packaging routine (for MingW32) using the above batch files could
-go like this:
-(No SSL)                                       (With SSL)
-cd <curl-sourcedir>\lib                        cd <curl-sourcedir>\lib
-make -f Makefile.m32                   make -f Makefile.m32 SSL=1
-cd ..\src                                      cd ..\src
-make -f Makefile.m32                   make -f Makefile.m32 SSL=1
-cd ..                                          cd ..
-copy lib\libcurl.a .                   copy lib\libcurl.a .
-copy src\curl.exe .                    copy src\curl.exe .
-curlpkg curl-win32-nossl.zip           curlpkg curl-win32-ssl.zip
diff --git a/packages/Win32/cygwin/Makefile.am b/packages/Win32/cygwin/Makefile.am
deleted file mode 100644 (file)
index b56148d..0000000
+++ /dev/null
@@ -1,62 +0,0 @@
-EXTRA_DIST = README
-
-#
-# Build a Cygwin binary tar ball
-#
-# Read the README file for details on using this Makefile
-#
-# NOTE: As I'm not particularly familiar with Makefiles, this was the
-#  best I could come up with. It should probably be enhanced someday
-#  to actually use the correct target and pre-requisite names, etc...
-#  If anyone else wants to volunteer, feel free ;-)
-#
-
-# Cygwin build number (default to "1")
-CYGBUILD = 1
-
-# Cygwin tarball build dir (fully-qualified name, gets deleted when done)
-cygwintmp = $(CURDIR)/tmp_binbuild
-
-cygwinbin:
-       rm -rf $(cygwintmp)
-       rm -rf $(cygwintmp)-dev
-       $(MAKE) -C $(top_builddir) DESTDIR=$(cygwintmp) install-strip
-# $(STRIP) $(cygwintmp)/usr/bin/cygcurl-?.dll
-       $(mkinstalldirs) \
-         $(cygwintmp)$(datadir)/doc/Cygwin \
-         $(cygwintmp)$(datadir)/doc/$(PACKAGE)-$(VERSION) \
-         $(cygwintmp)-dev$(datadir)/doc/$(PACKAGE)-$(VERSION)/libcurl \
-         $(cygwintmp)-dev$(datadir)/doc/$(PACKAGE)-$(VERSION)/examples \
-         $(cygwintmp)-dev$(mandir)
-#
-# copy some files into the binary install dir
-       cp $(srcdir)/README \
-         $(cygwintmp)$(datadir)/doc/Cygwin/$(PACKAGE)-$(VERSION)-$(CYGBUILD).README
-       cd $(top_srcdir) ; cp CHANGES COPYING README RELEASE-NOTES docs/* \
-         $(cygwintmp)$(datadir)/doc/$(PACKAGE)-$(VERSION) ; pwd
-       cd $(cygwintmp)$(datadir)/doc/$(PACKAGE)-$(VERSION) ; rm *.1 Makefile*
-#
-# copy some files into the -dev install dir, remove some from binary
-       cp $(top_srcdir)/docs/libcurl/*.html \
-         $(cygwintmp)-dev$(datadir)/doc/$(PACKAGE)-$(VERSION)/libcurl
-       cp $(top_srcdir)/docs/examples/* \
-         $(cygwintmp)-dev$(datadir)/doc/$(PACKAGE)-$(VERSION)/examples
-       rm $(cygwintmp)-dev$(datadir)/doc/$(PACKAGE)-$(VERSION)/examples/Makefile*
-       cp $(top_srcdir)/docs/examples/Makefile.example \
-         $(cygwintmp)-dev$(datadir)/doc/$(PACKAGE)-$(VERSION)/examples
-       mv $(cygwintmp)$(datadir)/doc/$(PACKAGE)-$(VERSION)/BINDINGS \
-          $(cygwintmp)-dev$(datadir)/doc/$(PACKAGE)-$(VERSION)
-       mv $(cygwintmp)$(datadir)/doc/$(PACKAGE)-$(VERSION)/INTERNALS \
-          $(cygwintmp)-dev$(datadir)/doc/$(PACKAGE)-$(VERSION)
-       mv $(cygwintmp)/usr/include $(cygwintmp)-dev/usr
-       mv $(cygwintmp)/usr/lib $(cygwintmp)-dev/usr
-       mv $(cygwintmp)$(mandir)/man3 $(cygwintmp)-dev$(mandir)
-#
-# create both tar files, and delete tmp folders
-       cd $(cygwintmp) ; tar cjf \
-         $(PACKAGE)-$(VERSION)-$(CYGBUILD).tar.bz2 usr
-       mv $(cygwintmp)/*.tar.bz2 . && rm -rf $(cygwintmp)
-#
-       cd $(cygwintmp)-dev ; tar cjf \
-         $(PACKAGE)-devel-$(VERSION)-$(CYGBUILD).tar.bz2 usr
-       mv $(cygwintmp)-dev/*.tar.bz2 . && rm -rf $(cygwintmp)-dev
diff --git a/packages/Win32/cygwin/Makefile.in b/packages/Win32/cygwin/Makefile.in
deleted file mode 100644 (file)
index 78d22bc..0000000
+++ /dev/null
@@ -1,605 +0,0 @@
-# Makefile.in generated by automake 1.16.1 from Makefile.am.
-# @configure_input@
-
-# Copyright (C) 1994-2018 Free Software Foundation, Inc.
-
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
-@SET_MAKE@
-VPATH = @srcdir@
-am__is_gnu_make = { \
-  if test -z '$(MAKELEVEL)'; then \
-    false; \
-  elif test -n '$(MAKE_HOST)'; then \
-    true; \
-  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
-    true; \
-  else \
-    false; \
-  fi; \
-}
-am__make_running_with_option = \
-  case $${target_option-} in \
-      ?) ;; \
-      *) echo "am__make_running_with_option: internal error: invalid" \
-              "target option '$${target_option-}' specified" >&2; \
-         exit 1;; \
-  esac; \
-  has_opt=no; \
-  sane_makeflags=$$MAKEFLAGS; \
-  if $(am__is_gnu_make); then \
-    sane_makeflags=$$MFLAGS; \
-  else \
-    case $$MAKEFLAGS in \
-      *\\[\ \  ]*) \
-        bs=\\; \
-        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
-          | sed "s/$$bs$$bs[$$bs $$bs  ]*//g"`;; \
-    esac; \
-  fi; \
-  skip_next=no; \
-  strip_trailopt () \
-  { \
-    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
-  }; \
-  for flg in $$sane_makeflags; do \
-    test $$skip_next = yes && { skip_next=no; continue; }; \
-    case $$flg in \
-      *=*|--*) continue;; \
-        -*I) strip_trailopt 'I'; skip_next=yes;; \
-      -*I?*) strip_trailopt 'I';; \
-        -*O) strip_trailopt 'O'; skip_next=yes;; \
-      -*O?*) strip_trailopt 'O';; \
-        -*l) strip_trailopt 'l'; skip_next=yes;; \
-      -*l?*) strip_trailopt 'l';; \
-      -[dEDm]) skip_next=yes;; \
-      -[JT]) skip_next=yes;; \
-    esac; \
-    case $$flg in \
-      *$$target_option*) has_opt=yes; break;; \
-    esac; \
-  done; \
-  test $$has_opt = yes
-am__make_dryrun = (target_option=n; $(am__make_running_with_option))
-am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
-pkgdatadir = $(datadir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkglibexecdir = $(libexecdir)/@PACKAGE@
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-build_triplet = @build@
-host_triplet = @host@
-subdir = packages/Win32/cygwin
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/ax_code_coverage.m4 \
-       $(top_srcdir)/m4/ax_compile_check_sizeof.m4 \
-       $(top_srcdir)/m4/curl-compilers.m4 \
-       $(top_srcdir)/m4/curl-confopts.m4 \
-       $(top_srcdir)/m4/curl-functions.m4 \
-       $(top_srcdir)/m4/curl-openssl.m4 \
-       $(top_srcdir)/m4/curl-override.m4 \
-       $(top_srcdir)/m4/curl-reentrant.m4 $(top_srcdir)/m4/libtool.m4 \
-       $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
-       $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
-       $(top_srcdir)/m4/xc-am-iface.m4 \
-       $(top_srcdir)/m4/xc-cc-check.m4 \
-       $(top_srcdir)/m4/xc-lt-iface.m4 \
-       $(top_srcdir)/m4/xc-translit.m4 \
-       $(top_srcdir)/m4/xc-val-flgs.m4 \
-       $(top_srcdir)/m4/zz40-xc-ovr.m4 \
-       $(top_srcdir)/m4/zz50-xc-ovr.m4 \
-       $(top_srcdir)/m4/zz60-xc-ovr.m4 $(top_srcdir)/acinclude.m4 \
-       $(top_srcdir)/configure.ac
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
-       $(ACLOCAL_M4)
-DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
-mkinstalldirs = $(install_sh) -d
-CONFIG_HEADER = $(top_builddir)/lib/curl_config.h
-CONFIG_CLEAN_FILES =
-CONFIG_CLEAN_VPATH_FILES =
-AM_V_P = $(am__v_P_@AM_V@)
-am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
-am__v_P_0 = false
-am__v_P_1 = :
-AM_V_GEN = $(am__v_GEN_@AM_V@)
-am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
-am__v_GEN_0 = @echo "  GEN     " $@;
-am__v_GEN_1 = 
-AM_V_at = $(am__v_at_@AM_V@)
-am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
-am__v_at_0 = @
-am__v_at_1 = 
-SOURCES =
-DIST_SOURCES =
-am__can_run_installinfo = \
-  case $$AM_UPDATE_INFO_DIR in \
-    n|no|NO) false;; \
-    *) (install-info --version) >/dev/null 2>&1;; \
-  esac
-am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
-am__DIST_COMMON = $(srcdir)/Makefile.in README
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-ACLOCAL = @ACLOCAL@
-AMTAR = @AMTAR@
-AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
-AR = @AR@
-AR_FLAGS = @AR_FLAGS@
-AS = @AS@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-BLANK_AT_MAKETIME = @BLANK_AT_MAKETIME@
-CC = @CC@
-CCDEPMODE = @CCDEPMODE@
-CFLAGS = @CFLAGS@
-CFLAG_CURL_SYMBOL_HIDING = @CFLAG_CURL_SYMBOL_HIDING@
-CODE_COVERAGE_CFLAGS = @CODE_COVERAGE_CFLAGS@
-CODE_COVERAGE_CPPFLAGS = @CODE_COVERAGE_CPPFLAGS@
-CODE_COVERAGE_CXXFLAGS = @CODE_COVERAGE_CXXFLAGS@
-CODE_COVERAGE_ENABLED = @CODE_COVERAGE_ENABLED@
-CODE_COVERAGE_LDFLAGS = @CODE_COVERAGE_LDFLAGS@
-CODE_COVERAGE_LIBS = @CODE_COVERAGE_LIBS@
-CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@
-CPP = @CPP@
-CPPFLAGS = @CPPFLAGS@
-CPPFLAG_CURL_STATICLIB = @CPPFLAG_CURL_STATICLIB@
-CURLVERSION = @CURLVERSION@
-CURL_CA_BUNDLE = @CURL_CA_BUNDLE@
-CURL_CFLAG_EXTRAS = @CURL_CFLAG_EXTRAS@
-CURL_DISABLE_DICT = @CURL_DISABLE_DICT@
-CURL_DISABLE_FILE = @CURL_DISABLE_FILE@
-CURL_DISABLE_FTP = @CURL_DISABLE_FTP@
-CURL_DISABLE_GOPHER = @CURL_DISABLE_GOPHER@
-CURL_DISABLE_HTTP = @CURL_DISABLE_HTTP@
-CURL_DISABLE_IMAP = @CURL_DISABLE_IMAP@
-CURL_DISABLE_LDAP = @CURL_DISABLE_LDAP@
-CURL_DISABLE_LDAPS = @CURL_DISABLE_LDAPS@
-CURL_DISABLE_POP3 = @CURL_DISABLE_POP3@
-CURL_DISABLE_PROXY = @CURL_DISABLE_PROXY@
-CURL_DISABLE_RTSP = @CURL_DISABLE_RTSP@
-CURL_DISABLE_SMB = @CURL_DISABLE_SMB@
-CURL_DISABLE_SMTP = @CURL_DISABLE_SMTP@
-CURL_DISABLE_TELNET = @CURL_DISABLE_TELNET@
-CURL_DISABLE_TFTP = @CURL_DISABLE_TFTP@
-CURL_LT_SHLIB_VERSIONED_FLAVOUR = @CURL_LT_SHLIB_VERSIONED_FLAVOUR@
-CURL_NETWORK_AND_TIME_LIBS = @CURL_NETWORK_AND_TIME_LIBS@
-CURL_NETWORK_LIBS = @CURL_NETWORK_LIBS@
-CURL_WITH_MULTI_SSL = @CURL_WITH_MULTI_SSL@
-CYGPATH_W = @CYGPATH_W@
-DEFAULT_SSL_BACKEND = @DEFAULT_SSL_BACKEND@
-DEFS = @DEFS@
-DEPDIR = @DEPDIR@
-DLLTOOL = @DLLTOOL@
-DSYMUTIL = @DSYMUTIL@
-DUMPBIN = @DUMPBIN@
-ECHO_C = @ECHO_C@
-ECHO_N = @ECHO_N@
-ECHO_T = @ECHO_T@
-EGREP = @EGREP@
-ENABLE_SHARED = @ENABLE_SHARED@
-ENABLE_STATIC = @ENABLE_STATIC@
-EXEEXT = @EXEEXT@
-FGREP = @FGREP@
-GCOV = @GCOV@
-GENHTML = @GENHTML@
-GREP = @GREP@
-HAVE_BROTLI = @HAVE_BROTLI@
-HAVE_GNUTLS_SRP = @HAVE_GNUTLS_SRP@
-HAVE_LDAP_SSL = @HAVE_LDAP_SSL@
-HAVE_LIBZ = @HAVE_LIBZ@
-HAVE_OPENSSL_SRP = @HAVE_OPENSSL_SRP@
-IDN_ENABLED = @IDN_ENABLED@
-INSTALL = @INSTALL@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-IPV6_ENABLED = @IPV6_ENABLED@
-LCOV = @LCOV@
-LD = @LD@
-LDFLAGS = @LDFLAGS@
-LIBCURL_LIBS = @LIBCURL_LIBS@
-LIBMETALINK_CPPFLAGS = @LIBMETALINK_CPPFLAGS@
-LIBMETALINK_LDFLAGS = @LIBMETALINK_LDFLAGS@
-LIBMETALINK_LIBS = @LIBMETALINK_LIBS@
-LIBOBJS = @LIBOBJS@
-LIBS = @LIBS@
-LIBTOOL = @LIBTOOL@
-LIPO = @LIPO@
-LN_S = @LN_S@
-LTLIBOBJS = @LTLIBOBJS@
-LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
-MAINT = @MAINT@
-MAKEINFO = @MAKEINFO@
-MANIFEST_TOOL = @MANIFEST_TOOL@
-MANOPT = @MANOPT@
-MKDIR_P = @MKDIR_P@
-NM = @NM@
-NMEDIT = @NMEDIT@
-NROFF = @NROFF@
-NSS_LIBS = @NSS_LIBS@
-OBJDUMP = @OBJDUMP@
-OBJEXT = @OBJEXT@
-OTOOL = @OTOOL@
-OTOOL64 = @OTOOL64@
-PACKAGE = @PACKAGE@
-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
-PACKAGE_NAME = @PACKAGE_NAME@
-PACKAGE_STRING = @PACKAGE_STRING@
-PACKAGE_TARNAME = @PACKAGE_TARNAME@
-PACKAGE_URL = @PACKAGE_URL@
-PACKAGE_VERSION = @PACKAGE_VERSION@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-PERL = @PERL@
-PKGADD_NAME = @PKGADD_NAME@
-PKGADD_PKG = @PKGADD_PKG@
-PKGADD_VENDOR = @PKGADD_VENDOR@
-PKGCONFIG = @PKGCONFIG@
-RANDOM_FILE = @RANDOM_FILE@
-RANLIB = @RANLIB@
-REQUIRE_LIB_DEPS = @REQUIRE_LIB_DEPS@
-SED = @SED@
-SET_MAKE = @SET_MAKE@
-SHELL = @SHELL@
-SSL_BACKENDS = @SSL_BACKENDS@
-SSL_ENABLED = @SSL_ENABLED@
-SSL_LIBS = @SSL_LIBS@
-STRIP = @STRIP@
-SUPPORT_FEATURES = @SUPPORT_FEATURES@
-SUPPORT_PROTOCOLS = @SUPPORT_PROTOCOLS@
-USE_ARES = @USE_ARES@
-USE_AXTLS = @USE_AXTLS@
-USE_CYASSL = @USE_CYASSL@
-USE_DARWINSSL = @USE_DARWINSSL@
-USE_GNUTLS = @USE_GNUTLS@
-USE_GNUTLS_NETTLE = @USE_GNUTLS_NETTLE@
-USE_LIBRTMP = @USE_LIBRTMP@
-USE_LIBSSH = @USE_LIBSSH@
-USE_LIBSSH2 = @USE_LIBSSH2@
-USE_MBEDTLS = @USE_MBEDTLS@
-USE_MESALINK = @USE_MESALINK@
-USE_NGHTTP2 = @USE_NGHTTP2@
-USE_NSS = @USE_NSS@
-USE_OPENLDAP = @USE_OPENLDAP@
-USE_POLARSSL = @USE_POLARSSL@
-USE_SCHANNEL = @USE_SCHANNEL@
-USE_UNIX_SOCKETS = @USE_UNIX_SOCKETS@
-USE_WINDOWS_SSPI = @USE_WINDOWS_SSPI@
-VERSION = @VERSION@
-VERSIONNUM = @VERSIONNUM@
-ZLIB_LIBS = @ZLIB_LIBS@
-ZSH_FUNCTIONS_DIR = @ZSH_FUNCTIONS_DIR@
-abs_builddir = @abs_builddir@
-abs_srcdir = @abs_srcdir@
-abs_top_builddir = @abs_top_builddir@
-abs_top_srcdir = @abs_top_srcdir@
-ac_ct_AR = @ac_ct_AR@
-ac_ct_CC = @ac_ct_CC@
-ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
-am__include = @am__include@
-am__leading_dot = @am__leading_dot@
-am__quote = @am__quote@
-am__tar = @am__tar@
-am__untar = @am__untar@
-bindir = @bindir@
-build = @build@
-build_alias = @build_alias@
-build_cpu = @build_cpu@
-build_os = @build_os@
-build_vendor = @build_vendor@
-builddir = @builddir@
-datadir = @datadir@
-datarootdir = @datarootdir@
-docdir = @docdir@
-dvidir = @dvidir@
-exec_prefix = @exec_prefix@
-host = @host@
-host_alias = @host_alias@
-host_cpu = @host_cpu@
-host_os = @host_os@
-host_vendor = @host_vendor@
-htmldir = @htmldir@
-includedir = @includedir@
-infodir = @infodir@
-install_sh = @install_sh@
-libdir = @libdir@
-libexecdir = @libexecdir@
-libext = @libext@
-localedir = @localedir@
-localstatedir = @localstatedir@
-mandir = @mandir@
-mkdir_p = @mkdir_p@
-oldincludedir = @oldincludedir@
-pdfdir = @pdfdir@
-prefix = @prefix@
-program_transform_name = @program_transform_name@
-psdir = @psdir@
-runstatedir = @runstatedir@
-sbindir = @sbindir@
-sharedstatedir = @sharedstatedir@
-srcdir = @srcdir@
-subdirs = @subdirs@
-sysconfdir = @sysconfdir@
-target_alias = @target_alias@
-top_build_prefix = @top_build_prefix@
-top_builddir = @top_builddir@
-top_srcdir = @top_srcdir@
-EXTRA_DIST = README
-
-#
-# Build a Cygwin binary tar ball
-#
-# Read the README file for details on using this Makefile
-#
-# NOTE: As I'm not particularly familiar with Makefiles, this was the
-#  best I could come up with. It should probably be enhanced someday
-#  to actually use the correct target and pre-requisite names, etc...
-#  If anyone else wants to volunteer, feel free ;-)
-#
-
-# Cygwin build number (default to "1")
-CYGBUILD = 1
-
-# Cygwin tarball build dir (fully-qualified name, gets deleted when done)
-cygwintmp = $(CURDIR)/tmp_binbuild
-all: all-am
-
-.SUFFIXES:
-$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
-       @for dep in $?; do \
-         case '$(am__configure_deps)' in \
-           *$$dep*) \
-             ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
-               && { if test -f $@; then exit 0; else break; fi; }; \
-             exit 1;; \
-         esac; \
-       done; \
-       echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign packages/Win32/cygwin/Makefile'; \
-       $(am__cd) $(top_srcdir) && \
-         $(AUTOMAKE) --foreign packages/Win32/cygwin/Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
-       @case '$?' in \
-         *config.status*) \
-           cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
-         *) \
-           echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \
-           cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
-       esac;
-
-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
-       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-
-$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
-       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
-       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(am__aclocal_m4_deps):
-
-mostlyclean-libtool:
-       -rm -f *.lo
-
-clean-libtool:
-       -rm -rf .libs _libs
-tags TAGS:
-
-ctags CTAGS:
-
-cscope cscopelist:
-
-
-distdir: $(BUILT_SOURCES)
-       $(MAKE) $(AM_MAKEFLAGS) distdir-am
-
-distdir-am: $(DISTFILES)
-       @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-       topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-       list='$(DISTFILES)'; \
-         dist_files=`for file in $$list; do echo $$file; done | \
-         sed -e "s|^$$srcdirstrip/||;t" \
-             -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
-       case $$dist_files in \
-         */*) $(MKDIR_P) `echo "$$dist_files" | \
-                          sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
-                          sort -u` ;; \
-       esac; \
-       for file in $$dist_files; do \
-         if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
-         if test -d $$d/$$file; then \
-           dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
-           if test -d "$(distdir)/$$file"; then \
-             find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-           fi; \
-           if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-             cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
-             find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-           fi; \
-           cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
-         else \
-           test -f "$(distdir)/$$file" \
-           || cp -p $$d/$$file "$(distdir)/$$file" \
-           || exit 1; \
-         fi; \
-       done
-check-am: all-am
-check: check-am
-all-am: Makefile
-installdirs:
-install: install-am
-install-exec: install-exec-am
-install-data: install-data-am
-uninstall: uninstall-am
-
-install-am: all-am
-       @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-am
-install-strip:
-       if test -z '$(STRIP)'; then \
-         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-             install; \
-       else \
-         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-           "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
-       fi
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
-       -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
-       -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
-
-maintainer-clean-generic:
-       @echo "This command is intended for maintainers to use"
-       @echo "it deletes files that may require special tools to rebuild."
-clean: clean-am
-
-clean-am: clean-generic clean-libtool mostlyclean-am
-
-distclean: distclean-am
-       -rm -f Makefile
-distclean-am: clean-am distclean-generic
-
-dvi: dvi-am
-
-dvi-am:
-
-html: html-am
-
-html-am:
-
-info: info-am
-
-info-am:
-
-install-data-am:
-
-install-dvi: install-dvi-am
-
-install-dvi-am:
-
-install-exec-am:
-
-install-html: install-html-am
-
-install-html-am:
-
-install-info: install-info-am
-
-install-info-am:
-
-install-man:
-
-install-pdf: install-pdf-am
-
-install-pdf-am:
-
-install-ps: install-ps-am
-
-install-ps-am:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-am
-       -rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-am
-
-mostlyclean-am: mostlyclean-generic mostlyclean-libtool
-
-pdf: pdf-am
-
-pdf-am:
-
-ps: ps-am
-
-ps-am:
-
-uninstall-am:
-
-.MAKE: install-am install-strip
-
-.PHONY: all all-am check check-am clean clean-generic clean-libtool \
-       cscopelist-am ctags-am distclean distclean-generic \
-       distclean-libtool distdir dvi dvi-am html html-am info info-am \
-       install install-am install-data install-data-am install-dvi \
-       install-dvi-am install-exec install-exec-am install-html \
-       install-html-am install-info install-info-am install-man \
-       install-pdf install-pdf-am install-ps install-ps-am \
-       install-strip installcheck installcheck-am installdirs \
-       maintainer-clean maintainer-clean-generic mostlyclean \
-       mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
-       tags-am uninstall uninstall-am
-
-.PRECIOUS: Makefile
-
-
-cygwinbin:
-       rm -rf $(cygwintmp)
-       rm -rf $(cygwintmp)-dev
-       $(MAKE) -C $(top_builddir) DESTDIR=$(cygwintmp) install-strip
-# $(STRIP) $(cygwintmp)/usr/bin/cygcurl-?.dll
-       $(mkinstalldirs) \
-         $(cygwintmp)$(datadir)/doc/Cygwin \
-         $(cygwintmp)$(datadir)/doc/$(PACKAGE)-$(VERSION) \
-         $(cygwintmp)-dev$(datadir)/doc/$(PACKAGE)-$(VERSION)/libcurl \
-         $(cygwintmp)-dev$(datadir)/doc/$(PACKAGE)-$(VERSION)/examples \
-         $(cygwintmp)-dev$(mandir)
-#
-# copy some files into the binary install dir
-       cp $(srcdir)/README \
-         $(cygwintmp)$(datadir)/doc/Cygwin/$(PACKAGE)-$(VERSION)-$(CYGBUILD).README
-       cd $(top_srcdir) ; cp CHANGES COPYING README RELEASE-NOTES docs/* \
-         $(cygwintmp)$(datadir)/doc/$(PACKAGE)-$(VERSION) ; pwd
-       cd $(cygwintmp)$(datadir)/doc/$(PACKAGE)-$(VERSION) ; rm *.1 Makefile*
-#
-# copy some files into the -dev install dir, remove some from binary
-       cp $(top_srcdir)/docs/libcurl/*.html \
-         $(cygwintmp)-dev$(datadir)/doc/$(PACKAGE)-$(VERSION)/libcurl
-       cp $(top_srcdir)/docs/examples/* \
-         $(cygwintmp)-dev$(datadir)/doc/$(PACKAGE)-$(VERSION)/examples
-       rm $(cygwintmp)-dev$(datadir)/doc/$(PACKAGE)-$(VERSION)/examples/Makefile*
-       cp $(top_srcdir)/docs/examples/Makefile.example \
-         $(cygwintmp)-dev$(datadir)/doc/$(PACKAGE)-$(VERSION)/examples
-       mv $(cygwintmp)$(datadir)/doc/$(PACKAGE)-$(VERSION)/BINDINGS \
-          $(cygwintmp)-dev$(datadir)/doc/$(PACKAGE)-$(VERSION)
-       mv $(cygwintmp)$(datadir)/doc/$(PACKAGE)-$(VERSION)/INTERNALS \
-          $(cygwintmp)-dev$(datadir)/doc/$(PACKAGE)-$(VERSION)
-       mv $(cygwintmp)/usr/include $(cygwintmp)-dev/usr
-       mv $(cygwintmp)/usr/lib $(cygwintmp)-dev/usr
-       mv $(cygwintmp)$(mandir)/man3 $(cygwintmp)-dev$(mandir)
-#
-# create both tar files, and delete tmp folders
-       cd $(cygwintmp) ; tar cjf \
-         $(PACKAGE)-$(VERSION)-$(CYGBUILD).tar.bz2 usr
-       mv $(cygwintmp)/*.tar.bz2 . && rm -rf $(cygwintmp)
-#
-       cd $(cygwintmp)-dev ; tar cjf \
-         $(PACKAGE)-devel-$(VERSION)-$(CYGBUILD).tar.bz2 usr
-       mv $(cygwintmp)-dev/*.tar.bz2 . && rm -rf $(cygwintmp)-dev
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/packages/Win32/cygwin/README b/packages/Win32/cygwin/README
deleted file mode 100644 (file)
index 9a61341..0000000
+++ /dev/null
@@ -1,114 +0,0 @@
-Curl is a tool for transferring files with URL syntax, supporting
-  FTP, FTPS, HTTP, HTTPS, TELNET, DICT, FILE and LDAP.
-  Curl supports HTTPS certificates, HTTP POST, HTTP PUT,
-  FTP uploading, kerberos, HTTP form based upload, proxies,
-  cookies, user+password authentication, file transfer resume,
-  http proxy tunneling and a busload of other useful tricks.
-
-See /usr/doc/curl-$(VERSION)/FEATURES for more info.
-
-
-Dependencies:
-  - Cygwin
-  - OpenSSL 0.9.6b-2+ (*)
-
-  (*) curl can be built without SSL support, see below for details
-
-
-Canonical Homepage and Downloads:
-  https://curl.haxx.se/
-  https://curl.haxx.se/download.html
-
-
-Cygwin specific source files (a .README template and a Makefile
-  for building binary tarballs) are maintained in the upstream
-  CVS at: <srctop>/packages/Win32/cygwin/
-
-
-Build Instructions (to recompile from the cygwin source tarball):
-  ---STANDARD (with SSL) RELEASE---
-  Download the source (either the official release or the cygwin version),
-  unpack it (done for you if using setup.exe), then:
-
-  $ ./configure --prefix=/usr --mandir=/usr/share/man  # (*)
-  $ make
-  $ make test    # optional
-  $ make install # (**)
-
-  (*) The Cygwin project now (as of sometime in 2003) prefers man pages
-      within /usr/share/man, as opposed to the default /usr/man.
-
-  (**) LibTool 1.4.2 had a bug related to cygwin's use of ".exe" extensions,
-      such that "make install" blew up at curl.exe. See this URL for details:
-         https://lists.gnu.org/archive/html/libtool/2001-09/msg00101.html
-      The copy of ltmain.sh that is distributed with curl includes this patch.
-
-  As of curl 7.9.1, the official source compiles (under Cygwin) and tests
-    100% cleanly OOTB (Out Of The Box)
-
-  ---NO SSL RELEASE---
-  Same as standard, except for the configure step, which changes to:
-
-  $ ./configure --prefix=/usr --mandir=/usr/share/man --without-ssl
-
-  NOTE: the standard release is what is available via Cygwin's setup.exe;
-    the no-ssl release is only available from the curl website
-
-
-Packaging Instructions:
-  ---BINARY---
-  Compile cleanly as described above, then:
-
-  $ make cygwinbin CYGBUILD=n
-
-  where n is the cygwin release number (e.g. the "1" in curl-7.9-1),
-  and "CYGBUILD=n" is optional (n defaults to 1 if not specified)
-
-  Assuming everything worked, you'll find your binary tarballs in
-   $(buildtop)/packages/Win32/cygwin/
-
-  ---SOURCE---
-  1. download & unpack the pristine source
-  2. rename the source dir to add the "-$(REL)" suffix, e.g.:
-     $ mv curl-7.9 curl-7.9-1
-  3. unpack the pristine source once more, so you'll end up
-     with 2 directories: "curl-7.9" and "curl-7.9-1" in this example
-  3. add a CYGWIN-PATCHES directory, and add this readme to it
-     $ cd curl-7.9-1; mkdir CYGWIN-PATCHES
-     $ cp packages/Win32/cygwin/README CYGWIN-PATCHES/curl-7.9-1.README
-  4. if applicable, document any changes in the README file
-  5. create a patch which, when applied
-     (using `patch -p1 < curl-7.9-$(REL).patch`)
-     will remove any changes you've made to the pristine source:
-     $ cd ..
-     $ diff -Nrup curl-7.9-1 curl-7.9 > curl-7.9-1.patch
-     and then move it into the CYGWIN-PATCHES directory
-     $ mv curl-7.9-1.patch curl-7.9-1/CYGWIN-PATCHES
-  6. pack the new source dir into a tar.bz2 file:
-     $ tar cfj curl-7.9-1-src.tar.bz2 curl-7.9-1
-
-  ---SETUP.HINT---
-  @ curl
-  sdesc: "a client that groks URLs"
-  ldesc: "Curl is a tool for transferring files with URL syntax,
-  supporting FTP, FTPS, HTTP, HTTPS, TELNET, DICT, FILE
-  and LDAP. Curl supports HTTPS certificates, HTTP POST, HTTP PUT,
-  FTP uploading, kerberos, HTTP form based upload, proxies,
-  cookies, user+password authentication, file transfer resume,
-  http proxy tunneling and a busload of other useful tricks."
-  category: Web Libs
-  requires: cygwin openssl
-
-  @ curl-devel
-  sdesc: "(lib)curl headers, static libraries, developer docs and samples"
-  ldesc: "curl-devel is the developer-oriented (non-run-time) parts
-  of the curl package. It includes header files, static libraries,
-  example source code snippets, and the libcurl man pages."
-  category: Web Libs Devel
-  requires: cygwin openssl curl
-
-
-Cygwin port maintained by:
-  Kevin Roth <kproth @ users . sourceforge . net>
-  Questions about curl should be directed to curl-users@cool.haxx.se.
-  Questions about this cygwin package go to cygwin@cygwin.com.
index ff4e7a6..cbce0f3 100644 (file)
@@ -89,8 +89,7 @@ build_triplet = @build@
 host_triplet = @host@
 subdir = packages/vms
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/ax_code_coverage.m4 \
-       $(top_srcdir)/m4/ax_compile_check_sizeof.m4 \
+am__aclocal_m4_deps = $(top_srcdir)/m4/ax_compile_check_sizeof.m4 \
        $(top_srcdir)/m4/curl-compilers.m4 \
        $(top_srcdir)/m4/curl-confopts.m4 \
        $(top_srcdir)/m4/curl-functions.m4 \
@@ -152,12 +151,6 @@ CC = @CC@
 CCDEPMODE = @CCDEPMODE@
 CFLAGS = @CFLAGS@
 CFLAG_CURL_SYMBOL_HIDING = @CFLAG_CURL_SYMBOL_HIDING@
-CODE_COVERAGE_CFLAGS = @CODE_COVERAGE_CFLAGS@
-CODE_COVERAGE_CPPFLAGS = @CODE_COVERAGE_CPPFLAGS@
-CODE_COVERAGE_CXXFLAGS = @CODE_COVERAGE_CXXFLAGS@
-CODE_COVERAGE_ENABLED = @CODE_COVERAGE_ENABLED@
-CODE_COVERAGE_LDFLAGS = @CODE_COVERAGE_LDFLAGS@
-CODE_COVERAGE_LIBS = @CODE_COVERAGE_LIBS@
 CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
@@ -199,14 +192,15 @@ ENABLE_SHARED = @ENABLE_SHARED@
 ENABLE_STATIC = @ENABLE_STATIC@
 EXEEXT = @EXEEXT@
 FGREP = @FGREP@
+FISH_FUNCTIONS_DIR = @FISH_FUNCTIONS_DIR@
 GCOV = @GCOV@
-GENHTML = @GENHTML@
 GREP = @GREP@
 HAVE_BROTLI = @HAVE_BROTLI@
 HAVE_GNUTLS_SRP = @HAVE_GNUTLS_SRP@
 HAVE_LDAP_SSL = @HAVE_LDAP_SSL@
 HAVE_LIBZ = @HAVE_LIBZ@
 HAVE_OPENSSL_SRP = @HAVE_OPENSSL_SRP@
+HAVE_PROTO_BSDSOCKET_H = @HAVE_PROTO_BSDSOCKET_H@
 IDN_ENABLED = @IDN_ENABLED@
 INSTALL = @INSTALL@
 INSTALL_DATA = @INSTALL_DATA@
@@ -267,9 +261,7 @@ STRIP = @STRIP@
 SUPPORT_FEATURES = @SUPPORT_FEATURES@
 SUPPORT_PROTOCOLS = @SUPPORT_PROTOCOLS@
 USE_ARES = @USE_ARES@
-USE_AXTLS = @USE_AXTLS@
-USE_CYASSL = @USE_CYASSL@
-USE_DARWINSSL = @USE_DARWINSSL@
+USE_BEARSSL = @USE_BEARSSL@
 USE_GNUTLS = @USE_GNUTLS@
 USE_GNUTLS_NETTLE = @USE_GNUTLS_NETTLE@
 USE_LIBRTMP = @USE_LIBRTMP@
@@ -278,12 +270,17 @@ USE_LIBSSH2 = @USE_LIBSSH2@
 USE_MBEDTLS = @USE_MBEDTLS@
 USE_MESALINK = @USE_MESALINK@
 USE_NGHTTP2 = @USE_NGHTTP2@
+USE_NGHTTP3 = @USE_NGHTTP3@
+USE_NGTCP2 = @USE_NGTCP2@
+USE_NGTCP2_CRYPTO_OPENSSL = @USE_NGTCP2_CRYPTO_OPENSSL@
 USE_NSS = @USE_NSS@
 USE_OPENLDAP = @USE_OPENLDAP@
-USE_POLARSSL = @USE_POLARSSL@
+USE_QUICHE = @USE_QUICHE@
 USE_SCHANNEL = @USE_SCHANNEL@
+USE_SECTRANSP = @USE_SECTRANSP@
 USE_UNIX_SOCKETS = @USE_UNIX_SOCKETS@
 USE_WINDOWS_SSPI = @USE_WINDOWS_SSPI@
+USE_WOLFSSL = @USE_WOLFSSL@
 VERSION = @VERSION@
 VERSIONNUM = @VERSIONNUM@
 ZLIB_LIBS = @ZLIB_LIBS@
index 0f1fa0f..9bfb40b 100644 (file)
@@ -803,41 +803,6 @@ $      write tf "#endif"
 $          goto cfgh_in_loop1
 $      endif
 $!
-$      if key2 .eqs. "HAVE_ENGINE_LOAD_BUILTIN_ENGINES"
-$      then
-$          if f$search("''ssl_header_dir'engine.h") .nes. ""
-$          then
-$              search_key = key2 - "HAVE_"
-$              define/user sys$output nl:
-$              define/user sys$error nl:
-$              search/output=nl: 'ssl_header_dir'engine.h 'search_key'
-$              if '$severity' .eq. 1
-$              then
-$                  write tf "#ifndef ''key2'"
-$                  write tf "#define ''key2' 1"
-$                  write tf "#endif"
-$              else
-$                  write tf "/* #undef ''key2' */"
-$              endif
-$          else
-$              write tf "/* #undef ''key2' */"
-$          endif
-$          goto cfgh_in_loop1
-$      endif
-$!
-$      if key2 .eqs. "HAVE_SSL_GET_SHUTDOWN"
-$      then
-$          if f$search("''ssl_header_dir'ssl.h") .nes. ""
-$          then
-$              write tf "#ifndef ''key2'"
-$              write tf "#define ''key2' 1"
-$              write tf "#endif"
-$          else
-$              write tf "/* #undef ''key2' */"
-$          endif
-$          goto cfgh_in_loop1
-$      endif
-$!
 $      if key2b .eqs. "RAND" .and. key2c .nes. "" .and. key2d .eqs. ""
 $      then
 $          if (key2c .eqs. "EGD") .or. -
index 01a34e5..7a8d847 100644 (file)
@@ -183,7 +183,6 @@ static void set_features(void)
     status = sys_trnlnm("GNV$UNIX_SHELL",
                         unix_shell_name, sizeof unix_shell_name -1);
     if (!$VMS_STATUS_SUCCESS(status)) {
-        unix_shell_name[0] = 0;
         use_unix_settings = 0;
     }
 
index 3420aae..9072b20 100644 (file)
@@ -198,7 +198,7 @@ The *.EXE files are not moved to the new_gnu: directory.
 After you are satisfied with the results of your build, you can move the
 files from new_gnu: to old_gnu: at your convenience.
 
-Building a PCSI kit for an archictecture takes the following steps after
+Building a PCSI kit for an architecture takes the following steps after
 making sure that you have a working build environment.
 
 Note that it requires manually creating two logical names as described
index 90a83d5..809aaaf 100644 (file)
@@ -223,7 +223,7 @@ $write cvh "/* Location of default ca path */"
 $write cvh "#define curl_ca_path ""gnv$curl_ca_path"""
 $!
 $! NTLM_WB_ENABLED requires fork() but configure does not know this
-$! We have to disble this in th configure command line.
+$! We have to disable this in the configure command line.
 $! config_h.com finds that configure defaults to it being enabled so
 $! reports it.  So we need to turn it off here.
 $!
@@ -325,14 +325,8 @@ $! configure defaults to USE_*, a real configure on VMS chooses different.
 $write cvh "#ifdef USE_ARES"
 $write cvh "#undef USE_ARES"
 $write cvh "#endif"
-$write cvh "#ifdef USE_AXTLS"
-$write cvh "#undef USE_AXTLS"
-$write cvh "#endif"
-$write cvh "#ifdef USE_CYASSL"
-$write cvh "#undef USE_CYASSL"
-$write cvh "#endif"
-$write cvh "#ifdef USE_DARWINSSL"
-$write cvh "#undef USE_DARWINSSL"
+$write cvh "#ifdef USE_WOLFSSL"
+$write cvh "#undef USE_WOLFSSL"
 $write cvh "#endif"
 $write cvh "#ifdef USE_GNUTLS"
 $write cvh "#undef USE_GNUTLS"
@@ -358,9 +352,6 @@ $write cvh "#endif"
 $write cvh "#ifdef USE_POLARSSL"
 $write cvh "#undef USE_POLARSSL"
 $write cvh "#endif"
-$write cvh "#ifdef USE_SCHANNEL"
-$write cvh "#undef USE_SCHANNEL"
-$write cvh "#endif"
 $write cvh "#ifdef USE_THREADS_POSIX"
 $write cvh "#undef USE_THREADS_POSIX"
 $write cvh "#endif"
@@ -370,9 +361,6 @@ $write cvh "#endif"
 $write cvh "#ifdef USE_UNIX_SOCKETS"
 $write cvh "#undef USE_UNIX_SOCKETS"
 $write cvh "#endif"
-$write cvh "#ifdef USE_WINDOWS_SSPI"
-$write cvh "#undef USE_WINDOWS_SSPI"
-$write cvh "#endif"
 $!
 $write cvh "#ifndef HAVE_OLD_GSSMIT"
 $write cvh "#define gss_nt_service_name GSS_C_NT_HOSTBASED_SERVICE"
@@ -407,12 +395,9 @@ $!
 $   write cvh "#ifndef USE_OPENSSL"
 $   write cvh "#define USE_OPENSSL 1"
 $   write cvh "#endif"
-$   write cvh "#ifndef USE_SSLEAY"
-$   write cvh "#define USE_SSLEAY 1"
-$   write cvh "#endif"
 $   if arch_name .eqs. "VAX"
 $   then
-$       old_mes = f$enviroment("message")
+$       old_mes = f$environment("message")
 $       set message/notext/nofaci/noseve/noident
 $       search/output=nla0: ssl$include:*.h CONF_MFLAGS_IGNORE_MISSING_FILE
 $       status = $severity
index 64b0aa8..7ec4ecb 100644 (file)
@@ -740,7 +740,7 @@ gnv$libcurl/share
 $endif
 $!
 $!
-$target = "persistant"
+$target = "persistent"
 $if f$search("[.docs.examples]''target'.exe") .eqs. ""
 $then
 $   define/user gnv$libcurl 'gnv_libcurl_share'
index 09f22a2..03d5c0b 100644 (file)
@@ -207,7 +207,7 @@ $   example_apps = example_apps + ",ftpupload,getinfo,getinmemory"
 $   example_apps = example_apps + ",http-post,httpcustomheader,httpput"
 $   example_apps = example_apps + ",https,multi-app,multi-debugcallback"
 $   example_apps = example_apps + ",multi-double,multi-post,multi-single"
-$   example_apps = example_apps + ",persistant,post-callback,postit2"
+$   example_apps = example_apps + ",persistent,post-callback,postit2"
 $   example_apps = example_apps + ",sendrecv,sepheaders,simple,simplepost"
 $   example_apps = example_apps + ",simplessl"
 $!
diff --git a/plan9/BUILD.PLAN9.txt b/plan9/BUILD.PLAN9.txt
new file mode 100644 (file)
index 0000000..6df23d3
--- /dev/null
@@ -0,0 +1,55 @@
+Prerequirement
+==============
+This document describes how to compile, build and install curl and libcurl
+from sources using mk. To build it, you will require to install latest
+9legacy patches into Plan 9. Also Plan 9 still have no configuration option so
+both zlib and libopenssl are required too.
+
+The zlib that is available on Plan 9 can be downloaded from:
+
+  https://github.com/madler/zlib/pull/398
+
+LibreSSL Portable can be downloaded from:
+
+  https://github.com/libressl-portable/portable/pull/510
+
+Instruction
+===========
+First, you should construct namespace as like described below:
+
+% bind -ac ../lib lib
+% bind -ac ../src src
+% bind -ac ../include include
+% bind -ac .. .
+
+Then you will see as shown below (excerpt):
+
+  curl.git/
+   |_plan9
+   | |_BUILD.PLAN9.txt
+   | |_CHANGES
+   | |_CMake
+   | |  :
+   | |_mkfile
+   | |_mkfile.proto
+   | |_include
+   | | |_Makefile.am
+   | | |  :
+   | | |_mkfile
+   | |_lib
+   | | |_CMakeLists.txt
+   | | |  :
+   | | |_mkfile
+   | | |_mkfile.inc
+   | |_src
+   | | |_CMakeLists.txt
+   | | |  :
+   | | |_mkfile
+   | | |_mkfile.inc
+   |_lib
+   |_src
+
+After constructing namespace, you can run mk on plan9 directory.
+
+% mk
+% mk install
diff --git a/plan9/include/mkfile b/plan9/include/mkfile
new file mode 100644 (file)
index 0000000..c1ed850
--- /dev/null
@@ -0,0 +1,34 @@
+#***************************************************************************
+#                                  _   _ ____  _
+#  Project                     ___| | | |  _ \| |
+#                             / __| | | | |_) | |
+#                            | (__| |_| |  _ <| |___
+#                             \___|\___/|_| \_\_____|
+#
+# Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
+# are also available at https://curl.haxx.se/docs/copyright.html.
+#
+# You may opt to use, copy, modify, merge, publish, distribute and/or sell
+# copies of the Software, and permit persons to whom the Software is
+# furnished to do so, under the terms of the COPYING file.
+#
+# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+# KIND, either express or implied.
+#
+###########################################################################
+
+DIR=/sys/include/ape/curl
+HFILES=`{ls curl/*.h}
+
+all:V: $HFILES
+
+install:V: all
+       mkdir -p $DIR
+       cp curl/*.h $DIR/
+
+clean:V: $HFILES  # do nothing
+
+nuke:V: clean
diff --git a/plan9/lib/mkfile b/plan9/lib/mkfile
new file mode 100644 (file)
index 0000000..d7a7ac5
--- /dev/null
@@ -0,0 +1,39 @@
+#***************************************************************************
+#                                  _   _ ____  _
+#  Project                     ___| | | |  _ \| |
+#                             / __| | | | |_) | |
+#                            | (__| |_| |  _ <| |___
+#                             \___|\___/|_| \_\_____|
+#
+# Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
+# are also available at https://curl.haxx.se/docs/copyright.html.
+#
+# You may opt to use, copy, modify, merge, publish, distribute and/or sell
+# copies of the Software, and permit persons to whom the Software is
+# furnished to do so, under the terms of the COPYING file.
+#
+# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+# KIND, either express or implied.
+#
+###########################################################################
+
+<../mkfile.proto
+<|mkfile.inc
+
+CFLAGS=$CFLAGS -I../include -I. -c
+
+OFILES=${CSOURCES:%.c=%.$O}
+HFILES=$HHEADERS
+LIB=/$objtype/lib/ape/libcurl.a
+
+CLEANFILES=\
+       ${LIB_VAUTH_CFILES:%.c=%.$O}\
+       ${LIB_VTLS_CFILES:%.c=%.$O}\
+
+</sys/src/cmd/mklib
+
+%.$O: %.c
+       $CC $CFLAGS -o $target $stem.c
diff --git a/plan9/lib/mkfile.inc b/plan9/lib/mkfile.inc
new file mode 100755 (executable)
index 0000000..0966d77
--- /dev/null
@@ -0,0 +1,25 @@
+#!/bin/rc
+#***************************************************************************
+#                                  _   _ ____  _
+#  Project                     ___| | | |  _ \| |
+#                             / __| | | | |_) | |
+#                            | (__| |_| |  _ <| |___
+#                             \___|\___/|_| \_\_____|
+#
+# Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
+# are also available at https://curl.haxx.se/docs/copyright.html.
+#
+# You may opt to use, copy, modify, merge, publish, distribute and/or sell
+# copies of the Software, and permit persons to whom the Software is
+# furnished to do so, under the terms of the COPYING file.
+#
+# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+# KIND, either express or implied.
+#
+###########################################################################
+
+# rename $(VAR) -> $VAR
+sed 's/\$\(([A-Z_]+)\)/$\1/g' Makefile.inc
diff --git a/plan9/mkfile b/plan9/mkfile
new file mode 100644 (file)
index 0000000..a9b4fe6
--- /dev/null
@@ -0,0 +1,36 @@
+#***************************************************************************
+#                                  _   _ ____  _
+#  Project                     ___| | | |  _ \| |
+#                             / __| | | | |_) | |
+#                            | (__| |_| |  _ <| |___
+#                             \___|\___/|_| \_\_____|
+#
+# Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
+# are also available at https://curl.haxx.se/docs/copyright.html.
+#
+# You may opt to use, copy, modify, merge, publish, distribute and/or sell
+# copies of the Software, and permit persons to whom the Software is
+# furnished to do so, under the terms of the COPYING file.
+#
+# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+# KIND, either express or implied.
+#
+###########################################################################
+
+</sys/src/ape/config
+
+DIRS=\
+       lib\
+       src\
+       include\
+
+default:V: all
+
+all install clean nuke:V:
+       for(i in $DIRS) @{
+               cd $i
+               mk $target
+       }
diff --git a/plan9/mkfile.proto b/plan9/mkfile.proto
new file mode 100644 (file)
index 0000000..edb79f5
--- /dev/null
@@ -0,0 +1,30 @@
+#***************************************************************************
+#                                  _   _ ____  _
+#  Project                     ___| | | |  _ \| |
+#                             / __| | | | |_) | |
+#                            | (__| |_| |  _ <| |___
+#                             \___|\___/|_| \_\_____|
+#
+# Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
+# are also available at https://curl.haxx.se/docs/copyright.html.
+#
+# You may opt to use, copy, modify, merge, publish, distribute and/or sell
+# copies of the Software, and permit persons to whom the Software is
+# furnished to do so, under the terms of the COPYING file.
+#
+# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+# KIND, either express or implied.
+#
+###########################################################################
+
+</sys/src/ape/config
+
+CFLAGS=\
+       -D__PLAN9__\
+       -D_POSIX_SOURCE\
+       -D_BSD_EXTENSION\
+       -D_SUSV2_SOURCE\
+       -D_REENTRANT_SOURCE\
diff --git a/plan9/src/mkfile b/plan9/src/mkfile
new file mode 100644 (file)
index 0000000..889d066
--- /dev/null
@@ -0,0 +1,45 @@
+#***************************************************************************
+#                                  _   _ ____  _
+#  Project                     ___| | | |  _ \| |
+#                             / __| | | | |_) | |
+#                            | (__| |_| |  _ <| |___
+#                             \___|\___/|_| \_\_____|
+#
+# Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
+# are also available at https://curl.haxx.se/docs/copyright.html.
+#
+# You may opt to use, copy, modify, merge, publish, distribute and/or sell
+# copies of the Software, and permit persons to whom the Software is
+# furnished to do so, under the terms of the COPYING file.
+#
+# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+# KIND, either express or implied.
+#
+###########################################################################
+
+<../mkfile.proto
+<|mkfile.inc
+
+CFLAGS=$CFLAGS -I../include -I../lib -c
+
+OFILES=${CURL_CFILES:%.c=%.$O}
+HFILES=$CURL_HFILES
+
+LIB=\
+       /$objtype/lib/ape/libcurl.a\
+       /$objtype/lib/ape/libssl.a\
+       /$objtype/lib/ape/libcrypto.a\
+       /$objtype/lib/ape/libz.a\
+
+BIN=/$objtype/bin
+TARG=curl
+
+CLEANFILES=tool_hugehelp.c
+
+</sys/src/cmd/mkone
+
+tool_hugehelp.c:
+       echo 'void hugehelp(void) {}' >$target
diff --git a/plan9/src/mkfile.inc b/plan9/src/mkfile.inc
new file mode 100755 (executable)
index 0000000..0966d77
--- /dev/null
@@ -0,0 +1,25 @@
+#!/bin/rc
+#***************************************************************************
+#                                  _   _ ____  _
+#  Project                     ___| | | |  _ \| |
+#                             / __| | | | |_) | |
+#                            | (__| |_| |  _ <| |___
+#                             \___|\___/|_| \_\_____|
+#
+# Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
+# are also available at https://curl.haxx.se/docs/copyright.html.
+#
+# You may opt to use, copy, modify, merge, publish, distribute and/or sell
+# copies of the Software, and permit persons to whom the Software is
+# furnished to do so, under the terms of the COPYING file.
+#
+# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+# KIND, either express or implied.
+#
+###########################################################################
+
+# rename $(VAR) -> $VAR
+sed 's/\$\(([A-Z_]+)\)/$\1/g' Makefile.inc
index 99b1d7a..62b9986 100644 (file)
@@ -151,9 +151,9 @@ Notes
 Legacy Windows and SSL
 ======================
 
-   Some of the project configurations allow the use of WinSSL (specifically
-   SChannel from Windows SSPI), the native SSL library in Windows. However,
-   WinSSL in Windows <= XP is unable to connect to servers that no longer
-   support the legacy handshakes and algorithms used by those versions. If
-   you will be using curl in one of those earlier versions of Windows you
-   should choose another SSL backend such as OpenSSL.
+   Some of the project configurations allow the use of Schannel, the native
+   SSL library in Windows which forms part of Windows SSPI. However, Schannel
+   in Windows <= XP is unable to connect to servers that no longer support the
+   legacy handshakes and algorithms used by those versions. If you will be
+   using curl in one of those earlier versions of Windows you should choose
+   another SSL backend such as OpenSSL.
index 7bd131c..bdd2e66 100644 (file)
-Microsoft Visual Studio Solution File, Format Version 11.00
-# Visual Studio 2010
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "curl", "src\curl.vcxproj", "{5228E9CE-A216-422F-A5E6-58E95E2DD71D}"
-       ProjectSection(ProjectDependencies) = postProject
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB} = {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}
-       EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libcurl", "lib\libcurl.vcxproj", "{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}"
-EndProject
-Global
-       GlobalSection(SolutionConfigurationPlatforms) = preSolution
-               DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               DLL Debug - DLL OpenSSL - DLL LibSSH2|x64 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
-               DLL Debug - DLL OpenSSL|Win32 = DLL Debug - DLL OpenSSL|Win32
-               DLL Debug - DLL OpenSSL|x64 = DLL Debug - DLL OpenSSL|x64
-               DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               DLL Debug - DLL Windows SSPI - DLL WinIDN|x64 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
-               DLL Debug - DLL Windows SSPI|Win32 = DLL Debug - DLL Windows SSPI|Win32
-               DLL Debug - DLL Windows SSPI|x64 = DLL Debug - DLL Windows SSPI|x64
-               DLL Debug - DLL wolfSSL|Win32 = DLL Debug - DLL wolfSSL|Win32
-               DLL Debug - DLL wolfSSL|x64 = DLL Debug - DLL wolfSSL|x64
-               DLL Debug|Win32 = DLL Debug|Win32
-               DLL Debug|x64 = DLL Debug|x64
-               DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
-               DLL Release - DLL OpenSSL - DLL LibSSH2|x64 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
-               DLL Release - DLL OpenSSL|Win32 = DLL Release - DLL OpenSSL|Win32
-               DLL Release - DLL OpenSSL|x64 = DLL Release - DLL OpenSSL|x64
-               DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
-               DLL Release - DLL Windows SSPI - DLL WinIDN|x64 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
-               DLL Release - DLL Windows SSPI|Win32 = DLL Release - DLL Windows SSPI|Win32
-               DLL Release - DLL Windows SSPI|x64 = DLL Release - DLL Windows SSPI|x64
-               DLL Release - DLL wolfSSL|Win32 = DLL Release - DLL wolfSSL|Win32
-               DLL Release - DLL wolfSSL|x64 = DLL Release - DLL wolfSSL|x64
-               DLL Release|Win32 = DLL Release|Win32
-               DLL Release|x64 = DLL Release|x64
-               LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               LIB Debug - DLL OpenSSL - DLL LibSSH2|x64 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
-               LIB Debug - DLL OpenSSL|Win32 = LIB Debug - DLL OpenSSL|Win32
-               LIB Debug - DLL OpenSSL|x64 = LIB Debug - DLL OpenSSL|x64
-               LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               LIB Debug - DLL Windows SSPI - DLL WinIDN|x64 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
-               LIB Debug - DLL Windows SSPI|Win32 = LIB Debug - DLL Windows SSPI|Win32
-               LIB Debug - DLL Windows SSPI|x64 = LIB Debug - DLL Windows SSPI|x64
-               LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
-               LIB Debug - LIB OpenSSL - LIB LibSSH2|x64 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
-               LIB Debug - LIB OpenSSL|Win32 = LIB Debug - LIB OpenSSL|Win32
-               LIB Debug - LIB OpenSSL|x64 = LIB Debug - LIB OpenSSL|x64
-               LIB Debug - LIB wolfSSL|Win32 = LIB Debug - LIB wolfSSL|Win32
-               LIB Debug - LIB wolfSSL|x64 = LIB Debug - LIB wolfSSL|x64
-               LIB Debug|Win32 = LIB Debug|Win32
-               LIB Debug|x64 = LIB Debug|x64
-               LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
-               LIB Release - DLL OpenSSL - DLL LibSSH2|x64 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
-               LIB Release - DLL OpenSSL|Win32 = LIB Release - DLL OpenSSL|Win32
-               LIB Release - DLL OpenSSL|x64 = LIB Release - DLL OpenSSL|x64
-               LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
-               LIB Release - DLL Windows SSPI - DLL WinIDN|x64 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
-               LIB Release - DLL Windows SSPI|Win32 = LIB Release - DLL Windows SSPI|Win32
-               LIB Release - DLL Windows SSPI|x64 = LIB Release - DLL Windows SSPI|x64
-               LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
-               LIB Release - LIB OpenSSL - LIB LibSSH2|x64 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
-               LIB Release - LIB OpenSSL|Win32 = LIB Release - LIB OpenSSL|Win32
-               LIB Release - LIB OpenSSL|x64 = LIB Release - LIB OpenSSL|x64
-               LIB Release - LIB wolfSSL|Win32 = LIB Release - LIB wolfSSL|Win32
-               LIB Release - LIB wolfSSL|x64 = LIB Release - LIB wolfSSL|x64
-               LIB Release|Win32 = LIB Release|Win32
-               LIB Release|x64 = LIB Release|x64
-       EndGlobalSection
-       GlobalSection(ProjectConfigurationPlatforms) = postSolution
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|Win32.ActiveCfg = DLL Debug - DLL OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|Win32.Build.0 = DLL Debug - DLL OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|x64.ActiveCfg = DLL Debug - DLL OpenSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|x64.Build.0 = DLL Debug - DLL OpenSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|Win32.Build.0 = DLL Debug - DLL Windows SSPI|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|x64.ActiveCfg = DLL Debug - DLL Windows SSPI|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|x64.Build.0 = DLL Debug - DLL Windows SSPI|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL wolfSSL|Win32.ActiveCfg = DLL Debug - DLL wolfSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL wolfSSL|Win32.Build.0 = DLL Debug - DLL wolfSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL wolfSSL|x64.ActiveCfg = DLL Debug - DLL wolfSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL wolfSSL|x64.Build.0 = DLL Debug - DLL wolfSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|Win32.Build.0 = DLL Debug|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|x64.ActiveCfg = DLL Debug|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|x64.Build.0 = DLL Debug|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|Win32.ActiveCfg = DLL Release - DLL OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|Win32.Build.0 = DLL Release - DLL OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|x64.ActiveCfg = DLL Release - DLL OpenSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|x64.Build.0 = DLL Release - DLL OpenSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|Win32.ActiveCfg = DLL Release - DLL Windows SSPI|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|Win32.Build.0 = DLL Release - DLL Windows SSPI|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|x64.ActiveCfg = DLL Release - DLL Windows SSPI|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|x64.Build.0 = DLL Release - DLL Windows SSPI|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL wolfSSL|Win32.ActiveCfg = DLL Release - DLL wolfSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL wolfSSL|Win32.Build.0 = DLL Release - DLL wolfSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL wolfSSL|x64.ActiveCfg = DLL Release - DLL wolfSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL wolfSSL|x64.Build.0 = DLL Release - DLL wolfSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|Win32.ActiveCfg = DLL Release|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|Win32.Build.0 = DLL Release|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|x64.ActiveCfg = DLL Release|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|x64.Build.0 = DLL Release|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|Win32.ActiveCfg = LIB Debug - DLL OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|Win32.Build.0 = LIB Debug - DLL OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|x64.ActiveCfg = LIB Debug - DLL OpenSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|x64.Build.0 = LIB Debug - DLL OpenSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|Win32.Build.0 = LIB Debug - DLL Windows SSPI|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|x64.ActiveCfg = LIB Debug - DLL Windows SSPI|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|x64.Build.0 = LIB Debug - DLL Windows SSPI|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|Win32.ActiveCfg = LIB Debug - LIB OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|Win32.Build.0 = LIB Debug - LIB OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|x64.ActiveCfg = LIB Debug - LIB OpenSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|x64.Build.0 = LIB Debug - LIB OpenSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB wolfSSL|Win32.ActiveCfg = LIB Debug - LIB wolfSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB wolfSSL|Win32.Build.0 = LIB Debug - LIB wolfSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB wolfSSL|x64.ActiveCfg = LIB Debug - LIB wolfSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB wolfSSL|x64.Build.0 = LIB Debug - LIB wolfSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|Win32.ActiveCfg = LIB Debug|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|Win32.Build.0 = LIB Debug|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|x64.ActiveCfg = LIB Debug|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|x64.Build.0 = LIB Debug|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|Win32.ActiveCfg = LIB Release - DLL OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|Win32.Build.0 = LIB Release - DLL OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|x64.ActiveCfg = LIB Release - DLL OpenSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|x64.Build.0 = LIB Release - DLL OpenSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|Win32.ActiveCfg = LIB Release - DLL Windows SSPI|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|Win32.Build.0 = LIB Release - DLL Windows SSPI|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|x64.ActiveCfg = LIB Release - DLL Windows SSPI|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|x64.Build.0 = LIB Release - DLL Windows SSPI|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|Win32.ActiveCfg = LIB Release - LIB OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|Win32.Build.0 = LIB Release - LIB OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|x64.ActiveCfg = LIB Release - LIB OpenSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|x64.Build.0 = LIB Release - LIB OpenSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB wolfSSL|Win32.ActiveCfg = LIB Release - LIB wolfSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB wolfSSL|Win32.Build.0 = LIB Release - LIB wolfSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB wolfSSL|x64.ActiveCfg = LIB Release - LIB wolfSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB wolfSSL|x64.Build.0 = LIB Release - LIB wolfSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|Win32.ActiveCfg = LIB Release|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|Win32.Build.0 = LIB Release|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|x64.ActiveCfg = LIB Release|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|x64.Build.0 = LIB Release|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|Win32.ActiveCfg = DLL Debug - DLL OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|Win32.Build.0 = DLL Debug - DLL OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|x64.ActiveCfg = DLL Debug - DLL OpenSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|x64.Build.0 = DLL Debug - DLL OpenSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|Win32.Build.0 = DLL Debug - DLL Windows SSPI|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|x64.ActiveCfg = DLL Debug - DLL Windows SSPI|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|x64.Build.0 = DLL Debug - DLL Windows SSPI|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL wolfSSL|Win32.ActiveCfg = DLL Debug - DLL wolfSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL wolfSSL|Win32.Build.0 = DLL Debug - DLL wolfSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL wolfSSL|x64.ActiveCfg = DLL Debug - DLL wolfSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL wolfSSL|x64.Build.0 = DLL Debug - DLL wolfSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|Win32.Build.0 = DLL Debug|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|x64.ActiveCfg = DLL Debug|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|x64.Build.0 = DLL Debug|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|Win32.ActiveCfg = DLL Release - DLL OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|Win32.Build.0 = DLL Release - DLL OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|x64.ActiveCfg = DLL Release - DLL OpenSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|x64.Build.0 = DLL Release - DLL OpenSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|Win32.ActiveCfg = DLL Release - DLL Windows SSPI|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|Win32.Build.0 = DLL Release - DLL Windows SSPI|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|x64.ActiveCfg = DLL Release - DLL Windows SSPI|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|x64.Build.0 = DLL Release - DLL Windows SSPI|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL wolfSSL|Win32.ActiveCfg = DLL Release - DLL wolfSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL wolfSSL|Win32.Build.0 = DLL Release - DLL wolfSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL wolfSSL|x64.ActiveCfg = DLL Release - DLL wolfSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL wolfSSL|x64.Build.0 = DLL Release - DLL wolfSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|Win32.ActiveCfg = DLL Release|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|Win32.Build.0 = DLL Release|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|x64.ActiveCfg = DLL Release|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|x64.Build.0 = DLL Release|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|Win32.ActiveCfg = LIB Debug - DLL OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|Win32.Build.0 = LIB Debug - DLL OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|x64.ActiveCfg = LIB Debug - DLL OpenSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|x64.Build.0 = LIB Debug - DLL OpenSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|Win32.Build.0 = LIB Debug - DLL Windows SSPI|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|x64.ActiveCfg = LIB Debug - DLL Windows SSPI|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|x64.Build.0 = LIB Debug - DLL Windows SSPI|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|Win32.ActiveCfg = LIB Debug - LIB OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|Win32.Build.0 = LIB Debug - LIB OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|x64.ActiveCfg = LIB Debug - LIB OpenSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|x64.Build.0 = LIB Debug - LIB OpenSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB wolfSSL|Win32.ActiveCfg = LIB Debug - LIB wolfSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB wolfSSL|Win32.Build.0 = LIB Debug - LIB wolfSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB wolfSSL|x64.ActiveCfg = LIB Debug - LIB wolfSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB wolfSSL|x64.Build.0 = LIB Debug - LIB wolfSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|Win32.ActiveCfg = LIB Debug|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|Win32.Build.0 = LIB Debug|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|x64.ActiveCfg = LIB Debug|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|x64.Build.0 = LIB Debug|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|Win32.ActiveCfg = LIB Release - DLL OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|Win32.Build.0 = LIB Release - DLL OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|x64.ActiveCfg = LIB Release - DLL OpenSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|x64.Build.0 = LIB Release - DLL OpenSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|Win32.ActiveCfg = LIB Release - DLL Windows SSPI|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|Win32.Build.0 = LIB Release - DLL Windows SSPI|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|x64.ActiveCfg = LIB Release - DLL Windows SSPI|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|x64.Build.0 = LIB Release - DLL Windows SSPI|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|Win32.ActiveCfg = LIB Release - LIB OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|Win32.Build.0 = LIB Release - LIB OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|x64.ActiveCfg = LIB Release - LIB OpenSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|x64.Build.0 = LIB Release - LIB OpenSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB wolfSSL|Win32.ActiveCfg = LIB Release - LIB wolfSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB wolfSSL|Win32.Build.0 = LIB Release - LIB wolfSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB wolfSSL|x64.ActiveCfg = LIB Release - LIB wolfSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB wolfSSL|x64.Build.0 = LIB Release - LIB wolfSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|Win32.ActiveCfg = LIB Release|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|Win32.Build.0 = LIB Release|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|x64.ActiveCfg = LIB Release|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|x64.Build.0 = LIB Release|x64
-       EndGlobalSection
-       GlobalSection(SolutionProperties) = preSolution
-               HideSolutionNode = FALSE
-       EndGlobalSection
-EndGlobal
+Microsoft Visual Studio Solution File, Format Version 11.00\r
+# Visual Studio 2010\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "curl", "src\curl.vcxproj", "{5228E9CE-A216-422F-A5E6-58E95E2DD71D}"\r
+       ProjectSection(ProjectDependencies) = postProject\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB} = {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}\r
+       EndProjectSection\r
+EndProject\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libcurl", "lib\libcurl.vcxproj", "{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}"\r
+EndProject\r
+Global\r
+       GlobalSection(SolutionConfigurationPlatforms) = preSolution\r
+               DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               DLL Debug - DLL OpenSSL - DLL LibSSH2|x64 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64\r
+               DLL Debug - DLL OpenSSL|Win32 = DLL Debug - DLL OpenSSL|Win32\r
+               DLL Debug - DLL OpenSSL|x64 = DLL Debug - DLL OpenSSL|x64\r
+               DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               DLL Debug - DLL Windows SSPI - DLL WinIDN|x64 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64\r
+               DLL Debug - DLL Windows SSPI|Win32 = DLL Debug - DLL Windows SSPI|Win32\r
+               DLL Debug - DLL Windows SSPI|x64 = DLL Debug - DLL Windows SSPI|x64\r
+               DLL Debug - DLL wolfSSL|Win32 = DLL Debug - DLL wolfSSL|Win32\r
+               DLL Debug - DLL wolfSSL|x64 = DLL Debug - DLL wolfSSL|x64\r
+               DLL Debug|Win32 = DLL Debug|Win32\r
+               DLL Debug|x64 = DLL Debug|x64\r
+               DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               DLL Release - DLL OpenSSL - DLL LibSSH2|x64 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64\r
+               DLL Release - DLL OpenSSL|Win32 = DLL Release - DLL OpenSSL|Win32\r
+               DLL Release - DLL OpenSSL|x64 = DLL Release - DLL OpenSSL|x64\r
+               DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               DLL Release - DLL Windows SSPI - DLL WinIDN|x64 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64\r
+               DLL Release - DLL Windows SSPI|Win32 = DLL Release - DLL Windows SSPI|Win32\r
+               DLL Release - DLL Windows SSPI|x64 = DLL Release - DLL Windows SSPI|x64\r
+               DLL Release - DLL wolfSSL|Win32 = DLL Release - DLL wolfSSL|Win32\r
+               DLL Release - DLL wolfSSL|x64 = DLL Release - DLL wolfSSL|x64\r
+               DLL Release|Win32 = DLL Release|Win32\r
+               DLL Release|x64 = DLL Release|x64\r
+               LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               LIB Debug - DLL OpenSSL - DLL LibSSH2|x64 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64\r
+               LIB Debug - DLL OpenSSL|Win32 = LIB Debug - DLL OpenSSL|Win32\r
+               LIB Debug - DLL OpenSSL|x64 = LIB Debug - DLL OpenSSL|x64\r
+               LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               LIB Debug - DLL Windows SSPI - DLL WinIDN|x64 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64\r
+               LIB Debug - DLL Windows SSPI|Win32 = LIB Debug - DLL Windows SSPI|Win32\r
+               LIB Debug - DLL Windows SSPI|x64 = LIB Debug - DLL Windows SSPI|x64\r
+               LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32\r
+               LIB Debug - LIB OpenSSL - LIB LibSSH2|x64 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64\r
+               LIB Debug - LIB OpenSSL|Win32 = LIB Debug - LIB OpenSSL|Win32\r
+               LIB Debug - LIB OpenSSL|x64 = LIB Debug - LIB OpenSSL|x64\r
+               LIB Debug - LIB wolfSSL|Win32 = LIB Debug - LIB wolfSSL|Win32\r
+               LIB Debug - LIB wolfSSL|x64 = LIB Debug - LIB wolfSSL|x64\r
+               LIB Debug|Win32 = LIB Debug|Win32\r
+               LIB Debug|x64 = LIB Debug|x64\r
+               LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               LIB Release - DLL OpenSSL - DLL LibSSH2|x64 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64\r
+               LIB Release - DLL OpenSSL|Win32 = LIB Release - DLL OpenSSL|Win32\r
+               LIB Release - DLL OpenSSL|x64 = LIB Release - DLL OpenSSL|x64\r
+               LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               LIB Release - DLL Windows SSPI - DLL WinIDN|x64 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64\r
+               LIB Release - DLL Windows SSPI|Win32 = LIB Release - DLL Windows SSPI|Win32\r
+               LIB Release - DLL Windows SSPI|x64 = LIB Release - DLL Windows SSPI|x64\r
+               LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32\r
+               LIB Release - LIB OpenSSL - LIB LibSSH2|x64 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64\r
+               LIB Release - LIB OpenSSL|Win32 = LIB Release - LIB OpenSSL|Win32\r
+               LIB Release - LIB OpenSSL|x64 = LIB Release - LIB OpenSSL|x64\r
+               LIB Release - LIB wolfSSL|Win32 = LIB Release - LIB wolfSSL|Win32\r
+               LIB Release - LIB wolfSSL|x64 = LIB Release - LIB wolfSSL|x64\r
+               LIB Release|Win32 = LIB Release|Win32\r
+               LIB Release|x64 = LIB Release|x64\r
+       EndGlobalSection\r
+       GlobalSection(ProjectConfigurationPlatforms) = postSolution\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|Win32.ActiveCfg = DLL Debug - DLL OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|Win32.Build.0 = DLL Debug - DLL OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|x64.ActiveCfg = DLL Debug - DLL OpenSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|x64.Build.0 = DLL Debug - DLL OpenSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|Win32.Build.0 = DLL Debug - DLL Windows SSPI|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|x64.ActiveCfg = DLL Debug - DLL Windows SSPI|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|x64.Build.0 = DLL Debug - DLL Windows SSPI|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL wolfSSL|Win32.ActiveCfg = DLL Debug - DLL wolfSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL wolfSSL|Win32.Build.0 = DLL Debug - DLL wolfSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL wolfSSL|x64.ActiveCfg = DLL Debug - DLL wolfSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL wolfSSL|x64.Build.0 = DLL Debug - DLL wolfSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|Win32.Build.0 = DLL Debug|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|x64.ActiveCfg = DLL Debug|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|x64.Build.0 = DLL Debug|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|Win32.ActiveCfg = DLL Release - DLL OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|Win32.Build.0 = DLL Release - DLL OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|x64.ActiveCfg = DLL Release - DLL OpenSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|x64.Build.0 = DLL Release - DLL OpenSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|Win32.ActiveCfg = DLL Release - DLL Windows SSPI|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|Win32.Build.0 = DLL Release - DLL Windows SSPI|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|x64.ActiveCfg = DLL Release - DLL Windows SSPI|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|x64.Build.0 = DLL Release - DLL Windows SSPI|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL wolfSSL|Win32.ActiveCfg = DLL Release - DLL wolfSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL wolfSSL|Win32.Build.0 = DLL Release - DLL wolfSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL wolfSSL|x64.ActiveCfg = DLL Release - DLL wolfSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL wolfSSL|x64.Build.0 = DLL Release - DLL wolfSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|Win32.ActiveCfg = DLL Release|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|Win32.Build.0 = DLL Release|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|x64.ActiveCfg = DLL Release|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|x64.Build.0 = DLL Release|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|Win32.ActiveCfg = LIB Debug - DLL OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|Win32.Build.0 = LIB Debug - DLL OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|x64.ActiveCfg = LIB Debug - DLL OpenSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|x64.Build.0 = LIB Debug - DLL OpenSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|Win32.Build.0 = LIB Debug - DLL Windows SSPI|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|x64.ActiveCfg = LIB Debug - DLL Windows SSPI|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|x64.Build.0 = LIB Debug - DLL Windows SSPI|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|Win32.ActiveCfg = LIB Debug - LIB OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|Win32.Build.0 = LIB Debug - LIB OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|x64.ActiveCfg = LIB Debug - LIB OpenSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|x64.Build.0 = LIB Debug - LIB OpenSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB wolfSSL|Win32.ActiveCfg = LIB Debug - LIB wolfSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB wolfSSL|Win32.Build.0 = LIB Debug - LIB wolfSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB wolfSSL|x64.ActiveCfg = LIB Debug - LIB wolfSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB wolfSSL|x64.Build.0 = LIB Debug - LIB wolfSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|Win32.ActiveCfg = LIB Debug|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|Win32.Build.0 = LIB Debug|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|x64.ActiveCfg = LIB Debug|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|x64.Build.0 = LIB Debug|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|Win32.ActiveCfg = LIB Release - DLL OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|Win32.Build.0 = LIB Release - DLL OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|x64.ActiveCfg = LIB Release - DLL OpenSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|x64.Build.0 = LIB Release - DLL OpenSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|Win32.ActiveCfg = LIB Release - DLL Windows SSPI|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|Win32.Build.0 = LIB Release - DLL Windows SSPI|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|x64.ActiveCfg = LIB Release - DLL Windows SSPI|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|x64.Build.0 = LIB Release - DLL Windows SSPI|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|Win32.ActiveCfg = LIB Release - LIB OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|Win32.Build.0 = LIB Release - LIB OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|x64.ActiveCfg = LIB Release - LIB OpenSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|x64.Build.0 = LIB Release - LIB OpenSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB wolfSSL|Win32.ActiveCfg = LIB Release - LIB wolfSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB wolfSSL|Win32.Build.0 = LIB Release - LIB wolfSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB wolfSSL|x64.ActiveCfg = LIB Release - LIB wolfSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB wolfSSL|x64.Build.0 = LIB Release - LIB wolfSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|Win32.ActiveCfg = LIB Release|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|Win32.Build.0 = LIB Release|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|x64.ActiveCfg = LIB Release|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|x64.Build.0 = LIB Release|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|Win32.ActiveCfg = DLL Debug - DLL OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|Win32.Build.0 = DLL Debug - DLL OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|x64.ActiveCfg = DLL Debug - DLL OpenSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|x64.Build.0 = DLL Debug - DLL OpenSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|Win32.Build.0 = DLL Debug - DLL Windows SSPI|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|x64.ActiveCfg = DLL Debug - DLL Windows SSPI|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|x64.Build.0 = DLL Debug - DLL Windows SSPI|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL wolfSSL|Win32.ActiveCfg = DLL Debug - DLL wolfSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL wolfSSL|Win32.Build.0 = DLL Debug - DLL wolfSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL wolfSSL|x64.ActiveCfg = DLL Debug - DLL wolfSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL wolfSSL|x64.Build.0 = DLL Debug - DLL wolfSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|Win32.Build.0 = DLL Debug|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|x64.ActiveCfg = DLL Debug|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|x64.Build.0 = DLL Debug|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|Win32.ActiveCfg = DLL Release - DLL OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|Win32.Build.0 = DLL Release - DLL OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|x64.ActiveCfg = DLL Release - DLL OpenSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|x64.Build.0 = DLL Release - DLL OpenSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|Win32.ActiveCfg = DLL Release - DLL Windows SSPI|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|Win32.Build.0 = DLL Release - DLL Windows SSPI|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|x64.ActiveCfg = DLL Release - DLL Windows SSPI|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|x64.Build.0 = DLL Release - DLL Windows SSPI|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL wolfSSL|Win32.ActiveCfg = DLL Release - DLL wolfSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL wolfSSL|Win32.Build.0 = DLL Release - DLL wolfSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL wolfSSL|x64.ActiveCfg = DLL Release - DLL wolfSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL wolfSSL|x64.Build.0 = DLL Release - DLL wolfSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|Win32.ActiveCfg = DLL Release|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|Win32.Build.0 = DLL Release|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|x64.ActiveCfg = DLL Release|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|x64.Build.0 = DLL Release|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|Win32.ActiveCfg = LIB Debug - DLL OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|Win32.Build.0 = LIB Debug - DLL OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|x64.ActiveCfg = LIB Debug - DLL OpenSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|x64.Build.0 = LIB Debug - DLL OpenSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|Win32.Build.0 = LIB Debug - DLL Windows SSPI|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|x64.ActiveCfg = LIB Debug - DLL Windows SSPI|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|x64.Build.0 = LIB Debug - DLL Windows SSPI|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|Win32.ActiveCfg = LIB Debug - LIB OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|Win32.Build.0 = LIB Debug - LIB OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|x64.ActiveCfg = LIB Debug - LIB OpenSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|x64.Build.0 = LIB Debug - LIB OpenSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB wolfSSL|Win32.ActiveCfg = LIB Debug - LIB wolfSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB wolfSSL|Win32.Build.0 = LIB Debug - LIB wolfSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB wolfSSL|x64.ActiveCfg = LIB Debug - LIB wolfSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB wolfSSL|x64.Build.0 = LIB Debug - LIB wolfSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|Win32.ActiveCfg = LIB Debug|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|Win32.Build.0 = LIB Debug|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|x64.ActiveCfg = LIB Debug|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|x64.Build.0 = LIB Debug|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|Win32.ActiveCfg = LIB Release - DLL OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|Win32.Build.0 = LIB Release - DLL OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|x64.ActiveCfg = LIB Release - DLL OpenSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|x64.Build.0 = LIB Release - DLL OpenSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|Win32.ActiveCfg = LIB Release - DLL Windows SSPI|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|Win32.Build.0 = LIB Release - DLL Windows SSPI|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|x64.ActiveCfg = LIB Release - DLL Windows SSPI|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|x64.Build.0 = LIB Release - DLL Windows SSPI|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|Win32.ActiveCfg = LIB Release - LIB OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|Win32.Build.0 = LIB Release - LIB OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|x64.ActiveCfg = LIB Release - LIB OpenSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|x64.Build.0 = LIB Release - LIB OpenSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB wolfSSL|Win32.ActiveCfg = LIB Release - LIB wolfSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB wolfSSL|Win32.Build.0 = LIB Release - LIB wolfSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB wolfSSL|x64.ActiveCfg = LIB Release - LIB wolfSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB wolfSSL|x64.Build.0 = LIB Release - LIB wolfSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|Win32.ActiveCfg = LIB Release|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|Win32.Build.0 = LIB Release|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|x64.ActiveCfg = LIB Release|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|x64.Build.0 = LIB Release|x64\r
+       EndGlobalSection\r
+       GlobalSection(SolutionProperties) = preSolution\r
+               HideSolutionNode = FALSE\r
+       EndGlobalSection\r
+EndGlobal\r
index 15461ef..159ab7d 100644 (file)
-Microsoft Visual Studio Solution File, Format Version 11.00
-# Visual Studio 2010
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libcurl", "libcurl.vcxproj", "{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}"
-EndProject
-Global
-       GlobalSection(SolutionConfigurationPlatforms) = preSolution
-               DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               DLL Debug - DLL OpenSSL - DLL LibSSH2|x64 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
-               DLL Debug - DLL OpenSSL|Win32 = DLL Debug - DLL OpenSSL|Win32
-               DLL Debug - DLL OpenSSL|x64 = DLL Debug - DLL OpenSSL|x64
-               DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               DLL Debug - DLL Windows SSPI - DLL WinIDN|x64 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
-               DLL Debug - DLL Windows SSPI|Win32 = DLL Debug - DLL Windows SSPI|Win32
-               DLL Debug - DLL Windows SSPI|x64 = DLL Debug - DLL Windows SSPI|x64
-               DLL Debug - DLL wolfSSL|Win32 = DLL Debug - DLL wolfSSL|Win32
-               DLL Debug - DLL wolfSSL|x64 = DLL Debug - DLL wolfSSL|x64
-               DLL Debug|Win32 = DLL Debug|Win32
-               DLL Debug|x64 = DLL Debug|x64
-               DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
-               DLL Release - DLL OpenSSL - DLL LibSSH2|x64 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
-               DLL Release - DLL OpenSSL|Win32 = DLL Release - DLL OpenSSL|Win32
-               DLL Release - DLL OpenSSL|x64 = DLL Release - DLL OpenSSL|x64
-               DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
-               DLL Release - DLL Windows SSPI - DLL WinIDN|x64 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
-               DLL Release - DLL Windows SSPI|Win32 = DLL Release - DLL Windows SSPI|Win32
-               DLL Release - DLL Windows SSPI|x64 = DLL Release - DLL Windows SSPI|x64
-               DLL Release - DLL wolfSSL|Win32 = DLL Release - DLL wolfSSL|Win32
-               DLL Release - DLL wolfSSL|x64 = DLL Release - DLL wolfSSL|x64
-               DLL Release|Win32 = DLL Release|Win32
-               DLL Release|x64 = DLL Release|x64
-               LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               LIB Debug - DLL OpenSSL - DLL LibSSH2|x64 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
-               LIB Debug - DLL OpenSSL|Win32 = LIB Debug - DLL OpenSSL|Win32
-               LIB Debug - DLL OpenSSL|x64 = LIB Debug - DLL OpenSSL|x64
-               LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               LIB Debug - DLL Windows SSPI - DLL WinIDN|x64 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
-               LIB Debug - DLL Windows SSPI|Win32 = LIB Debug - DLL Windows SSPI|Win32
-               LIB Debug - DLL Windows SSPI|x64 = LIB Debug - DLL Windows SSPI|x64
-               LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
-               LIB Debug - LIB OpenSSL - LIB LibSSH2|x64 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
-               LIB Debug - LIB OpenSSL|Win32 = LIB Debug - LIB OpenSSL|Win32
-               LIB Debug - LIB OpenSSL|x64 = LIB Debug - LIB OpenSSL|x64
-               LIB Debug - LIB wolfSSL|Win32 = LIB Debug - LIB wolfSSL|Win32
-               LIB Debug - LIB wolfSSL|x64 = LIB Debug - LIB wolfSSL|x64
-               LIB Debug|Win32 = LIB Debug|Win32
-               LIB Debug|x64 = LIB Debug|x64
-               LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
-               LIB Release - DLL OpenSSL - DLL LibSSH2|x64 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
-               LIB Release - DLL OpenSSL|Win32 = LIB Release - DLL OpenSSL|Win32
-               LIB Release - DLL OpenSSL|x64 = LIB Release - DLL OpenSSL|x64
-               LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
-               LIB Release - DLL Windows SSPI - DLL WinIDN|x64 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
-               LIB Release - DLL Windows SSPI|Win32 = LIB Release - DLL Windows SSPI|Win32
-               LIB Release - DLL Windows SSPI|x64 = LIB Release - DLL Windows SSPI|x64
-               LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
-               LIB Release - LIB OpenSSL - LIB LibSSH2|x64 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
-               LIB Release - LIB OpenSSL|Win32 = LIB Release - LIB OpenSSL|Win32
-               LIB Release - LIB OpenSSL|x64 = LIB Release - LIB OpenSSL|x64
-               LIB Release - LIB wolfSSL|Win32 = LIB Release - LIB wolfSSL|Win32
-               LIB Release - LIB wolfSSL|x64 = LIB Release - LIB wolfSSL|x64
-               LIB Release|Win32 = LIB Release|Win32
-               LIB Release|x64 = LIB Release|x64
-       EndGlobalSection
-       GlobalSection(ProjectConfigurationPlatforms) = postSolution
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|Win32.ActiveCfg = DLL Debug - DLL OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|Win32.Build.0 = DLL Debug - DLL OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|x64.ActiveCfg = DLL Debug - DLL OpenSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|x64.Build.0 = DLL Debug - DLL OpenSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|Win32.Build.0 = DLL Debug - DLL Windows SSPI|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|x64.ActiveCfg = DLL Debug - DLL Windows SSPI|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|x64.Build.0 = DLL Debug - DLL Windows SSPI|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL wolfSSL|Win32.ActiveCfg = DLL Debug - DLL wolfSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL wolfSSL|Win32.Build.0 = DLL Debug - DLL wolfSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL wolfSSL|x64.ActiveCfg = DLL Debug - DLL wolfSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL wolfSSL|x64.Build.0 = DLL Debug - DLL wolfSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|Win32.Build.0 = DLL Debug|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|x64.ActiveCfg = DLL Debug|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|x64.Build.0 = DLL Debug|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|Win32.ActiveCfg = DLL Release - DLL OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|Win32.Build.0 = DLL Release - DLL OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|x64.ActiveCfg = DLL Release - DLL OpenSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|x64.Build.0 = DLL Release - DLL OpenSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|Win32.ActiveCfg = DLL Release - DLL Windows SSPI|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|Win32.Build.0 = DLL Release - DLL Windows SSPI|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|x64.ActiveCfg = DLL Release - DLL Windows SSPI|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|x64.Build.0 = DLL Release - DLL Windows SSPI|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL wolfSSL|Win32.ActiveCfg = DLL Release - DLL wolfSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL wolfSSL|Win32.Build.0 = DLL Release - DLL wolfSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL wolfSSL|x64.ActiveCfg = DLL Release - DLL wolfSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL wolfSSL|x64.Build.0 = DLL Release - DLL wolfSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|Win32.ActiveCfg = DLL Release|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|Win32.Build.0 = DLL Release|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|x64.ActiveCfg = DLL Release|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|x64.Build.0 = DLL Release|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|Win32.ActiveCfg = LIB Debug - DLL OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|Win32.Build.0 = LIB Debug - DLL OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|x64.ActiveCfg = LIB Debug - DLL OpenSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|x64.Build.0 = LIB Debug - DLL OpenSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|Win32.Build.0 = LIB Debug - DLL Windows SSPI|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|x64.ActiveCfg = LIB Debug - DLL Windows SSPI|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|x64.Build.0 = LIB Debug - DLL Windows SSPI|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|Win32.ActiveCfg = LIB Debug - LIB OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|Win32.Build.0 = LIB Debug - LIB OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|x64.ActiveCfg = LIB Debug - LIB OpenSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|x64.Build.0 = LIB Debug - LIB OpenSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB wolfSSL|Win32.ActiveCfg = LIB Debug - LIB wolfSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB wolfSSL|Win32.Build.0 = LIB Debug - LIB wolfSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB wolfSSL|x64.ActiveCfg = LIB Debug - LIB wolfSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB wolfSSL|x64.Build.0 = LIB Debug - LIB wolfSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|Win32.ActiveCfg = LIB Debug|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|Win32.Build.0 = LIB Debug|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|x64.ActiveCfg = LIB Debug|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|x64.Build.0 = LIB Debug|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|Win32.ActiveCfg = LIB Release - DLL OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|Win32.Build.0 = LIB Release - DLL OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|x64.ActiveCfg = LIB Release - DLL OpenSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|x64.Build.0 = LIB Release - DLL OpenSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|Win32.ActiveCfg = LIB Release - DLL Windows SSPI|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|Win32.Build.0 = LIB Release - DLL Windows SSPI|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|x64.ActiveCfg = LIB Release - DLL Windows SSPI|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|x64.Build.0 = LIB Release - DLL Windows SSPI|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|Win32.ActiveCfg = LIB Release - LIB OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|Win32.Build.0 = LIB Release - LIB OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|x64.ActiveCfg = LIB Release - LIB OpenSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|x64.Build.0 = LIB Release - LIB OpenSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB wolfSSL|Win32.ActiveCfg = LIB Release - LIB wolfSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB wolfSSL|Win32.Build.0 = LIB Release - LIB wolfSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB wolfSSL|x64.ActiveCfg = LIB Release - LIB wolfSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB wolfSSL|x64.Build.0 = LIB Release - LIB wolfSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|Win32.ActiveCfg = LIB Release|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|Win32.Build.0 = LIB Release|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|x64.ActiveCfg = LIB Release|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|x64.Build.0 = LIB Release|x64
-       EndGlobalSection
-       GlobalSection(SolutionProperties) = preSolution
-               HideSolutionNode = FALSE
-       EndGlobalSection
-EndGlobal
+Microsoft Visual Studio Solution File, Format Version 11.00\r
+# Visual Studio 2010\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libcurl", "libcurl.vcxproj", "{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}"\r
+EndProject\r
+Global\r
+       GlobalSection(SolutionConfigurationPlatforms) = preSolution\r
+               DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               DLL Debug - DLL OpenSSL - DLL LibSSH2|x64 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64\r
+               DLL Debug - DLL OpenSSL|Win32 = DLL Debug - DLL OpenSSL|Win32\r
+               DLL Debug - DLL OpenSSL|x64 = DLL Debug - DLL OpenSSL|x64\r
+               DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               DLL Debug - DLL Windows SSPI - DLL WinIDN|x64 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64\r
+               DLL Debug - DLL Windows SSPI|Win32 = DLL Debug - DLL Windows SSPI|Win32\r
+               DLL Debug - DLL Windows SSPI|x64 = DLL Debug - DLL Windows SSPI|x64\r
+               DLL Debug - DLL wolfSSL|Win32 = DLL Debug - DLL wolfSSL|Win32\r
+               DLL Debug - DLL wolfSSL|x64 = DLL Debug - DLL wolfSSL|x64\r
+               DLL Debug|Win32 = DLL Debug|Win32\r
+               DLL Debug|x64 = DLL Debug|x64\r
+               DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               DLL Release - DLL OpenSSL - DLL LibSSH2|x64 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64\r
+               DLL Release - DLL OpenSSL|Win32 = DLL Release - DLL OpenSSL|Win32\r
+               DLL Release - DLL OpenSSL|x64 = DLL Release - DLL OpenSSL|x64\r
+               DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               DLL Release - DLL Windows SSPI - DLL WinIDN|x64 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64\r
+               DLL Release - DLL Windows SSPI|Win32 = DLL Release - DLL Windows SSPI|Win32\r
+               DLL Release - DLL Windows SSPI|x64 = DLL Release - DLL Windows SSPI|x64\r
+               DLL Release - DLL wolfSSL|Win32 = DLL Release - DLL wolfSSL|Win32\r
+               DLL Release - DLL wolfSSL|x64 = DLL Release - DLL wolfSSL|x64\r
+               DLL Release|Win32 = DLL Release|Win32\r
+               DLL Release|x64 = DLL Release|x64\r
+               LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               LIB Debug - DLL OpenSSL - DLL LibSSH2|x64 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64\r
+               LIB Debug - DLL OpenSSL|Win32 = LIB Debug - DLL OpenSSL|Win32\r
+               LIB Debug - DLL OpenSSL|x64 = LIB Debug - DLL OpenSSL|x64\r
+               LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               LIB Debug - DLL Windows SSPI - DLL WinIDN|x64 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64\r
+               LIB Debug - DLL Windows SSPI|Win32 = LIB Debug - DLL Windows SSPI|Win32\r
+               LIB Debug - DLL Windows SSPI|x64 = LIB Debug - DLL Windows SSPI|x64\r
+               LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32\r
+               LIB Debug - LIB OpenSSL - LIB LibSSH2|x64 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64\r
+               LIB Debug - LIB OpenSSL|Win32 = LIB Debug - LIB OpenSSL|Win32\r
+               LIB Debug - LIB OpenSSL|x64 = LIB Debug - LIB OpenSSL|x64\r
+               LIB Debug - LIB wolfSSL|Win32 = LIB Debug - LIB wolfSSL|Win32\r
+               LIB Debug - LIB wolfSSL|x64 = LIB Debug - LIB wolfSSL|x64\r
+               LIB Debug|Win32 = LIB Debug|Win32\r
+               LIB Debug|x64 = LIB Debug|x64\r
+               LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               LIB Release - DLL OpenSSL - DLL LibSSH2|x64 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64\r
+               LIB Release - DLL OpenSSL|Win32 = LIB Release - DLL OpenSSL|Win32\r
+               LIB Release - DLL OpenSSL|x64 = LIB Release - DLL OpenSSL|x64\r
+               LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               LIB Release - DLL Windows SSPI - DLL WinIDN|x64 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64\r
+               LIB Release - DLL Windows SSPI|Win32 = LIB Release - DLL Windows SSPI|Win32\r
+               LIB Release - DLL Windows SSPI|x64 = LIB Release - DLL Windows SSPI|x64\r
+               LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32\r
+               LIB Release - LIB OpenSSL - LIB LibSSH2|x64 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64\r
+               LIB Release - LIB OpenSSL|Win32 = LIB Release - LIB OpenSSL|Win32\r
+               LIB Release - LIB OpenSSL|x64 = LIB Release - LIB OpenSSL|x64\r
+               LIB Release - LIB wolfSSL|Win32 = LIB Release - LIB wolfSSL|Win32\r
+               LIB Release - LIB wolfSSL|x64 = LIB Release - LIB wolfSSL|x64\r
+               LIB Release|Win32 = LIB Release|Win32\r
+               LIB Release|x64 = LIB Release|x64\r
+       EndGlobalSection\r
+       GlobalSection(ProjectConfigurationPlatforms) = postSolution\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|Win32.ActiveCfg = DLL Debug - DLL OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|Win32.Build.0 = DLL Debug - DLL OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|x64.ActiveCfg = DLL Debug - DLL OpenSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|x64.Build.0 = DLL Debug - DLL OpenSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|Win32.Build.0 = DLL Debug - DLL Windows SSPI|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|x64.ActiveCfg = DLL Debug - DLL Windows SSPI|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|x64.Build.0 = DLL Debug - DLL Windows SSPI|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL wolfSSL|Win32.ActiveCfg = DLL Debug - DLL wolfSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL wolfSSL|Win32.Build.0 = DLL Debug - DLL wolfSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL wolfSSL|x64.ActiveCfg = DLL Debug - DLL wolfSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL wolfSSL|x64.Build.0 = DLL Debug - DLL wolfSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|Win32.Build.0 = DLL Debug|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|x64.ActiveCfg = DLL Debug|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|x64.Build.0 = DLL Debug|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|Win32.ActiveCfg = DLL Release - DLL OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|Win32.Build.0 = DLL Release - DLL OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|x64.ActiveCfg = DLL Release - DLL OpenSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|x64.Build.0 = DLL Release - DLL OpenSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|Win32.ActiveCfg = DLL Release - DLL Windows SSPI|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|Win32.Build.0 = DLL Release - DLL Windows SSPI|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|x64.ActiveCfg = DLL Release - DLL Windows SSPI|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|x64.Build.0 = DLL Release - DLL Windows SSPI|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL wolfSSL|Win32.ActiveCfg = DLL Release - DLL wolfSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL wolfSSL|Win32.Build.0 = DLL Release - DLL wolfSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL wolfSSL|x64.ActiveCfg = DLL Release - DLL wolfSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL wolfSSL|x64.Build.0 = DLL Release - DLL wolfSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|Win32.ActiveCfg = DLL Release|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|Win32.Build.0 = DLL Release|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|x64.ActiveCfg = DLL Release|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|x64.Build.0 = DLL Release|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|Win32.ActiveCfg = LIB Debug - DLL OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|Win32.Build.0 = LIB Debug - DLL OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|x64.ActiveCfg = LIB Debug - DLL OpenSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|x64.Build.0 = LIB Debug - DLL OpenSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|Win32.Build.0 = LIB Debug - DLL Windows SSPI|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|x64.ActiveCfg = LIB Debug - DLL Windows SSPI|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|x64.Build.0 = LIB Debug - DLL Windows SSPI|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|Win32.ActiveCfg = LIB Debug - LIB OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|Win32.Build.0 = LIB Debug - LIB OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|x64.ActiveCfg = LIB Debug - LIB OpenSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|x64.Build.0 = LIB Debug - LIB OpenSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB wolfSSL|Win32.ActiveCfg = LIB Debug - LIB wolfSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB wolfSSL|Win32.Build.0 = LIB Debug - LIB wolfSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB wolfSSL|x64.ActiveCfg = LIB Debug - LIB wolfSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB wolfSSL|x64.Build.0 = LIB Debug - LIB wolfSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|Win32.ActiveCfg = LIB Debug|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|Win32.Build.0 = LIB Debug|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|x64.ActiveCfg = LIB Debug|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|x64.Build.0 = LIB Debug|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|Win32.ActiveCfg = LIB Release - DLL OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|Win32.Build.0 = LIB Release - DLL OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|x64.ActiveCfg = LIB Release - DLL OpenSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|x64.Build.0 = LIB Release - DLL OpenSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|Win32.ActiveCfg = LIB Release - DLL Windows SSPI|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|Win32.Build.0 = LIB Release - DLL Windows SSPI|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|x64.ActiveCfg = LIB Release - DLL Windows SSPI|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|x64.Build.0 = LIB Release - DLL Windows SSPI|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|Win32.ActiveCfg = LIB Release - LIB OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|Win32.Build.0 = LIB Release - LIB OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|x64.ActiveCfg = LIB Release - LIB OpenSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|x64.Build.0 = LIB Release - LIB OpenSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB wolfSSL|Win32.ActiveCfg = LIB Release - LIB wolfSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB wolfSSL|Win32.Build.0 = LIB Release - LIB wolfSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB wolfSSL|x64.ActiveCfg = LIB Release - LIB wolfSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB wolfSSL|x64.Build.0 = LIB Release - LIB wolfSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|Win32.ActiveCfg = LIB Release|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|Win32.Build.0 = LIB Release|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|x64.ActiveCfg = LIB Release|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|x64.Build.0 = LIB Release|x64\r
+       EndGlobalSection\r
+       GlobalSection(SolutionProperties) = preSolution\r
+               HideSolutionNode = FALSE\r
+       EndGlobalSection\r
+EndGlobal\r
index 20e64bd..81d9891 100644 (file)
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - LIB OpenSSL - LIB LibSSH2|Win32'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - LIB OpenSSL|Win32'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL Windows SSPI|Win32'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL Windows SSPI - DLL WinIDN|Win32'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL OpenSSL - DLL LibSSH2|Win32'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL OpenSSL|Win32'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - LIB OpenSSL|Win32'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL Windows SSPI|Win32'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL OpenSSL|Win32'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL OpenSSL - DLL LibSSH2|Win32'" Label="Configuration">\r
     <ConfigurationType>DynamicLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32'" Label="Configuration">\r
     <ConfigurationType>DynamicLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL Windows SSPI|Win32'" Label="Configuration">\r
     <ConfigurationType>DynamicLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL Windows SSPI - DLL WinIDN|Win32'" Label="Configuration">\r
     <ConfigurationType>DynamicLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL Windows SSPI|Win32'" Label="Configuration">\r
     <ConfigurationType>DynamicLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32'" Label="Configuration">\r
     <ConfigurationType>DynamicLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL OpenSSL|Win32'" Label="Configuration">\r
     <ConfigurationType>DynamicLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL OpenSSL|Win32'" Label="Configuration">\r
     <ConfigurationType>DynamicLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release|Win32'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - LIB wolfSSL|Win32'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug|Win32'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - LIB wolfSSL|Win32'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release|Win32'" Label="Configuration">\r
     <ConfigurationType>DynamicLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL wolfSSL|Win32'" Label="Configuration">\r
     <ConfigurationType>DynamicLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug|Win32'" Label="Configuration">\r
     <ConfigurationType>DynamicLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL wolfSSL|Win32'" Label="Configuration">\r
     <ConfigurationType>DynamicLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - LIB OpenSSL - LIB LibSSH2|x64'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - LIB OpenSSL|x64'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL Windows SSPI|x64'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL Windows SSPI - DLL WinIDN|x64'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL OpenSSL - DLL LibSSH2|x64'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL OpenSSL|x64'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - LIB OpenSSL - LIB LibSSH2|x64'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - LIB OpenSSL|x64'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL Windows SSPI|x64'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL Windows SSPI - DLL WinIDN|x64'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL OpenSSL - DLL LibSSH2|x64'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL OpenSSL|x64'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL OpenSSL - DLL LibSSH2|x64'" Label="Configuration">\r
     <ConfigurationType>DynamicLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL OpenSSL - DLL LibSSH2|x64'" Label="Configuration">\r
     <ConfigurationType>DynamicLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL Windows SSPI|x64'" Label="Configuration">\r
     <ConfigurationType>DynamicLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL Windows SSPI - DLL WinIDN|x64'" Label="Configuration">\r
     <ConfigurationType>DynamicLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL Windows SSPI|x64'" Label="Configuration">\r
     <ConfigurationType>DynamicLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL Windows SSPI - DLL WinIDN|x64'" Label="Configuration">\r
     <ConfigurationType>DynamicLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL OpenSSL|x64'" Label="Configuration">\r
     <ConfigurationType>DynamicLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL OpenSSL|x64'" Label="Configuration">\r
     <ConfigurationType>DynamicLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release|x64'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - LIB wolfSSL|x64'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug|x64'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - LIB wolfSSL|x64'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release|x64'" Label="Configuration">\r
     <ConfigurationType>DynamicLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL wolfSSL|x64'" Label="Configuration">\r
     <ConfigurationType>DynamicLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug|x64'" Label="Configuration">\r
     <ConfigurationType>DynamicLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL wolfSSL|x64'" Label="Configuration">\r
     <ConfigurationType>DynamicLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
   </PropertyGroup>\r
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />\r
   <ImportGroup Label="ExtensionSettings">\r
     <ClCompile>\r
       <Optimization>Disabled</Optimization>\r
       <AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\wolfssl;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_DEBUG;BUILDING_LIBCURL;DEBUGBUILD;USE_CYASSL;USE_IPV6;HAVE_CYASSL_OPTIONS_H;HAVE_CYASSL_ERROR_SSL_H;WOLFSSL_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>_DEBUG;BUILDING_LIBCURL;DEBUGBUILD;USE_WOLFSSL;USE_IPV6;WOLFSSL_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <MinimalRebuild>true</MinimalRebuild>\r
       <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
     <ClCompile>\r
       <Optimization>Disabled</Optimization>\r
       <AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\wolfssl;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_DEBUG;BUILDING_LIBCURL;DEBUGBUILD;USE_CYASSL;USE_IPV6;HAVE_CYASSL_OPTIONS_H;HAVE_CYASSL_ERROR_SSL_H;WOLFSSL_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>_DEBUG;BUILDING_LIBCURL;DEBUGBUILD;USE_WOLFSSL;USE_IPV6;WOLFSSL_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <MinimalRebuild>true</MinimalRebuild>\r
       <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
       <Optimization>MaxSpeed</Optimization>\r
       <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>\r
       <AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\wolfssl;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>NDEBUG;BUILDING_LIBCURL;USE_CYASSL;USE_IPV6;HAVE_CYASSL_OPTIONS_H;HAVE_CYASSL_ERROR_SSL_H;WOLFSSL_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>NDEBUG;BUILDING_LIBCURL;USE_WOLFSSL;USE_IPV6;WOLFSSL_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <StringPooling>true</StringPooling>\r
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
       <FunctionLevelLinking>true</FunctionLevelLinking>\r
       <Optimization>MaxSpeed</Optimization>\r
       <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>\r
       <AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\wolfssl;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>NDEBUG;BUILDING_LIBCURL;USE_CYASSL;USE_IPV6;HAVE_CYASSL_OPTIONS_H;HAVE_CYASSL_ERROR_SSL_H;WOLFSSL_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>NDEBUG;BUILDING_LIBCURL;USE_WOLFSSL;USE_IPV6;WOLFSSL_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <StringPooling>true</StringPooling>\r
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
       <FunctionLevelLinking>true</FunctionLevelLinking>\r
     <ClCompile>\r
       <Optimization>Disabled</Optimization>\r
       <AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\wolfssl;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_DEBUG;BUILDING_LIBCURL;DEBUGBUILD;CURL_STATICLIB;USE_CYASSL;USE_IPV6;HAVE_CYASSL_OPTIONS_H;HAVE_CYASSL_ERROR_SSL_H;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>_DEBUG;BUILDING_LIBCURL;DEBUGBUILD;CURL_STATICLIB;USE_WOLFSSL;USE_IPV6;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <MinimalRebuild>true</MinimalRebuild>\r
       <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
     <ClCompile>\r
       <Optimization>Disabled</Optimization>\r
       <AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\wolfssl;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_DEBUG;BUILDING_LIBCURL;DEBUGBUILD;CURL_STATICLIB;USE_CYASSL;USE_IPV6;HAVE_CYASSL_OPTIONS_H;HAVE_CYASSL_ERROR_SSL_H;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>_DEBUG;BUILDING_LIBCURL;DEBUGBUILD;CURL_STATICLIB;USE_WOLFSSL;USE_IPV6;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <MinimalRebuild>true</MinimalRebuild>\r
       <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
       <Optimization>MaxSpeed</Optimization>\r
       <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>\r
       <AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\wolfssl;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>NDEBUG;BUILDING_LIBCURL;CURL_STATICLIB;USE_CYASSL;USE_IPV6;HAVE_CYASSL_OPTIONS_H;HAVE_CYASSL_ERROR_SSL_H;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>NDEBUG;BUILDING_LIBCURL;CURL_STATICLIB;USE_WOLFSSL;USE_IPV6;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <StringPooling>true</StringPooling>\r
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
       <FunctionLevelLinking>true</FunctionLevelLinking>\r
       <Optimization>MaxSpeed</Optimization>\r
       <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>\r
       <AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\wolfssl;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>NDEBUG;BUILDING_LIBCURL;CURL_STATICLIB;USE_CYASSL;USE_IPV6;HAVE_CYASSL_OPTIONS_H;HAVE_CYASSL_ERROR_SSL_H;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>NDEBUG;BUILDING_LIBCURL;CURL_STATICLIB;USE_WOLFSSL;USE_IPV6;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <StringPooling>true</StringPooling>\r
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
       <FunctionLevelLinking>true</FunctionLevelLinking>\r
     </Lib>\r
   </ItemDefinitionGroup>\r
   <ItemGroup>\r
+    <ClCompile Include="..\..\..\..\lib\altsvc.c" />\r
     <ClCompile Include="..\..\..\..\lib\amigaos.c" />\r
     <ClCompile Include="..\..\..\..\lib\asyn-ares.c" />\r
     <ClCompile Include="..\..\..\..\lib\asyn-thread.c" />\r
     <ClCompile Include="..\..\..\..\lib\curl_endian.c" />\r
     <ClCompile Include="..\..\..\..\lib\curl_fnmatch.c" />\r
     <ClCompile Include="..\..\..\..\lib\curl_gethostname.c" />\r
+    <ClCompile Include="..\..\..\..\lib\curl_get_line.c" />\r
     <ClCompile Include="..\..\..\..\lib\curl_gssapi.c" />\r
     <ClCompile Include="..\..\..\..\lib\curl_memrchr.c" />\r
     <ClCompile Include="..\..\..\..\lib\curl_multibyte.c" />\r
     <ClCompile Include="..\..\..\..\lib\openldap.c" />\r
     <ClCompile Include="..\..\..\..\lib\parsedate.c" />\r
     <ClCompile Include="..\..\..\..\lib\pingpong.c" />\r
-    <ClCompile Include="..\..\..\..\lib\pipeline.c" />\r
     <ClCompile Include="..\..\..\..\lib\pop3.c" />\r
     <ClCompile Include="..\..\..\..\lib\progress.c" />\r
     <ClCompile Include="..\..\..\..\lib\psl.c" />\r
     <ClCompile Include="..\..\..\..\lib\slist.c" />\r
     <ClCompile Include="..\..\..\..\lib\smb.c" />\r
     <ClCompile Include="..\..\..\..\lib\smtp.c" />\r
+    <ClCompile Include="..\..\..\..\lib\socketpair.c" />\r
     <ClCompile Include="..\..\..\..\lib\socks.c" />\r
     <ClCompile Include="..\..\..\..\lib\socks_gssapi.c" />\r
     <ClCompile Include="..\..\..\..\lib\socks_sspi.c" />\r
     <ClCompile Include="..\..\..\..\lib\speedcheck.c" />\r
     <ClCompile Include="..\..\..\..\lib\splay.c" />\r
-    <ClCompile Include="..\..\..\..\lib\ssh.c" />\r
-    <ClCompile Include="..\..\..\..\lib\ssh-libssh.c" />\r
     <ClCompile Include="..\..\..\..\lib\strcase.c" />\r
     <ClCompile Include="..\..\..\..\lib\strdup.c" />\r
     <ClCompile Include="..\..\..\..\lib\strerror.c" />\r
     <ClCompile Include="..\..\..\..\lib\vauth\spnego_gssapi.c" />\r
     <ClCompile Include="..\..\..\..\lib\vauth\spnego_sspi.c" />\r
     <ClCompile Include="..\..\..\..\lib\vauth\vauth.c" />\r
-    <ClCompile Include="..\..\..\..\lib\vtls\axtls.c" />\r
-    <ClCompile Include="..\..\..\..\lib\vtls\cyassl.c" />\r
-    <ClCompile Include="..\..\..\..\lib\vtls\darwinssl.c" />\r
+    <ClCompile Include="..\..\..\..\lib\vquic\ngtcp2.c" />\r
+    <ClCompile Include="..\..\..\..\lib\vquic\quiche.c" />\r
+    <ClCompile Include="..\..\..\..\lib\vssh\libssh2.c" />\r
+    <ClCompile Include="..\..\..\..\lib\vssh\libssh.c" />\r
+    <ClCompile Include="..\..\..\..\lib\vtls\bearssl.c" />\r
     <ClCompile Include="..\..\..\..\lib\vtls\gskit.c" />\r
     <ClCompile Include="..\..\..\..\lib\vtls\gtls.c" />\r
     <ClCompile Include="..\..\..\..\lib\vtls\mbedtls.c" />\r
     <ClCompile Include="..\..\..\..\lib\vtls\polarssl_threadlock.c" />\r
     <ClCompile Include="..\..\..\..\lib\vtls\schannel.c" />\r
     <ClCompile Include="..\..\..\..\lib\vtls\schannel_verify.c" />\r
+    <ClCompile Include="..\..\..\..\lib\vtls\sectransp.c" />\r
     <ClCompile Include="..\..\..\..\lib\vtls\vtls.c" />\r
+    <ClCompile Include="..\..\..\..\lib\vtls\wolfssl.c" />\r
   </ItemGroup>\r
   <ItemGroup>\r
+    <ClInclude Include="..\..\..\..\lib\altsvc.h" />\r
     <ClInclude Include="..\..\..\..\lib\amigaos.h" />\r
     <ClInclude Include="..\..\..\..\lib\arpa_telnet.h" />\r
     <ClInclude Include="..\..\..\..\lib\asyn.h" />\r
     <ClInclude Include="..\..\..\..\lib\curl_endian.h" />\r
     <ClInclude Include="..\..\..\..\lib\curl_fnmatch.h" />\r
     <ClInclude Include="..\..\..\..\lib\curl_gethostname.h" />\r
+    <ClInclude Include="..\..\..\..\lib\curl_get_line.h" />\r
     <ClInclude Include="..\..\..\..\lib\curl_gssapi.h" />\r
     <ClInclude Include="..\..\..\..\lib\curl_hmac.h" />\r
     <ClInclude Include="..\..\..\..\lib\curl_ldap.h" />\r
     <ClInclude Include="..\..\..\..\lib\nonblock.h" />\r
     <ClInclude Include="..\..\..\..\lib\parsedate.h" />\r
     <ClInclude Include="..\..\..\..\lib\pingpong.h" />\r
-    <ClInclude Include="..\..\..\..\lib\pipeline.h" />\r
     <ClInclude Include="..\..\..\..\lib\pop3.h" />\r
     <ClInclude Include="..\..\..\..\lib\progress.h" />\r
     <ClInclude Include="..\..\..\..\lib\psl.h" />\r
+    <ClInclude Include="..\..\..\..\lib\quic.h" />\r
     <ClInclude Include="..\..\..\..\lib\rand.h" />\r
     <ClInclude Include="..\..\..\..\lib\rtsp.h" />\r
     <ClInclude Include="..\..\..\..\lib\select.h" />\r
     <ClInclude Include="..\..\..\..\lib\smb.h" />\r
     <ClInclude Include="..\..\..\..\lib\smtp.h" />\r
     <ClInclude Include="..\..\..\..\lib\sockaddr.h" />\r
+    <ClInclude Include="..\..\..\..\lib\socketpair.h" />\r
     <ClInclude Include="..\..\..\..\lib\socks.h" />\r
     <ClInclude Include="..\..\..\..\lib\speedcheck.h" />\r
     <ClInclude Include="..\..\..\..\lib\splay.h" />\r
-    <ClInclude Include="..\..\..\..\lib\ssh.h" />\r
     <ClInclude Include="..\..\..\..\lib\strcase.h" />\r
     <ClInclude Include="..\..\..\..\lib\strdup.h" />\r
     <ClInclude Include="..\..\..\..\lib\strerror.h" />\r
     <ClInclude Include="..\..\..\..\lib\vauth\digest.h" />\r
     <ClInclude Include="..\..\..\..\lib\vauth\ntlm.h" />\r
     <ClInclude Include="..\..\..\..\lib\vauth\vauth.h" />\r
-    <ClInclude Include="..\..\..\..\lib\vtls\axtls.h" />\r
-    <ClInclude Include="..\..\..\..\lib\vtls\cyassl.h" />\r
-    <ClInclude Include="..\..\..\..\lib\vtls\darwinssl.h" />\r
+    <ClInclude Include="..\..\..\..\lib\vquic\ngtcp2.h" />\r
+    <ClInclude Include="..\..\..\..\lib\vquic\quiche.h" />\r
+    <ClInclude Include="..\..\..\..\lib\vssh\ssh.h" />\r
+    <ClInclude Include="..\..\..\..\lib\vtls\bearssl.h" />\r
     <ClInclude Include="..\..\..\..\lib\vtls\gskit.h" />\r
     <ClInclude Include="..\..\..\..\lib\vtls\gtls.h" />\r
     <ClInclude Include="..\..\..\..\lib\vtls\mbedtls.h" />\r
     <ClInclude Include="..\..\..\..\lib\vtls\polarssl.h" />\r
     <ClInclude Include="..\..\..\..\lib\vtls\polarssl_threadlock.h" />\r
     <ClInclude Include="..\..\..\..\lib\vtls\schannel.h" />\r
+    <ClInclude Include="..\..\..\..\lib\vtls\sectransp.h" />\r
     <ClInclude Include="..\..\..\..\lib\vtls\vtls.h" />\r
+    <ClInclude Include="..\..\..\..\lib\vtls\wolfssl.h" />\r
   </ItemGroup>\r
   <ItemGroup>\r
     <ResourceCompile Include="..\..\..\..\lib\libcurl.rc" />\r
index 131f27b..31bcc14 100644 (file)
-Microsoft Visual Studio Solution File, Format Version 11.00
-# Visual Studio 2010
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "curl", "curl.vcxproj", "{5228E9CE-A216-422F-A5E6-58E95E2DD71D}"
-EndProject
-Global
-       GlobalSection(SolutionConfigurationPlatforms) = preSolution
-               DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               DLL Debug - DLL OpenSSL - DLL LibSSH2|x64 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
-               DLL Debug - DLL OpenSSL|Win32 = DLL Debug - DLL OpenSSL|Win32
-               DLL Debug - DLL OpenSSL|x64 = DLL Debug - DLL OpenSSL|x64
-               DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               DLL Debug - DLL Windows SSPI - DLL WinIDN|x64 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
-               DLL Debug - DLL Windows SSPI|Win32 = DLL Debug - DLL Windows SSPI|Win32
-               DLL Debug - DLL Windows SSPI|x64 = DLL Debug - DLL Windows SSPI|x64
-               DLL Debug - DLL wolfSSL|Win32 = DLL Debug - DLL wolfSSL|Win32
-               DLL Debug - DLL wolfSSL|x64 = DLL Debug - DLL wolfSSL|x64
-               DLL Debug|Win32 = DLL Debug|Win32
-               DLL Debug|x64 = DLL Debug|x64
-               DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
-               DLL Release - DLL OpenSSL - DLL LibSSH2|x64 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
-               DLL Release - DLL OpenSSL|Win32 = DLL Release - DLL OpenSSL|Win32
-               DLL Release - DLL OpenSSL|x64 = DLL Release - DLL OpenSSL|x64
-               DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
-               DLL Release - DLL Windows SSPI - DLL WinIDN|x64 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
-               DLL Release - DLL Windows SSPI|Win32 = DLL Release - DLL Windows SSPI|Win32
-               DLL Release - DLL Windows SSPI|x64 = DLL Release - DLL Windows SSPI|x64
-               DLL Release - DLL wolfSSL|Win32 = DLL Release - DLL wolfSSL|Win32
-               DLL Release - DLL wolfSSL|x64 = DLL Release - DLL wolfSSL|x64
-               DLL Release|Win32 = DLL Release|Win32
-               DLL Release|x64 = DLL Release|x64
-               LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               LIB Debug - DLL OpenSSL - DLL LibSSH2|x64 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
-               LIB Debug - DLL OpenSSL|Win32 = LIB Debug - DLL OpenSSL|Win32
-               LIB Debug - DLL OpenSSL|x64 = LIB Debug - DLL OpenSSL|x64
-               LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               LIB Debug - DLL Windows SSPI - DLL WinIDN|x64 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
-               LIB Debug - DLL Windows SSPI|Win32 = LIB Debug - DLL Windows SSPI|Win32
-               LIB Debug - DLL Windows SSPI|x64 = LIB Debug - DLL Windows SSPI|x64
-               LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
-               LIB Debug - LIB OpenSSL - LIB LibSSH2|x64 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
-               LIB Debug - LIB OpenSSL|Win32 = LIB Debug - LIB OpenSSL|Win32
-               LIB Debug - LIB OpenSSL|x64 = LIB Debug - LIB OpenSSL|x64
-               LIB Debug - LIB wolfSSL|Win32 = LIB Debug - LIB wolfSSL|Win32
-               LIB Debug - LIB wolfSSL|x64 = LIB Debug - LIB wolfSSL|x64
-               LIB Debug|Win32 = LIB Debug|Win32
-               LIB Debug|x64 = LIB Debug|x64
-               LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
-               LIB Release - DLL OpenSSL - DLL LibSSH2|x64 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
-               LIB Release - DLL OpenSSL|Win32 = LIB Release - DLL OpenSSL|Win32
-               LIB Release - DLL OpenSSL|x64 = LIB Release - DLL OpenSSL|x64
-               LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
-               LIB Release - DLL Windows SSPI - DLL WinIDN|x64 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
-               LIB Release - DLL Windows SSPI|Win32 = LIB Release - DLL Windows SSPI|Win32
-               LIB Release - DLL Windows SSPI|x64 = LIB Release - DLL Windows SSPI|x64
-               LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
-               LIB Release - LIB OpenSSL - LIB LibSSH2|x64 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
-               LIB Release - LIB OpenSSL|Win32 = LIB Release - LIB OpenSSL|Win32
-               LIB Release - LIB OpenSSL|x64 = LIB Release - LIB OpenSSL|x64
-               LIB Release - LIB wolfSSL|Win32 = LIB Release - LIB wolfSSL|Win32
-               LIB Release - LIB wolfSSL|x64 = LIB Release - LIB wolfSSL|x64
-               LIB Release|Win32 = LIB Release|Win32
-               LIB Release|x64 = LIB Release|x64
-       EndGlobalSection
-       GlobalSection(ProjectConfigurationPlatforms) = postSolution
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|Win32.ActiveCfg = DLL Debug - DLL OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|Win32.Build.0 = DLL Debug - DLL OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|x64.ActiveCfg = DLL Debug - DLL OpenSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|x64.Build.0 = DLL Debug - DLL OpenSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|Win32.Build.0 = DLL Debug - DLL Windows SSPI|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|x64.ActiveCfg = DLL Debug - DLL Windows SSPI|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|x64.Build.0 = DLL Debug - DLL Windows SSPI|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL wolfSSL|Win32.ActiveCfg = DLL Debug - DLL wolfSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL wolfSSL|Win32.Build.0 = DLL Debug - DLL wolfSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL wolfSSL|x64.ActiveCfg = DLL Debug - DLL wolfSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL wolfSSL|x64.Build.0 = DLL Debug - DLL wolfSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|Win32.Build.0 = DLL Debug|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|x64.ActiveCfg = DLL Debug|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|x64.Build.0 = DLL Debug|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|Win32.ActiveCfg = DLL Release - DLL OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|Win32.Build.0 = DLL Release - DLL OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|x64.ActiveCfg = DLL Release - DLL OpenSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|x64.Build.0 = DLL Release - DLL OpenSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|Win32.ActiveCfg = DLL Release - DLL Windows SSPI|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|Win32.Build.0 = DLL Release - DLL Windows SSPI|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|x64.ActiveCfg = DLL Release - DLL Windows SSPI|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|x64.Build.0 = DLL Release - DLL Windows SSPI|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL wolfSSL|Win32.ActiveCfg = DLL Release - DLL wolfSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL wolfSSL|Win32.Build.0 = DLL Release - DLL wolfSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL wolfSSL|x64.ActiveCfg = DLL Release - DLL wolfSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL wolfSSL|x64.Build.0 = DLL Release - DLL wolfSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|Win32.ActiveCfg = DLL Release|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|Win32.Build.0 = DLL Release|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|x64.ActiveCfg = DLL Release|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|x64.Build.0 = DLL Release|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|Win32.ActiveCfg = LIB Debug - DLL OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|Win32.Build.0 = LIB Debug - DLL OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|x64.ActiveCfg = LIB Debug - DLL OpenSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|x64.Build.0 = LIB Debug - DLL OpenSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|Win32.Build.0 = LIB Debug - DLL Windows SSPI|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|x64.ActiveCfg = LIB Debug - DLL Windows SSPI|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|x64.Build.0 = LIB Debug - DLL Windows SSPI|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|Win32.ActiveCfg = LIB Debug - LIB OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|Win32.Build.0 = LIB Debug - LIB OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|x64.ActiveCfg = LIB Debug - LIB OpenSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|x64.Build.0 = LIB Debug - LIB OpenSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB wolfSSL|Win32.ActiveCfg = LIB Debug - LIB wolfSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB wolfSSL|Win32.Build.0 = LIB Debug - LIB wolfSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB wolfSSL|x64.ActiveCfg = LIB Debug - LIB wolfSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB wolfSSL|x64.Build.0 = LIB Debug - LIB wolfSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|Win32.ActiveCfg = LIB Debug|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|Win32.Build.0 = LIB Debug|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|x64.ActiveCfg = LIB Debug|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|x64.Build.0 = LIB Debug|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|Win32.ActiveCfg = LIB Release - DLL OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|Win32.Build.0 = LIB Release - DLL OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|x64.ActiveCfg = LIB Release - DLL OpenSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|x64.Build.0 = LIB Release - DLL OpenSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|Win32.ActiveCfg = LIB Release - DLL Windows SSPI|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|Win32.Build.0 = LIB Release - DLL Windows SSPI|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|x64.ActiveCfg = LIB Release - DLL Windows SSPI|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|x64.Build.0 = LIB Release - DLL Windows SSPI|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|Win32.ActiveCfg = LIB Release - LIB OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|Win32.Build.0 = LIB Release - LIB OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|x64.ActiveCfg = LIB Release - LIB OpenSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|x64.Build.0 = LIB Release - LIB OpenSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB wolfSSL|Win32.ActiveCfg = LIB Release - LIB wolfSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB wolfSSL|Win32.Build.0 = LIB Release - LIB wolfSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB wolfSSL|x64.ActiveCfg = LIB Release - LIB wolfSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB wolfSSL|x64.Build.0 = LIB Release - LIB wolfSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|Win32.ActiveCfg = LIB Release|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|Win32.Build.0 = LIB Release|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|x64.ActiveCfg = LIB Release|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|x64.Build.0 = LIB Release|x64
-       EndGlobalSection
-       GlobalSection(SolutionProperties) = preSolution
-               HideSolutionNode = FALSE
-       EndGlobalSection
-EndGlobal
+Microsoft Visual Studio Solution File, Format Version 11.00\r
+# Visual Studio 2010\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "curl", "curl.vcxproj", "{5228E9CE-A216-422F-A5E6-58E95E2DD71D}"\r
+EndProject\r
+Global\r
+       GlobalSection(SolutionConfigurationPlatforms) = preSolution\r
+               DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               DLL Debug - DLL OpenSSL - DLL LibSSH2|x64 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64\r
+               DLL Debug - DLL OpenSSL|Win32 = DLL Debug - DLL OpenSSL|Win32\r
+               DLL Debug - DLL OpenSSL|x64 = DLL Debug - DLL OpenSSL|x64\r
+               DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               DLL Debug - DLL Windows SSPI - DLL WinIDN|x64 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64\r
+               DLL Debug - DLL Windows SSPI|Win32 = DLL Debug - DLL Windows SSPI|Win32\r
+               DLL Debug - DLL Windows SSPI|x64 = DLL Debug - DLL Windows SSPI|x64\r
+               DLL Debug - DLL wolfSSL|Win32 = DLL Debug - DLL wolfSSL|Win32\r
+               DLL Debug - DLL wolfSSL|x64 = DLL Debug - DLL wolfSSL|x64\r
+               DLL Debug|Win32 = DLL Debug|Win32\r
+               DLL Debug|x64 = DLL Debug|x64\r
+               DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               DLL Release - DLL OpenSSL - DLL LibSSH2|x64 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64\r
+               DLL Release - DLL OpenSSL|Win32 = DLL Release - DLL OpenSSL|Win32\r
+               DLL Release - DLL OpenSSL|x64 = DLL Release - DLL OpenSSL|x64\r
+               DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               DLL Release - DLL Windows SSPI - DLL WinIDN|x64 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64\r
+               DLL Release - DLL Windows SSPI|Win32 = DLL Release - DLL Windows SSPI|Win32\r
+               DLL Release - DLL Windows SSPI|x64 = DLL Release - DLL Windows SSPI|x64\r
+               DLL Release - DLL wolfSSL|Win32 = DLL Release - DLL wolfSSL|Win32\r
+               DLL Release - DLL wolfSSL|x64 = DLL Release - DLL wolfSSL|x64\r
+               DLL Release|Win32 = DLL Release|Win32\r
+               DLL Release|x64 = DLL Release|x64\r
+               LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               LIB Debug - DLL OpenSSL - DLL LibSSH2|x64 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64\r
+               LIB Debug - DLL OpenSSL|Win32 = LIB Debug - DLL OpenSSL|Win32\r
+               LIB Debug - DLL OpenSSL|x64 = LIB Debug - DLL OpenSSL|x64\r
+               LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               LIB Debug - DLL Windows SSPI - DLL WinIDN|x64 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64\r
+               LIB Debug - DLL Windows SSPI|Win32 = LIB Debug - DLL Windows SSPI|Win32\r
+               LIB Debug - DLL Windows SSPI|x64 = LIB Debug - DLL Windows SSPI|x64\r
+               LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32\r
+               LIB Debug - LIB OpenSSL - LIB LibSSH2|x64 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64\r
+               LIB Debug - LIB OpenSSL|Win32 = LIB Debug - LIB OpenSSL|Win32\r
+               LIB Debug - LIB OpenSSL|x64 = LIB Debug - LIB OpenSSL|x64\r
+               LIB Debug - LIB wolfSSL|Win32 = LIB Debug - LIB wolfSSL|Win32\r
+               LIB Debug - LIB wolfSSL|x64 = LIB Debug - LIB wolfSSL|x64\r
+               LIB Debug|Win32 = LIB Debug|Win32\r
+               LIB Debug|x64 = LIB Debug|x64\r
+               LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               LIB Release - DLL OpenSSL - DLL LibSSH2|x64 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64\r
+               LIB Release - DLL OpenSSL|Win32 = LIB Release - DLL OpenSSL|Win32\r
+               LIB Release - DLL OpenSSL|x64 = LIB Release - DLL OpenSSL|x64\r
+               LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               LIB Release - DLL Windows SSPI - DLL WinIDN|x64 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64\r
+               LIB Release - DLL Windows SSPI|Win32 = LIB Release - DLL Windows SSPI|Win32\r
+               LIB Release - DLL Windows SSPI|x64 = LIB Release - DLL Windows SSPI|x64\r
+               LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32\r
+               LIB Release - LIB OpenSSL - LIB LibSSH2|x64 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64\r
+               LIB Release - LIB OpenSSL|Win32 = LIB Release - LIB OpenSSL|Win32\r
+               LIB Release - LIB OpenSSL|x64 = LIB Release - LIB OpenSSL|x64\r
+               LIB Release - LIB wolfSSL|Win32 = LIB Release - LIB wolfSSL|Win32\r
+               LIB Release - LIB wolfSSL|x64 = LIB Release - LIB wolfSSL|x64\r
+               LIB Release|Win32 = LIB Release|Win32\r
+               LIB Release|x64 = LIB Release|x64\r
+       EndGlobalSection\r
+       GlobalSection(ProjectConfigurationPlatforms) = postSolution\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|Win32.ActiveCfg = DLL Debug - DLL OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|Win32.Build.0 = DLL Debug - DLL OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|x64.ActiveCfg = DLL Debug - DLL OpenSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|x64.Build.0 = DLL Debug - DLL OpenSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|Win32.Build.0 = DLL Debug - DLL Windows SSPI|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|x64.ActiveCfg = DLL Debug - DLL Windows SSPI|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|x64.Build.0 = DLL Debug - DLL Windows SSPI|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL wolfSSL|Win32.ActiveCfg = DLL Debug - DLL wolfSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL wolfSSL|Win32.Build.0 = DLL Debug - DLL wolfSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL wolfSSL|x64.ActiveCfg = DLL Debug - DLL wolfSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL wolfSSL|x64.Build.0 = DLL Debug - DLL wolfSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|Win32.Build.0 = DLL Debug|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|x64.ActiveCfg = DLL Debug|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|x64.Build.0 = DLL Debug|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|Win32.ActiveCfg = DLL Release - DLL OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|Win32.Build.0 = DLL Release - DLL OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|x64.ActiveCfg = DLL Release - DLL OpenSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|x64.Build.0 = DLL Release - DLL OpenSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|Win32.ActiveCfg = DLL Release - DLL Windows SSPI|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|Win32.Build.0 = DLL Release - DLL Windows SSPI|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|x64.ActiveCfg = DLL Release - DLL Windows SSPI|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|x64.Build.0 = DLL Release - DLL Windows SSPI|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL wolfSSL|Win32.ActiveCfg = DLL Release - DLL wolfSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL wolfSSL|Win32.Build.0 = DLL Release - DLL wolfSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL wolfSSL|x64.ActiveCfg = DLL Release - DLL wolfSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL wolfSSL|x64.Build.0 = DLL Release - DLL wolfSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|Win32.ActiveCfg = DLL Release|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|Win32.Build.0 = DLL Release|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|x64.ActiveCfg = DLL Release|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|x64.Build.0 = DLL Release|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|Win32.ActiveCfg = LIB Debug - DLL OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|Win32.Build.0 = LIB Debug - DLL OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|x64.ActiveCfg = LIB Debug - DLL OpenSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|x64.Build.0 = LIB Debug - DLL OpenSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|Win32.Build.0 = LIB Debug - DLL Windows SSPI|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|x64.ActiveCfg = LIB Debug - DLL Windows SSPI|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|x64.Build.0 = LIB Debug - DLL Windows SSPI|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|Win32.ActiveCfg = LIB Debug - LIB OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|Win32.Build.0 = LIB Debug - LIB OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|x64.ActiveCfg = LIB Debug - LIB OpenSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|x64.Build.0 = LIB Debug - LIB OpenSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB wolfSSL|Win32.ActiveCfg = LIB Debug - LIB wolfSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB wolfSSL|Win32.Build.0 = LIB Debug - LIB wolfSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB wolfSSL|x64.ActiveCfg = LIB Debug - LIB wolfSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB wolfSSL|x64.Build.0 = LIB Debug - LIB wolfSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|Win32.ActiveCfg = LIB Debug|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|Win32.Build.0 = LIB Debug|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|x64.ActiveCfg = LIB Debug|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|x64.Build.0 = LIB Debug|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|Win32.ActiveCfg = LIB Release - DLL OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|Win32.Build.0 = LIB Release - DLL OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|x64.ActiveCfg = LIB Release - DLL OpenSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|x64.Build.0 = LIB Release - DLL OpenSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|Win32.ActiveCfg = LIB Release - DLL Windows SSPI|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|Win32.Build.0 = LIB Release - DLL Windows SSPI|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|x64.ActiveCfg = LIB Release - DLL Windows SSPI|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|x64.Build.0 = LIB Release - DLL Windows SSPI|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|Win32.ActiveCfg = LIB Release - LIB OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|Win32.Build.0 = LIB Release - LIB OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|x64.ActiveCfg = LIB Release - LIB OpenSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|x64.Build.0 = LIB Release - LIB OpenSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB wolfSSL|Win32.ActiveCfg = LIB Release - LIB wolfSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB wolfSSL|Win32.Build.0 = LIB Release - LIB wolfSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB wolfSSL|x64.ActiveCfg = LIB Release - LIB wolfSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB wolfSSL|x64.Build.0 = LIB Release - LIB wolfSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|Win32.ActiveCfg = LIB Release|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|Win32.Build.0 = LIB Release|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|x64.ActiveCfg = LIB Release|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|x64.Build.0 = LIB Release|x64\r
+       EndGlobalSection\r
+       GlobalSection(SolutionProperties) = preSolution\r
+               HideSolutionNode = FALSE\r
+       EndGlobalSection\r
+EndGlobal\r
index c4082ad..a4dfabc 100644 (file)
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL Windows SSPI|Win32'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL Windows SSPI - DLL WinIDN|Win32'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL Windows SSPI|Win32'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL OpenSSL - DLL LibSSH2|Win32'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL OpenSSL|Win32'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL OpenSSL|Win32'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - LIB OpenSSL - LIB LibSSH2|Win32'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - LIB OpenSSL|Win32'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - LIB OpenSSL|Win32'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL OpenSSL - DLL LibSSH2|Win32'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL Windows SSPI|Win32'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL Windows SSPI - DLL WinIDN|Win32'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL OpenSSL|Win32'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL Windows SSPI|Win32'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL OpenSSL|Win32'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug|Win32'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL wolfSSL|Win32'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug|Win32'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - LIB wolfSSL|Win32'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release|Win32'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - LIB wolfSSL|Win32'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release|Win32'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL wolfSSL|Win32'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL Windows SSPI|x64'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL Windows SSPI - DLL WinIDN|x64'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL Windows SSPI|x64'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL Windows SSPI - DLL WinIDN|x64'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL OpenSSL - DLL LibSSH2|x64'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL OpenSSL - DLL LibSSH2|x64'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL OpenSSL|x64'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL OpenSSL|x64'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - LIB OpenSSL - LIB LibSSH2|x64'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - LIB OpenSSL - LIB LibSSH2|x64'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - LIB OpenSSL|x64'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - LIB OpenSSL|x64'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL OpenSSL - DLL LibSSH2|x64'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL OpenSSL - DLL LibSSH2|x64'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL Windows SSPI|x64'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL Windows SSPI - DLL WinIDN|x64'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL OpenSSL|x64'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL Windows SSPI|x64'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL Windows SSPI - DLL WinIDN|x64'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL OpenSSL|x64'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug|x64'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL wolfSSL|x64'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug|x64'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - LIB wolfSSL|x64'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release|x64'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - LIB wolfSSL|x64'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release|x64'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL wolfSSL|x64'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
   </PropertyGroup>\r
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />\r
   <ImportGroup Label="ExtensionSettings">\r
     <ClCompile Include="..\..\..\..\src\tool_panykey.c" />\r
     <ClCompile Include="..\..\..\..\src\tool_paramhlp.c" />\r
     <ClCompile Include="..\..\..\..\src\tool_parsecfg.c" />\r
+    <ClCompile Include="..\..\..\..\src\tool_progress.c" />\r
     <ClCompile Include="..\..\..\..\src\tool_setopt.c" />\r
     <ClCompile Include="..\..\..\..\src\tool_sleep.c" />\r
     <ClCompile Include="..\..\..\..\src\tool_strdup.c" />\r
     <ClInclude Include="..\..\..\..\src\tool_panykey.h" />\r
     <ClInclude Include="..\..\..\..\src\tool_paramhlp.h" />\r
     <ClInclude Include="..\..\..\..\src\tool_parsecfg.h" />\r
+    <ClInclude Include="..\..\..\..\src\tool_progress.h" />\r
     <ClInclude Include="..\..\..\..\src\tool_sdecls.h" />\r
     <ClInclude Include="..\..\..\..\src\tool_setopt.h" />\r
     <ClInclude Include="..\..\..\..\src\tool_setup.h" />\r
index bec0ad8..4bc4cae 100644 (file)
-Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio 2012
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "curl", "src\curl.vcxproj", "{5228E9CE-A216-422F-A5E6-58E95E2DD71D}"
-       ProjectSection(ProjectDependencies) = postProject
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB} = {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}
-       EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libcurl", "lib\libcurl.vcxproj", "{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}"
-EndProject
-Global
-       GlobalSection(SolutionConfigurationPlatforms) = preSolution
-               DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               DLL Debug - DLL OpenSSL - DLL LibSSH2|x64 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
-               DLL Debug - DLL OpenSSL|Win32 = DLL Debug - DLL OpenSSL|Win32
-               DLL Debug - DLL OpenSSL|x64 = DLL Debug - DLL OpenSSL|x64
-               DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               DLL Debug - DLL Windows SSPI - DLL WinIDN|x64 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
-               DLL Debug - DLL Windows SSPI|Win32 = DLL Debug - DLL Windows SSPI|Win32
-               DLL Debug - DLL Windows SSPI|x64 = DLL Debug - DLL Windows SSPI|x64
-               DLL Debug - DLL wolfSSL|Win32 = DLL Debug - DLL wolfSSL|Win32
-               DLL Debug - DLL wolfSSL|x64 = DLL Debug - DLL wolfSSL|x64
-               DLL Debug|Win32 = DLL Debug|Win32
-               DLL Debug|x64 = DLL Debug|x64
-               DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
-               DLL Release - DLL OpenSSL - DLL LibSSH2|x64 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
-               DLL Release - DLL OpenSSL|Win32 = DLL Release - DLL OpenSSL|Win32
-               DLL Release - DLL OpenSSL|x64 = DLL Release - DLL OpenSSL|x64
-               DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
-               DLL Release - DLL Windows SSPI - DLL WinIDN|x64 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
-               DLL Release - DLL Windows SSPI|Win32 = DLL Release - DLL Windows SSPI|Win32
-               DLL Release - DLL Windows SSPI|x64 = DLL Release - DLL Windows SSPI|x64
-               DLL Release - DLL wolfSSL|Win32 = DLL Release - DLL wolfSSL|Win32
-               DLL Release - DLL wolfSSL|x64 = DLL Release - DLL wolfSSL|x64
-               DLL Release|Win32 = DLL Release|Win32
-               DLL Release|x64 = DLL Release|x64
-               LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               LIB Debug - DLL OpenSSL - DLL LibSSH2|x64 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
-               LIB Debug - DLL OpenSSL|Win32 = LIB Debug - DLL OpenSSL|Win32
-               LIB Debug - DLL OpenSSL|x64 = LIB Debug - DLL OpenSSL|x64
-               LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               LIB Debug - DLL Windows SSPI - DLL WinIDN|x64 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
-               LIB Debug - DLL Windows SSPI|Win32 = LIB Debug - DLL Windows SSPI|Win32
-               LIB Debug - DLL Windows SSPI|x64 = LIB Debug - DLL Windows SSPI|x64
-               LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
-               LIB Debug - LIB OpenSSL - LIB LibSSH2|x64 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
-               LIB Debug - LIB OpenSSL|Win32 = LIB Debug - LIB OpenSSL|Win32
-               LIB Debug - LIB OpenSSL|x64 = LIB Debug - LIB OpenSSL|x64
-               LIB Debug - LIB wolfSSL|Win32 = LIB Debug - LIB wolfSSL|Win32
-               LIB Debug - LIB wolfSSL|x64 = LIB Debug - LIB wolfSSL|x64
-               LIB Debug|Win32 = LIB Debug|Win32
-               LIB Debug|x64 = LIB Debug|x64
-               LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
-               LIB Release - DLL OpenSSL - DLL LibSSH2|x64 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
-               LIB Release - DLL OpenSSL|Win32 = LIB Release - DLL OpenSSL|Win32
-               LIB Release - DLL OpenSSL|x64 = LIB Release - DLL OpenSSL|x64
-               LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
-               LIB Release - DLL Windows SSPI - DLL WinIDN|x64 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
-               LIB Release - DLL Windows SSPI|Win32 = LIB Release - DLL Windows SSPI|Win32
-               LIB Release - DLL Windows SSPI|x64 = LIB Release - DLL Windows SSPI|x64
-               LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
-               LIB Release - LIB OpenSSL - LIB LibSSH2|x64 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
-               LIB Release - LIB OpenSSL|Win32 = LIB Release - LIB OpenSSL|Win32
-               LIB Release - LIB OpenSSL|x64 = LIB Release - LIB OpenSSL|x64
-               LIB Release - LIB wolfSSL|Win32 = LIB Release - LIB wolfSSL|Win32
-               LIB Release - LIB wolfSSL|x64 = LIB Release - LIB wolfSSL|x64
-               LIB Release|Win32 = LIB Release|Win32
-               LIB Release|x64 = LIB Release|x64
-       EndGlobalSection
-       GlobalSection(ProjectConfigurationPlatforms) = postSolution
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|Win32.ActiveCfg = DLL Debug - DLL OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|Win32.Build.0 = DLL Debug - DLL OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|x64.ActiveCfg = DLL Debug - DLL OpenSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|x64.Build.0 = DLL Debug - DLL OpenSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|Win32.Build.0 = DLL Debug - DLL Windows SSPI|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|x64.ActiveCfg = DLL Debug - DLL Windows SSPI|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|x64.Build.0 = DLL Debug - DLL Windows SSPI|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL wolfSSL|Win32.ActiveCfg = DLL Debug - DLL wolfSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL wolfSSL|Win32.Build.0 = DLL Debug - DLL wolfSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL wolfSSL|x64.ActiveCfg = DLL Debug - DLL wolfSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL wolfSSL|x64.Build.0 = DLL Debug - DLL wolfSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|Win32.Build.0 = DLL Debug|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|x64.ActiveCfg = DLL Debug|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|x64.Build.0 = DLL Debug|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|Win32.ActiveCfg = DLL Release - DLL OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|Win32.Build.0 = DLL Release - DLL OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|x64.ActiveCfg = DLL Release - DLL OpenSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|x64.Build.0 = DLL Release - DLL OpenSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|Win32.ActiveCfg = DLL Release - DLL Windows SSPI|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|Win32.Build.0 = DLL Release - DLL Windows SSPI|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|x64.ActiveCfg = DLL Release - DLL Windows SSPI|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|x64.Build.0 = DLL Release - DLL Windows SSPI|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL wolfSSL|Win32.ActiveCfg = DLL Release - DLL wolfSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL wolfSSL|Win32.Build.0 = DLL Release - DLL wolfSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL wolfSSL|x64.ActiveCfg = DLL Release - DLL wolfSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL wolfSSL|x64.Build.0 = DLL Release - DLL wolfSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|Win32.ActiveCfg = DLL Release|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|Win32.Build.0 = DLL Release|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|x64.ActiveCfg = DLL Release|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|x64.Build.0 = DLL Release|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|Win32.ActiveCfg = LIB Debug - DLL OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|Win32.Build.0 = LIB Debug - DLL OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|x64.ActiveCfg = LIB Debug - DLL OpenSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|x64.Build.0 = LIB Debug - DLL OpenSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|Win32.Build.0 = LIB Debug - DLL Windows SSPI|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|x64.ActiveCfg = LIB Debug - DLL Windows SSPI|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|x64.Build.0 = LIB Debug - DLL Windows SSPI|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|Win32.ActiveCfg = LIB Debug - LIB OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|Win32.Build.0 = LIB Debug - LIB OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|x64.ActiveCfg = LIB Debug - LIB OpenSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|x64.Build.0 = LIB Debug - LIB OpenSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB wolfSSL|Win32.ActiveCfg = LIB Debug - LIB wolfSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB wolfSSL|Win32.Build.0 = LIB Debug - LIB wolfSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB wolfSSL|x64.ActiveCfg = LIB Debug - LIB wolfSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB wolfSSL|x64.Build.0 = LIB Debug - LIB wolfSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|Win32.ActiveCfg = LIB Debug|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|Win32.Build.0 = LIB Debug|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|x64.ActiveCfg = LIB Debug|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|x64.Build.0 = LIB Debug|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|Win32.ActiveCfg = LIB Release - DLL OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|Win32.Build.0 = LIB Release - DLL OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|x64.ActiveCfg = LIB Release - DLL OpenSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|x64.Build.0 = LIB Release - DLL OpenSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|Win32.ActiveCfg = LIB Release - DLL Windows SSPI|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|Win32.Build.0 = LIB Release - DLL Windows SSPI|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|x64.ActiveCfg = LIB Release - DLL Windows SSPI|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|x64.Build.0 = LIB Release - DLL Windows SSPI|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|Win32.ActiveCfg = LIB Release - LIB OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|Win32.Build.0 = LIB Release - LIB OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|x64.ActiveCfg = LIB Release - LIB OpenSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|x64.Build.0 = LIB Release - LIB OpenSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB wolfSSL|Win32.ActiveCfg = LIB Release - LIB wolfSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB wolfSSL|Win32.Build.0 = LIB Release - LIB wolfSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB wolfSSL|x64.ActiveCfg = LIB Release - LIB wolfSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB wolfSSL|x64.Build.0 = LIB Release - LIB wolfSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|Win32.ActiveCfg = LIB Release|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|Win32.Build.0 = LIB Release|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|x64.ActiveCfg = LIB Release|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|x64.Build.0 = LIB Release|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|Win32.ActiveCfg = DLL Debug - DLL OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|Win32.Build.0 = DLL Debug - DLL OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|x64.ActiveCfg = DLL Debug - DLL OpenSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|x64.Build.0 = DLL Debug - DLL OpenSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|Win32.Build.0 = DLL Debug - DLL Windows SSPI|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|x64.ActiveCfg = DLL Debug - DLL Windows SSPI|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|x64.Build.0 = DLL Debug - DLL Windows SSPI|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL wolfSSL|Win32.ActiveCfg = DLL Debug - DLL wolfSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL wolfSSL|Win32.Build.0 = DLL Debug - DLL wolfSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL wolfSSL|x64.ActiveCfg = DLL Debug - DLL wolfSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL wolfSSL|x64.Build.0 = DLL Debug - DLL wolfSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|Win32.Build.0 = DLL Debug|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|x64.ActiveCfg = DLL Debug|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|x64.Build.0 = DLL Debug|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|Win32.ActiveCfg = DLL Release - DLL OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|Win32.Build.0 = DLL Release - DLL OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|x64.ActiveCfg = DLL Release - DLL OpenSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|x64.Build.0 = DLL Release - DLL OpenSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|Win32.ActiveCfg = DLL Release - DLL Windows SSPI|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|Win32.Build.0 = DLL Release - DLL Windows SSPI|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|x64.ActiveCfg = DLL Release - DLL Windows SSPI|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|x64.Build.0 = DLL Release - DLL Windows SSPI|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL wolfSSL|Win32.ActiveCfg = DLL Release - DLL wolfSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL wolfSSL|Win32.Build.0 = DLL Release - DLL wolfSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL wolfSSL|x64.ActiveCfg = DLL Release - DLL wolfSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL wolfSSL|x64.Build.0 = DLL Release - DLL wolfSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|Win32.ActiveCfg = DLL Release|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|Win32.Build.0 = DLL Release|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|x64.ActiveCfg = DLL Release|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|x64.Build.0 = DLL Release|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|Win32.ActiveCfg = LIB Debug - DLL OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|Win32.Build.0 = LIB Debug - DLL OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|x64.ActiveCfg = LIB Debug - DLL OpenSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|x64.Build.0 = LIB Debug - DLL OpenSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|Win32.Build.0 = LIB Debug - DLL Windows SSPI|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|x64.ActiveCfg = LIB Debug - DLL Windows SSPI|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|x64.Build.0 = LIB Debug - DLL Windows SSPI|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|Win32.ActiveCfg = LIB Debug - LIB OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|Win32.Build.0 = LIB Debug - LIB OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|x64.ActiveCfg = LIB Debug - LIB OpenSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|x64.Build.0 = LIB Debug - LIB OpenSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB wolfSSL|Win32.ActiveCfg = LIB Debug - LIB wolfSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB wolfSSL|Win32.Build.0 = LIB Debug - LIB wolfSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB wolfSSL|x64.ActiveCfg = LIB Debug - LIB wolfSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB wolfSSL|x64.Build.0 = LIB Debug - LIB wolfSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|Win32.ActiveCfg = LIB Debug|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|Win32.Build.0 = LIB Debug|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|x64.ActiveCfg = LIB Debug|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|x64.Build.0 = LIB Debug|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|Win32.ActiveCfg = LIB Release - DLL OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|Win32.Build.0 = LIB Release - DLL OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|x64.ActiveCfg = LIB Release - DLL OpenSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|x64.Build.0 = LIB Release - DLL OpenSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|Win32.ActiveCfg = LIB Release - DLL Windows SSPI|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|Win32.Build.0 = LIB Release - DLL Windows SSPI|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|x64.ActiveCfg = LIB Release - DLL Windows SSPI|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|x64.Build.0 = LIB Release - DLL Windows SSPI|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|Win32.ActiveCfg = LIB Release - LIB OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|Win32.Build.0 = LIB Release - LIB OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|x64.ActiveCfg = LIB Release - LIB OpenSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|x64.Build.0 = LIB Release - LIB OpenSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB wolfSSL|Win32.ActiveCfg = LIB Release - LIB wolfSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB wolfSSL|Win32.Build.0 = LIB Release - LIB wolfSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB wolfSSL|x64.ActiveCfg = LIB Release - LIB wolfSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB wolfSSL|x64.Build.0 = LIB Release - LIB wolfSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|Win32.ActiveCfg = LIB Release|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|Win32.Build.0 = LIB Release|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|x64.ActiveCfg = LIB Release|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|x64.Build.0 = LIB Release|x64
-       EndGlobalSection
-       GlobalSection(SolutionProperties) = preSolution
-               HideSolutionNode = FALSE
-       EndGlobalSection
-EndGlobal
+Microsoft Visual Studio Solution File, Format Version 12.00\r
+# Visual Studio 2012\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "curl", "src\curl.vcxproj", "{5228E9CE-A216-422F-A5E6-58E95E2DD71D}"\r
+       ProjectSection(ProjectDependencies) = postProject\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB} = {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}\r
+       EndProjectSection\r
+EndProject\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libcurl", "lib\libcurl.vcxproj", "{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}"\r
+EndProject\r
+Global\r
+       GlobalSection(SolutionConfigurationPlatforms) = preSolution\r
+               DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               DLL Debug - DLL OpenSSL - DLL LibSSH2|x64 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64\r
+               DLL Debug - DLL OpenSSL|Win32 = DLL Debug - DLL OpenSSL|Win32\r
+               DLL Debug - DLL OpenSSL|x64 = DLL Debug - DLL OpenSSL|x64\r
+               DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               DLL Debug - DLL Windows SSPI - DLL WinIDN|x64 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64\r
+               DLL Debug - DLL Windows SSPI|Win32 = DLL Debug - DLL Windows SSPI|Win32\r
+               DLL Debug - DLL Windows SSPI|x64 = DLL Debug - DLL Windows SSPI|x64\r
+               DLL Debug - DLL wolfSSL|Win32 = DLL Debug - DLL wolfSSL|Win32\r
+               DLL Debug - DLL wolfSSL|x64 = DLL Debug - DLL wolfSSL|x64\r
+               DLL Debug|Win32 = DLL Debug|Win32\r
+               DLL Debug|x64 = DLL Debug|x64\r
+               DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               DLL Release - DLL OpenSSL - DLL LibSSH2|x64 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64\r
+               DLL Release - DLL OpenSSL|Win32 = DLL Release - DLL OpenSSL|Win32\r
+               DLL Release - DLL OpenSSL|x64 = DLL Release - DLL OpenSSL|x64\r
+               DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               DLL Release - DLL Windows SSPI - DLL WinIDN|x64 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64\r
+               DLL Release - DLL Windows SSPI|Win32 = DLL Release - DLL Windows SSPI|Win32\r
+               DLL Release - DLL Windows SSPI|x64 = DLL Release - DLL Windows SSPI|x64\r
+               DLL Release - DLL wolfSSL|Win32 = DLL Release - DLL wolfSSL|Win32\r
+               DLL Release - DLL wolfSSL|x64 = DLL Release - DLL wolfSSL|x64\r
+               DLL Release|Win32 = DLL Release|Win32\r
+               DLL Release|x64 = DLL Release|x64\r
+               LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               LIB Debug - DLL OpenSSL - DLL LibSSH2|x64 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64\r
+               LIB Debug - DLL OpenSSL|Win32 = LIB Debug - DLL OpenSSL|Win32\r
+               LIB Debug - DLL OpenSSL|x64 = LIB Debug - DLL OpenSSL|x64\r
+               LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               LIB Debug - DLL Windows SSPI - DLL WinIDN|x64 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64\r
+               LIB Debug - DLL Windows SSPI|Win32 = LIB Debug - DLL Windows SSPI|Win32\r
+               LIB Debug - DLL Windows SSPI|x64 = LIB Debug - DLL Windows SSPI|x64\r
+               LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32\r
+               LIB Debug - LIB OpenSSL - LIB LibSSH2|x64 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64\r
+               LIB Debug - LIB OpenSSL|Win32 = LIB Debug - LIB OpenSSL|Win32\r
+               LIB Debug - LIB OpenSSL|x64 = LIB Debug - LIB OpenSSL|x64\r
+               LIB Debug - LIB wolfSSL|Win32 = LIB Debug - LIB wolfSSL|Win32\r
+               LIB Debug - LIB wolfSSL|x64 = LIB Debug - LIB wolfSSL|x64\r
+               LIB Debug|Win32 = LIB Debug|Win32\r
+               LIB Debug|x64 = LIB Debug|x64\r
+               LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               LIB Release - DLL OpenSSL - DLL LibSSH2|x64 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64\r
+               LIB Release - DLL OpenSSL|Win32 = LIB Release - DLL OpenSSL|Win32\r
+               LIB Release - DLL OpenSSL|x64 = LIB Release - DLL OpenSSL|x64\r
+               LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               LIB Release - DLL Windows SSPI - DLL WinIDN|x64 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64\r
+               LIB Release - DLL Windows SSPI|Win32 = LIB Release - DLL Windows SSPI|Win32\r
+               LIB Release - DLL Windows SSPI|x64 = LIB Release - DLL Windows SSPI|x64\r
+               LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32\r
+               LIB Release - LIB OpenSSL - LIB LibSSH2|x64 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64\r
+               LIB Release - LIB OpenSSL|Win32 = LIB Release - LIB OpenSSL|Win32\r
+               LIB Release - LIB OpenSSL|x64 = LIB Release - LIB OpenSSL|x64\r
+               LIB Release - LIB wolfSSL|Win32 = LIB Release - LIB wolfSSL|Win32\r
+               LIB Release - LIB wolfSSL|x64 = LIB Release - LIB wolfSSL|x64\r
+               LIB Release|Win32 = LIB Release|Win32\r
+               LIB Release|x64 = LIB Release|x64\r
+       EndGlobalSection\r
+       GlobalSection(ProjectConfigurationPlatforms) = postSolution\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|Win32.ActiveCfg = DLL Debug - DLL OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|Win32.Build.0 = DLL Debug - DLL OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|x64.ActiveCfg = DLL Debug - DLL OpenSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|x64.Build.0 = DLL Debug - DLL OpenSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|Win32.Build.0 = DLL Debug - DLL Windows SSPI|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|x64.ActiveCfg = DLL Debug - DLL Windows SSPI|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|x64.Build.0 = DLL Debug - DLL Windows SSPI|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL wolfSSL|Win32.ActiveCfg = DLL Debug - DLL wolfSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL wolfSSL|Win32.Build.0 = DLL Debug - DLL wolfSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL wolfSSL|x64.ActiveCfg = DLL Debug - DLL wolfSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL wolfSSL|x64.Build.0 = DLL Debug - DLL wolfSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|Win32.Build.0 = DLL Debug|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|x64.ActiveCfg = DLL Debug|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|x64.Build.0 = DLL Debug|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|Win32.ActiveCfg = DLL Release - DLL OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|Win32.Build.0 = DLL Release - DLL OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|x64.ActiveCfg = DLL Release - DLL OpenSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|x64.Build.0 = DLL Release - DLL OpenSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|Win32.ActiveCfg = DLL Release - DLL Windows SSPI|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|Win32.Build.0 = DLL Release - DLL Windows SSPI|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|x64.ActiveCfg = DLL Release - DLL Windows SSPI|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|x64.Build.0 = DLL Release - DLL Windows SSPI|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL wolfSSL|Win32.ActiveCfg = DLL Release - DLL wolfSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL wolfSSL|Win32.Build.0 = DLL Release - DLL wolfSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL wolfSSL|x64.ActiveCfg = DLL Release - DLL wolfSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL wolfSSL|x64.Build.0 = DLL Release - DLL wolfSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|Win32.ActiveCfg = DLL Release|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|Win32.Build.0 = DLL Release|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|x64.ActiveCfg = DLL Release|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|x64.Build.0 = DLL Release|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|Win32.ActiveCfg = LIB Debug - DLL OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|Win32.Build.0 = LIB Debug - DLL OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|x64.ActiveCfg = LIB Debug - DLL OpenSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|x64.Build.0 = LIB Debug - DLL OpenSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|Win32.Build.0 = LIB Debug - DLL Windows SSPI|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|x64.ActiveCfg = LIB Debug - DLL Windows SSPI|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|x64.Build.0 = LIB Debug - DLL Windows SSPI|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|Win32.ActiveCfg = LIB Debug - LIB OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|Win32.Build.0 = LIB Debug - LIB OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|x64.ActiveCfg = LIB Debug - LIB OpenSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|x64.Build.0 = LIB Debug - LIB OpenSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB wolfSSL|Win32.ActiveCfg = LIB Debug - LIB wolfSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB wolfSSL|Win32.Build.0 = LIB Debug - LIB wolfSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB wolfSSL|x64.ActiveCfg = LIB Debug - LIB wolfSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB wolfSSL|x64.Build.0 = LIB Debug - LIB wolfSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|Win32.ActiveCfg = LIB Debug|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|Win32.Build.0 = LIB Debug|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|x64.ActiveCfg = LIB Debug|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|x64.Build.0 = LIB Debug|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|Win32.ActiveCfg = LIB Release - DLL OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|Win32.Build.0 = LIB Release - DLL OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|x64.ActiveCfg = LIB Release - DLL OpenSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|x64.Build.0 = LIB Release - DLL OpenSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|Win32.ActiveCfg = LIB Release - DLL Windows SSPI|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|Win32.Build.0 = LIB Release - DLL Windows SSPI|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|x64.ActiveCfg = LIB Release - DLL Windows SSPI|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|x64.Build.0 = LIB Release - DLL Windows SSPI|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|Win32.ActiveCfg = LIB Release - LIB OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|Win32.Build.0 = LIB Release - LIB OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|x64.ActiveCfg = LIB Release - LIB OpenSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|x64.Build.0 = LIB Release - LIB OpenSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB wolfSSL|Win32.ActiveCfg = LIB Release - LIB wolfSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB wolfSSL|Win32.Build.0 = LIB Release - LIB wolfSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB wolfSSL|x64.ActiveCfg = LIB Release - LIB wolfSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB wolfSSL|x64.Build.0 = LIB Release - LIB wolfSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|Win32.ActiveCfg = LIB Release|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|Win32.Build.0 = LIB Release|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|x64.ActiveCfg = LIB Release|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|x64.Build.0 = LIB Release|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|Win32.ActiveCfg = DLL Debug - DLL OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|Win32.Build.0 = DLL Debug - DLL OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|x64.ActiveCfg = DLL Debug - DLL OpenSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|x64.Build.0 = DLL Debug - DLL OpenSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|Win32.Build.0 = DLL Debug - DLL Windows SSPI|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|x64.ActiveCfg = DLL Debug - DLL Windows SSPI|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|x64.Build.0 = DLL Debug - DLL Windows SSPI|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL wolfSSL|Win32.ActiveCfg = DLL Debug - DLL wolfSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL wolfSSL|Win32.Build.0 = DLL Debug - DLL wolfSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL wolfSSL|x64.ActiveCfg = DLL Debug - DLL wolfSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL wolfSSL|x64.Build.0 = DLL Debug - DLL wolfSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|Win32.Build.0 = DLL Debug|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|x64.ActiveCfg = DLL Debug|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|x64.Build.0 = DLL Debug|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|Win32.ActiveCfg = DLL Release - DLL OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|Win32.Build.0 = DLL Release - DLL OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|x64.ActiveCfg = DLL Release - DLL OpenSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|x64.Build.0 = DLL Release - DLL OpenSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|Win32.ActiveCfg = DLL Release - DLL Windows SSPI|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|Win32.Build.0 = DLL Release - DLL Windows SSPI|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|x64.ActiveCfg = DLL Release - DLL Windows SSPI|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|x64.Build.0 = DLL Release - DLL Windows SSPI|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL wolfSSL|Win32.ActiveCfg = DLL Release - DLL wolfSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL wolfSSL|Win32.Build.0 = DLL Release - DLL wolfSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL wolfSSL|x64.ActiveCfg = DLL Release - DLL wolfSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL wolfSSL|x64.Build.0 = DLL Release - DLL wolfSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|Win32.ActiveCfg = DLL Release|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|Win32.Build.0 = DLL Release|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|x64.ActiveCfg = DLL Release|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|x64.Build.0 = DLL Release|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|Win32.ActiveCfg = LIB Debug - DLL OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|Win32.Build.0 = LIB Debug - DLL OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|x64.ActiveCfg = LIB Debug - DLL OpenSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|x64.Build.0 = LIB Debug - DLL OpenSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|Win32.Build.0 = LIB Debug - DLL Windows SSPI|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|x64.ActiveCfg = LIB Debug - DLL Windows SSPI|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|x64.Build.0 = LIB Debug - DLL Windows SSPI|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|Win32.ActiveCfg = LIB Debug - LIB OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|Win32.Build.0 = LIB Debug - LIB OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|x64.ActiveCfg = LIB Debug - LIB OpenSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|x64.Build.0 = LIB Debug - LIB OpenSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB wolfSSL|Win32.ActiveCfg = LIB Debug - LIB wolfSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB wolfSSL|Win32.Build.0 = LIB Debug - LIB wolfSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB wolfSSL|x64.ActiveCfg = LIB Debug - LIB wolfSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB wolfSSL|x64.Build.0 = LIB Debug - LIB wolfSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|Win32.ActiveCfg = LIB Debug|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|Win32.Build.0 = LIB Debug|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|x64.ActiveCfg = LIB Debug|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|x64.Build.0 = LIB Debug|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|Win32.ActiveCfg = LIB Release - DLL OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|Win32.Build.0 = LIB Release - DLL OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|x64.ActiveCfg = LIB Release - DLL OpenSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|x64.Build.0 = LIB Release - DLL OpenSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|Win32.ActiveCfg = LIB Release - DLL Windows SSPI|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|Win32.Build.0 = LIB Release - DLL Windows SSPI|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|x64.ActiveCfg = LIB Release - DLL Windows SSPI|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|x64.Build.0 = LIB Release - DLL Windows SSPI|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|Win32.ActiveCfg = LIB Release - LIB OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|Win32.Build.0 = LIB Release - LIB OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|x64.ActiveCfg = LIB Release - LIB OpenSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|x64.Build.0 = LIB Release - LIB OpenSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB wolfSSL|Win32.ActiveCfg = LIB Release - LIB wolfSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB wolfSSL|Win32.Build.0 = LIB Release - LIB wolfSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB wolfSSL|x64.ActiveCfg = LIB Release - LIB wolfSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB wolfSSL|x64.Build.0 = LIB Release - LIB wolfSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|Win32.ActiveCfg = LIB Release|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|Win32.Build.0 = LIB Release|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|x64.ActiveCfg = LIB Release|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|x64.Build.0 = LIB Release|x64\r
+       EndGlobalSection\r
+       GlobalSection(SolutionProperties) = preSolution\r
+               HideSolutionNode = FALSE\r
+       EndGlobalSection\r
+EndGlobal\r
index 780dc91..34c1dd2 100644 (file)
-Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio 2012
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libcurl", "libcurl.vcxproj", "{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}"
-EndProject
-Global
-       GlobalSection(SolutionConfigurationPlatforms) = preSolution
-               DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               DLL Debug - DLL OpenSSL - DLL LibSSH2|x64 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
-               DLL Debug - DLL OpenSSL|Win32 = DLL Debug - DLL OpenSSL|Win32
-               DLL Debug - DLL OpenSSL|x64 = DLL Debug - DLL OpenSSL|x64
-               DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               DLL Debug - DLL Windows SSPI - DLL WinIDN|x64 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
-               DLL Debug - DLL Windows SSPI|Win32 = DLL Debug - DLL Windows SSPI|Win32
-               DLL Debug - DLL Windows SSPI|x64 = DLL Debug - DLL Windows SSPI|x64
-               DLL Debug - DLL wolfSSL|Win32 = DLL Debug - DLL wolfSSL|Win32
-               DLL Debug - DLL wolfSSL|x64 = DLL Debug - DLL wolfSSL|x64
-               DLL Debug|Win32 = DLL Debug|Win32
-               DLL Debug|x64 = DLL Debug|x64
-               DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
-               DLL Release - DLL OpenSSL - DLL LibSSH2|x64 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
-               DLL Release - DLL OpenSSL|Win32 = DLL Release - DLL OpenSSL|Win32
-               DLL Release - DLL OpenSSL|x64 = DLL Release - DLL OpenSSL|x64
-               DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
-               DLL Release - DLL Windows SSPI - DLL WinIDN|x64 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
-               DLL Release - DLL Windows SSPI|Win32 = DLL Release - DLL Windows SSPI|Win32
-               DLL Release - DLL Windows SSPI|x64 = DLL Release - DLL Windows SSPI|x64
-               DLL Release - DLL wolfSSL|Win32 = DLL Release - DLL wolfSSL|Win32
-               DLL Release - DLL wolfSSL|x64 = DLL Release - DLL wolfSSL|x64
-               DLL Release|Win32 = DLL Release|Win32
-               DLL Release|x64 = DLL Release|x64
-               LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               LIB Debug - DLL OpenSSL - DLL LibSSH2|x64 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
-               LIB Debug - DLL OpenSSL|Win32 = LIB Debug - DLL OpenSSL|Win32
-               LIB Debug - DLL OpenSSL|x64 = LIB Debug - DLL OpenSSL|x64
-               LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               LIB Debug - DLL Windows SSPI - DLL WinIDN|x64 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
-               LIB Debug - DLL Windows SSPI|Win32 = LIB Debug - DLL Windows SSPI|Win32
-               LIB Debug - DLL Windows SSPI|x64 = LIB Debug - DLL Windows SSPI|x64
-               LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
-               LIB Debug - LIB OpenSSL - LIB LibSSH2|x64 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
-               LIB Debug - LIB OpenSSL|Win32 = LIB Debug - LIB OpenSSL|Win32
-               LIB Debug - LIB OpenSSL|x64 = LIB Debug - LIB OpenSSL|x64
-               LIB Debug - LIB wolfSSL|Win32 = LIB Debug - LIB wolfSSL|Win32
-               LIB Debug - LIB wolfSSL|x64 = LIB Debug - LIB wolfSSL|x64
-               LIB Debug|Win32 = LIB Debug|Win32
-               LIB Debug|x64 = LIB Debug|x64
-               LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
-               LIB Release - DLL OpenSSL - DLL LibSSH2|x64 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
-               LIB Release - DLL OpenSSL|Win32 = LIB Release - DLL OpenSSL|Win32
-               LIB Release - DLL OpenSSL|x64 = LIB Release - DLL OpenSSL|x64
-               LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
-               LIB Release - DLL Windows SSPI - DLL WinIDN|x64 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
-               LIB Release - DLL Windows SSPI|Win32 = LIB Release - DLL Windows SSPI|Win32
-               LIB Release - DLL Windows SSPI|x64 = LIB Release - DLL Windows SSPI|x64
-               LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
-               LIB Release - LIB OpenSSL - LIB LibSSH2|x64 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
-               LIB Release - LIB OpenSSL|Win32 = LIB Release - LIB OpenSSL|Win32
-               LIB Release - LIB OpenSSL|x64 = LIB Release - LIB OpenSSL|x64
-               LIB Release - LIB wolfSSL|Win32 = LIB Release - LIB wolfSSL|Win32
-               LIB Release - LIB wolfSSL|x64 = LIB Release - LIB wolfSSL|x64
-               LIB Release|Win32 = LIB Release|Win32
-               LIB Release|x64 = LIB Release|x64
-       EndGlobalSection
-       GlobalSection(ProjectConfigurationPlatforms) = postSolution
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|Win32.ActiveCfg = DLL Debug - DLL OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|Win32.Build.0 = DLL Debug - DLL OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|x64.ActiveCfg = DLL Debug - DLL OpenSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|x64.Build.0 = DLL Debug - DLL OpenSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|Win32.Build.0 = DLL Debug - DLL Windows SSPI|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|x64.ActiveCfg = DLL Debug - DLL Windows SSPI|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|x64.Build.0 = DLL Debug - DLL Windows SSPI|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL wolfSSL|Win32.ActiveCfg = DLL Debug - DLL wolfSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL wolfSSL|Win32.Build.0 = DLL Debug - DLL wolfSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL wolfSSL|x64.ActiveCfg = DLL Debug - DLL wolfSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL wolfSSL|x64.Build.0 = DLL Debug - DLL wolfSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|Win32.Build.0 = DLL Debug|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|x64.ActiveCfg = DLL Debug|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|x64.Build.0 = DLL Debug|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|Win32.ActiveCfg = DLL Release - DLL OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|Win32.Build.0 = DLL Release - DLL OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|x64.ActiveCfg = DLL Release - DLL OpenSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|x64.Build.0 = DLL Release - DLL OpenSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|Win32.ActiveCfg = DLL Release - DLL Windows SSPI|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|Win32.Build.0 = DLL Release - DLL Windows SSPI|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|x64.ActiveCfg = DLL Release - DLL Windows SSPI|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|x64.Build.0 = DLL Release - DLL Windows SSPI|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL wolfSSL|Win32.ActiveCfg = DLL Release - DLL wolfSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL wolfSSL|Win32.Build.0 = DLL Release - DLL wolfSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL wolfSSL|x64.ActiveCfg = DLL Release - DLL wolfSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL wolfSSL|x64.Build.0 = DLL Release - DLL wolfSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|Win32.ActiveCfg = DLL Release|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|Win32.Build.0 = DLL Release|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|x64.ActiveCfg = DLL Release|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|x64.Build.0 = DLL Release|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|Win32.ActiveCfg = LIB Debug - DLL OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|Win32.Build.0 = LIB Debug - DLL OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|x64.ActiveCfg = LIB Debug - DLL OpenSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|x64.Build.0 = LIB Debug - DLL OpenSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|Win32.Build.0 = LIB Debug - DLL Windows SSPI|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|x64.ActiveCfg = LIB Debug - DLL Windows SSPI|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|x64.Build.0 = LIB Debug - DLL Windows SSPI|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|Win32.ActiveCfg = LIB Debug - LIB OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|Win32.Build.0 = LIB Debug - LIB OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|x64.ActiveCfg = LIB Debug - LIB OpenSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|x64.Build.0 = LIB Debug - LIB OpenSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB wolfSSL|Win32.ActiveCfg = LIB Debug - LIB wolfSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB wolfSSL|Win32.Build.0 = LIB Debug - LIB wolfSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB wolfSSL|x64.ActiveCfg = LIB Debug - LIB wolfSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB wolfSSL|x64.Build.0 = LIB Debug - LIB wolfSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|Win32.ActiveCfg = LIB Debug|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|Win32.Build.0 = LIB Debug|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|x64.ActiveCfg = LIB Debug|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|x64.Build.0 = LIB Debug|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|Win32.ActiveCfg = LIB Release - DLL OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|Win32.Build.0 = LIB Release - DLL OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|x64.ActiveCfg = LIB Release - DLL OpenSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|x64.Build.0 = LIB Release - DLL OpenSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|Win32.ActiveCfg = LIB Release - DLL Windows SSPI|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|Win32.Build.0 = LIB Release - DLL Windows SSPI|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|x64.ActiveCfg = LIB Release - DLL Windows SSPI|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|x64.Build.0 = LIB Release - DLL Windows SSPI|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|Win32.ActiveCfg = LIB Release - LIB OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|Win32.Build.0 = LIB Release - LIB OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|x64.ActiveCfg = LIB Release - LIB OpenSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|x64.Build.0 = LIB Release - LIB OpenSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB wolfSSL|Win32.ActiveCfg = LIB Release - LIB wolfSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB wolfSSL|Win32.Build.0 = LIB Release - LIB wolfSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB wolfSSL|x64.ActiveCfg = LIB Release - LIB wolfSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB wolfSSL|x64.Build.0 = LIB Release - LIB wolfSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|Win32.ActiveCfg = LIB Release|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|Win32.Build.0 = LIB Release|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|x64.ActiveCfg = LIB Release|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|x64.Build.0 = LIB Release|x64
-       EndGlobalSection
-       GlobalSection(SolutionProperties) = preSolution
-               HideSolutionNode = FALSE
-       EndGlobalSection
-EndGlobal
+Microsoft Visual Studio Solution File, Format Version 12.00\r
+# Visual Studio 2012\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libcurl", "libcurl.vcxproj", "{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}"\r
+EndProject\r
+Global\r
+       GlobalSection(SolutionConfigurationPlatforms) = preSolution\r
+               DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               DLL Debug - DLL OpenSSL - DLL LibSSH2|x64 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64\r
+               DLL Debug - DLL OpenSSL|Win32 = DLL Debug - DLL OpenSSL|Win32\r
+               DLL Debug - DLL OpenSSL|x64 = DLL Debug - DLL OpenSSL|x64\r
+               DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               DLL Debug - DLL Windows SSPI - DLL WinIDN|x64 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64\r
+               DLL Debug - DLL Windows SSPI|Win32 = DLL Debug - DLL Windows SSPI|Win32\r
+               DLL Debug - DLL Windows SSPI|x64 = DLL Debug - DLL Windows SSPI|x64\r
+               DLL Debug - DLL wolfSSL|Win32 = DLL Debug - DLL wolfSSL|Win32\r
+               DLL Debug - DLL wolfSSL|x64 = DLL Debug - DLL wolfSSL|x64\r
+               DLL Debug|Win32 = DLL Debug|Win32\r
+               DLL Debug|x64 = DLL Debug|x64\r
+               DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               DLL Release - DLL OpenSSL - DLL LibSSH2|x64 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64\r
+               DLL Release - DLL OpenSSL|Win32 = DLL Release - DLL OpenSSL|Win32\r
+               DLL Release - DLL OpenSSL|x64 = DLL Release - DLL OpenSSL|x64\r
+               DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               DLL Release - DLL Windows SSPI - DLL WinIDN|x64 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64\r
+               DLL Release - DLL Windows SSPI|Win32 = DLL Release - DLL Windows SSPI|Win32\r
+               DLL Release - DLL Windows SSPI|x64 = DLL Release - DLL Windows SSPI|x64\r
+               DLL Release - DLL wolfSSL|Win32 = DLL Release - DLL wolfSSL|Win32\r
+               DLL Release - DLL wolfSSL|x64 = DLL Release - DLL wolfSSL|x64\r
+               DLL Release|Win32 = DLL Release|Win32\r
+               DLL Release|x64 = DLL Release|x64\r
+               LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               LIB Debug - DLL OpenSSL - DLL LibSSH2|x64 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64\r
+               LIB Debug - DLL OpenSSL|Win32 = LIB Debug - DLL OpenSSL|Win32\r
+               LIB Debug - DLL OpenSSL|x64 = LIB Debug - DLL OpenSSL|x64\r
+               LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               LIB Debug - DLL Windows SSPI - DLL WinIDN|x64 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64\r
+               LIB Debug - DLL Windows SSPI|Win32 = LIB Debug - DLL Windows SSPI|Win32\r
+               LIB Debug - DLL Windows SSPI|x64 = LIB Debug - DLL Windows SSPI|x64\r
+               LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32\r
+               LIB Debug - LIB OpenSSL - LIB LibSSH2|x64 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64\r
+               LIB Debug - LIB OpenSSL|Win32 = LIB Debug - LIB OpenSSL|Win32\r
+               LIB Debug - LIB OpenSSL|x64 = LIB Debug - LIB OpenSSL|x64\r
+               LIB Debug - LIB wolfSSL|Win32 = LIB Debug - LIB wolfSSL|Win32\r
+               LIB Debug - LIB wolfSSL|x64 = LIB Debug - LIB wolfSSL|x64\r
+               LIB Debug|Win32 = LIB Debug|Win32\r
+               LIB Debug|x64 = LIB Debug|x64\r
+               LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               LIB Release - DLL OpenSSL - DLL LibSSH2|x64 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64\r
+               LIB Release - DLL OpenSSL|Win32 = LIB Release - DLL OpenSSL|Win32\r
+               LIB Release - DLL OpenSSL|x64 = LIB Release - DLL OpenSSL|x64\r
+               LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               LIB Release - DLL Windows SSPI - DLL WinIDN|x64 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64\r
+               LIB Release - DLL Windows SSPI|Win32 = LIB Release - DLL Windows SSPI|Win32\r
+               LIB Release - DLL Windows SSPI|x64 = LIB Release - DLL Windows SSPI|x64\r
+               LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32\r
+               LIB Release - LIB OpenSSL - LIB LibSSH2|x64 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64\r
+               LIB Release - LIB OpenSSL|Win32 = LIB Release - LIB OpenSSL|Win32\r
+               LIB Release - LIB OpenSSL|x64 = LIB Release - LIB OpenSSL|x64\r
+               LIB Release - LIB wolfSSL|Win32 = LIB Release - LIB wolfSSL|Win32\r
+               LIB Release - LIB wolfSSL|x64 = LIB Release - LIB wolfSSL|x64\r
+               LIB Release|Win32 = LIB Release|Win32\r
+               LIB Release|x64 = LIB Release|x64\r
+       EndGlobalSection\r
+       GlobalSection(ProjectConfigurationPlatforms) = postSolution\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|Win32.ActiveCfg = DLL Debug - DLL OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|Win32.Build.0 = DLL Debug - DLL OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|x64.ActiveCfg = DLL Debug - DLL OpenSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|x64.Build.0 = DLL Debug - DLL OpenSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|Win32.Build.0 = DLL Debug - DLL Windows SSPI|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|x64.ActiveCfg = DLL Debug - DLL Windows SSPI|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|x64.Build.0 = DLL Debug - DLL Windows SSPI|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL wolfSSL|Win32.ActiveCfg = DLL Debug - DLL wolfSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL wolfSSL|Win32.Build.0 = DLL Debug - DLL wolfSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL wolfSSL|x64.ActiveCfg = DLL Debug - DLL wolfSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL wolfSSL|x64.Build.0 = DLL Debug - DLL wolfSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|Win32.Build.0 = DLL Debug|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|x64.ActiveCfg = DLL Debug|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|x64.Build.0 = DLL Debug|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|Win32.ActiveCfg = DLL Release - DLL OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|Win32.Build.0 = DLL Release - DLL OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|x64.ActiveCfg = DLL Release - DLL OpenSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|x64.Build.0 = DLL Release - DLL OpenSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|Win32.ActiveCfg = DLL Release - DLL Windows SSPI|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|Win32.Build.0 = DLL Release - DLL Windows SSPI|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|x64.ActiveCfg = DLL Release - DLL Windows SSPI|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|x64.Build.0 = DLL Release - DLL Windows SSPI|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL wolfSSL|Win32.ActiveCfg = DLL Release - DLL wolfSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL wolfSSL|Win32.Build.0 = DLL Release - DLL wolfSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL wolfSSL|x64.ActiveCfg = DLL Release - DLL wolfSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL wolfSSL|x64.Build.0 = DLL Release - DLL wolfSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|Win32.ActiveCfg = DLL Release|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|Win32.Build.0 = DLL Release|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|x64.ActiveCfg = DLL Release|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|x64.Build.0 = DLL Release|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|Win32.ActiveCfg = LIB Debug - DLL OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|Win32.Build.0 = LIB Debug - DLL OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|x64.ActiveCfg = LIB Debug - DLL OpenSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|x64.Build.0 = LIB Debug - DLL OpenSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|Win32.Build.0 = LIB Debug - DLL Windows SSPI|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|x64.ActiveCfg = LIB Debug - DLL Windows SSPI|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|x64.Build.0 = LIB Debug - DLL Windows SSPI|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|Win32.ActiveCfg = LIB Debug - LIB OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|Win32.Build.0 = LIB Debug - LIB OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|x64.ActiveCfg = LIB Debug - LIB OpenSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|x64.Build.0 = LIB Debug - LIB OpenSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB wolfSSL|Win32.ActiveCfg = LIB Debug - LIB wolfSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB wolfSSL|Win32.Build.0 = LIB Debug - LIB wolfSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB wolfSSL|x64.ActiveCfg = LIB Debug - LIB wolfSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB wolfSSL|x64.Build.0 = LIB Debug - LIB wolfSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|Win32.ActiveCfg = LIB Debug|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|Win32.Build.0 = LIB Debug|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|x64.ActiveCfg = LIB Debug|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|x64.Build.0 = LIB Debug|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|Win32.ActiveCfg = LIB Release - DLL OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|Win32.Build.0 = LIB Release - DLL OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|x64.ActiveCfg = LIB Release - DLL OpenSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|x64.Build.0 = LIB Release - DLL OpenSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|Win32.ActiveCfg = LIB Release - DLL Windows SSPI|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|Win32.Build.0 = LIB Release - DLL Windows SSPI|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|x64.ActiveCfg = LIB Release - DLL Windows SSPI|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|x64.Build.0 = LIB Release - DLL Windows SSPI|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|Win32.ActiveCfg = LIB Release - LIB OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|Win32.Build.0 = LIB Release - LIB OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|x64.ActiveCfg = LIB Release - LIB OpenSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|x64.Build.0 = LIB Release - LIB OpenSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB wolfSSL|Win32.ActiveCfg = LIB Release - LIB wolfSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB wolfSSL|Win32.Build.0 = LIB Release - LIB wolfSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB wolfSSL|x64.ActiveCfg = LIB Release - LIB wolfSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB wolfSSL|x64.Build.0 = LIB Release - LIB wolfSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|Win32.ActiveCfg = LIB Release|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|Win32.Build.0 = LIB Release|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|x64.ActiveCfg = LIB Release|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|x64.Build.0 = LIB Release|x64\r
+       EndGlobalSection\r
+       GlobalSection(SolutionProperties) = preSolution\r
+               HideSolutionNode = FALSE\r
+       EndGlobalSection\r
+EndGlobal\r
index cb7abce..5960b34 100644 (file)
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - LIB OpenSSL - LIB LibSSH2|Win32'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v110</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - LIB OpenSSL|Win32'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v110</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL Windows SSPI|Win32'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v110</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL Windows SSPI - DLL WinIDN|Win32'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v110</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL OpenSSL - DLL LibSSH2|Win32'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v110</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL OpenSSL|Win32'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v110</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v110</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - LIB OpenSSL|Win32'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v110</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL Windows SSPI|Win32'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v110</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v110</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v110</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL OpenSSL|Win32'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v110</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL OpenSSL - DLL LibSSH2|Win32'" Label="Configuration">\r
     <ConfigurationType>DynamicLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v110</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32'" Label="Configuration">\r
     <ConfigurationType>DynamicLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v110</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL Windows SSPI|Win32'" Label="Configuration">\r
     <ConfigurationType>DynamicLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v110</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL Windows SSPI - DLL WinIDN|Win32'" Label="Configuration">\r
     <ConfigurationType>DynamicLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v110</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL Windows SSPI|Win32'" Label="Configuration">\r
     <ConfigurationType>DynamicLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v110</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32'" Label="Configuration">\r
     <ConfigurationType>DynamicLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v110</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL OpenSSL|Win32'" Label="Configuration">\r
     <ConfigurationType>DynamicLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v110</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL OpenSSL|Win32'" Label="Configuration">\r
     <ConfigurationType>DynamicLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v110</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release|Win32'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v110</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - LIB wolfSSL|Win32'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v110</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug|Win32'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v110</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - LIB wolfSSL|Win32'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v110</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release|Win32'" Label="Configuration">\r
     <ConfigurationType>DynamicLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v110</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL wolfSSL|Win32'" Label="Configuration">\r
     <ConfigurationType>DynamicLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v110</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug|Win32'" Label="Configuration">\r
     <ConfigurationType>DynamicLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v110</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL wolfSSL|Win32'" Label="Configuration">\r
     <ConfigurationType>DynamicLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v110</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - LIB OpenSSL - LIB LibSSH2|x64'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v110</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - LIB OpenSSL|x64'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v110</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL Windows SSPI|x64'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v110</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL Windows SSPI - DLL WinIDN|x64'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v110</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL OpenSSL - DLL LibSSH2|x64'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v110</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL OpenSSL|x64'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v110</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - LIB OpenSSL - LIB LibSSH2|x64'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v110</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - LIB OpenSSL|x64'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v110</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL Windows SSPI|x64'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v110</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL Windows SSPI - DLL WinIDN|x64'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v110</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL OpenSSL - DLL LibSSH2|x64'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v110</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL OpenSSL|x64'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v110</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL OpenSSL - DLL LibSSH2|x64'" Label="Configuration">\r
     <ConfigurationType>DynamicLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v110</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL OpenSSL - DLL LibSSH2|x64'" Label="Configuration">\r
     <ConfigurationType>DynamicLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v110</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL Windows SSPI|x64'" Label="Configuration">\r
     <ConfigurationType>DynamicLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v110</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL Windows SSPI - DLL WinIDN|x64'" Label="Configuration">\r
     <ConfigurationType>DynamicLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v110</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL Windows SSPI|x64'" Label="Configuration">\r
     <ConfigurationType>DynamicLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v110</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL Windows SSPI - DLL WinIDN|x64'" Label="Configuration">\r
     <ConfigurationType>DynamicLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v110</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL OpenSSL|x64'" Label="Configuration">\r
     <ConfigurationType>DynamicLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v110</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL OpenSSL|x64'" Label="Configuration">\r
     <ConfigurationType>DynamicLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v110</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release|x64'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v110</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - LIB wolfSSL|x64'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v110</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug|x64'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v110</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - LIB wolfSSL|x64'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v110</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release|x64'" Label="Configuration">\r
     <ConfigurationType>DynamicLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v110</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL wolfSSL|x64'" Label="Configuration">\r
     <ConfigurationType>DynamicLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v110</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug|x64'" Label="Configuration">\r
     <ConfigurationType>DynamicLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v110</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL wolfSSL|x64'" Label="Configuration">\r
     <ConfigurationType>DynamicLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v110</PlatformToolset>\r
   </PropertyGroup>\r
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />\r
     <ClCompile>\r
       <Optimization>Disabled</Optimization>\r
       <AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\wolfssl;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_DEBUG;BUILDING_LIBCURL;DEBUGBUILD;USE_CYASSL;USE_IPV6;HAVE_CYASSL_OPTIONS_H;HAVE_CYASSL_ERROR_SSL_H;WOLFSSL_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>_DEBUG;BUILDING_LIBCURL;DEBUGBUILD;USE_WOLFSSL;USE_IPV6;WOLFSSL_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <MinimalRebuild>true</MinimalRebuild>\r
       <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
     <ClCompile>\r
       <Optimization>Disabled</Optimization>\r
       <AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\wolfssl;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_DEBUG;BUILDING_LIBCURL;DEBUGBUILD;USE_CYASSL;USE_IPV6;HAVE_CYASSL_OPTIONS_H;HAVE_CYASSL_ERROR_SSL_H;WOLFSSL_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>_DEBUG;BUILDING_LIBCURL;DEBUGBUILD;USE_WOLFSSL;USE_IPV6;WOLFSSL_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <MinimalRebuild>true</MinimalRebuild>\r
       <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
       <Optimization>MaxSpeed</Optimization>\r
       <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>\r
       <AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\wolfssl;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>NDEBUG;BUILDING_LIBCURL;USE_CYASSL;USE_IPV6;HAVE_CYASSL_OPTIONS_H;HAVE_CYASSL_ERROR_SSL_H;WOLFSSL_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>NDEBUG;BUILDING_LIBCURL;USE_WOLFSSL;USE_IPV6;WOLFSSL_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <StringPooling>true</StringPooling>\r
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
       <FunctionLevelLinking>true</FunctionLevelLinking>\r
       <Optimization>MaxSpeed</Optimization>\r
       <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>\r
       <AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\wolfssl;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>NDEBUG;BUILDING_LIBCURL;USE_CYASSL;USE_IPV6;HAVE_CYASSL_OPTIONS_H;HAVE_CYASSL_ERROR_SSL_H;WOLFSSL_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>NDEBUG;BUILDING_LIBCURL;USE_WOLFSSL;USE_IPV6;WOLFSSL_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <StringPooling>true</StringPooling>\r
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
       <FunctionLevelLinking>true</FunctionLevelLinking>\r
     <ClCompile>\r
       <Optimization>Disabled</Optimization>\r
       <AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\wolfssl;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_DEBUG;BUILDING_LIBCURL;DEBUGBUILD;CURL_STATICLIB;USE_CYASSL;USE_IPV6;HAVE_CYASSL_OPTIONS_H;HAVE_CYASSL_ERROR_SSL_H;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>_DEBUG;BUILDING_LIBCURL;DEBUGBUILD;CURL_STATICLIB;USE_WOLFSSL;USE_IPV6;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <MinimalRebuild>true</MinimalRebuild>\r
       <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
     <ClCompile>\r
       <Optimization>Disabled</Optimization>\r
       <AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\wolfssl;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_DEBUG;BUILDING_LIBCURL;DEBUGBUILD;CURL_STATICLIB;USE_CYASSL;USE_IPV6;HAVE_CYASSL_OPTIONS_H;HAVE_CYASSL_ERROR_SSL_H;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>_DEBUG;BUILDING_LIBCURL;DEBUGBUILD;CURL_STATICLIB;USE_WOLFSSL;USE_IPV6;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <MinimalRebuild>true</MinimalRebuild>\r
       <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
       <Optimization>MaxSpeed</Optimization>\r
       <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>\r
       <AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\wolfssl;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>NDEBUG;BUILDING_LIBCURL;CURL_STATICLIB;USE_CYASSL;USE_IPV6;HAVE_CYASSL_OPTIONS_H;HAVE_CYASSL_ERROR_SSL_H;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>NDEBUG;BUILDING_LIBCURL;CURL_STATICLIB;USE_WOLFSSL;USE_IPV6;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <StringPooling>true</StringPooling>\r
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
       <FunctionLevelLinking>true</FunctionLevelLinking>\r
       <Optimization>MaxSpeed</Optimization>\r
       <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>\r
       <AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\wolfssl;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>NDEBUG;BUILDING_LIBCURL;CURL_STATICLIB;USE_CYASSL;USE_IPV6;HAVE_CYASSL_OPTIONS_H;HAVE_CYASSL_ERROR_SSL_H;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>NDEBUG;BUILDING_LIBCURL;CURL_STATICLIB;USE_WOLFSSL;USE_IPV6;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <StringPooling>true</StringPooling>\r
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
       <FunctionLevelLinking>true</FunctionLevelLinking>\r
     </Lib>\r
   </ItemDefinitionGroup>\r
   <ItemGroup>\r
+    <ClCompile Include="..\..\..\..\lib\altsvc.c" />\r
     <ClCompile Include="..\..\..\..\lib\amigaos.c" />\r
     <ClCompile Include="..\..\..\..\lib\asyn-ares.c" />\r
     <ClCompile Include="..\..\..\..\lib\asyn-thread.c" />\r
     <ClCompile Include="..\..\..\..\lib\curl_endian.c" />\r
     <ClCompile Include="..\..\..\..\lib\curl_fnmatch.c" />\r
     <ClCompile Include="..\..\..\..\lib\curl_gethostname.c" />\r
+    <ClCompile Include="..\..\..\..\lib\curl_get_line.c" />\r
     <ClCompile Include="..\..\..\..\lib\curl_gssapi.c" />\r
     <ClCompile Include="..\..\..\..\lib\curl_memrchr.c" />\r
     <ClCompile Include="..\..\..\..\lib\curl_multibyte.c" />\r
     <ClCompile Include="..\..\..\..\lib\openldap.c" />\r
     <ClCompile Include="..\..\..\..\lib\parsedate.c" />\r
     <ClCompile Include="..\..\..\..\lib\pingpong.c" />\r
-    <ClCompile Include="..\..\..\..\lib\pipeline.c" />\r
     <ClCompile Include="..\..\..\..\lib\pop3.c" />\r
     <ClCompile Include="..\..\..\..\lib\progress.c" />\r
     <ClCompile Include="..\..\..\..\lib\psl.c" />\r
     <ClCompile Include="..\..\..\..\lib\slist.c" />\r
     <ClCompile Include="..\..\..\..\lib\smb.c" />\r
     <ClCompile Include="..\..\..\..\lib\smtp.c" />\r
+    <ClCompile Include="..\..\..\..\lib\socketpair.c" />\r
     <ClCompile Include="..\..\..\..\lib\socks.c" />\r
     <ClCompile Include="..\..\..\..\lib\socks_gssapi.c" />\r
     <ClCompile Include="..\..\..\..\lib\socks_sspi.c" />\r
     <ClCompile Include="..\..\..\..\lib\speedcheck.c" />\r
     <ClCompile Include="..\..\..\..\lib\splay.c" />\r
-    <ClCompile Include="..\..\..\..\lib\ssh.c" />\r
-    <ClCompile Include="..\..\..\..\lib\ssh-libssh.c" />\r
     <ClCompile Include="..\..\..\..\lib\strcase.c" />\r
     <ClCompile Include="..\..\..\..\lib\strdup.c" />\r
     <ClCompile Include="..\..\..\..\lib\strerror.c" />\r
     <ClCompile Include="..\..\..\..\lib\vauth\spnego_gssapi.c" />\r
     <ClCompile Include="..\..\..\..\lib\vauth\spnego_sspi.c" />\r
     <ClCompile Include="..\..\..\..\lib\vauth\vauth.c" />\r
-    <ClCompile Include="..\..\..\..\lib\vtls\axtls.c" />\r
-    <ClCompile Include="..\..\..\..\lib\vtls\cyassl.c" />\r
-    <ClCompile Include="..\..\..\..\lib\vtls\darwinssl.c" />\r
+    <ClCompile Include="..\..\..\..\lib\vquic\ngtcp2.c" />\r
+    <ClCompile Include="..\..\..\..\lib\vquic\quiche.c" />\r
+    <ClCompile Include="..\..\..\..\lib\vssh\libssh2.c" />\r
+    <ClCompile Include="..\..\..\..\lib\vssh\libssh.c" />\r
+    <ClCompile Include="..\..\..\..\lib\vtls\bearssl.c" />\r
     <ClCompile Include="..\..\..\..\lib\vtls\gskit.c" />\r
     <ClCompile Include="..\..\..\..\lib\vtls\gtls.c" />\r
     <ClCompile Include="..\..\..\..\lib\vtls\mbedtls.c" />\r
     <ClCompile Include="..\..\..\..\lib\vtls\polarssl_threadlock.c" />\r
     <ClCompile Include="..\..\..\..\lib\vtls\schannel.c" />\r
     <ClCompile Include="..\..\..\..\lib\vtls\schannel_verify.c" />\r
+    <ClCompile Include="..\..\..\..\lib\vtls\sectransp.c" />\r
     <ClCompile Include="..\..\..\..\lib\vtls\vtls.c" />\r
+    <ClCompile Include="..\..\..\..\lib\vtls\wolfssl.c" />\r
   </ItemGroup>\r
   <ItemGroup>\r
+    <ClInclude Include="..\..\..\..\lib\altsvc.h" />\r
     <ClInclude Include="..\..\..\..\lib\amigaos.h" />\r
     <ClInclude Include="..\..\..\..\lib\arpa_telnet.h" />\r
     <ClInclude Include="..\..\..\..\lib\asyn.h" />\r
     <ClInclude Include="..\..\..\..\lib\curl_endian.h" />\r
     <ClInclude Include="..\..\..\..\lib\curl_fnmatch.h" />\r
     <ClInclude Include="..\..\..\..\lib\curl_gethostname.h" />\r
+    <ClInclude Include="..\..\..\..\lib\curl_get_line.h" />\r
     <ClInclude Include="..\..\..\..\lib\curl_gssapi.h" />\r
     <ClInclude Include="..\..\..\..\lib\curl_hmac.h" />\r
     <ClInclude Include="..\..\..\..\lib\curl_ldap.h" />\r
     <ClInclude Include="..\..\..\..\lib\nonblock.h" />\r
     <ClInclude Include="..\..\..\..\lib\parsedate.h" />\r
     <ClInclude Include="..\..\..\..\lib\pingpong.h" />\r
-    <ClInclude Include="..\..\..\..\lib\pipeline.h" />\r
     <ClInclude Include="..\..\..\..\lib\pop3.h" />\r
     <ClInclude Include="..\..\..\..\lib\progress.h" />\r
     <ClInclude Include="..\..\..\..\lib\psl.h" />\r
+    <ClInclude Include="..\..\..\..\lib\quic.h" />\r
     <ClInclude Include="..\..\..\..\lib\rand.h" />\r
     <ClInclude Include="..\..\..\..\lib\rtsp.h" />\r
     <ClInclude Include="..\..\..\..\lib\select.h" />\r
     <ClInclude Include="..\..\..\..\lib\smb.h" />\r
     <ClInclude Include="..\..\..\..\lib\smtp.h" />\r
     <ClInclude Include="..\..\..\..\lib\sockaddr.h" />\r
+    <ClInclude Include="..\..\..\..\lib\socketpair.h" />\r
     <ClInclude Include="..\..\..\..\lib\socks.h" />\r
     <ClInclude Include="..\..\..\..\lib\speedcheck.h" />\r
     <ClInclude Include="..\..\..\..\lib\splay.h" />\r
-    <ClInclude Include="..\..\..\..\lib\ssh.h" />\r
     <ClInclude Include="..\..\..\..\lib\strcase.h" />\r
     <ClInclude Include="..\..\..\..\lib\strdup.h" />\r
     <ClInclude Include="..\..\..\..\lib\strerror.h" />\r
     <ClInclude Include="..\..\..\..\lib\vauth\digest.h" />\r
     <ClInclude Include="..\..\..\..\lib\vauth\ntlm.h" />\r
     <ClInclude Include="..\..\..\..\lib\vauth\vauth.h" />\r
-    <ClInclude Include="..\..\..\..\lib\vtls\axtls.h" />\r
-    <ClInclude Include="..\..\..\..\lib\vtls\cyassl.h" />\r
-    <ClInclude Include="..\..\..\..\lib\vtls\darwinssl.h" />\r
+    <ClInclude Include="..\..\..\..\lib\vquic\ngtcp2.h" />\r
+    <ClInclude Include="..\..\..\..\lib\vquic\quiche.h" />\r
+    <ClInclude Include="..\..\..\..\lib\vssh\ssh.h" />\r
+    <ClInclude Include="..\..\..\..\lib\vtls\bearssl.h" />\r
     <ClInclude Include="..\..\..\..\lib\vtls\gskit.h" />\r
     <ClInclude Include="..\..\..\..\lib\vtls\gtls.h" />\r
     <ClInclude Include="..\..\..\..\lib\vtls\mbedtls.h" />\r
     <ClInclude Include="..\..\..\..\lib\vtls\polarssl.h" />\r
     <ClInclude Include="..\..\..\..\lib\vtls\polarssl_threadlock.h" />\r
     <ClInclude Include="..\..\..\..\lib\vtls\schannel.h" />\r
+    <ClInclude Include="..\..\..\..\lib\vtls\sectransp.h" />\r
     <ClInclude Include="..\..\..\..\lib\vtls\vtls.h" />\r
+    <ClInclude Include="..\..\..\..\lib\vtls\wolfssl.h" />\r
   </ItemGroup>\r
   <ItemGroup>\r
     <ResourceCompile Include="..\..\..\..\lib\libcurl.rc" />\r
index e12253e..31fff68 100644 (file)
-Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio 2012
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "curl", "curl.vcxproj", "{5228E9CE-A216-422F-A5E6-58E95E2DD71D}"
-EndProject
-Global
-       GlobalSection(SolutionConfigurationPlatforms) = preSolution
-               DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               DLL Debug - DLL OpenSSL - DLL LibSSH2|x64 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
-               DLL Debug - DLL OpenSSL|Win32 = DLL Debug - DLL OpenSSL|Win32
-               DLL Debug - DLL OpenSSL|x64 = DLL Debug - DLL OpenSSL|x64
-               DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               DLL Debug - DLL Windows SSPI - DLL WinIDN|x64 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
-               DLL Debug - DLL Windows SSPI|Win32 = DLL Debug - DLL Windows SSPI|Win32
-               DLL Debug - DLL Windows SSPI|x64 = DLL Debug - DLL Windows SSPI|x64
-               DLL Debug - DLL wolfSSL|Win32 = DLL Debug - DLL wolfSSL|Win32
-               DLL Debug - DLL wolfSSL|x64 = DLL Debug - DLL wolfSSL|x64
-               DLL Debug|Win32 = DLL Debug|Win32
-               DLL Debug|x64 = DLL Debug|x64
-               DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
-               DLL Release - DLL OpenSSL - DLL LibSSH2|x64 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
-               DLL Release - DLL OpenSSL|Win32 = DLL Release - DLL OpenSSL|Win32
-               DLL Release - DLL OpenSSL|x64 = DLL Release - DLL OpenSSL|x64
-               DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
-               DLL Release - DLL Windows SSPI - DLL WinIDN|x64 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
-               DLL Release - DLL Windows SSPI|Win32 = DLL Release - DLL Windows SSPI|Win32
-               DLL Release - DLL Windows SSPI|x64 = DLL Release - DLL Windows SSPI|x64
-               DLL Release - DLL wolfSSL|Win32 = DLL Release - DLL wolfSSL|Win32
-               DLL Release - DLL wolfSSL|x64 = DLL Release - DLL wolfSSL|x64
-               DLL Release|Win32 = DLL Release|Win32
-               DLL Release|x64 = DLL Release|x64
-               LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               LIB Debug - DLL OpenSSL - DLL LibSSH2|x64 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
-               LIB Debug - DLL OpenSSL|Win32 = LIB Debug - DLL OpenSSL|Win32
-               LIB Debug - DLL OpenSSL|x64 = LIB Debug - DLL OpenSSL|x64
-               LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               LIB Debug - DLL Windows SSPI - DLL WinIDN|x64 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
-               LIB Debug - DLL Windows SSPI|Win32 = LIB Debug - DLL Windows SSPI|Win32
-               LIB Debug - DLL Windows SSPI|x64 = LIB Debug - DLL Windows SSPI|x64
-               LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
-               LIB Debug - LIB OpenSSL - LIB LibSSH2|x64 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
-               LIB Debug - LIB OpenSSL|Win32 = LIB Debug - LIB OpenSSL|Win32
-               LIB Debug - LIB OpenSSL|x64 = LIB Debug - LIB OpenSSL|x64
-               LIB Debug - LIB wolfSSL|Win32 = LIB Debug - LIB wolfSSL|Win32
-               LIB Debug - LIB wolfSSL|x64 = LIB Debug - LIB wolfSSL|x64
-               LIB Debug|Win32 = LIB Debug|Win32
-               LIB Debug|x64 = LIB Debug|x64
-               LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
-               LIB Release - DLL OpenSSL - DLL LibSSH2|x64 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
-               LIB Release - DLL OpenSSL|Win32 = LIB Release - DLL OpenSSL|Win32
-               LIB Release - DLL OpenSSL|x64 = LIB Release - DLL OpenSSL|x64
-               LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
-               LIB Release - DLL Windows SSPI - DLL WinIDN|x64 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
-               LIB Release - DLL Windows SSPI|Win32 = LIB Release - DLL Windows SSPI|Win32
-               LIB Release - DLL Windows SSPI|x64 = LIB Release - DLL Windows SSPI|x64
-               LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
-               LIB Release - LIB OpenSSL - LIB LibSSH2|x64 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
-               LIB Release - LIB OpenSSL|Win32 = LIB Release - LIB OpenSSL|Win32
-               LIB Release - LIB OpenSSL|x64 = LIB Release - LIB OpenSSL|x64
-               LIB Release - LIB wolfSSL|Win32 = LIB Release - LIB wolfSSL|Win32
-               LIB Release - LIB wolfSSL|x64 = LIB Release - LIB wolfSSL|x64
-               LIB Release|Win32 = LIB Release|Win32
-               LIB Release|x64 = LIB Release|x64
-       EndGlobalSection
-       GlobalSection(ProjectConfigurationPlatforms) = postSolution
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|Win32.ActiveCfg = DLL Debug - DLL OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|Win32.Build.0 = DLL Debug - DLL OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|x64.ActiveCfg = DLL Debug - DLL OpenSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|x64.Build.0 = DLL Debug - DLL OpenSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|Win32.Build.0 = DLL Debug - DLL Windows SSPI|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|x64.ActiveCfg = DLL Debug - DLL Windows SSPI|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|x64.Build.0 = DLL Debug - DLL Windows SSPI|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL wolfSSL|Win32.ActiveCfg = DLL Debug - DLL wolfSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL wolfSSL|Win32.Build.0 = DLL Debug - DLL wolfSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL wolfSSL|x64.ActiveCfg = DLL Debug - DLL wolfSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL wolfSSL|x64.Build.0 = DLL Debug - DLL wolfSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|Win32.Build.0 = DLL Debug|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|x64.ActiveCfg = DLL Debug|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|x64.Build.0 = DLL Debug|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|Win32.ActiveCfg = DLL Release - DLL OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|Win32.Build.0 = DLL Release - DLL OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|x64.ActiveCfg = DLL Release - DLL OpenSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|x64.Build.0 = DLL Release - DLL OpenSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|Win32.ActiveCfg = DLL Release - DLL Windows SSPI|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|Win32.Build.0 = DLL Release - DLL Windows SSPI|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|x64.ActiveCfg = DLL Release - DLL Windows SSPI|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|x64.Build.0 = DLL Release - DLL Windows SSPI|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL wolfSSL|Win32.ActiveCfg = DLL Release - DLL wolfSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL wolfSSL|Win32.Build.0 = DLL Release - DLL wolfSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL wolfSSL|x64.ActiveCfg = DLL Release - DLL wolfSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL wolfSSL|x64.Build.0 = DLL Release - DLL wolfSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|Win32.ActiveCfg = DLL Release|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|Win32.Build.0 = DLL Release|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|x64.ActiveCfg = DLL Release|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|x64.Build.0 = DLL Release|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|Win32.ActiveCfg = LIB Debug - DLL OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|Win32.Build.0 = LIB Debug - DLL OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|x64.ActiveCfg = LIB Debug - DLL OpenSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|x64.Build.0 = LIB Debug - DLL OpenSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|Win32.Build.0 = LIB Debug - DLL Windows SSPI|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|x64.ActiveCfg = LIB Debug - DLL Windows SSPI|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|x64.Build.0 = LIB Debug - DLL Windows SSPI|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|Win32.ActiveCfg = LIB Debug - LIB OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|Win32.Build.0 = LIB Debug - LIB OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|x64.ActiveCfg = LIB Debug - LIB OpenSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|x64.Build.0 = LIB Debug - LIB OpenSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB wolfSSL|Win32.ActiveCfg = LIB Debug - LIB wolfSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB wolfSSL|Win32.Build.0 = LIB Debug - LIB wolfSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB wolfSSL|x64.ActiveCfg = LIB Debug - LIB wolfSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB wolfSSL|x64.Build.0 = LIB Debug - LIB wolfSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|Win32.ActiveCfg = LIB Debug|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|Win32.Build.0 = LIB Debug|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|x64.ActiveCfg = LIB Debug|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|x64.Build.0 = LIB Debug|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|Win32.ActiveCfg = LIB Release - DLL OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|Win32.Build.0 = LIB Release - DLL OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|x64.ActiveCfg = LIB Release - DLL OpenSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|x64.Build.0 = LIB Release - DLL OpenSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|Win32.ActiveCfg = LIB Release - DLL Windows SSPI|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|Win32.Build.0 = LIB Release - DLL Windows SSPI|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|x64.ActiveCfg = LIB Release - DLL Windows SSPI|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|x64.Build.0 = LIB Release - DLL Windows SSPI|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|Win32.ActiveCfg = LIB Release - LIB OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|Win32.Build.0 = LIB Release - LIB OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|x64.ActiveCfg = LIB Release - LIB OpenSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|x64.Build.0 = LIB Release - LIB OpenSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB wolfSSL|Win32.ActiveCfg = LIB Release - LIB wolfSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB wolfSSL|Win32.Build.0 = LIB Release - LIB wolfSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB wolfSSL|x64.ActiveCfg = LIB Release - LIB wolfSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB wolfSSL|x64.Build.0 = LIB Release - LIB wolfSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|Win32.ActiveCfg = LIB Release|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|Win32.Build.0 = LIB Release|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|x64.ActiveCfg = LIB Release|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|x64.Build.0 = LIB Release|x64
-       EndGlobalSection
-       GlobalSection(SolutionProperties) = preSolution
-               HideSolutionNode = FALSE
-       EndGlobalSection
-EndGlobal
+Microsoft Visual Studio Solution File, Format Version 12.00\r
+# Visual Studio 2012\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "curl", "curl.vcxproj", "{5228E9CE-A216-422F-A5E6-58E95E2DD71D}"\r
+EndProject\r
+Global\r
+       GlobalSection(SolutionConfigurationPlatforms) = preSolution\r
+               DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               DLL Debug - DLL OpenSSL - DLL LibSSH2|x64 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64\r
+               DLL Debug - DLL OpenSSL|Win32 = DLL Debug - DLL OpenSSL|Win32\r
+               DLL Debug - DLL OpenSSL|x64 = DLL Debug - DLL OpenSSL|x64\r
+               DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               DLL Debug - DLL Windows SSPI - DLL WinIDN|x64 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64\r
+               DLL Debug - DLL Windows SSPI|Win32 = DLL Debug - DLL Windows SSPI|Win32\r
+               DLL Debug - DLL Windows SSPI|x64 = DLL Debug - DLL Windows SSPI|x64\r
+               DLL Debug - DLL wolfSSL|Win32 = DLL Debug - DLL wolfSSL|Win32\r
+               DLL Debug - DLL wolfSSL|x64 = DLL Debug - DLL wolfSSL|x64\r
+               DLL Debug|Win32 = DLL Debug|Win32\r
+               DLL Debug|x64 = DLL Debug|x64\r
+               DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               DLL Release - DLL OpenSSL - DLL LibSSH2|x64 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64\r
+               DLL Release - DLL OpenSSL|Win32 = DLL Release - DLL OpenSSL|Win32\r
+               DLL Release - DLL OpenSSL|x64 = DLL Release - DLL OpenSSL|x64\r
+               DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               DLL Release - DLL Windows SSPI - DLL WinIDN|x64 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64\r
+               DLL Release - DLL Windows SSPI|Win32 = DLL Release - DLL Windows SSPI|Win32\r
+               DLL Release - DLL Windows SSPI|x64 = DLL Release - DLL Windows SSPI|x64\r
+               DLL Release - DLL wolfSSL|Win32 = DLL Release - DLL wolfSSL|Win32\r
+               DLL Release - DLL wolfSSL|x64 = DLL Release - DLL wolfSSL|x64\r
+               DLL Release|Win32 = DLL Release|Win32\r
+               DLL Release|x64 = DLL Release|x64\r
+               LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               LIB Debug - DLL OpenSSL - DLL LibSSH2|x64 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64\r
+               LIB Debug - DLL OpenSSL|Win32 = LIB Debug - DLL OpenSSL|Win32\r
+               LIB Debug - DLL OpenSSL|x64 = LIB Debug - DLL OpenSSL|x64\r
+               LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               LIB Debug - DLL Windows SSPI - DLL WinIDN|x64 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64\r
+               LIB Debug - DLL Windows SSPI|Win32 = LIB Debug - DLL Windows SSPI|Win32\r
+               LIB Debug - DLL Windows SSPI|x64 = LIB Debug - DLL Windows SSPI|x64\r
+               LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32\r
+               LIB Debug - LIB OpenSSL - LIB LibSSH2|x64 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64\r
+               LIB Debug - LIB OpenSSL|Win32 = LIB Debug - LIB OpenSSL|Win32\r
+               LIB Debug - LIB OpenSSL|x64 = LIB Debug - LIB OpenSSL|x64\r
+               LIB Debug - LIB wolfSSL|Win32 = LIB Debug - LIB wolfSSL|Win32\r
+               LIB Debug - LIB wolfSSL|x64 = LIB Debug - LIB wolfSSL|x64\r
+               LIB Debug|Win32 = LIB Debug|Win32\r
+               LIB Debug|x64 = LIB Debug|x64\r
+               LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               LIB Release - DLL OpenSSL - DLL LibSSH2|x64 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64\r
+               LIB Release - DLL OpenSSL|Win32 = LIB Release - DLL OpenSSL|Win32\r
+               LIB Release - DLL OpenSSL|x64 = LIB Release - DLL OpenSSL|x64\r
+               LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               LIB Release - DLL Windows SSPI - DLL WinIDN|x64 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64\r
+               LIB Release - DLL Windows SSPI|Win32 = LIB Release - DLL Windows SSPI|Win32\r
+               LIB Release - DLL Windows SSPI|x64 = LIB Release - DLL Windows SSPI|x64\r
+               LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32\r
+               LIB Release - LIB OpenSSL - LIB LibSSH2|x64 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64\r
+               LIB Release - LIB OpenSSL|Win32 = LIB Release - LIB OpenSSL|Win32\r
+               LIB Release - LIB OpenSSL|x64 = LIB Release - LIB OpenSSL|x64\r
+               LIB Release - LIB wolfSSL|Win32 = LIB Release - LIB wolfSSL|Win32\r
+               LIB Release - LIB wolfSSL|x64 = LIB Release - LIB wolfSSL|x64\r
+               LIB Release|Win32 = LIB Release|Win32\r
+               LIB Release|x64 = LIB Release|x64\r
+       EndGlobalSection\r
+       GlobalSection(ProjectConfigurationPlatforms) = postSolution\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|Win32.ActiveCfg = DLL Debug - DLL OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|Win32.Build.0 = DLL Debug - DLL OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|x64.ActiveCfg = DLL Debug - DLL OpenSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|x64.Build.0 = DLL Debug - DLL OpenSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|Win32.Build.0 = DLL Debug - DLL Windows SSPI|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|x64.ActiveCfg = DLL Debug - DLL Windows SSPI|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|x64.Build.0 = DLL Debug - DLL Windows SSPI|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL wolfSSL|Win32.ActiveCfg = DLL Debug - DLL wolfSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL wolfSSL|Win32.Build.0 = DLL Debug - DLL wolfSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL wolfSSL|x64.ActiveCfg = DLL Debug - DLL wolfSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL wolfSSL|x64.Build.0 = DLL Debug - DLL wolfSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|Win32.Build.0 = DLL Debug|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|x64.ActiveCfg = DLL Debug|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|x64.Build.0 = DLL Debug|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|Win32.ActiveCfg = DLL Release - DLL OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|Win32.Build.0 = DLL Release - DLL OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|x64.ActiveCfg = DLL Release - DLL OpenSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|x64.Build.0 = DLL Release - DLL OpenSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|Win32.ActiveCfg = DLL Release - DLL Windows SSPI|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|Win32.Build.0 = DLL Release - DLL Windows SSPI|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|x64.ActiveCfg = DLL Release - DLL Windows SSPI|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|x64.Build.0 = DLL Release - DLL Windows SSPI|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL wolfSSL|Win32.ActiveCfg = DLL Release - DLL wolfSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL wolfSSL|Win32.Build.0 = DLL Release - DLL wolfSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL wolfSSL|x64.ActiveCfg = DLL Release - DLL wolfSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL wolfSSL|x64.Build.0 = DLL Release - DLL wolfSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|Win32.ActiveCfg = DLL Release|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|Win32.Build.0 = DLL Release|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|x64.ActiveCfg = DLL Release|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|x64.Build.0 = DLL Release|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|Win32.ActiveCfg = LIB Debug - DLL OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|Win32.Build.0 = LIB Debug - DLL OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|x64.ActiveCfg = LIB Debug - DLL OpenSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|x64.Build.0 = LIB Debug - DLL OpenSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|Win32.Build.0 = LIB Debug - DLL Windows SSPI|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|x64.ActiveCfg = LIB Debug - DLL Windows SSPI|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|x64.Build.0 = LIB Debug - DLL Windows SSPI|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|Win32.ActiveCfg = LIB Debug - LIB OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|Win32.Build.0 = LIB Debug - LIB OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|x64.ActiveCfg = LIB Debug - LIB OpenSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|x64.Build.0 = LIB Debug - LIB OpenSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB wolfSSL|Win32.ActiveCfg = LIB Debug - LIB wolfSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB wolfSSL|Win32.Build.0 = LIB Debug - LIB wolfSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB wolfSSL|x64.ActiveCfg = LIB Debug - LIB wolfSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB wolfSSL|x64.Build.0 = LIB Debug - LIB wolfSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|Win32.ActiveCfg = LIB Debug|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|Win32.Build.0 = LIB Debug|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|x64.ActiveCfg = LIB Debug|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|x64.Build.0 = LIB Debug|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|Win32.ActiveCfg = LIB Release - DLL OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|Win32.Build.0 = LIB Release - DLL OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|x64.ActiveCfg = LIB Release - DLL OpenSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|x64.Build.0 = LIB Release - DLL OpenSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|Win32.ActiveCfg = LIB Release - DLL Windows SSPI|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|Win32.Build.0 = LIB Release - DLL Windows SSPI|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|x64.ActiveCfg = LIB Release - DLL Windows SSPI|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|x64.Build.0 = LIB Release - DLL Windows SSPI|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|Win32.ActiveCfg = LIB Release - LIB OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|Win32.Build.0 = LIB Release - LIB OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|x64.ActiveCfg = LIB Release - LIB OpenSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|x64.Build.0 = LIB Release - LIB OpenSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB wolfSSL|Win32.ActiveCfg = LIB Release - LIB wolfSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB wolfSSL|Win32.Build.0 = LIB Release - LIB wolfSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB wolfSSL|x64.ActiveCfg = LIB Release - LIB wolfSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB wolfSSL|x64.Build.0 = LIB Release - LIB wolfSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|Win32.ActiveCfg = LIB Release|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|Win32.Build.0 = LIB Release|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|x64.ActiveCfg = LIB Release|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|x64.Build.0 = LIB Release|x64\r
+       EndGlobalSection\r
+       GlobalSection(SolutionProperties) = preSolution\r
+               HideSolutionNode = FALSE\r
+       EndGlobalSection\r
+EndGlobal\r
index 1682373..0c9adcb 100644 (file)
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL Windows SSPI|Win32'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v110</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL Windows SSPI - DLL WinIDN|Win32'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v110</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL Windows SSPI|Win32'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v110</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v110</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL OpenSSL - DLL LibSSH2|Win32'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v110</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v110</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL OpenSSL|Win32'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v110</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL OpenSSL|Win32'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v110</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - LIB OpenSSL - LIB LibSSH2|Win32'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v110</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v110</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - LIB OpenSSL|Win32'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v110</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - LIB OpenSSL|Win32'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v110</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL OpenSSL - DLL LibSSH2|Win32'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v110</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v110</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL Windows SSPI|Win32'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v110</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL Windows SSPI - DLL WinIDN|Win32'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v110</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL OpenSSL|Win32'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v110</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL Windows SSPI|Win32'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v110</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v110</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL OpenSSL|Win32'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v110</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug|Win32'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v110</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL wolfSSL|Win32'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v110</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug|Win32'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v110</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - LIB wolfSSL|Win32'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v110</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release|Win32'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v110</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - LIB wolfSSL|Win32'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v110</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release|Win32'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v110</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL wolfSSL|Win32'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v110</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL Windows SSPI|x64'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v110</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL Windows SSPI - DLL WinIDN|x64'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v110</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL Windows SSPI|x64'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v110</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL Windows SSPI - DLL WinIDN|x64'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v110</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL OpenSSL - DLL LibSSH2|x64'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v110</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL OpenSSL - DLL LibSSH2|x64'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v110</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL OpenSSL|x64'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v110</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL OpenSSL|x64'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v110</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - LIB OpenSSL - LIB LibSSH2|x64'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v110</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - LIB OpenSSL - LIB LibSSH2|x64'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v110</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - LIB OpenSSL|x64'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v110</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - LIB OpenSSL|x64'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v110</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL OpenSSL - DLL LibSSH2|x64'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v110</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL OpenSSL - DLL LibSSH2|x64'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v110</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL Windows SSPI|x64'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v110</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL Windows SSPI - DLL WinIDN|x64'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v110</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL OpenSSL|x64'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v110</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL Windows SSPI|x64'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v110</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL Windows SSPI - DLL WinIDN|x64'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v110</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL OpenSSL|x64'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v110</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug|x64'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v110</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL wolfSSL|x64'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v110</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug|x64'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v110</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - LIB wolfSSL|x64'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v110</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release|x64'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v110</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - LIB wolfSSL|x64'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v110</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release|x64'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v110</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL wolfSSL|x64'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v110</PlatformToolset>\r
   </PropertyGroup>\r
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />\r
     <ClCompile Include="..\..\..\..\src\tool_panykey.c" />\r
     <ClCompile Include="..\..\..\..\src\tool_paramhlp.c" />\r
     <ClCompile Include="..\..\..\..\src\tool_parsecfg.c" />\r
+    <ClCompile Include="..\..\..\..\src\tool_progress.c" />\r
     <ClCompile Include="..\..\..\..\src\tool_setopt.c" />\r
     <ClCompile Include="..\..\..\..\src\tool_sleep.c" />\r
     <ClCompile Include="..\..\..\..\src\tool_strdup.c" />\r
     <ClInclude Include="..\..\..\..\src\tool_panykey.h" />\r
     <ClInclude Include="..\..\..\..\src\tool_paramhlp.h" />\r
     <ClInclude Include="..\..\..\..\src\tool_parsecfg.h" />\r
+    <ClInclude Include="..\..\..\..\src\tool_progress.h" />\r
     <ClInclude Include="..\..\..\..\src\tool_sdecls.h" />\r
     <ClInclude Include="..\..\..\..\src\tool_setopt.h" />\r
     <ClInclude Include="..\..\..\..\src\tool_setup.h" />\r
index 38b33e6..1557b9e 100644 (file)
-Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio 2013
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "curl", "src\curl.vcxproj", "{5228E9CE-A216-422F-A5E6-58E95E2DD71D}"
-       ProjectSection(ProjectDependencies) = postProject
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB} = {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}
-       EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libcurl", "lib\libcurl.vcxproj", "{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}"
-EndProject
-Global
-       GlobalSection(SolutionConfigurationPlatforms) = preSolution
-               DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               DLL Debug - DLL OpenSSL - DLL LibSSH2|x64 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
-               DLL Debug - DLL OpenSSL|Win32 = DLL Debug - DLL OpenSSL|Win32
-               DLL Debug - DLL OpenSSL|x64 = DLL Debug - DLL OpenSSL|x64
-               DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               DLL Debug - DLL Windows SSPI - DLL WinIDN|x64 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
-               DLL Debug - DLL Windows SSPI|Win32 = DLL Debug - DLL Windows SSPI|Win32
-               DLL Debug - DLL Windows SSPI|x64 = DLL Debug - DLL Windows SSPI|x64
-               DLL Debug - DLL wolfSSL|Win32 = DLL Debug - DLL wolfSSL|Win32
-               DLL Debug - DLL wolfSSL|x64 = DLL Debug - DLL wolfSSL|x64
-               DLL Debug|Win32 = DLL Debug|Win32
-               DLL Debug|x64 = DLL Debug|x64
-               DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
-               DLL Release - DLL OpenSSL - DLL LibSSH2|x64 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
-               DLL Release - DLL OpenSSL|Win32 = DLL Release - DLL OpenSSL|Win32
-               DLL Release - DLL OpenSSL|x64 = DLL Release - DLL OpenSSL|x64
-               DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
-               DLL Release - DLL Windows SSPI - DLL WinIDN|x64 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
-               DLL Release - DLL Windows SSPI|Win32 = DLL Release - DLL Windows SSPI|Win32
-               DLL Release - DLL Windows SSPI|x64 = DLL Release - DLL Windows SSPI|x64
-               DLL Release - DLL wolfSSL|Win32 = DLL Release - DLL wolfSSL|Win32
-               DLL Release - DLL wolfSSL|x64 = DLL Release - DLL wolfSSL|x64
-               DLL Release|Win32 = DLL Release|Win32
-               DLL Release|x64 = DLL Release|x64
-               LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               LIB Debug - DLL OpenSSL - DLL LibSSH2|x64 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
-               LIB Debug - DLL OpenSSL|Win32 = LIB Debug - DLL OpenSSL|Win32
-               LIB Debug - DLL OpenSSL|x64 = LIB Debug - DLL OpenSSL|x64
-               LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               LIB Debug - DLL Windows SSPI - DLL WinIDN|x64 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
-               LIB Debug - DLL Windows SSPI|Win32 = LIB Debug - DLL Windows SSPI|Win32
-               LIB Debug - DLL Windows SSPI|x64 = LIB Debug - DLL Windows SSPI|x64
-               LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
-               LIB Debug - LIB OpenSSL - LIB LibSSH2|x64 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
-               LIB Debug - LIB OpenSSL|Win32 = LIB Debug - LIB OpenSSL|Win32
-               LIB Debug - LIB OpenSSL|x64 = LIB Debug - LIB OpenSSL|x64
-               LIB Debug - LIB wolfSSL|Win32 = LIB Debug - LIB wolfSSL|Win32
-               LIB Debug - LIB wolfSSL|x64 = LIB Debug - LIB wolfSSL|x64
-               LIB Debug|Win32 = LIB Debug|Win32
-               LIB Debug|x64 = LIB Debug|x64
-               LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
-               LIB Release - DLL OpenSSL - DLL LibSSH2|x64 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
-               LIB Release - DLL OpenSSL|Win32 = LIB Release - DLL OpenSSL|Win32
-               LIB Release - DLL OpenSSL|x64 = LIB Release - DLL OpenSSL|x64
-               LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
-               LIB Release - DLL Windows SSPI - DLL WinIDN|x64 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
-               LIB Release - DLL Windows SSPI|Win32 = LIB Release - DLL Windows SSPI|Win32
-               LIB Release - DLL Windows SSPI|x64 = LIB Release - DLL Windows SSPI|x64
-               LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
-               LIB Release - LIB OpenSSL - LIB LibSSH2|x64 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
-               LIB Release - LIB OpenSSL|Win32 = LIB Release - LIB OpenSSL|Win32
-               LIB Release - LIB OpenSSL|x64 = LIB Release - LIB OpenSSL|x64
-               LIB Release - LIB wolfSSL|Win32 = LIB Release - LIB wolfSSL|Win32
-               LIB Release - LIB wolfSSL|x64 = LIB Release - LIB wolfSSL|x64
-               LIB Release|Win32 = LIB Release|Win32
-               LIB Release|x64 = LIB Release|x64
-       EndGlobalSection
-       GlobalSection(ProjectConfigurationPlatforms) = postSolution
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|Win32.ActiveCfg = DLL Debug - DLL OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|Win32.Build.0 = DLL Debug - DLL OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|x64.ActiveCfg = DLL Debug - DLL OpenSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|x64.Build.0 = DLL Debug - DLL OpenSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|Win32.Build.0 = DLL Debug - DLL Windows SSPI|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|x64.ActiveCfg = DLL Debug - DLL Windows SSPI|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|x64.Build.0 = DLL Debug - DLL Windows SSPI|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL wolfSSL|Win32.ActiveCfg = DLL Debug - DLL wolfSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL wolfSSL|Win32.Build.0 = DLL Debug - DLL wolfSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL wolfSSL|x64.ActiveCfg = DLL Debug - DLL wolfSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL wolfSSL|x64.Build.0 = DLL Debug - DLL wolfSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|Win32.Build.0 = DLL Debug|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|x64.ActiveCfg = DLL Debug|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|x64.Build.0 = DLL Debug|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|Win32.ActiveCfg = DLL Release - DLL OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|Win32.Build.0 = DLL Release - DLL OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|x64.ActiveCfg = DLL Release - DLL OpenSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|x64.Build.0 = DLL Release - DLL OpenSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|Win32.ActiveCfg = DLL Release - DLL Windows SSPI|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|Win32.Build.0 = DLL Release - DLL Windows SSPI|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|x64.ActiveCfg = DLL Release - DLL Windows SSPI|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|x64.Build.0 = DLL Release - DLL Windows SSPI|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL wolfSSL|Win32.ActiveCfg = DLL Release - DLL wolfSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL wolfSSL|Win32.Build.0 = DLL Release - DLL wolfSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL wolfSSL|x64.ActiveCfg = DLL Release - DLL wolfSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL wolfSSL|x64.Build.0 = DLL Release - DLL wolfSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|Win32.ActiveCfg = DLL Release|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|Win32.Build.0 = DLL Release|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|x64.ActiveCfg = DLL Release|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|x64.Build.0 = DLL Release|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|Win32.ActiveCfg = LIB Debug - DLL OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|Win32.Build.0 = LIB Debug - DLL OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|x64.ActiveCfg = LIB Debug - DLL OpenSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|x64.Build.0 = LIB Debug - DLL OpenSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|Win32.Build.0 = LIB Debug - DLL Windows SSPI|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|x64.ActiveCfg = LIB Debug - DLL Windows SSPI|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|x64.Build.0 = LIB Debug - DLL Windows SSPI|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|Win32.ActiveCfg = LIB Debug - LIB OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|Win32.Build.0 = LIB Debug - LIB OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|x64.ActiveCfg = LIB Debug - LIB OpenSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|x64.Build.0 = LIB Debug - LIB OpenSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB wolfSSL|Win32.ActiveCfg = LIB Debug - LIB wolfSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB wolfSSL|Win32.Build.0 = LIB Debug - LIB wolfSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB wolfSSL|x64.ActiveCfg = LIB Debug - LIB wolfSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB wolfSSL|x64.Build.0 = LIB Debug - LIB wolfSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|Win32.ActiveCfg = LIB Debug|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|Win32.Build.0 = LIB Debug|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|x64.ActiveCfg = LIB Debug|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|x64.Build.0 = LIB Debug|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|Win32.ActiveCfg = LIB Release - DLL OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|Win32.Build.0 = LIB Release - DLL OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|x64.ActiveCfg = LIB Release - DLL OpenSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|x64.Build.0 = LIB Release - DLL OpenSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|Win32.ActiveCfg = LIB Release - DLL Windows SSPI|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|Win32.Build.0 = LIB Release - DLL Windows SSPI|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|x64.ActiveCfg = LIB Release - DLL Windows SSPI|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|x64.Build.0 = LIB Release - DLL Windows SSPI|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|Win32.ActiveCfg = LIB Release - LIB OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|Win32.Build.0 = LIB Release - LIB OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|x64.ActiveCfg = LIB Release - LIB OpenSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|x64.Build.0 = LIB Release - LIB OpenSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB wolfSSL|Win32.ActiveCfg = LIB Release - LIB wolfSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB wolfSSL|Win32.Build.0 = LIB Release - LIB wolfSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB wolfSSL|x64.ActiveCfg = LIB Release - LIB wolfSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB wolfSSL|x64.Build.0 = LIB Release - LIB wolfSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|Win32.ActiveCfg = LIB Release|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|Win32.Build.0 = LIB Release|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|x64.ActiveCfg = LIB Release|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|x64.Build.0 = LIB Release|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|Win32.ActiveCfg = DLL Debug - DLL OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|Win32.Build.0 = DLL Debug - DLL OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|x64.ActiveCfg = DLL Debug - DLL OpenSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|x64.Build.0 = DLL Debug - DLL OpenSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|Win32.Build.0 = DLL Debug - DLL Windows SSPI|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|x64.ActiveCfg = DLL Debug - DLL Windows SSPI|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|x64.Build.0 = DLL Debug - DLL Windows SSPI|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL wolfSSL|Win32.ActiveCfg = DLL Debug - DLL wolfSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL wolfSSL|Win32.Build.0 = DLL Debug - DLL wolfSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL wolfSSL|x64.ActiveCfg = DLL Debug - DLL wolfSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL wolfSSL|x64.Build.0 = DLL Debug - DLL wolfSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|Win32.Build.0 = DLL Debug|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|x64.ActiveCfg = DLL Debug|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|x64.Build.0 = DLL Debug|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|Win32.ActiveCfg = DLL Release - DLL OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|Win32.Build.0 = DLL Release - DLL OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|x64.ActiveCfg = DLL Release - DLL OpenSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|x64.Build.0 = DLL Release - DLL OpenSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|Win32.ActiveCfg = DLL Release - DLL Windows SSPI|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|Win32.Build.0 = DLL Release - DLL Windows SSPI|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|x64.ActiveCfg = DLL Release - DLL Windows SSPI|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|x64.Build.0 = DLL Release - DLL Windows SSPI|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL wolfSSL|Win32.ActiveCfg = DLL Release - DLL wolfSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL wolfSSL|Win32.Build.0 = DLL Release - DLL wolfSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL wolfSSL|x64.ActiveCfg = DLL Release - DLL wolfSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL wolfSSL|x64.Build.0 = DLL Release - DLL wolfSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|Win32.ActiveCfg = DLL Release|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|Win32.Build.0 = DLL Release|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|x64.ActiveCfg = DLL Release|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|x64.Build.0 = DLL Release|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|Win32.ActiveCfg = LIB Debug - DLL OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|Win32.Build.0 = LIB Debug - DLL OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|x64.ActiveCfg = LIB Debug - DLL OpenSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|x64.Build.0 = LIB Debug - DLL OpenSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|Win32.Build.0 = LIB Debug - DLL Windows SSPI|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|x64.ActiveCfg = LIB Debug - DLL Windows SSPI|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|x64.Build.0 = LIB Debug - DLL Windows SSPI|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|Win32.ActiveCfg = LIB Debug - LIB OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|Win32.Build.0 = LIB Debug - LIB OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|x64.ActiveCfg = LIB Debug - LIB OpenSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|x64.Build.0 = LIB Debug - LIB OpenSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB wolfSSL|Win32.ActiveCfg = LIB Debug - LIB wolfSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB wolfSSL|Win32.Build.0 = LIB Debug - LIB wolfSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB wolfSSL|x64.ActiveCfg = LIB Debug - LIB wolfSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB wolfSSL|x64.Build.0 = LIB Debug - LIB wolfSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|Win32.ActiveCfg = LIB Debug|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|Win32.Build.0 = LIB Debug|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|x64.ActiveCfg = LIB Debug|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|x64.Build.0 = LIB Debug|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|Win32.ActiveCfg = LIB Release - DLL OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|Win32.Build.0 = LIB Release - DLL OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|x64.ActiveCfg = LIB Release - DLL OpenSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|x64.Build.0 = LIB Release - DLL OpenSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|Win32.ActiveCfg = LIB Release - DLL Windows SSPI|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|Win32.Build.0 = LIB Release - DLL Windows SSPI|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|x64.ActiveCfg = LIB Release - DLL Windows SSPI|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|x64.Build.0 = LIB Release - DLL Windows SSPI|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|Win32.ActiveCfg = LIB Release - LIB OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|Win32.Build.0 = LIB Release - LIB OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|x64.ActiveCfg = LIB Release - LIB OpenSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|x64.Build.0 = LIB Release - LIB OpenSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB wolfSSL|Win32.ActiveCfg = LIB Release - LIB wolfSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB wolfSSL|Win32.Build.0 = LIB Release - LIB wolfSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB wolfSSL|x64.ActiveCfg = LIB Release - LIB wolfSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB wolfSSL|x64.Build.0 = LIB Release - LIB wolfSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|Win32.ActiveCfg = LIB Release|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|Win32.Build.0 = LIB Release|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|x64.ActiveCfg = LIB Release|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|x64.Build.0 = LIB Release|x64
-       EndGlobalSection
-       GlobalSection(SolutionProperties) = preSolution
-               HideSolutionNode = FALSE
-       EndGlobalSection
-EndGlobal
+Microsoft Visual Studio Solution File, Format Version 12.00\r
+# Visual Studio 2013\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "curl", "src\curl.vcxproj", "{5228E9CE-A216-422F-A5E6-58E95E2DD71D}"\r
+       ProjectSection(ProjectDependencies) = postProject\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB} = {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}\r
+       EndProjectSection\r
+EndProject\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libcurl", "lib\libcurl.vcxproj", "{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}"\r
+EndProject\r
+Global\r
+       GlobalSection(SolutionConfigurationPlatforms) = preSolution\r
+               DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               DLL Debug - DLL OpenSSL - DLL LibSSH2|x64 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64\r
+               DLL Debug - DLL OpenSSL|Win32 = DLL Debug - DLL OpenSSL|Win32\r
+               DLL Debug - DLL OpenSSL|x64 = DLL Debug - DLL OpenSSL|x64\r
+               DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               DLL Debug - DLL Windows SSPI - DLL WinIDN|x64 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64\r
+               DLL Debug - DLL Windows SSPI|Win32 = DLL Debug - DLL Windows SSPI|Win32\r
+               DLL Debug - DLL Windows SSPI|x64 = DLL Debug - DLL Windows SSPI|x64\r
+               DLL Debug - DLL wolfSSL|Win32 = DLL Debug - DLL wolfSSL|Win32\r
+               DLL Debug - DLL wolfSSL|x64 = DLL Debug - DLL wolfSSL|x64\r
+               DLL Debug|Win32 = DLL Debug|Win32\r
+               DLL Debug|x64 = DLL Debug|x64\r
+               DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               DLL Release - DLL OpenSSL - DLL LibSSH2|x64 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64\r
+               DLL Release - DLL OpenSSL|Win32 = DLL Release - DLL OpenSSL|Win32\r
+               DLL Release - DLL OpenSSL|x64 = DLL Release - DLL OpenSSL|x64\r
+               DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               DLL Release - DLL Windows SSPI - DLL WinIDN|x64 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64\r
+               DLL Release - DLL Windows SSPI|Win32 = DLL Release - DLL Windows SSPI|Win32\r
+               DLL Release - DLL Windows SSPI|x64 = DLL Release - DLL Windows SSPI|x64\r
+               DLL Release - DLL wolfSSL|Win32 = DLL Release - DLL wolfSSL|Win32\r
+               DLL Release - DLL wolfSSL|x64 = DLL Release - DLL wolfSSL|x64\r
+               DLL Release|Win32 = DLL Release|Win32\r
+               DLL Release|x64 = DLL Release|x64\r
+               LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               LIB Debug - DLL OpenSSL - DLL LibSSH2|x64 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64\r
+               LIB Debug - DLL OpenSSL|Win32 = LIB Debug - DLL OpenSSL|Win32\r
+               LIB Debug - DLL OpenSSL|x64 = LIB Debug - DLL OpenSSL|x64\r
+               LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               LIB Debug - DLL Windows SSPI - DLL WinIDN|x64 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64\r
+               LIB Debug - DLL Windows SSPI|Win32 = LIB Debug - DLL Windows SSPI|Win32\r
+               LIB Debug - DLL Windows SSPI|x64 = LIB Debug - DLL Windows SSPI|x64\r
+               LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32\r
+               LIB Debug - LIB OpenSSL - LIB LibSSH2|x64 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64\r
+               LIB Debug - LIB OpenSSL|Win32 = LIB Debug - LIB OpenSSL|Win32\r
+               LIB Debug - LIB OpenSSL|x64 = LIB Debug - LIB OpenSSL|x64\r
+               LIB Debug - LIB wolfSSL|Win32 = LIB Debug - LIB wolfSSL|Win32\r
+               LIB Debug - LIB wolfSSL|x64 = LIB Debug - LIB wolfSSL|x64\r
+               LIB Debug|Win32 = LIB Debug|Win32\r
+               LIB Debug|x64 = LIB Debug|x64\r
+               LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               LIB Release - DLL OpenSSL - DLL LibSSH2|x64 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64\r
+               LIB Release - DLL OpenSSL|Win32 = LIB Release - DLL OpenSSL|Win32\r
+               LIB Release - DLL OpenSSL|x64 = LIB Release - DLL OpenSSL|x64\r
+               LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               LIB Release - DLL Windows SSPI - DLL WinIDN|x64 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64\r
+               LIB Release - DLL Windows SSPI|Win32 = LIB Release - DLL Windows SSPI|Win32\r
+               LIB Release - DLL Windows SSPI|x64 = LIB Release - DLL Windows SSPI|x64\r
+               LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32\r
+               LIB Release - LIB OpenSSL - LIB LibSSH2|x64 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64\r
+               LIB Release - LIB OpenSSL|Win32 = LIB Release - LIB OpenSSL|Win32\r
+               LIB Release - LIB OpenSSL|x64 = LIB Release - LIB OpenSSL|x64\r
+               LIB Release - LIB wolfSSL|Win32 = LIB Release - LIB wolfSSL|Win32\r
+               LIB Release - LIB wolfSSL|x64 = LIB Release - LIB wolfSSL|x64\r
+               LIB Release|Win32 = LIB Release|Win32\r
+               LIB Release|x64 = LIB Release|x64\r
+       EndGlobalSection\r
+       GlobalSection(ProjectConfigurationPlatforms) = postSolution\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|Win32.ActiveCfg = DLL Debug - DLL OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|Win32.Build.0 = DLL Debug - DLL OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|x64.ActiveCfg = DLL Debug - DLL OpenSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|x64.Build.0 = DLL Debug - DLL OpenSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|Win32.Build.0 = DLL Debug - DLL Windows SSPI|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|x64.ActiveCfg = DLL Debug - DLL Windows SSPI|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|x64.Build.0 = DLL Debug - DLL Windows SSPI|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL wolfSSL|Win32.ActiveCfg = DLL Debug - DLL wolfSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL wolfSSL|Win32.Build.0 = DLL Debug - DLL wolfSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL wolfSSL|x64.ActiveCfg = DLL Debug - DLL wolfSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL wolfSSL|x64.Build.0 = DLL Debug - DLL wolfSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|Win32.Build.0 = DLL Debug|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|x64.ActiveCfg = DLL Debug|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|x64.Build.0 = DLL Debug|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|Win32.ActiveCfg = DLL Release - DLL OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|Win32.Build.0 = DLL Release - DLL OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|x64.ActiveCfg = DLL Release - DLL OpenSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|x64.Build.0 = DLL Release - DLL OpenSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|Win32.ActiveCfg = DLL Release - DLL Windows SSPI|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|Win32.Build.0 = DLL Release - DLL Windows SSPI|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|x64.ActiveCfg = DLL Release - DLL Windows SSPI|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|x64.Build.0 = DLL Release - DLL Windows SSPI|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL wolfSSL|Win32.ActiveCfg = DLL Release - DLL wolfSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL wolfSSL|Win32.Build.0 = DLL Release - DLL wolfSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL wolfSSL|x64.ActiveCfg = DLL Release - DLL wolfSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL wolfSSL|x64.Build.0 = DLL Release - DLL wolfSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|Win32.ActiveCfg = DLL Release|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|Win32.Build.0 = DLL Release|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|x64.ActiveCfg = DLL Release|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|x64.Build.0 = DLL Release|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|Win32.ActiveCfg = LIB Debug - DLL OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|Win32.Build.0 = LIB Debug - DLL OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|x64.ActiveCfg = LIB Debug - DLL OpenSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|x64.Build.0 = LIB Debug - DLL OpenSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|Win32.Build.0 = LIB Debug - DLL Windows SSPI|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|x64.ActiveCfg = LIB Debug - DLL Windows SSPI|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|x64.Build.0 = LIB Debug - DLL Windows SSPI|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|Win32.ActiveCfg = LIB Debug - LIB OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|Win32.Build.0 = LIB Debug - LIB OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|x64.ActiveCfg = LIB Debug - LIB OpenSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|x64.Build.0 = LIB Debug - LIB OpenSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB wolfSSL|Win32.ActiveCfg = LIB Debug - LIB wolfSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB wolfSSL|Win32.Build.0 = LIB Debug - LIB wolfSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB wolfSSL|x64.ActiveCfg = LIB Debug - LIB wolfSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB wolfSSL|x64.Build.0 = LIB Debug - LIB wolfSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|Win32.ActiveCfg = LIB Debug|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|Win32.Build.0 = LIB Debug|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|x64.ActiveCfg = LIB Debug|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|x64.Build.0 = LIB Debug|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|Win32.ActiveCfg = LIB Release - DLL OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|Win32.Build.0 = LIB Release - DLL OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|x64.ActiveCfg = LIB Release - DLL OpenSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|x64.Build.0 = LIB Release - DLL OpenSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|Win32.ActiveCfg = LIB Release - DLL Windows SSPI|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|Win32.Build.0 = LIB Release - DLL Windows SSPI|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|x64.ActiveCfg = LIB Release - DLL Windows SSPI|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|x64.Build.0 = LIB Release - DLL Windows SSPI|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|Win32.ActiveCfg = LIB Release - LIB OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|Win32.Build.0 = LIB Release - LIB OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|x64.ActiveCfg = LIB Release - LIB OpenSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|x64.Build.0 = LIB Release - LIB OpenSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB wolfSSL|Win32.ActiveCfg = LIB Release - LIB wolfSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB wolfSSL|Win32.Build.0 = LIB Release - LIB wolfSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB wolfSSL|x64.ActiveCfg = LIB Release - LIB wolfSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB wolfSSL|x64.Build.0 = LIB Release - LIB wolfSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|Win32.ActiveCfg = LIB Release|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|Win32.Build.0 = LIB Release|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|x64.ActiveCfg = LIB Release|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|x64.Build.0 = LIB Release|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|Win32.ActiveCfg = DLL Debug - DLL OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|Win32.Build.0 = DLL Debug - DLL OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|x64.ActiveCfg = DLL Debug - DLL OpenSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|x64.Build.0 = DLL Debug - DLL OpenSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|Win32.Build.0 = DLL Debug - DLL Windows SSPI|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|x64.ActiveCfg = DLL Debug - DLL Windows SSPI|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|x64.Build.0 = DLL Debug - DLL Windows SSPI|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL wolfSSL|Win32.ActiveCfg = DLL Debug - DLL wolfSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL wolfSSL|Win32.Build.0 = DLL Debug - DLL wolfSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL wolfSSL|x64.ActiveCfg = DLL Debug - DLL wolfSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL wolfSSL|x64.Build.0 = DLL Debug - DLL wolfSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|Win32.Build.0 = DLL Debug|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|x64.ActiveCfg = DLL Debug|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|x64.Build.0 = DLL Debug|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|Win32.ActiveCfg = DLL Release - DLL OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|Win32.Build.0 = DLL Release - DLL OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|x64.ActiveCfg = DLL Release - DLL OpenSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|x64.Build.0 = DLL Release - DLL OpenSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|Win32.ActiveCfg = DLL Release - DLL Windows SSPI|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|Win32.Build.0 = DLL Release - DLL Windows SSPI|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|x64.ActiveCfg = DLL Release - DLL Windows SSPI|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|x64.Build.0 = DLL Release - DLL Windows SSPI|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL wolfSSL|Win32.ActiveCfg = DLL Release - DLL wolfSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL wolfSSL|Win32.Build.0 = DLL Release - DLL wolfSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL wolfSSL|x64.ActiveCfg = DLL Release - DLL wolfSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL wolfSSL|x64.Build.0 = DLL Release - DLL wolfSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|Win32.ActiveCfg = DLL Release|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|Win32.Build.0 = DLL Release|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|x64.ActiveCfg = DLL Release|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|x64.Build.0 = DLL Release|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|Win32.ActiveCfg = LIB Debug - DLL OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|Win32.Build.0 = LIB Debug - DLL OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|x64.ActiveCfg = LIB Debug - DLL OpenSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|x64.Build.0 = LIB Debug - DLL OpenSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|Win32.Build.0 = LIB Debug - DLL Windows SSPI|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|x64.ActiveCfg = LIB Debug - DLL Windows SSPI|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|x64.Build.0 = LIB Debug - DLL Windows SSPI|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|Win32.ActiveCfg = LIB Debug - LIB OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|Win32.Build.0 = LIB Debug - LIB OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|x64.ActiveCfg = LIB Debug - LIB OpenSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|x64.Build.0 = LIB Debug - LIB OpenSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB wolfSSL|Win32.ActiveCfg = LIB Debug - LIB wolfSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB wolfSSL|Win32.Build.0 = LIB Debug - LIB wolfSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB wolfSSL|x64.ActiveCfg = LIB Debug - LIB wolfSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB wolfSSL|x64.Build.0 = LIB Debug - LIB wolfSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|Win32.ActiveCfg = LIB Debug|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|Win32.Build.0 = LIB Debug|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|x64.ActiveCfg = LIB Debug|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|x64.Build.0 = LIB Debug|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|Win32.ActiveCfg = LIB Release - DLL OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|Win32.Build.0 = LIB Release - DLL OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|x64.ActiveCfg = LIB Release - DLL OpenSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|x64.Build.0 = LIB Release - DLL OpenSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|Win32.ActiveCfg = LIB Release - DLL Windows SSPI|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|Win32.Build.0 = LIB Release - DLL Windows SSPI|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|x64.ActiveCfg = LIB Release - DLL Windows SSPI|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|x64.Build.0 = LIB Release - DLL Windows SSPI|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|Win32.ActiveCfg = LIB Release - LIB OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|Win32.Build.0 = LIB Release - LIB OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|x64.ActiveCfg = LIB Release - LIB OpenSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|x64.Build.0 = LIB Release - LIB OpenSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB wolfSSL|Win32.ActiveCfg = LIB Release - LIB wolfSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB wolfSSL|Win32.Build.0 = LIB Release - LIB wolfSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB wolfSSL|x64.ActiveCfg = LIB Release - LIB wolfSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB wolfSSL|x64.Build.0 = LIB Release - LIB wolfSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|Win32.ActiveCfg = LIB Release|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|Win32.Build.0 = LIB Release|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|x64.ActiveCfg = LIB Release|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|x64.Build.0 = LIB Release|x64\r
+       EndGlobalSection\r
+       GlobalSection(SolutionProperties) = preSolution\r
+               HideSolutionNode = FALSE\r
+       EndGlobalSection\r
+EndGlobal\r
index 860a060..4d690de 100644 (file)
-Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio 2013
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libcurl", "libcurl.vcxproj", "{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}"
-EndProject
-Global
-       GlobalSection(SolutionConfigurationPlatforms) = preSolution
-               DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               DLL Debug - DLL OpenSSL - DLL LibSSH2|x64 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
-               DLL Debug - DLL OpenSSL|Win32 = DLL Debug - DLL OpenSSL|Win32
-               DLL Debug - DLL OpenSSL|x64 = DLL Debug - DLL OpenSSL|x64
-               DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               DLL Debug - DLL Windows SSPI - DLL WinIDN|x64 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
-               DLL Debug - DLL Windows SSPI|Win32 = DLL Debug - DLL Windows SSPI|Win32
-               DLL Debug - DLL Windows SSPI|x64 = DLL Debug - DLL Windows SSPI|x64
-               DLL Debug - DLL wolfSSL|Win32 = DLL Debug - DLL wolfSSL|Win32
-               DLL Debug - DLL wolfSSL|x64 = DLL Debug - DLL wolfSSL|x64
-               DLL Debug|Win32 = DLL Debug|Win32
-               DLL Debug|x64 = DLL Debug|x64
-               DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
-               DLL Release - DLL OpenSSL - DLL LibSSH2|x64 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
-               DLL Release - DLL OpenSSL|Win32 = DLL Release - DLL OpenSSL|Win32
-               DLL Release - DLL OpenSSL|x64 = DLL Release - DLL OpenSSL|x64
-               DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
-               DLL Release - DLL Windows SSPI - DLL WinIDN|x64 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
-               DLL Release - DLL Windows SSPI|Win32 = DLL Release - DLL Windows SSPI|Win32
-               DLL Release - DLL Windows SSPI|x64 = DLL Release - DLL Windows SSPI|x64
-               DLL Release - DLL wolfSSL|Win32 = DLL Release - DLL wolfSSL|Win32
-               DLL Release - DLL wolfSSL|x64 = DLL Release - DLL wolfSSL|x64
-               DLL Release|Win32 = DLL Release|Win32
-               DLL Release|x64 = DLL Release|x64
-               LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               LIB Debug - DLL OpenSSL - DLL LibSSH2|x64 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
-               LIB Debug - DLL OpenSSL|Win32 = LIB Debug - DLL OpenSSL|Win32
-               LIB Debug - DLL OpenSSL|x64 = LIB Debug - DLL OpenSSL|x64
-               LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               LIB Debug - DLL Windows SSPI - DLL WinIDN|x64 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
-               LIB Debug - DLL Windows SSPI|Win32 = LIB Debug - DLL Windows SSPI|Win32
-               LIB Debug - DLL Windows SSPI|x64 = LIB Debug - DLL Windows SSPI|x64
-               LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
-               LIB Debug - LIB OpenSSL - LIB LibSSH2|x64 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
-               LIB Debug - LIB OpenSSL|Win32 = LIB Debug - LIB OpenSSL|Win32
-               LIB Debug - LIB OpenSSL|x64 = LIB Debug - LIB OpenSSL|x64
-               LIB Debug - LIB wolfSSL|Win32 = LIB Debug - LIB wolfSSL|Win32
-               LIB Debug - LIB wolfSSL|x64 = LIB Debug - LIB wolfSSL|x64
-               LIB Debug|Win32 = LIB Debug|Win32
-               LIB Debug|x64 = LIB Debug|x64
-               LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
-               LIB Release - DLL OpenSSL - DLL LibSSH2|x64 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
-               LIB Release - DLL OpenSSL|Win32 = LIB Release - DLL OpenSSL|Win32
-               LIB Release - DLL OpenSSL|x64 = LIB Release - DLL OpenSSL|x64
-               LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
-               LIB Release - DLL Windows SSPI - DLL WinIDN|x64 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
-               LIB Release - DLL Windows SSPI|Win32 = LIB Release - DLL Windows SSPI|Win32
-               LIB Release - DLL Windows SSPI|x64 = LIB Release - DLL Windows SSPI|x64
-               LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
-               LIB Release - LIB OpenSSL - LIB LibSSH2|x64 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
-               LIB Release - LIB OpenSSL|Win32 = LIB Release - LIB OpenSSL|Win32
-               LIB Release - LIB OpenSSL|x64 = LIB Release - LIB OpenSSL|x64
-               LIB Release - LIB wolfSSL|Win32 = LIB Release - LIB wolfSSL|Win32
-               LIB Release - LIB wolfSSL|x64 = LIB Release - LIB wolfSSL|x64
-               LIB Release|Win32 = LIB Release|Win32
-               LIB Release|x64 = LIB Release|x64
-       EndGlobalSection
-       GlobalSection(ProjectConfigurationPlatforms) = postSolution
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|Win32.ActiveCfg = DLL Debug - DLL OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|Win32.Build.0 = DLL Debug - DLL OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|x64.ActiveCfg = DLL Debug - DLL OpenSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|x64.Build.0 = DLL Debug - DLL OpenSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|Win32.Build.0 = DLL Debug - DLL Windows SSPI|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|x64.ActiveCfg = DLL Debug - DLL Windows SSPI|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|x64.Build.0 = DLL Debug - DLL Windows SSPI|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL wolfSSL|Win32.ActiveCfg = DLL Debug - DLL wolfSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL wolfSSL|Win32.Build.0 = DLL Debug - DLL wolfSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL wolfSSL|x64.ActiveCfg = DLL Debug - DLL wolfSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL wolfSSL|x64.Build.0 = DLL Debug - DLL wolfSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|Win32.Build.0 = DLL Debug|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|x64.ActiveCfg = DLL Debug|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|x64.Build.0 = DLL Debug|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|Win32.ActiveCfg = DLL Release - DLL OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|Win32.Build.0 = DLL Release - DLL OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|x64.ActiveCfg = DLL Release - DLL OpenSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|x64.Build.0 = DLL Release - DLL OpenSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|Win32.ActiveCfg = DLL Release - DLL Windows SSPI|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|Win32.Build.0 = DLL Release - DLL Windows SSPI|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|x64.ActiveCfg = DLL Release - DLL Windows SSPI|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|x64.Build.0 = DLL Release - DLL Windows SSPI|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL wolfSSL|Win32.ActiveCfg = DLL Release - DLL wolfSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL wolfSSL|Win32.Build.0 = DLL Release - DLL wolfSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL wolfSSL|x64.ActiveCfg = DLL Release - DLL wolfSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL wolfSSL|x64.Build.0 = DLL Release - DLL wolfSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|Win32.ActiveCfg = DLL Release|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|Win32.Build.0 = DLL Release|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|x64.ActiveCfg = DLL Release|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|x64.Build.0 = DLL Release|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|Win32.ActiveCfg = LIB Debug - DLL OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|Win32.Build.0 = LIB Debug - DLL OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|x64.ActiveCfg = LIB Debug - DLL OpenSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|x64.Build.0 = LIB Debug - DLL OpenSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|Win32.Build.0 = LIB Debug - DLL Windows SSPI|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|x64.ActiveCfg = LIB Debug - DLL Windows SSPI|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|x64.Build.0 = LIB Debug - DLL Windows SSPI|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|Win32.ActiveCfg = LIB Debug - LIB OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|Win32.Build.0 = LIB Debug - LIB OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|x64.ActiveCfg = LIB Debug - LIB OpenSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|x64.Build.0 = LIB Debug - LIB OpenSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB wolfSSL|Win32.ActiveCfg = LIB Debug - LIB wolfSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB wolfSSL|Win32.Build.0 = LIB Debug - LIB wolfSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB wolfSSL|x64.ActiveCfg = LIB Debug - LIB wolfSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB wolfSSL|x64.Build.0 = LIB Debug - LIB wolfSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|Win32.ActiveCfg = LIB Debug|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|Win32.Build.0 = LIB Debug|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|x64.ActiveCfg = LIB Debug|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|x64.Build.0 = LIB Debug|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|Win32.ActiveCfg = LIB Release - DLL OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|Win32.Build.0 = LIB Release - DLL OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|x64.ActiveCfg = LIB Release - DLL OpenSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|x64.Build.0 = LIB Release - DLL OpenSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|Win32.ActiveCfg = LIB Release - DLL Windows SSPI|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|Win32.Build.0 = LIB Release - DLL Windows SSPI|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|x64.ActiveCfg = LIB Release - DLL Windows SSPI|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|x64.Build.0 = LIB Release - DLL Windows SSPI|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|Win32.ActiveCfg = LIB Release - LIB OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|Win32.Build.0 = LIB Release - LIB OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|x64.ActiveCfg = LIB Release - LIB OpenSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|x64.Build.0 = LIB Release - LIB OpenSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB wolfSSL|Win32.ActiveCfg = LIB Release - LIB wolfSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB wolfSSL|Win32.Build.0 = LIB Release - LIB wolfSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB wolfSSL|x64.ActiveCfg = LIB Release - LIB wolfSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB wolfSSL|x64.Build.0 = LIB Release - LIB wolfSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|Win32.ActiveCfg = LIB Release|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|Win32.Build.0 = LIB Release|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|x64.ActiveCfg = LIB Release|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|x64.Build.0 = LIB Release|x64
-       EndGlobalSection
-       GlobalSection(SolutionProperties) = preSolution
-               HideSolutionNode = FALSE
-       EndGlobalSection
-EndGlobal
+Microsoft Visual Studio Solution File, Format Version 12.00\r
+# Visual Studio 2013\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libcurl", "libcurl.vcxproj", "{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}"\r
+EndProject\r
+Global\r
+       GlobalSection(SolutionConfigurationPlatforms) = preSolution\r
+               DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               DLL Debug - DLL OpenSSL - DLL LibSSH2|x64 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64\r
+               DLL Debug - DLL OpenSSL|Win32 = DLL Debug - DLL OpenSSL|Win32\r
+               DLL Debug - DLL OpenSSL|x64 = DLL Debug - DLL OpenSSL|x64\r
+               DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               DLL Debug - DLL Windows SSPI - DLL WinIDN|x64 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64\r
+               DLL Debug - DLL Windows SSPI|Win32 = DLL Debug - DLL Windows SSPI|Win32\r
+               DLL Debug - DLL Windows SSPI|x64 = DLL Debug - DLL Windows SSPI|x64\r
+               DLL Debug - DLL wolfSSL|Win32 = DLL Debug - DLL wolfSSL|Win32\r
+               DLL Debug - DLL wolfSSL|x64 = DLL Debug - DLL wolfSSL|x64\r
+               DLL Debug|Win32 = DLL Debug|Win32\r
+               DLL Debug|x64 = DLL Debug|x64\r
+               DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               DLL Release - DLL OpenSSL - DLL LibSSH2|x64 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64\r
+               DLL Release - DLL OpenSSL|Win32 = DLL Release - DLL OpenSSL|Win32\r
+               DLL Release - DLL OpenSSL|x64 = DLL Release - DLL OpenSSL|x64\r
+               DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               DLL Release - DLL Windows SSPI - DLL WinIDN|x64 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64\r
+               DLL Release - DLL Windows SSPI|Win32 = DLL Release - DLL Windows SSPI|Win32\r
+               DLL Release - DLL Windows SSPI|x64 = DLL Release - DLL Windows SSPI|x64\r
+               DLL Release - DLL wolfSSL|Win32 = DLL Release - DLL wolfSSL|Win32\r
+               DLL Release - DLL wolfSSL|x64 = DLL Release - DLL wolfSSL|x64\r
+               DLL Release|Win32 = DLL Release|Win32\r
+               DLL Release|x64 = DLL Release|x64\r
+               LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               LIB Debug - DLL OpenSSL - DLL LibSSH2|x64 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64\r
+               LIB Debug - DLL OpenSSL|Win32 = LIB Debug - DLL OpenSSL|Win32\r
+               LIB Debug - DLL OpenSSL|x64 = LIB Debug - DLL OpenSSL|x64\r
+               LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               LIB Debug - DLL Windows SSPI - DLL WinIDN|x64 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64\r
+               LIB Debug - DLL Windows SSPI|Win32 = LIB Debug - DLL Windows SSPI|Win32\r
+               LIB Debug - DLL Windows SSPI|x64 = LIB Debug - DLL Windows SSPI|x64\r
+               LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32\r
+               LIB Debug - LIB OpenSSL - LIB LibSSH2|x64 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64\r
+               LIB Debug - LIB OpenSSL|Win32 = LIB Debug - LIB OpenSSL|Win32\r
+               LIB Debug - LIB OpenSSL|x64 = LIB Debug - LIB OpenSSL|x64\r
+               LIB Debug - LIB wolfSSL|Win32 = LIB Debug - LIB wolfSSL|Win32\r
+               LIB Debug - LIB wolfSSL|x64 = LIB Debug - LIB wolfSSL|x64\r
+               LIB Debug|Win32 = LIB Debug|Win32\r
+               LIB Debug|x64 = LIB Debug|x64\r
+               LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               LIB Release - DLL OpenSSL - DLL LibSSH2|x64 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64\r
+               LIB Release - DLL OpenSSL|Win32 = LIB Release - DLL OpenSSL|Win32\r
+               LIB Release - DLL OpenSSL|x64 = LIB Release - DLL OpenSSL|x64\r
+               LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               LIB Release - DLL Windows SSPI - DLL WinIDN|x64 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64\r
+               LIB Release - DLL Windows SSPI|Win32 = LIB Release - DLL Windows SSPI|Win32\r
+               LIB Release - DLL Windows SSPI|x64 = LIB Release - DLL Windows SSPI|x64\r
+               LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32\r
+               LIB Release - LIB OpenSSL - LIB LibSSH2|x64 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64\r
+               LIB Release - LIB OpenSSL|Win32 = LIB Release - LIB OpenSSL|Win32\r
+               LIB Release - LIB OpenSSL|x64 = LIB Release - LIB OpenSSL|x64\r
+               LIB Release - LIB wolfSSL|Win32 = LIB Release - LIB wolfSSL|Win32\r
+               LIB Release - LIB wolfSSL|x64 = LIB Release - LIB wolfSSL|x64\r
+               LIB Release|Win32 = LIB Release|Win32\r
+               LIB Release|x64 = LIB Release|x64\r
+       EndGlobalSection\r
+       GlobalSection(ProjectConfigurationPlatforms) = postSolution\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|Win32.ActiveCfg = DLL Debug - DLL OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|Win32.Build.0 = DLL Debug - DLL OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|x64.ActiveCfg = DLL Debug - DLL OpenSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|x64.Build.0 = DLL Debug - DLL OpenSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|Win32.Build.0 = DLL Debug - DLL Windows SSPI|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|x64.ActiveCfg = DLL Debug - DLL Windows SSPI|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|x64.Build.0 = DLL Debug - DLL Windows SSPI|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL wolfSSL|Win32.ActiveCfg = DLL Debug - DLL wolfSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL wolfSSL|Win32.Build.0 = DLL Debug - DLL wolfSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL wolfSSL|x64.ActiveCfg = DLL Debug - DLL wolfSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL wolfSSL|x64.Build.0 = DLL Debug - DLL wolfSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|Win32.Build.0 = DLL Debug|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|x64.ActiveCfg = DLL Debug|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|x64.Build.0 = DLL Debug|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|Win32.ActiveCfg = DLL Release - DLL OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|Win32.Build.0 = DLL Release - DLL OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|x64.ActiveCfg = DLL Release - DLL OpenSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|x64.Build.0 = DLL Release - DLL OpenSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|Win32.ActiveCfg = DLL Release - DLL Windows SSPI|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|Win32.Build.0 = DLL Release - DLL Windows SSPI|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|x64.ActiveCfg = DLL Release - DLL Windows SSPI|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|x64.Build.0 = DLL Release - DLL Windows SSPI|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL wolfSSL|Win32.ActiveCfg = DLL Release - DLL wolfSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL wolfSSL|Win32.Build.0 = DLL Release - DLL wolfSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL wolfSSL|x64.ActiveCfg = DLL Release - DLL wolfSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL wolfSSL|x64.Build.0 = DLL Release - DLL wolfSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|Win32.ActiveCfg = DLL Release|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|Win32.Build.0 = DLL Release|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|x64.ActiveCfg = DLL Release|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|x64.Build.0 = DLL Release|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|Win32.ActiveCfg = LIB Debug - DLL OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|Win32.Build.0 = LIB Debug - DLL OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|x64.ActiveCfg = LIB Debug - DLL OpenSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|x64.Build.0 = LIB Debug - DLL OpenSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|Win32.Build.0 = LIB Debug - DLL Windows SSPI|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|x64.ActiveCfg = LIB Debug - DLL Windows SSPI|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|x64.Build.0 = LIB Debug - DLL Windows SSPI|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|Win32.ActiveCfg = LIB Debug - LIB OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|Win32.Build.0 = LIB Debug - LIB OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|x64.ActiveCfg = LIB Debug - LIB OpenSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|x64.Build.0 = LIB Debug - LIB OpenSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB wolfSSL|Win32.ActiveCfg = LIB Debug - LIB wolfSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB wolfSSL|Win32.Build.0 = LIB Debug - LIB wolfSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB wolfSSL|x64.ActiveCfg = LIB Debug - LIB wolfSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB wolfSSL|x64.Build.0 = LIB Debug - LIB wolfSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|Win32.ActiveCfg = LIB Debug|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|Win32.Build.0 = LIB Debug|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|x64.ActiveCfg = LIB Debug|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|x64.Build.0 = LIB Debug|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|Win32.ActiveCfg = LIB Release - DLL OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|Win32.Build.0 = LIB Release - DLL OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|x64.ActiveCfg = LIB Release - DLL OpenSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|x64.Build.0 = LIB Release - DLL OpenSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|Win32.ActiveCfg = LIB Release - DLL Windows SSPI|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|Win32.Build.0 = LIB Release - DLL Windows SSPI|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|x64.ActiveCfg = LIB Release - DLL Windows SSPI|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|x64.Build.0 = LIB Release - DLL Windows SSPI|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|Win32.ActiveCfg = LIB Release - LIB OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|Win32.Build.0 = LIB Release - LIB OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|x64.ActiveCfg = LIB Release - LIB OpenSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|x64.Build.0 = LIB Release - LIB OpenSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB wolfSSL|Win32.ActiveCfg = LIB Release - LIB wolfSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB wolfSSL|Win32.Build.0 = LIB Release - LIB wolfSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB wolfSSL|x64.ActiveCfg = LIB Release - LIB wolfSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB wolfSSL|x64.Build.0 = LIB Release - LIB wolfSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|Win32.ActiveCfg = LIB Release|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|Win32.Build.0 = LIB Release|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|x64.ActiveCfg = LIB Release|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|x64.Build.0 = LIB Release|x64\r
+       EndGlobalSection\r
+       GlobalSection(SolutionProperties) = preSolution\r
+               HideSolutionNode = FALSE\r
+       EndGlobalSection\r
+EndGlobal\r
index 154e445..4a766a9 100644 (file)
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - LIB OpenSSL - LIB LibSSH2|Win32'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v120</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - LIB OpenSSL|Win32'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v120</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL Windows SSPI|Win32'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v120</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL Windows SSPI - DLL WinIDN|Win32'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v120</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL OpenSSL - DLL LibSSH2|Win32'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v120</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL OpenSSL|Win32'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v120</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v120</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - LIB OpenSSL|Win32'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v120</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL Windows SSPI|Win32'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v120</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v120</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v120</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL OpenSSL|Win32'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v120</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL OpenSSL - DLL LibSSH2|Win32'" Label="Configuration">\r
     <ConfigurationType>DynamicLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v120</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32'" Label="Configuration">\r
     <ConfigurationType>DynamicLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v120</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL Windows SSPI|Win32'" Label="Configuration">\r
     <ConfigurationType>DynamicLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v120</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL Windows SSPI - DLL WinIDN|Win32'" Label="Configuration">\r
     <ConfigurationType>DynamicLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v120</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL Windows SSPI|Win32'" Label="Configuration">\r
     <ConfigurationType>DynamicLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v120</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32'" Label="Configuration">\r
     <ConfigurationType>DynamicLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v120</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL OpenSSL|Win32'" Label="Configuration">\r
     <ConfigurationType>DynamicLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v120</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL OpenSSL|Win32'" Label="Configuration">\r
     <ConfigurationType>DynamicLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v120</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release|Win32'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v120</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - LIB wolfSSL|Win32'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v120</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug|Win32'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v120</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - LIB wolfSSL|Win32'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v120</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release|Win32'" Label="Configuration">\r
     <ConfigurationType>DynamicLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v120</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL wolfSSL|Win32'" Label="Configuration">\r
     <ConfigurationType>DynamicLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v120</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug|Win32'" Label="Configuration">\r
     <ConfigurationType>DynamicLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v120</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL wolfSSL|Win32'" Label="Configuration">\r
     <ConfigurationType>DynamicLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v120</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - LIB OpenSSL - LIB LibSSH2|x64'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v120</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - LIB OpenSSL|x64'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v120</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL Windows SSPI|x64'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v120</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL Windows SSPI - DLL WinIDN|x64'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v120</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL OpenSSL - DLL LibSSH2|x64'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v120</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL OpenSSL|x64'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v120</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - LIB OpenSSL - LIB LibSSH2|x64'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v120</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - LIB OpenSSL|x64'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v120</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL Windows SSPI|x64'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v120</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL Windows SSPI - DLL WinIDN|x64'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v120</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL OpenSSL - DLL LibSSH2|x64'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v120</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL OpenSSL|x64'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v120</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL OpenSSL - DLL LibSSH2|x64'" Label="Configuration">\r
     <ConfigurationType>DynamicLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v120</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL OpenSSL - DLL LibSSH2|x64'" Label="Configuration">\r
     <ConfigurationType>DynamicLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v120</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL Windows SSPI|x64'" Label="Configuration">\r
     <ConfigurationType>DynamicLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v120</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL Windows SSPI - DLL WinIDN|x64'" Label="Configuration">\r
     <ConfigurationType>DynamicLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v120</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL Windows SSPI|x64'" Label="Configuration">\r
     <ConfigurationType>DynamicLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v120</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL Windows SSPI - DLL WinIDN|x64'" Label="Configuration">\r
     <ConfigurationType>DynamicLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v120</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL OpenSSL|x64'" Label="Configuration">\r
     <ConfigurationType>DynamicLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v120</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL OpenSSL|x64'" Label="Configuration">\r
     <ConfigurationType>DynamicLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v120</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release|x64'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v120</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - LIB wolfSSL|x64'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v120</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug|x64'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v120</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - LIB wolfSSL|x64'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v120</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release|x64'" Label="Configuration">\r
     <ConfigurationType>DynamicLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v120</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL wolfSSL|x64'" Label="Configuration">\r
     <ConfigurationType>DynamicLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v120</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug|x64'" Label="Configuration">\r
     <ConfigurationType>DynamicLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v120</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL wolfSSL|x64'" Label="Configuration">\r
     <ConfigurationType>DynamicLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v120</PlatformToolset>\r
   </PropertyGroup>\r
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />\r
     <ClCompile>\r
       <Optimization>Disabled</Optimization>\r
       <AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\wolfssl;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_DEBUG;BUILDING_LIBCURL;DEBUGBUILD;USE_CYASSL;USE_IPV6;HAVE_CYASSL_OPTIONS_H;HAVE_CYASSL_ERROR_SSL_H;WOLFSSL_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>_DEBUG;BUILDING_LIBCURL;DEBUGBUILD;USE_WOLFSSL;USE_IPV6;WOLFSSL_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <MinimalRebuild>true</MinimalRebuild>\r
       <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
     <ClCompile>\r
       <Optimization>Disabled</Optimization>\r
       <AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\wolfssl;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_DEBUG;BUILDING_LIBCURL;DEBUGBUILD;USE_CYASSL;USE_IPV6;HAVE_CYASSL_OPTIONS_H;HAVE_CYASSL_ERROR_SSL_H;WOLFSSL_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>_DEBUG;BUILDING_LIBCURL;DEBUGBUILD;USE_WOLFSSL;USE_IPV6;WOLFSSL_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <MinimalRebuild>true</MinimalRebuild>\r
       <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
       <Optimization>MaxSpeed</Optimization>\r
       <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>\r
       <AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\wolfssl;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>NDEBUG;BUILDING_LIBCURL;USE_CYASSL;USE_IPV6;HAVE_CYASSL_OPTIONS_H;HAVE_CYASSL_ERROR_SSL_H;WOLFSSL_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>NDEBUG;BUILDING_LIBCURL;USE_WOLFSSL;USE_IPV6;WOLFSSL_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <StringPooling>true</StringPooling>\r
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
       <FunctionLevelLinking>true</FunctionLevelLinking>\r
       <Optimization>MaxSpeed</Optimization>\r
       <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>\r
       <AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\wolfssl;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>NDEBUG;BUILDING_LIBCURL;USE_CYASSL;USE_IPV6;HAVE_CYASSL_OPTIONS_H;HAVE_CYASSL_ERROR_SSL_H;WOLFSSL_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>NDEBUG;BUILDING_LIBCURL;USE_WOLFSSL;USE_IPV6;WOLFSSL_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <StringPooling>true</StringPooling>\r
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
       <FunctionLevelLinking>true</FunctionLevelLinking>\r
     <ClCompile>\r
       <Optimization>Disabled</Optimization>\r
       <AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\wolfssl;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_DEBUG;BUILDING_LIBCURL;DEBUGBUILD;CURL_STATICLIB;USE_CYASSL;USE_IPV6;HAVE_CYASSL_OPTIONS_H;HAVE_CYASSL_ERROR_SSL_H;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>_DEBUG;BUILDING_LIBCURL;DEBUGBUILD;CURL_STATICLIB;USE_WOLFSSL;USE_IPV6;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <MinimalRebuild>true</MinimalRebuild>\r
       <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
     <ClCompile>\r
       <Optimization>Disabled</Optimization>\r
       <AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\wolfssl;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_DEBUG;BUILDING_LIBCURL;DEBUGBUILD;CURL_STATICLIB;USE_CYASSL;USE_IPV6;HAVE_CYASSL_OPTIONS_H;HAVE_CYASSL_ERROR_SSL_H;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>_DEBUG;BUILDING_LIBCURL;DEBUGBUILD;CURL_STATICLIB;USE_WOLFSSL;USE_IPV6;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <MinimalRebuild>true</MinimalRebuild>\r
       <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
       <Optimization>MaxSpeed</Optimization>\r
       <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>\r
       <AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\wolfssl;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>NDEBUG;BUILDING_LIBCURL;CURL_STATICLIB;USE_CYASSL;USE_IPV6;HAVE_CYASSL_OPTIONS_H;HAVE_CYASSL_ERROR_SSL_H;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>NDEBUG;BUILDING_LIBCURL;CURL_STATICLIB;USE_WOLFSSL;USE_IPV6;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <StringPooling>true</StringPooling>\r
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
       <FunctionLevelLinking>true</FunctionLevelLinking>\r
       <Optimization>MaxSpeed</Optimization>\r
       <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>\r
       <AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\wolfssl;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>NDEBUG;BUILDING_LIBCURL;CURL_STATICLIB;USE_CYASSL;USE_IPV6;HAVE_CYASSL_OPTIONS_H;HAVE_CYASSL_ERROR_SSL_H;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>NDEBUG;BUILDING_LIBCURL;CURL_STATICLIB;USE_WOLFSSL;USE_IPV6;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <StringPooling>true</StringPooling>\r
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
       <FunctionLevelLinking>true</FunctionLevelLinking>\r
     </Lib>\r
   </ItemDefinitionGroup>\r
   <ItemGroup>\r
+    <ClCompile Include="..\..\..\..\lib\altsvc.c" />\r
     <ClCompile Include="..\..\..\..\lib\amigaos.c" />\r
     <ClCompile Include="..\..\..\..\lib\asyn-ares.c" />\r
     <ClCompile Include="..\..\..\..\lib\asyn-thread.c" />\r
     <ClCompile Include="..\..\..\..\lib\curl_endian.c" />\r
     <ClCompile Include="..\..\..\..\lib\curl_fnmatch.c" />\r
     <ClCompile Include="..\..\..\..\lib\curl_gethostname.c" />\r
+    <ClCompile Include="..\..\..\..\lib\curl_get_line.c" />\r
     <ClCompile Include="..\..\..\..\lib\curl_gssapi.c" />\r
     <ClCompile Include="..\..\..\..\lib\curl_memrchr.c" />\r
     <ClCompile Include="..\..\..\..\lib\curl_multibyte.c" />\r
     <ClCompile Include="..\..\..\..\lib\openldap.c" />\r
     <ClCompile Include="..\..\..\..\lib\parsedate.c" />\r
     <ClCompile Include="..\..\..\..\lib\pingpong.c" />\r
-    <ClCompile Include="..\..\..\..\lib\pipeline.c" />\r
     <ClCompile Include="..\..\..\..\lib\pop3.c" />\r
     <ClCompile Include="..\..\..\..\lib\progress.c" />\r
     <ClCompile Include="..\..\..\..\lib\psl.c" />\r
     <ClCompile Include="..\..\..\..\lib\slist.c" />\r
     <ClCompile Include="..\..\..\..\lib\smb.c" />\r
     <ClCompile Include="..\..\..\..\lib\smtp.c" />\r
+    <ClCompile Include="..\..\..\..\lib\socketpair.c" />\r
     <ClCompile Include="..\..\..\..\lib\socks.c" />\r
     <ClCompile Include="..\..\..\..\lib\socks_gssapi.c" />\r
     <ClCompile Include="..\..\..\..\lib\socks_sspi.c" />\r
     <ClCompile Include="..\..\..\..\lib\speedcheck.c" />\r
     <ClCompile Include="..\..\..\..\lib\splay.c" />\r
-    <ClCompile Include="..\..\..\..\lib\ssh.c" />\r
-    <ClCompile Include="..\..\..\..\lib\ssh-libssh.c" />\r
     <ClCompile Include="..\..\..\..\lib\strcase.c" />\r
     <ClCompile Include="..\..\..\..\lib\strdup.c" />\r
     <ClCompile Include="..\..\..\..\lib\strerror.c" />\r
     <ClCompile Include="..\..\..\..\lib\vauth\spnego_gssapi.c" />\r
     <ClCompile Include="..\..\..\..\lib\vauth\spnego_sspi.c" />\r
     <ClCompile Include="..\..\..\..\lib\vauth\vauth.c" />\r
-    <ClCompile Include="..\..\..\..\lib\vtls\axtls.c" />\r
-    <ClCompile Include="..\..\..\..\lib\vtls\cyassl.c" />\r
-    <ClCompile Include="..\..\..\..\lib\vtls\darwinssl.c" />\r
+    <ClCompile Include="..\..\..\..\lib\vquic\ngtcp2.c" />\r
+    <ClCompile Include="..\..\..\..\lib\vquic\quiche.c" />\r
+    <ClCompile Include="..\..\..\..\lib\vssh\libssh2.c" />\r
+    <ClCompile Include="..\..\..\..\lib\vssh\libssh.c" />\r
+    <ClCompile Include="..\..\..\..\lib\vtls\bearssl.c" />\r
     <ClCompile Include="..\..\..\..\lib\vtls\gskit.c" />\r
     <ClCompile Include="..\..\..\..\lib\vtls\gtls.c" />\r
     <ClCompile Include="..\..\..\..\lib\vtls\mbedtls.c" />\r
     <ClCompile Include="..\..\..\..\lib\vtls\polarssl_threadlock.c" />\r
     <ClCompile Include="..\..\..\..\lib\vtls\schannel.c" />\r
     <ClCompile Include="..\..\..\..\lib\vtls\schannel_verify.c" />\r
+    <ClCompile Include="..\..\..\..\lib\vtls\sectransp.c" />\r
     <ClCompile Include="..\..\..\..\lib\vtls\vtls.c" />\r
+    <ClCompile Include="..\..\..\..\lib\vtls\wolfssl.c" />\r
   </ItemGroup>\r
   <ItemGroup>\r
+    <ClInclude Include="..\..\..\..\lib\altsvc.h" />\r
     <ClInclude Include="..\..\..\..\lib\amigaos.h" />\r
     <ClInclude Include="..\..\..\..\lib\arpa_telnet.h" />\r
     <ClInclude Include="..\..\..\..\lib\asyn.h" />\r
     <ClInclude Include="..\..\..\..\lib\curl_endian.h" />\r
     <ClInclude Include="..\..\..\..\lib\curl_fnmatch.h" />\r
     <ClInclude Include="..\..\..\..\lib\curl_gethostname.h" />\r
+    <ClInclude Include="..\..\..\..\lib\curl_get_line.h" />\r
     <ClInclude Include="..\..\..\..\lib\curl_gssapi.h" />\r
     <ClInclude Include="..\..\..\..\lib\curl_hmac.h" />\r
     <ClInclude Include="..\..\..\..\lib\curl_ldap.h" />\r
     <ClInclude Include="..\..\..\..\lib\nonblock.h" />\r
     <ClInclude Include="..\..\..\..\lib\parsedate.h" />\r
     <ClInclude Include="..\..\..\..\lib\pingpong.h" />\r
-    <ClInclude Include="..\..\..\..\lib\pipeline.h" />\r
     <ClInclude Include="..\..\..\..\lib\pop3.h" />\r
     <ClInclude Include="..\..\..\..\lib\progress.h" />\r
     <ClInclude Include="..\..\..\..\lib\psl.h" />\r
+    <ClInclude Include="..\..\..\..\lib\quic.h" />\r
     <ClInclude Include="..\..\..\..\lib\rand.h" />\r
     <ClInclude Include="..\..\..\..\lib\rtsp.h" />\r
     <ClInclude Include="..\..\..\..\lib\select.h" />\r
     <ClInclude Include="..\..\..\..\lib\smb.h" />\r
     <ClInclude Include="..\..\..\..\lib\smtp.h" />\r
     <ClInclude Include="..\..\..\..\lib\sockaddr.h" />\r
+    <ClInclude Include="..\..\..\..\lib\socketpair.h" />\r
     <ClInclude Include="..\..\..\..\lib\socks.h" />\r
     <ClInclude Include="..\..\..\..\lib\speedcheck.h" />\r
     <ClInclude Include="..\..\..\..\lib\splay.h" />\r
-    <ClInclude Include="..\..\..\..\lib\ssh.h" />\r
     <ClInclude Include="..\..\..\..\lib\strcase.h" />\r
     <ClInclude Include="..\..\..\..\lib\strdup.h" />\r
     <ClInclude Include="..\..\..\..\lib\strerror.h" />\r
     <ClInclude Include="..\..\..\..\lib\vauth\digest.h" />\r
     <ClInclude Include="..\..\..\..\lib\vauth\ntlm.h" />\r
     <ClInclude Include="..\..\..\..\lib\vauth\vauth.h" />\r
-    <ClInclude Include="..\..\..\..\lib\vtls\axtls.h" />\r
-    <ClInclude Include="..\..\..\..\lib\vtls\cyassl.h" />\r
-    <ClInclude Include="..\..\..\..\lib\vtls\darwinssl.h" />\r
+    <ClInclude Include="..\..\..\..\lib\vquic\ngtcp2.h" />\r
+    <ClInclude Include="..\..\..\..\lib\vquic\quiche.h" />\r
+    <ClInclude Include="..\..\..\..\lib\vssh\ssh.h" />\r
+    <ClInclude Include="..\..\..\..\lib\vtls\bearssl.h" />\r
     <ClInclude Include="..\..\..\..\lib\vtls\gskit.h" />\r
     <ClInclude Include="..\..\..\..\lib\vtls\gtls.h" />\r
     <ClInclude Include="..\..\..\..\lib\vtls\mbedtls.h" />\r
     <ClInclude Include="..\..\..\..\lib\vtls\polarssl.h" />\r
     <ClInclude Include="..\..\..\..\lib\vtls\polarssl_threadlock.h" />\r
     <ClInclude Include="..\..\..\..\lib\vtls\schannel.h" />\r
+    <ClInclude Include="..\..\..\..\lib\vtls\sectransp.h" />\r
     <ClInclude Include="..\..\..\..\lib\vtls\vtls.h" />\r
+    <ClInclude Include="..\..\..\..\lib\vtls\wolfssl.h" />\r
   </ItemGroup>\r
   <ItemGroup>\r
     <ResourceCompile Include="..\..\..\..\lib\libcurl.rc" />\r
index 7b5244c..d4e38dc 100644 (file)
-Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio 2013
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "curl", "curl.vcxproj", "{5228E9CE-A216-422F-A5E6-58E95E2DD71D}"
-EndProject
-Global
-       GlobalSection(SolutionConfigurationPlatforms) = preSolution
-               DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               DLL Debug - DLL OpenSSL - DLL LibSSH2|x64 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
-               DLL Debug - DLL OpenSSL|Win32 = DLL Debug - DLL OpenSSL|Win32
-               DLL Debug - DLL OpenSSL|x64 = DLL Debug - DLL OpenSSL|x64
-               DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               DLL Debug - DLL Windows SSPI - DLL WinIDN|x64 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
-               DLL Debug - DLL Windows SSPI|Win32 = DLL Debug - DLL Windows SSPI|Win32
-               DLL Debug - DLL Windows SSPI|x64 = DLL Debug - DLL Windows SSPI|x64
-               DLL Debug - DLL wolfSSL|Win32 = DLL Debug - DLL wolfSSL|Win32
-               DLL Debug - DLL wolfSSL|x64 = DLL Debug - DLL wolfSSL|x64
-               DLL Debug|Win32 = DLL Debug|Win32
-               DLL Debug|x64 = DLL Debug|x64
-               DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
-               DLL Release - DLL OpenSSL - DLL LibSSH2|x64 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
-               DLL Release - DLL OpenSSL|Win32 = DLL Release - DLL OpenSSL|Win32
-               DLL Release - DLL OpenSSL|x64 = DLL Release - DLL OpenSSL|x64
-               DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
-               DLL Release - DLL Windows SSPI - DLL WinIDN|x64 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
-               DLL Release - DLL Windows SSPI|Win32 = DLL Release - DLL Windows SSPI|Win32
-               DLL Release - DLL Windows SSPI|x64 = DLL Release - DLL Windows SSPI|x64
-               DLL Release - DLL wolfSSL|Win32 = DLL Release - DLL wolfSSL|Win32
-               DLL Release - DLL wolfSSL|x64 = DLL Release - DLL wolfSSL|x64
-               DLL Release|Win32 = DLL Release|Win32
-               DLL Release|x64 = DLL Release|x64
-               LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               LIB Debug - DLL OpenSSL - DLL LibSSH2|x64 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
-               LIB Debug - DLL OpenSSL|Win32 = LIB Debug - DLL OpenSSL|Win32
-               LIB Debug - DLL OpenSSL|x64 = LIB Debug - DLL OpenSSL|x64
-               LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               LIB Debug - DLL Windows SSPI - DLL WinIDN|x64 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
-               LIB Debug - DLL Windows SSPI|Win32 = LIB Debug - DLL Windows SSPI|Win32
-               LIB Debug - DLL Windows SSPI|x64 = LIB Debug - DLL Windows SSPI|x64
-               LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
-               LIB Debug - LIB OpenSSL - LIB LibSSH2|x64 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
-               LIB Debug - LIB OpenSSL|Win32 = LIB Debug - LIB OpenSSL|Win32
-               LIB Debug - LIB OpenSSL|x64 = LIB Debug - LIB OpenSSL|x64
-               LIB Debug - LIB wolfSSL|Win32 = LIB Debug - LIB wolfSSL|Win32
-               LIB Debug - LIB wolfSSL|x64 = LIB Debug - LIB wolfSSL|x64
-               LIB Debug|Win32 = LIB Debug|Win32
-               LIB Debug|x64 = LIB Debug|x64
-               LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
-               LIB Release - DLL OpenSSL - DLL LibSSH2|x64 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
-               LIB Release - DLL OpenSSL|Win32 = LIB Release - DLL OpenSSL|Win32
-               LIB Release - DLL OpenSSL|x64 = LIB Release - DLL OpenSSL|x64
-               LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
-               LIB Release - DLL Windows SSPI - DLL WinIDN|x64 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
-               LIB Release - DLL Windows SSPI|Win32 = LIB Release - DLL Windows SSPI|Win32
-               LIB Release - DLL Windows SSPI|x64 = LIB Release - DLL Windows SSPI|x64
-               LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
-               LIB Release - LIB OpenSSL - LIB LibSSH2|x64 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
-               LIB Release - LIB OpenSSL|Win32 = LIB Release - LIB OpenSSL|Win32
-               LIB Release - LIB OpenSSL|x64 = LIB Release - LIB OpenSSL|x64
-               LIB Release - LIB wolfSSL|Win32 = LIB Release - LIB wolfSSL|Win32
-               LIB Release - LIB wolfSSL|x64 = LIB Release - LIB wolfSSL|x64
-               LIB Release|Win32 = LIB Release|Win32
-               LIB Release|x64 = LIB Release|x64
-       EndGlobalSection
-       GlobalSection(ProjectConfigurationPlatforms) = postSolution
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|Win32.ActiveCfg = DLL Debug - DLL OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|Win32.Build.0 = DLL Debug - DLL OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|x64.ActiveCfg = DLL Debug - DLL OpenSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|x64.Build.0 = DLL Debug - DLL OpenSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|Win32.Build.0 = DLL Debug - DLL Windows SSPI|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|x64.ActiveCfg = DLL Debug - DLL Windows SSPI|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|x64.Build.0 = DLL Debug - DLL Windows SSPI|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL wolfSSL|Win32.ActiveCfg = DLL Debug - DLL wolfSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL wolfSSL|Win32.Build.0 = DLL Debug - DLL wolfSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL wolfSSL|x64.ActiveCfg = DLL Debug - DLL wolfSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL wolfSSL|x64.Build.0 = DLL Debug - DLL wolfSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|Win32.Build.0 = DLL Debug|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|x64.ActiveCfg = DLL Debug|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|x64.Build.0 = DLL Debug|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|Win32.ActiveCfg = DLL Release - DLL OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|Win32.Build.0 = DLL Release - DLL OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|x64.ActiveCfg = DLL Release - DLL OpenSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|x64.Build.0 = DLL Release - DLL OpenSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|Win32.ActiveCfg = DLL Release - DLL Windows SSPI|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|Win32.Build.0 = DLL Release - DLL Windows SSPI|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|x64.ActiveCfg = DLL Release - DLL Windows SSPI|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|x64.Build.0 = DLL Release - DLL Windows SSPI|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL wolfSSL|Win32.ActiveCfg = DLL Release - DLL wolfSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL wolfSSL|Win32.Build.0 = DLL Release - DLL wolfSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL wolfSSL|x64.ActiveCfg = DLL Release - DLL wolfSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL wolfSSL|x64.Build.0 = DLL Release - DLL wolfSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|Win32.ActiveCfg = DLL Release|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|Win32.Build.0 = DLL Release|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|x64.ActiveCfg = DLL Release|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|x64.Build.0 = DLL Release|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|Win32.ActiveCfg = LIB Debug - DLL OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|Win32.Build.0 = LIB Debug - DLL OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|x64.ActiveCfg = LIB Debug - DLL OpenSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|x64.Build.0 = LIB Debug - DLL OpenSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|Win32.Build.0 = LIB Debug - DLL Windows SSPI|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|x64.ActiveCfg = LIB Debug - DLL Windows SSPI|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|x64.Build.0 = LIB Debug - DLL Windows SSPI|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|Win32.ActiveCfg = LIB Debug - LIB OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|Win32.Build.0 = LIB Debug - LIB OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|x64.ActiveCfg = LIB Debug - LIB OpenSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|x64.Build.0 = LIB Debug - LIB OpenSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB wolfSSL|Win32.ActiveCfg = LIB Debug - LIB wolfSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB wolfSSL|Win32.Build.0 = LIB Debug - LIB wolfSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB wolfSSL|x64.ActiveCfg = LIB Debug - LIB wolfSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB wolfSSL|x64.Build.0 = LIB Debug - LIB wolfSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|Win32.ActiveCfg = LIB Debug|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|Win32.Build.0 = LIB Debug|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|x64.ActiveCfg = LIB Debug|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|x64.Build.0 = LIB Debug|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|Win32.ActiveCfg = LIB Release - DLL OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|Win32.Build.0 = LIB Release - DLL OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|x64.ActiveCfg = LIB Release - DLL OpenSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|x64.Build.0 = LIB Release - DLL OpenSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|Win32.ActiveCfg = LIB Release - DLL Windows SSPI|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|Win32.Build.0 = LIB Release - DLL Windows SSPI|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|x64.ActiveCfg = LIB Release - DLL Windows SSPI|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|x64.Build.0 = LIB Release - DLL Windows SSPI|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|Win32.ActiveCfg = LIB Release - LIB OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|Win32.Build.0 = LIB Release - LIB OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|x64.ActiveCfg = LIB Release - LIB OpenSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|x64.Build.0 = LIB Release - LIB OpenSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB wolfSSL|Win32.ActiveCfg = LIB Release - LIB wolfSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB wolfSSL|Win32.Build.0 = LIB Release - LIB wolfSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB wolfSSL|x64.ActiveCfg = LIB Release - LIB wolfSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB wolfSSL|x64.Build.0 = LIB Release - LIB wolfSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|Win32.ActiveCfg = LIB Release|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|Win32.Build.0 = LIB Release|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|x64.ActiveCfg = LIB Release|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|x64.Build.0 = LIB Release|x64
-       EndGlobalSection
-       GlobalSection(SolutionProperties) = preSolution
-               HideSolutionNode = FALSE
-       EndGlobalSection
-EndGlobal
+Microsoft Visual Studio Solution File, Format Version 12.00\r
+# Visual Studio 2013\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "curl", "curl.vcxproj", "{5228E9CE-A216-422F-A5E6-58E95E2DD71D}"\r
+EndProject\r
+Global\r
+       GlobalSection(SolutionConfigurationPlatforms) = preSolution\r
+               DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               DLL Debug - DLL OpenSSL - DLL LibSSH2|x64 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64\r
+               DLL Debug - DLL OpenSSL|Win32 = DLL Debug - DLL OpenSSL|Win32\r
+               DLL Debug - DLL OpenSSL|x64 = DLL Debug - DLL OpenSSL|x64\r
+               DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               DLL Debug - DLL Windows SSPI - DLL WinIDN|x64 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64\r
+               DLL Debug - DLL Windows SSPI|Win32 = DLL Debug - DLL Windows SSPI|Win32\r
+               DLL Debug - DLL Windows SSPI|x64 = DLL Debug - DLL Windows SSPI|x64\r
+               DLL Debug - DLL wolfSSL|Win32 = DLL Debug - DLL wolfSSL|Win32\r
+               DLL Debug - DLL wolfSSL|x64 = DLL Debug - DLL wolfSSL|x64\r
+               DLL Debug|Win32 = DLL Debug|Win32\r
+               DLL Debug|x64 = DLL Debug|x64\r
+               DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               DLL Release - DLL OpenSSL - DLL LibSSH2|x64 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64\r
+               DLL Release - DLL OpenSSL|Win32 = DLL Release - DLL OpenSSL|Win32\r
+               DLL Release - DLL OpenSSL|x64 = DLL Release - DLL OpenSSL|x64\r
+               DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               DLL Release - DLL Windows SSPI - DLL WinIDN|x64 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64\r
+               DLL Release - DLL Windows SSPI|Win32 = DLL Release - DLL Windows SSPI|Win32\r
+               DLL Release - DLL Windows SSPI|x64 = DLL Release - DLL Windows SSPI|x64\r
+               DLL Release - DLL wolfSSL|Win32 = DLL Release - DLL wolfSSL|Win32\r
+               DLL Release - DLL wolfSSL|x64 = DLL Release - DLL wolfSSL|x64\r
+               DLL Release|Win32 = DLL Release|Win32\r
+               DLL Release|x64 = DLL Release|x64\r
+               LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               LIB Debug - DLL OpenSSL - DLL LibSSH2|x64 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64\r
+               LIB Debug - DLL OpenSSL|Win32 = LIB Debug - DLL OpenSSL|Win32\r
+               LIB Debug - DLL OpenSSL|x64 = LIB Debug - DLL OpenSSL|x64\r
+               LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               LIB Debug - DLL Windows SSPI - DLL WinIDN|x64 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64\r
+               LIB Debug - DLL Windows SSPI|Win32 = LIB Debug - DLL Windows SSPI|Win32\r
+               LIB Debug - DLL Windows SSPI|x64 = LIB Debug - DLL Windows SSPI|x64\r
+               LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32\r
+               LIB Debug - LIB OpenSSL - LIB LibSSH2|x64 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64\r
+               LIB Debug - LIB OpenSSL|Win32 = LIB Debug - LIB OpenSSL|Win32\r
+               LIB Debug - LIB OpenSSL|x64 = LIB Debug - LIB OpenSSL|x64\r
+               LIB Debug - LIB wolfSSL|Win32 = LIB Debug - LIB wolfSSL|Win32\r
+               LIB Debug - LIB wolfSSL|x64 = LIB Debug - LIB wolfSSL|x64\r
+               LIB Debug|Win32 = LIB Debug|Win32\r
+               LIB Debug|x64 = LIB Debug|x64\r
+               LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               LIB Release - DLL OpenSSL - DLL LibSSH2|x64 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64\r
+               LIB Release - DLL OpenSSL|Win32 = LIB Release - DLL OpenSSL|Win32\r
+               LIB Release - DLL OpenSSL|x64 = LIB Release - DLL OpenSSL|x64\r
+               LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               LIB Release - DLL Windows SSPI - DLL WinIDN|x64 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64\r
+               LIB Release - DLL Windows SSPI|Win32 = LIB Release - DLL Windows SSPI|Win32\r
+               LIB Release - DLL Windows SSPI|x64 = LIB Release - DLL Windows SSPI|x64\r
+               LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32\r
+               LIB Release - LIB OpenSSL - LIB LibSSH2|x64 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64\r
+               LIB Release - LIB OpenSSL|Win32 = LIB Release - LIB OpenSSL|Win32\r
+               LIB Release - LIB OpenSSL|x64 = LIB Release - LIB OpenSSL|x64\r
+               LIB Release - LIB wolfSSL|Win32 = LIB Release - LIB wolfSSL|Win32\r
+               LIB Release - LIB wolfSSL|x64 = LIB Release - LIB wolfSSL|x64\r
+               LIB Release|Win32 = LIB Release|Win32\r
+               LIB Release|x64 = LIB Release|x64\r
+       EndGlobalSection\r
+       GlobalSection(ProjectConfigurationPlatforms) = postSolution\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|Win32.ActiveCfg = DLL Debug - DLL OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|Win32.Build.0 = DLL Debug - DLL OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|x64.ActiveCfg = DLL Debug - DLL OpenSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|x64.Build.0 = DLL Debug - DLL OpenSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|Win32.Build.0 = DLL Debug - DLL Windows SSPI|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|x64.ActiveCfg = DLL Debug - DLL Windows SSPI|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|x64.Build.0 = DLL Debug - DLL Windows SSPI|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL wolfSSL|Win32.ActiveCfg = DLL Debug - DLL wolfSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL wolfSSL|Win32.Build.0 = DLL Debug - DLL wolfSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL wolfSSL|x64.ActiveCfg = DLL Debug - DLL wolfSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL wolfSSL|x64.Build.0 = DLL Debug - DLL wolfSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|Win32.Build.0 = DLL Debug|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|x64.ActiveCfg = DLL Debug|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|x64.Build.0 = DLL Debug|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|Win32.ActiveCfg = DLL Release - DLL OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|Win32.Build.0 = DLL Release - DLL OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|x64.ActiveCfg = DLL Release - DLL OpenSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|x64.Build.0 = DLL Release - DLL OpenSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|Win32.ActiveCfg = DLL Release - DLL Windows SSPI|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|Win32.Build.0 = DLL Release - DLL Windows SSPI|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|x64.ActiveCfg = DLL Release - DLL Windows SSPI|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|x64.Build.0 = DLL Release - DLL Windows SSPI|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL wolfSSL|Win32.ActiveCfg = DLL Release - DLL wolfSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL wolfSSL|Win32.Build.0 = DLL Release - DLL wolfSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL wolfSSL|x64.ActiveCfg = DLL Release - DLL wolfSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL wolfSSL|x64.Build.0 = DLL Release - DLL wolfSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|Win32.ActiveCfg = DLL Release|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|Win32.Build.0 = DLL Release|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|x64.ActiveCfg = DLL Release|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|x64.Build.0 = DLL Release|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|Win32.ActiveCfg = LIB Debug - DLL OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|Win32.Build.0 = LIB Debug - DLL OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|x64.ActiveCfg = LIB Debug - DLL OpenSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|x64.Build.0 = LIB Debug - DLL OpenSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|Win32.Build.0 = LIB Debug - DLL Windows SSPI|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|x64.ActiveCfg = LIB Debug - DLL Windows SSPI|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|x64.Build.0 = LIB Debug - DLL Windows SSPI|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|Win32.ActiveCfg = LIB Debug - LIB OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|Win32.Build.0 = LIB Debug - LIB OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|x64.ActiveCfg = LIB Debug - LIB OpenSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|x64.Build.0 = LIB Debug - LIB OpenSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB wolfSSL|Win32.ActiveCfg = LIB Debug - LIB wolfSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB wolfSSL|Win32.Build.0 = LIB Debug - LIB wolfSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB wolfSSL|x64.ActiveCfg = LIB Debug - LIB wolfSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB wolfSSL|x64.Build.0 = LIB Debug - LIB wolfSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|Win32.ActiveCfg = LIB Debug|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|Win32.Build.0 = LIB Debug|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|x64.ActiveCfg = LIB Debug|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|x64.Build.0 = LIB Debug|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|Win32.ActiveCfg = LIB Release - DLL OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|Win32.Build.0 = LIB Release - DLL OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|x64.ActiveCfg = LIB Release - DLL OpenSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|x64.Build.0 = LIB Release - DLL OpenSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|Win32.ActiveCfg = LIB Release - DLL Windows SSPI|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|Win32.Build.0 = LIB Release - DLL Windows SSPI|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|x64.ActiveCfg = LIB Release - DLL Windows SSPI|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|x64.Build.0 = LIB Release - DLL Windows SSPI|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|Win32.ActiveCfg = LIB Release - LIB OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|Win32.Build.0 = LIB Release - LIB OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|x64.ActiveCfg = LIB Release - LIB OpenSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|x64.Build.0 = LIB Release - LIB OpenSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB wolfSSL|Win32.ActiveCfg = LIB Release - LIB wolfSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB wolfSSL|Win32.Build.0 = LIB Release - LIB wolfSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB wolfSSL|x64.ActiveCfg = LIB Release - LIB wolfSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB wolfSSL|x64.Build.0 = LIB Release - LIB wolfSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|Win32.ActiveCfg = LIB Release|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|Win32.Build.0 = LIB Release|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|x64.ActiveCfg = LIB Release|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|x64.Build.0 = LIB Release|x64\r
+       EndGlobalSection\r
+       GlobalSection(SolutionProperties) = preSolution\r
+               HideSolutionNode = FALSE\r
+       EndGlobalSection\r
+EndGlobal\r
index 8a86503..c03c56d 100644 (file)
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL Windows SSPI|Win32'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v120</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL Windows SSPI - DLL WinIDN|Win32'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v120</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL Windows SSPI|Win32'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v120</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v120</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL OpenSSL - DLL LibSSH2|Win32'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v120</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v120</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL OpenSSL|Win32'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v120</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL OpenSSL|Win32'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v120</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - LIB OpenSSL - LIB LibSSH2|Win32'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v120</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v120</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - LIB OpenSSL|Win32'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v120</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - LIB OpenSSL|Win32'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v120</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL OpenSSL - DLL LibSSH2|Win32'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v120</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v120</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL Windows SSPI|Win32'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v120</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL Windows SSPI - DLL WinIDN|Win32'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v120</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL OpenSSL|Win32'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v120</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL Windows SSPI|Win32'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v120</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v120</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL OpenSSL|Win32'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v120</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug|Win32'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v120</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL wolfSSL|Win32'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v120</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug|Win32'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v120</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - LIB wolfSSL|Win32'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v120</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release|Win32'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v120</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - LIB wolfSSL|Win32'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v120</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release|Win32'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v120</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL wolfSSL|Win32'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v120</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL Windows SSPI|x64'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v120</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL Windows SSPI - DLL WinIDN|x64'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v120</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL Windows SSPI|x64'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v120</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL Windows SSPI - DLL WinIDN|x64'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v120</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL OpenSSL - DLL LibSSH2|x64'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v120</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL OpenSSL - DLL LibSSH2|x64'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v120</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL OpenSSL|x64'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v120</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL OpenSSL|x64'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v120</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - LIB OpenSSL - LIB LibSSH2|x64'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v120</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - LIB OpenSSL - LIB LibSSH2|x64'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v120</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - LIB OpenSSL|x64'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v120</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - LIB OpenSSL|x64'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v120</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL OpenSSL - DLL LibSSH2|x64'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v120</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL OpenSSL - DLL LibSSH2|x64'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v120</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL Windows SSPI|x64'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v120</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL Windows SSPI - DLL WinIDN|x64'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v120</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL OpenSSL|x64'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v120</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL Windows SSPI|x64'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v120</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL Windows SSPI - DLL WinIDN|x64'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v120</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL OpenSSL|x64'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v120</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug|x64'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v120</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL wolfSSL|x64'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v120</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug|x64'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v120</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - LIB wolfSSL|x64'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v120</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release|x64'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v120</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - LIB wolfSSL|x64'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v120</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release|x64'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v120</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL wolfSSL|x64'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v120</PlatformToolset>\r
   </PropertyGroup>\r
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />\r
     <ClCompile Include="..\..\..\..\src\tool_panykey.c" />\r
     <ClCompile Include="..\..\..\..\src\tool_paramhlp.c" />\r
     <ClCompile Include="..\..\..\..\src\tool_parsecfg.c" />\r
+    <ClCompile Include="..\..\..\..\src\tool_progress.c" />\r
     <ClCompile Include="..\..\..\..\src\tool_setopt.c" />\r
     <ClCompile Include="..\..\..\..\src\tool_sleep.c" />\r
     <ClCompile Include="..\..\..\..\src\tool_strdup.c" />\r
     <ClInclude Include="..\..\..\..\src\tool_panykey.h" />\r
     <ClInclude Include="..\..\..\..\src\tool_paramhlp.h" />\r
     <ClInclude Include="..\..\..\..\src\tool_parsecfg.h" />\r
+    <ClInclude Include="..\..\..\..\src\tool_progress.h" />\r
     <ClInclude Include="..\..\..\..\src\tool_sdecls.h" />\r
     <ClInclude Include="..\..\..\..\src\tool_setopt.h" />\r
     <ClInclude Include="..\..\..\..\src\tool_setup.h" />\r
index 05820e1..02bccc5 100644 (file)
-Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio 2015
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "curl", "src\curl.vcxproj", "{5228E9CE-A216-422F-A5E6-58E95E2DD71D}"
-       ProjectSection(ProjectDependencies) = postProject
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB} = {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}
-       EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libcurl", "lib\libcurl.vcxproj", "{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}"
-EndProject
-Global
-       GlobalSection(SolutionConfigurationPlatforms) = preSolution
-               DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               DLL Debug - DLL OpenSSL - DLL LibSSH2|x64 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
-               DLL Debug - DLL OpenSSL|Win32 = DLL Debug - DLL OpenSSL|Win32
-               DLL Debug - DLL OpenSSL|x64 = DLL Debug - DLL OpenSSL|x64
-               DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               DLL Debug - DLL Windows SSPI - DLL WinIDN|x64 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
-               DLL Debug - DLL Windows SSPI|Win32 = DLL Debug - DLL Windows SSPI|Win32
-               DLL Debug - DLL Windows SSPI|x64 = DLL Debug - DLL Windows SSPI|x64
-               DLL Debug - DLL wolfSSL|Win32 = DLL Debug - DLL wolfSSL|Win32
-               DLL Debug - DLL wolfSSL|x64 = DLL Debug - DLL wolfSSL|x64
-               DLL Debug|Win32 = DLL Debug|Win32
-               DLL Debug|x64 = DLL Debug|x64
-               DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
-               DLL Release - DLL OpenSSL - DLL LibSSH2|x64 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
-               DLL Release - DLL OpenSSL|Win32 = DLL Release - DLL OpenSSL|Win32
-               DLL Release - DLL OpenSSL|x64 = DLL Release - DLL OpenSSL|x64
-               DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
-               DLL Release - DLL Windows SSPI - DLL WinIDN|x64 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
-               DLL Release - DLL Windows SSPI|Win32 = DLL Release - DLL Windows SSPI|Win32
-               DLL Release - DLL Windows SSPI|x64 = DLL Release - DLL Windows SSPI|x64
-               DLL Release - DLL wolfSSL|Win32 = DLL Release - DLL wolfSSL|Win32
-               DLL Release - DLL wolfSSL|x64 = DLL Release - DLL wolfSSL|x64
-               DLL Release|Win32 = DLL Release|Win32
-               DLL Release|x64 = DLL Release|x64
-               LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               LIB Debug - DLL OpenSSL - DLL LibSSH2|x64 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
-               LIB Debug - DLL OpenSSL|Win32 = LIB Debug - DLL OpenSSL|Win32
-               LIB Debug - DLL OpenSSL|x64 = LIB Debug - DLL OpenSSL|x64
-               LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               LIB Debug - DLL Windows SSPI - DLL WinIDN|x64 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
-               LIB Debug - DLL Windows SSPI|Win32 = LIB Debug - DLL Windows SSPI|Win32
-               LIB Debug - DLL Windows SSPI|x64 = LIB Debug - DLL Windows SSPI|x64
-               LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
-               LIB Debug - LIB OpenSSL - LIB LibSSH2|x64 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
-               LIB Debug - LIB OpenSSL|Win32 = LIB Debug - LIB OpenSSL|Win32
-               LIB Debug - LIB OpenSSL|x64 = LIB Debug - LIB OpenSSL|x64
-               LIB Debug - LIB wolfSSL|Win32 = LIB Debug - LIB wolfSSL|Win32
-               LIB Debug - LIB wolfSSL|x64 = LIB Debug - LIB wolfSSL|x64
-               LIB Debug|Win32 = LIB Debug|Win32
-               LIB Debug|x64 = LIB Debug|x64
-               LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
-               LIB Release - DLL OpenSSL - DLL LibSSH2|x64 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
-               LIB Release - DLL OpenSSL|Win32 = LIB Release - DLL OpenSSL|Win32
-               LIB Release - DLL OpenSSL|x64 = LIB Release - DLL OpenSSL|x64
-               LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
-               LIB Release - DLL Windows SSPI - DLL WinIDN|x64 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
-               LIB Release - DLL Windows SSPI|Win32 = LIB Release - DLL Windows SSPI|Win32
-               LIB Release - DLL Windows SSPI|x64 = LIB Release - DLL Windows SSPI|x64
-               LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
-               LIB Release - LIB OpenSSL - LIB LibSSH2|x64 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
-               LIB Release - LIB OpenSSL|Win32 = LIB Release - LIB OpenSSL|Win32
-               LIB Release - LIB OpenSSL|x64 = LIB Release - LIB OpenSSL|x64
-               LIB Release - LIB wolfSSL|Win32 = LIB Release - LIB wolfSSL|Win32
-               LIB Release - LIB wolfSSL|x64 = LIB Release - LIB wolfSSL|x64
-               LIB Release|Win32 = LIB Release|Win32
-               LIB Release|x64 = LIB Release|x64
-       EndGlobalSection
-       GlobalSection(ProjectConfigurationPlatforms) = postSolution
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|Win32.ActiveCfg = DLL Debug - DLL OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|Win32.Build.0 = DLL Debug - DLL OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|x64.ActiveCfg = DLL Debug - DLL OpenSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|x64.Build.0 = DLL Debug - DLL OpenSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|Win32.Build.0 = DLL Debug - DLL Windows SSPI|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|x64.ActiveCfg = DLL Debug - DLL Windows SSPI|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|x64.Build.0 = DLL Debug - DLL Windows SSPI|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL wolfSSL|Win32.ActiveCfg = DLL Debug - DLL wolfSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL wolfSSL|Win32.Build.0 = DLL Debug - DLL wolfSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL wolfSSL|x64.ActiveCfg = DLL Debug - DLL wolfSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL wolfSSL|x64.Build.0 = DLL Debug - DLL wolfSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|Win32.Build.0 = DLL Debug|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|x64.ActiveCfg = DLL Debug|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|x64.Build.0 = DLL Debug|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|Win32.ActiveCfg = DLL Release - DLL OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|Win32.Build.0 = DLL Release - DLL OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|x64.ActiveCfg = DLL Release - DLL OpenSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|x64.Build.0 = DLL Release - DLL OpenSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|Win32.ActiveCfg = DLL Release - DLL Windows SSPI|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|Win32.Build.0 = DLL Release - DLL Windows SSPI|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|x64.ActiveCfg = DLL Release - DLL Windows SSPI|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|x64.Build.0 = DLL Release - DLL Windows SSPI|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL wolfSSL|Win32.ActiveCfg = DLL Release - DLL wolfSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL wolfSSL|Win32.Build.0 = DLL Release - DLL wolfSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL wolfSSL|x64.ActiveCfg = DLL Release - DLL wolfSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL wolfSSL|x64.Build.0 = DLL Release - DLL wolfSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|Win32.ActiveCfg = DLL Release|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|Win32.Build.0 = DLL Release|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|x64.ActiveCfg = DLL Release|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|x64.Build.0 = DLL Release|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|Win32.ActiveCfg = LIB Debug - DLL OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|Win32.Build.0 = LIB Debug - DLL OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|x64.ActiveCfg = LIB Debug - DLL OpenSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|x64.Build.0 = LIB Debug - DLL OpenSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|Win32.Build.0 = LIB Debug - DLL Windows SSPI|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|x64.ActiveCfg = LIB Debug - DLL Windows SSPI|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|x64.Build.0 = LIB Debug - DLL Windows SSPI|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|Win32.ActiveCfg = LIB Debug - LIB OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|Win32.Build.0 = LIB Debug - LIB OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|x64.ActiveCfg = LIB Debug - LIB OpenSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|x64.Build.0 = LIB Debug - LIB OpenSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB wolfSSL|Win32.ActiveCfg = LIB Debug - LIB wolfSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB wolfSSL|Win32.Build.0 = LIB Debug - LIB wolfSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB wolfSSL|x64.ActiveCfg = LIB Debug - LIB wolfSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB wolfSSL|x64.Build.0 = LIB Debug - LIB wolfSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|Win32.ActiveCfg = LIB Debug|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|Win32.Build.0 = LIB Debug|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|x64.ActiveCfg = LIB Debug|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|x64.Build.0 = LIB Debug|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|Win32.ActiveCfg = LIB Release - DLL OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|Win32.Build.0 = LIB Release - DLL OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|x64.ActiveCfg = LIB Release - DLL OpenSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|x64.Build.0 = LIB Release - DLL OpenSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|Win32.ActiveCfg = LIB Release - DLL Windows SSPI|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|Win32.Build.0 = LIB Release - DLL Windows SSPI|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|x64.ActiveCfg = LIB Release - DLL Windows SSPI|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|x64.Build.0 = LIB Release - DLL Windows SSPI|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|Win32.ActiveCfg = LIB Release - LIB OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|Win32.Build.0 = LIB Release - LIB OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|x64.ActiveCfg = LIB Release - LIB OpenSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|x64.Build.0 = LIB Release - LIB OpenSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB wolfSSL|Win32.ActiveCfg = LIB Release - LIB wolfSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB wolfSSL|Win32.Build.0 = LIB Release - LIB wolfSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB wolfSSL|x64.ActiveCfg = LIB Release - LIB wolfSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB wolfSSL|x64.Build.0 = LIB Release - LIB wolfSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|Win32.ActiveCfg = LIB Release|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|Win32.Build.0 = LIB Release|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|x64.ActiveCfg = LIB Release|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|x64.Build.0 = LIB Release|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|Win32.ActiveCfg = DLL Debug - DLL OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|Win32.Build.0 = DLL Debug - DLL OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|x64.ActiveCfg = DLL Debug - DLL OpenSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|x64.Build.0 = DLL Debug - DLL OpenSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|Win32.Build.0 = DLL Debug - DLL Windows SSPI|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|x64.ActiveCfg = DLL Debug - DLL Windows SSPI|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|x64.Build.0 = DLL Debug - DLL Windows SSPI|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL wolfSSL|Win32.ActiveCfg = DLL Debug - DLL wolfSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL wolfSSL|Win32.Build.0 = DLL Debug - DLL wolfSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL wolfSSL|x64.ActiveCfg = DLL Debug - DLL wolfSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL wolfSSL|x64.Build.0 = DLL Debug - DLL wolfSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|Win32.Build.0 = DLL Debug|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|x64.ActiveCfg = DLL Debug|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|x64.Build.0 = DLL Debug|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|Win32.ActiveCfg = DLL Release - DLL OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|Win32.Build.0 = DLL Release - DLL OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|x64.ActiveCfg = DLL Release - DLL OpenSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|x64.Build.0 = DLL Release - DLL OpenSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|Win32.ActiveCfg = DLL Release - DLL Windows SSPI|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|Win32.Build.0 = DLL Release - DLL Windows SSPI|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|x64.ActiveCfg = DLL Release - DLL Windows SSPI|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|x64.Build.0 = DLL Release - DLL Windows SSPI|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL wolfSSL|Win32.ActiveCfg = DLL Release - DLL wolfSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL wolfSSL|Win32.Build.0 = DLL Release - DLL wolfSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL wolfSSL|x64.ActiveCfg = DLL Release - DLL wolfSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL wolfSSL|x64.Build.0 = DLL Release - DLL wolfSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|Win32.ActiveCfg = DLL Release|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|Win32.Build.0 = DLL Release|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|x64.ActiveCfg = DLL Release|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|x64.Build.0 = DLL Release|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|Win32.ActiveCfg = LIB Debug - DLL OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|Win32.Build.0 = LIB Debug - DLL OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|x64.ActiveCfg = LIB Debug - DLL OpenSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|x64.Build.0 = LIB Debug - DLL OpenSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|Win32.Build.0 = LIB Debug - DLL Windows SSPI|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|x64.ActiveCfg = LIB Debug - DLL Windows SSPI|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|x64.Build.0 = LIB Debug - DLL Windows SSPI|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|Win32.ActiveCfg = LIB Debug - LIB OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|Win32.Build.0 = LIB Debug - LIB OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|x64.ActiveCfg = LIB Debug - LIB OpenSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|x64.Build.0 = LIB Debug - LIB OpenSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB wolfSSL|Win32.ActiveCfg = LIB Debug - LIB wolfSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB wolfSSL|Win32.Build.0 = LIB Debug - LIB wolfSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB wolfSSL|x64.ActiveCfg = LIB Debug - LIB wolfSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB wolfSSL|x64.Build.0 = LIB Debug - LIB wolfSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|Win32.ActiveCfg = LIB Debug|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|Win32.Build.0 = LIB Debug|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|x64.ActiveCfg = LIB Debug|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|x64.Build.0 = LIB Debug|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|Win32.ActiveCfg = LIB Release - DLL OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|Win32.Build.0 = LIB Release - DLL OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|x64.ActiveCfg = LIB Release - DLL OpenSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|x64.Build.0 = LIB Release - DLL OpenSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|Win32.ActiveCfg = LIB Release - DLL Windows SSPI|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|Win32.Build.0 = LIB Release - DLL Windows SSPI|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|x64.ActiveCfg = LIB Release - DLL Windows SSPI|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|x64.Build.0 = LIB Release - DLL Windows SSPI|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|Win32.ActiveCfg = LIB Release - LIB OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|Win32.Build.0 = LIB Release - LIB OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|x64.ActiveCfg = LIB Release - LIB OpenSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|x64.Build.0 = LIB Release - LIB OpenSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB wolfSSL|Win32.ActiveCfg = LIB Release - LIB wolfSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB wolfSSL|Win32.Build.0 = LIB Release - LIB wolfSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB wolfSSL|x64.ActiveCfg = LIB Release - LIB wolfSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB wolfSSL|x64.Build.0 = LIB Release - LIB wolfSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|Win32.ActiveCfg = LIB Release|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|Win32.Build.0 = LIB Release|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|x64.ActiveCfg = LIB Release|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|x64.Build.0 = LIB Release|x64
-       EndGlobalSection
-       GlobalSection(SolutionProperties) = preSolution
-               HideSolutionNode = FALSE
-       EndGlobalSection
-EndGlobal
+Microsoft Visual Studio Solution File, Format Version 12.00\r
+# Visual Studio 2015\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "curl", "src\curl.vcxproj", "{5228E9CE-A216-422F-A5E6-58E95E2DD71D}"\r
+       ProjectSection(ProjectDependencies) = postProject\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB} = {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}\r
+       EndProjectSection\r
+EndProject\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libcurl", "lib\libcurl.vcxproj", "{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}"\r
+EndProject\r
+Global\r
+       GlobalSection(SolutionConfigurationPlatforms) = preSolution\r
+               DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               DLL Debug - DLL OpenSSL - DLL LibSSH2|x64 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64\r
+               DLL Debug - DLL OpenSSL|Win32 = DLL Debug - DLL OpenSSL|Win32\r
+               DLL Debug - DLL OpenSSL|x64 = DLL Debug - DLL OpenSSL|x64\r
+               DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               DLL Debug - DLL Windows SSPI - DLL WinIDN|x64 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64\r
+               DLL Debug - DLL Windows SSPI|Win32 = DLL Debug - DLL Windows SSPI|Win32\r
+               DLL Debug - DLL Windows SSPI|x64 = DLL Debug - DLL Windows SSPI|x64\r
+               DLL Debug - DLL wolfSSL|Win32 = DLL Debug - DLL wolfSSL|Win32\r
+               DLL Debug - DLL wolfSSL|x64 = DLL Debug - DLL wolfSSL|x64\r
+               DLL Debug|Win32 = DLL Debug|Win32\r
+               DLL Debug|x64 = DLL Debug|x64\r
+               DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               DLL Release - DLL OpenSSL - DLL LibSSH2|x64 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64\r
+               DLL Release - DLL OpenSSL|Win32 = DLL Release - DLL OpenSSL|Win32\r
+               DLL Release - DLL OpenSSL|x64 = DLL Release - DLL OpenSSL|x64\r
+               DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               DLL Release - DLL Windows SSPI - DLL WinIDN|x64 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64\r
+               DLL Release - DLL Windows SSPI|Win32 = DLL Release - DLL Windows SSPI|Win32\r
+               DLL Release - DLL Windows SSPI|x64 = DLL Release - DLL Windows SSPI|x64\r
+               DLL Release - DLL wolfSSL|Win32 = DLL Release - DLL wolfSSL|Win32\r
+               DLL Release - DLL wolfSSL|x64 = DLL Release - DLL wolfSSL|x64\r
+               DLL Release|Win32 = DLL Release|Win32\r
+               DLL Release|x64 = DLL Release|x64\r
+               LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               LIB Debug - DLL OpenSSL - DLL LibSSH2|x64 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64\r
+               LIB Debug - DLL OpenSSL|Win32 = LIB Debug - DLL OpenSSL|Win32\r
+               LIB Debug - DLL OpenSSL|x64 = LIB Debug - DLL OpenSSL|x64\r
+               LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               LIB Debug - DLL Windows SSPI - DLL WinIDN|x64 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64\r
+               LIB Debug - DLL Windows SSPI|Win32 = LIB Debug - DLL Windows SSPI|Win32\r
+               LIB Debug - DLL Windows SSPI|x64 = LIB Debug - DLL Windows SSPI|x64\r
+               LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32\r
+               LIB Debug - LIB OpenSSL - LIB LibSSH2|x64 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64\r
+               LIB Debug - LIB OpenSSL|Win32 = LIB Debug - LIB OpenSSL|Win32\r
+               LIB Debug - LIB OpenSSL|x64 = LIB Debug - LIB OpenSSL|x64\r
+               LIB Debug - LIB wolfSSL|Win32 = LIB Debug - LIB wolfSSL|Win32\r
+               LIB Debug - LIB wolfSSL|x64 = LIB Debug - LIB wolfSSL|x64\r
+               LIB Debug|Win32 = LIB Debug|Win32\r
+               LIB Debug|x64 = LIB Debug|x64\r
+               LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               LIB Release - DLL OpenSSL - DLL LibSSH2|x64 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64\r
+               LIB Release - DLL OpenSSL|Win32 = LIB Release - DLL OpenSSL|Win32\r
+               LIB Release - DLL OpenSSL|x64 = LIB Release - DLL OpenSSL|x64\r
+               LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               LIB Release - DLL Windows SSPI - DLL WinIDN|x64 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64\r
+               LIB Release - DLL Windows SSPI|Win32 = LIB Release - DLL Windows SSPI|Win32\r
+               LIB Release - DLL Windows SSPI|x64 = LIB Release - DLL Windows SSPI|x64\r
+               LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32\r
+               LIB Release - LIB OpenSSL - LIB LibSSH2|x64 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64\r
+               LIB Release - LIB OpenSSL|Win32 = LIB Release - LIB OpenSSL|Win32\r
+               LIB Release - LIB OpenSSL|x64 = LIB Release - LIB OpenSSL|x64\r
+               LIB Release - LIB wolfSSL|Win32 = LIB Release - LIB wolfSSL|Win32\r
+               LIB Release - LIB wolfSSL|x64 = LIB Release - LIB wolfSSL|x64\r
+               LIB Release|Win32 = LIB Release|Win32\r
+               LIB Release|x64 = LIB Release|x64\r
+       EndGlobalSection\r
+       GlobalSection(ProjectConfigurationPlatforms) = postSolution\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|Win32.ActiveCfg = DLL Debug - DLL OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|Win32.Build.0 = DLL Debug - DLL OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|x64.ActiveCfg = DLL Debug - DLL OpenSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|x64.Build.0 = DLL Debug - DLL OpenSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|Win32.Build.0 = DLL Debug - DLL Windows SSPI|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|x64.ActiveCfg = DLL Debug - DLL Windows SSPI|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|x64.Build.0 = DLL Debug - DLL Windows SSPI|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL wolfSSL|Win32.ActiveCfg = DLL Debug - DLL wolfSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL wolfSSL|Win32.Build.0 = DLL Debug - DLL wolfSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL wolfSSL|x64.ActiveCfg = DLL Debug - DLL wolfSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL wolfSSL|x64.Build.0 = DLL Debug - DLL wolfSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|Win32.Build.0 = DLL Debug|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|x64.ActiveCfg = DLL Debug|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|x64.Build.0 = DLL Debug|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|Win32.ActiveCfg = DLL Release - DLL OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|Win32.Build.0 = DLL Release - DLL OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|x64.ActiveCfg = DLL Release - DLL OpenSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|x64.Build.0 = DLL Release - DLL OpenSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|Win32.ActiveCfg = DLL Release - DLL Windows SSPI|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|Win32.Build.0 = DLL Release - DLL Windows SSPI|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|x64.ActiveCfg = DLL Release - DLL Windows SSPI|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|x64.Build.0 = DLL Release - DLL Windows SSPI|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL wolfSSL|Win32.ActiveCfg = DLL Release - DLL wolfSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL wolfSSL|Win32.Build.0 = DLL Release - DLL wolfSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL wolfSSL|x64.ActiveCfg = DLL Release - DLL wolfSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL wolfSSL|x64.Build.0 = DLL Release - DLL wolfSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|Win32.ActiveCfg = DLL Release|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|Win32.Build.0 = DLL Release|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|x64.ActiveCfg = DLL Release|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|x64.Build.0 = DLL Release|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|Win32.ActiveCfg = LIB Debug - DLL OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|Win32.Build.0 = LIB Debug - DLL OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|x64.ActiveCfg = LIB Debug - DLL OpenSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|x64.Build.0 = LIB Debug - DLL OpenSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|Win32.Build.0 = LIB Debug - DLL Windows SSPI|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|x64.ActiveCfg = LIB Debug - DLL Windows SSPI|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|x64.Build.0 = LIB Debug - DLL Windows SSPI|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|Win32.ActiveCfg = LIB Debug - LIB OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|Win32.Build.0 = LIB Debug - LIB OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|x64.ActiveCfg = LIB Debug - LIB OpenSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|x64.Build.0 = LIB Debug - LIB OpenSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB wolfSSL|Win32.ActiveCfg = LIB Debug - LIB wolfSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB wolfSSL|Win32.Build.0 = LIB Debug - LIB wolfSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB wolfSSL|x64.ActiveCfg = LIB Debug - LIB wolfSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB wolfSSL|x64.Build.0 = LIB Debug - LIB wolfSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|Win32.ActiveCfg = LIB Debug|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|Win32.Build.0 = LIB Debug|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|x64.ActiveCfg = LIB Debug|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|x64.Build.0 = LIB Debug|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|Win32.ActiveCfg = LIB Release - DLL OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|Win32.Build.0 = LIB Release - DLL OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|x64.ActiveCfg = LIB Release - DLL OpenSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|x64.Build.0 = LIB Release - DLL OpenSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|Win32.ActiveCfg = LIB Release - DLL Windows SSPI|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|Win32.Build.0 = LIB Release - DLL Windows SSPI|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|x64.ActiveCfg = LIB Release - DLL Windows SSPI|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|x64.Build.0 = LIB Release - DLL Windows SSPI|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|Win32.ActiveCfg = LIB Release - LIB OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|Win32.Build.0 = LIB Release - LIB OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|x64.ActiveCfg = LIB Release - LIB OpenSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|x64.Build.0 = LIB Release - LIB OpenSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB wolfSSL|Win32.ActiveCfg = LIB Release - LIB wolfSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB wolfSSL|Win32.Build.0 = LIB Release - LIB wolfSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB wolfSSL|x64.ActiveCfg = LIB Release - LIB wolfSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB wolfSSL|x64.Build.0 = LIB Release - LIB wolfSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|Win32.ActiveCfg = LIB Release|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|Win32.Build.0 = LIB Release|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|x64.ActiveCfg = LIB Release|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|x64.Build.0 = LIB Release|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|Win32.ActiveCfg = DLL Debug - DLL OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|Win32.Build.0 = DLL Debug - DLL OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|x64.ActiveCfg = DLL Debug - DLL OpenSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|x64.Build.0 = DLL Debug - DLL OpenSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|Win32.Build.0 = DLL Debug - DLL Windows SSPI|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|x64.ActiveCfg = DLL Debug - DLL Windows SSPI|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|x64.Build.0 = DLL Debug - DLL Windows SSPI|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL wolfSSL|Win32.ActiveCfg = DLL Debug - DLL wolfSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL wolfSSL|Win32.Build.0 = DLL Debug - DLL wolfSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL wolfSSL|x64.ActiveCfg = DLL Debug - DLL wolfSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL wolfSSL|x64.Build.0 = DLL Debug - DLL wolfSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|Win32.Build.0 = DLL Debug|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|x64.ActiveCfg = DLL Debug|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|x64.Build.0 = DLL Debug|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|Win32.ActiveCfg = DLL Release - DLL OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|Win32.Build.0 = DLL Release - DLL OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|x64.ActiveCfg = DLL Release - DLL OpenSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|x64.Build.0 = DLL Release - DLL OpenSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|Win32.ActiveCfg = DLL Release - DLL Windows SSPI|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|Win32.Build.0 = DLL Release - DLL Windows SSPI|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|x64.ActiveCfg = DLL Release - DLL Windows SSPI|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|x64.Build.0 = DLL Release - DLL Windows SSPI|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL wolfSSL|Win32.ActiveCfg = DLL Release - DLL wolfSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL wolfSSL|Win32.Build.0 = DLL Release - DLL wolfSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL wolfSSL|x64.ActiveCfg = DLL Release - DLL wolfSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL wolfSSL|x64.Build.0 = DLL Release - DLL wolfSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|Win32.ActiveCfg = DLL Release|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|Win32.Build.0 = DLL Release|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|x64.ActiveCfg = DLL Release|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|x64.Build.0 = DLL Release|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|Win32.ActiveCfg = LIB Debug - DLL OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|Win32.Build.0 = LIB Debug - DLL OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|x64.ActiveCfg = LIB Debug - DLL OpenSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|x64.Build.0 = LIB Debug - DLL OpenSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|Win32.Build.0 = LIB Debug - DLL Windows SSPI|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|x64.ActiveCfg = LIB Debug - DLL Windows SSPI|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|x64.Build.0 = LIB Debug - DLL Windows SSPI|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|Win32.ActiveCfg = LIB Debug - LIB OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|Win32.Build.0 = LIB Debug - LIB OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|x64.ActiveCfg = LIB Debug - LIB OpenSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|x64.Build.0 = LIB Debug - LIB OpenSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB wolfSSL|Win32.ActiveCfg = LIB Debug - LIB wolfSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB wolfSSL|Win32.Build.0 = LIB Debug - LIB wolfSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB wolfSSL|x64.ActiveCfg = LIB Debug - LIB wolfSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB wolfSSL|x64.Build.0 = LIB Debug - LIB wolfSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|Win32.ActiveCfg = LIB Debug|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|Win32.Build.0 = LIB Debug|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|x64.ActiveCfg = LIB Debug|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|x64.Build.0 = LIB Debug|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|Win32.ActiveCfg = LIB Release - DLL OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|Win32.Build.0 = LIB Release - DLL OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|x64.ActiveCfg = LIB Release - DLL OpenSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|x64.Build.0 = LIB Release - DLL OpenSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|Win32.ActiveCfg = LIB Release - DLL Windows SSPI|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|Win32.Build.0 = LIB Release - DLL Windows SSPI|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|x64.ActiveCfg = LIB Release - DLL Windows SSPI|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|x64.Build.0 = LIB Release - DLL Windows SSPI|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|Win32.ActiveCfg = LIB Release - LIB OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|Win32.Build.0 = LIB Release - LIB OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|x64.ActiveCfg = LIB Release - LIB OpenSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|x64.Build.0 = LIB Release - LIB OpenSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB wolfSSL|Win32.ActiveCfg = LIB Release - LIB wolfSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB wolfSSL|Win32.Build.0 = LIB Release - LIB wolfSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB wolfSSL|x64.ActiveCfg = LIB Release - LIB wolfSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB wolfSSL|x64.Build.0 = LIB Release - LIB wolfSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|Win32.ActiveCfg = LIB Release|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|Win32.Build.0 = LIB Release|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|x64.ActiveCfg = LIB Release|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|x64.Build.0 = LIB Release|x64\r
+       EndGlobalSection\r
+       GlobalSection(SolutionProperties) = preSolution\r
+               HideSolutionNode = FALSE\r
+       EndGlobalSection\r
+EndGlobal\r
index cd8afe2..f768b6d 100644 (file)
-Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio 2015
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libcurl", "libcurl.vcxproj", "{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}"
-EndProject
-Global
-       GlobalSection(SolutionConfigurationPlatforms) = preSolution
-               DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               DLL Debug - DLL OpenSSL - DLL LibSSH2|x64 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
-               DLL Debug - DLL OpenSSL|Win32 = DLL Debug - DLL OpenSSL|Win32
-               DLL Debug - DLL OpenSSL|x64 = DLL Debug - DLL OpenSSL|x64
-               DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               DLL Debug - DLL Windows SSPI - DLL WinIDN|x64 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
-               DLL Debug - DLL Windows SSPI|Win32 = DLL Debug - DLL Windows SSPI|Win32
-               DLL Debug - DLL Windows SSPI|x64 = DLL Debug - DLL Windows SSPI|x64
-               DLL Debug - DLL wolfSSL|Win32 = DLL Debug - DLL wolfSSL|Win32
-               DLL Debug - DLL wolfSSL|x64 = DLL Debug - DLL wolfSSL|x64
-               DLL Debug|Win32 = DLL Debug|Win32
-               DLL Debug|x64 = DLL Debug|x64
-               DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
-               DLL Release - DLL OpenSSL - DLL LibSSH2|x64 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
-               DLL Release - DLL OpenSSL|Win32 = DLL Release - DLL OpenSSL|Win32
-               DLL Release - DLL OpenSSL|x64 = DLL Release - DLL OpenSSL|x64
-               DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
-               DLL Release - DLL Windows SSPI - DLL WinIDN|x64 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
-               DLL Release - DLL Windows SSPI|Win32 = DLL Release - DLL Windows SSPI|Win32
-               DLL Release - DLL Windows SSPI|x64 = DLL Release - DLL Windows SSPI|x64
-               DLL Release - DLL wolfSSL|Win32 = DLL Release - DLL wolfSSL|Win32
-               DLL Release - DLL wolfSSL|x64 = DLL Release - DLL wolfSSL|x64
-               DLL Release|Win32 = DLL Release|Win32
-               DLL Release|x64 = DLL Release|x64
-               LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               LIB Debug - DLL OpenSSL - DLL LibSSH2|x64 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
-               LIB Debug - DLL OpenSSL|Win32 = LIB Debug - DLL OpenSSL|Win32
-               LIB Debug - DLL OpenSSL|x64 = LIB Debug - DLL OpenSSL|x64
-               LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               LIB Debug - DLL Windows SSPI - DLL WinIDN|x64 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
-               LIB Debug - DLL Windows SSPI|Win32 = LIB Debug - DLL Windows SSPI|Win32
-               LIB Debug - DLL Windows SSPI|x64 = LIB Debug - DLL Windows SSPI|x64
-               LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
-               LIB Debug - LIB OpenSSL - LIB LibSSH2|x64 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
-               LIB Debug - LIB OpenSSL|Win32 = LIB Debug - LIB OpenSSL|Win32
-               LIB Debug - LIB OpenSSL|x64 = LIB Debug - LIB OpenSSL|x64
-               LIB Debug - LIB wolfSSL|Win32 = LIB Debug - LIB wolfSSL|Win32
-               LIB Debug - LIB wolfSSL|x64 = LIB Debug - LIB wolfSSL|x64
-               LIB Debug|Win32 = LIB Debug|Win32
-               LIB Debug|x64 = LIB Debug|x64
-               LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
-               LIB Release - DLL OpenSSL - DLL LibSSH2|x64 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
-               LIB Release - DLL OpenSSL|Win32 = LIB Release - DLL OpenSSL|Win32
-               LIB Release - DLL OpenSSL|x64 = LIB Release - DLL OpenSSL|x64
-               LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
-               LIB Release - DLL Windows SSPI - DLL WinIDN|x64 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
-               LIB Release - DLL Windows SSPI|Win32 = LIB Release - DLL Windows SSPI|Win32
-               LIB Release - DLL Windows SSPI|x64 = LIB Release - DLL Windows SSPI|x64
-               LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
-               LIB Release - LIB OpenSSL - LIB LibSSH2|x64 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
-               LIB Release - LIB OpenSSL|Win32 = LIB Release - LIB OpenSSL|Win32
-               LIB Release - LIB OpenSSL|x64 = LIB Release - LIB OpenSSL|x64
-               LIB Release - LIB wolfSSL|Win32 = LIB Release - LIB wolfSSL|Win32
-               LIB Release - LIB wolfSSL|x64 = LIB Release - LIB wolfSSL|x64
-               LIB Release|Win32 = LIB Release|Win32
-               LIB Release|x64 = LIB Release|x64
-       EndGlobalSection
-       GlobalSection(ProjectConfigurationPlatforms) = postSolution
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|Win32.ActiveCfg = DLL Debug - DLL OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|Win32.Build.0 = DLL Debug - DLL OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|x64.ActiveCfg = DLL Debug - DLL OpenSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|x64.Build.0 = DLL Debug - DLL OpenSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|Win32.Build.0 = DLL Debug - DLL Windows SSPI|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|x64.ActiveCfg = DLL Debug - DLL Windows SSPI|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|x64.Build.0 = DLL Debug - DLL Windows SSPI|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL wolfSSL|Win32.ActiveCfg = DLL Debug - DLL wolfSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL wolfSSL|Win32.Build.0 = DLL Debug - DLL wolfSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL wolfSSL|x64.ActiveCfg = DLL Debug - DLL wolfSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL wolfSSL|x64.Build.0 = DLL Debug - DLL wolfSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|Win32.Build.0 = DLL Debug|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|x64.ActiveCfg = DLL Debug|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|x64.Build.0 = DLL Debug|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|Win32.ActiveCfg = DLL Release - DLL OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|Win32.Build.0 = DLL Release - DLL OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|x64.ActiveCfg = DLL Release - DLL OpenSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|x64.Build.0 = DLL Release - DLL OpenSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|Win32.ActiveCfg = DLL Release - DLL Windows SSPI|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|Win32.Build.0 = DLL Release - DLL Windows SSPI|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|x64.ActiveCfg = DLL Release - DLL Windows SSPI|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|x64.Build.0 = DLL Release - DLL Windows SSPI|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL wolfSSL|Win32.ActiveCfg = DLL Release - DLL wolfSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL wolfSSL|Win32.Build.0 = DLL Release - DLL wolfSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL wolfSSL|x64.ActiveCfg = DLL Release - DLL wolfSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL wolfSSL|x64.Build.0 = DLL Release - DLL wolfSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|Win32.ActiveCfg = DLL Release|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|Win32.Build.0 = DLL Release|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|x64.ActiveCfg = DLL Release|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|x64.Build.0 = DLL Release|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|Win32.ActiveCfg = LIB Debug - DLL OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|Win32.Build.0 = LIB Debug - DLL OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|x64.ActiveCfg = LIB Debug - DLL OpenSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|x64.Build.0 = LIB Debug - DLL OpenSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|Win32.Build.0 = LIB Debug - DLL Windows SSPI|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|x64.ActiveCfg = LIB Debug - DLL Windows SSPI|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|x64.Build.0 = LIB Debug - DLL Windows SSPI|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|Win32.ActiveCfg = LIB Debug - LIB OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|Win32.Build.0 = LIB Debug - LIB OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|x64.ActiveCfg = LIB Debug - LIB OpenSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|x64.Build.0 = LIB Debug - LIB OpenSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB wolfSSL|Win32.ActiveCfg = LIB Debug - LIB wolfSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB wolfSSL|Win32.Build.0 = LIB Debug - LIB wolfSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB wolfSSL|x64.ActiveCfg = LIB Debug - LIB wolfSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB wolfSSL|x64.Build.0 = LIB Debug - LIB wolfSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|Win32.ActiveCfg = LIB Debug|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|Win32.Build.0 = LIB Debug|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|x64.ActiveCfg = LIB Debug|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|x64.Build.0 = LIB Debug|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|Win32.ActiveCfg = LIB Release - DLL OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|Win32.Build.0 = LIB Release - DLL OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|x64.ActiveCfg = LIB Release - DLL OpenSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|x64.Build.0 = LIB Release - DLL OpenSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|Win32.ActiveCfg = LIB Release - DLL Windows SSPI|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|Win32.Build.0 = LIB Release - DLL Windows SSPI|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|x64.ActiveCfg = LIB Release - DLL Windows SSPI|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|x64.Build.0 = LIB Release - DLL Windows SSPI|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|Win32.ActiveCfg = LIB Release - LIB OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|Win32.Build.0 = LIB Release - LIB OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|x64.ActiveCfg = LIB Release - LIB OpenSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|x64.Build.0 = LIB Release - LIB OpenSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB wolfSSL|Win32.ActiveCfg = LIB Release - LIB wolfSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB wolfSSL|Win32.Build.0 = LIB Release - LIB wolfSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB wolfSSL|x64.ActiveCfg = LIB Release - LIB wolfSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB wolfSSL|x64.Build.0 = LIB Release - LIB wolfSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|Win32.ActiveCfg = LIB Release|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|Win32.Build.0 = LIB Release|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|x64.ActiveCfg = LIB Release|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|x64.Build.0 = LIB Release|x64
-       EndGlobalSection
-       GlobalSection(SolutionProperties) = preSolution
-               HideSolutionNode = FALSE
-       EndGlobalSection
-EndGlobal
+Microsoft Visual Studio Solution File, Format Version 12.00\r
+# Visual Studio 2015\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libcurl", "libcurl.vcxproj", "{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}"\r
+EndProject\r
+Global\r
+       GlobalSection(SolutionConfigurationPlatforms) = preSolution\r
+               DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               DLL Debug - DLL OpenSSL - DLL LibSSH2|x64 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64\r
+               DLL Debug - DLL OpenSSL|Win32 = DLL Debug - DLL OpenSSL|Win32\r
+               DLL Debug - DLL OpenSSL|x64 = DLL Debug - DLL OpenSSL|x64\r
+               DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               DLL Debug - DLL Windows SSPI - DLL WinIDN|x64 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64\r
+               DLL Debug - DLL Windows SSPI|Win32 = DLL Debug - DLL Windows SSPI|Win32\r
+               DLL Debug - DLL Windows SSPI|x64 = DLL Debug - DLL Windows SSPI|x64\r
+               DLL Debug - DLL wolfSSL|Win32 = DLL Debug - DLL wolfSSL|Win32\r
+               DLL Debug - DLL wolfSSL|x64 = DLL Debug - DLL wolfSSL|x64\r
+               DLL Debug|Win32 = DLL Debug|Win32\r
+               DLL Debug|x64 = DLL Debug|x64\r
+               DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               DLL Release - DLL OpenSSL - DLL LibSSH2|x64 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64\r
+               DLL Release - DLL OpenSSL|Win32 = DLL Release - DLL OpenSSL|Win32\r
+               DLL Release - DLL OpenSSL|x64 = DLL Release - DLL OpenSSL|x64\r
+               DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               DLL Release - DLL Windows SSPI - DLL WinIDN|x64 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64\r
+               DLL Release - DLL Windows SSPI|Win32 = DLL Release - DLL Windows SSPI|Win32\r
+               DLL Release - DLL Windows SSPI|x64 = DLL Release - DLL Windows SSPI|x64\r
+               DLL Release - DLL wolfSSL|Win32 = DLL Release - DLL wolfSSL|Win32\r
+               DLL Release - DLL wolfSSL|x64 = DLL Release - DLL wolfSSL|x64\r
+               DLL Release|Win32 = DLL Release|Win32\r
+               DLL Release|x64 = DLL Release|x64\r
+               LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               LIB Debug - DLL OpenSSL - DLL LibSSH2|x64 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64\r
+               LIB Debug - DLL OpenSSL|Win32 = LIB Debug - DLL OpenSSL|Win32\r
+               LIB Debug - DLL OpenSSL|x64 = LIB Debug - DLL OpenSSL|x64\r
+               LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               LIB Debug - DLL Windows SSPI - DLL WinIDN|x64 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64\r
+               LIB Debug - DLL Windows SSPI|Win32 = LIB Debug - DLL Windows SSPI|Win32\r
+               LIB Debug - DLL Windows SSPI|x64 = LIB Debug - DLL Windows SSPI|x64\r
+               LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32\r
+               LIB Debug - LIB OpenSSL - LIB LibSSH2|x64 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64\r
+               LIB Debug - LIB OpenSSL|Win32 = LIB Debug - LIB OpenSSL|Win32\r
+               LIB Debug - LIB OpenSSL|x64 = LIB Debug - LIB OpenSSL|x64\r
+               LIB Debug - LIB wolfSSL|Win32 = LIB Debug - LIB wolfSSL|Win32\r
+               LIB Debug - LIB wolfSSL|x64 = LIB Debug - LIB wolfSSL|x64\r
+               LIB Debug|Win32 = LIB Debug|Win32\r
+               LIB Debug|x64 = LIB Debug|x64\r
+               LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               LIB Release - DLL OpenSSL - DLL LibSSH2|x64 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64\r
+               LIB Release - DLL OpenSSL|Win32 = LIB Release - DLL OpenSSL|Win32\r
+               LIB Release - DLL OpenSSL|x64 = LIB Release - DLL OpenSSL|x64\r
+               LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               LIB Release - DLL Windows SSPI - DLL WinIDN|x64 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64\r
+               LIB Release - DLL Windows SSPI|Win32 = LIB Release - DLL Windows SSPI|Win32\r
+               LIB Release - DLL Windows SSPI|x64 = LIB Release - DLL Windows SSPI|x64\r
+               LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32\r
+               LIB Release - LIB OpenSSL - LIB LibSSH2|x64 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64\r
+               LIB Release - LIB OpenSSL|Win32 = LIB Release - LIB OpenSSL|Win32\r
+               LIB Release - LIB OpenSSL|x64 = LIB Release - LIB OpenSSL|x64\r
+               LIB Release - LIB wolfSSL|Win32 = LIB Release - LIB wolfSSL|Win32\r
+               LIB Release - LIB wolfSSL|x64 = LIB Release - LIB wolfSSL|x64\r
+               LIB Release|Win32 = LIB Release|Win32\r
+               LIB Release|x64 = LIB Release|x64\r
+       EndGlobalSection\r
+       GlobalSection(ProjectConfigurationPlatforms) = postSolution\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|Win32.ActiveCfg = DLL Debug - DLL OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|Win32.Build.0 = DLL Debug - DLL OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|x64.ActiveCfg = DLL Debug - DLL OpenSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|x64.Build.0 = DLL Debug - DLL OpenSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|Win32.Build.0 = DLL Debug - DLL Windows SSPI|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|x64.ActiveCfg = DLL Debug - DLL Windows SSPI|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|x64.Build.0 = DLL Debug - DLL Windows SSPI|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL wolfSSL|Win32.ActiveCfg = DLL Debug - DLL wolfSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL wolfSSL|Win32.Build.0 = DLL Debug - DLL wolfSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL wolfSSL|x64.ActiveCfg = DLL Debug - DLL wolfSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL wolfSSL|x64.Build.0 = DLL Debug - DLL wolfSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|Win32.Build.0 = DLL Debug|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|x64.ActiveCfg = DLL Debug|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|x64.Build.0 = DLL Debug|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|Win32.ActiveCfg = DLL Release - DLL OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|Win32.Build.0 = DLL Release - DLL OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|x64.ActiveCfg = DLL Release - DLL OpenSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|x64.Build.0 = DLL Release - DLL OpenSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|Win32.ActiveCfg = DLL Release - DLL Windows SSPI|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|Win32.Build.0 = DLL Release - DLL Windows SSPI|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|x64.ActiveCfg = DLL Release - DLL Windows SSPI|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|x64.Build.0 = DLL Release - DLL Windows SSPI|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL wolfSSL|Win32.ActiveCfg = DLL Release - DLL wolfSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL wolfSSL|Win32.Build.0 = DLL Release - DLL wolfSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL wolfSSL|x64.ActiveCfg = DLL Release - DLL wolfSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL wolfSSL|x64.Build.0 = DLL Release - DLL wolfSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|Win32.ActiveCfg = DLL Release|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|Win32.Build.0 = DLL Release|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|x64.ActiveCfg = DLL Release|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|x64.Build.0 = DLL Release|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|Win32.ActiveCfg = LIB Debug - DLL OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|Win32.Build.0 = LIB Debug - DLL OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|x64.ActiveCfg = LIB Debug - DLL OpenSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|x64.Build.0 = LIB Debug - DLL OpenSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|Win32.Build.0 = LIB Debug - DLL Windows SSPI|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|x64.ActiveCfg = LIB Debug - DLL Windows SSPI|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|x64.Build.0 = LIB Debug - DLL Windows SSPI|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|Win32.ActiveCfg = LIB Debug - LIB OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|Win32.Build.0 = LIB Debug - LIB OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|x64.ActiveCfg = LIB Debug - LIB OpenSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|x64.Build.0 = LIB Debug - LIB OpenSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB wolfSSL|Win32.ActiveCfg = LIB Debug - LIB wolfSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB wolfSSL|Win32.Build.0 = LIB Debug - LIB wolfSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB wolfSSL|x64.ActiveCfg = LIB Debug - LIB wolfSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB wolfSSL|x64.Build.0 = LIB Debug - LIB wolfSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|Win32.ActiveCfg = LIB Debug|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|Win32.Build.0 = LIB Debug|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|x64.ActiveCfg = LIB Debug|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|x64.Build.0 = LIB Debug|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|Win32.ActiveCfg = LIB Release - DLL OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|Win32.Build.0 = LIB Release - DLL OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|x64.ActiveCfg = LIB Release - DLL OpenSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|x64.Build.0 = LIB Release - DLL OpenSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|Win32.ActiveCfg = LIB Release - DLL Windows SSPI|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|Win32.Build.0 = LIB Release - DLL Windows SSPI|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|x64.ActiveCfg = LIB Release - DLL Windows SSPI|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|x64.Build.0 = LIB Release - DLL Windows SSPI|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|Win32.ActiveCfg = LIB Release - LIB OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|Win32.Build.0 = LIB Release - LIB OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|x64.ActiveCfg = LIB Release - LIB OpenSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|x64.Build.0 = LIB Release - LIB OpenSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB wolfSSL|Win32.ActiveCfg = LIB Release - LIB wolfSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB wolfSSL|Win32.Build.0 = LIB Release - LIB wolfSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB wolfSSL|x64.ActiveCfg = LIB Release - LIB wolfSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB wolfSSL|x64.Build.0 = LIB Release - LIB wolfSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|Win32.ActiveCfg = LIB Release|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|Win32.Build.0 = LIB Release|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|x64.ActiveCfg = LIB Release|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|x64.Build.0 = LIB Release|x64\r
+       EndGlobalSection\r
+       GlobalSection(SolutionProperties) = preSolution\r
+               HideSolutionNode = FALSE\r
+       EndGlobalSection\r
+EndGlobal\r
index 0305a43..4c1e4bd 100644 (file)
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - LIB OpenSSL - LIB LibSSH2|Win32'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v140</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - LIB OpenSSL|Win32'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v140</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL Windows SSPI|Win32'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v140</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL Windows SSPI - DLL WinIDN|Win32'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v140</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL OpenSSL - DLL LibSSH2|Win32'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v140</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL OpenSSL|Win32'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v140</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v140</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - LIB OpenSSL|Win32'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v140</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL Windows SSPI|Win32'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v140</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v140</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v140</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL OpenSSL|Win32'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v140</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL OpenSSL - DLL LibSSH2|Win32'" Label="Configuration">\r
     <ConfigurationType>DynamicLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v140</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32'" Label="Configuration">\r
     <ConfigurationType>DynamicLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v140</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL Windows SSPI|Win32'" Label="Configuration">\r
     <ConfigurationType>DynamicLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v140</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL Windows SSPI - DLL WinIDN|Win32'" Label="Configuration">\r
     <ConfigurationType>DynamicLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v140</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL Windows SSPI|Win32'" Label="Configuration">\r
     <ConfigurationType>DynamicLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v140</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32'" Label="Configuration">\r
     <ConfigurationType>DynamicLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v140</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL OpenSSL|Win32'" Label="Configuration">\r
     <ConfigurationType>DynamicLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v140</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL OpenSSL|Win32'" Label="Configuration">\r
     <ConfigurationType>DynamicLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v140</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release|Win32'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v140</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - LIB wolfSSL|Win32'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v140</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug|Win32'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v140</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - LIB wolfSSL|Win32'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v140</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release|Win32'" Label="Configuration">\r
     <ConfigurationType>DynamicLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v140</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL wolfSSL|Win32'" Label="Configuration">\r
     <ConfigurationType>DynamicLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v140</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug|Win32'" Label="Configuration">\r
     <ConfigurationType>DynamicLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v140</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL wolfSSL|Win32'" Label="Configuration">\r
     <ConfigurationType>DynamicLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v140</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - LIB OpenSSL - LIB LibSSH2|x64'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v140</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - LIB OpenSSL|x64'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v140</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL Windows SSPI|x64'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v140</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL Windows SSPI - DLL WinIDN|x64'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v140</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL OpenSSL - DLL LibSSH2|x64'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v140</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL OpenSSL|x64'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v140</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - LIB OpenSSL - LIB LibSSH2|x64'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v140</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - LIB OpenSSL|x64'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v140</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL Windows SSPI|x64'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v140</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL Windows SSPI - DLL WinIDN|x64'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v140</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL OpenSSL - DLL LibSSH2|x64'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v140</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL OpenSSL|x64'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v140</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL OpenSSL - DLL LibSSH2|x64'" Label="Configuration">\r
     <ConfigurationType>DynamicLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v140</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL OpenSSL - DLL LibSSH2|x64'" Label="Configuration">\r
     <ConfigurationType>DynamicLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v140</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL Windows SSPI|x64'" Label="Configuration">\r
     <ConfigurationType>DynamicLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v140</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL Windows SSPI - DLL WinIDN|x64'" Label="Configuration">\r
     <ConfigurationType>DynamicLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v140</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL Windows SSPI|x64'" Label="Configuration">\r
     <ConfigurationType>DynamicLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v140</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL Windows SSPI - DLL WinIDN|x64'" Label="Configuration">\r
     <ConfigurationType>DynamicLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v140</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL OpenSSL|x64'" Label="Configuration">\r
     <ConfigurationType>DynamicLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v140</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL OpenSSL|x64'" Label="Configuration">\r
     <ConfigurationType>DynamicLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v140</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release|x64'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v140</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - LIB wolfSSL|x64'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v140</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug|x64'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v140</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - LIB wolfSSL|x64'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v140</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release|x64'" Label="Configuration">\r
     <ConfigurationType>DynamicLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v140</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL wolfSSL|x64'" Label="Configuration">\r
     <ConfigurationType>DynamicLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v140</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug|x64'" Label="Configuration">\r
     <ConfigurationType>DynamicLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v140</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL wolfSSL|x64'" Label="Configuration">\r
     <ConfigurationType>DynamicLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v140</PlatformToolset>\r
   </PropertyGroup>\r
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />\r
     <ClCompile>\r
       <Optimization>Disabled</Optimization>\r
       <AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\wolfssl;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_DEBUG;BUILDING_LIBCURL;DEBUGBUILD;USE_CYASSL;USE_IPV6;HAVE_CYASSL_OPTIONS_H;HAVE_CYASSL_ERROR_SSL_H;WOLFSSL_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>_DEBUG;BUILDING_LIBCURL;DEBUGBUILD;USE_WOLFSSL;USE_IPV6;WOLFSSL_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <MinimalRebuild>true</MinimalRebuild>\r
       <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
     <ClCompile>\r
       <Optimization>Disabled</Optimization>\r
       <AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\wolfssl;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_DEBUG;BUILDING_LIBCURL;DEBUGBUILD;USE_CYASSL;USE_IPV6;HAVE_CYASSL_OPTIONS_H;HAVE_CYASSL_ERROR_SSL_H;WOLFSSL_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>_DEBUG;BUILDING_LIBCURL;DEBUGBUILD;USE_WOLFSSL;USE_IPV6;WOLFSSL_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <MinimalRebuild>true</MinimalRebuild>\r
       <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
       <Optimization>MaxSpeed</Optimization>\r
       <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>\r
       <AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\wolfssl;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>NDEBUG;BUILDING_LIBCURL;USE_CYASSL;USE_IPV6;HAVE_CYASSL_OPTIONS_H;HAVE_CYASSL_ERROR_SSL_H;WOLFSSL_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>NDEBUG;BUILDING_LIBCURL;USE_WOLFSSL;USE_IPV6;WOLFSSL_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <StringPooling>true</StringPooling>\r
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
       <FunctionLevelLinking>true</FunctionLevelLinking>\r
       <Optimization>MaxSpeed</Optimization>\r
       <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>\r
       <AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\wolfssl;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>NDEBUG;BUILDING_LIBCURL;USE_CYASSL;USE_IPV6;HAVE_CYASSL_OPTIONS_H;HAVE_CYASSL_ERROR_SSL_H;WOLFSSL_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>NDEBUG;BUILDING_LIBCURL;USE_WOLFSSL;USE_IPV6;WOLFSSL_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <StringPooling>true</StringPooling>\r
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
       <FunctionLevelLinking>true</FunctionLevelLinking>\r
     <ClCompile>\r
       <Optimization>Disabled</Optimization>\r
       <AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\wolfssl;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_DEBUG;BUILDING_LIBCURL;DEBUGBUILD;CURL_STATICLIB;USE_CYASSL;USE_IPV6;HAVE_CYASSL_OPTIONS_H;HAVE_CYASSL_ERROR_SSL_H;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>_DEBUG;BUILDING_LIBCURL;DEBUGBUILD;CURL_STATICLIB;USE_WOLFSSL;USE_IPV6;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <MinimalRebuild>true</MinimalRebuild>\r
       <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
     <ClCompile>\r
       <Optimization>Disabled</Optimization>\r
       <AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\wolfssl;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_DEBUG;BUILDING_LIBCURL;DEBUGBUILD;CURL_STATICLIB;USE_CYASSL;USE_IPV6;HAVE_CYASSL_OPTIONS_H;HAVE_CYASSL_ERROR_SSL_H;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>_DEBUG;BUILDING_LIBCURL;DEBUGBUILD;CURL_STATICLIB;USE_WOLFSSL;USE_IPV6;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <MinimalRebuild>true</MinimalRebuild>\r
       <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
       <Optimization>MaxSpeed</Optimization>\r
       <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>\r
       <AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\wolfssl;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>NDEBUG;BUILDING_LIBCURL;CURL_STATICLIB;USE_CYASSL;USE_IPV6;HAVE_CYASSL_OPTIONS_H;HAVE_CYASSL_ERROR_SSL_H;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>NDEBUG;BUILDING_LIBCURL;CURL_STATICLIB;USE_WOLFSSL;USE_IPV6;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <StringPooling>true</StringPooling>\r
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
       <FunctionLevelLinking>true</FunctionLevelLinking>\r
       <Optimization>MaxSpeed</Optimization>\r
       <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>\r
       <AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\wolfssl;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>NDEBUG;BUILDING_LIBCURL;CURL_STATICLIB;USE_CYASSL;USE_IPV6;HAVE_CYASSL_OPTIONS_H;HAVE_CYASSL_ERROR_SSL_H;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>NDEBUG;BUILDING_LIBCURL;CURL_STATICLIB;USE_WOLFSSL;USE_IPV6;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <StringPooling>true</StringPooling>\r
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
       <FunctionLevelLinking>true</FunctionLevelLinking>\r
     </Lib>\r
   </ItemDefinitionGroup>\r
   <ItemGroup>\r
+    <ClCompile Include="..\..\..\..\lib\altsvc.c" />\r
     <ClCompile Include="..\..\..\..\lib\amigaos.c" />\r
     <ClCompile Include="..\..\..\..\lib\asyn-ares.c" />\r
     <ClCompile Include="..\..\..\..\lib\asyn-thread.c" />\r
     <ClCompile Include="..\..\..\..\lib\curl_endian.c" />\r
     <ClCompile Include="..\..\..\..\lib\curl_fnmatch.c" />\r
     <ClCompile Include="..\..\..\..\lib\curl_gethostname.c" />\r
+    <ClCompile Include="..\..\..\..\lib\curl_get_line.c" />\r
     <ClCompile Include="..\..\..\..\lib\curl_gssapi.c" />\r
     <ClCompile Include="..\..\..\..\lib\curl_memrchr.c" />\r
     <ClCompile Include="..\..\..\..\lib\curl_multibyte.c" />\r
     <ClCompile Include="..\..\..\..\lib\openldap.c" />\r
     <ClCompile Include="..\..\..\..\lib\parsedate.c" />\r
     <ClCompile Include="..\..\..\..\lib\pingpong.c" />\r
-    <ClCompile Include="..\..\..\..\lib\pipeline.c" />\r
     <ClCompile Include="..\..\..\..\lib\pop3.c" />\r
     <ClCompile Include="..\..\..\..\lib\progress.c" />\r
     <ClCompile Include="..\..\..\..\lib\psl.c" />\r
     <ClCompile Include="..\..\..\..\lib\slist.c" />\r
     <ClCompile Include="..\..\..\..\lib\smb.c" />\r
     <ClCompile Include="..\..\..\..\lib\smtp.c" />\r
+    <ClCompile Include="..\..\..\..\lib\socketpair.c" />\r
     <ClCompile Include="..\..\..\..\lib\socks.c" />\r
     <ClCompile Include="..\..\..\..\lib\socks_gssapi.c" />\r
     <ClCompile Include="..\..\..\..\lib\socks_sspi.c" />\r
     <ClCompile Include="..\..\..\..\lib\speedcheck.c" />\r
     <ClCompile Include="..\..\..\..\lib\splay.c" />\r
-    <ClCompile Include="..\..\..\..\lib\ssh.c" />\r
-    <ClCompile Include="..\..\..\..\lib\ssh-libssh.c" />\r
     <ClCompile Include="..\..\..\..\lib\strcase.c" />\r
     <ClCompile Include="..\..\..\..\lib\strdup.c" />\r
     <ClCompile Include="..\..\..\..\lib\strerror.c" />\r
     <ClCompile Include="..\..\..\..\lib\vauth\spnego_gssapi.c" />\r
     <ClCompile Include="..\..\..\..\lib\vauth\spnego_sspi.c" />\r
     <ClCompile Include="..\..\..\..\lib\vauth\vauth.c" />\r
-    <ClCompile Include="..\..\..\..\lib\vtls\axtls.c" />\r
-    <ClCompile Include="..\..\..\..\lib\vtls\cyassl.c" />\r
-    <ClCompile Include="..\..\..\..\lib\vtls\darwinssl.c" />\r
+    <ClCompile Include="..\..\..\..\lib\vquic\ngtcp2.c" />\r
+    <ClCompile Include="..\..\..\..\lib\vquic\quiche.c" />\r
+    <ClCompile Include="..\..\..\..\lib\vssh\libssh2.c" />\r
+    <ClCompile Include="..\..\..\..\lib\vssh\libssh.c" />\r
+    <ClCompile Include="..\..\..\..\lib\vtls\bearssl.c" />\r
     <ClCompile Include="..\..\..\..\lib\vtls\gskit.c" />\r
     <ClCompile Include="..\..\..\..\lib\vtls\gtls.c" />\r
     <ClCompile Include="..\..\..\..\lib\vtls\mbedtls.c" />\r
     <ClCompile Include="..\..\..\..\lib\vtls\polarssl_threadlock.c" />\r
     <ClCompile Include="..\..\..\..\lib\vtls\schannel.c" />\r
     <ClCompile Include="..\..\..\..\lib\vtls\schannel_verify.c" />\r
+    <ClCompile Include="..\..\..\..\lib\vtls\sectransp.c" />\r
     <ClCompile Include="..\..\..\..\lib\vtls\vtls.c" />\r
+    <ClCompile Include="..\..\..\..\lib\vtls\wolfssl.c" />\r
   </ItemGroup>\r
   <ItemGroup>\r
+    <ClInclude Include="..\..\..\..\lib\altsvc.h" />\r
     <ClInclude Include="..\..\..\..\lib\amigaos.h" />\r
     <ClInclude Include="..\..\..\..\lib\arpa_telnet.h" />\r
     <ClInclude Include="..\..\..\..\lib\asyn.h" />\r
     <ClInclude Include="..\..\..\..\lib\curl_endian.h" />\r
     <ClInclude Include="..\..\..\..\lib\curl_fnmatch.h" />\r
     <ClInclude Include="..\..\..\..\lib\curl_gethostname.h" />\r
+    <ClInclude Include="..\..\..\..\lib\curl_get_line.h" />\r
     <ClInclude Include="..\..\..\..\lib\curl_gssapi.h" />\r
     <ClInclude Include="..\..\..\..\lib\curl_hmac.h" />\r
     <ClInclude Include="..\..\..\..\lib\curl_ldap.h" />\r
     <ClInclude Include="..\..\..\..\lib\nonblock.h" />\r
     <ClInclude Include="..\..\..\..\lib\parsedate.h" />\r
     <ClInclude Include="..\..\..\..\lib\pingpong.h" />\r
-    <ClInclude Include="..\..\..\..\lib\pipeline.h" />\r
     <ClInclude Include="..\..\..\..\lib\pop3.h" />\r
     <ClInclude Include="..\..\..\..\lib\progress.h" />\r
     <ClInclude Include="..\..\..\..\lib\psl.h" />\r
+    <ClInclude Include="..\..\..\..\lib\quic.h" />\r
     <ClInclude Include="..\..\..\..\lib\rand.h" />\r
     <ClInclude Include="..\..\..\..\lib\rtsp.h" />\r
     <ClInclude Include="..\..\..\..\lib\select.h" />\r
     <ClInclude Include="..\..\..\..\lib\smb.h" />\r
     <ClInclude Include="..\..\..\..\lib\smtp.h" />\r
     <ClInclude Include="..\..\..\..\lib\sockaddr.h" />\r
+    <ClInclude Include="..\..\..\..\lib\socketpair.h" />\r
     <ClInclude Include="..\..\..\..\lib\socks.h" />\r
     <ClInclude Include="..\..\..\..\lib\speedcheck.h" />\r
     <ClInclude Include="..\..\..\..\lib\splay.h" />\r
-    <ClInclude Include="..\..\..\..\lib\ssh.h" />\r
     <ClInclude Include="..\..\..\..\lib\strcase.h" />\r
     <ClInclude Include="..\..\..\..\lib\strdup.h" />\r
     <ClInclude Include="..\..\..\..\lib\strerror.h" />\r
     <ClInclude Include="..\..\..\..\lib\vauth\digest.h" />\r
     <ClInclude Include="..\..\..\..\lib\vauth\ntlm.h" />\r
     <ClInclude Include="..\..\..\..\lib\vauth\vauth.h" />\r
-    <ClInclude Include="..\..\..\..\lib\vtls\axtls.h" />\r
-    <ClInclude Include="..\..\..\..\lib\vtls\cyassl.h" />\r
-    <ClInclude Include="..\..\..\..\lib\vtls\darwinssl.h" />\r
+    <ClInclude Include="..\..\..\..\lib\vquic\ngtcp2.h" />\r
+    <ClInclude Include="..\..\..\..\lib\vquic\quiche.h" />\r
+    <ClInclude Include="..\..\..\..\lib\vssh\ssh.h" />\r
+    <ClInclude Include="..\..\..\..\lib\vtls\bearssl.h" />\r
     <ClInclude Include="..\..\..\..\lib\vtls\gskit.h" />\r
     <ClInclude Include="..\..\..\..\lib\vtls\gtls.h" />\r
     <ClInclude Include="..\..\..\..\lib\vtls\mbedtls.h" />\r
     <ClInclude Include="..\..\..\..\lib\vtls\polarssl.h" />\r
     <ClInclude Include="..\..\..\..\lib\vtls\polarssl_threadlock.h" />\r
     <ClInclude Include="..\..\..\..\lib\vtls\schannel.h" />\r
+    <ClInclude Include="..\..\..\..\lib\vtls\sectransp.h" />\r
     <ClInclude Include="..\..\..\..\lib\vtls\vtls.h" />\r
+    <ClInclude Include="..\..\..\..\lib\vtls\wolfssl.h" />\r
   </ItemGroup>\r
   <ItemGroup>\r
     <ResourceCompile Include="..\..\..\..\lib\libcurl.rc" />\r
index b40c18b..ca123ed 100644 (file)
-Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio 2015
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "curl", "curl.vcxproj", "{5228E9CE-A216-422F-A5E6-58E95E2DD71D}"
-EndProject
-Global
-       GlobalSection(SolutionConfigurationPlatforms) = preSolution
-               DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               DLL Debug - DLL OpenSSL - DLL LibSSH2|x64 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
-               DLL Debug - DLL OpenSSL|Win32 = DLL Debug - DLL OpenSSL|Win32
-               DLL Debug - DLL OpenSSL|x64 = DLL Debug - DLL OpenSSL|x64
-               DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               DLL Debug - DLL Windows SSPI - DLL WinIDN|x64 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
-               DLL Debug - DLL Windows SSPI|Win32 = DLL Debug - DLL Windows SSPI|Win32
-               DLL Debug - DLL Windows SSPI|x64 = DLL Debug - DLL Windows SSPI|x64
-               DLL Debug - DLL wolfSSL|Win32 = DLL Debug - DLL wolfSSL|Win32
-               DLL Debug - DLL wolfSSL|x64 = DLL Debug - DLL wolfSSL|x64
-               DLL Debug|Win32 = DLL Debug|Win32
-               DLL Debug|x64 = DLL Debug|x64
-               DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
-               DLL Release - DLL OpenSSL - DLL LibSSH2|x64 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
-               DLL Release - DLL OpenSSL|Win32 = DLL Release - DLL OpenSSL|Win32
-               DLL Release - DLL OpenSSL|x64 = DLL Release - DLL OpenSSL|x64
-               DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
-               DLL Release - DLL Windows SSPI - DLL WinIDN|x64 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
-               DLL Release - DLL Windows SSPI|Win32 = DLL Release - DLL Windows SSPI|Win32
-               DLL Release - DLL Windows SSPI|x64 = DLL Release - DLL Windows SSPI|x64
-               DLL Release - DLL wolfSSL|Win32 = DLL Release - DLL wolfSSL|Win32
-               DLL Release - DLL wolfSSL|x64 = DLL Release - DLL wolfSSL|x64
-               DLL Release|Win32 = DLL Release|Win32
-               DLL Release|x64 = DLL Release|x64
-               LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               LIB Debug - DLL OpenSSL - DLL LibSSH2|x64 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
-               LIB Debug - DLL OpenSSL|Win32 = LIB Debug - DLL OpenSSL|Win32
-               LIB Debug - DLL OpenSSL|x64 = LIB Debug - DLL OpenSSL|x64
-               LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               LIB Debug - DLL Windows SSPI - DLL WinIDN|x64 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
-               LIB Debug - DLL Windows SSPI|Win32 = LIB Debug - DLL Windows SSPI|Win32
-               LIB Debug - DLL Windows SSPI|x64 = LIB Debug - DLL Windows SSPI|x64
-               LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
-               LIB Debug - LIB OpenSSL - LIB LibSSH2|x64 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
-               LIB Debug - LIB OpenSSL|Win32 = LIB Debug - LIB OpenSSL|Win32
-               LIB Debug - LIB OpenSSL|x64 = LIB Debug - LIB OpenSSL|x64
-               LIB Debug - LIB wolfSSL|Win32 = LIB Debug - LIB wolfSSL|Win32
-               LIB Debug - LIB wolfSSL|x64 = LIB Debug - LIB wolfSSL|x64
-               LIB Debug|Win32 = LIB Debug|Win32
-               LIB Debug|x64 = LIB Debug|x64
-               LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
-               LIB Release - DLL OpenSSL - DLL LibSSH2|x64 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
-               LIB Release - DLL OpenSSL|Win32 = LIB Release - DLL OpenSSL|Win32
-               LIB Release - DLL OpenSSL|x64 = LIB Release - DLL OpenSSL|x64
-               LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
-               LIB Release - DLL Windows SSPI - DLL WinIDN|x64 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
-               LIB Release - DLL Windows SSPI|Win32 = LIB Release - DLL Windows SSPI|Win32
-               LIB Release - DLL Windows SSPI|x64 = LIB Release - DLL Windows SSPI|x64
-               LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
-               LIB Release - LIB OpenSSL - LIB LibSSH2|x64 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
-               LIB Release - LIB OpenSSL|Win32 = LIB Release - LIB OpenSSL|Win32
-               LIB Release - LIB OpenSSL|x64 = LIB Release - LIB OpenSSL|x64
-               LIB Release - LIB wolfSSL|Win32 = LIB Release - LIB wolfSSL|Win32
-               LIB Release - LIB wolfSSL|x64 = LIB Release - LIB wolfSSL|x64
-               LIB Release|Win32 = LIB Release|Win32
-               LIB Release|x64 = LIB Release|x64
-       EndGlobalSection
-       GlobalSection(ProjectConfigurationPlatforms) = postSolution
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|Win32.ActiveCfg = DLL Debug - DLL OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|Win32.Build.0 = DLL Debug - DLL OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|x64.ActiveCfg = DLL Debug - DLL OpenSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|x64.Build.0 = DLL Debug - DLL OpenSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|Win32.Build.0 = DLL Debug - DLL Windows SSPI|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|x64.ActiveCfg = DLL Debug - DLL Windows SSPI|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|x64.Build.0 = DLL Debug - DLL Windows SSPI|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL wolfSSL|Win32.ActiveCfg = DLL Debug - DLL wolfSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL wolfSSL|Win32.Build.0 = DLL Debug - DLL wolfSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL wolfSSL|x64.ActiveCfg = DLL Debug - DLL wolfSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL wolfSSL|x64.Build.0 = DLL Debug - DLL wolfSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|Win32.Build.0 = DLL Debug|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|x64.ActiveCfg = DLL Debug|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|x64.Build.0 = DLL Debug|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|Win32.ActiveCfg = DLL Release - DLL OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|Win32.Build.0 = DLL Release - DLL OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|x64.ActiveCfg = DLL Release - DLL OpenSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|x64.Build.0 = DLL Release - DLL OpenSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|Win32.ActiveCfg = DLL Release - DLL Windows SSPI|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|Win32.Build.0 = DLL Release - DLL Windows SSPI|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|x64.ActiveCfg = DLL Release - DLL Windows SSPI|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|x64.Build.0 = DLL Release - DLL Windows SSPI|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL wolfSSL|Win32.ActiveCfg = DLL Release - DLL wolfSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL wolfSSL|Win32.Build.0 = DLL Release - DLL wolfSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL wolfSSL|x64.ActiveCfg = DLL Release - DLL wolfSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL wolfSSL|x64.Build.0 = DLL Release - DLL wolfSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|Win32.ActiveCfg = DLL Release|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|Win32.Build.0 = DLL Release|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|x64.ActiveCfg = DLL Release|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|x64.Build.0 = DLL Release|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|Win32.ActiveCfg = LIB Debug - DLL OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|Win32.Build.0 = LIB Debug - DLL OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|x64.ActiveCfg = LIB Debug - DLL OpenSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|x64.Build.0 = LIB Debug - DLL OpenSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|Win32.Build.0 = LIB Debug - DLL Windows SSPI|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|x64.ActiveCfg = LIB Debug - DLL Windows SSPI|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|x64.Build.0 = LIB Debug - DLL Windows SSPI|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|Win32.ActiveCfg = LIB Debug - LIB OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|Win32.Build.0 = LIB Debug - LIB OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|x64.ActiveCfg = LIB Debug - LIB OpenSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|x64.Build.0 = LIB Debug - LIB OpenSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB wolfSSL|Win32.ActiveCfg = LIB Debug - LIB wolfSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB wolfSSL|Win32.Build.0 = LIB Debug - LIB wolfSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB wolfSSL|x64.ActiveCfg = LIB Debug - LIB wolfSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB wolfSSL|x64.Build.0 = LIB Debug - LIB wolfSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|Win32.ActiveCfg = LIB Debug|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|Win32.Build.0 = LIB Debug|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|x64.ActiveCfg = LIB Debug|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|x64.Build.0 = LIB Debug|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|Win32.ActiveCfg = LIB Release - DLL OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|Win32.Build.0 = LIB Release - DLL OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|x64.ActiveCfg = LIB Release - DLL OpenSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|x64.Build.0 = LIB Release - DLL OpenSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|Win32.ActiveCfg = LIB Release - DLL Windows SSPI|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|Win32.Build.0 = LIB Release - DLL Windows SSPI|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|x64.ActiveCfg = LIB Release - DLL Windows SSPI|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|x64.Build.0 = LIB Release - DLL Windows SSPI|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|Win32.ActiveCfg = LIB Release - LIB OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|Win32.Build.0 = LIB Release - LIB OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|x64.ActiveCfg = LIB Release - LIB OpenSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|x64.Build.0 = LIB Release - LIB OpenSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB wolfSSL|Win32.ActiveCfg = LIB Release - LIB wolfSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB wolfSSL|Win32.Build.0 = LIB Release - LIB wolfSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB wolfSSL|x64.ActiveCfg = LIB Release - LIB wolfSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB wolfSSL|x64.Build.0 = LIB Release - LIB wolfSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|Win32.ActiveCfg = LIB Release|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|Win32.Build.0 = LIB Release|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|x64.ActiveCfg = LIB Release|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|x64.Build.0 = LIB Release|x64
-       EndGlobalSection
-       GlobalSection(SolutionProperties) = preSolution
-               HideSolutionNode = FALSE
-       EndGlobalSection
-EndGlobal
+Microsoft Visual Studio Solution File, Format Version 12.00\r
+# Visual Studio 2015\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "curl", "curl.vcxproj", "{5228E9CE-A216-422F-A5E6-58E95E2DD71D}"\r
+EndProject\r
+Global\r
+       GlobalSection(SolutionConfigurationPlatforms) = preSolution\r
+               DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               DLL Debug - DLL OpenSSL - DLL LibSSH2|x64 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64\r
+               DLL Debug - DLL OpenSSL|Win32 = DLL Debug - DLL OpenSSL|Win32\r
+               DLL Debug - DLL OpenSSL|x64 = DLL Debug - DLL OpenSSL|x64\r
+               DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               DLL Debug - DLL Windows SSPI - DLL WinIDN|x64 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64\r
+               DLL Debug - DLL Windows SSPI|Win32 = DLL Debug - DLL Windows SSPI|Win32\r
+               DLL Debug - DLL Windows SSPI|x64 = DLL Debug - DLL Windows SSPI|x64\r
+               DLL Debug - DLL wolfSSL|Win32 = DLL Debug - DLL wolfSSL|Win32\r
+               DLL Debug - DLL wolfSSL|x64 = DLL Debug - DLL wolfSSL|x64\r
+               DLL Debug|Win32 = DLL Debug|Win32\r
+               DLL Debug|x64 = DLL Debug|x64\r
+               DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               DLL Release - DLL OpenSSL - DLL LibSSH2|x64 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64\r
+               DLL Release - DLL OpenSSL|Win32 = DLL Release - DLL OpenSSL|Win32\r
+               DLL Release - DLL OpenSSL|x64 = DLL Release - DLL OpenSSL|x64\r
+               DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               DLL Release - DLL Windows SSPI - DLL WinIDN|x64 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64\r
+               DLL Release - DLL Windows SSPI|Win32 = DLL Release - DLL Windows SSPI|Win32\r
+               DLL Release - DLL Windows SSPI|x64 = DLL Release - DLL Windows SSPI|x64\r
+               DLL Release - DLL wolfSSL|Win32 = DLL Release - DLL wolfSSL|Win32\r
+               DLL Release - DLL wolfSSL|x64 = DLL Release - DLL wolfSSL|x64\r
+               DLL Release|Win32 = DLL Release|Win32\r
+               DLL Release|x64 = DLL Release|x64\r
+               LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               LIB Debug - DLL OpenSSL - DLL LibSSH2|x64 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64\r
+               LIB Debug - DLL OpenSSL|Win32 = LIB Debug - DLL OpenSSL|Win32\r
+               LIB Debug - DLL OpenSSL|x64 = LIB Debug - DLL OpenSSL|x64\r
+               LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               LIB Debug - DLL Windows SSPI - DLL WinIDN|x64 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64\r
+               LIB Debug - DLL Windows SSPI|Win32 = LIB Debug - DLL Windows SSPI|Win32\r
+               LIB Debug - DLL Windows SSPI|x64 = LIB Debug - DLL Windows SSPI|x64\r
+               LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32\r
+               LIB Debug - LIB OpenSSL - LIB LibSSH2|x64 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64\r
+               LIB Debug - LIB OpenSSL|Win32 = LIB Debug - LIB OpenSSL|Win32\r
+               LIB Debug - LIB OpenSSL|x64 = LIB Debug - LIB OpenSSL|x64\r
+               LIB Debug - LIB wolfSSL|Win32 = LIB Debug - LIB wolfSSL|Win32\r
+               LIB Debug - LIB wolfSSL|x64 = LIB Debug - LIB wolfSSL|x64\r
+               LIB Debug|Win32 = LIB Debug|Win32\r
+               LIB Debug|x64 = LIB Debug|x64\r
+               LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               LIB Release - DLL OpenSSL - DLL LibSSH2|x64 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64\r
+               LIB Release - DLL OpenSSL|Win32 = LIB Release - DLL OpenSSL|Win32\r
+               LIB Release - DLL OpenSSL|x64 = LIB Release - DLL OpenSSL|x64\r
+               LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               LIB Release - DLL Windows SSPI - DLL WinIDN|x64 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64\r
+               LIB Release - DLL Windows SSPI|Win32 = LIB Release - DLL Windows SSPI|Win32\r
+               LIB Release - DLL Windows SSPI|x64 = LIB Release - DLL Windows SSPI|x64\r
+               LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32\r
+               LIB Release - LIB OpenSSL - LIB LibSSH2|x64 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64\r
+               LIB Release - LIB OpenSSL|Win32 = LIB Release - LIB OpenSSL|Win32\r
+               LIB Release - LIB OpenSSL|x64 = LIB Release - LIB OpenSSL|x64\r
+               LIB Release - LIB wolfSSL|Win32 = LIB Release - LIB wolfSSL|Win32\r
+               LIB Release - LIB wolfSSL|x64 = LIB Release - LIB wolfSSL|x64\r
+               LIB Release|Win32 = LIB Release|Win32\r
+               LIB Release|x64 = LIB Release|x64\r
+       EndGlobalSection\r
+       GlobalSection(ProjectConfigurationPlatforms) = postSolution\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|Win32.ActiveCfg = DLL Debug - DLL OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|Win32.Build.0 = DLL Debug - DLL OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|x64.ActiveCfg = DLL Debug - DLL OpenSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|x64.Build.0 = DLL Debug - DLL OpenSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|Win32.Build.0 = DLL Debug - DLL Windows SSPI|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|x64.ActiveCfg = DLL Debug - DLL Windows SSPI|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|x64.Build.0 = DLL Debug - DLL Windows SSPI|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL wolfSSL|Win32.ActiveCfg = DLL Debug - DLL wolfSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL wolfSSL|Win32.Build.0 = DLL Debug - DLL wolfSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL wolfSSL|x64.ActiveCfg = DLL Debug - DLL wolfSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL wolfSSL|x64.Build.0 = DLL Debug - DLL wolfSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|Win32.Build.0 = DLL Debug|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|x64.ActiveCfg = DLL Debug|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|x64.Build.0 = DLL Debug|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|Win32.ActiveCfg = DLL Release - DLL OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|Win32.Build.0 = DLL Release - DLL OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|x64.ActiveCfg = DLL Release - DLL OpenSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|x64.Build.0 = DLL Release - DLL OpenSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|Win32.ActiveCfg = DLL Release - DLL Windows SSPI|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|Win32.Build.0 = DLL Release - DLL Windows SSPI|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|x64.ActiveCfg = DLL Release - DLL Windows SSPI|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|x64.Build.0 = DLL Release - DLL Windows SSPI|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL wolfSSL|Win32.ActiveCfg = DLL Release - DLL wolfSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL wolfSSL|Win32.Build.0 = DLL Release - DLL wolfSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL wolfSSL|x64.ActiveCfg = DLL Release - DLL wolfSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL wolfSSL|x64.Build.0 = DLL Release - DLL wolfSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|Win32.ActiveCfg = DLL Release|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|Win32.Build.0 = DLL Release|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|x64.ActiveCfg = DLL Release|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|x64.Build.0 = DLL Release|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|Win32.ActiveCfg = LIB Debug - DLL OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|Win32.Build.0 = LIB Debug - DLL OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|x64.ActiveCfg = LIB Debug - DLL OpenSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|x64.Build.0 = LIB Debug - DLL OpenSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|Win32.Build.0 = LIB Debug - DLL Windows SSPI|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|x64.ActiveCfg = LIB Debug - DLL Windows SSPI|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|x64.Build.0 = LIB Debug - DLL Windows SSPI|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|Win32.ActiveCfg = LIB Debug - LIB OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|Win32.Build.0 = LIB Debug - LIB OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|x64.ActiveCfg = LIB Debug - LIB OpenSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|x64.Build.0 = LIB Debug - LIB OpenSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB wolfSSL|Win32.ActiveCfg = LIB Debug - LIB wolfSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB wolfSSL|Win32.Build.0 = LIB Debug - LIB wolfSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB wolfSSL|x64.ActiveCfg = LIB Debug - LIB wolfSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB wolfSSL|x64.Build.0 = LIB Debug - LIB wolfSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|Win32.ActiveCfg = LIB Debug|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|Win32.Build.0 = LIB Debug|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|x64.ActiveCfg = LIB Debug|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|x64.Build.0 = LIB Debug|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|Win32.ActiveCfg = LIB Release - DLL OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|Win32.Build.0 = LIB Release - DLL OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|x64.ActiveCfg = LIB Release - DLL OpenSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|x64.Build.0 = LIB Release - DLL OpenSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|Win32.ActiveCfg = LIB Release - DLL Windows SSPI|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|Win32.Build.0 = LIB Release - DLL Windows SSPI|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|x64.ActiveCfg = LIB Release - DLL Windows SSPI|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|x64.Build.0 = LIB Release - DLL Windows SSPI|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|Win32.ActiveCfg = LIB Release - LIB OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|Win32.Build.0 = LIB Release - LIB OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|x64.ActiveCfg = LIB Release - LIB OpenSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|x64.Build.0 = LIB Release - LIB OpenSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB wolfSSL|Win32.ActiveCfg = LIB Release - LIB wolfSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB wolfSSL|Win32.Build.0 = LIB Release - LIB wolfSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB wolfSSL|x64.ActiveCfg = LIB Release - LIB wolfSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB wolfSSL|x64.Build.0 = LIB Release - LIB wolfSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|Win32.ActiveCfg = LIB Release|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|Win32.Build.0 = LIB Release|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|x64.ActiveCfg = LIB Release|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|x64.Build.0 = LIB Release|x64\r
+       EndGlobalSection\r
+       GlobalSection(SolutionProperties) = preSolution\r
+               HideSolutionNode = FALSE\r
+       EndGlobalSection\r
+EndGlobal\r
index 481e0be..3680660 100644 (file)
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL Windows SSPI|Win32'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v140</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL Windows SSPI - DLL WinIDN|Win32'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v140</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL Windows SSPI|Win32'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v140</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v140</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL OpenSSL - DLL LibSSH2|Win32'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v140</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v140</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL OpenSSL|Win32'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v140</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL OpenSSL|Win32'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v140</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - LIB OpenSSL - LIB LibSSH2|Win32'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v140</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v140</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - LIB OpenSSL|Win32'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v140</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - LIB OpenSSL|Win32'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v140</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL OpenSSL - DLL LibSSH2|Win32'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v140</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v140</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL Windows SSPI|Win32'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v140</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL Windows SSPI - DLL WinIDN|Win32'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v140</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL OpenSSL|Win32'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v140</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL Windows SSPI|Win32'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v140</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v140</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL OpenSSL|Win32'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v140</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug|Win32'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v140</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL wolfSSL|Win32'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v140</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug|Win32'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v140</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - LIB wolfSSL|Win32'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v140</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release|Win32'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v140</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - LIB wolfSSL|Win32'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v140</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release|Win32'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v140</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL wolfSSL|Win32'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v140</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL Windows SSPI|x64'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v140</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL Windows SSPI - DLL WinIDN|x64'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v140</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL Windows SSPI|x64'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v140</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL Windows SSPI - DLL WinIDN|x64'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v140</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL OpenSSL - DLL LibSSH2|x64'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v140</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL OpenSSL - DLL LibSSH2|x64'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v140</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL OpenSSL|x64'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v140</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL OpenSSL|x64'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v140</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - LIB OpenSSL - LIB LibSSH2|x64'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v140</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - LIB OpenSSL - LIB LibSSH2|x64'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v140</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - LIB OpenSSL|x64'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v140</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - LIB OpenSSL|x64'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v140</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL OpenSSL - DLL LibSSH2|x64'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v140</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL OpenSSL - DLL LibSSH2|x64'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v140</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL Windows SSPI|x64'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v140</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL Windows SSPI - DLL WinIDN|x64'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v140</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL OpenSSL|x64'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v140</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL Windows SSPI|x64'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v140</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL Windows SSPI - DLL WinIDN|x64'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v140</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL OpenSSL|x64'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v140</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug|x64'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v140</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL wolfSSL|x64'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v140</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug|x64'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v140</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - LIB wolfSSL|x64'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v140</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release|x64'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v140</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - LIB wolfSSL|x64'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v140</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release|x64'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v140</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL wolfSSL|x64'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v140</PlatformToolset>\r
   </PropertyGroup>\r
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />\r
     <ClCompile Include="..\..\..\..\src\tool_panykey.c" />\r
     <ClCompile Include="..\..\..\..\src\tool_paramhlp.c" />\r
     <ClCompile Include="..\..\..\..\src\tool_parsecfg.c" />\r
+    <ClCompile Include="..\..\..\..\src\tool_progress.c" />\r
     <ClCompile Include="..\..\..\..\src\tool_setopt.c" />\r
     <ClCompile Include="..\..\..\..\src\tool_sleep.c" />\r
     <ClCompile Include="..\..\..\..\src\tool_strdup.c" />\r
     <ClInclude Include="..\..\..\..\src\tool_panykey.h" />\r
     <ClInclude Include="..\..\..\..\src\tool_paramhlp.h" />\r
     <ClInclude Include="..\..\..\..\src\tool_parsecfg.h" />\r
+    <ClInclude Include="..\..\..\..\src\tool_progress.h" />\r
     <ClInclude Include="..\..\..\..\src\tool_sdecls.h" />\r
     <ClInclude Include="..\..\..\..\src\tool_setopt.h" />\r
     <ClInclude Include="..\..\..\..\src\tool_setup.h" />\r
index 62da96a..227896b 100644 (file)
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - LIB OpenSSL - LIB LibSSH2|Win32'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v141</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - LIB OpenSSL|Win32'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v141</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL Windows SSPI|Win32'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v141</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL Windows SSPI - DLL WinIDN|Win32'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v141</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL OpenSSL - DLL LibSSH2|Win32'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v141</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL OpenSSL|Win32'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v141</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v141</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - LIB OpenSSL|Win32'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v141</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL Windows SSPI|Win32'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v141</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v141</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v141</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL OpenSSL|Win32'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v141</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL OpenSSL - DLL LibSSH2|Win32'" Label="Configuration">\r
     <ConfigurationType>DynamicLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v141</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32'" Label="Configuration">\r
     <ConfigurationType>DynamicLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v141</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL Windows SSPI|Win32'" Label="Configuration">\r
     <ConfigurationType>DynamicLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v141</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL Windows SSPI - DLL WinIDN|Win32'" Label="Configuration">\r
     <ConfigurationType>DynamicLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v141</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL Windows SSPI|Win32'" Label="Configuration">\r
     <ConfigurationType>DynamicLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v141</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32'" Label="Configuration">\r
     <ConfigurationType>DynamicLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v141</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL OpenSSL|Win32'" Label="Configuration">\r
     <ConfigurationType>DynamicLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v141</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL OpenSSL|Win32'" Label="Configuration">\r
     <ConfigurationType>DynamicLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v141</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release|Win32'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v141</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - LIB wolfSSL|Win32'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v141</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug|Win32'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v141</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - LIB wolfSSL|Win32'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v141</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release|Win32'" Label="Configuration">\r
     <ConfigurationType>DynamicLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v141</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL wolfSSL|Win32'" Label="Configuration">\r
     <ConfigurationType>DynamicLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v141</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug|Win32'" Label="Configuration">\r
     <ConfigurationType>DynamicLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v141</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL wolfSSL|Win32'" Label="Configuration">\r
     <ConfigurationType>DynamicLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v141</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - LIB OpenSSL - LIB LibSSH2|x64'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v141</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - LIB OpenSSL|x64'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v141</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL Windows SSPI|x64'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v141</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL Windows SSPI - DLL WinIDN|x64'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v141</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL OpenSSL - DLL LibSSH2|x64'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v141</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL OpenSSL|x64'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v141</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - LIB OpenSSL - LIB LibSSH2|x64'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v141</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - LIB OpenSSL|x64'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v141</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL Windows SSPI|x64'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v141</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL Windows SSPI - DLL WinIDN|x64'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v141</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL OpenSSL - DLL LibSSH2|x64'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v141</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL OpenSSL|x64'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v141</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL OpenSSL - DLL LibSSH2|x64'" Label="Configuration">\r
     <ConfigurationType>DynamicLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v141</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL OpenSSL - DLL LibSSH2|x64'" Label="Configuration">\r
     <ConfigurationType>DynamicLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v141</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL Windows SSPI|x64'" Label="Configuration">\r
     <ConfigurationType>DynamicLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v141</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL Windows SSPI - DLL WinIDN|x64'" Label="Configuration">\r
     <ConfigurationType>DynamicLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v141</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL Windows SSPI|x64'" Label="Configuration">\r
     <ConfigurationType>DynamicLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v141</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL Windows SSPI - DLL WinIDN|x64'" Label="Configuration">\r
     <ConfigurationType>DynamicLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v141</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL OpenSSL|x64'" Label="Configuration">\r
     <ConfigurationType>DynamicLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v141</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL OpenSSL|x64'" Label="Configuration">\r
     <ConfigurationType>DynamicLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v141</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release|x64'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v141</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - LIB wolfSSL|x64'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v141</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug|x64'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v141</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - LIB wolfSSL|x64'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v141</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release|x64'" Label="Configuration">\r
     <ConfigurationType>DynamicLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v141</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL wolfSSL|x64'" Label="Configuration">\r
     <ConfigurationType>DynamicLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v141</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug|x64'" Label="Configuration">\r
     <ConfigurationType>DynamicLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v141</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL wolfSSL|x64'" Label="Configuration">\r
     <ConfigurationType>DynamicLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v141</PlatformToolset>\r
   </PropertyGroup>\r
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />\r
       <Optimization>Disabled</Optimization>\r
       <AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
       <PreprocessorDefinitions>_DEBUG;BUILDING_LIBCURL;DEBUGBUILD;USE_IPV6;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <MinimalRebuild>true</MinimalRebuild>\r
       <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
       <WarningLevel>Level4</WarningLevel>\r
     <ClCompile>\r
       <Optimization>Disabled</Optimization>\r
       <AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\wolfssl;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_DEBUG;BUILDING_LIBCURL;DEBUGBUILD;USE_CYASSL;USE_IPV6;HAVE_CYASSL_OPTIONS_H;HAVE_CYASSL_ERROR_SSL_H;WOLFSSL_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <MinimalRebuild>true</MinimalRebuild>\r
+      <PreprocessorDefinitions>_DEBUG;BUILDING_LIBCURL;DEBUGBUILD;USE_WOLFSSL;USE_IPV6;WOLFSSL_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
       <WarningLevel>Level4</WarningLevel>\r
       <Optimization>Disabled</Optimization>\r
       <AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
       <PreprocessorDefinitions>_DEBUG;BUILDING_LIBCURL;DEBUGBUILD;USE_IPV6;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <MinimalRebuild>true</MinimalRebuild>\r
       <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
       <WarningLevel>Level4</WarningLevel>\r
     <ClCompile>\r
       <Optimization>Disabled</Optimization>\r
       <AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\wolfssl;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_DEBUG;BUILDING_LIBCURL;DEBUGBUILD;USE_CYASSL;USE_IPV6;HAVE_CYASSL_OPTIONS_H;HAVE_CYASSL_ERROR_SSL_H;WOLFSSL_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <MinimalRebuild>true</MinimalRebuild>\r
+      <PreprocessorDefinitions>_DEBUG;BUILDING_LIBCURL;DEBUGBUILD;USE_WOLFSSL;USE_IPV6;WOLFSSL_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
       <WarningLevel>Level4</WarningLevel>\r
       <Optimization>MaxSpeed</Optimization>\r
       <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>\r
       <AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\wolfssl;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>NDEBUG;BUILDING_LIBCURL;USE_CYASSL;USE_IPV6;HAVE_CYASSL_OPTIONS_H;HAVE_CYASSL_ERROR_SSL_H;WOLFSSL_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>NDEBUG;BUILDING_LIBCURL;USE_WOLFSSL;USE_IPV6;WOLFSSL_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <StringPooling>true</StringPooling>\r
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
       <FunctionLevelLinking>true</FunctionLevelLinking>\r
       <Optimization>MaxSpeed</Optimization>\r
       <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>\r
       <AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\wolfssl;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>NDEBUG;BUILDING_LIBCURL;USE_CYASSL;USE_IPV6;HAVE_CYASSL_OPTIONS_H;HAVE_CYASSL_ERROR_SSL_H;WOLFSSL_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>NDEBUG;BUILDING_LIBCURL;USE_WOLFSSL;USE_IPV6;WOLFSSL_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <StringPooling>true</StringPooling>\r
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
       <FunctionLevelLinking>true</FunctionLevelLinking>\r
       <Optimization>Disabled</Optimization>\r
       <AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
       <PreprocessorDefinitions>_DEBUG;BUILDING_LIBCURL;DEBUGBUILD;CURL_STATICLIB;USE_IPV6;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <MinimalRebuild>true</MinimalRebuild>\r
       <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
       <WarningLevel>Level4</WarningLevel>\r
     <ClCompile>\r
       <Optimization>Disabled</Optimization>\r
       <AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\wolfssl;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_DEBUG;BUILDING_LIBCURL;DEBUGBUILD;CURL_STATICLIB;USE_CYASSL;USE_IPV6;HAVE_CYASSL_OPTIONS_H;HAVE_CYASSL_ERROR_SSL_H;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <MinimalRebuild>true</MinimalRebuild>\r
+      <PreprocessorDefinitions>_DEBUG;BUILDING_LIBCURL;DEBUGBUILD;CURL_STATICLIB;USE_WOLFSSL;USE_IPV6;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
       <WarningLevel>Level4</WarningLevel>\r
       <Optimization>Disabled</Optimization>\r
       <AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
       <PreprocessorDefinitions>_DEBUG;BUILDING_LIBCURL;DEBUGBUILD;CURL_STATICLIB;USE_IPV6;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <MinimalRebuild>true</MinimalRebuild>\r
       <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
       <WarningLevel>Level4</WarningLevel>\r
     <ClCompile>\r
       <Optimization>Disabled</Optimization>\r
       <AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\wolfssl;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_DEBUG;BUILDING_LIBCURL;DEBUGBUILD;CURL_STATICLIB;USE_CYASSL;USE_IPV6;HAVE_CYASSL_OPTIONS_H;HAVE_CYASSL_ERROR_SSL_H;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <MinimalRebuild>true</MinimalRebuild>\r
+      <PreprocessorDefinitions>_DEBUG;BUILDING_LIBCURL;DEBUGBUILD;CURL_STATICLIB;USE_WOLFSSL;USE_IPV6;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
       <WarningLevel>Level4</WarningLevel>\r
       <Optimization>MaxSpeed</Optimization>\r
       <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>\r
       <AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\wolfssl;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>NDEBUG;BUILDING_LIBCURL;CURL_STATICLIB;USE_CYASSL;USE_IPV6;HAVE_CYASSL_OPTIONS_H;HAVE_CYASSL_ERROR_SSL_H;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>NDEBUG;BUILDING_LIBCURL;CURL_STATICLIB;USE_WOLFSSL;USE_IPV6;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <StringPooling>true</StringPooling>\r
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
       <FunctionLevelLinking>true</FunctionLevelLinking>\r
       <Optimization>MaxSpeed</Optimization>\r
       <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>\r
       <AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\wolfssl;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>NDEBUG;BUILDING_LIBCURL;CURL_STATICLIB;USE_CYASSL;USE_IPV6;HAVE_CYASSL_OPTIONS_H;HAVE_CYASSL_ERROR_SSL_H;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>NDEBUG;BUILDING_LIBCURL;CURL_STATICLIB;USE_WOLFSSL;USE_IPV6;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <StringPooling>true</StringPooling>\r
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
       <FunctionLevelLinking>true</FunctionLevelLinking>\r
       <Optimization>Disabled</Optimization>\r
       <AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\openssl\inc32;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
       <PreprocessorDefinitions>_DEBUG;BUILDING_LIBCURL;DEBUGBUILD;USE_OPENSSL;USE_IPV6;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <MinimalRebuild>true</MinimalRebuild>\r
       <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
       <WarningLevel>Level4</WarningLevel>\r
       <Optimization>Disabled</Optimization>\r
       <AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\openssl\inc32;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
       <PreprocessorDefinitions>_DEBUG;BUILDING_LIBCURL;DEBUGBUILD;USE_OPENSSL;USE_IPV6;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <MinimalRebuild>true</MinimalRebuild>\r
       <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
       <WarningLevel>Level4</WarningLevel>\r
       <Optimization>Disabled</Optimization>\r
       <AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
       <PreprocessorDefinitions>_DEBUG;BUILDING_LIBCURL;DEBUGBUILD;USE_WINDOWS_SSPI;USE_SCHANNEL;USE_IPV6;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <MinimalRebuild>true</MinimalRebuild>\r
       <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
       <WarningLevel>Level4</WarningLevel>\r
       <Optimization>Disabled</Optimization>\r
       <AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
       <PreprocessorDefinitions>_DEBUG;BUILDING_LIBCURL;DEBUGBUILD;USE_WINDOWS_SSPI;USE_SCHANNEL;USE_WIN32_IDN;USE_IPV6;WANT_IDN_PROTOTYPES;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <MinimalRebuild>true</MinimalRebuild>\r
       <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
       <WarningLevel>Level4</WarningLevel>\r
       <Optimization>Disabled</Optimization>\r
       <AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
       <PreprocessorDefinitions>_DEBUG;BUILDING_LIBCURL;DEBUGBUILD;USE_WINDOWS_SSPI;USE_SCHANNEL;USE_IPV6;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <MinimalRebuild>true</MinimalRebuild>\r
       <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
       <WarningLevel>Level4</WarningLevel>\r
       <Optimization>Disabled</Optimization>\r
       <AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
       <PreprocessorDefinitions>_DEBUG;BUILDING_LIBCURL;DEBUGBUILD;USE_WINDOWS_SSPI;USE_SCHANNEL;USE_WIN32_IDN;USE_IPV6;WANT_IDN_PROTOTYPES;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <MinimalRebuild>true</MinimalRebuild>\r
       <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
       <WarningLevel>Level4</WarningLevel>\r
       <Optimization>Disabled</Optimization>\r
       <AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\openssl\inc32;..\..\..\..\..\libssh2\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
       <PreprocessorDefinitions>_DEBUG;BUILDING_LIBCURL;DEBUGBUILD;USE_OPENSSL;USE_LIBSSH2;USE_IPV6;HAVE_LIBSSH2_H;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <MinimalRebuild>true</MinimalRebuild>\r
       <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
       <WarningLevel>Level4</WarningLevel>\r
       <Optimization>Disabled</Optimization>\r
       <AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\openssl\inc32;..\..\..\..\..\libssh2\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
       <PreprocessorDefinitions>_DEBUG;BUILDING_LIBCURL;DEBUGBUILD;USE_OPENSSL;USE_LIBSSH2;USE_IPV6;HAVE_LIBSSH2_H;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <MinimalRebuild>true</MinimalRebuild>\r
       <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
       <WarningLevel>Level4</WarningLevel>\r
       <Optimization>Disabled</Optimization>\r
       <AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\openssl\inc32;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
       <PreprocessorDefinitions>_DEBUG;BUILDING_LIBCURL;DEBUGBUILD;CURL_STATICLIB;USE_OPENSSL;USE_IPV6;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <MinimalRebuild>true</MinimalRebuild>\r
       <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
       <WarningLevel>Level4</WarningLevel>\r
       <Optimization>Disabled</Optimization>\r
       <AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\openssl\inc32;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
       <PreprocessorDefinitions>_DEBUG;BUILDING_LIBCURL;DEBUGBUILD;CURL_STATICLIB;USE_OPENSSL;USE_IPV6;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <MinimalRebuild>true</MinimalRebuild>\r
       <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
       <WarningLevel>Level4</WarningLevel>\r
       <Optimization>Disabled</Optimization>\r
       <AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\openssl\inc32;..\..\..\..\..\libssh2\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
       <PreprocessorDefinitions>_DEBUG;BUILDING_LIBCURL;DEBUGBUILD;CURL_STATICLIB;USE_OPENSSL;USE_LIBSSH2;USE_IPV6;HAVE_LIBSSH2_H;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <MinimalRebuild>true</MinimalRebuild>\r
       <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
       <WarningLevel>Level4</WarningLevel>\r
       <Optimization>Disabled</Optimization>\r
       <AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\openssl\inc32;..\..\..\..\..\libssh2\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
       <PreprocessorDefinitions>_DEBUG;BUILDING_LIBCURL;DEBUGBUILD;CURL_STATICLIB;USE_OPENSSL;USE_LIBSSH2;USE_IPV6;HAVE_LIBSSH2_H;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <MinimalRebuild>true</MinimalRebuild>\r
       <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
       <WarningLevel>Level4</WarningLevel>\r
       <Optimization>Disabled</Optimization>\r
       <AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
       <PreprocessorDefinitions>_DEBUG;BUILDING_LIBCURL;DEBUGBUILD;CURL_STATICLIB;USE_WINDOWS_SSPI;USE_SCHANNEL;USE_IPV6;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <MinimalRebuild>true</MinimalRebuild>\r
       <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
       <WarningLevel>Level4</WarningLevel>\r
       <Optimization>Disabled</Optimization>\r
       <AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
       <PreprocessorDefinitions>_DEBUG;BUILDING_LIBCURL;DEBUGBUILD;CURL_STATICLIB;USE_WINDOWS_SSPI;USE_SCHANNEL;USE_WIN32_IDN;USE_IPV6;WANT_IDN_PROTOTYPES;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <MinimalRebuild>true</MinimalRebuild>\r
       <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
       <WarningLevel>Level4</WarningLevel>\r
       <Optimization>Disabled</Optimization>\r
       <AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
       <PreprocessorDefinitions>_DEBUG;BUILDING_LIBCURL;DEBUGBUILD;CURL_STATICLIB;USE_WINDOWS_SSPI;USE_SCHANNEL;USE_IPV6;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <MinimalRebuild>true</MinimalRebuild>\r
       <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
       <WarningLevel>Level4</WarningLevel>\r
       <Optimization>Disabled</Optimization>\r
       <AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
       <PreprocessorDefinitions>_DEBUG;BUILDING_LIBCURL;DEBUGBUILD;CURL_STATICLIB;USE_WINDOWS_SSPI;USE_SCHANNEL;USE_WIN32_IDN;USE_IPV6;WANT_IDN_PROTOTYPES;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <MinimalRebuild>true</MinimalRebuild>\r
       <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
       <WarningLevel>Level4</WarningLevel>\r
       <Optimization>Disabled</Optimization>\r
       <AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\openssl\inc32;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
       <PreprocessorDefinitions>_DEBUG;BUILDING_LIBCURL;DEBUGBUILD;CURL_STATICLIB;USE_OPENSSL;USE_IPV6;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <MinimalRebuild>true</MinimalRebuild>\r
       <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
       <WarningLevel>Level4</WarningLevel>\r
       <Optimization>Disabled</Optimization>\r
       <AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\openssl\inc32;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
       <PreprocessorDefinitions>_DEBUG;BUILDING_LIBCURL;DEBUGBUILD;CURL_STATICLIB;USE_OPENSSL;USE_IPV6;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <MinimalRebuild>true</MinimalRebuild>\r
       <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
       <WarningLevel>Level4</WarningLevel>\r
       <Optimization>Disabled</Optimization>\r
       <AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\openssl\inc32;..\..\..\..\..\libssh2\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
       <PreprocessorDefinitions>_DEBUG;BUILDING_LIBCURL;DEBUGBUILD;CURL_STATICLIB;USE_OPENSSL;USE_LIBSSH2;USE_IPV6;HAVE_LIBSSH2_H;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <MinimalRebuild>true</MinimalRebuild>\r
       <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
       <WarningLevel>Level4</WarningLevel>\r
       <Optimization>Disabled</Optimization>\r
       <AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\openssl\inc32;..\..\..\..\..\libssh2\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
       <PreprocessorDefinitions>_DEBUG;BUILDING_LIBCURL;DEBUGBUILD;CURL_STATICLIB;USE_OPENSSL;USE_LIBSSH2;USE_IPV6;HAVE_LIBSSH2_H;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <MinimalRebuild>true</MinimalRebuild>\r
       <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
       <WarningLevel>Level4</WarningLevel>\r
     </Lib>\r
   </ItemDefinitionGroup>\r
   <ItemGroup>\r
+    <ClCompile Include="..\..\..\..\lib\altsvc.c" />\r
     <ClCompile Include="..\..\..\..\lib\amigaos.c" />\r
     <ClCompile Include="..\..\..\..\lib\asyn-ares.c" />\r
     <ClCompile Include="..\..\..\..\lib\asyn-thread.c" />\r
     <ClCompile Include="..\..\..\..\lib\curl_endian.c" />\r
     <ClCompile Include="..\..\..\..\lib\curl_fnmatch.c" />\r
     <ClCompile Include="..\..\..\..\lib\curl_gethostname.c" />\r
+    <ClCompile Include="..\..\..\..\lib\curl_get_line.c" />\r
     <ClCompile Include="..\..\..\..\lib\curl_gssapi.c" />\r
     <ClCompile Include="..\..\..\..\lib\curl_memrchr.c" />\r
     <ClCompile Include="..\..\..\..\lib\curl_multibyte.c" />\r
     <ClCompile Include="..\..\..\..\lib\openldap.c" />\r
     <ClCompile Include="..\..\..\..\lib\parsedate.c" />\r
     <ClCompile Include="..\..\..\..\lib\pingpong.c" />\r
-    <ClCompile Include="..\..\..\..\lib\pipeline.c" />\r
     <ClCompile Include="..\..\..\..\lib\pop3.c" />\r
     <ClCompile Include="..\..\..\..\lib\progress.c" />\r
     <ClCompile Include="..\..\..\..\lib\psl.c" />\r
     <ClCompile Include="..\..\..\..\lib\slist.c" />\r
     <ClCompile Include="..\..\..\..\lib\smb.c" />\r
     <ClCompile Include="..\..\..\..\lib\smtp.c" />\r
+    <ClCompile Include="..\..\..\..\lib\socketpair.c" />\r
     <ClCompile Include="..\..\..\..\lib\socks.c" />\r
     <ClCompile Include="..\..\..\..\lib\socks_gssapi.c" />\r
     <ClCompile Include="..\..\..\..\lib\socks_sspi.c" />\r
     <ClCompile Include="..\..\..\..\lib\speedcheck.c" />\r
     <ClCompile Include="..\..\..\..\lib\splay.c" />\r
-    <ClCompile Include="..\..\..\..\lib\ssh.c" />\r
-    <ClCompile Include="..\..\..\..\lib\ssh-libssh.c" />\r
     <ClCompile Include="..\..\..\..\lib\strcase.c" />\r
     <ClCompile Include="..\..\..\..\lib\strdup.c" />\r
     <ClCompile Include="..\..\..\..\lib\strerror.c" />\r
     <ClCompile Include="..\..\..\..\lib\vauth\spnego_gssapi.c" />\r
     <ClCompile Include="..\..\..\..\lib\vauth\spnego_sspi.c" />\r
     <ClCompile Include="..\..\..\..\lib\vauth\vauth.c" />\r
-    <ClCompile Include="..\..\..\..\lib\vtls\axtls.c" />\r
-    <ClCompile Include="..\..\..\..\lib\vtls\cyassl.c" />\r
-    <ClCompile Include="..\..\..\..\lib\vtls\darwinssl.c" />\r
+    <ClCompile Include="..\..\..\..\lib\vquic\ngtcp2.c" />\r
+    <ClCompile Include="..\..\..\..\lib\vquic\quiche.c" />\r
+    <ClCompile Include="..\..\..\..\lib\vssh\libssh2.c" />\r
+    <ClCompile Include="..\..\..\..\lib\vssh\libssh.c" />\r
+    <ClCompile Include="..\..\..\..\lib\vtls\bearssl.c" />\r
     <ClCompile Include="..\..\..\..\lib\vtls\gskit.c" />\r
     <ClCompile Include="..\..\..\..\lib\vtls\gtls.c" />\r
     <ClCompile Include="..\..\..\..\lib\vtls\mbedtls.c" />\r
     <ClCompile Include="..\..\..\..\lib\vtls\polarssl_threadlock.c" />\r
     <ClCompile Include="..\..\..\..\lib\vtls\schannel.c" />\r
     <ClCompile Include="..\..\..\..\lib\vtls\schannel_verify.c" />\r
+    <ClCompile Include="..\..\..\..\lib\vtls\sectransp.c" />\r
     <ClCompile Include="..\..\..\..\lib\vtls\vtls.c" />\r
+    <ClCompile Include="..\..\..\..\lib\vtls\wolfssl.c" />\r
   </ItemGroup>\r
   <ItemGroup>\r
+    <ClInclude Include="..\..\..\..\lib\altsvc.h" />\r
     <ClInclude Include="..\..\..\..\lib\amigaos.h" />\r
     <ClInclude Include="..\..\..\..\lib\arpa_telnet.h" />\r
     <ClInclude Include="..\..\..\..\lib\asyn.h" />\r
     <ClInclude Include="..\..\..\..\lib\curl_endian.h" />\r
     <ClInclude Include="..\..\..\..\lib\curl_fnmatch.h" />\r
     <ClInclude Include="..\..\..\..\lib\curl_gethostname.h" />\r
+    <ClInclude Include="..\..\..\..\lib\curl_get_line.h" />\r
     <ClInclude Include="..\..\..\..\lib\curl_gssapi.h" />\r
     <ClInclude Include="..\..\..\..\lib\curl_hmac.h" />\r
     <ClInclude Include="..\..\..\..\lib\curl_ldap.h" />\r
     <ClInclude Include="..\..\..\..\lib\nonblock.h" />\r
     <ClInclude Include="..\..\..\..\lib\parsedate.h" />\r
     <ClInclude Include="..\..\..\..\lib\pingpong.h" />\r
-    <ClInclude Include="..\..\..\..\lib\pipeline.h" />\r
     <ClInclude Include="..\..\..\..\lib\pop3.h" />\r
     <ClInclude Include="..\..\..\..\lib\progress.h" />\r
     <ClInclude Include="..\..\..\..\lib\psl.h" />\r
+    <ClInclude Include="..\..\..\..\lib\quic.h" />\r
     <ClInclude Include="..\..\..\..\lib\rand.h" />\r
     <ClInclude Include="..\..\..\..\lib\rtsp.h" />\r
     <ClInclude Include="..\..\..\..\lib\select.h" />\r
     <ClInclude Include="..\..\..\..\lib\smb.h" />\r
     <ClInclude Include="..\..\..\..\lib\smtp.h" />\r
     <ClInclude Include="..\..\..\..\lib\sockaddr.h" />\r
+    <ClInclude Include="..\..\..\..\lib\socketpair.h" />\r
     <ClInclude Include="..\..\..\..\lib\socks.h" />\r
     <ClInclude Include="..\..\..\..\lib\speedcheck.h" />\r
     <ClInclude Include="..\..\..\..\lib\splay.h" />\r
-    <ClInclude Include="..\..\..\..\lib\ssh.h" />\r
     <ClInclude Include="..\..\..\..\lib\strcase.h" />\r
     <ClInclude Include="..\..\..\..\lib\strdup.h" />\r
     <ClInclude Include="..\..\..\..\lib\strerror.h" />\r
     <ClInclude Include="..\..\..\..\lib\vauth\digest.h" />\r
     <ClInclude Include="..\..\..\..\lib\vauth\ntlm.h" />\r
     <ClInclude Include="..\..\..\..\lib\vauth\vauth.h" />\r
-    <ClInclude Include="..\..\..\..\lib\vtls\axtls.h" />\r
-    <ClInclude Include="..\..\..\..\lib\vtls\cyassl.h" />\r
-    <ClInclude Include="..\..\..\..\lib\vtls\darwinssl.h" />\r
+    <ClInclude Include="..\..\..\..\lib\vquic\ngtcp2.h" />\r
+    <ClInclude Include="..\..\..\..\lib\vquic\quiche.h" />\r
+    <ClInclude Include="..\..\..\..\lib\vssh\ssh.h" />\r
+    <ClInclude Include="..\..\..\..\lib\vtls\bearssl.h" />\r
     <ClInclude Include="..\..\..\..\lib\vtls\gskit.h" />\r
     <ClInclude Include="..\..\..\..\lib\vtls\gtls.h" />\r
     <ClInclude Include="..\..\..\..\lib\vtls\mbedtls.h" />\r
     <ClInclude Include="..\..\..\..\lib\vtls\polarssl.h" />\r
     <ClInclude Include="..\..\..\..\lib\vtls\polarssl_threadlock.h" />\r
     <ClInclude Include="..\..\..\..\lib\vtls\schannel.h" />\r
+    <ClInclude Include="..\..\..\..\lib\vtls\sectransp.h" />\r
     <ClInclude Include="..\..\..\..\lib\vtls\vtls.h" />\r
+    <ClInclude Include="..\..\..\..\lib\vtls\wolfssl.h" />\r
   </ItemGroup>\r
   <ItemGroup>\r
     <ResourceCompile Include="..\..\..\..\lib\libcurl.rc" />\r
index 92043d4..f1d4483 100644 (file)
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL Windows SSPI|Win32'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v141</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL Windows SSPI - DLL WinIDN|Win32'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v141</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL Windows SSPI|Win32'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v141</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v141</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL OpenSSL - DLL LibSSH2|Win32'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v141</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v141</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL OpenSSL|Win32'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v141</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL OpenSSL|Win32'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v141</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - LIB OpenSSL - LIB LibSSH2|Win32'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v141</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v141</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - LIB OpenSSL|Win32'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v141</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - LIB OpenSSL|Win32'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v141</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL OpenSSL - DLL LibSSH2|Win32'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v141</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v141</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL Windows SSPI|Win32'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v141</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL Windows SSPI - DLL WinIDN|Win32'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v141</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL OpenSSL|Win32'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v141</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL Windows SSPI|Win32'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v141</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v141</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL OpenSSL|Win32'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v141</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug|Win32'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v141</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL wolfSSL|Win32'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v141</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug|Win32'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v141</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - LIB wolfSSL|Win32'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v141</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release|Win32'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v141</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - LIB wolfSSL|Win32'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v141</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release|Win32'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v141</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL wolfSSL|Win32'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v141</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL Windows SSPI|x64'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v141</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL Windows SSPI - DLL WinIDN|x64'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v141</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL Windows SSPI|x64'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v141</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL Windows SSPI - DLL WinIDN|x64'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v141</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL OpenSSL - DLL LibSSH2|x64'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v141</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL OpenSSL - DLL LibSSH2|x64'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v141</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - DLL OpenSSL|x64'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v141</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - DLL OpenSSL|x64'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v141</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - LIB OpenSSL - LIB LibSSH2|x64'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v141</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - LIB OpenSSL - LIB LibSSH2|x64'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v141</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - LIB OpenSSL|x64'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v141</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - LIB OpenSSL|x64'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v141</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL OpenSSL - DLL LibSSH2|x64'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v141</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL OpenSSL - DLL LibSSH2|x64'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v141</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL Windows SSPI|x64'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v141</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL Windows SSPI - DLL WinIDN|x64'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v141</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL OpenSSL|x64'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v141</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL Windows SSPI|x64'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v141</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL Windows SSPI - DLL WinIDN|x64'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v141</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL OpenSSL|x64'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v141</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug|x64'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v141</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Debug - DLL wolfSSL|x64'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v141</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug|x64'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v141</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Debug - LIB wolfSSL|x64'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v141</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release|x64'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v141</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LIB Release - LIB wolfSSL|x64'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v141</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release|x64'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v141</PlatformToolset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DLL Release - DLL wolfSSL|x64'" Label="Configuration">\r
     <ConfigurationType>Application</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
+    <CharacterSet>Unicode</CharacterSet>\r
     <PlatformToolset>v141</PlatformToolset>\r
   </PropertyGroup>\r
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />\r
       <Optimization>Disabled</Optimization>\r
       <AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
       <PreprocessorDefinitions>_DEBUG;_CONSOLE;DEBUGBUILD;CURL_STATICLIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <MinimalRebuild>true</MinimalRebuild>\r
       <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
       <WarningLevel>Level4</WarningLevel>\r
       <Optimization>Disabled</Optimization>\r
       <AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
       <PreprocessorDefinitions>_DEBUG;_CONSOLE;DEBUGBUILD;CURL_STATICLIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <MinimalRebuild>true</MinimalRebuild>\r
       <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
       <WarningLevel>Level4</WarningLevel>\r
       <Optimization>Disabled</Optimization>\r
       <AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
       <PreprocessorDefinitions>_DEBUG;_CONSOLE;DEBUGBUILD;CURL_STATICLIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <MinimalRebuild>true</MinimalRebuild>\r
       <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
       <WarningLevel>Level4</WarningLevel>\r
       <Optimization>Disabled</Optimization>\r
       <AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
       <PreprocessorDefinitions>_DEBUG;_CONSOLE;DEBUGBUILD;CURL_STATICLIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <MinimalRebuild>true</MinimalRebuild>\r
       <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
       <WarningLevel>Level4</WarningLevel>\r
       <Optimization>Disabled</Optimization>\r
       <AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
       <PreprocessorDefinitions>_DEBUG;_CONSOLE;DEBUGBUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <MinimalRebuild>true</MinimalRebuild>\r
       <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
       <WarningLevel>Level4</WarningLevel>\r
       <Optimization>Disabled</Optimization>\r
       <AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
       <PreprocessorDefinitions>_DEBUG;_CONSOLE;DEBUGBUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <MinimalRebuild>true</MinimalRebuild>\r
       <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
       <WarningLevel>Level4</WarningLevel>\r
       <Optimization>Disabled</Optimization>\r
       <AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
       <PreprocessorDefinitions>_DEBUG;_CONSOLE;DEBUGBUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <MinimalRebuild>true</MinimalRebuild>\r
       <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
       <WarningLevel>Level4</WarningLevel>\r
       <Optimization>Disabled</Optimization>\r
       <AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
       <PreprocessorDefinitions>_DEBUG;_CONSOLE;DEBUGBUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <MinimalRebuild>true</MinimalRebuild>\r
       <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
       <WarningLevel>Level4</WarningLevel>\r
       <Optimization>Disabled</Optimization>\r
       <AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
       <PreprocessorDefinitions>_DEBUG;_CONSOLE;DEBUGBUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <MinimalRebuild>true</MinimalRebuild>\r
       <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
       <WarningLevel>Level4</WarningLevel>\r
       <Optimization>Disabled</Optimization>\r
       <AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
       <PreprocessorDefinitions>_DEBUG;_CONSOLE;DEBUGBUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <MinimalRebuild>true</MinimalRebuild>\r
       <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
       <WarningLevel>Level4</WarningLevel>\r
       <Optimization>Disabled</Optimization>\r
       <AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
       <PreprocessorDefinitions>_DEBUG;_CONSOLE;DEBUGBUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <MinimalRebuild>true</MinimalRebuild>\r
       <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
       <WarningLevel>Level4</WarningLevel>\r
       <Optimization>Disabled</Optimization>\r
       <AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
       <PreprocessorDefinitions>_DEBUG;_CONSOLE;DEBUGBUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <MinimalRebuild>true</MinimalRebuild>\r
       <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
       <WarningLevel>Level4</WarningLevel>\r
       <Optimization>Disabled</Optimization>\r
       <AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
       <PreprocessorDefinitions>_DEBUG;_CONSOLE;DEBUGBUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <MinimalRebuild>true</MinimalRebuild>\r
       <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
       <WarningLevel>Level4</WarningLevel>\r
       <Optimization>Disabled</Optimization>\r
       <AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
       <PreprocessorDefinitions>_DEBUG;_CONSOLE;DEBUGBUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <MinimalRebuild>true</MinimalRebuild>\r
       <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
       <WarningLevel>Level4</WarningLevel>\r
       <Optimization>Disabled</Optimization>\r
       <AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
       <PreprocessorDefinitions>_DEBUG;_CONSOLE;DEBUGBUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <MinimalRebuild>true</MinimalRebuild>\r
       <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
       <WarningLevel>Level4</WarningLevel>\r
       <Optimization>Disabled</Optimization>\r
       <AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
       <PreprocessorDefinitions>_DEBUG;_CONSOLE;DEBUGBUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <MinimalRebuild>true</MinimalRebuild>\r
       <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
       <WarningLevel>Level4</WarningLevel>\r
       <Optimization>Disabled</Optimization>\r
       <AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
       <PreprocessorDefinitions>_DEBUG;_CONSOLE;DEBUGBUILD;CURL_STATICLIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <MinimalRebuild>true</MinimalRebuild>\r
       <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
       <WarningLevel>Level4</WarningLevel>\r
       <Optimization>Disabled</Optimization>\r
       <AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
       <PreprocessorDefinitions>_DEBUG;_CONSOLE;DEBUGBUILD;CURL_STATICLIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <MinimalRebuild>true</MinimalRebuild>\r
       <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
       <WarningLevel>Level4</WarningLevel>\r
       <Optimization>Disabled</Optimization>\r
       <AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
       <PreprocessorDefinitions>_DEBUG;_CONSOLE;DEBUGBUILD;CURL_STATICLIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <MinimalRebuild>true</MinimalRebuild>\r
       <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
       <WarningLevel>Level4</WarningLevel>\r
       <Optimization>Disabled</Optimization>\r
       <AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
       <PreprocessorDefinitions>_DEBUG;_CONSOLE;DEBUGBUILD;CURL_STATICLIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <MinimalRebuild>true</MinimalRebuild>\r
       <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
       <WarningLevel>Level4</WarningLevel>\r
       <Optimization>Disabled</Optimization>\r
       <AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
       <PreprocessorDefinitions>_DEBUG;_CONSOLE;DEBUGBUILD;CURL_STATICLIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <MinimalRebuild>true</MinimalRebuild>\r
       <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
       <WarningLevel>Level4</WarningLevel>\r
       <Optimization>Disabled</Optimization>\r
       <AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
       <PreprocessorDefinitions>_DEBUG;_CONSOLE;DEBUGBUILD;CURL_STATICLIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <MinimalRebuild>true</MinimalRebuild>\r
       <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
       <WarningLevel>Level4</WarningLevel>\r
       <Optimization>Disabled</Optimization>\r
       <AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
       <PreprocessorDefinitions>_DEBUG;_CONSOLE;DEBUGBUILD;CURL_STATICLIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <MinimalRebuild>true</MinimalRebuild>\r
       <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
       <WarningLevel>Level4</WarningLevel>\r
       <Optimization>Disabled</Optimization>\r
       <AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
       <PreprocessorDefinitions>_DEBUG;_CONSOLE;DEBUGBUILD;CURL_STATICLIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <MinimalRebuild>true</MinimalRebuild>\r
       <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
       <WarningLevel>Level4</WarningLevel>\r
       <Optimization>Disabled</Optimization>\r
       <AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
       <PreprocessorDefinitions>_DEBUG;_CONSOLE;DEBUGBUILD;CURL_STATICLIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <MinimalRebuild>true</MinimalRebuild>\r
       <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
       <WarningLevel>Level4</WarningLevel>\r
       <Optimization>Disabled</Optimization>\r
       <AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
       <PreprocessorDefinitions>_DEBUG;_CONSOLE;DEBUGBUILD;CURL_STATICLIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <MinimalRebuild>true</MinimalRebuild>\r
       <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
       <WarningLevel>Level4</WarningLevel>\r
       <Optimization>Disabled</Optimization>\r
       <AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
       <PreprocessorDefinitions>_DEBUG;_CONSOLE;DEBUGBUILD;CURL_STATICLIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <MinimalRebuild>true</MinimalRebuild>\r
       <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
       <WarningLevel>Level4</WarningLevel>\r
       <Optimization>Disabled</Optimization>\r
       <AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
       <PreprocessorDefinitions>_DEBUG;_CONSOLE;DEBUGBUILD;CURL_STATICLIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <MinimalRebuild>true</MinimalRebuild>\r
       <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
       <WarningLevel>Level4</WarningLevel>\r
     <ClCompile Include="..\..\..\..\src\tool_panykey.c" />\r
     <ClCompile Include="..\..\..\..\src\tool_paramhlp.c" />\r
     <ClCompile Include="..\..\..\..\src\tool_parsecfg.c" />\r
+    <ClCompile Include="..\..\..\..\src\tool_progress.c" />\r
     <ClCompile Include="..\..\..\..\src\tool_setopt.c" />\r
     <ClCompile Include="..\..\..\..\src\tool_sleep.c" />\r
     <ClCompile Include="..\..\..\..\src\tool_strdup.c" />\r
     <ClInclude Include="..\..\..\..\src\tool_panykey.h" />\r
     <ClInclude Include="..\..\..\..\src\tool_paramhlp.h" />\r
     <ClInclude Include="..\..\..\..\src\tool_parsecfg.h" />\r
+    <ClInclude Include="..\..\..\..\src\tool_progress.h" />\r
     <ClInclude Include="..\..\..\..\src\tool_sdecls.h" />\r
     <ClInclude Include="..\..\..\..\src\tool_setopt.h" />\r
     <ClInclude Include="..\..\..\..\src\tool_setup.h" />\r
index cb3a33b..561a2e9 100644 (file)
@@ -730,6 +730,10 @@ LIB32=link.exe -lib
 # PROP Default_Filter ""\r
 # Begin Source File\r
 \r
+SOURCE=..\..\..\..\lib\altsvc.c\r
+# End Source File\r
+# Begin Source File\r
+\r
 SOURCE=..\..\..\..\lib\amigaos.c\r
 # End Source File\r
 # Begin Source File\r
@@ -786,6 +790,10 @@ SOURCE=..\..\..\..\lib\curl_gethostname.c
 # End Source File\r
 # Begin Source File\r
 \r
+SOURCE=..\..\..\..\lib\curl_get_line.c\r
+# End Source File\r
+# Begin Source File\r
+\r
 SOURCE=..\..\..\..\lib\curl_gssapi.c\r
 # End Source File\r
 # Begin Source File\r
@@ -1022,10 +1030,6 @@ SOURCE=..\..\..\..\lib\pingpong.c
 # End Source File\r
 # Begin Source File\r
 \r
-SOURCE=..\..\..\..\lib\pipeline.c\r
-# End Source File\r
-# Begin Source File\r
-\r
 SOURCE=..\..\..\..\lib\pop3.c\r
 # End Source File\r
 # Begin Source File\r
@@ -1082,6 +1086,10 @@ SOURCE=..\..\..\..\lib\smtp.c
 # End Source File\r
 # Begin Source File\r
 \r
+SOURCE=..\..\..\..\lib\socketpair.c\r
+# End Source File\r
+# Begin Source File\r
+\r
 SOURCE=..\..\..\..\lib\socks.c\r
 # End Source File\r
 # Begin Source File\r
@@ -1102,14 +1110,6 @@ SOURCE=..\..\..\..\lib\splay.c
 # End Source File\r
 # Begin Source File\r
 \r
-SOURCE=..\..\..\..\lib\ssh.c\r
-# End Source File\r
-# Begin Source File\r
-\r
-SOURCE=..\..\..\..\lib\ssh-libssh.c\r
-# End Source File\r
-# Begin Source File\r
-\r
 SOURCE=..\..\..\..\lib\strcase.c\r
 # End Source File\r
 # Begin Source File\r
@@ -1222,15 +1222,23 @@ SOURCE=..\..\..\..\lib\vauth\vauth.c
 # End Source File\r
 # Begin Source File\r
 \r
-SOURCE=..\..\..\..\lib\vtls\axtls.c\r
+SOURCE=..\..\..\..\lib\vquic\ngtcp2.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\..\lib\vquic\quiche.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\..\lib\vssh\libssh2.c\r
 # End Source File\r
 # Begin Source File\r
 \r
-SOURCE=..\..\..\..\lib\vtls\cyassl.c\r
+SOURCE=..\..\..\..\lib\vssh\libssh.c\r
 # End Source File\r
 # Begin Source File\r
 \r
-SOURCE=..\..\..\..\lib\vtls\darwinssl.c\r
+SOURCE=..\..\..\..\lib\vtls\bearssl.c\r
 # End Source File\r
 # Begin Source File\r
 \r
@@ -1274,14 +1282,26 @@ SOURCE=..\..\..\..\lib\vtls\schannel_verify.c
 # End Source File\r
 # Begin Source File\r
 \r
+SOURCE=..\..\..\..\lib\vtls\sectransp.c\r
+# End Source File\r
+# Begin Source File\r
+\r
 SOURCE=..\..\..\..\lib\vtls\vtls.c\r
 # End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\..\lib\vtls\wolfssl.c\r
+# End Source File\r
 # End Group\r
 # Begin Group "Header Files"\r
 \r
 # PROP Default_Filter ""\r
 # Begin Source File\r
 \r
+SOURCE=..\..\..\..\lib\altsvc.h\r
+# End Source File\r
+# Begin Source File\r
+\r
 SOURCE=..\..\..\..\lib\amigaos.h\r
 # End Source File\r
 # Begin Source File\r
@@ -1342,6 +1362,10 @@ SOURCE=..\..\..\..\lib\curl_gethostname.h
 # End Source File\r
 # Begin Source File\r
 \r
+SOURCE=..\..\..\..\lib\curl_get_line.h\r
+# End Source File\r
+# Begin Source File\r
+\r
 SOURCE=..\..\..\..\lib\curl_gssapi.h\r
 # End Source File\r
 # Begin Source File\r
@@ -1574,10 +1598,6 @@ SOURCE=..\..\..\..\lib\pingpong.h
 # End Source File\r
 # Begin Source File\r
 \r
-SOURCE=..\..\..\..\lib\pipeline.h\r
-# End Source File\r
-# Begin Source File\r
-\r
 SOURCE=..\..\..\..\lib\pop3.h\r
 # End Source File\r
 # Begin Source File\r
@@ -1590,6 +1610,10 @@ SOURCE=..\..\..\..\lib\psl.h
 # End Source File\r
 # Begin Source File\r
 \r
+SOURCE=..\..\..\..\lib\quic.h\r
+# End Source File\r
+# Begin Source File\r
+\r
 SOURCE=..\..\..\..\lib\rand.h\r
 # End Source File\r
 # Begin Source File\r
@@ -1638,19 +1662,19 @@ SOURCE=..\..\..\..\lib\sockaddr.h
 # End Source File\r
 # Begin Source File\r
 \r
-SOURCE=..\..\..\..\lib\socks.h\r
+SOURCE=..\..\..\..\lib\socketpair.h\r
 # End Source File\r
 # Begin Source File\r
 \r
-SOURCE=..\..\..\..\lib\speedcheck.h\r
+SOURCE=..\..\..\..\lib\socks.h\r
 # End Source File\r
 # Begin Source File\r
 \r
-SOURCE=..\..\..\..\lib\splay.h\r
+SOURCE=..\..\..\..\lib\speedcheck.h\r
 # End Source File\r
 # Begin Source File\r
 \r
-SOURCE=..\..\..\..\lib\ssh.h\r
+SOURCE=..\..\..\..\lib\splay.h\r
 # End Source File\r
 # Begin Source File\r
 \r
@@ -1730,15 +1754,19 @@ SOURCE=..\..\..\..\lib\vauth\vauth.h
 # End Source File\r
 # Begin Source File\r
 \r
-SOURCE=..\..\..\..\lib\vtls\axtls.h\r
+SOURCE=..\..\..\..\lib\vquic\ngtcp2.h\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\..\lib\vquic\quiche.h\r
 # End Source File\r
 # Begin Source File\r
 \r
-SOURCE=..\..\..\..\lib\vtls\cyassl.h\r
+SOURCE=..\..\..\..\lib\vssh\ssh.h\r
 # End Source File\r
 # Begin Source File\r
 \r
-SOURCE=..\..\..\..\lib\vtls\darwinssl.h\r
+SOURCE=..\..\..\..\lib\vtls\bearssl.h\r
 # End Source File\r
 # Begin Source File\r
 \r
@@ -1778,8 +1806,16 @@ SOURCE=..\..\..\..\lib\vtls\schannel.h
 # End Source File\r
 # Begin Source File\r
 \r
+SOURCE=..\..\..\..\lib\vtls\sectransp.h\r
+# End Source File\r
+# Begin Source File\r
+\r
 SOURCE=..\..\..\..\lib\vtls\vtls.h\r
 # End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\..\lib\vtls\wolfssl.h\r
+# End Source File\r
 # End Group\r
 # Begin Group "Resource Files"\r
 \r
index 05dd73c..ff2617a 100644 (file)
@@ -819,6 +819,10 @@ SOURCE=..\..\..\..\src\tool_parsecfg.c
 # End Source File\r
 # Begin Source File\r
 \r
+SOURCE=..\..\..\..\src\tool_progress.c\r
+# End Source File\r
+# Begin Source File\r
+\r
 SOURCE=..\..\..\..\src\tool_setopt.c\r
 # End Source File\r
 # Begin Source File\r
@@ -1003,6 +1007,10 @@ SOURCE=..\..\..\..\src\tool_parsecfg.h
 # End Source File\r
 # Begin Source File\r
 \r
+SOURCE=..\..\..\..\src\tool_progress.h\r
+# End Source File\r
+# Begin Source File\r
+\r
 SOURCE=..\..\..\..\src\tool_sdecls.h\r
 # End Source File\r
 # Begin Source File\r
index fc51b9d..0dd90b4 100644 (file)
-Microsoft Visual Studio Solution File, Format Version 8.00
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "curl", "src\curl.vcproj", "{5228E9CE-A216-422F-A5E6-58E95E2DD71D}"
-       ProjectSection(ProjectDependencies) = postProject
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB} = {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}
-       EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libcurl", "lib\libcurl.vcproj", "{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}"
-       ProjectSection(ProjectDependencies) = postProject
-       EndProjectSection
-EndProject
-Global
-       GlobalSection(SolutionConfiguration) = preSolution
-               DLL Debug = DLL Debug
-               DLL Debug - DLL OpenSSL = DLL Debug - DLL OpenSSL
-               DLL Debug - DLL OpenSSL - DLL LibSSH2 = DLL Debug - DLL OpenSSL - DLL LibSSH2
-               DLL Debug - DLL Windows SSPI = DLL Debug - DLL Windows SSPI
-               DLL Debug - DLL Windows SSPI - DLL WinIDN = DLL Debug - DLL Windows SSPI - DLL WinIDN
-               DLL Release = DLL Release
-               DLL Release - DLL OpenSSL = DLL Release - DLL OpenSSL
-               DLL Release - DLL OpenSSL - DLL LibSSH2 = DLL Release - DLL OpenSSL - DLL LibSSH2
-               DLL Release - DLL Windows SSPI = DLL Release - DLL Windows SSPI
-               DLL Release - DLL Windows SSPI - DLL WinIDN = DLL Release - DLL Windows SSPI - DLL WinIDN
-               LIB Debug = LIB Debug
-               LIB Debug - DLL OpenSSL = LIB Debug - DLL OpenSSL
-               LIB Debug - DLL OpenSSL - DLL LibSSH2 = LIB Debug - DLL OpenSSL - DLL LibSSH2
-               LIB Debug - DLL Windows SSPI = LIB Debug - DLL Windows SSPI
-               LIB Debug - DLL Windows SSPI - DLL WinIDN = LIB Debug - DLL Windows SSPI - DLL WinIDN
-               LIB Debug - LIB OpenSSL = LIB Debug - LIB OpenSSL
-               LIB Debug - LIB OpenSSL - LIB LibSSH2 = LIB Debug - LIB OpenSSL - LIB LibSSH2
-               LIB Release = LIB Release
-               LIB Release - DLL OpenSSL = LIB Release - DLL OpenSSL
-               LIB Release - DLL OpenSSL - DLL LibSSH2 = LIB Release - DLL OpenSSL - DLL LibSSH2
-               LIB Release - DLL Windows SSPI = LIB Release - DLL Windows SSPI
-               LIB Release - DLL Windows SSPI - DLL WinIDN = LIB Release - DLL Windows SSPI - DLL WinIDN
-               LIB Release - LIB OpenSSL = LIB Release - LIB OpenSSL
-               LIB Release - LIB OpenSSL - LIB LibSSH2 = LIB Release - LIB OpenSSL - LIB LibSSH2
-       EndGlobalSection
-       GlobalSection(ProjectConfiguration) = postSolution
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug.ActiveCfg = DLL Debug|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug.Build.0 = DLL Debug|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL.ActiveCfg = DLL Debug - DLL OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL.Build.0 = DLL Debug - DLL OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI.Build.0 = DLL Debug - DLL Windows SSPI|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release.ActiveCfg = DLL Release|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release.Build.0 = DLL Release|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL.ActiveCfg = DLL Release - DLL OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL.Build.0 = DLL Release - DLL OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI.ActiveCfg = DLL Release - DLL Windows SSPI|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI.Build.0 = DLL Release - DLL Windows SSPI|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug.ActiveCfg = LIB Debug|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug.Build.0 = LIB Debug|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL.ActiveCfg = LIB Debug - DLL OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL.Build.0 = LIB Debug - DLL OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI.Build.0 = LIB Debug - DLL Windows SSPI|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL.ActiveCfg = LIB Debug - LIB OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL.Build.0 = LIB Debug - LIB OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release.ActiveCfg = LIB Release|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release.Build.0 = LIB Release|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL.ActiveCfg = LIB Release - DLL OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL.Build.0 = LIB Release - DLL OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI.ActiveCfg = LIB Release - DLL Windows SSPI|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI.Build.0 = LIB Release - DLL Windows SSPI|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL.ActiveCfg = LIB Release - LIB OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL.Build.0 = LIB Release - LIB OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug.ActiveCfg = DLL Debug|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug.Build.0 = DLL Debug|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL.ActiveCfg = DLL Debug - DLL OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL.Build.0 = DLL Debug - DLL OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI.Build.0 = DLL Debug - DLL Windows SSPI|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release.ActiveCfg = DLL Release|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release.Build.0 = DLL Release|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL.ActiveCfg = DLL Release - DLL OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL.Build.0 = DLL Release - DLL OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI.ActiveCfg = DLL Release - DLL Windows SSPI|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI.Build.0 = DLL Release - DLL Windows SSPI|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug.ActiveCfg = LIB Debug|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug.Build.0 = LIB Debug|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL.ActiveCfg = LIB Debug - DLL OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL.Build.0 = LIB Debug - DLL OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI.Build.0 = LIB Debug - DLL Windows SSPI|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL.ActiveCfg = LIB Debug - LIB OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL.Build.0 = LIB Debug - LIB OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release.ActiveCfg = LIB Release|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release.Build.0 = LIB Release|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL.ActiveCfg = LIB Release - DLL OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL.Build.0 = LIB Release - DLL OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI.ActiveCfg = LIB Release - DLL Windows SSPI|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI.Build.0 = LIB Release - DLL Windows SSPI|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL.ActiveCfg = LIB Release - LIB OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL.Build.0 = LIB Release - LIB OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
-       EndGlobalSection
-       GlobalSection(ExtensibilityGlobals) = postSolution
-       EndGlobalSection
-       GlobalSection(ExtensibilityAddIns) = postSolution
-       EndGlobalSection
-EndGlobal
+Microsoft Visual Studio Solution File, Format Version 8.00\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "curl", "src\curl.vcproj", "{5228E9CE-A216-422F-A5E6-58E95E2DD71D}"\r
+       ProjectSection(ProjectDependencies) = postProject\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB} = {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}\r
+       EndProjectSection\r
+EndProject\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libcurl", "lib\libcurl.vcproj", "{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}"\r
+       ProjectSection(ProjectDependencies) = postProject\r
+       EndProjectSection\r
+EndProject\r
+Global\r
+       GlobalSection(SolutionConfiguration) = preSolution\r
+               DLL Debug = DLL Debug\r
+               DLL Debug - DLL OpenSSL = DLL Debug - DLL OpenSSL\r
+               DLL Debug - DLL OpenSSL - DLL LibSSH2 = DLL Debug - DLL OpenSSL - DLL LibSSH2\r
+               DLL Debug - DLL Windows SSPI = DLL Debug - DLL Windows SSPI\r
+               DLL Debug - DLL Windows SSPI - DLL WinIDN = DLL Debug - DLL Windows SSPI - DLL WinIDN\r
+               DLL Release = DLL Release\r
+               DLL Release - DLL OpenSSL = DLL Release - DLL OpenSSL\r
+               DLL Release - DLL OpenSSL - DLL LibSSH2 = DLL Release - DLL OpenSSL - DLL LibSSH2\r
+               DLL Release - DLL Windows SSPI = DLL Release - DLL Windows SSPI\r
+               DLL Release - DLL Windows SSPI - DLL WinIDN = DLL Release - DLL Windows SSPI - DLL WinIDN\r
+               LIB Debug = LIB Debug\r
+               LIB Debug - DLL OpenSSL = LIB Debug - DLL OpenSSL\r
+               LIB Debug - DLL OpenSSL - DLL LibSSH2 = LIB Debug - DLL OpenSSL - DLL LibSSH2\r
+               LIB Debug - DLL Windows SSPI = LIB Debug - DLL Windows SSPI\r
+               LIB Debug - DLL Windows SSPI - DLL WinIDN = LIB Debug - DLL Windows SSPI - DLL WinIDN\r
+               LIB Debug - LIB OpenSSL = LIB Debug - LIB OpenSSL\r
+               LIB Debug - LIB OpenSSL - LIB LibSSH2 = LIB Debug - LIB OpenSSL - LIB LibSSH2\r
+               LIB Release = LIB Release\r
+               LIB Release - DLL OpenSSL = LIB Release - DLL OpenSSL\r
+               LIB Release - DLL OpenSSL - DLL LibSSH2 = LIB Release - DLL OpenSSL - DLL LibSSH2\r
+               LIB Release - DLL Windows SSPI = LIB Release - DLL Windows SSPI\r
+               LIB Release - DLL Windows SSPI - DLL WinIDN = LIB Release - DLL Windows SSPI - DLL WinIDN\r
+               LIB Release - LIB OpenSSL = LIB Release - LIB OpenSSL\r
+               LIB Release - LIB OpenSSL - LIB LibSSH2 = LIB Release - LIB OpenSSL - LIB LibSSH2\r
+       EndGlobalSection\r
+       GlobalSection(ProjectConfiguration) = postSolution\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug.ActiveCfg = DLL Debug|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug.Build.0 = DLL Debug|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL.ActiveCfg = DLL Debug - DLL OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL.Build.0 = DLL Debug - DLL OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI.Build.0 = DLL Debug - DLL Windows SSPI|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release.ActiveCfg = DLL Release|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release.Build.0 = DLL Release|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL.ActiveCfg = DLL Release - DLL OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL.Build.0 = DLL Release - DLL OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI.ActiveCfg = DLL Release - DLL Windows SSPI|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI.Build.0 = DLL Release - DLL Windows SSPI|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug.ActiveCfg = LIB Debug|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug.Build.0 = LIB Debug|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL.ActiveCfg = LIB Debug - DLL OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL.Build.0 = LIB Debug - DLL OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI.Build.0 = LIB Debug - DLL Windows SSPI|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL.ActiveCfg = LIB Debug - LIB OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL.Build.0 = LIB Debug - LIB OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release.ActiveCfg = LIB Release|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release.Build.0 = LIB Release|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL.ActiveCfg = LIB Release - DLL OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL.Build.0 = LIB Release - DLL OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI.ActiveCfg = LIB Release - DLL Windows SSPI|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI.Build.0 = LIB Release - DLL Windows SSPI|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL.ActiveCfg = LIB Release - LIB OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL.Build.0 = LIB Release - LIB OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug.ActiveCfg = DLL Debug|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug.Build.0 = DLL Debug|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL.ActiveCfg = DLL Debug - DLL OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL.Build.0 = DLL Debug - DLL OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI.Build.0 = DLL Debug - DLL Windows SSPI|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release.ActiveCfg = DLL Release|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release.Build.0 = DLL Release|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL.ActiveCfg = DLL Release - DLL OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL.Build.0 = DLL Release - DLL OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI.ActiveCfg = DLL Release - DLL Windows SSPI|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI.Build.0 = DLL Release - DLL Windows SSPI|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug.ActiveCfg = LIB Debug|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug.Build.0 = LIB Debug|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL.ActiveCfg = LIB Debug - DLL OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL.Build.0 = LIB Debug - DLL OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI.Build.0 = LIB Debug - DLL Windows SSPI|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL.ActiveCfg = LIB Debug - LIB OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL.Build.0 = LIB Debug - LIB OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release.ActiveCfg = LIB Release|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release.Build.0 = LIB Release|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL.ActiveCfg = LIB Release - DLL OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL.Build.0 = LIB Release - DLL OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI.ActiveCfg = LIB Release - DLL Windows SSPI|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI.Build.0 = LIB Release - DLL Windows SSPI|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL.ActiveCfg = LIB Release - LIB OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL.Build.0 = LIB Release - LIB OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32\r
+       EndGlobalSection\r
+       GlobalSection(ExtensibilityGlobals) = postSolution\r
+       EndGlobalSection\r
+       GlobalSection(ExtensibilityAddIns) = postSolution\r
+       EndGlobalSection\r
+EndGlobal\r
index 7513d35..c5ca5d4 100644 (file)
@@ -1,87 +1,87 @@
-Microsoft Visual Studio Solution File, Format Version 8.00
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libcurl", "libcurl.vcproj", "{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}"
-       ProjectSection(ProjectDependencies) = postProject
-       EndProjectSection
-EndProject
-Global
-       GlobalSection(SolutionConfiguration) = preSolution
-               DLL Debug = DLL Debug
-               DLL Debug - DLL OpenSSL = DLL Debug - DLL OpenSSL
-               DLL Debug - DLL OpenSSL - DLL LibSSH2 = DLL Debug - DLL OpenSSL - DLL LibSSH2
-               DLL Debug - DLL Windows SSPI = DLL Debug - DLL Windows SSPI
-               DLL Debug - DLL Windows SSPI - DLL WinIDN = DLL Debug - DLL Windows SSPI - DLL WinIDN
-               DLL Release = DLL Release
-               DLL Release - DLL OpenSSL = DLL Release - DLL OpenSSL
-               DLL Release - DLL OpenSSL - DLL LibSSH2 = DLL Release - DLL OpenSSL - DLL LibSSH2
-               DLL Release - DLL Windows SSPI = DLL Release - DLL Windows SSPI
-               DLL Release - DLL Windows SSPI - DLL WinIDN = DLL Release - DLL Windows SSPI - DLL WinIDN
-               LIB Debug = LIB Debug
-               LIB Debug - DLL OpenSSL = LIB Debug - DLL OpenSSL
-               LIB Debug - DLL OpenSSL - DLL LibSSH2 = LIB Debug - DLL OpenSSL - DLL LibSSH2
-               LIB Debug - DLL Windows SSPI = LIB Debug - DLL Windows SSPI
-               LIB Debug - DLL Windows SSPI - DLL WinIDN = LIB Debug - DLL Windows SSPI - DLL WinIDN
-               LIB Debug - LIB OpenSSL = LIB Debug - LIB OpenSSL
-               LIB Debug - LIB OpenSSL - LIB LibSSH2 = LIB Debug - LIB OpenSSL - LIB LibSSH2
-               LIB Release = LIB Release
-               LIB Release - DLL OpenSSL = LIB Release - DLL OpenSSL
-               LIB Release - DLL OpenSSL - DLL LibSSH2 = LIB Release - DLL OpenSSL - DLL LibSSH2
-               LIB Release - DLL Windows SSPI = LIB Release - DLL Windows SSPI
-               LIB Release - DLL Windows SSPI - DLL WinIDN = LIB Release - DLL Windows SSPI - DLL WinIDN
-               LIB Release - LIB OpenSSL = LIB Release - LIB OpenSSL
-               LIB Release - LIB OpenSSL - LIB LibSSH2 = LIB Release - LIB OpenSSL - LIB LibSSH2
-       EndGlobalSection
-       GlobalSection(ProjectConfiguration) = postSolution
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug.ActiveCfg = DLL Debug|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug.Build.0 = DLL Debug|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL.ActiveCfg = DLL Debug - DLL OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL.Build.0 = DLL Debug - DLL OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI.Build.0 = DLL Debug - DLL Windows SSPI|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release.ActiveCfg = DLL Release|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release.Build.0 = DLL Release|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL.ActiveCfg = DLL Release - DLL OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL.Build.0 = DLL Release - DLL OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI.ActiveCfg = DLL Release - DLL Windows SSPI|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI.Build.0 = DLL Release - DLL Windows SSPI|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug.ActiveCfg = LIB Debug|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug.Build.0 = LIB Debug|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL.ActiveCfg = LIB Debug - DLL OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL.Build.0 = LIB Debug - DLL OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI.Build.0 = LIB Debug - DLL Windows SSPI|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL.ActiveCfg = LIB Debug - LIB OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL.Build.0 = LIB Debug - LIB OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release.ActiveCfg = LIB Release|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release.Build.0 = LIB Release|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL.ActiveCfg = LIB Release - DLL OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL.Build.0 = LIB Release - DLL OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI.ActiveCfg = LIB Release - DLL Windows SSPI|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI.Build.0 = LIB Release - DLL Windows SSPI|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL.ActiveCfg = LIB Release - LIB OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL.Build.0 = LIB Release - LIB OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
-       EndGlobalSection
-       GlobalSection(ExtensibilityGlobals) = postSolution
-       EndGlobalSection
-       GlobalSection(ExtensibilityAddIns) = postSolution
-       EndGlobalSection
-EndGlobal
+Microsoft Visual Studio Solution File, Format Version 8.00\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libcurl", "libcurl.vcproj", "{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}"\r
+       ProjectSection(ProjectDependencies) = postProject\r
+       EndProjectSection\r
+EndProject\r
+Global\r
+       GlobalSection(SolutionConfiguration) = preSolution\r
+               DLL Debug = DLL Debug\r
+               DLL Debug - DLL OpenSSL = DLL Debug - DLL OpenSSL\r
+               DLL Debug - DLL OpenSSL - DLL LibSSH2 = DLL Debug - DLL OpenSSL - DLL LibSSH2\r
+               DLL Debug - DLL Windows SSPI = DLL Debug - DLL Windows SSPI\r
+               DLL Debug - DLL Windows SSPI - DLL WinIDN = DLL Debug - DLL Windows SSPI - DLL WinIDN\r
+               DLL Release = DLL Release\r
+               DLL Release - DLL OpenSSL = DLL Release - DLL OpenSSL\r
+               DLL Release - DLL OpenSSL - DLL LibSSH2 = DLL Release - DLL OpenSSL - DLL LibSSH2\r
+               DLL Release - DLL Windows SSPI = DLL Release - DLL Windows SSPI\r
+               DLL Release - DLL Windows SSPI - DLL WinIDN = DLL Release - DLL Windows SSPI - DLL WinIDN\r
+               LIB Debug = LIB Debug\r
+               LIB Debug - DLL OpenSSL = LIB Debug - DLL OpenSSL\r
+               LIB Debug - DLL OpenSSL - DLL LibSSH2 = LIB Debug - DLL OpenSSL - DLL LibSSH2\r
+               LIB Debug - DLL Windows SSPI = LIB Debug - DLL Windows SSPI\r
+               LIB Debug - DLL Windows SSPI - DLL WinIDN = LIB Debug - DLL Windows SSPI - DLL WinIDN\r
+               LIB Debug - LIB OpenSSL = LIB Debug - LIB OpenSSL\r
+               LIB Debug - LIB OpenSSL - LIB LibSSH2 = LIB Debug - LIB OpenSSL - LIB LibSSH2\r
+               LIB Release = LIB Release\r
+               LIB Release - DLL OpenSSL = LIB Release - DLL OpenSSL\r
+               LIB Release - DLL OpenSSL - DLL LibSSH2 = LIB Release - DLL OpenSSL - DLL LibSSH2\r
+               LIB Release - DLL Windows SSPI = LIB Release - DLL Windows SSPI\r
+               LIB Release - DLL Windows SSPI - DLL WinIDN = LIB Release - DLL Windows SSPI - DLL WinIDN\r
+               LIB Release - LIB OpenSSL = LIB Release - LIB OpenSSL\r
+               LIB Release - LIB OpenSSL - LIB LibSSH2 = LIB Release - LIB OpenSSL - LIB LibSSH2\r
+       EndGlobalSection\r
+       GlobalSection(ProjectConfiguration) = postSolution\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug.ActiveCfg = DLL Debug|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug.Build.0 = DLL Debug|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL.ActiveCfg = DLL Debug - DLL OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL.Build.0 = DLL Debug - DLL OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI.Build.0 = DLL Debug - DLL Windows SSPI|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release.ActiveCfg = DLL Release|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release.Build.0 = DLL Release|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL.ActiveCfg = DLL Release - DLL OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL.Build.0 = DLL Release - DLL OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI.ActiveCfg = DLL Release - DLL Windows SSPI|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI.Build.0 = DLL Release - DLL Windows SSPI|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug.ActiveCfg = LIB Debug|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug.Build.0 = LIB Debug|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL.ActiveCfg = LIB Debug - DLL OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL.Build.0 = LIB Debug - DLL OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI.Build.0 = LIB Debug - DLL Windows SSPI|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL.ActiveCfg = LIB Debug - LIB OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL.Build.0 = LIB Debug - LIB OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release.ActiveCfg = LIB Release|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release.Build.0 = LIB Release|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL.ActiveCfg = LIB Release - DLL OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL.Build.0 = LIB Release - DLL OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI.ActiveCfg = LIB Release - DLL Windows SSPI|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI.Build.0 = LIB Release - DLL Windows SSPI|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL.ActiveCfg = LIB Release - LIB OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL.Build.0 = LIB Release - LIB OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32\r
+       EndGlobalSection\r
+       GlobalSection(ExtensibilityGlobals) = postSolution\r
+       EndGlobalSection\r
+       GlobalSection(ExtensibilityAddIns) = postSolution\r
+       EndGlobalSection\r
+EndGlobal\r
index 6a046a3..bde256b 100644 (file)
                        Name="Source Files"\r
                        Filter="">\r
                        <File\r
+                               RelativePath="..\..\..\..\lib\altsvc.c">\r
+                       </File>\r
+                       <File\r
                                RelativePath="..\..\..\..\lib\amigaos.c">\r
                        </File>\r
                        <File\r
                                RelativePath="..\..\..\..\lib\curl_gethostname.c">\r
                        </File>\r
                        <File\r
+                               RelativePath="..\..\..\..\lib\curl_get_line.c">\r
+                       </File>\r
+                       <File\r
                                RelativePath="..\..\..\..\lib\curl_gssapi.c">\r
                        </File>\r
                        <File\r
                                RelativePath="..\..\..\..\lib\pingpong.c">\r
                        </File>\r
                        <File\r
-                               RelativePath="..\..\..\..\lib\pipeline.c">\r
-                       </File>\r
-                       <File\r
                                RelativePath="..\..\..\..\lib\pop3.c">\r
                        </File>\r
                        <File\r
                                RelativePath="..\..\..\..\lib\smtp.c">\r
                        </File>\r
                        <File\r
+                               RelativePath="..\..\..\..\lib\socketpair.c">\r
+                       </File>\r
+                       <File\r
                                RelativePath="..\..\..\..\lib\socks.c">\r
                        </File>\r
                        <File\r
                                RelativePath="..\..\..\..\lib\splay.c">\r
                        </File>\r
                        <File\r
-                               RelativePath="..\..\..\..\lib\ssh.c">\r
-                       </File>\r
-                       <File\r
-                               RelativePath="..\..\..\..\lib\ssh-libssh.c">\r
-                       </File>\r
-                       <File\r
                                RelativePath="..\..\..\..\lib\strcase.c">\r
                        </File>\r
                        <File\r
                        Name="Header Files"\r
                        Filter="">\r
                        <File\r
+                               RelativePath="..\..\..\..\lib\altsvc.h">\r
+                       </File>\r
+                       <File\r
                                RelativePath="..\..\..\..\lib\amigaos.h">\r
                        </File>\r
                        <File\r
                                RelativePath="..\..\..\..\lib\curl_gethostname.h">\r
                        </File>\r
                        <File\r
+                               RelativePath="..\..\..\..\lib\curl_get_line.h">\r
+                       </File>\r
+                       <File\r
                                RelativePath="..\..\..\..\lib\curl_gssapi.h">\r
                        </File>\r
                        <File\r
                                RelativePath="..\..\..\..\lib\pingpong.h">\r
                        </File>\r
                        <File\r
-                               RelativePath="..\..\..\..\lib\pipeline.h">\r
-                       </File>\r
-                       <File\r
                                RelativePath="..\..\..\..\lib\pop3.h">\r
                        </File>\r
                        <File\r
                                RelativePath="..\..\..\..\lib\psl.h">\r
                        </File>\r
                        <File\r
+                               RelativePath="..\..\..\..\lib\quic.h">\r
+                       </File>\r
+                       <File\r
                                RelativePath="..\..\..\..\lib\rand.h">\r
                        </File>\r
                        <File\r
                                RelativePath="..\..\..\..\lib\sockaddr.h">\r
                        </File>\r
                        <File\r
+                               RelativePath="..\..\..\..\lib\socketpair.h">\r
+                       </File>\r
+                       <File\r
                                RelativePath="..\..\..\..\lib\socks.h">\r
                        </File>\r
                        <File\r
                                RelativePath="..\..\..\..\lib\splay.h">\r
                        </File>\r
                        <File\r
-                               RelativePath="..\..\..\..\lib\ssh.h">\r
-                       </File>\r
-                       <File\r
                                RelativePath="..\..\..\..\lib\strcase.h">\r
                        </File>\r
                        <File\r
                        </Filter>\r
                </Filter>\r
                <Filter\r
-                       Name="vtls"\r
+                       Name="vquic"\r
+                       Filter="">\r
+                       <Filter\r
+                               Name="Source Files"\r
+                               Filter="">\r
+                               <File\r
+                                       RelativePath="..\..\..\..\lib\vquic\ngtcp2.c">\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\..\lib\vquic\quiche.c">\r
+                               </File>\r
+                       </Filter>\r
+                       <Filter\r
+                               Name="Header Files"\r
+                               Filter="">\r
+                               <File\r
+                                       RelativePath="..\..\..\..\lib\vquic\ngtcp2.h">\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\..\lib\vquic\quiche.h">\r
+                               </File>\r
+                       </Filter>\r
+               </Filter>\r
+               <Filter\r
+                       Name="vssh"\r
                        Filter="">\r
                        <Filter\r
                                Name="Source Files"\r
                                Filter="">\r
                                <File\r
-                                       RelativePath="..\..\..\..\lib\vtls\axtls.c">\r
+                                       RelativePath="..\..\..\..\lib\vssh\libssh2.c">\r
                                </File>\r
                                <File\r
-                                       RelativePath="..\..\..\..\lib\vtls\cyassl.c">\r
+                                       RelativePath="..\..\..\..\lib\vssh\libssh.c">\r
                                </File>\r
+                       </Filter>\r
+                       <Filter\r
+                               Name="Header Files"\r
+                               Filter="">\r
                                <File\r
-                                       RelativePath="..\..\..\..\lib\vtls\darwinssl.c">\r
+                                       RelativePath="..\..\..\..\lib\vssh\ssh.h">\r
+                               </File>\r
+                       </Filter>\r
+               </Filter>\r
+               <Filter\r
+                       Name="vtls"\r
+                       Filter="">\r
+                       <Filter\r
+                               Name="Source Files"\r
+                               Filter="">\r
+                               <File\r
+                                       RelativePath="..\..\..\..\lib\vtls\bearssl.c">\r
                                </File>\r
                                <File\r
                                        RelativePath="..\..\..\..\lib\vtls\gskit.c">\r
                                        RelativePath="..\..\..\..\lib\vtls\schannel_verify.c">\r
                                </File>\r
                                <File\r
+                                       RelativePath="..\..\..\..\lib\vtls\sectransp.c">\r
+                               </File>\r
+                               <File\r
                                        RelativePath="..\..\..\..\lib\vtls\vtls.c">\r
                                </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\..\lib\vtls\wolfssl.c">\r
+                               </File>\r
                        </Filter>\r
                        <Filter\r
                                Name="Header Files"\r
                                Filter="">\r
                                <File\r
-                                       RelativePath="..\..\..\..\lib\vtls\axtls.h">\r
-                               </File>\r
-                               <File\r
-                                       RelativePath="..\..\..\..\lib\vtls\cyassl.h">\r
-                               </File>\r
-                               <File\r
-                                       RelativePath="..\..\..\..\lib\vtls\darwinssl.h">\r
+                                       RelativePath="..\..\..\..\lib\vtls\bearssl.h">\r
                                </File>\r
                                <File\r
                                        RelativePath="..\..\..\..\lib\vtls\gskit.h">\r
                                        RelativePath="..\..\..\..\lib\vtls\schannel.h">\r
                                </File>\r
                                <File\r
+                                       RelativePath="..\..\..\..\lib\vtls\sectransp.h">\r
+                               </File>\r
+                               <File\r
                                        RelativePath="..\..\..\..\lib\vtls\vtls.h">\r
                                </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\..\lib\vtls\wolfssl.h">\r
+                               </File>\r
                        </Filter>\r
                </Filter>\r
        </Files>\r
index 41ebb61..d92eb5d 100644 (file)
@@ -1,87 +1,87 @@
-Microsoft Visual Studio Solution File, Format Version 8.00
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "curl", "curl.vcproj", "{5228E9CE-A216-422F-A5E6-58E95E2DD71D}"
-       ProjectSection(ProjectDependencies) = postProject
-       EndProjectSection
-EndProject
-Global
-       GlobalSection(SolutionConfiguration) = preSolution
-               DLL Debug = DLL Debug
-               DLL Debug - DLL OpenSSL = DLL Debug - DLL OpenSSL
-               DLL Debug - DLL OpenSSL - DLL LibSSH2 = DLL Debug - DLL OpenSSL - DLL LibSSH2
-               DLL Debug - DLL Windows SSPI = DLL Debug - DLL Windows SSPI
-               DLL Debug - DLL Windows SSPI - DLL WinIDN = DLL Debug - DLL Windows SSPI - DLL WinIDN
-               DLL Release = DLL Release
-               DLL Release - DLL OpenSSL = DLL Release - DLL OpenSSL
-               DLL Release - DLL OpenSSL - DLL LibSSH2 = DLL Release - DLL OpenSSL - DLL LibSSH2
-               DLL Release - DLL Windows SSPI = DLL Release - DLL Windows SSPI
-               DLL Release - DLL Windows SSPI - DLL WinIDN = DLL Release - DLL Windows SSPI - DLL WinIDN
-               LIB Debug = LIB Debug
-               LIB Debug - DLL OpenSSL = LIB Debug - DLL OpenSSL
-               LIB Debug - DLL OpenSSL - DLL LibSSH2 = LIB Debug - DLL OpenSSL - DLL LibSSH2
-               LIB Debug - DLL Windows SSPI = LIB Debug - DLL Windows SSPI
-               LIB Debug - DLL Windows SSPI - DLL WinIDN = LIB Debug - DLL Windows SSPI - DLL WinIDN
-               LIB Debug - LIB OpenSSL = LIB Debug - LIB OpenSSL
-               LIB Debug - LIB OpenSSL - LIB LibSSH2 = LIB Debug - LIB OpenSSL - LIB LibSSH2
-               LIB Release = LIB Release
-               LIB Release - DLL OpenSSL = LIB Release - DLL OpenSSL
-               LIB Release - DLL OpenSSL - DLL LibSSH2 = LIB Release - DLL OpenSSL - DLL LibSSH2
-               LIB Release - DLL Windows SSPI = LIB Release - DLL Windows SSPI
-               LIB Release - DLL Windows SSPI - DLL WinIDN = LIB Release - DLL Windows SSPI - DLL WinIDN
-               LIB Release - LIB OpenSSL = LIB Release - LIB OpenSSL
-               LIB Release - LIB OpenSSL - LIB LibSSH2 = LIB Release - LIB OpenSSL - LIB LibSSH2
-       EndGlobalSection
-       GlobalSection(ProjectConfiguration) = postSolution
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug.ActiveCfg = DLL Debug|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug.Build.0 = DLL Debug|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL.ActiveCfg = DLL Debug - DLL OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL.Build.0 = DLL Debug - DLL OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI.Build.0 = DLL Debug - DLL Windows SSPI|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release.ActiveCfg = DLL Release|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release.Build.0 = DLL Release|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL.ActiveCfg = DLL Release - DLL OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL.Build.0 = DLL Release - DLL OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI.ActiveCfg = DLL Release - DLL Windows SSPI|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI.Build.0 = DLL Release - DLL Windows SSPI|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug.ActiveCfg = LIB Debug|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug.Build.0 = LIB Debug|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL.ActiveCfg = LIB Debug - DLL OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL.Build.0 = LIB Debug - DLL OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI.Build.0 = LIB Debug - DLL Windows SSPI|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL.ActiveCfg = LIB Debug - LIB OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL.Build.0 = LIB Debug - LIB OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release.ActiveCfg = LIB Release|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release.Build.0 = LIB Release|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL.ActiveCfg = LIB Release - DLL OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL.Build.0 = LIB Release - DLL OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI.ActiveCfg = LIB Release - DLL Windows SSPI|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI.Build.0 = LIB Release - DLL Windows SSPI|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL.ActiveCfg = LIB Release - LIB OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL.Build.0 = LIB Release - LIB OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
-       EndGlobalSection
-       GlobalSection(ExtensibilityGlobals) = postSolution
-       EndGlobalSection
-       GlobalSection(ExtensibilityAddIns) = postSolution
-       EndGlobalSection
-EndGlobal
+Microsoft Visual Studio Solution File, Format Version 8.00\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "curl", "curl.vcproj", "{5228E9CE-A216-422F-A5E6-58E95E2DD71D}"\r
+       ProjectSection(ProjectDependencies) = postProject\r
+       EndProjectSection\r
+EndProject\r
+Global\r
+       GlobalSection(SolutionConfiguration) = preSolution\r
+               DLL Debug = DLL Debug\r
+               DLL Debug - DLL OpenSSL = DLL Debug - DLL OpenSSL\r
+               DLL Debug - DLL OpenSSL - DLL LibSSH2 = DLL Debug - DLL OpenSSL - DLL LibSSH2\r
+               DLL Debug - DLL Windows SSPI = DLL Debug - DLL Windows SSPI\r
+               DLL Debug - DLL Windows SSPI - DLL WinIDN = DLL Debug - DLL Windows SSPI - DLL WinIDN\r
+               DLL Release = DLL Release\r
+               DLL Release - DLL OpenSSL = DLL Release - DLL OpenSSL\r
+               DLL Release - DLL OpenSSL - DLL LibSSH2 = DLL Release - DLL OpenSSL - DLL LibSSH2\r
+               DLL Release - DLL Windows SSPI = DLL Release - DLL Windows SSPI\r
+               DLL Release - DLL Windows SSPI - DLL WinIDN = DLL Release - DLL Windows SSPI - DLL WinIDN\r
+               LIB Debug = LIB Debug\r
+               LIB Debug - DLL OpenSSL = LIB Debug - DLL OpenSSL\r
+               LIB Debug - DLL OpenSSL - DLL LibSSH2 = LIB Debug - DLL OpenSSL - DLL LibSSH2\r
+               LIB Debug - DLL Windows SSPI = LIB Debug - DLL Windows SSPI\r
+               LIB Debug - DLL Windows SSPI - DLL WinIDN = LIB Debug - DLL Windows SSPI - DLL WinIDN\r
+               LIB Debug - LIB OpenSSL = LIB Debug - LIB OpenSSL\r
+               LIB Debug - LIB OpenSSL - LIB LibSSH2 = LIB Debug - LIB OpenSSL - LIB LibSSH2\r
+               LIB Release = LIB Release\r
+               LIB Release - DLL OpenSSL = LIB Release - DLL OpenSSL\r
+               LIB Release - DLL OpenSSL - DLL LibSSH2 = LIB Release - DLL OpenSSL - DLL LibSSH2\r
+               LIB Release - DLL Windows SSPI = LIB Release - DLL Windows SSPI\r
+               LIB Release - DLL Windows SSPI - DLL WinIDN = LIB Release - DLL Windows SSPI - DLL WinIDN\r
+               LIB Release - LIB OpenSSL = LIB Release - LIB OpenSSL\r
+               LIB Release - LIB OpenSSL - LIB LibSSH2 = LIB Release - LIB OpenSSL - LIB LibSSH2\r
+       EndGlobalSection\r
+       GlobalSection(ProjectConfiguration) = postSolution\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug.ActiveCfg = DLL Debug|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug.Build.0 = DLL Debug|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL.ActiveCfg = DLL Debug - DLL OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL.Build.0 = DLL Debug - DLL OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI.Build.0 = DLL Debug - DLL Windows SSPI|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release.ActiveCfg = DLL Release|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release.Build.0 = DLL Release|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL.ActiveCfg = DLL Release - DLL OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL.Build.0 = DLL Release - DLL OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI.ActiveCfg = DLL Release - DLL Windows SSPI|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI.Build.0 = DLL Release - DLL Windows SSPI|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug.ActiveCfg = LIB Debug|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug.Build.0 = LIB Debug|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL.ActiveCfg = LIB Debug - DLL OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL.Build.0 = LIB Debug - DLL OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI.Build.0 = LIB Debug - DLL Windows SSPI|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL.ActiveCfg = LIB Debug - LIB OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL.Build.0 = LIB Debug - LIB OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release.ActiveCfg = LIB Release|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release.Build.0 = LIB Release|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL.ActiveCfg = LIB Release - DLL OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL.Build.0 = LIB Release - DLL OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI.ActiveCfg = LIB Release - DLL Windows SSPI|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI.Build.0 = LIB Release - DLL Windows SSPI|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL.ActiveCfg = LIB Release - LIB OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL.Build.0 = LIB Release - LIB OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32\r
+       EndGlobalSection\r
+       GlobalSection(ExtensibilityGlobals) = postSolution\r
+       EndGlobalSection\r
+       GlobalSection(ExtensibilityAddIns) = postSolution\r
+       EndGlobalSection\r
+EndGlobal\r
index 8fecea6..00f6a7f 100644 (file)
                                RelativePath="..\..\..\..\src\tool_parsecfg.c">\r
                        </File>\r
                        <File\r
+                               RelativePath="..\..\..\..\src\tool_progress.c">\r
+                       </File>\r
+                       <File\r
                                RelativePath="..\..\..\..\src\tool_setopt.c">\r
                        </File>\r
                        <File\r
                                RelativePath="..\..\..\..\src\tool_parsecfg.h">\r
                        </File>\r
                        <File\r
+                               RelativePath="..\..\..\..\src\tool_progress.h">\r
+                       </File>\r
+                       <File\r
                                RelativePath="..\..\..\..\src\tool_sdecls.h">\r
                        </File>\r
                        <File\r
index b0746d8..879f7d1 100644 (file)
-Microsoft Visual Studio Solution File, Format Version 7.00
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "curl", "src\curl.vcproj", "{5228E9CE-A216-422F-A5E6-58E95E2DD71D}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libcurl", "lib\libcurl.vcproj", "{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}"
-EndProject
-Global
-       GlobalSection(SolutionConfiguration) = preSolution
-               ConfigName.0 = DLL Debug
-               ConfigName.1 = DLL Debug - DLL OpenSSL
-               ConfigName.2 = DLL Debug - DLL OpenSSL - DLL LibSSH2
-               ConfigName.3 = DLL Debug - DLL Windows SSPI
-               ConfigName.4 = DLL Debug - DLL Windows SSPI - DLL WinIDN
-               ConfigName.5 = DLL Release
-               ConfigName.6 = DLL Release - DLL OpenSSL
-               ConfigName.7 = DLL Release - DLL OpenSSL - DLL LibSSH2
-               ConfigName.8 = DLL Release - DLL Windows SSPI
-               ConfigName.9 = DLL Release - DLL Windows SSPI - DLL WinIDN
-               ConfigName.10 = LIB Debug
-               ConfigName.11 = LIB Debug - DLL OpenSSL
-               ConfigName.12 = LIB Debug - DLL OpenSSL - DLL LibSSH2
-               ConfigName.13 = LIB Debug - DLL Windows SSPI
-               ConfigName.14 = LIB Debug - DLL Windows SSPI - DLL WinIDN
-               ConfigName.15 = LIB Debug - LIB OpenSSL
-               ConfigName.16 = LIB Debug - LIB OpenSSL - LIB LibSSH2
-               ConfigName.17 = LIB Release
-               ConfigName.18 = LIB Release - DLL OpenSSL
-               ConfigName.19 = LIB Release - DLL OpenSSL - DLL LibSSH2
-               ConfigName.20 = LIB Release - DLL Windows SSPI
-               ConfigName.21 = LIB Release - DLL Windows SSPI - DLL WinIDN
-               ConfigName.22 = LIB Release - LIB OpenSSL
-               ConfigName.23 = LIB Release - LIB OpenSSL - LIB LibSSH2
-       EndGlobalSection
-       GlobalSection(ProjectDependencies) = postSolution
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.0 = {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}
-       EndGlobalSection
-       GlobalSection(ProjectConfiguration) = postSolution
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug.ActiveCfg = DLL Debug|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug.Build.0 = DLL Debug|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL.ActiveCfg = DLL Debug - DLL OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL.Build.0 = DLL Debug - DLL OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI.Build.0 = DLL Debug - DLL Windows SSPI|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release.ActiveCfg = DLL Release|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release.Build.0 = DLL Release|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL.ActiveCfg = DLL Release - DLL OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL.Build.0 = DLL Release - DLL OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI.ActiveCfg = DLL Release - DLL Windows SSPI|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI.Build.0 = DLL Release - DLL Windows SSPI|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug.ActiveCfg = LIB Debug|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug.Build.0 = LIB Debug|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL.ActiveCfg = LIB Debug - DLL OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL.Build.0 = LIB Debug - DLL OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI.Build.0 = LIB Debug - DLL Windows SSPI|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL.ActiveCfg = LIB Debug - LIB OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL.Build.0 = LIB Debug - LIB OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release.ActiveCfg = LIB Release|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release.Build.0 = LIB Release|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL.ActiveCfg = LIB Release - DLL OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL.Build.0 = LIB Release - DLL OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI.ActiveCfg = LIB Release - DLL Windows SSPI|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI.Build.0 = LIB Release - DLL Windows SSPI|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL.ActiveCfg = LIB Release - LIB OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL.Build.0 = LIB Release - LIB OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug.ActiveCfg = DLL Debug|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug.Build.0 = DLL Debug|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL.ActiveCfg = DLL Debug - DLL OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL.Build.0 = DLL Debug - DLL OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI.Build.0 = DLL Debug - DLL Windows SSPI|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release.ActiveCfg = DLL Release|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release.Build.0 = DLL Release|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL.ActiveCfg = DLL Release - DLL OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL.Build.0 = DLL Release - DLL OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI.ActiveCfg = DLL Release - DLL Windows SSPI|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI.Build.0 = DLL Release - DLL Windows SSPI|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug.ActiveCfg = LIB Debug|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug.Build.0 = LIB Debug|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL.ActiveCfg = LIB Debug - DLL OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL.Build.0 = LIB Debug - DLL OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI.Build.0 = LIB Debug - DLL Windows SSPI|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL.ActiveCfg = LIB Debug - LIB OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL.Build.0 = LIB Debug - LIB OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release.ActiveCfg = LIB Release|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release.Build.0 = LIB Release|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL.ActiveCfg = LIB Release - DLL OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL.Build.0 = LIB Release - DLL OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI.ActiveCfg = LIB Release - DLL Windows SSPI|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI.Build.0 = LIB Release - DLL Windows SSPI|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL.ActiveCfg = LIB Release - LIB OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL.Build.0 = LIB Release - LIB OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
-       EndGlobalSection
-       GlobalSection(ExtensibilityGlobals) = postSolution
-       EndGlobalSection
-       GlobalSection(ExtensibilityAddIns) = postSolution
-       EndGlobalSection
-EndGlobal
+Microsoft Visual Studio Solution File, Format Version 7.00\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "curl", "src\curl.vcproj", "{5228E9CE-A216-422F-A5E6-58E95E2DD71D}"\r
+EndProject\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libcurl", "lib\libcurl.vcproj", "{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}"\r
+EndProject\r
+Global\r
+       GlobalSection(SolutionConfiguration) = preSolution\r
+               ConfigName.0 = DLL Debug\r
+               ConfigName.1 = DLL Debug - DLL OpenSSL\r
+               ConfigName.2 = DLL Debug - DLL OpenSSL - DLL LibSSH2\r
+               ConfigName.3 = DLL Debug - DLL Windows SSPI\r
+               ConfigName.4 = DLL Debug - DLL Windows SSPI - DLL WinIDN\r
+               ConfigName.5 = DLL Release\r
+               ConfigName.6 = DLL Release - DLL OpenSSL\r
+               ConfigName.7 = DLL Release - DLL OpenSSL - DLL LibSSH2\r
+               ConfigName.8 = DLL Release - DLL Windows SSPI\r
+               ConfigName.9 = DLL Release - DLL Windows SSPI - DLL WinIDN\r
+               ConfigName.10 = LIB Debug\r
+               ConfigName.11 = LIB Debug - DLL OpenSSL\r
+               ConfigName.12 = LIB Debug - DLL OpenSSL - DLL LibSSH2\r
+               ConfigName.13 = LIB Debug - DLL Windows SSPI\r
+               ConfigName.14 = LIB Debug - DLL Windows SSPI - DLL WinIDN\r
+               ConfigName.15 = LIB Debug - LIB OpenSSL\r
+               ConfigName.16 = LIB Debug - LIB OpenSSL - LIB LibSSH2\r
+               ConfigName.17 = LIB Release\r
+               ConfigName.18 = LIB Release - DLL OpenSSL\r
+               ConfigName.19 = LIB Release - DLL OpenSSL - DLL LibSSH2\r
+               ConfigName.20 = LIB Release - DLL Windows SSPI\r
+               ConfigName.21 = LIB Release - DLL Windows SSPI - DLL WinIDN\r
+               ConfigName.22 = LIB Release - LIB OpenSSL\r
+               ConfigName.23 = LIB Release - LIB OpenSSL - LIB LibSSH2\r
+       EndGlobalSection\r
+       GlobalSection(ProjectDependencies) = postSolution\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.0 = {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}\r
+       EndGlobalSection\r
+       GlobalSection(ProjectConfiguration) = postSolution\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug.ActiveCfg = DLL Debug|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug.Build.0 = DLL Debug|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL.ActiveCfg = DLL Debug - DLL OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL.Build.0 = DLL Debug - DLL OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI.Build.0 = DLL Debug - DLL Windows SSPI|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release.ActiveCfg = DLL Release|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release.Build.0 = DLL Release|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL.ActiveCfg = DLL Release - DLL OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL.Build.0 = DLL Release - DLL OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI.ActiveCfg = DLL Release - DLL Windows SSPI|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI.Build.0 = DLL Release - DLL Windows SSPI|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug.ActiveCfg = LIB Debug|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug.Build.0 = LIB Debug|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL.ActiveCfg = LIB Debug - DLL OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL.Build.0 = LIB Debug - DLL OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI.Build.0 = LIB Debug - DLL Windows SSPI|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL.ActiveCfg = LIB Debug - LIB OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL.Build.0 = LIB Debug - LIB OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release.ActiveCfg = LIB Release|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release.Build.0 = LIB Release|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL.ActiveCfg = LIB Release - DLL OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL.Build.0 = LIB Release - DLL OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI.ActiveCfg = LIB Release - DLL Windows SSPI|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI.Build.0 = LIB Release - DLL Windows SSPI|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL.ActiveCfg = LIB Release - LIB OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL.Build.0 = LIB Release - LIB OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug.ActiveCfg = DLL Debug|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug.Build.0 = DLL Debug|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL.ActiveCfg = DLL Debug - DLL OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL.Build.0 = DLL Debug - DLL OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI.Build.0 = DLL Debug - DLL Windows SSPI|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release.ActiveCfg = DLL Release|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release.Build.0 = DLL Release|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL.ActiveCfg = DLL Release - DLL OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL.Build.0 = DLL Release - DLL OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI.ActiveCfg = DLL Release - DLL Windows SSPI|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI.Build.0 = DLL Release - DLL Windows SSPI|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug.ActiveCfg = LIB Debug|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug.Build.0 = LIB Debug|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL.ActiveCfg = LIB Debug - DLL OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL.Build.0 = LIB Debug - DLL OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI.Build.0 = LIB Debug - DLL Windows SSPI|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL.ActiveCfg = LIB Debug - LIB OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL.Build.0 = LIB Debug - LIB OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release.ActiveCfg = LIB Release|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release.Build.0 = LIB Release|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL.ActiveCfg = LIB Release - DLL OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL.Build.0 = LIB Release - DLL OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI.ActiveCfg = LIB Release - DLL Windows SSPI|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI.Build.0 = LIB Release - DLL Windows SSPI|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL.ActiveCfg = LIB Release - LIB OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL.Build.0 = LIB Release - LIB OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32\r
+       EndGlobalSection\r
+       GlobalSection(ExtensibilityGlobals) = postSolution\r
+       EndGlobalSection\r
+       GlobalSection(ExtensibilityAddIns) = postSolution\r
+       EndGlobalSection\r
+EndGlobal\r
index f092661..cc375bb 100644 (file)
@@ -1,87 +1,87 @@
-Microsoft Visual Studio Solution File, Format Version 7.00
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libcurl", "libcurl.vcproj", "{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}"
-EndProject
-Global
-       GlobalSection(SolutionConfiguration) = preSolution
-               ConfigName.0 = DLL Debug
-               ConfigName.1 = DLL Debug - DLL OpenSSL
-               ConfigName.2 = DLL Debug - DLL OpenSSL - DLL LibSSH2
-               ConfigName.3 = DLL Debug - DLL Windows SSPI
-               ConfigName.4 = DLL Debug - DLL Windows SSPI - DLL WinIDN
-               ConfigName.5 = DLL Release
-               ConfigName.6 = DLL Release - DLL OpenSSL
-               ConfigName.7 = DLL Release - DLL OpenSSL - DLL LibSSH2
-               ConfigName.8 = DLL Release - DLL Windows SSPI
-               ConfigName.9 = DLL Release - DLL Windows SSPI - DLL WinIDN
-               ConfigName.10 = LIB Debug
-               ConfigName.11 = LIB Debug - DLL OpenSSL
-               ConfigName.12 = LIB Debug - DLL OpenSSL - DLL LibSSH2
-               ConfigName.13 = LIB Debug - DLL Windows SSPI
-               ConfigName.14 = LIB Debug - DLL Windows SSPI - DLL WinIDN
-               ConfigName.15 = LIB Debug - LIB OpenSSL
-               ConfigName.16 = LIB Debug - LIB OpenSSL - LIB LibSSH2
-               ConfigName.17 = LIB Release
-               ConfigName.18 = LIB Release - DLL OpenSSL
-               ConfigName.19 = LIB Release - DLL OpenSSL - DLL LibSSH2
-               ConfigName.20 = LIB Release - DLL Windows SSPI
-               ConfigName.21 = LIB Release - DLL Windows SSPI - DLL WinIDN
-               ConfigName.22 = LIB Release - LIB OpenSSL
-               ConfigName.23 = LIB Release - LIB OpenSSL - LIB LibSSH2
-       EndGlobalSection
-       GlobalSection(ProjectDependencies) = postSolution
-       EndGlobalSection
-       GlobalSection(ProjectConfiguration) = postSolution
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug.ActiveCfg = DLL Debug|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug.Build.0 = DLL Debug|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL.ActiveCfg = DLL Debug - DLL OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL.Build.0 = DLL Debug - DLL OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI.Build.0 = DLL Debug - DLL Windows SSPI|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release.ActiveCfg = DLL Release|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release.Build.0 = DLL Release|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL.ActiveCfg = DLL Release - DLL OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL.Build.0 = DLL Release - DLL OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI.ActiveCfg = DLL Release - DLL Windows SSPI|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI.Build.0 = DLL Release - DLL Windows SSPI|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug.ActiveCfg = LIB Debug|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug.Build.0 = LIB Debug|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL.ActiveCfg = LIB Debug - DLL OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL.Build.0 = LIB Debug - DLL OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI.Build.0 = LIB Debug - DLL Windows SSPI|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL.ActiveCfg = LIB Debug - LIB OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL.Build.0 = LIB Debug - LIB OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release.ActiveCfg = LIB Release|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release.Build.0 = LIB Release|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL.ActiveCfg = LIB Release - DLL OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL.Build.0 = LIB Release - DLL OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI.ActiveCfg = LIB Release - DLL Windows SSPI|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI.Build.0 = LIB Release - DLL Windows SSPI|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL.ActiveCfg = LIB Release - LIB OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL.Build.0 = LIB Release - LIB OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
-       EndGlobalSection
-       GlobalSection(ExtensibilityGlobals) = postSolution
-       EndGlobalSection
-       GlobalSection(ExtensibilityAddIns) = postSolution
-       EndGlobalSection
-EndGlobal
+Microsoft Visual Studio Solution File, Format Version 7.00\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libcurl", "libcurl.vcproj", "{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}"\r
+EndProject\r
+Global\r
+       GlobalSection(SolutionConfiguration) = preSolution\r
+               ConfigName.0 = DLL Debug\r
+               ConfigName.1 = DLL Debug - DLL OpenSSL\r
+               ConfigName.2 = DLL Debug - DLL OpenSSL - DLL LibSSH2\r
+               ConfigName.3 = DLL Debug - DLL Windows SSPI\r
+               ConfigName.4 = DLL Debug - DLL Windows SSPI - DLL WinIDN\r
+               ConfigName.5 = DLL Release\r
+               ConfigName.6 = DLL Release - DLL OpenSSL\r
+               ConfigName.7 = DLL Release - DLL OpenSSL - DLL LibSSH2\r
+               ConfigName.8 = DLL Release - DLL Windows SSPI\r
+               ConfigName.9 = DLL Release - DLL Windows SSPI - DLL WinIDN\r
+               ConfigName.10 = LIB Debug\r
+               ConfigName.11 = LIB Debug - DLL OpenSSL\r
+               ConfigName.12 = LIB Debug - DLL OpenSSL - DLL LibSSH2\r
+               ConfigName.13 = LIB Debug - DLL Windows SSPI\r
+               ConfigName.14 = LIB Debug - DLL Windows SSPI - DLL WinIDN\r
+               ConfigName.15 = LIB Debug - LIB OpenSSL\r
+               ConfigName.16 = LIB Debug - LIB OpenSSL - LIB LibSSH2\r
+               ConfigName.17 = LIB Release\r
+               ConfigName.18 = LIB Release - DLL OpenSSL\r
+               ConfigName.19 = LIB Release - DLL OpenSSL - DLL LibSSH2\r
+               ConfigName.20 = LIB Release - DLL Windows SSPI\r
+               ConfigName.21 = LIB Release - DLL Windows SSPI - DLL WinIDN\r
+               ConfigName.22 = LIB Release - LIB OpenSSL\r
+               ConfigName.23 = LIB Release - LIB OpenSSL - LIB LibSSH2\r
+       EndGlobalSection\r
+       GlobalSection(ProjectDependencies) = postSolution\r
+       EndGlobalSection\r
+       GlobalSection(ProjectConfiguration) = postSolution\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug.ActiveCfg = DLL Debug|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug.Build.0 = DLL Debug|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL.ActiveCfg = DLL Debug - DLL OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL.Build.0 = DLL Debug - DLL OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI.Build.0 = DLL Debug - DLL Windows SSPI|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release.ActiveCfg = DLL Release|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release.Build.0 = DLL Release|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL.ActiveCfg = DLL Release - DLL OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL.Build.0 = DLL Release - DLL OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI.ActiveCfg = DLL Release - DLL Windows SSPI|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI.Build.0 = DLL Release - DLL Windows SSPI|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug.ActiveCfg = LIB Debug|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug.Build.0 = LIB Debug|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL.ActiveCfg = LIB Debug - DLL OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL.Build.0 = LIB Debug - DLL OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI.Build.0 = LIB Debug - DLL Windows SSPI|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL.ActiveCfg = LIB Debug - LIB OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL.Build.0 = LIB Debug - LIB OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release.ActiveCfg = LIB Release|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release.Build.0 = LIB Release|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL.ActiveCfg = LIB Release - DLL OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL.Build.0 = LIB Release - DLL OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI.ActiveCfg = LIB Release - DLL Windows SSPI|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI.Build.0 = LIB Release - DLL Windows SSPI|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL.ActiveCfg = LIB Release - LIB OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL.Build.0 = LIB Release - LIB OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32\r
+       EndGlobalSection\r
+       GlobalSection(ExtensibilityGlobals) = postSolution\r
+       EndGlobalSection\r
+       GlobalSection(ExtensibilityAddIns) = postSolution\r
+       EndGlobalSection\r
+EndGlobal\r
index 1c3866d..b6b349f 100644 (file)
                        Name="Source Files"\r
                        Filter="">\r
                        <File\r
+                               RelativePath="..\..\..\..\lib\altsvc.c">\r
+                       </File>\r
+                       <File\r
                                RelativePath="..\..\..\..\lib\amigaos.c">\r
                        </File>\r
                        <File\r
                                RelativePath="..\..\..\..\lib\curl_gethostname.c">\r
                        </File>\r
                        <File\r
+                               RelativePath="..\..\..\..\lib\curl_get_line.c">\r
+                       </File>\r
+                       <File\r
                                RelativePath="..\..\..\..\lib\curl_gssapi.c">\r
                        </File>\r
                        <File\r
                                RelativePath="..\..\..\..\lib\pingpong.c">\r
                        </File>\r
                        <File\r
-                               RelativePath="..\..\..\..\lib\pipeline.c">\r
-                       </File>\r
-                       <File\r
                                RelativePath="..\..\..\..\lib\pop3.c">\r
                        </File>\r
                        <File\r
                                RelativePath="..\..\..\..\lib\smtp.c">\r
                        </File>\r
                        <File\r
+                               RelativePath="..\..\..\..\lib\socketpair.c">\r
+                       </File>\r
+                       <File\r
                                RelativePath="..\..\..\..\lib\socks.c">\r
                        </File>\r
                        <File\r
                                RelativePath="..\..\..\..\lib\splay.c">\r
                        </File>\r
                        <File\r
-                               RelativePath="..\..\..\..\lib\ssh.c">\r
-                       </File>\r
-                       <File\r
-                               RelativePath="..\..\..\..\lib\ssh-libssh.c">\r
-                       </File>\r
-                       <File\r
                                RelativePath="..\..\..\..\lib\strcase.c">\r
                        </File>\r
                        <File\r
                        Name="Header Files"\r
                        Filter="">\r
                        <File\r
+                               RelativePath="..\..\..\..\lib\altsvc.h">\r
+                       </File>\r
+                       <File\r
                                RelativePath="..\..\..\..\lib\amigaos.h">\r
                        </File>\r
                        <File\r
                                RelativePath="..\..\..\..\lib\curl_gethostname.h">\r
                        </File>\r
                        <File\r
+                               RelativePath="..\..\..\..\lib\curl_get_line.h">\r
+                       </File>\r
+                       <File\r
                                RelativePath="..\..\..\..\lib\curl_gssapi.h">\r
                        </File>\r
                        <File\r
                                RelativePath="..\..\..\..\lib\pingpong.h">\r
                        </File>\r
                        <File\r
-                               RelativePath="..\..\..\..\lib\pipeline.h">\r
-                       </File>\r
-                       <File\r
                                RelativePath="..\..\..\..\lib\pop3.h">\r
                        </File>\r
                        <File\r
                                RelativePath="..\..\..\..\lib\psl.h">\r
                        </File>\r
                        <File\r
+                               RelativePath="..\..\..\..\lib\quic.h">\r
+                       </File>\r
+                       <File\r
                                RelativePath="..\..\..\..\lib\rand.h">\r
                        </File>\r
                        <File\r
                                RelativePath="..\..\..\..\lib\sockaddr.h">\r
                        </File>\r
                        <File\r
+                               RelativePath="..\..\..\..\lib\socketpair.h">\r
+                       </File>\r
+                       <File\r
                                RelativePath="..\..\..\..\lib\socks.h">\r
                        </File>\r
                        <File\r
                                RelativePath="..\..\..\..\lib\splay.h">\r
                        </File>\r
                        <File\r
-                               RelativePath="..\..\..\..\lib\ssh.h">\r
-                       </File>\r
-                       <File\r
                                RelativePath="..\..\..\..\lib\strcase.h">\r
                        </File>\r
                        <File\r
                        </Filter>\r
                </Filter>\r
                <Filter\r
-                       Name="vtls"\r
+                       Name="vquic"\r
+                       Filter="">\r
+                       <Filter\r
+                               Name="Source Files"\r
+                               Filter="">\r
+                               <File\r
+                                       RelativePath="..\..\..\..\lib\vquic\ngtcp2.c">\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\..\lib\vquic\quiche.c">\r
+                               </File>\r
+                       </Filter>\r
+                       <Filter\r
+                               Name="Header Files"\r
+                               Filter="">\r
+                               <File\r
+                                       RelativePath="..\..\..\..\lib\vquic\ngtcp2.h">\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\..\lib\vquic\quiche.h">\r
+                               </File>\r
+                       </Filter>\r
+               </Filter>\r
+               <Filter\r
+                       Name="vssh"\r
                        Filter="">\r
                        <Filter\r
                                Name="Source Files"\r
                                Filter="">\r
                                <File\r
-                                       RelativePath="..\..\..\..\lib\vtls\axtls.c">\r
+                                       RelativePath="..\..\..\..\lib\vssh\libssh2.c">\r
                                </File>\r
                                <File\r
-                                       RelativePath="..\..\..\..\lib\vtls\cyassl.c">\r
+                                       RelativePath="..\..\..\..\lib\vssh\libssh.c">\r
                                </File>\r
+                       </Filter>\r
+                       <Filter\r
+                               Name="Header Files"\r
+                               Filter="">\r
                                <File\r
-                                       RelativePath="..\..\..\..\lib\vtls\darwinssl.c">\r
+                                       RelativePath="..\..\..\..\lib\vssh\ssh.h">\r
+                               </File>\r
+                       </Filter>\r
+               </Filter>\r
+               <Filter\r
+                       Name="vtls"\r
+                       Filter="">\r
+                       <Filter\r
+                               Name="Source Files"\r
+                               Filter="">\r
+                               <File\r
+                                       RelativePath="..\..\..\..\lib\vtls\bearssl.c">\r
                                </File>\r
                                <File\r
                                        RelativePath="..\..\..\..\lib\vtls\gskit.c">\r
                                        RelativePath="..\..\..\..\lib\vtls\schannel_verify.c">\r
                                </File>\r
                                <File\r
+                                       RelativePath="..\..\..\..\lib\vtls\sectransp.c">\r
+                               </File>\r
+                               <File\r
                                        RelativePath="..\..\..\..\lib\vtls\vtls.c">\r
                                </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\..\lib\vtls\wolfssl.c">\r
+                               </File>\r
                        </Filter>\r
                        <Filter\r
                                Name="Header Files"\r
                                Filter="">\r
                                <File\r
-                                       RelativePath="..\..\..\..\lib\vtls\axtls.h">\r
-                               </File>\r
-                               <File\r
-                                       RelativePath="..\..\..\..\lib\vtls\cyassl.h">\r
-                               </File>\r
-                               <File\r
-                                       RelativePath="..\..\..\..\lib\vtls\darwinssl.h">\r
+                                       RelativePath="..\..\..\..\lib\vtls\bearssl.h">\r
                                </File>\r
                                <File\r
                                        RelativePath="..\..\..\..\lib\vtls\gskit.h">\r
                                        RelativePath="..\..\..\..\lib\vtls\schannel.h">\r
                                </File>\r
                                <File\r
+                                       RelativePath="..\..\..\..\lib\vtls\sectransp.h">\r
+                               </File>\r
+                               <File\r
                                        RelativePath="..\..\..\..\lib\vtls\vtls.h">\r
                                </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\..\lib\vtls\wolfssl.h">\r
+                               </File>\r
                        </Filter>\r
                </Filter>\r
        </Files>\r
index 6955461..8e17f81 100644 (file)
@@ -1,87 +1,87 @@
-Microsoft Visual Studio Solution File, Format Version 7.00
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "curl", "curl.vcproj", "{5228E9CE-A216-422F-A5E6-58E95E2DD71D}"
-EndProject
-Global
-       GlobalSection(SolutionConfiguration) = preSolution
-               ConfigName.0 = DLL Debug
-               ConfigName.1 = DLL Debug - DLL OpenSSL
-               ConfigName.2 = DLL Debug - DLL OpenSSL - DLL LibSSH2
-               ConfigName.3 = DLL Debug - DLL Windows SSPI
-               ConfigName.4 = DLL Debug - DLL Windows SSPI - DLL WinIDN
-               ConfigName.5 = DLL Release
-               ConfigName.6 = DLL Release - DLL OpenSSL
-               ConfigName.7 = DLL Release - DLL OpenSSL - DLL LibSSH2
-               ConfigName.8 = DLL Release - DLL Windows SSPI
-               ConfigName.9 = DLL Release - DLL Windows SSPI - DLL WinIDN
-               ConfigName.10 = LIB Debug
-               ConfigName.11 = LIB Debug - DLL OpenSSL
-               ConfigName.12 = LIB Debug - DLL OpenSSL - DLL LibSSH2
-               ConfigName.13 = LIB Debug - DLL Windows SSPI
-               ConfigName.14 = LIB Debug - DLL Windows SSPI - DLL WinIDN
-               ConfigName.15 = LIB Debug - LIB OpenSSL
-               ConfigName.16 = LIB Debug - LIB OpenSSL - LIB LibSSH2
-               ConfigName.17 = LIB Release
-               ConfigName.18 = LIB Release - DLL OpenSSL
-               ConfigName.19 = LIB Release - DLL OpenSSL - DLL LibSSH2
-               ConfigName.20 = LIB Release - DLL Windows SSPI
-               ConfigName.21 = LIB Release - DLL Windows SSPI - DLL WinIDN
-               ConfigName.22 = LIB Release - LIB OpenSSL
-               ConfigName.23 = LIB Release - LIB OpenSSL - LIB LibSSH2
-       EndGlobalSection
-       GlobalSection(ProjectDependencies) = postSolution
-       EndGlobalSection
-       GlobalSection(ProjectConfiguration) = postSolution
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug.ActiveCfg = DLL Debug|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug.Build.0 = DLL Debug|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL.ActiveCfg = DLL Debug - DLL OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL.Build.0 = DLL Debug - DLL OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI.Build.0 = DLL Debug - DLL Windows SSPI|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release.ActiveCfg = DLL Release|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release.Build.0 = DLL Release|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL.ActiveCfg = DLL Release - DLL OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL.Build.0 = DLL Release - DLL OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI.ActiveCfg = DLL Release - DLL Windows SSPI|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI.Build.0 = DLL Release - DLL Windows SSPI|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug.ActiveCfg = LIB Debug|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug.Build.0 = LIB Debug|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL.ActiveCfg = LIB Debug - DLL OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL.Build.0 = LIB Debug - DLL OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI.Build.0 = LIB Debug - DLL Windows SSPI|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL.ActiveCfg = LIB Debug - LIB OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL.Build.0 = LIB Debug - LIB OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release.ActiveCfg = LIB Release|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release.Build.0 = LIB Release|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL.ActiveCfg = LIB Release - DLL OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL.Build.0 = LIB Release - DLL OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI.ActiveCfg = LIB Release - DLL Windows SSPI|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI.Build.0 = LIB Release - DLL Windows SSPI|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL.ActiveCfg = LIB Release - LIB OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL.Build.0 = LIB Release - LIB OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
-       EndGlobalSection
-       GlobalSection(ExtensibilityGlobals) = postSolution
-       EndGlobalSection
-       GlobalSection(ExtensibilityAddIns) = postSolution
-       EndGlobalSection
-EndGlobal
+Microsoft Visual Studio Solution File, Format Version 7.00\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "curl", "curl.vcproj", "{5228E9CE-A216-422F-A5E6-58E95E2DD71D}"\r
+EndProject\r
+Global\r
+       GlobalSection(SolutionConfiguration) = preSolution\r
+               ConfigName.0 = DLL Debug\r
+               ConfigName.1 = DLL Debug - DLL OpenSSL\r
+               ConfigName.2 = DLL Debug - DLL OpenSSL - DLL LibSSH2\r
+               ConfigName.3 = DLL Debug - DLL Windows SSPI\r
+               ConfigName.4 = DLL Debug - DLL Windows SSPI - DLL WinIDN\r
+               ConfigName.5 = DLL Release\r
+               ConfigName.6 = DLL Release - DLL OpenSSL\r
+               ConfigName.7 = DLL Release - DLL OpenSSL - DLL LibSSH2\r
+               ConfigName.8 = DLL Release - DLL Windows SSPI\r
+               ConfigName.9 = DLL Release - DLL Windows SSPI - DLL WinIDN\r
+               ConfigName.10 = LIB Debug\r
+               ConfigName.11 = LIB Debug - DLL OpenSSL\r
+               ConfigName.12 = LIB Debug - DLL OpenSSL - DLL LibSSH2\r
+               ConfigName.13 = LIB Debug - DLL Windows SSPI\r
+               ConfigName.14 = LIB Debug - DLL Windows SSPI - DLL WinIDN\r
+               ConfigName.15 = LIB Debug - LIB OpenSSL\r
+               ConfigName.16 = LIB Debug - LIB OpenSSL - LIB LibSSH2\r
+               ConfigName.17 = LIB Release\r
+               ConfigName.18 = LIB Release - DLL OpenSSL\r
+               ConfigName.19 = LIB Release - DLL OpenSSL - DLL LibSSH2\r
+               ConfigName.20 = LIB Release - DLL Windows SSPI\r
+               ConfigName.21 = LIB Release - DLL Windows SSPI - DLL WinIDN\r
+               ConfigName.22 = LIB Release - LIB OpenSSL\r
+               ConfigName.23 = LIB Release - LIB OpenSSL - LIB LibSSH2\r
+       EndGlobalSection\r
+       GlobalSection(ProjectDependencies) = postSolution\r
+       EndGlobalSection\r
+       GlobalSection(ProjectConfiguration) = postSolution\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug.ActiveCfg = DLL Debug|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug.Build.0 = DLL Debug|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL.ActiveCfg = DLL Debug - DLL OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL.Build.0 = DLL Debug - DLL OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI.Build.0 = DLL Debug - DLL Windows SSPI|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release.ActiveCfg = DLL Release|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release.Build.0 = DLL Release|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL.ActiveCfg = DLL Release - DLL OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL.Build.0 = DLL Release - DLL OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI.ActiveCfg = DLL Release - DLL Windows SSPI|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI.Build.0 = DLL Release - DLL Windows SSPI|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug.ActiveCfg = LIB Debug|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug.Build.0 = LIB Debug|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL.ActiveCfg = LIB Debug - DLL OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL.Build.0 = LIB Debug - DLL OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI.Build.0 = LIB Debug - DLL Windows SSPI|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL.ActiveCfg = LIB Debug - LIB OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL.Build.0 = LIB Debug - LIB OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release.ActiveCfg = LIB Release|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release.Build.0 = LIB Release|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL.ActiveCfg = LIB Release - DLL OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL.Build.0 = LIB Release - DLL OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI.ActiveCfg = LIB Release - DLL Windows SSPI|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI.Build.0 = LIB Release - DLL Windows SSPI|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL.ActiveCfg = LIB Release - LIB OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL.Build.0 = LIB Release - LIB OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32\r
+       EndGlobalSection\r
+       GlobalSection(ExtensibilityGlobals) = postSolution\r
+       EndGlobalSection\r
+       GlobalSection(ExtensibilityAddIns) = postSolution\r
+       EndGlobalSection\r
+EndGlobal\r
index 821aebc..fe5a6a8 100644 (file)
                                RelativePath="..\..\..\..\src\tool_parsecfg.c">\r
                        </File>\r
                        <File\r
+                               RelativePath="..\..\..\..\src\tool_progress.c">\r
+                       </File>\r
+                       <File\r
                                RelativePath="..\..\..\..\src\tool_setopt.c">\r
                        </File>\r
                        <File\r
                                RelativePath="..\..\..\..\src\tool_parsecfg.h">\r
                        </File>\r
                        <File\r
+                               RelativePath="..\..\..\..\src\tool_progress.h">\r
+                       </File>\r
+                       <File\r
                                RelativePath="..\..\..\..\src\tool_sdecls.h">\r
                        </File>\r
                        <File\r
index 9e2c22d..02961e0 100644 (file)
-Microsoft Visual Studio Solution File, Format Version 9.00
-# Visual Studio 2005
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "curl", "src\curl.vcproj", "{5228E9CE-A216-422F-A5E6-58E95E2DD71D}"
-       ProjectSection(ProjectDependencies) = postProject
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB} = {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}
-       EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libcurl", "lib\libcurl.vcproj", "{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}"
-EndProject
-Global
-       GlobalSection(SolutionConfigurationPlatforms) = preSolution
-               DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               DLL Debug - DLL OpenSSL - DLL LibSSH2|x64 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
-               DLL Debug - DLL OpenSSL|Win32 = DLL Debug - DLL OpenSSL|Win32
-               DLL Debug - DLL OpenSSL|x64 = DLL Debug - DLL OpenSSL|x64
-               DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               DLL Debug - DLL Windows SSPI - DLL WinIDN|x64 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
-               DLL Debug - DLL Windows SSPI|Win32 = DLL Debug - DLL Windows SSPI|Win32
-               DLL Debug - DLL Windows SSPI|x64 = DLL Debug - DLL Windows SSPI|x64
-               DLL Debug|Win32 = DLL Debug|Win32
-               DLL Debug|x64 = DLL Debug|x64
-               DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
-               DLL Release - DLL OpenSSL - DLL LibSSH2|x64 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
-               DLL Release - DLL OpenSSL|Win32 = DLL Release - DLL OpenSSL|Win32
-               DLL Release - DLL OpenSSL|x64 = DLL Release - DLL OpenSSL|x64
-               DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
-               DLL Release - DLL Windows SSPI - DLL WinIDN|x64 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
-               DLL Release - DLL Windows SSPI|Win32 = DLL Release - DLL Windows SSPI|Win32
-               DLL Release - DLL Windows SSPI|x64 = DLL Release - DLL Windows SSPI|x64
-               DLL Release|Win32 = DLL Release|Win32
-               DLL Release|x64 = DLL Release|x64
-               LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               LIB Debug - DLL OpenSSL - DLL LibSSH2|x64 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
-               LIB Debug - DLL OpenSSL|Win32 = LIB Debug - DLL OpenSSL|Win32
-               LIB Debug - DLL OpenSSL|x64 = LIB Debug - DLL OpenSSL|x64
-               LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               LIB Debug - DLL Windows SSPI - DLL WinIDN|x64 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
-               LIB Debug - DLL Windows SSPI|Win32 = LIB Debug - DLL Windows SSPI|Win32
-               LIB Debug - DLL Windows SSPI|x64 = LIB Debug - DLL Windows SSPI|x64
-               LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
-               LIB Debug - LIB OpenSSL - LIB LibSSH2|x64 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
-               LIB Debug - LIB OpenSSL|Win32 = LIB Debug - LIB OpenSSL|Win32
-               LIB Debug - LIB OpenSSL|x64 = LIB Debug - LIB OpenSSL|x64
-               LIB Debug|Win32 = LIB Debug|Win32
-               LIB Debug|x64 = LIB Debug|x64
-               LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
-               LIB Release - DLL OpenSSL - DLL LibSSH2|x64 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
-               LIB Release - DLL OpenSSL|Win32 = LIB Release - DLL OpenSSL|Win32
-               LIB Release - DLL OpenSSL|x64 = LIB Release - DLL OpenSSL|x64
-               LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
-               LIB Release - DLL Windows SSPI - DLL WinIDN|x64 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
-               LIB Release - DLL Windows SSPI|Win32 = LIB Release - DLL Windows SSPI|Win32
-               LIB Release - DLL Windows SSPI|x64 = LIB Release - DLL Windows SSPI|x64
-               LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
-               LIB Release - LIB OpenSSL - LIB LibSSH2|x64 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
-               LIB Release - LIB OpenSSL|Win32 = LIB Release - LIB OpenSSL|Win32
-               LIB Release - LIB OpenSSL|x64 = LIB Release - LIB OpenSSL|x64
-               LIB Release|Win32 = LIB Release|Win32
-               LIB Release|x64 = LIB Release|x64
-       EndGlobalSection
-       GlobalSection(ProjectConfigurationPlatforms) = postSolution
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|Win32.ActiveCfg = DLL Debug - DLL OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|Win32.Build.0 = DLL Debug - DLL OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|x64.ActiveCfg = DLL Debug - DLL OpenSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|x64.Build.0 = DLL Debug - DLL OpenSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|Win32.Build.0 = DLL Debug - DLL Windows SSPI|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|x64.ActiveCfg = DLL Debug - DLL Windows SSPI|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|x64.Build.0 = DLL Debug - DLL Windows SSPI|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|Win32.Build.0 = DLL Debug|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|x64.ActiveCfg = DLL Debug|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|x64.Build.0 = DLL Debug|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|Win32.ActiveCfg = DLL Release - DLL OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|Win32.Build.0 = DLL Release - DLL OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|x64.ActiveCfg = DLL Release - DLL OpenSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|x64.Build.0 = DLL Release - DLL OpenSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|Win32.ActiveCfg = DLL Release - DLL Windows SSPI|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|Win32.Build.0 = DLL Release - DLL Windows SSPI|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|x64.ActiveCfg = DLL Release - DLL Windows SSPI|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|x64.Build.0 = DLL Release - DLL Windows SSPI|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|Win32.ActiveCfg = DLL Release|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|Win32.Build.0 = DLL Release|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|x64.ActiveCfg = DLL Release|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|x64.Build.0 = DLL Release|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|Win32.ActiveCfg = LIB Debug - DLL OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|Win32.Build.0 = LIB Debug - DLL OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|x64.ActiveCfg = LIB Debug - DLL OpenSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|x64.Build.0 = LIB Debug - DLL OpenSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|Win32.Build.0 = LIB Debug - DLL Windows SSPI|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|x64.ActiveCfg = LIB Debug - DLL Windows SSPI|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|x64.Build.0 = LIB Debug - DLL Windows SSPI|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|Win32.ActiveCfg = LIB Debug - LIB OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|Win32.Build.0 = LIB Debug - LIB OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|x64.ActiveCfg = LIB Debug - LIB OpenSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|x64.Build.0 = LIB Debug - LIB OpenSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|Win32.ActiveCfg = LIB Debug|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|Win32.Build.0 = LIB Debug|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|x64.ActiveCfg = LIB Debug|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|x64.Build.0 = LIB Debug|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|Win32.ActiveCfg = LIB Release - DLL OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|Win32.Build.0 = LIB Release - DLL OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|x64.ActiveCfg = LIB Release - DLL OpenSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|x64.Build.0 = LIB Release - DLL OpenSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|Win32.ActiveCfg = LIB Release - DLL Windows SSPI|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|Win32.Build.0 = LIB Release - DLL Windows SSPI|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|x64.ActiveCfg = LIB Release - DLL Windows SSPI|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|x64.Build.0 = LIB Release - DLL Windows SSPI|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|Win32.ActiveCfg = LIB Release - LIB OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|Win32.Build.0 = LIB Release - LIB OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|x64.ActiveCfg = LIB Release - LIB OpenSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|x64.Build.0 = LIB Release - LIB OpenSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|Win32.ActiveCfg = LIB Release|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|Win32.Build.0 = LIB Release|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|x64.ActiveCfg = LIB Release|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|x64.Build.0 = LIB Release|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|Win32.ActiveCfg = DLL Debug - DLL OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|Win32.Build.0 = DLL Debug - DLL OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|x64.ActiveCfg = DLL Debug - DLL OpenSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|x64.Build.0 = DLL Debug - DLL OpenSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|Win32.Build.0 = DLL Debug - DLL Windows SSPI|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|x64.ActiveCfg = DLL Debug - DLL Windows SSPI|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|x64.Build.0 = DLL Debug - DLL Windows SSPI|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|Win32.Build.0 = DLL Debug|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|x64.ActiveCfg = DLL Debug|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|x64.Build.0 = DLL Debug|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|Win32.ActiveCfg = DLL Release - DLL OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|Win32.Build.0 = DLL Release - DLL OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|x64.ActiveCfg = DLL Release - DLL OpenSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|x64.Build.0 = DLL Release - DLL OpenSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|Win32.ActiveCfg = DLL Release - DLL Windows SSPI|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|Win32.Build.0 = DLL Release - DLL Windows SSPI|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|x64.ActiveCfg = DLL Release - DLL Windows SSPI|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|x64.Build.0 = DLL Release - DLL Windows SSPI|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|Win32.ActiveCfg = DLL Release|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|Win32.Build.0 = DLL Release|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|x64.ActiveCfg = DLL Release|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|x64.Build.0 = DLL Release|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|Win32.ActiveCfg = LIB Debug - DLL OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|Win32.Build.0 = LIB Debug - DLL OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|x64.ActiveCfg = LIB Debug - DLL OpenSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|x64.Build.0 = LIB Debug - DLL OpenSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|Win32.Build.0 = LIB Debug - DLL Windows SSPI|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|x64.ActiveCfg = LIB Debug - DLL Windows SSPI|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|x64.Build.0 = LIB Debug - DLL Windows SSPI|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|Win32.ActiveCfg = LIB Debug - LIB OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|Win32.Build.0 = LIB Debug - LIB OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|x64.ActiveCfg = LIB Debug - LIB OpenSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|x64.Build.0 = LIB Debug - LIB OpenSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|Win32.ActiveCfg = LIB Debug|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|Win32.Build.0 = LIB Debug|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|x64.ActiveCfg = LIB Debug|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|x64.Build.0 = LIB Debug|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|Win32.ActiveCfg = LIB Release - DLL OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|Win32.Build.0 = LIB Release - DLL OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|x64.ActiveCfg = LIB Release - DLL OpenSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|x64.Build.0 = LIB Release - DLL OpenSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|Win32.ActiveCfg = LIB Release - DLL Windows SSPI|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|Win32.Build.0 = LIB Release - DLL Windows SSPI|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|x64.ActiveCfg = LIB Release - DLL Windows SSPI|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|x64.Build.0 = LIB Release - DLL Windows SSPI|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|Win32.ActiveCfg = LIB Release - LIB OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|Win32.Build.0 = LIB Release - LIB OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|x64.ActiveCfg = LIB Release - LIB OpenSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|x64.Build.0 = LIB Release - LIB OpenSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|Win32.ActiveCfg = LIB Release|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|Win32.Build.0 = LIB Release|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|x64.ActiveCfg = LIB Release|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|x64.Build.0 = LIB Release|x64
-       EndGlobalSection
-       GlobalSection(SolutionProperties) = preSolution
-               HideSolutionNode = FALSE
-       EndGlobalSection
-EndGlobal
+Microsoft Visual Studio Solution File, Format Version 9.00\r
+# Visual Studio 2005\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "curl", "src\curl.vcproj", "{5228E9CE-A216-422F-A5E6-58E95E2DD71D}"\r
+       ProjectSection(ProjectDependencies) = postProject\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB} = {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}\r
+       EndProjectSection\r
+EndProject\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libcurl", "lib\libcurl.vcproj", "{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}"\r
+EndProject\r
+Global\r
+       GlobalSection(SolutionConfigurationPlatforms) = preSolution\r
+               DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               DLL Debug - DLL OpenSSL - DLL LibSSH2|x64 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64\r
+               DLL Debug - DLL OpenSSL|Win32 = DLL Debug - DLL OpenSSL|Win32\r
+               DLL Debug - DLL OpenSSL|x64 = DLL Debug - DLL OpenSSL|x64\r
+               DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               DLL Debug - DLL Windows SSPI - DLL WinIDN|x64 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64\r
+               DLL Debug - DLL Windows SSPI|Win32 = DLL Debug - DLL Windows SSPI|Win32\r
+               DLL Debug - DLL Windows SSPI|x64 = DLL Debug - DLL Windows SSPI|x64\r
+               DLL Debug|Win32 = DLL Debug|Win32\r
+               DLL Debug|x64 = DLL Debug|x64\r
+               DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               DLL Release - DLL OpenSSL - DLL LibSSH2|x64 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64\r
+               DLL Release - DLL OpenSSL|Win32 = DLL Release - DLL OpenSSL|Win32\r
+               DLL Release - DLL OpenSSL|x64 = DLL Release - DLL OpenSSL|x64\r
+               DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               DLL Release - DLL Windows SSPI - DLL WinIDN|x64 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64\r
+               DLL Release - DLL Windows SSPI|Win32 = DLL Release - DLL Windows SSPI|Win32\r
+               DLL Release - DLL Windows SSPI|x64 = DLL Release - DLL Windows SSPI|x64\r
+               DLL Release|Win32 = DLL Release|Win32\r
+               DLL Release|x64 = DLL Release|x64\r
+               LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               LIB Debug - DLL OpenSSL - DLL LibSSH2|x64 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64\r
+               LIB Debug - DLL OpenSSL|Win32 = LIB Debug - DLL OpenSSL|Win32\r
+               LIB Debug - DLL OpenSSL|x64 = LIB Debug - DLL OpenSSL|x64\r
+               LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               LIB Debug - DLL Windows SSPI - DLL WinIDN|x64 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64\r
+               LIB Debug - DLL Windows SSPI|Win32 = LIB Debug - DLL Windows SSPI|Win32\r
+               LIB Debug - DLL Windows SSPI|x64 = LIB Debug - DLL Windows SSPI|x64\r
+               LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32\r
+               LIB Debug - LIB OpenSSL - LIB LibSSH2|x64 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64\r
+               LIB Debug - LIB OpenSSL|Win32 = LIB Debug - LIB OpenSSL|Win32\r
+               LIB Debug - LIB OpenSSL|x64 = LIB Debug - LIB OpenSSL|x64\r
+               LIB Debug|Win32 = LIB Debug|Win32\r
+               LIB Debug|x64 = LIB Debug|x64\r
+               LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               LIB Release - DLL OpenSSL - DLL LibSSH2|x64 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64\r
+               LIB Release - DLL OpenSSL|Win32 = LIB Release - DLL OpenSSL|Win32\r
+               LIB Release - DLL OpenSSL|x64 = LIB Release - DLL OpenSSL|x64\r
+               LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               LIB Release - DLL Windows SSPI - DLL WinIDN|x64 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64\r
+               LIB Release - DLL Windows SSPI|Win32 = LIB Release - DLL Windows SSPI|Win32\r
+               LIB Release - DLL Windows SSPI|x64 = LIB Release - DLL Windows SSPI|x64\r
+               LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32\r
+               LIB Release - LIB OpenSSL - LIB LibSSH2|x64 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64\r
+               LIB Release - LIB OpenSSL|Win32 = LIB Release - LIB OpenSSL|Win32\r
+               LIB Release - LIB OpenSSL|x64 = LIB Release - LIB OpenSSL|x64\r
+               LIB Release|Win32 = LIB Release|Win32\r
+               LIB Release|x64 = LIB Release|x64\r
+       EndGlobalSection\r
+       GlobalSection(ProjectConfigurationPlatforms) = postSolution\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|Win32.ActiveCfg = DLL Debug - DLL OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|Win32.Build.0 = DLL Debug - DLL OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|x64.ActiveCfg = DLL Debug - DLL OpenSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|x64.Build.0 = DLL Debug - DLL OpenSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|Win32.Build.0 = DLL Debug - DLL Windows SSPI|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|x64.ActiveCfg = DLL Debug - DLL Windows SSPI|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|x64.Build.0 = DLL Debug - DLL Windows SSPI|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|Win32.Build.0 = DLL Debug|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|x64.ActiveCfg = DLL Debug|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|x64.Build.0 = DLL Debug|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|Win32.ActiveCfg = DLL Release - DLL OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|Win32.Build.0 = DLL Release - DLL OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|x64.ActiveCfg = DLL Release - DLL OpenSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|x64.Build.0 = DLL Release - DLL OpenSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|Win32.ActiveCfg = DLL Release - DLL Windows SSPI|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|Win32.Build.0 = DLL Release - DLL Windows SSPI|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|x64.ActiveCfg = DLL Release - DLL Windows SSPI|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|x64.Build.0 = DLL Release - DLL Windows SSPI|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|Win32.ActiveCfg = DLL Release|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|Win32.Build.0 = DLL Release|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|x64.ActiveCfg = DLL Release|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|x64.Build.0 = DLL Release|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|Win32.ActiveCfg = LIB Debug - DLL OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|Win32.Build.0 = LIB Debug - DLL OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|x64.ActiveCfg = LIB Debug - DLL OpenSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|x64.Build.0 = LIB Debug - DLL OpenSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|Win32.Build.0 = LIB Debug - DLL Windows SSPI|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|x64.ActiveCfg = LIB Debug - DLL Windows SSPI|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|x64.Build.0 = LIB Debug - DLL Windows SSPI|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|Win32.ActiveCfg = LIB Debug - LIB OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|Win32.Build.0 = LIB Debug - LIB OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|x64.ActiveCfg = LIB Debug - LIB OpenSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|x64.Build.0 = LIB Debug - LIB OpenSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|Win32.ActiveCfg = LIB Debug|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|Win32.Build.0 = LIB Debug|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|x64.ActiveCfg = LIB Debug|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|x64.Build.0 = LIB Debug|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|Win32.ActiveCfg = LIB Release - DLL OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|Win32.Build.0 = LIB Release - DLL OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|x64.ActiveCfg = LIB Release - DLL OpenSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|x64.Build.0 = LIB Release - DLL OpenSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|Win32.ActiveCfg = LIB Release - DLL Windows SSPI|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|Win32.Build.0 = LIB Release - DLL Windows SSPI|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|x64.ActiveCfg = LIB Release - DLL Windows SSPI|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|x64.Build.0 = LIB Release - DLL Windows SSPI|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|Win32.ActiveCfg = LIB Release - LIB OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|Win32.Build.0 = LIB Release - LIB OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|x64.ActiveCfg = LIB Release - LIB OpenSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|x64.Build.0 = LIB Release - LIB OpenSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|Win32.ActiveCfg = LIB Release|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|Win32.Build.0 = LIB Release|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|x64.ActiveCfg = LIB Release|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|x64.Build.0 = LIB Release|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|Win32.ActiveCfg = DLL Debug - DLL OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|Win32.Build.0 = DLL Debug - DLL OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|x64.ActiveCfg = DLL Debug - DLL OpenSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|x64.Build.0 = DLL Debug - DLL OpenSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|Win32.Build.0 = DLL Debug - DLL Windows SSPI|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|x64.ActiveCfg = DLL Debug - DLL Windows SSPI|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|x64.Build.0 = DLL Debug - DLL Windows SSPI|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|Win32.Build.0 = DLL Debug|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|x64.ActiveCfg = DLL Debug|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|x64.Build.0 = DLL Debug|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|Win32.ActiveCfg = DLL Release - DLL OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|Win32.Build.0 = DLL Release - DLL OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|x64.ActiveCfg = DLL Release - DLL OpenSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|x64.Build.0 = DLL Release - DLL OpenSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|Win32.ActiveCfg = DLL Release - DLL Windows SSPI|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|Win32.Build.0 = DLL Release - DLL Windows SSPI|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|x64.ActiveCfg = DLL Release - DLL Windows SSPI|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|x64.Build.0 = DLL Release - DLL Windows SSPI|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|Win32.ActiveCfg = DLL Release|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|Win32.Build.0 = DLL Release|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|x64.ActiveCfg = DLL Release|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|x64.Build.0 = DLL Release|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|Win32.ActiveCfg = LIB Debug - DLL OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|Win32.Build.0 = LIB Debug - DLL OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|x64.ActiveCfg = LIB Debug - DLL OpenSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|x64.Build.0 = LIB Debug - DLL OpenSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|Win32.Build.0 = LIB Debug - DLL Windows SSPI|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|x64.ActiveCfg = LIB Debug - DLL Windows SSPI|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|x64.Build.0 = LIB Debug - DLL Windows SSPI|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|Win32.ActiveCfg = LIB Debug - LIB OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|Win32.Build.0 = LIB Debug - LIB OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|x64.ActiveCfg = LIB Debug - LIB OpenSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|x64.Build.0 = LIB Debug - LIB OpenSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|Win32.ActiveCfg = LIB Debug|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|Win32.Build.0 = LIB Debug|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|x64.ActiveCfg = LIB Debug|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|x64.Build.0 = LIB Debug|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|Win32.ActiveCfg = LIB Release - DLL OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|Win32.Build.0 = LIB Release - DLL OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|x64.ActiveCfg = LIB Release - DLL OpenSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|x64.Build.0 = LIB Release - DLL OpenSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|Win32.ActiveCfg = LIB Release - DLL Windows SSPI|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|Win32.Build.0 = LIB Release - DLL Windows SSPI|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|x64.ActiveCfg = LIB Release - DLL Windows SSPI|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|x64.Build.0 = LIB Release - DLL Windows SSPI|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|Win32.ActiveCfg = LIB Release - LIB OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|Win32.Build.0 = LIB Release - LIB OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|x64.ActiveCfg = LIB Release - LIB OpenSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|x64.Build.0 = LIB Release - LIB OpenSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|Win32.ActiveCfg = LIB Release|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|Win32.Build.0 = LIB Release|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|x64.ActiveCfg = LIB Release|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|x64.Build.0 = LIB Release|x64\r
+       EndGlobalSection\r
+       GlobalSection(SolutionProperties) = preSolution\r
+               HideSolutionNode = FALSE\r
+       EndGlobalSection\r
+EndGlobal\r
index f844fdf..b9cd13e 100644 (file)
-Microsoft Visual Studio Solution File, Format Version 9.00
-# Visual Studio 2005
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libcurl", "libcurl.vcproj", "{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}"
-EndProject
-Global
-       GlobalSection(SolutionConfigurationPlatforms) = preSolution
-               DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               DLL Debug - DLL OpenSSL - DLL LibSSH2|x64 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
-               DLL Debug - DLL OpenSSL|Win32 = DLL Debug - DLL OpenSSL|Win32
-               DLL Debug - DLL OpenSSL|x64 = DLL Debug - DLL OpenSSL|x64
-               DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               DLL Debug - DLL Windows SSPI - DLL WinIDN|x64 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
-               DLL Debug - DLL Windows SSPI|Win32 = DLL Debug - DLL Windows SSPI|Win32
-               DLL Debug - DLL Windows SSPI|x64 = DLL Debug - DLL Windows SSPI|x64
-               DLL Debug|Win32 = DLL Debug|Win32
-               DLL Debug|x64 = DLL Debug|x64
-               DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
-               DLL Release - DLL OpenSSL - DLL LibSSH2|x64 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
-               DLL Release - DLL OpenSSL|Win32 = DLL Release - DLL OpenSSL|Win32
-               DLL Release - DLL OpenSSL|x64 = DLL Release - DLL OpenSSL|x64
-               DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
-               DLL Release - DLL Windows SSPI - DLL WinIDN|x64 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
-               DLL Release - DLL Windows SSPI|Win32 = DLL Release - DLL Windows SSPI|Win32
-               DLL Release - DLL Windows SSPI|x64 = DLL Release - DLL Windows SSPI|x64
-               DLL Release|Win32 = DLL Release|Win32
-               DLL Release|x64 = DLL Release|x64
-               LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               LIB Debug - DLL OpenSSL - DLL LibSSH2|x64 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
-               LIB Debug - DLL OpenSSL|Win32 = LIB Debug - DLL OpenSSL|Win32
-               LIB Debug - DLL OpenSSL|x64 = LIB Debug - DLL OpenSSL|x64
-               LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               LIB Debug - DLL Windows SSPI - DLL WinIDN|x64 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
-               LIB Debug - DLL Windows SSPI|Win32 = LIB Debug - DLL Windows SSPI|Win32
-               LIB Debug - DLL Windows SSPI|x64 = LIB Debug - DLL Windows SSPI|x64
-               LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
-               LIB Debug - LIB OpenSSL - LIB LibSSH2|x64 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
-               LIB Debug - LIB OpenSSL|Win32 = LIB Debug - LIB OpenSSL|Win32
-               LIB Debug - LIB OpenSSL|x64 = LIB Debug - LIB OpenSSL|x64
-               LIB Debug|Win32 = LIB Debug|Win32
-               LIB Debug|x64 = LIB Debug|x64
-               LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
-               LIB Release - DLL OpenSSL - DLL LibSSH2|x64 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
-               LIB Release - DLL OpenSSL|Win32 = LIB Release - DLL OpenSSL|Win32
-               LIB Release - DLL OpenSSL|x64 = LIB Release - DLL OpenSSL|x64
-               LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
-               LIB Release - DLL Windows SSPI - DLL WinIDN|x64 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
-               LIB Release - DLL Windows SSPI|Win32 = LIB Release - DLL Windows SSPI|Win32
-               LIB Release - DLL Windows SSPI|x64 = LIB Release - DLL Windows SSPI|x64
-               LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
-               LIB Release - LIB OpenSSL - LIB LibSSH2|x64 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
-               LIB Release - LIB OpenSSL|Win32 = LIB Release - LIB OpenSSL|Win32
-               LIB Release - LIB OpenSSL|x64 = LIB Release - LIB OpenSSL|x64
-               LIB Release|Win32 = LIB Release|Win32
-               LIB Release|x64 = LIB Release|x64
-       EndGlobalSection
-       GlobalSection(ProjectConfigurationPlatforms) = postSolution
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|Win32.ActiveCfg = DLL Debug - DLL OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|Win32.Build.0 = DLL Debug - DLL OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|x64.ActiveCfg = DLL Debug - DLL OpenSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|x64.Build.0 = DLL Debug - DLL OpenSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|Win32.Build.0 = DLL Debug - DLL Windows SSPI|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|x64.ActiveCfg = DLL Debug - DLL Windows SSPI|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|x64.Build.0 = DLL Debug - DLL Windows SSPI|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|Win32.Build.0 = DLL Debug|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|x64.ActiveCfg = DLL Debug|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|x64.Build.0 = DLL Debug|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|Win32.ActiveCfg = DLL Release - DLL OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|Win32.Build.0 = DLL Release - DLL OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|x64.ActiveCfg = DLL Release - DLL OpenSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|x64.Build.0 = DLL Release - DLL OpenSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|Win32.ActiveCfg = DLL Release - DLL Windows SSPI|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|Win32.Build.0 = DLL Release - DLL Windows SSPI|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|x64.ActiveCfg = DLL Release - DLL Windows SSPI|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|x64.Build.0 = DLL Release - DLL Windows SSPI|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|Win32.ActiveCfg = DLL Release|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|Win32.Build.0 = DLL Release|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|x64.ActiveCfg = DLL Release|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|x64.Build.0 = DLL Release|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|Win32.ActiveCfg = LIB Debug - DLL OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|Win32.Build.0 = LIB Debug - DLL OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|x64.ActiveCfg = LIB Debug - DLL OpenSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|x64.Build.0 = LIB Debug - DLL OpenSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|Win32.Build.0 = LIB Debug - DLL Windows SSPI|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|x64.ActiveCfg = LIB Debug - DLL Windows SSPI|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|x64.Build.0 = LIB Debug - DLL Windows SSPI|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|Win32.ActiveCfg = LIB Debug - LIB OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|Win32.Build.0 = LIB Debug - LIB OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|x64.ActiveCfg = LIB Debug - LIB OpenSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|x64.Build.0 = LIB Debug - LIB OpenSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|Win32.ActiveCfg = LIB Debug|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|Win32.Build.0 = LIB Debug|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|x64.ActiveCfg = LIB Debug|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|x64.Build.0 = LIB Debug|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|Win32.ActiveCfg = LIB Release - DLL OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|Win32.Build.0 = LIB Release - DLL OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|x64.ActiveCfg = LIB Release - DLL OpenSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|x64.Build.0 = LIB Release - DLL OpenSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|Win32.ActiveCfg = LIB Release - DLL Windows SSPI|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|Win32.Build.0 = LIB Release - DLL Windows SSPI|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|x64.ActiveCfg = LIB Release - DLL Windows SSPI|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|x64.Build.0 = LIB Release - DLL Windows SSPI|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|Win32.ActiveCfg = LIB Release - LIB OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|Win32.Build.0 = LIB Release - LIB OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|x64.ActiveCfg = LIB Release - LIB OpenSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|x64.Build.0 = LIB Release - LIB OpenSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|Win32.ActiveCfg = LIB Release|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|Win32.Build.0 = LIB Release|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|x64.ActiveCfg = LIB Release|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|x64.Build.0 = LIB Release|x64
-       EndGlobalSection
-       GlobalSection(SolutionProperties) = preSolution
-               HideSolutionNode = FALSE
-       EndGlobalSection
-EndGlobal
+Microsoft Visual Studio Solution File, Format Version 9.00\r
+# Visual Studio 2005\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libcurl", "libcurl.vcproj", "{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}"\r
+EndProject\r
+Global\r
+       GlobalSection(SolutionConfigurationPlatforms) = preSolution\r
+               DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               DLL Debug - DLL OpenSSL - DLL LibSSH2|x64 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64\r
+               DLL Debug - DLL OpenSSL|Win32 = DLL Debug - DLL OpenSSL|Win32\r
+               DLL Debug - DLL OpenSSL|x64 = DLL Debug - DLL OpenSSL|x64\r
+               DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               DLL Debug - DLL Windows SSPI - DLL WinIDN|x64 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64\r
+               DLL Debug - DLL Windows SSPI|Win32 = DLL Debug - DLL Windows SSPI|Win32\r
+               DLL Debug - DLL Windows SSPI|x64 = DLL Debug - DLL Windows SSPI|x64\r
+               DLL Debug|Win32 = DLL Debug|Win32\r
+               DLL Debug|x64 = DLL Debug|x64\r
+               DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               DLL Release - DLL OpenSSL - DLL LibSSH2|x64 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64\r
+               DLL Release - DLL OpenSSL|Win32 = DLL Release - DLL OpenSSL|Win32\r
+               DLL Release - DLL OpenSSL|x64 = DLL Release - DLL OpenSSL|x64\r
+               DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               DLL Release - DLL Windows SSPI - DLL WinIDN|x64 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64\r
+               DLL Release - DLL Windows SSPI|Win32 = DLL Release - DLL Windows SSPI|Win32\r
+               DLL Release - DLL Windows SSPI|x64 = DLL Release - DLL Windows SSPI|x64\r
+               DLL Release|Win32 = DLL Release|Win32\r
+               DLL Release|x64 = DLL Release|x64\r
+               LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               LIB Debug - DLL OpenSSL - DLL LibSSH2|x64 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64\r
+               LIB Debug - DLL OpenSSL|Win32 = LIB Debug - DLL OpenSSL|Win32\r
+               LIB Debug - DLL OpenSSL|x64 = LIB Debug - DLL OpenSSL|x64\r
+               LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               LIB Debug - DLL Windows SSPI - DLL WinIDN|x64 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64\r
+               LIB Debug - DLL Windows SSPI|Win32 = LIB Debug - DLL Windows SSPI|Win32\r
+               LIB Debug - DLL Windows SSPI|x64 = LIB Debug - DLL Windows SSPI|x64\r
+               LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32\r
+               LIB Debug - LIB OpenSSL - LIB LibSSH2|x64 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64\r
+               LIB Debug - LIB OpenSSL|Win32 = LIB Debug - LIB OpenSSL|Win32\r
+               LIB Debug - LIB OpenSSL|x64 = LIB Debug - LIB OpenSSL|x64\r
+               LIB Debug|Win32 = LIB Debug|Win32\r
+               LIB Debug|x64 = LIB Debug|x64\r
+               LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               LIB Release - DLL OpenSSL - DLL LibSSH2|x64 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64\r
+               LIB Release - DLL OpenSSL|Win32 = LIB Release - DLL OpenSSL|Win32\r
+               LIB Release - DLL OpenSSL|x64 = LIB Release - DLL OpenSSL|x64\r
+               LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               LIB Release - DLL Windows SSPI - DLL WinIDN|x64 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64\r
+               LIB Release - DLL Windows SSPI|Win32 = LIB Release - DLL Windows SSPI|Win32\r
+               LIB Release - DLL Windows SSPI|x64 = LIB Release - DLL Windows SSPI|x64\r
+               LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32\r
+               LIB Release - LIB OpenSSL - LIB LibSSH2|x64 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64\r
+               LIB Release - LIB OpenSSL|Win32 = LIB Release - LIB OpenSSL|Win32\r
+               LIB Release - LIB OpenSSL|x64 = LIB Release - LIB OpenSSL|x64\r
+               LIB Release|Win32 = LIB Release|Win32\r
+               LIB Release|x64 = LIB Release|x64\r
+       EndGlobalSection\r
+       GlobalSection(ProjectConfigurationPlatforms) = postSolution\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|Win32.ActiveCfg = DLL Debug - DLL OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|Win32.Build.0 = DLL Debug - DLL OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|x64.ActiveCfg = DLL Debug - DLL OpenSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|x64.Build.0 = DLL Debug - DLL OpenSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|Win32.Build.0 = DLL Debug - DLL Windows SSPI|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|x64.ActiveCfg = DLL Debug - DLL Windows SSPI|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|x64.Build.0 = DLL Debug - DLL Windows SSPI|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|Win32.Build.0 = DLL Debug|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|x64.ActiveCfg = DLL Debug|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|x64.Build.0 = DLL Debug|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|Win32.ActiveCfg = DLL Release - DLL OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|Win32.Build.0 = DLL Release - DLL OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|x64.ActiveCfg = DLL Release - DLL OpenSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|x64.Build.0 = DLL Release - DLL OpenSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|Win32.ActiveCfg = DLL Release - DLL Windows SSPI|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|Win32.Build.0 = DLL Release - DLL Windows SSPI|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|x64.ActiveCfg = DLL Release - DLL Windows SSPI|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|x64.Build.0 = DLL Release - DLL Windows SSPI|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|Win32.ActiveCfg = DLL Release|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|Win32.Build.0 = DLL Release|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|x64.ActiveCfg = DLL Release|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|x64.Build.0 = DLL Release|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|Win32.ActiveCfg = LIB Debug - DLL OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|Win32.Build.0 = LIB Debug - DLL OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|x64.ActiveCfg = LIB Debug - DLL OpenSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|x64.Build.0 = LIB Debug - DLL OpenSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|Win32.Build.0 = LIB Debug - DLL Windows SSPI|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|x64.ActiveCfg = LIB Debug - DLL Windows SSPI|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|x64.Build.0 = LIB Debug - DLL Windows SSPI|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|Win32.ActiveCfg = LIB Debug - LIB OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|Win32.Build.0 = LIB Debug - LIB OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|x64.ActiveCfg = LIB Debug - LIB OpenSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|x64.Build.0 = LIB Debug - LIB OpenSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|Win32.ActiveCfg = LIB Debug|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|Win32.Build.0 = LIB Debug|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|x64.ActiveCfg = LIB Debug|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|x64.Build.0 = LIB Debug|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|Win32.ActiveCfg = LIB Release - DLL OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|Win32.Build.0 = LIB Release - DLL OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|x64.ActiveCfg = LIB Release - DLL OpenSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|x64.Build.0 = LIB Release - DLL OpenSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|Win32.ActiveCfg = LIB Release - DLL Windows SSPI|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|Win32.Build.0 = LIB Release - DLL Windows SSPI|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|x64.ActiveCfg = LIB Release - DLL Windows SSPI|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|x64.Build.0 = LIB Release - DLL Windows SSPI|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|Win32.ActiveCfg = LIB Release - LIB OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|Win32.Build.0 = LIB Release - LIB OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|x64.ActiveCfg = LIB Release - LIB OpenSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|x64.Build.0 = LIB Release - LIB OpenSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|Win32.ActiveCfg = LIB Release|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|Win32.Build.0 = LIB Release|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|x64.ActiveCfg = LIB Release|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|x64.Build.0 = LIB Release|x64\r
+       EndGlobalSection\r
+       GlobalSection(SolutionProperties) = preSolution\r
+               HideSolutionNode = FALSE\r
+       EndGlobalSection\r
+EndGlobal\r
index 615ecbc..b785c4e 100644 (file)
                        Name="Source Files"\r
                        >\r
                        <File\r
+                               RelativePath="..\..\..\..\lib\altsvc.c"\r
+                       >\r
+                       </File>\r
+                       <File\r
                                RelativePath="..\..\..\..\lib\amigaos.c"\r
                        >\r
                        </File>\r
                        >\r
                        </File>\r
                        <File\r
+                               RelativePath="..\..\..\..\lib\curl_get_line.c"\r
+                       >\r
+                       </File>\r
+                       <File\r
                                RelativePath="..\..\..\..\lib\curl_gssapi.c"\r
                        >\r
                        </File>\r
                        >\r
                        </File>\r
                        <File\r
-                               RelativePath="..\..\..\..\lib\pipeline.c"\r
-                       >\r
-                       </File>\r
-                       <File\r
                                RelativePath="..\..\..\..\lib\pop3.c"\r
                        >\r
                        </File>\r
                        >\r
                        </File>\r
                        <File\r
+                               RelativePath="..\..\..\..\lib\socketpair.c"\r
+                       >\r
+                       </File>\r
+                       <File\r
                                RelativePath="..\..\..\..\lib\socks.c"\r
                        >\r
                        </File>\r
                        >\r
                        </File>\r
                        <File\r
-                               RelativePath="..\..\..\..\lib\ssh.c"\r
-                       >\r
-                       </File>\r
-                       <File\r
-                               RelativePath="..\..\..\..\lib\ssh-libssh.c"\r
-                       >\r
-                       </File>\r
-                       <File\r
                                RelativePath="..\..\..\..\lib\strcase.c"\r
                        >\r
                        </File>\r
                        Name="Header Files"\r
                        >\r
                        <File\r
+                               RelativePath="..\..\..\..\lib\altsvc.h"\r
+                       >\r
+                       </File>\r
+                       <File\r
                                RelativePath="..\..\..\..\lib\amigaos.h"\r
                        >\r
                        </File>\r
                        >\r
                        </File>\r
                        <File\r
+                               RelativePath="..\..\..\..\lib\curl_get_line.h"\r
+                       >\r
+                       </File>\r
+                       <File\r
                                RelativePath="..\..\..\..\lib\curl_gssapi.h"\r
                        >\r
                        </File>\r
                        >\r
                        </File>\r
                        <File\r
-                               RelativePath="..\..\..\..\lib\pipeline.h"\r
-                       >\r
-                       </File>\r
-                       <File\r
                                RelativePath="..\..\..\..\lib\pop3.h"\r
                        >\r
                        </File>\r
                        >\r
                        </File>\r
                        <File\r
+                               RelativePath="..\..\..\..\lib\quic.h"\r
+                       >\r
+                       </File>\r
+                       <File\r
                                RelativePath="..\..\..\..\lib\rand.h"\r
                        >\r
                        </File>\r
                        >\r
                        </File>\r
                        <File\r
-                               RelativePath="..\..\..\..\lib\socks.h"\r
+                               RelativePath="..\..\..\..\lib\socketpair.h"\r
                        >\r
                        </File>\r
                        <File\r
-                               RelativePath="..\..\..\..\lib\speedcheck.h"\r
+                               RelativePath="..\..\..\..\lib\socks.h"\r
                        >\r
                        </File>\r
                        <File\r
-                               RelativePath="..\..\..\..\lib\splay.h"\r
+                               RelativePath="..\..\..\..\lib\speedcheck.h"\r
                        >\r
                        </File>\r
                        <File\r
-                               RelativePath="..\..\..\..\lib\ssh.h"\r
+                               RelativePath="..\..\..\..\lib\splay.h"\r
                        >\r
                        </File>\r
                        <File\r
                        </Filter>\r
                </Filter>\r
                <Filter\r
-                       Name="vtls"\r
+                       Name="vquic"\r
                        >\r
                        <Filter\r
                                Name="Source Files"\r
                                >\r
                                <File\r
-                                       RelativePath="..\..\..\..\lib\vtls\axtls.c"\r
+                                       RelativePath="..\..\..\..\lib\vquic\ngtcp2.c"\r
                                >\r
                                </File>\r
                                <File\r
-                                       RelativePath="..\..\..\..\lib\vtls\cyassl.c"\r
+                                       RelativePath="..\..\..\..\lib\vquic\quiche.c"\r
                                >\r
                                </File>\r
+                       </Filter>\r
+                       <Filter\r
+                               Name="Header Files"\r
+                               >\r
                                <File\r
-                                       RelativePath="..\..\..\..\lib\vtls\darwinssl.c"\r
+                                       RelativePath="..\..\..\..\lib\vquic\ngtcp2.h"\r
+                               >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\..\lib\vquic\quiche.h"\r
+                               >\r
+                               </File>\r
+                       </Filter>\r
+               </Filter>\r
+               <Filter\r
+                       Name="vssh"\r
+                       >\r
+                       <Filter\r
+                               Name="Source Files"\r
+                               >\r
+                               <File\r
+                                       RelativePath="..\..\..\..\lib\vssh\libssh2.c"\r
+                               >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\..\lib\vssh\libssh.c"\r
+                               >\r
+                               </File>\r
+                       </Filter>\r
+                       <Filter\r
+                               Name="Header Files"\r
+                               >\r
+                               <File\r
+                                       RelativePath="..\..\..\..\lib\vssh\ssh.h"\r
+                               >\r
+                               </File>\r
+                       </Filter>\r
+               </Filter>\r
+               <Filter\r
+                       Name="vtls"\r
+                       >\r
+                       <Filter\r
+                               Name="Source Files"\r
+                               >\r
+                               <File\r
+                                       RelativePath="..\..\..\..\lib\vtls\bearssl.c"\r
                                >\r
                                </File>\r
                                <File\r
                                >\r
                                </File>\r
                                <File\r
-                                       RelativePath="..\..\..\..\lib\vtls\vtls.c"\r
+                                       RelativePath="..\..\..\..\lib\vtls\sectransp.c"\r
                                >\r
                                </File>\r
-                       </Filter>\r
-                       <Filter\r
-                               Name="Header Files"\r
-                               >\r
                                <File\r
-                                       RelativePath="..\..\..\..\lib\vtls\axtls.h"\r
+                                       RelativePath="..\..\..\..\lib\vtls\vtls.c"\r
                                >\r
                                </File>\r
                                <File\r
-                                       RelativePath="..\..\..\..\lib\vtls\cyassl.h"\r
+                                       RelativePath="..\..\..\..\lib\vtls\wolfssl.c"\r
                                >\r
                                </File>\r
+                       </Filter>\r
+                       <Filter\r
+                               Name="Header Files"\r
+                               >\r
                                <File\r
-                                       RelativePath="..\..\..\..\lib\vtls\darwinssl.h"\r
+                                       RelativePath="..\..\..\..\lib\vtls\bearssl.h"\r
                                >\r
                                </File>\r
                                <File\r
                                >\r
                                </File>\r
                                <File\r
+                                       RelativePath="..\..\..\..\lib\vtls\sectransp.h"\r
+                               >\r
+                               </File>\r
+                               <File\r
                                        RelativePath="..\..\..\..\lib\vtls\vtls.h"\r
                                >\r
                                </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\..\lib\vtls\wolfssl.h"\r
+                               >\r
+                               </File>\r
                        </Filter>\r
                </Filter>\r
        </Files>\r
index 0c43cbe..088d133 100644 (file)
-Microsoft Visual Studio Solution File, Format Version 9.00
-# Visual Studio 2005
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "curl", "curl.vcproj", "{5228E9CE-A216-422F-A5E6-58E95E2DD71D}"
-EndProject
-Global
-       GlobalSection(SolutionConfigurationPlatforms) = preSolution
-               DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               DLL Debug - DLL OpenSSL - DLL LibSSH2|x64 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
-               DLL Debug - DLL OpenSSL|Win32 = DLL Debug - DLL OpenSSL|Win32
-               DLL Debug - DLL OpenSSL|x64 = DLL Debug - DLL OpenSSL|x64
-               DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               DLL Debug - DLL Windows SSPI - DLL WinIDN|x64 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
-               DLL Debug - DLL Windows SSPI|Win32 = DLL Debug - DLL Windows SSPI|Win32
-               DLL Debug - DLL Windows SSPI|x64 = DLL Debug - DLL Windows SSPI|x64
-               DLL Debug|Win32 = DLL Debug|Win32
-               DLL Debug|x64 = DLL Debug|x64
-               DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
-               DLL Release - DLL OpenSSL - DLL LibSSH2|x64 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
-               DLL Release - DLL OpenSSL|Win32 = DLL Release - DLL OpenSSL|Win32
-               DLL Release - DLL OpenSSL|x64 = DLL Release - DLL OpenSSL|x64
-               DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
-               DLL Release - DLL Windows SSPI - DLL WinIDN|x64 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
-               DLL Release - DLL Windows SSPI|Win32 = DLL Release - DLL Windows SSPI|Win32
-               DLL Release - DLL Windows SSPI|x64 = DLL Release - DLL Windows SSPI|x64
-               DLL Release|Win32 = DLL Release|Win32
-               DLL Release|x64 = DLL Release|x64
-               LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               LIB Debug - DLL OpenSSL - DLL LibSSH2|x64 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
-               LIB Debug - DLL OpenSSL|Win32 = LIB Debug - DLL OpenSSL|Win32
-               LIB Debug - DLL OpenSSL|x64 = LIB Debug - DLL OpenSSL|x64
-               LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               LIB Debug - DLL Windows SSPI - DLL WinIDN|x64 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
-               LIB Debug - DLL Windows SSPI|Win32 = LIB Debug - DLL Windows SSPI|Win32
-               LIB Debug - DLL Windows SSPI|x64 = LIB Debug - DLL Windows SSPI|x64
-               LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
-               LIB Debug - LIB OpenSSL - LIB LibSSH2|x64 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
-               LIB Debug - LIB OpenSSL|Win32 = LIB Debug - LIB OpenSSL|Win32
-               LIB Debug - LIB OpenSSL|x64 = LIB Debug - LIB OpenSSL|x64
-               LIB Debug|Win32 = LIB Debug|Win32
-               LIB Debug|x64 = LIB Debug|x64
-               LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
-               LIB Release - DLL OpenSSL - DLL LibSSH2|x64 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
-               LIB Release - DLL OpenSSL|Win32 = LIB Release - DLL OpenSSL|Win32
-               LIB Release - DLL OpenSSL|x64 = LIB Release - DLL OpenSSL|x64
-               LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
-               LIB Release - DLL Windows SSPI - DLL WinIDN|x64 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
-               LIB Release - DLL Windows SSPI|Win32 = LIB Release - DLL Windows SSPI|Win32
-               LIB Release - DLL Windows SSPI|x64 = LIB Release - DLL Windows SSPI|x64
-               LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
-               LIB Release - LIB OpenSSL - LIB LibSSH2|x64 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
-               LIB Release - LIB OpenSSL|Win32 = LIB Release - LIB OpenSSL|Win32
-               LIB Release - LIB OpenSSL|x64 = LIB Release - LIB OpenSSL|x64
-               LIB Release|Win32 = LIB Release|Win32
-               LIB Release|x64 = LIB Release|x64
-       EndGlobalSection
-       GlobalSection(ProjectConfigurationPlatforms) = postSolution
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|Win32.ActiveCfg = DLL Debug - DLL OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|Win32.Build.0 = DLL Debug - DLL OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|x64.ActiveCfg = DLL Debug - DLL OpenSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|x64.Build.0 = DLL Debug - DLL OpenSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|Win32.Build.0 = DLL Debug - DLL Windows SSPI|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|x64.ActiveCfg = DLL Debug - DLL Windows SSPI|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|x64.Build.0 = DLL Debug - DLL Windows SSPI|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|Win32.Build.0 = DLL Debug|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|x64.ActiveCfg = DLL Debug|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|x64.Build.0 = DLL Debug|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|Win32.ActiveCfg = DLL Release - DLL OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|Win32.Build.0 = DLL Release - DLL OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|x64.ActiveCfg = DLL Release - DLL OpenSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|x64.Build.0 = DLL Release - DLL OpenSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|Win32.ActiveCfg = DLL Release - DLL Windows SSPI|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|Win32.Build.0 = DLL Release - DLL Windows SSPI|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|x64.ActiveCfg = DLL Release - DLL Windows SSPI|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|x64.Build.0 = DLL Release - DLL Windows SSPI|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|Win32.ActiveCfg = DLL Release|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|Win32.Build.0 = DLL Release|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|x64.ActiveCfg = DLL Release|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|x64.Build.0 = DLL Release|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|Win32.ActiveCfg = LIB Debug - DLL OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|Win32.Build.0 = LIB Debug - DLL OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|x64.ActiveCfg = LIB Debug - DLL OpenSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|x64.Build.0 = LIB Debug - DLL OpenSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|Win32.Build.0 = LIB Debug - DLL Windows SSPI|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|x64.ActiveCfg = LIB Debug - DLL Windows SSPI|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|x64.Build.0 = LIB Debug - DLL Windows SSPI|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|Win32.ActiveCfg = LIB Debug - LIB OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|Win32.Build.0 = LIB Debug - LIB OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|x64.ActiveCfg = LIB Debug - LIB OpenSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|x64.Build.0 = LIB Debug - LIB OpenSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|Win32.ActiveCfg = LIB Debug|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|Win32.Build.0 = LIB Debug|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|x64.ActiveCfg = LIB Debug|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|x64.Build.0 = LIB Debug|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|Win32.ActiveCfg = LIB Release - DLL OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|Win32.Build.0 = LIB Release - DLL OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|x64.ActiveCfg = LIB Release - DLL OpenSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|x64.Build.0 = LIB Release - DLL OpenSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|Win32.ActiveCfg = LIB Release - DLL Windows SSPI|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|Win32.Build.0 = LIB Release - DLL Windows SSPI|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|x64.ActiveCfg = LIB Release - DLL Windows SSPI|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|x64.Build.0 = LIB Release - DLL Windows SSPI|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|Win32.ActiveCfg = LIB Release - LIB OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|Win32.Build.0 = LIB Release - LIB OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|x64.ActiveCfg = LIB Release - LIB OpenSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|x64.Build.0 = LIB Release - LIB OpenSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|Win32.ActiveCfg = LIB Release|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|Win32.Build.0 = LIB Release|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|x64.ActiveCfg = LIB Release|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|x64.Build.0 = LIB Release|x64
-       EndGlobalSection
-       GlobalSection(SolutionProperties) = preSolution
-               HideSolutionNode = FALSE
-       EndGlobalSection
-EndGlobal
+Microsoft Visual Studio Solution File, Format Version 9.00\r
+# Visual Studio 2005\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "curl", "curl.vcproj", "{5228E9CE-A216-422F-A5E6-58E95E2DD71D}"\r
+EndProject\r
+Global\r
+       GlobalSection(SolutionConfigurationPlatforms) = preSolution\r
+               DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               DLL Debug - DLL OpenSSL - DLL LibSSH2|x64 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64\r
+               DLL Debug - DLL OpenSSL|Win32 = DLL Debug - DLL OpenSSL|Win32\r
+               DLL Debug - DLL OpenSSL|x64 = DLL Debug - DLL OpenSSL|x64\r
+               DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               DLL Debug - DLL Windows SSPI - DLL WinIDN|x64 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64\r
+               DLL Debug - DLL Windows SSPI|Win32 = DLL Debug - DLL Windows SSPI|Win32\r
+               DLL Debug - DLL Windows SSPI|x64 = DLL Debug - DLL Windows SSPI|x64\r
+               DLL Debug|Win32 = DLL Debug|Win32\r
+               DLL Debug|x64 = DLL Debug|x64\r
+               DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               DLL Release - DLL OpenSSL - DLL LibSSH2|x64 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64\r
+               DLL Release - DLL OpenSSL|Win32 = DLL Release - DLL OpenSSL|Win32\r
+               DLL Release - DLL OpenSSL|x64 = DLL Release - DLL OpenSSL|x64\r
+               DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               DLL Release - DLL Windows SSPI - DLL WinIDN|x64 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64\r
+               DLL Release - DLL Windows SSPI|Win32 = DLL Release - DLL Windows SSPI|Win32\r
+               DLL Release - DLL Windows SSPI|x64 = DLL Release - DLL Windows SSPI|x64\r
+               DLL Release|Win32 = DLL Release|Win32\r
+               DLL Release|x64 = DLL Release|x64\r
+               LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               LIB Debug - DLL OpenSSL - DLL LibSSH2|x64 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64\r
+               LIB Debug - DLL OpenSSL|Win32 = LIB Debug - DLL OpenSSL|Win32\r
+               LIB Debug - DLL OpenSSL|x64 = LIB Debug - DLL OpenSSL|x64\r
+               LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               LIB Debug - DLL Windows SSPI - DLL WinIDN|x64 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64\r
+               LIB Debug - DLL Windows SSPI|Win32 = LIB Debug - DLL Windows SSPI|Win32\r
+               LIB Debug - DLL Windows SSPI|x64 = LIB Debug - DLL Windows SSPI|x64\r
+               LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32\r
+               LIB Debug - LIB OpenSSL - LIB LibSSH2|x64 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64\r
+               LIB Debug - LIB OpenSSL|Win32 = LIB Debug - LIB OpenSSL|Win32\r
+               LIB Debug - LIB OpenSSL|x64 = LIB Debug - LIB OpenSSL|x64\r
+               LIB Debug|Win32 = LIB Debug|Win32\r
+               LIB Debug|x64 = LIB Debug|x64\r
+               LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               LIB Release - DLL OpenSSL - DLL LibSSH2|x64 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64\r
+               LIB Release - DLL OpenSSL|Win32 = LIB Release - DLL OpenSSL|Win32\r
+               LIB Release - DLL OpenSSL|x64 = LIB Release - DLL OpenSSL|x64\r
+               LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               LIB Release - DLL Windows SSPI - DLL WinIDN|x64 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64\r
+               LIB Release - DLL Windows SSPI|Win32 = LIB Release - DLL Windows SSPI|Win32\r
+               LIB Release - DLL Windows SSPI|x64 = LIB Release - DLL Windows SSPI|x64\r
+               LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32\r
+               LIB Release - LIB OpenSSL - LIB LibSSH2|x64 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64\r
+               LIB Release - LIB OpenSSL|Win32 = LIB Release - LIB OpenSSL|Win32\r
+               LIB Release - LIB OpenSSL|x64 = LIB Release - LIB OpenSSL|x64\r
+               LIB Release|Win32 = LIB Release|Win32\r
+               LIB Release|x64 = LIB Release|x64\r
+       EndGlobalSection\r
+       GlobalSection(ProjectConfigurationPlatforms) = postSolution\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|Win32.ActiveCfg = DLL Debug - DLL OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|Win32.Build.0 = DLL Debug - DLL OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|x64.ActiveCfg = DLL Debug - DLL OpenSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|x64.Build.0 = DLL Debug - DLL OpenSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|Win32.Build.0 = DLL Debug - DLL Windows SSPI|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|x64.ActiveCfg = DLL Debug - DLL Windows SSPI|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|x64.Build.0 = DLL Debug - DLL Windows SSPI|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|Win32.Build.0 = DLL Debug|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|x64.ActiveCfg = DLL Debug|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|x64.Build.0 = DLL Debug|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|Win32.ActiveCfg = DLL Release - DLL OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|Win32.Build.0 = DLL Release - DLL OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|x64.ActiveCfg = DLL Release - DLL OpenSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|x64.Build.0 = DLL Release - DLL OpenSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|Win32.ActiveCfg = DLL Release - DLL Windows SSPI|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|Win32.Build.0 = DLL Release - DLL Windows SSPI|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|x64.ActiveCfg = DLL Release - DLL Windows SSPI|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|x64.Build.0 = DLL Release - DLL Windows SSPI|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|Win32.ActiveCfg = DLL Release|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|Win32.Build.0 = DLL Release|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|x64.ActiveCfg = DLL Release|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|x64.Build.0 = DLL Release|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|Win32.ActiveCfg = LIB Debug - DLL OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|Win32.Build.0 = LIB Debug - DLL OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|x64.ActiveCfg = LIB Debug - DLL OpenSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|x64.Build.0 = LIB Debug - DLL OpenSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|Win32.Build.0 = LIB Debug - DLL Windows SSPI|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|x64.ActiveCfg = LIB Debug - DLL Windows SSPI|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|x64.Build.0 = LIB Debug - DLL Windows SSPI|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|Win32.ActiveCfg = LIB Debug - LIB OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|Win32.Build.0 = LIB Debug - LIB OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|x64.ActiveCfg = LIB Debug - LIB OpenSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|x64.Build.0 = LIB Debug - LIB OpenSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|Win32.ActiveCfg = LIB Debug|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|Win32.Build.0 = LIB Debug|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|x64.ActiveCfg = LIB Debug|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|x64.Build.0 = LIB Debug|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|Win32.ActiveCfg = LIB Release - DLL OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|Win32.Build.0 = LIB Release - DLL OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|x64.ActiveCfg = LIB Release - DLL OpenSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|x64.Build.0 = LIB Release - DLL OpenSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|Win32.ActiveCfg = LIB Release - DLL Windows SSPI|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|Win32.Build.0 = LIB Release - DLL Windows SSPI|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|x64.ActiveCfg = LIB Release - DLL Windows SSPI|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|x64.Build.0 = LIB Release - DLL Windows SSPI|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|Win32.ActiveCfg = LIB Release - LIB OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|Win32.Build.0 = LIB Release - LIB OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|x64.ActiveCfg = LIB Release - LIB OpenSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|x64.Build.0 = LIB Release - LIB OpenSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|Win32.ActiveCfg = LIB Release|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|Win32.Build.0 = LIB Release|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|x64.ActiveCfg = LIB Release|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|x64.Build.0 = LIB Release|x64\r
+       EndGlobalSection\r
+       GlobalSection(SolutionProperties) = preSolution\r
+               HideSolutionNode = FALSE\r
+       EndGlobalSection\r
+EndGlobal\r
index fb031cf..7b554c7 100644 (file)
                        >\r
                        </File>\r
                        <File\r
+                               RelativePath="..\..\..\..\src\tool_progress.c"\r
+                       >\r
+                       </File>\r
+                       <File\r
                                RelativePath="..\..\..\..\src\tool_setopt.c"\r
                        >\r
                        </File>\r
                        >\r
                        </File>\r
                        <File\r
+                               RelativePath="..\..\..\..\src\tool_progress.h"\r
+                       >\r
+                       </File>\r
+                       <File\r
                                RelativePath="..\..\..\..\src\tool_sdecls.h"\r
                        >\r
                        </File>\r
index 2007cf7..e15213a 100644 (file)
-Microsoft Visual Studio Solution File, Format Version 10.00
-# Visual Studio 2008
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "curl", "src\curl.vcproj", "{5228E9CE-A216-422F-A5E6-58E95E2DD71D}"
-       ProjectSection(ProjectDependencies) = postProject
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB} = {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}
-       EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libcurl", "lib\libcurl.vcproj", "{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}"
-EndProject
-Global
-       GlobalSection(SolutionConfigurationPlatforms) = preSolution
-               DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               DLL Debug - DLL OpenSSL - DLL LibSSH2|x64 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
-               DLL Debug - DLL OpenSSL|Win32 = DLL Debug - DLL OpenSSL|Win32
-               DLL Debug - DLL OpenSSL|x64 = DLL Debug - DLL OpenSSL|x64
-               DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               DLL Debug - DLL Windows SSPI - DLL WinIDN|x64 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
-               DLL Debug - DLL Windows SSPI|Win32 = DLL Debug - DLL Windows SSPI|Win32
-               DLL Debug - DLL Windows SSPI|x64 = DLL Debug - DLL Windows SSPI|x64
-               DLL Debug|Win32 = DLL Debug|Win32
-               DLL Debug|x64 = DLL Debug|x64
-               DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
-               DLL Release - DLL OpenSSL - DLL LibSSH2|x64 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
-               DLL Release - DLL OpenSSL|Win32 = DLL Release - DLL OpenSSL|Win32
-               DLL Release - DLL OpenSSL|x64 = DLL Release - DLL OpenSSL|x64
-               DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
-               DLL Release - DLL Windows SSPI - DLL WinIDN|x64 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
-               DLL Release - DLL Windows SSPI|Win32 = DLL Release - DLL Windows SSPI|Win32
-               DLL Release - DLL Windows SSPI|x64 = DLL Release - DLL Windows SSPI|x64
-               DLL Release|Win32 = DLL Release|Win32
-               DLL Release|x64 = DLL Release|x64
-               LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               LIB Debug - DLL OpenSSL - DLL LibSSH2|x64 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
-               LIB Debug - DLL OpenSSL|Win32 = LIB Debug - DLL OpenSSL|Win32
-               LIB Debug - DLL OpenSSL|x64 = LIB Debug - DLL OpenSSL|x64
-               LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               LIB Debug - DLL Windows SSPI - DLL WinIDN|x64 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
-               LIB Debug - DLL Windows SSPI|Win32 = LIB Debug - DLL Windows SSPI|Win32
-               LIB Debug - DLL Windows SSPI|x64 = LIB Debug - DLL Windows SSPI|x64
-               LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
-               LIB Debug - LIB OpenSSL - LIB LibSSH2|x64 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
-               LIB Debug - LIB OpenSSL|Win32 = LIB Debug - LIB OpenSSL|Win32
-               LIB Debug - LIB OpenSSL|x64 = LIB Debug - LIB OpenSSL|x64
-               LIB Debug|Win32 = LIB Debug|Win32
-               LIB Debug|x64 = LIB Debug|x64
-               LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
-               LIB Release - DLL OpenSSL - DLL LibSSH2|x64 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
-               LIB Release - DLL OpenSSL|Win32 = LIB Release - DLL OpenSSL|Win32
-               LIB Release - DLL OpenSSL|x64 = LIB Release - DLL OpenSSL|x64
-               LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
-               LIB Release - DLL Windows SSPI - DLL WinIDN|x64 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
-               LIB Release - DLL Windows SSPI|Win32 = LIB Release - DLL Windows SSPI|Win32
-               LIB Release - DLL Windows SSPI|x64 = LIB Release - DLL Windows SSPI|x64
-               LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
-               LIB Release - LIB OpenSSL - LIB LibSSH2|x64 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
-               LIB Release - LIB OpenSSL|Win32 = LIB Release - LIB OpenSSL|Win32
-               LIB Release - LIB OpenSSL|x64 = LIB Release - LIB OpenSSL|x64
-               LIB Release|Win32 = LIB Release|Win32
-               LIB Release|x64 = LIB Release|x64
-       EndGlobalSection
-       GlobalSection(ProjectConfigurationPlatforms) = postSolution
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|Win32.ActiveCfg = DLL Debug - DLL OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|Win32.Build.0 = DLL Debug - DLL OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|x64.ActiveCfg = DLL Debug - DLL OpenSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|x64.Build.0 = DLL Debug - DLL OpenSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|Win32.Build.0 = DLL Debug - DLL Windows SSPI|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|x64.ActiveCfg = DLL Debug - DLL Windows SSPI|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|x64.Build.0 = DLL Debug - DLL Windows SSPI|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|Win32.Build.0 = DLL Debug|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|x64.ActiveCfg = DLL Debug|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|x64.Build.0 = DLL Debug|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|Win32.ActiveCfg = DLL Release - DLL OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|Win32.Build.0 = DLL Release - DLL OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|x64.ActiveCfg = DLL Release - DLL OpenSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|x64.Build.0 = DLL Release - DLL OpenSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|Win32.ActiveCfg = DLL Release - DLL Windows SSPI|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|Win32.Build.0 = DLL Release - DLL Windows SSPI|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|x64.ActiveCfg = DLL Release - DLL Windows SSPI|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|x64.Build.0 = DLL Release - DLL Windows SSPI|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|Win32.ActiveCfg = DLL Release|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|Win32.Build.0 = DLL Release|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|x64.ActiveCfg = DLL Release|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|x64.Build.0 = DLL Release|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|Win32.ActiveCfg = LIB Debug - DLL OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|Win32.Build.0 = LIB Debug - DLL OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|x64.ActiveCfg = LIB Debug - DLL OpenSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|x64.Build.0 = LIB Debug - DLL OpenSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|Win32.Build.0 = LIB Debug - DLL Windows SSPI|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|x64.ActiveCfg = LIB Debug - DLL Windows SSPI|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|x64.Build.0 = LIB Debug - DLL Windows SSPI|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|Win32.ActiveCfg = LIB Debug - LIB OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|Win32.Build.0 = LIB Debug - LIB OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|x64.ActiveCfg = LIB Debug - LIB OpenSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|x64.Build.0 = LIB Debug - LIB OpenSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|Win32.ActiveCfg = LIB Debug|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|Win32.Build.0 = LIB Debug|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|x64.ActiveCfg = LIB Debug|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|x64.Build.0 = LIB Debug|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|Win32.ActiveCfg = LIB Release - DLL OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|Win32.Build.0 = LIB Release - DLL OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|x64.ActiveCfg = LIB Release - DLL OpenSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|x64.Build.0 = LIB Release - DLL OpenSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|Win32.ActiveCfg = LIB Release - DLL Windows SSPI|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|Win32.Build.0 = LIB Release - DLL Windows SSPI|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|x64.ActiveCfg = LIB Release - DLL Windows SSPI|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|x64.Build.0 = LIB Release - DLL Windows SSPI|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|Win32.ActiveCfg = LIB Release - LIB OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|Win32.Build.0 = LIB Release - LIB OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|x64.ActiveCfg = LIB Release - LIB OpenSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|x64.Build.0 = LIB Release - LIB OpenSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|Win32.ActiveCfg = LIB Release|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|Win32.Build.0 = LIB Release|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|x64.ActiveCfg = LIB Release|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|x64.Build.0 = LIB Release|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|Win32.ActiveCfg = DLL Debug - DLL OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|Win32.Build.0 = DLL Debug - DLL OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|x64.ActiveCfg = DLL Debug - DLL OpenSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|x64.Build.0 = DLL Debug - DLL OpenSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|Win32.Build.0 = DLL Debug - DLL Windows SSPI|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|x64.ActiveCfg = DLL Debug - DLL Windows SSPI|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|x64.Build.0 = DLL Debug - DLL Windows SSPI|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|Win32.Build.0 = DLL Debug|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|x64.ActiveCfg = DLL Debug|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|x64.Build.0 = DLL Debug|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|Win32.ActiveCfg = DLL Release - DLL OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|Win32.Build.0 = DLL Release - DLL OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|x64.ActiveCfg = DLL Release - DLL OpenSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|x64.Build.0 = DLL Release - DLL OpenSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|Win32.ActiveCfg = DLL Release - DLL Windows SSPI|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|Win32.Build.0 = DLL Release - DLL Windows SSPI|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|x64.ActiveCfg = DLL Release - DLL Windows SSPI|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|x64.Build.0 = DLL Release - DLL Windows SSPI|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|Win32.ActiveCfg = DLL Release|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|Win32.Build.0 = DLL Release|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|x64.ActiveCfg = DLL Release|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|x64.Build.0 = DLL Release|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|Win32.ActiveCfg = LIB Debug - DLL OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|Win32.Build.0 = LIB Debug - DLL OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|x64.ActiveCfg = LIB Debug - DLL OpenSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|x64.Build.0 = LIB Debug - DLL OpenSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|Win32.Build.0 = LIB Debug - DLL Windows SSPI|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|x64.ActiveCfg = LIB Debug - DLL Windows SSPI|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|x64.Build.0 = LIB Debug - DLL Windows SSPI|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|Win32.ActiveCfg = LIB Debug - LIB OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|Win32.Build.0 = LIB Debug - LIB OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|x64.ActiveCfg = LIB Debug - LIB OpenSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|x64.Build.0 = LIB Debug - LIB OpenSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|Win32.ActiveCfg = LIB Debug|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|Win32.Build.0 = LIB Debug|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|x64.ActiveCfg = LIB Debug|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|x64.Build.0 = LIB Debug|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|Win32.ActiveCfg = LIB Release - DLL OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|Win32.Build.0 = LIB Release - DLL OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|x64.ActiveCfg = LIB Release - DLL OpenSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|x64.Build.0 = LIB Release - DLL OpenSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|Win32.ActiveCfg = LIB Release - DLL Windows SSPI|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|Win32.Build.0 = LIB Release - DLL Windows SSPI|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|x64.ActiveCfg = LIB Release - DLL Windows SSPI|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|x64.Build.0 = LIB Release - DLL Windows SSPI|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|Win32.ActiveCfg = LIB Release - LIB OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|Win32.Build.0 = LIB Release - LIB OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|x64.ActiveCfg = LIB Release - LIB OpenSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|x64.Build.0 = LIB Release - LIB OpenSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|Win32.ActiveCfg = LIB Release|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|Win32.Build.0 = LIB Release|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|x64.ActiveCfg = LIB Release|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|x64.Build.0 = LIB Release|x64
-       EndGlobalSection
-       GlobalSection(SolutionProperties) = preSolution
-               HideSolutionNode = FALSE
-       EndGlobalSection
-EndGlobal
+Microsoft Visual Studio Solution File, Format Version 10.00\r
+# Visual Studio 2008\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "curl", "src\curl.vcproj", "{5228E9CE-A216-422F-A5E6-58E95E2DD71D}"\r
+       ProjectSection(ProjectDependencies) = postProject\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB} = {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}\r
+       EndProjectSection\r
+EndProject\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libcurl", "lib\libcurl.vcproj", "{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}"\r
+EndProject\r
+Global\r
+       GlobalSection(SolutionConfigurationPlatforms) = preSolution\r
+               DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               DLL Debug - DLL OpenSSL - DLL LibSSH2|x64 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64\r
+               DLL Debug - DLL OpenSSL|Win32 = DLL Debug - DLL OpenSSL|Win32\r
+               DLL Debug - DLL OpenSSL|x64 = DLL Debug - DLL OpenSSL|x64\r
+               DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               DLL Debug - DLL Windows SSPI - DLL WinIDN|x64 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64\r
+               DLL Debug - DLL Windows SSPI|Win32 = DLL Debug - DLL Windows SSPI|Win32\r
+               DLL Debug - DLL Windows SSPI|x64 = DLL Debug - DLL Windows SSPI|x64\r
+               DLL Debug|Win32 = DLL Debug|Win32\r
+               DLL Debug|x64 = DLL Debug|x64\r
+               DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               DLL Release - DLL OpenSSL - DLL LibSSH2|x64 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64\r
+               DLL Release - DLL OpenSSL|Win32 = DLL Release - DLL OpenSSL|Win32\r
+               DLL Release - DLL OpenSSL|x64 = DLL Release - DLL OpenSSL|x64\r
+               DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               DLL Release - DLL Windows SSPI - DLL WinIDN|x64 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64\r
+               DLL Release - DLL Windows SSPI|Win32 = DLL Release - DLL Windows SSPI|Win32\r
+               DLL Release - DLL Windows SSPI|x64 = DLL Release - DLL Windows SSPI|x64\r
+               DLL Release|Win32 = DLL Release|Win32\r
+               DLL Release|x64 = DLL Release|x64\r
+               LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               LIB Debug - DLL OpenSSL - DLL LibSSH2|x64 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64\r
+               LIB Debug - DLL OpenSSL|Win32 = LIB Debug - DLL OpenSSL|Win32\r
+               LIB Debug - DLL OpenSSL|x64 = LIB Debug - DLL OpenSSL|x64\r
+               LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               LIB Debug - DLL Windows SSPI - DLL WinIDN|x64 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64\r
+               LIB Debug - DLL Windows SSPI|Win32 = LIB Debug - DLL Windows SSPI|Win32\r
+               LIB Debug - DLL Windows SSPI|x64 = LIB Debug - DLL Windows SSPI|x64\r
+               LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32\r
+               LIB Debug - LIB OpenSSL - LIB LibSSH2|x64 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64\r
+               LIB Debug - LIB OpenSSL|Win32 = LIB Debug - LIB OpenSSL|Win32\r
+               LIB Debug - LIB OpenSSL|x64 = LIB Debug - LIB OpenSSL|x64\r
+               LIB Debug|Win32 = LIB Debug|Win32\r
+               LIB Debug|x64 = LIB Debug|x64\r
+               LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               LIB Release - DLL OpenSSL - DLL LibSSH2|x64 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64\r
+               LIB Release - DLL OpenSSL|Win32 = LIB Release - DLL OpenSSL|Win32\r
+               LIB Release - DLL OpenSSL|x64 = LIB Release - DLL OpenSSL|x64\r
+               LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               LIB Release - DLL Windows SSPI - DLL WinIDN|x64 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64\r
+               LIB Release - DLL Windows SSPI|Win32 = LIB Release - DLL Windows SSPI|Win32\r
+               LIB Release - DLL Windows SSPI|x64 = LIB Release - DLL Windows SSPI|x64\r
+               LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32\r
+               LIB Release - LIB OpenSSL - LIB LibSSH2|x64 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64\r
+               LIB Release - LIB OpenSSL|Win32 = LIB Release - LIB OpenSSL|Win32\r
+               LIB Release - LIB OpenSSL|x64 = LIB Release - LIB OpenSSL|x64\r
+               LIB Release|Win32 = LIB Release|Win32\r
+               LIB Release|x64 = LIB Release|x64\r
+       EndGlobalSection\r
+       GlobalSection(ProjectConfigurationPlatforms) = postSolution\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|Win32.ActiveCfg = DLL Debug - DLL OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|Win32.Build.0 = DLL Debug - DLL OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|x64.ActiveCfg = DLL Debug - DLL OpenSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|x64.Build.0 = DLL Debug - DLL OpenSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|Win32.Build.0 = DLL Debug - DLL Windows SSPI|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|x64.ActiveCfg = DLL Debug - DLL Windows SSPI|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|x64.Build.0 = DLL Debug - DLL Windows SSPI|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|Win32.Build.0 = DLL Debug|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|x64.ActiveCfg = DLL Debug|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|x64.Build.0 = DLL Debug|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|Win32.ActiveCfg = DLL Release - DLL OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|Win32.Build.0 = DLL Release - DLL OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|x64.ActiveCfg = DLL Release - DLL OpenSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|x64.Build.0 = DLL Release - DLL OpenSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|Win32.ActiveCfg = DLL Release - DLL Windows SSPI|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|Win32.Build.0 = DLL Release - DLL Windows SSPI|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|x64.ActiveCfg = DLL Release - DLL Windows SSPI|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|x64.Build.0 = DLL Release - DLL Windows SSPI|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|Win32.ActiveCfg = DLL Release|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|Win32.Build.0 = DLL Release|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|x64.ActiveCfg = DLL Release|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|x64.Build.0 = DLL Release|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|Win32.ActiveCfg = LIB Debug - DLL OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|Win32.Build.0 = LIB Debug - DLL OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|x64.ActiveCfg = LIB Debug - DLL OpenSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|x64.Build.0 = LIB Debug - DLL OpenSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|Win32.Build.0 = LIB Debug - DLL Windows SSPI|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|x64.ActiveCfg = LIB Debug - DLL Windows SSPI|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|x64.Build.0 = LIB Debug - DLL Windows SSPI|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|Win32.ActiveCfg = LIB Debug - LIB OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|Win32.Build.0 = LIB Debug - LIB OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|x64.ActiveCfg = LIB Debug - LIB OpenSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|x64.Build.0 = LIB Debug - LIB OpenSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|Win32.ActiveCfg = LIB Debug|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|Win32.Build.0 = LIB Debug|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|x64.ActiveCfg = LIB Debug|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|x64.Build.0 = LIB Debug|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|Win32.ActiveCfg = LIB Release - DLL OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|Win32.Build.0 = LIB Release - DLL OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|x64.ActiveCfg = LIB Release - DLL OpenSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|x64.Build.0 = LIB Release - DLL OpenSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|Win32.ActiveCfg = LIB Release - DLL Windows SSPI|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|Win32.Build.0 = LIB Release - DLL Windows SSPI|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|x64.ActiveCfg = LIB Release - DLL Windows SSPI|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|x64.Build.0 = LIB Release - DLL Windows SSPI|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|Win32.ActiveCfg = LIB Release - LIB OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|Win32.Build.0 = LIB Release - LIB OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|x64.ActiveCfg = LIB Release - LIB OpenSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|x64.Build.0 = LIB Release - LIB OpenSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|Win32.ActiveCfg = LIB Release|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|Win32.Build.0 = LIB Release|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|x64.ActiveCfg = LIB Release|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|x64.Build.0 = LIB Release|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|Win32.ActiveCfg = DLL Debug - DLL OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|Win32.Build.0 = DLL Debug - DLL OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|x64.ActiveCfg = DLL Debug - DLL OpenSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|x64.Build.0 = DLL Debug - DLL OpenSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|Win32.Build.0 = DLL Debug - DLL Windows SSPI|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|x64.ActiveCfg = DLL Debug - DLL Windows SSPI|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|x64.Build.0 = DLL Debug - DLL Windows SSPI|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|Win32.Build.0 = DLL Debug|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|x64.ActiveCfg = DLL Debug|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|x64.Build.0 = DLL Debug|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|Win32.ActiveCfg = DLL Release - DLL OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|Win32.Build.0 = DLL Release - DLL OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|x64.ActiveCfg = DLL Release - DLL OpenSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|x64.Build.0 = DLL Release - DLL OpenSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|Win32.ActiveCfg = DLL Release - DLL Windows SSPI|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|Win32.Build.0 = DLL Release - DLL Windows SSPI|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|x64.ActiveCfg = DLL Release - DLL Windows SSPI|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|x64.Build.0 = DLL Release - DLL Windows SSPI|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|Win32.ActiveCfg = DLL Release|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|Win32.Build.0 = DLL Release|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|x64.ActiveCfg = DLL Release|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|x64.Build.0 = DLL Release|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|Win32.ActiveCfg = LIB Debug - DLL OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|Win32.Build.0 = LIB Debug - DLL OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|x64.ActiveCfg = LIB Debug - DLL OpenSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|x64.Build.0 = LIB Debug - DLL OpenSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|Win32.Build.0 = LIB Debug - DLL Windows SSPI|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|x64.ActiveCfg = LIB Debug - DLL Windows SSPI|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|x64.Build.0 = LIB Debug - DLL Windows SSPI|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|Win32.ActiveCfg = LIB Debug - LIB OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|Win32.Build.0 = LIB Debug - LIB OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|x64.ActiveCfg = LIB Debug - LIB OpenSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|x64.Build.0 = LIB Debug - LIB OpenSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|Win32.ActiveCfg = LIB Debug|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|Win32.Build.0 = LIB Debug|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|x64.ActiveCfg = LIB Debug|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|x64.Build.0 = LIB Debug|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|Win32.ActiveCfg = LIB Release - DLL OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|Win32.Build.0 = LIB Release - DLL OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|x64.ActiveCfg = LIB Release - DLL OpenSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|x64.Build.0 = LIB Release - DLL OpenSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|Win32.ActiveCfg = LIB Release - DLL Windows SSPI|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|Win32.Build.0 = LIB Release - DLL Windows SSPI|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|x64.ActiveCfg = LIB Release - DLL Windows SSPI|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|x64.Build.0 = LIB Release - DLL Windows SSPI|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|Win32.ActiveCfg = LIB Release - LIB OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|Win32.Build.0 = LIB Release - LIB OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|x64.ActiveCfg = LIB Release - LIB OpenSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|x64.Build.0 = LIB Release - LIB OpenSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|Win32.ActiveCfg = LIB Release|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|Win32.Build.0 = LIB Release|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|x64.ActiveCfg = LIB Release|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|x64.Build.0 = LIB Release|x64\r
+       EndGlobalSection\r
+       GlobalSection(SolutionProperties) = preSolution\r
+               HideSolutionNode = FALSE\r
+       EndGlobalSection\r
+EndGlobal\r
index a6619d5..7e01073 100644 (file)
-Microsoft Visual Studio Solution File, Format Version 10.00
-# Visual Studio 2008
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libcurl", "libcurl.vcproj", "{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}"
-EndProject
-Global
-       GlobalSection(SolutionConfigurationPlatforms) = preSolution
-               DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               DLL Debug - DLL OpenSSL - DLL LibSSH2|x64 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
-               DLL Debug - DLL OpenSSL|Win32 = DLL Debug - DLL OpenSSL|Win32
-               DLL Debug - DLL OpenSSL|x64 = DLL Debug - DLL OpenSSL|x64
-               DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               DLL Debug - DLL Windows SSPI - DLL WinIDN|x64 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
-               DLL Debug - DLL Windows SSPI|Win32 = DLL Debug - DLL Windows SSPI|Win32
-               DLL Debug - DLL Windows SSPI|x64 = DLL Debug - DLL Windows SSPI|x64
-               DLL Debug|Win32 = DLL Debug|Win32
-               DLL Debug|x64 = DLL Debug|x64
-               DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
-               DLL Release - DLL OpenSSL - DLL LibSSH2|x64 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
-               DLL Release - DLL OpenSSL|Win32 = DLL Release - DLL OpenSSL|Win32
-               DLL Release - DLL OpenSSL|x64 = DLL Release - DLL OpenSSL|x64
-               DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
-               DLL Release - DLL Windows SSPI - DLL WinIDN|x64 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
-               DLL Release - DLL Windows SSPI|Win32 = DLL Release - DLL Windows SSPI|Win32
-               DLL Release - DLL Windows SSPI|x64 = DLL Release - DLL Windows SSPI|x64
-               DLL Release|Win32 = DLL Release|Win32
-               DLL Release|x64 = DLL Release|x64
-               LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               LIB Debug - DLL OpenSSL - DLL LibSSH2|x64 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
-               LIB Debug - DLL OpenSSL|Win32 = LIB Debug - DLL OpenSSL|Win32
-               LIB Debug - DLL OpenSSL|x64 = LIB Debug - DLL OpenSSL|x64
-               LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               LIB Debug - DLL Windows SSPI - DLL WinIDN|x64 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
-               LIB Debug - DLL Windows SSPI|Win32 = LIB Debug - DLL Windows SSPI|Win32
-               LIB Debug - DLL Windows SSPI|x64 = LIB Debug - DLL Windows SSPI|x64
-               LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
-               LIB Debug - LIB OpenSSL - LIB LibSSH2|x64 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
-               LIB Debug - LIB OpenSSL|Win32 = LIB Debug - LIB OpenSSL|Win32
-               LIB Debug - LIB OpenSSL|x64 = LIB Debug - LIB OpenSSL|x64
-               LIB Debug|Win32 = LIB Debug|Win32
-               LIB Debug|x64 = LIB Debug|x64
-               LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
-               LIB Release - DLL OpenSSL - DLL LibSSH2|x64 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
-               LIB Release - DLL OpenSSL|Win32 = LIB Release - DLL OpenSSL|Win32
-               LIB Release - DLL OpenSSL|x64 = LIB Release - DLL OpenSSL|x64
-               LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
-               LIB Release - DLL Windows SSPI - DLL WinIDN|x64 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
-               LIB Release - DLL Windows SSPI|Win32 = LIB Release - DLL Windows SSPI|Win32
-               LIB Release - DLL Windows SSPI|x64 = LIB Release - DLL Windows SSPI|x64
-               LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
-               LIB Release - LIB OpenSSL - LIB LibSSH2|x64 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
-               LIB Release - LIB OpenSSL|Win32 = LIB Release - LIB OpenSSL|Win32
-               LIB Release - LIB OpenSSL|x64 = LIB Release - LIB OpenSSL|x64
-               LIB Release|Win32 = LIB Release|Win32
-               LIB Release|x64 = LIB Release|x64
-       EndGlobalSection
-       GlobalSection(ProjectConfigurationPlatforms) = postSolution
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|Win32.ActiveCfg = DLL Debug - DLL OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|Win32.Build.0 = DLL Debug - DLL OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|x64.ActiveCfg = DLL Debug - DLL OpenSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|x64.Build.0 = DLL Debug - DLL OpenSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|Win32.Build.0 = DLL Debug - DLL Windows SSPI|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|x64.ActiveCfg = DLL Debug - DLL Windows SSPI|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|x64.Build.0 = DLL Debug - DLL Windows SSPI|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|Win32.Build.0 = DLL Debug|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|x64.ActiveCfg = DLL Debug|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|x64.Build.0 = DLL Debug|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|Win32.ActiveCfg = DLL Release - DLL OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|Win32.Build.0 = DLL Release - DLL OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|x64.ActiveCfg = DLL Release - DLL OpenSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|x64.Build.0 = DLL Release - DLL OpenSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|Win32.ActiveCfg = DLL Release - DLL Windows SSPI|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|Win32.Build.0 = DLL Release - DLL Windows SSPI|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|x64.ActiveCfg = DLL Release - DLL Windows SSPI|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|x64.Build.0 = DLL Release - DLL Windows SSPI|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|Win32.ActiveCfg = DLL Release|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|Win32.Build.0 = DLL Release|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|x64.ActiveCfg = DLL Release|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|x64.Build.0 = DLL Release|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|Win32.ActiveCfg = LIB Debug - DLL OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|Win32.Build.0 = LIB Debug - DLL OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|x64.ActiveCfg = LIB Debug - DLL OpenSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|x64.Build.0 = LIB Debug - DLL OpenSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|Win32.Build.0 = LIB Debug - DLL Windows SSPI|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|x64.ActiveCfg = LIB Debug - DLL Windows SSPI|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|x64.Build.0 = LIB Debug - DLL Windows SSPI|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|Win32.ActiveCfg = LIB Debug - LIB OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|Win32.Build.0 = LIB Debug - LIB OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|x64.ActiveCfg = LIB Debug - LIB OpenSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|x64.Build.0 = LIB Debug - LIB OpenSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|Win32.ActiveCfg = LIB Debug|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|Win32.Build.0 = LIB Debug|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|x64.ActiveCfg = LIB Debug|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|x64.Build.0 = LIB Debug|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|Win32.ActiveCfg = LIB Release - DLL OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|Win32.Build.0 = LIB Release - DLL OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|x64.ActiveCfg = LIB Release - DLL OpenSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|x64.Build.0 = LIB Release - DLL OpenSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|Win32.ActiveCfg = LIB Release - DLL Windows SSPI|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|Win32.Build.0 = LIB Release - DLL Windows SSPI|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|x64.ActiveCfg = LIB Release - DLL Windows SSPI|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|x64.Build.0 = LIB Release - DLL Windows SSPI|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|Win32.ActiveCfg = LIB Release - LIB OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|Win32.Build.0 = LIB Release - LIB OpenSSL|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|x64.ActiveCfg = LIB Release - LIB OpenSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|x64.Build.0 = LIB Release - LIB OpenSSL|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|Win32.ActiveCfg = LIB Release|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|Win32.Build.0 = LIB Release|Win32
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|x64.ActiveCfg = LIB Release|x64
-               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|x64.Build.0 = LIB Release|x64
-       EndGlobalSection
-       GlobalSection(SolutionProperties) = preSolution
-               HideSolutionNode = FALSE
-       EndGlobalSection
-EndGlobal
+Microsoft Visual Studio Solution File, Format Version 10.00\r
+# Visual Studio 2008\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libcurl", "libcurl.vcproj", "{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}"\r
+EndProject\r
+Global\r
+       GlobalSection(SolutionConfigurationPlatforms) = preSolution\r
+               DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               DLL Debug - DLL OpenSSL - DLL LibSSH2|x64 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64\r
+               DLL Debug - DLL OpenSSL|Win32 = DLL Debug - DLL OpenSSL|Win32\r
+               DLL Debug - DLL OpenSSL|x64 = DLL Debug - DLL OpenSSL|x64\r
+               DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               DLL Debug - DLL Windows SSPI - DLL WinIDN|x64 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64\r
+               DLL Debug - DLL Windows SSPI|Win32 = DLL Debug - DLL Windows SSPI|Win32\r
+               DLL Debug - DLL Windows SSPI|x64 = DLL Debug - DLL Windows SSPI|x64\r
+               DLL Debug|Win32 = DLL Debug|Win32\r
+               DLL Debug|x64 = DLL Debug|x64\r
+               DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               DLL Release - DLL OpenSSL - DLL LibSSH2|x64 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64\r
+               DLL Release - DLL OpenSSL|Win32 = DLL Release - DLL OpenSSL|Win32\r
+               DLL Release - DLL OpenSSL|x64 = DLL Release - DLL OpenSSL|x64\r
+               DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               DLL Release - DLL Windows SSPI - DLL WinIDN|x64 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64\r
+               DLL Release - DLL Windows SSPI|Win32 = DLL Release - DLL Windows SSPI|Win32\r
+               DLL Release - DLL Windows SSPI|x64 = DLL Release - DLL Windows SSPI|x64\r
+               DLL Release|Win32 = DLL Release|Win32\r
+               DLL Release|x64 = DLL Release|x64\r
+               LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               LIB Debug - DLL OpenSSL - DLL LibSSH2|x64 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64\r
+               LIB Debug - DLL OpenSSL|Win32 = LIB Debug - DLL OpenSSL|Win32\r
+               LIB Debug - DLL OpenSSL|x64 = LIB Debug - DLL OpenSSL|x64\r
+               LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               LIB Debug - DLL Windows SSPI - DLL WinIDN|x64 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64\r
+               LIB Debug - DLL Windows SSPI|Win32 = LIB Debug - DLL Windows SSPI|Win32\r
+               LIB Debug - DLL Windows SSPI|x64 = LIB Debug - DLL Windows SSPI|x64\r
+               LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32\r
+               LIB Debug - LIB OpenSSL - LIB LibSSH2|x64 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64\r
+               LIB Debug - LIB OpenSSL|Win32 = LIB Debug - LIB OpenSSL|Win32\r
+               LIB Debug - LIB OpenSSL|x64 = LIB Debug - LIB OpenSSL|x64\r
+               LIB Debug|Win32 = LIB Debug|Win32\r
+               LIB Debug|x64 = LIB Debug|x64\r
+               LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               LIB Release - DLL OpenSSL - DLL LibSSH2|x64 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64\r
+               LIB Release - DLL OpenSSL|Win32 = LIB Release - DLL OpenSSL|Win32\r
+               LIB Release - DLL OpenSSL|x64 = LIB Release - DLL OpenSSL|x64\r
+               LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               LIB Release - DLL Windows SSPI - DLL WinIDN|x64 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64\r
+               LIB Release - DLL Windows SSPI|Win32 = LIB Release - DLL Windows SSPI|Win32\r
+               LIB Release - DLL Windows SSPI|x64 = LIB Release - DLL Windows SSPI|x64\r
+               LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32\r
+               LIB Release - LIB OpenSSL - LIB LibSSH2|x64 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64\r
+               LIB Release - LIB OpenSSL|Win32 = LIB Release - LIB OpenSSL|Win32\r
+               LIB Release - LIB OpenSSL|x64 = LIB Release - LIB OpenSSL|x64\r
+               LIB Release|Win32 = LIB Release|Win32\r
+               LIB Release|x64 = LIB Release|x64\r
+       EndGlobalSection\r
+       GlobalSection(ProjectConfigurationPlatforms) = postSolution\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|Win32.ActiveCfg = DLL Debug - DLL OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|Win32.Build.0 = DLL Debug - DLL OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|x64.ActiveCfg = DLL Debug - DLL OpenSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|x64.Build.0 = DLL Debug - DLL OpenSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|Win32.Build.0 = DLL Debug - DLL Windows SSPI|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|x64.ActiveCfg = DLL Debug - DLL Windows SSPI|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|x64.Build.0 = DLL Debug - DLL Windows SSPI|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|Win32.Build.0 = DLL Debug|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|x64.ActiveCfg = DLL Debug|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|x64.Build.0 = DLL Debug|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|Win32.ActiveCfg = DLL Release - DLL OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|Win32.Build.0 = DLL Release - DLL OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|x64.ActiveCfg = DLL Release - DLL OpenSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|x64.Build.0 = DLL Release - DLL OpenSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|Win32.ActiveCfg = DLL Release - DLL Windows SSPI|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|Win32.Build.0 = DLL Release - DLL Windows SSPI|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|x64.ActiveCfg = DLL Release - DLL Windows SSPI|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|x64.Build.0 = DLL Release - DLL Windows SSPI|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|Win32.ActiveCfg = DLL Release|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|Win32.Build.0 = DLL Release|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|x64.ActiveCfg = DLL Release|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|x64.Build.0 = DLL Release|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|Win32.ActiveCfg = LIB Debug - DLL OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|Win32.Build.0 = LIB Debug - DLL OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|x64.ActiveCfg = LIB Debug - DLL OpenSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|x64.Build.0 = LIB Debug - DLL OpenSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|Win32.Build.0 = LIB Debug - DLL Windows SSPI|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|x64.ActiveCfg = LIB Debug - DLL Windows SSPI|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|x64.Build.0 = LIB Debug - DLL Windows SSPI|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|Win32.ActiveCfg = LIB Debug - LIB OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|Win32.Build.0 = LIB Debug - LIB OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|x64.ActiveCfg = LIB Debug - LIB OpenSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|x64.Build.0 = LIB Debug - LIB OpenSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|Win32.ActiveCfg = LIB Debug|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|Win32.Build.0 = LIB Debug|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|x64.ActiveCfg = LIB Debug|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|x64.Build.0 = LIB Debug|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|Win32.ActiveCfg = LIB Release - DLL OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|Win32.Build.0 = LIB Release - DLL OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|x64.ActiveCfg = LIB Release - DLL OpenSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|x64.Build.0 = LIB Release - DLL OpenSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|Win32.ActiveCfg = LIB Release - DLL Windows SSPI|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|Win32.Build.0 = LIB Release - DLL Windows SSPI|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|x64.ActiveCfg = LIB Release - DLL Windows SSPI|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|x64.Build.0 = LIB Release - DLL Windows SSPI|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|Win32.ActiveCfg = LIB Release - LIB OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|Win32.Build.0 = LIB Release - LIB OpenSSL|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|x64.ActiveCfg = LIB Release - LIB OpenSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|x64.Build.0 = LIB Release - LIB OpenSSL|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|Win32.ActiveCfg = LIB Release|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|Win32.Build.0 = LIB Release|Win32\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|x64.ActiveCfg = LIB Release|x64\r
+               {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|x64.Build.0 = LIB Release|x64\r
+       EndGlobalSection\r
+       GlobalSection(SolutionProperties) = preSolution\r
+               HideSolutionNode = FALSE\r
+       EndGlobalSection\r
+EndGlobal\r
index 720f7c0..f885f64 100644 (file)
                        Name="Source Files"\r
                        >\r
                        <File\r
+                               RelativePath="..\..\..\..\lib\altsvc.c"\r
+                       >\r
+                       </File>\r
+                       <File\r
                                RelativePath="..\..\..\..\lib\amigaos.c"\r
                        >\r
                        </File>\r
                        >\r
                        </File>\r
                        <File\r
+                               RelativePath="..\..\..\..\lib\curl_get_line.c"\r
+                       >\r
+                       </File>\r
+                       <File\r
                                RelativePath="..\..\..\..\lib\curl_gssapi.c"\r
                        >\r
                        </File>\r
                        >\r
                        </File>\r
                        <File\r
-                               RelativePath="..\..\..\..\lib\pipeline.c"\r
-                       >\r
-                       </File>\r
-                       <File\r
                                RelativePath="..\..\..\..\lib\pop3.c"\r
                        >\r
                        </File>\r
                        >\r
                        </File>\r
                        <File\r
+                               RelativePath="..\..\..\..\lib\socketpair.c"\r
+                       >\r
+                       </File>\r
+                       <File\r
                                RelativePath="..\..\..\..\lib\socks.c"\r
                        >\r
                        </File>\r
                        >\r
                        </File>\r
                        <File\r
-                               RelativePath="..\..\..\..\lib\ssh.c"\r
-                       >\r
-                       </File>\r
-                       <File\r
-                               RelativePath="..\..\..\..\lib\ssh-libssh.c"\r
-                       >\r
-                       </File>\r
-                       <File\r
                                RelativePath="..\..\..\..\lib\strcase.c"\r
                        >\r
                        </File>\r
                        Name="Header Files"\r
                        >\r
                        <File\r
+                               RelativePath="..\..\..\..\lib\altsvc.h"\r
+                       >\r
+                       </File>\r
+                       <File\r
                                RelativePath="..\..\..\..\lib\amigaos.h"\r
                        >\r
                        </File>\r
                        >\r
                        </File>\r
                        <File\r
+                               RelativePath="..\..\..\..\lib\curl_get_line.h"\r
+                       >\r
+                       </File>\r
+                       <File\r
                                RelativePath="..\..\..\..\lib\curl_gssapi.h"\r
                        >\r
                        </File>\r
                        >\r
                        </File>\r
                        <File\r
-                               RelativePath="..\..\..\..\lib\pipeline.h"\r
-                       >\r
-                       </File>\r
-                       <File\r
                                RelativePath="..\..\..\..\lib\pop3.h"\r
                        >\r
                        </File>\r
                        >\r
                        </File>\r
                        <File\r
+                               RelativePath="..\..\..\..\lib\quic.h"\r
+                       >\r
+                       </File>\r
+                       <File\r
                                RelativePath="..\..\..\..\lib\rand.h"\r
                        >\r
                        </File>\r
                        >\r
                        </File>\r
                        <File\r
-                               RelativePath="..\..\..\..\lib\socks.h"\r
+                               RelativePath="..\..\..\..\lib\socketpair.h"\r
                        >\r
                        </File>\r
                        <File\r
-                               RelativePath="..\..\..\..\lib\speedcheck.h"\r
+                               RelativePath="..\..\..\..\lib\socks.h"\r
                        >\r
                        </File>\r
                        <File\r
-                               RelativePath="..\..\..\..\lib\splay.h"\r
+                               RelativePath="..\..\..\..\lib\speedcheck.h"\r
                        >\r
                        </File>\r
                        <File\r
-                               RelativePath="..\..\..\..\lib\ssh.h"\r
+                               RelativePath="..\..\..\..\lib\splay.h"\r
                        >\r
                        </File>\r
                        <File\r
                        </Filter>\r
                </Filter>\r
                <Filter\r
-                       Name="vtls"\r
+                       Name="vquic"\r
                        >\r
                        <Filter\r
                                Name="Source Files"\r
                                >\r
                                <File\r
-                                       RelativePath="..\..\..\..\lib\vtls\axtls.c"\r
+                                       RelativePath="..\..\..\..\lib\vquic\ngtcp2.c"\r
                                >\r
                                </File>\r
                                <File\r
-                                       RelativePath="..\..\..\..\lib\vtls\cyassl.c"\r
+                                       RelativePath="..\..\..\..\lib\vquic\quiche.c"\r
                                >\r
                                </File>\r
+                       </Filter>\r
+                       <Filter\r
+                               Name="Header Files"\r
+                               >\r
                                <File\r
-                                       RelativePath="..\..\..\..\lib\vtls\darwinssl.c"\r
+                                       RelativePath="..\..\..\..\lib\vquic\ngtcp2.h"\r
+                               >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\..\lib\vquic\quiche.h"\r
+                               >\r
+                               </File>\r
+                       </Filter>\r
+               </Filter>\r
+               <Filter\r
+                       Name="vssh"\r
+                       >\r
+                       <Filter\r
+                               Name="Source Files"\r
+                               >\r
+                               <File\r
+                                       RelativePath="..\..\..\..\lib\vssh\libssh2.c"\r
+                               >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\..\lib\vssh\libssh.c"\r
+                               >\r
+                               </File>\r
+                       </Filter>\r
+                       <Filter\r
+                               Name="Header Files"\r
+                               >\r
+                               <File\r
+                                       RelativePath="..\..\..\..\lib\vssh\ssh.h"\r
+                               >\r
+                               </File>\r
+                       </Filter>\r
+               </Filter>\r
+               <Filter\r
+                       Name="vtls"\r
+                       >\r
+                       <Filter\r
+                               Name="Source Files"\r
+                               >\r
+                               <File\r
+                                       RelativePath="..\..\..\..\lib\vtls\bearssl.c"\r
                                >\r
                                </File>\r
                                <File\r
                                >\r
                                </File>\r
                                <File\r
-                                       RelativePath="..\..\..\..\lib\vtls\vtls.c"\r
+                                       RelativePath="..\..\..\..\lib\vtls\sectransp.c"\r
                                >\r
                                </File>\r
-                       </Filter>\r
-                       <Filter\r
-                               Name="Header Files"\r
-                               >\r
                                <File\r
-                                       RelativePath="..\..\..\..\lib\vtls\axtls.h"\r
+                                       RelativePath="..\..\..\..\lib\vtls\vtls.c"\r
                                >\r
                                </File>\r
                                <File\r
-                                       RelativePath="..\..\..\..\lib\vtls\cyassl.h"\r
+                                       RelativePath="..\..\..\..\lib\vtls\wolfssl.c"\r
                                >\r
                                </File>\r
+                       </Filter>\r
+                       <Filter\r
+                               Name="Header Files"\r
+                               >\r
                                <File\r
-                                       RelativePath="..\..\..\..\lib\vtls\darwinssl.h"\r
+                                       RelativePath="..\..\..\..\lib\vtls\bearssl.h"\r
                                >\r
                                </File>\r
                                <File\r
                                >\r
                                </File>\r
                                <File\r
+                                       RelativePath="..\..\..\..\lib\vtls\sectransp.h"\r
+                               >\r
+                               </File>\r
+                               <File\r
                                        RelativePath="..\..\..\..\lib\vtls\vtls.h"\r
                                >\r
                                </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\..\lib\vtls\wolfssl.h"\r
+                               >\r
+                               </File>\r
                        </Filter>\r
                </Filter>\r
        </Files>\r
index 0fb0586..7a41e7a 100644 (file)
-Microsoft Visual Studio Solution File, Format Version 10.00
-# Visual Studio 2008
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "curl", "curl.vcproj", "{5228E9CE-A216-422F-A5E6-58E95E2DD71D}"
-EndProject
-Global
-       GlobalSection(SolutionConfigurationPlatforms) = preSolution
-               DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               DLL Debug - DLL OpenSSL - DLL LibSSH2|x64 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
-               DLL Debug - DLL OpenSSL|Win32 = DLL Debug - DLL OpenSSL|Win32
-               DLL Debug - DLL OpenSSL|x64 = DLL Debug - DLL OpenSSL|x64
-               DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               DLL Debug - DLL Windows SSPI - DLL WinIDN|x64 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
-               DLL Debug - DLL Windows SSPI|Win32 = DLL Debug - DLL Windows SSPI|Win32
-               DLL Debug - DLL Windows SSPI|x64 = DLL Debug - DLL Windows SSPI|x64
-               DLL Debug|Win32 = DLL Debug|Win32
-               DLL Debug|x64 = DLL Debug|x64
-               DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
-               DLL Release - DLL OpenSSL - DLL LibSSH2|x64 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
-               DLL Release - DLL OpenSSL|Win32 = DLL Release - DLL OpenSSL|Win32
-               DLL Release - DLL OpenSSL|x64 = DLL Release - DLL OpenSSL|x64
-               DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
-               DLL Release - DLL Windows SSPI - DLL WinIDN|x64 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
-               DLL Release - DLL Windows SSPI|Win32 = DLL Release - DLL Windows SSPI|Win32
-               DLL Release - DLL Windows SSPI|x64 = DLL Release - DLL Windows SSPI|x64
-               DLL Release|Win32 = DLL Release|Win32
-               DLL Release|x64 = DLL Release|x64
-               LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               LIB Debug - DLL OpenSSL - DLL LibSSH2|x64 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
-               LIB Debug - DLL OpenSSL|Win32 = LIB Debug - DLL OpenSSL|Win32
-               LIB Debug - DLL OpenSSL|x64 = LIB Debug - DLL OpenSSL|x64
-               LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               LIB Debug - DLL Windows SSPI - DLL WinIDN|x64 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
-               LIB Debug - DLL Windows SSPI|Win32 = LIB Debug - DLL Windows SSPI|Win32
-               LIB Debug - DLL Windows SSPI|x64 = LIB Debug - DLL Windows SSPI|x64
-               LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
-               LIB Debug - LIB OpenSSL - LIB LibSSH2|x64 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
-               LIB Debug - LIB OpenSSL|Win32 = LIB Debug - LIB OpenSSL|Win32
-               LIB Debug - LIB OpenSSL|x64 = LIB Debug - LIB OpenSSL|x64
-               LIB Debug|Win32 = LIB Debug|Win32
-               LIB Debug|x64 = LIB Debug|x64
-               LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
-               LIB Release - DLL OpenSSL - DLL LibSSH2|x64 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
-               LIB Release - DLL OpenSSL|Win32 = LIB Release - DLL OpenSSL|Win32
-               LIB Release - DLL OpenSSL|x64 = LIB Release - DLL OpenSSL|x64
-               LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
-               LIB Release - DLL Windows SSPI - DLL WinIDN|x64 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
-               LIB Release - DLL Windows SSPI|Win32 = LIB Release - DLL Windows SSPI|Win32
-               LIB Release - DLL Windows SSPI|x64 = LIB Release - DLL Windows SSPI|x64
-               LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
-               LIB Release - LIB OpenSSL - LIB LibSSH2|x64 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
-               LIB Release - LIB OpenSSL|Win32 = LIB Release - LIB OpenSSL|Win32
-               LIB Release - LIB OpenSSL|x64 = LIB Release - LIB OpenSSL|x64
-               LIB Release|Win32 = LIB Release|Win32
-               LIB Release|x64 = LIB Release|x64
-       EndGlobalSection
-       GlobalSection(ProjectConfigurationPlatforms) = postSolution
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|Win32.ActiveCfg = DLL Debug - DLL OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|Win32.Build.0 = DLL Debug - DLL OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|x64.ActiveCfg = DLL Debug - DLL OpenSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|x64.Build.0 = DLL Debug - DLL OpenSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|Win32.Build.0 = DLL Debug - DLL Windows SSPI|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|x64.ActiveCfg = DLL Debug - DLL Windows SSPI|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|x64.Build.0 = DLL Debug - DLL Windows SSPI|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|Win32.Build.0 = DLL Debug|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|x64.ActiveCfg = DLL Debug|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|x64.Build.0 = DLL Debug|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|Win32.ActiveCfg = DLL Release - DLL OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|Win32.Build.0 = DLL Release - DLL OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|x64.ActiveCfg = DLL Release - DLL OpenSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|x64.Build.0 = DLL Release - DLL OpenSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|Win32.ActiveCfg = DLL Release - DLL Windows SSPI|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|Win32.Build.0 = DLL Release - DLL Windows SSPI|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|x64.ActiveCfg = DLL Release - DLL Windows SSPI|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|x64.Build.0 = DLL Release - DLL Windows SSPI|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|Win32.ActiveCfg = DLL Release|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|Win32.Build.0 = DLL Release|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|x64.ActiveCfg = DLL Release|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|x64.Build.0 = DLL Release|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|Win32.ActiveCfg = LIB Debug - DLL OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|Win32.Build.0 = LIB Debug - DLL OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|x64.ActiveCfg = LIB Debug - DLL OpenSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|x64.Build.0 = LIB Debug - DLL OpenSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|Win32.Build.0 = LIB Debug - DLL Windows SSPI|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|x64.ActiveCfg = LIB Debug - DLL Windows SSPI|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|x64.Build.0 = LIB Debug - DLL Windows SSPI|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|Win32.ActiveCfg = LIB Debug - LIB OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|Win32.Build.0 = LIB Debug - LIB OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|x64.ActiveCfg = LIB Debug - LIB OpenSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|x64.Build.0 = LIB Debug - LIB OpenSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|Win32.ActiveCfg = LIB Debug|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|Win32.Build.0 = LIB Debug|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|x64.ActiveCfg = LIB Debug|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|x64.Build.0 = LIB Debug|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|Win32.ActiveCfg = LIB Release - DLL OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|Win32.Build.0 = LIB Release - DLL OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|x64.ActiveCfg = LIB Release - DLL OpenSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|x64.Build.0 = LIB Release - DLL OpenSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|Win32.ActiveCfg = LIB Release - DLL Windows SSPI|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|Win32.Build.0 = LIB Release - DLL Windows SSPI|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|x64.ActiveCfg = LIB Release - DLL Windows SSPI|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|x64.Build.0 = LIB Release - DLL Windows SSPI|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|Win32.ActiveCfg = LIB Release - LIB OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|Win32.Build.0 = LIB Release - LIB OpenSSL|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|x64.ActiveCfg = LIB Release - LIB OpenSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|x64.Build.0 = LIB Release - LIB OpenSSL|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|Win32.ActiveCfg = LIB Release|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|Win32.Build.0 = LIB Release|Win32
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|x64.ActiveCfg = LIB Release|x64
-               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|x64.Build.0 = LIB Release|x64
-       EndGlobalSection
-       GlobalSection(SolutionProperties) = preSolution
-               HideSolutionNode = FALSE
-       EndGlobalSection
-EndGlobal
+Microsoft Visual Studio Solution File, Format Version 10.00\r
+# Visual Studio 2008\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "curl", "curl.vcproj", "{5228E9CE-A216-422F-A5E6-58E95E2DD71D}"\r
+EndProject\r
+Global\r
+       GlobalSection(SolutionConfigurationPlatforms) = preSolution\r
+               DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               DLL Debug - DLL OpenSSL - DLL LibSSH2|x64 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64\r
+               DLL Debug - DLL OpenSSL|Win32 = DLL Debug - DLL OpenSSL|Win32\r
+               DLL Debug - DLL OpenSSL|x64 = DLL Debug - DLL OpenSSL|x64\r
+               DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               DLL Debug - DLL Windows SSPI - DLL WinIDN|x64 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64\r
+               DLL Debug - DLL Windows SSPI|Win32 = DLL Debug - DLL Windows SSPI|Win32\r
+               DLL Debug - DLL Windows SSPI|x64 = DLL Debug - DLL Windows SSPI|x64\r
+               DLL Debug|Win32 = DLL Debug|Win32\r
+               DLL Debug|x64 = DLL Debug|x64\r
+               DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               DLL Release - DLL OpenSSL - DLL LibSSH2|x64 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64\r
+               DLL Release - DLL OpenSSL|Win32 = DLL Release - DLL OpenSSL|Win32\r
+               DLL Release - DLL OpenSSL|x64 = DLL Release - DLL OpenSSL|x64\r
+               DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               DLL Release - DLL Windows SSPI - DLL WinIDN|x64 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64\r
+               DLL Release - DLL Windows SSPI|Win32 = DLL Release - DLL Windows SSPI|Win32\r
+               DLL Release - DLL Windows SSPI|x64 = DLL Release - DLL Windows SSPI|x64\r
+               DLL Release|Win32 = DLL Release|Win32\r
+               DLL Release|x64 = DLL Release|x64\r
+               LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               LIB Debug - DLL OpenSSL - DLL LibSSH2|x64 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64\r
+               LIB Debug - DLL OpenSSL|Win32 = LIB Debug - DLL OpenSSL|Win32\r
+               LIB Debug - DLL OpenSSL|x64 = LIB Debug - DLL OpenSSL|x64\r
+               LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               LIB Debug - DLL Windows SSPI - DLL WinIDN|x64 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64\r
+               LIB Debug - DLL Windows SSPI|Win32 = LIB Debug - DLL Windows SSPI|Win32\r
+               LIB Debug - DLL Windows SSPI|x64 = LIB Debug - DLL Windows SSPI|x64\r
+               LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32\r
+               LIB Debug - LIB OpenSSL - LIB LibSSH2|x64 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64\r
+               LIB Debug - LIB OpenSSL|Win32 = LIB Debug - LIB OpenSSL|Win32\r
+               LIB Debug - LIB OpenSSL|x64 = LIB Debug - LIB OpenSSL|x64\r
+               LIB Debug|Win32 = LIB Debug|Win32\r
+               LIB Debug|x64 = LIB Debug|x64\r
+               LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               LIB Release - DLL OpenSSL - DLL LibSSH2|x64 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64\r
+               LIB Release - DLL OpenSSL|Win32 = LIB Release - DLL OpenSSL|Win32\r
+               LIB Release - DLL OpenSSL|x64 = LIB Release - DLL OpenSSL|x64\r
+               LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               LIB Release - DLL Windows SSPI - DLL WinIDN|x64 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64\r
+               LIB Release - DLL Windows SSPI|Win32 = LIB Release - DLL Windows SSPI|Win32\r
+               LIB Release - DLL Windows SSPI|x64 = LIB Release - DLL Windows SSPI|x64\r
+               LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32\r
+               LIB Release - LIB OpenSSL - LIB LibSSH2|x64 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64\r
+               LIB Release - LIB OpenSSL|Win32 = LIB Release - LIB OpenSSL|Win32\r
+               LIB Release - LIB OpenSSL|x64 = LIB Release - LIB OpenSSL|x64\r
+               LIB Release|Win32 = LIB Release|Win32\r
+               LIB Release|x64 = LIB Release|x64\r
+       EndGlobalSection\r
+       GlobalSection(ProjectConfigurationPlatforms) = postSolution\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|Win32.ActiveCfg = DLL Debug - DLL OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|Win32.Build.0 = DLL Debug - DLL OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|x64.ActiveCfg = DLL Debug - DLL OpenSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|x64.Build.0 = DLL Debug - DLL OpenSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|Win32.Build.0 = DLL Debug - DLL Windows SSPI|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|x64.ActiveCfg = DLL Debug - DLL Windows SSPI|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|x64.Build.0 = DLL Debug - DLL Windows SSPI|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|Win32.Build.0 = DLL Debug|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|x64.ActiveCfg = DLL Debug|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|x64.Build.0 = DLL Debug|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|Win32.ActiveCfg = DLL Release - DLL OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|Win32.Build.0 = DLL Release - DLL OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|x64.ActiveCfg = DLL Release - DLL OpenSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|x64.Build.0 = DLL Release - DLL OpenSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|Win32.ActiveCfg = DLL Release - DLL Windows SSPI|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|Win32.Build.0 = DLL Release - DLL Windows SSPI|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|x64.ActiveCfg = DLL Release - DLL Windows SSPI|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|x64.Build.0 = DLL Release - DLL Windows SSPI|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|Win32.ActiveCfg = DLL Release|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|Win32.Build.0 = DLL Release|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|x64.ActiveCfg = DLL Release|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|x64.Build.0 = DLL Release|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|Win32.ActiveCfg = LIB Debug - DLL OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|Win32.Build.0 = LIB Debug - DLL OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|x64.ActiveCfg = LIB Debug - DLL OpenSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|x64.Build.0 = LIB Debug - DLL OpenSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|Win32.Build.0 = LIB Debug - DLL Windows SSPI|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|x64.ActiveCfg = LIB Debug - DLL Windows SSPI|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|x64.Build.0 = LIB Debug - DLL Windows SSPI|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|Win32.ActiveCfg = LIB Debug - LIB OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|Win32.Build.0 = LIB Debug - LIB OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|x64.ActiveCfg = LIB Debug - LIB OpenSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|x64.Build.0 = LIB Debug - LIB OpenSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|Win32.ActiveCfg = LIB Debug|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|Win32.Build.0 = LIB Debug|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|x64.ActiveCfg = LIB Debug|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|x64.Build.0 = LIB Debug|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|Win32.ActiveCfg = LIB Release - DLL OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|Win32.Build.0 = LIB Release - DLL OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|x64.ActiveCfg = LIB Release - DLL OpenSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|x64.Build.0 = LIB Release - DLL OpenSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|Win32.ActiveCfg = LIB Release - DLL Windows SSPI|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|Win32.Build.0 = LIB Release - DLL Windows SSPI|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|x64.ActiveCfg = LIB Release - DLL Windows SSPI|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|x64.Build.0 = LIB Release - DLL Windows SSPI|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|Win32.ActiveCfg = LIB Release - LIB OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|Win32.Build.0 = LIB Release - LIB OpenSSL|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|x64.ActiveCfg = LIB Release - LIB OpenSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|x64.Build.0 = LIB Release - LIB OpenSSL|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|Win32.ActiveCfg = LIB Release|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|Win32.Build.0 = LIB Release|Win32\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|x64.ActiveCfg = LIB Release|x64\r
+               {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|x64.Build.0 = LIB Release|x64\r
+       EndGlobalSection\r
+       GlobalSection(SolutionProperties) = preSolution\r
+               HideSolutionNode = FALSE\r
+       EndGlobalSection\r
+EndGlobal\r
index 1d0ae65..6e702f4 100644 (file)
                        >\r
                        </File>\r
                        <File\r
+                               RelativePath="..\..\..\..\src\tool_progress.c"\r
+                       >\r
+                       </File>\r
+                       <File\r
                                RelativePath="..\..\..\..\src\tool_setopt.c"\r
                        >\r
                        </File>\r
                        >\r
                        </File>\r
                        <File\r
+                               RelativePath="..\..\..\..\src\tool_progress.h"\r
+                       >\r
+                       </File>\r
+                       <File\r
                                RelativePath="..\..\..\..\src\tool_sdecls.h"\r
                        >\r
                        </File>\r
index 96fccf8..c9633b4 100644 (file)
@@ -6,7 +6,7 @@ rem *                             / __| | | | |_) | |
 rem *                            | (__| |_| |  _ <| |___
 rem *                             \___|\___/|_| \_\_____|
 rem *
-rem * Copyright (C) 2012 - 2018, Steve Holme, <steve_holme@hotmail.com>.
+rem * Copyright (C) 2012 - 2019, Steve Holme, <steve_holme@hotmail.com>.
 rem *
 rem * This software is licensed as described in the file COPYING, which
 rem * you should have received as part of this distribution. The terms
@@ -26,9 +26,10 @@ rem ***************************************************************************
   if not "%OS%" == "Windows_NT" goto nodos
 
   rem Set our variables
-  setlocal
+  setlocal ENABLEDELAYEDEXPANSION
   set VC_VER=
   set BUILD_PLATFORM=
+  set BUILD_CONFIG=
 
   rem Ensure we have the required arguments
   if /i "%~1" == "" goto syntax
@@ -44,98 +45,111 @@ rem ***************************************************************************
   )
 
 :parseArgs
-  if "%~1" == "" goto prerequisites
-
-  if /i "%~1" == "vc6" (
-    set VC_VER=6.0
-    set VC_DESC=VC6
-    set "VC_PATH=Microsoft Visual Studio\VC98"
-  ) else if /i "%~1" == "vc7" (
-    set VC_VER=7.0
-    set VC_DESC=VC7
-    set "VC_PATH=Microsoft Visual Studio .NET\Vc7"
-  ) else if /i "%~1" == "vc7.1" (
-    set VC_VER=7.1
-    set VC_DESC=VC7.1
-    set "VC_PATH=Microsoft Visual Studio .NET 2003\Vc7"
-  ) else if /i "%~1" == "vc8" (
-    set VC_VER=8.0
-    set VC_DESC=VC8
-    set "VC_PATH=Microsoft Visual Studio 8\VC"
-  ) else if /i "%~1" == "vc9" (
-    set VC_VER=9.0
-    set VC_DESC=VC9
-    set "VC_PATH=Microsoft Visual Studio 9.0\VC"
-  ) else if /i "%~1" == "vc10" (
-    set VC_VER=10.0
-    set VC_DESC=VC10
-    set "VC_PATH=Microsoft Visual Studio 10.0\VC"
-  ) else if /i "%~1" == "vc11" (
-    set VC_VER=11.0
-    set VC_DESC=VC11
-    set "VC_PATH=Microsoft Visual Studio 11.0\VC"
-  ) else if /i "%~1" == "vc12" (
-    set VC_VER=12.0
-    set VC_DESC=VC12
-    set "VC_PATH=Microsoft Visual Studio 12.0\VC"
-  ) else if /i "%~1" == "vc14" (
-    set VC_VER=14.0
-    set VC_DESC=VC14
-    set "VC_PATH=Microsoft Visual Studio 14.0\VC"
-  ) else if /i "%~1" == "vc14.1" (
-    set VC_VER=14.1
-    set VC_DESC=VC14.1
-
-    rem Determine the VC14.1 path based on the installed edition in descending
-    rem order (Enterprise, then Professional and finally Community)
-    if exist "%PF%\Microsoft Visual Studio\2017\Enterprise\VC" (
-      set "VC_PATH=Microsoft Visual Studio\2017\Enterprise\VC"
-    ) else if exist "%PF%\Microsoft Visual Studio\2017\Professional\VC" (
-      set "VC_PATH=Microsoft Visual Studio\2017\Professional\VC"
-    ) else (
-      set "VC_PATH=Microsoft Visual Studio\2017\Community\VC"
-    )
-  ) else if /i "%~1%" == "x86" (
-    set BUILD_PLATFORM=x86
-  ) else if /i "%~1%" == "x64" (
-    set BUILD_PLATFORM=x64
-  ) else if /i "%~1%" == "debug" (
-    set BUILD_CONFIG=debug
-  ) else if /i "%~1%" == "release" (
-    set BUILD_CONFIG=release
-  ) else if /i "%~1" == "-?" (
-    goto syntax
-  ) else if /i "%~1" == "-h" (
-    goto syntax
-  ) else if /i "%~1" == "-help" (
-    goto syntax
-  ) else if /i "%~1" == "-VSpath" (
-    if "%~2" == "" (
-      echo.
-      echo Error. Please provide VS Path.
-      goto error
-    ) else (
-      set "ABS_VC_PATH=%~2\VC"
-      shift
-    )
-  ) else if /i "%~1" == "-perlpath" (
-    if "%~2" == "" (
-      echo.
-      echo Error. Please provide Perl root Path.
-      goto error
-    ) else (
-      set "PERL_PATH=%~2"
-      shift
-    )
-  ) else (
-    if not defined START_DIR (
-      set START_DIR=%~1%
+  if not "%~1" == "" (
+    if /i "%~1" == "vc6" (
+      set VC_VER=6.0
+      set VC_DESC=VC6
+      set "VC_PATH=Microsoft Visual Studio\VC98"
+    ) else if /i "%~1" == "vc7" (
+      set VC_VER=7.0
+      set VC_DESC=VC7
+      set "VC_PATH=Microsoft Visual Studio .NET\Vc7"
+    ) else if /i "%~1" == "vc7.1" (
+      set VC_VER=7.1
+      set VC_DESC=VC7.1
+      set "VC_PATH=Microsoft Visual Studio .NET 2003\Vc7"
+    ) else if /i "%~1" == "vc8" (
+      set VC_VER=8.0
+      set VC_DESC=VC8
+      set "VC_PATH=Microsoft Visual Studio 8\VC"
+    ) else if /i "%~1" == "vc9" (
+      set VC_VER=9.0
+      set VC_DESC=VC9
+      set "VC_PATH=Microsoft Visual Studio 9.0\VC"
+    ) else if /i "%~1" == "vc10" (
+      set VC_VER=10.0
+      set VC_DESC=VC10
+      set "VC_PATH=Microsoft Visual Studio 10.0\VC"
+    ) else if /i "%~1" == "vc11" (
+      set VC_VER=11.0
+      set VC_DESC=VC11
+      set "VC_PATH=Microsoft Visual Studio 11.0\VC"
+    ) else if /i "%~1" == "vc12" (
+      set VC_VER=12.0
+      set VC_DESC=VC12
+      set "VC_PATH=Microsoft Visual Studio 12.0\VC"
+    ) else if /i "%~1" == "vc14" (
+      set VC_VER=14.0
+      set VC_DESC=VC14
+      set "VC_PATH=Microsoft Visual Studio 14.0\VC"
+    ) else if /i "%~1" == "vc14.1" (
+      set VC_VER=14.1
+      set VC_DESC=VC14.1
+
+      rem Determine the VC14.1 path based on the installed edition in descending
+      rem order (Enterprise, then Professional and finally Community)
+      if exist "%PF%\Microsoft Visual Studio\2017\Enterprise\VC" (
+        set "VC_PATH=Microsoft Visual Studio\2017\Enterprise\VC"
+      ) else if exist "%PF%\Microsoft Visual Studio\2017\Professional\VC" (
+        set "VC_PATH=Microsoft Visual Studio\2017\Professional\VC"
+      ) else (
+        set "VC_PATH=Microsoft Visual Studio\2017\Community\VC"
+      )
+    ) else if /i "%~1" == "vc14.2" (
+      set VC_VER=14.2
+      set VC_DESC=VC14.2
+
+      rem Determine the VC14.2 path based on the installed edition in descending
+      rem order (Enterprise, then Professional and finally Community)
+      if exist "%PF%\Microsoft Visual Studio\2019\Enterprise\VC" (
+        set "VC_PATH=Microsoft Visual Studio\2019\Enterprise\VC"
+      ) else if exist "%PF%\Microsoft Visual Studio\2019\Professional\VC" (
+        set "VC_PATH=Microsoft Visual Studio\2019\Professional\VC"
+      ) else (
+        set "VC_PATH=Microsoft Visual Studio\2019\Community\VC"
+      )
+    ) else if /i "%~1%" == "x86" (
+      set BUILD_PLATFORM=x86
+    ) else if /i "%~1%" == "x64" (
+      set BUILD_PLATFORM=x64
+    ) else if /i "%~1%" == "debug" (
+      set BUILD_CONFIG=debug
+    ) else if /i "%~1%" == "release" (
+      set BUILD_CONFIG=release
+    ) else if /i "%~1" == "-?" (
+      goto syntax
+    ) else if /i "%~1" == "-h" (
+      goto syntax
+    ) else if /i "%~1" == "-help" (
+      goto syntax
+    ) else if /i "%~1" == "-VSpath" (
+      if "%~2" == "" (
+        echo.
+        echo Error. Please provide VS Path.
+        goto error
+      ) else (
+        set "ABS_VC_PATH=%~2\VC"
+        shift
+      )
+    ) else if /i "%~1" == "-perlpath" (
+      if "%~2" == "" (
+        echo.
+        echo Error. Please provide Perl root Path.
+        goto error
+      ) else (
+        set "PERL_PATH=%~2"
+        shift
+      )
     ) else (
-      goto unknown
+      if not defined START_DIR (
+        set START_DIR=%~1%
+      ) else (
+        goto unknown
+      )
     )
-  )
 
-  shift & goto parseArgs
+    shift & goto parseArgs
+  )
 
 :prerequisites
   rem Compiler is a required parameter
@@ -175,10 +189,7 @@ rem ***************************************************************************
   rem Check the start directory exists
   if not exist "%START_DIR%" goto noopenssl
 
-  rem Check that OpenSSL is not unsupported version 1.1.0
-  if not exist "%START_DIR%\ms\do_ms.bat" goto unsupported
-
-:configure
+:setup
   if "%BUILD_PLATFORM%" == "" (
     if "%VC_VER%" == "6.0" (
       set BUILD_PLATFORM=x86
@@ -204,6 +215,13 @@ rem ***************************************************************************
     if "%VC_VER%" == "12.0" set VCVARS_PLATFORM=amd64
     if "%VC_VER%" == "14.0" set VCVARS_PLATFORM=amd64
     if "%VC_VER%" == "14.1" set VCVARS_PLATFORM=amd64
+    if "%VC_VER%" == "14.2" set VCVARS_PLATFORM=amd64
+  )
+
+  if exist "%START_DIR%\ms\do_ms.bat" (
+    set LEGACY_BUILD=TRUE
+  ) else (
+    set LEGACY_BUILD=FALSE
   )
 
 :start
@@ -218,6 +236,8 @@ rem ***************************************************************************
     call "%ABS_VC_PATH%\bin\vcvars32"
   ) else if "%VC_VER%" == "14.1" (
     call "%ABS_VC_PATH%\Auxiliary\Build\vcvarsall" %VCVARS_PLATFORM%
+  ) else if "%VC_VER%" == "14.2" (
+    call "%ABS_VC_PATH%\Auxiliary\Build\vcvarsall" %VCVARS_PLATFORM%
   ) else (
     call "%ABS_VC_PATH%\vcvarsall" %VCVARS_PLATFORM%
   )
@@ -232,71 +252,45 @@ rem ***************************************************************************
   set OUTDIR=build\Win64\%VC_DESC%
   if not exist %OUTDIR% md %OUTDIR%
 
-  if "%BUILD_CONFIG%" == "release" goto x64release
+  if not "%BUILD_CONFIG%" == "release" (
+    rem Configuring 64-bit Static Library Debug Build
+    call :configure x64 debug static %LEGACY_BUILD%
 
-:x64debug
-  rem Configuring 64-bit Debug Build
-  perl Configure debug-VC-WIN64A --prefix=%CD%
+    rem Perform the build
+    call :build x64 static %LEGACY_BUILD%
 
-  rem Perform the build
-  call ms\do_win64a
-  nmake -f ms\nt.mak
-  nmake -f ms\ntdll.mak
+    rem Perform the install
+    call :install debug static %LEGACY_BUILD%
 
-  rem Move the output directories
-  if exist "%OUTDIR%\LIB Debug" (
-    copy /y out32.dbg\* "%OUTDIR%\LIB Debug" 1>nul
-    rd out32.dbg /s /q
-  ) else (
-    move out32.dbg "%OUTDIR%\LIB Debug" 1>nul
-  )
-  if exist "%OUTDIR%\DLL Debug" (
-    copy /y out32dll.dbg\* "%OUTDIR%\DLL Debug" 1>nul
-    rd out32dll.dbg /s /q
-  ) else (
-    move out32dll.dbg "%OUTDIR%\DLL Debug" 1>nul
-  )
+    rem Configuring 64-bit Shared Library Debug Build
+    call :configure x64 debug shared %LEGACY_BUILD%
 
-  rem Move the PDB files
-  move tmp32.dbg\lib.pdb "%OUTDIR%\LIB Debug" 1>nul
-  move tmp32dll.dbg\lib.pdb "%OUTDIR%\DLL Debug" 1>nul
+    rem Perform the build
+    call :build x64 shared %LEGACY_BUILD%
 
-  rem Remove the intermediate directories
-  rd tmp32.dbg /s /q
-  rd tmp32dll.dbg /s /q
+    rem Perform the install
+    call :install debug shared %LEGACY_BUILD%
+  )
 
-  if "%BUILD_CONFIG%" == "debug" goto success
+  if not "%BUILD_CONFIG%" == "debug" (
+    rem Configuring 64-bit Static Library Release Build
+    call :configure x64 release static %LEGACY_BUILD%
 
-:x64release
-  rem Configuring 64-bit Release Build
-  perl Configure VC-WIN64A --prefix=%CD%
+    rem Perform the build
+    call :build x64 static %LEGACY_BUILD%
 
-  rem Perform the build
-  call ms\do_win64a
-  nmake -f ms\nt.mak
-  nmake -f ms\ntdll.mak
+    rem Perform the install
+    call :install release static %LEGACY_BUILD%
 
-  rem Move the output directories
-  if exist "%OUTDIR%\LIB Release" (
-    copy /y out32\* "%OUTDIR%\LIB Release" 1>nul
-    rd out32 /s /q
-  ) else (
-    move out32 "%OUTDIR%\LIB Release" 1>nul
-  )
-  if exist "%OUTDIR%\DLL Release" (
-    copy /y out32dll\* "%OUTDIR%\DLL Release" 1>nul
-    rd out32dll /s /q
-  ) else (
-    move out32dll "%OUTDIR%\DLL Release" 1>nul
-  )
+    rem Configuring 64-bit Shared Library Release Build
+    call :configure x64 release shared %LEGACY_BUILD%
 
-  rem Move the PDB files
-  move tmp32\lib.pdb "%OUTDIR%\LIB Release" 1>nul
-  move tmp32dll\lib.pdb "%OUTDIR%\DLL Release" 1>nul
+    rem Perform the build
+    call :build x64 shared %LEGACY_BUILD%
 
-  rem Remove the intermediate directories
-  rd tmp32 /s /q
-  rd tmp32dll /s /q
+    rem Perform the install
+    call :install release shared %LEGACY_BUILD%
+  )
 
   goto success
 
@@ -305,73 +299,310 @@ rem ***************************************************************************
   set OUTDIR=build\Win32\%VC_DESC%
   if not exist %OUTDIR% md %OUTDIR%
 
-  if "%BUILD_CONFIG%" == "release" goto x86release
+  if not "%BUILD_CONFIG%" == "release" (
+    rem Configuring 32-bit Static Library Debug Build
+    call :configure x86 debug static %LEGACY_BUILD%
 
-:x86debug
-  rem Configuring 32-bit Debug Build
-  perl Configure debug-VC-WIN32 no-asm --prefix=%CD%
+    rem Perform the build
+    call :build x86 static %LEGACY_BUILD%
 
-  rem Perform the build
-  call ms\do_ms
-  nmake -f ms\nt.mak
-  nmake -f ms\ntdll.mak
+    rem Perform the install
+    call :install debug static %LEGACY_BUILD%
 
-  rem Move the output directories
-  if exist "%OUTDIR%\LIB Debug" (
-    copy /y out32.dbg\* "%OUTDIR%\LIB Debug" 1>nul
-    rd out32.dbg /s /q
-  ) else (
-    move out32.dbg "%OUTDIR%\LIB Debug" 1>nul
+    rem Configuring 32-bit Shared Library Debug Build
+    call :configure x86 debug shared %LEGACY_BUILD%
+
+    rem Perform the build
+    call :build x86 shared %LEGACY_BUILD%
+
+    rem Perform the install
+    call :install debug shared %LEGACY_BUILD%
   )
-  if exist "%OUTDIR%\DLL Debug" (
-    copy /y out32dll.dbg\* "%OUTDIR%\DLL Debug" 1>nul
-    rd out32dll.dbg /s /q
-  ) else (
-    move out32dll.dbg "%OUTDIR%\DLL Debug" 1>nul
+
+  if not "%BUILD_CONFIG%" == "debug" (
+    rem Configuring 32-bit Static Library Release Build
+    call :configure x86 release static %LEGACY_BUILD%
+
+    rem Perform the build
+    call :build x86 static %LEGACY_BUILD%
+
+    rem Perform the install
+    call :install release static %LEGACY_BUILD%
+
+    rem Configuring 32-bit Shared Library Release Build
+    call :configure x86 release shared %LEGACY_BUILD%
+
+    rem Perform the build
+    call :build x86 shared %LEGACY_BUILD%
+
+    rem Perform the install
+    call :install release shared %LEGACY_BUILD%
   )
 
-  rem Move the PDB files
-  move tmp32.dbg\lib.pdb "%OUTDIR%\LIB Debug" 1>nul
-  move tmp32dll.dbg\lib.pdb "%OUTDIR%\DLL Debug" 1>nul
+  goto success
 
-  rem Remove the intermediate directories
-  rd tmp32.dbg /s /q
-  rd tmp32dll.dbg /s /q
+rem Function to configure the build.
+rem
+rem %1 - Platform (x86 or x64)
+rem %2 - Configuration (release or debug)
+rem %3 - Build Type (static or shared)
+rem %4 - Build type (TRUE for legacy aka pre v1.1.0; otherwise FALSE)
+rem
+:configure
+  setlocal
 
-  if "%BUILD_CONFIG%" == "debug" goto success
+  if "%1" == "" exit /B 1
+  if "%2" == "" exit /B 1
+  if "%3" == "" exit /B 1
+  if "%4" == "" exit /B 1
+
+  if "%4" == "TRUE" (
+    rem Calculate the build directory
+    set build_dir=%cd%
+
+    rem Calculate the configure options
+    if "%1" == "x86" (
+      if "%2" == "debug" (
+        set options=debug-VC-WIN32
+      ) else if "%2" == "release" (
+        set options=VC-WIN32
+      ) else (
+        exit /B 1
+      )
 
-:x86release
-  rem Configuring 32-bit Release Build
-  perl Configure VC-WIN32 no-asm --prefix=%CD%
+      set options=!options! no-asm
+    ) else if "%1" == "x64" (
+      if "%2" == "debug" (
+        set options=debug-VC-WIN64A
+      ) else if "%2" == "release" (
+        set options=VC-WIN64A
+      ) else (
+        exit /B 1
+      )
+    ) else (
+      exit /B 1
+    )
+  ) else if "%4" == "FALSE" (
+    rem Has configure already been ran?
+    if exist makefile (
+      rem Clean up the previous build
+      nmake clean
+
+      rem Remove the old makefile
+      del makefile 1>nul
+    )
 
-  rem Perform the build
-  call ms\do_ms
-  nmake -f ms\nt.mak
-  nmake -f ms\ntdll.mak
+    rem Calculate the build directory
+    set build_dir=%cd%\build\tmp
 
-  rem Move the output directories
-  if exist "%OUTDIR%\LIB Release" (
-    copy /y out32\* "%OUTDIR%\LIB Release" 1>nul
-    rd out32 /s /q
+    rem Calculate the configure options
+    if "%1" == "x86" (
+      set options=VC-WIN32
+    ) else if "%1" == "x64" (
+      set options=VC-WIN64A
+    ) else (
+      exit /B 1
+    )
+
+    if "%2" == "debug" (
+      set options=!options! --debug
+    ) else if "%2" == "release" (
+      set options=!options! --release
+    ) else (
+      exit /B 1
+    )
+
+    if "%3" == "static" (
+      set options=!options! no-shared
+    ) else if not "%3" == "shared" (
+      exit /B 1
+    )
+
+    set options=!options! no-asm
   ) else (
-    move out32 "%OUTDIR%\LIB Release" 1>nul
+    exit /B 1
   )
-  if exist "%OUTDIR%\DLL Release" (
-    copy /y out32dll\* "%OUTDIR%\DLL Release" 1>nul
-    rd out32dll /s /q
+
+  set options=%options% --prefix=%build_dir%
+
+  rem Run the configure
+  perl Configure %options%
+
+  exit /B %ERRORLEVEL
+
+rem Main build function.
+rem
+rem %1 - Platform (x86 or x64)
+rem %2 - Build Type (static or shared)
+rem %3 - Build type (TRUE for legacy aka pre v1.1.0; otherwise FALSE)
+rem
+:build
+  setlocal
+
+  if "%1" == "" exit /B 1
+  if "%2" == "" exit /B 1
+  if "%3" == "" exit /B 1
+
+  if "%3" == "TRUE" (
+    if "%1" == "x86" (
+      call ms\do_ms.bat
+    ) else if "%1" == "x64" (
+      call ms\do_win64a.bat
+    ) else (
+      exit /B 1
+    )
+
+    if "%2" == "static" (
+      nmake -f ms\nt.mak
+    ) else if "%2" == "shared" (
+      nmake -f ms\ntdll.mak
+    ) else (
+      exit /B 1
+    )
+  ) else if "%2" == "FALSE" (
+    nmake
   ) else (
-    move out32dll "%OUTDIR%\DLL Release" 1>nul
+    exit /B 1
   )
 
-  rem Move the PDB files
-  move tmp32\lib.pdb "%OUTDIR%\LIB Release" 1>nul
-  move tmp32dll\lib.pdb "%OUTDIR%\DLL Release" 1>nul
+  exit /B 0
 
-  rem Remove the intermediate directories
-  rd tmp32 /s /q
-  rd tmp32dll /s /q
+rem Main installation function.
+rem
+rem %1 - Configuration (release or debug)
+rem %2 - Build Type (static or shared)
+rem %3 - Build type (TRUE for legacy aka pre v1.1.0; otherwise FALSE)
+rem
+:install
+  setlocal
 
-  goto success
+  if "%1" == "" exit /B 1
+  if "%2" == "" exit /B 1
+  if "%3" == "" exit /B 1
+
+  rem Copy the generated files to our directory structure
+  if "%3" == "TRUE" (
+    if "%1" == "debug" (
+      if "%2" == "static" (
+        rem Move the output directories
+        if exist "%OUTDIR%\LIB Debug" (
+          copy /y out32.dbg\* "%OUTDIR%\LIB Debug" 1>nul
+          rd out32.dbg /s /q
+        ) else (
+          move out32.dbg "%OUTDIR%\LIB Debug" 1>nul
+        )
+
+        rem Move the PDB files
+        move tmp32.dbg\lib.pdb "%OUTDIR%\LIB Debug" 1>nul
+
+        rem Remove the intermediate directories
+        rd tmp32.dbg /s /q
+      ) else if "%2" == "shared" (
+        if exist "%OUTDIR%\DLL Debug" (
+          copy /y out32dll.dbg\* "%OUTDIR%\DLL Debug" 1>nul
+          rd out32dll.dbg /s /q
+        ) else (
+          move out32dll.dbg "%OUTDIR%\DLL Debug" 1>nul
+        )
+
+        rem Move the PDB files
+        move tmp32dll.dbg\lib.pdb "%OUTDIR%\DLL Debug" 1>nul
+
+        rem Remove the intermediate directories
+        rd tmp32dll.dbg /s /q
+      ) else (
+        exit /B 1
+      )
+    ) else if "%1" == "release" (
+      if "%2" == "static" (
+        rem Move the output directories
+        if exist "%OUTDIR%\LIB Release" (
+          copy /y out32\* "%OUTDIR%\LIB Release" 1>nul
+          rd out32 /s /q
+        ) else (
+          move out32 "%OUTDIR%\LIB Release" 1>nul
+        )
+
+        rem Move the PDB files
+        move tmp32\lib.pdb "%OUTDIR%\LIB Release" 1>nul
+
+        rem Remove the intermediate directories
+        rd tmp32 /s /q
+      ) else if "%2" == "shared" (
+        if exist "%OUTDIR%\DLL Release" (
+          copy /y out32dll\* "%OUTDIR%\DLL Release" 1>nul
+          rd out32dll /s /q
+        ) else (
+          move out32dll "%OUTDIR%\DLL Release" 1>nul
+        )
+
+        rem Move the PDB files
+        move tmp32dll\lib.pdb "%OUTDIR%\DLL Release" 1>nul
+
+        rem Remove the intermediate directories
+        rd tmp32dll /s /q
+      ) else (
+        exit /B 1
+      )
+    )
+  ) else if "%3" == "FALSE" (
+    rem Calculate the build directory
+    set build_dir=%cd%\build\tmp
+
+    rem Perform the installation
+    nmake install_sw
+
+    rem Move the output directories
+    if "%1" == "debug" (
+      if "%2" == "static" (
+        if not exist "%OUTDIR%\LIB Debug" (
+          mkdir "%OUTDIR%\LIB Debug" 1>nul
+        )
+
+        move !build_dir!\lib\*.lib "%OUTDIR%\LIB Debug" 1>nul
+        move !build_dir!\bin\*.exe "%OUTDIR%\LIB Debug" 1>nul
+      ) else if "%2" == "shared" (
+        if not exist "%OUTDIR%\DLL Debug" (
+          mkdir "%OUTDIR%\DLL Debug" 1>nul
+        )
+
+        move !build_dir!\lib\*.lib "%OUTDIR%\DLL Debug" 1>nul
+        move !build_dir!\bin\*.dll "%OUTDIR%\DLL Debug" 1>nul
+        move !build_dir!\bin\*.exe "%OUTDIR%\DLL Debug" 1>nul
+        move !build_dir!\bin\*.pdb "%OUTDIR%\DLL Debug" 1>nul
+      ) else (
+        exit /B 1
+      )
+    ) else if "%1" == "release" (
+      if "%2" == "static" (
+        if not exist "%OUTDIR%\LIB Release" (
+          mkdir "%OUTDIR%\LIB Release" 1>nul
+        )
+
+        move !build_dir!\lib\*.lib "%OUTDIR%\LIB Release" 1>nul
+        move !build_dir!\bin\*.exe "%OUTDIR%\LIB Release" 1>nul
+      ) else if "%2" == "shared" (
+        if not exist "%OUTDIR%\DLL Release" (
+          mkdir "%OUTDIR%\DLL Release" 1>nul
+        )
+
+        move !build_dir!\lib\*.lib "%OUTDIR%\DLL Release" 1>nul
+        move !build_dir!\bin\*.dll "%OUTDIR%\DLL Release" 1>nul
+        move !build_dir!\bin\*.exe "%OUTDIR%\DLL Release" 1>nul
+      ) else (
+        exit /B 1
+      )
+    ) else (
+      exit /B 1
+    )
+
+    rem Remove the output directories
+    rd !build_dir! /s /q
+  ) else (
+    exit /B 1
+  )
+
+  exit /B 0
 
 :syntax
   rem Display the help
@@ -390,6 +621,7 @@ rem ***************************************************************************
   echo vc12      - Use Visual Studio 2013
   echo vc14      - Use Visual Studio 2015
   echo vc14.1    - Use Visual Studio 2017
+  echo vc14.2    - Use Visual Studio 2019
   echo.
   echo Platform:
   echo.
@@ -453,14 +685,6 @@ rem ***************************************************************************
   echo Error: Cannot locate OpenSSL source directory
   goto error
 
-:unsupported
-  echo.
-  echo Error: Unsupported OpenSSL version.
-  echo The pre-generated project files and this build script only support the
-  echo LTS version of OpenSSL ^(v1.0.2^). The next version of this build script
-  echo will support OpenSSL v1.1.0.
-  goto error
-
 :error
   if "%OS%" == "Windows_NT" endlocal
   exit /B 1
index 5c8debf..e2b6b69 100644 (file)
@@ -113,6 +113,18 @@ rem ***************************************************************************
       for /f "delims=" %%i in ('dir "%SRC_DIR%\lib\vauth\*.h.*" /b 2^>NUL') do @perl "%SRC_DIR%\lib\checksrc.pl" "-D%SRC_DIR%\lib\vauth" "%%i"
     )
 
+    rem Check the lib\vquic directory
+    if exist %SRC_DIR%\lib\vquic (
+      for /f "delims=" %%i in ('dir "%SRC_DIR%\lib\vquic\*.c.*" /b 2^>NUL') do @perl "%SRC_DIR%\lib\checksrc.pl" "-D%SRC_DIR%\lib\vquic" "%%i"
+      for /f "delims=" %%i in ('dir "%SRC_DIR%\lib\vquic\*.h.*" /b 2^>NUL') do @perl "%SRC_DIR%\lib\checksrc.pl" "-D%SRC_DIR%\lib\vquic" "%%i"
+    )
+
+    rem Check the lib\vssh directory
+    if exist %SRC_DIR%\lib\vssh (
+      for /f "delims=" %%i in ('dir "%SRC_DIR%\lib\vssh\*.c.*" /b 2^>NUL') do @perl "%SRC_DIR%\lib\checksrc.pl" "-D%SRC_DIR%\lib\vssh" "%%i"
+      for /f "delims=" %%i in ('dir "%SRC_DIR%\lib\vssh\*.h.*" /b 2^>NUL') do @perl "%SRC_DIR%\lib\checksrc.pl" "-D%SRC_DIR%\lib\vssh" "%%i"
+    )
+
     rem Check the lib\vtls directory
     if exist %SRC_DIR%\lib\vtls (
       for /f "delims=" %%i in ('dir "%SRC_DIR%\lib\vtls\*.c.*" /b 2^>NUL') do @perl "%SRC_DIR%\lib\checksrc.pl" "-D%SRC_DIR%\lib\vtls" "%%i"
@@ -143,7 +155,7 @@ rem ***************************************************************************
   if "%CHECK_EXAMPLES%" == "TRUE" (
     rem Check the docs\examples directory
     if exist %SRC_DIR%\docs\examples (
-      for /f "delims=" %%i in ('dir "%SRC_DIR%\docs\examples\*.c.*" /b 2^>NUL') do @perl "%SRC_DIR%\lib\checksrc.pl" "-D%SRC_DIR%\docs\examples" "%%i"
+      for /f "delims=" %%i in ('dir "%SRC_DIR%\docs\examples\*.c.*" /b 2^>NUL') do @perl "%SRC_DIR%\lib\checksrc.pl" "-D%SRC_DIR%\docs\examples" -ASNPRINTF "%%i"
     )
   )
 
index 32a88f5..9aa0633 100644 (file)
@@ -303,6 +303,14 @@ rem
       for /f "delims=" %%c in ('dir /b ..\lib\vauth\*.c') do call :element %1 lib\vauth "%%c" %3
     ) else if "!var!" == "CURL_LIB_VAUTH_H_FILES" (
       for /f "delims=" %%h in ('dir /b ..\lib\vauth\*.h') do call :element %1 lib\vauth "%%h" %3
+    ) else if "!var!" == "CURL_LIB_VQUIC_C_FILES" (
+      for /f "delims=" %%c in ('dir /b ..\lib\vquic\*.c') do call :element %1 lib\vquic "%%c" %3
+    ) else if "!var!" == "CURL_LIB_VQUIC_H_FILES" (
+      for /f "delims=" %%h in ('dir /b ..\lib\vquic\*.h') do call :element %1 lib\vquic "%%h" %3
+    ) else if "!var!" == "CURL_LIB_VSSH_C_FILES" (
+      for /f "delims=" %%c in ('dir /b ..\lib\vssh\*.c') do call :element %1 lib\vssh "%%c" %3
+    ) else if "!var!" == "CURL_LIB_VSSH_H_FILES" (
+      for /f "delims=" %%h in ('dir /b ..\lib\vssh\*.h') do call :element %1 lib\vssh "%%h" %3
     ) else if "!var!" == "CURL_LIB_VTLS_C_FILES" (
       for /f "delims=" %%c in ('dir /b ..\lib\vtls\*.c') do call :element %1 lib\vtls "%%c" %3
     ) else if "!var!" == "CURL_LIB_VTLS_H_FILES" (
@@ -319,7 +327,7 @@ rem Generates a single file xml element.
 rem
 rem %1 - Project Type (dsp for VC6, vcproj1 for VC7 and VC7.1, vcproj2 for VC8 and VC9
 rem      or vcxproj for VC10, VC11, VC12, VC14 and VC15)
-rem %2 - Directory (src, lib, lib\vauth or lib\vtls)
+rem %2 - Directory (src, lib, lib\vauth, lib\vquic, lib\vssh, lib\vtls)
 rem %3 - Source filename
 rem %4 - Output project file
 rem
@@ -327,6 +335,10 @@ rem
   set "SPACES=    "
   if "%2" == "lib\vauth" (
     set "TABS=                         "
+  ) else if "%2" == "lib\vquic" (
+    set "TABS=                         "
+  ) else if "%2" == "lib\vssh" (
+    set "TABS=                         "
   ) else if "%2" == "lib\vtls" (
     set "TABS=                         "
   ) else (
index 15c0882..297b8d2 100644 (file)
 #
 ###########################################################################
 ZSH_FUNCTIONS_DIR = @ZSH_FUNCTIONS_DIR@
+FISH_FUNCTIONS_DIR = @FISH_FUNCTIONS_DIR@
 PERL = @PERL@
 
 ZSH_COMPLETION_FUNCTION_FILENAME = _curl
+FISH_COMPLETION_FUNCTION_FILENAME = curl.fish
 
-CLEANFILES = $(ZSH_COMPLETION_FUNCTION_FILENAME)
+CLEANFILES = $(ZSH_COMPLETION_FUNCTION_FILENAME) $(FISH_COMPLETION_FUNCTION_FILENAME)
 
-all-local: $(ZSH_COMPLETION_FUNCTION_FILENAME)
+all-local: $(ZSH_COMPLETION_FUNCTION_FILENAME) $(FISH_COMPLETION_FUNCTION_FILENAME)
 
-$(ZSH_COMPLETION_FUNCTION_FILENAME): zsh.pl
+$(ZSH_COMPLETION_FUNCTION_FILENAME): completion.pl
 if CROSSCOMPILING
        @echo "NOTICE: we can't generate zsh completion when cross-compiling!"
 else # if not cross-compiling:
-       @if ! test -x "$(PERL)"; then echo "No perl: can't install zsh.pl"; exit 0; fi
-       $(PERL) $(srcdir)/zsh.pl $(top_builddir)/src/curl$(EXEEXT) > $@
+       @if ! test -x "$(PERL)"; then echo "No perl: can't install completion.pl"; exit 0; fi
+       $(PERL) $(srcdir)/completion.pl --curl $(top_builddir)/src/curl$(EXEEXT) --shell zsh > $@
+endif
+
+$(FISH_COMPLETION_FUNCTION_FILENAME): completion.pl
+if CROSSCOMPILING
+       @echo "NOTICE: we can't generate fish completion when cross-compiling!"
+else # if not cross-compiling:
+       @if ! test -x "$(PERL)"; then echo "No perl: can't install completion.pl"; exit 0; fi
+       $(PERL) $(srcdir)/completion.pl --curl $(top_builddir)/src/curl$(EXEEXT) --shell fish > $@
 endif
 
 install-data-local:
@@ -41,5 +51,7 @@ if CROSSCOMPILING
        @echo "NOTICE: we can't install zsh completion when cross-compiling!"
 else # if not cross-compiling:
        $(MKDIR_P) $(DESTDIR)$(ZSH_FUNCTIONS_DIR)
+       $(MKDIR_P) $(DESTDIR)$(FISH_FUNCTIONS_DIR)
        $(INSTALL_DATA) $(ZSH_COMPLETION_FUNCTION_FILENAME) $(DESTDIR)$(ZSH_FUNCTIONS_DIR)/$(ZSH_COMPLETION_FUNCTION_FILENAME)
+       $(INSTALL_DATA) $(FISH_COMPLETION_FUNCTION_FILENAME) $(DESTDIR)$(FISH_FUNCTIONS_DIR)/$(FISH_COMPLETION_FUNCTION_FILENAME)
 endif
index 84745de..ec5cce7 100644 (file)
@@ -89,8 +89,7 @@ build_triplet = @build@
 host_triplet = @host@
 subdir = scripts
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/ax_code_coverage.m4 \
-       $(top_srcdir)/m4/ax_compile_check_sizeof.m4 \
+am__aclocal_m4_deps = $(top_srcdir)/m4/ax_compile_check_sizeof.m4 \
        $(top_srcdir)/m4/curl-compilers.m4 \
        $(top_srcdir)/m4/curl-confopts.m4 \
        $(top_srcdir)/m4/curl-functions.m4 \
@@ -152,12 +151,6 @@ CC = @CC@
 CCDEPMODE = @CCDEPMODE@
 CFLAGS = @CFLAGS@
 CFLAG_CURL_SYMBOL_HIDING = @CFLAG_CURL_SYMBOL_HIDING@
-CODE_COVERAGE_CFLAGS = @CODE_COVERAGE_CFLAGS@
-CODE_COVERAGE_CPPFLAGS = @CODE_COVERAGE_CPPFLAGS@
-CODE_COVERAGE_CXXFLAGS = @CODE_COVERAGE_CXXFLAGS@
-CODE_COVERAGE_ENABLED = @CODE_COVERAGE_ENABLED@
-CODE_COVERAGE_LDFLAGS = @CODE_COVERAGE_LDFLAGS@
-CODE_COVERAGE_LIBS = @CODE_COVERAGE_LIBS@
 CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
@@ -199,14 +192,15 @@ ENABLE_SHARED = @ENABLE_SHARED@
 ENABLE_STATIC = @ENABLE_STATIC@
 EXEEXT = @EXEEXT@
 FGREP = @FGREP@
+FISH_FUNCTIONS_DIR = @FISH_FUNCTIONS_DIR@
 GCOV = @GCOV@
-GENHTML = @GENHTML@
 GREP = @GREP@
 HAVE_BROTLI = @HAVE_BROTLI@
 HAVE_GNUTLS_SRP = @HAVE_GNUTLS_SRP@
 HAVE_LDAP_SSL = @HAVE_LDAP_SSL@
 HAVE_LIBZ = @HAVE_LIBZ@
 HAVE_OPENSSL_SRP = @HAVE_OPENSSL_SRP@
+HAVE_PROTO_BSDSOCKET_H = @HAVE_PROTO_BSDSOCKET_H@
 IDN_ENABLED = @IDN_ENABLED@
 INSTALL = @INSTALL@
 INSTALL_DATA = @INSTALL_DATA@
@@ -267,9 +261,7 @@ STRIP = @STRIP@
 SUPPORT_FEATURES = @SUPPORT_FEATURES@
 SUPPORT_PROTOCOLS = @SUPPORT_PROTOCOLS@
 USE_ARES = @USE_ARES@
-USE_AXTLS = @USE_AXTLS@
-USE_CYASSL = @USE_CYASSL@
-USE_DARWINSSL = @USE_DARWINSSL@
+USE_BEARSSL = @USE_BEARSSL@
 USE_GNUTLS = @USE_GNUTLS@
 USE_GNUTLS_NETTLE = @USE_GNUTLS_NETTLE@
 USE_LIBRTMP = @USE_LIBRTMP@
@@ -278,12 +270,17 @@ USE_LIBSSH2 = @USE_LIBSSH2@
 USE_MBEDTLS = @USE_MBEDTLS@
 USE_MESALINK = @USE_MESALINK@
 USE_NGHTTP2 = @USE_NGHTTP2@
+USE_NGHTTP3 = @USE_NGHTTP3@
+USE_NGTCP2 = @USE_NGTCP2@
+USE_NGTCP2_CRYPTO_OPENSSL = @USE_NGTCP2_CRYPTO_OPENSSL@
 USE_NSS = @USE_NSS@
 USE_OPENLDAP = @USE_OPENLDAP@
-USE_POLARSSL = @USE_POLARSSL@
+USE_QUICHE = @USE_QUICHE@
 USE_SCHANNEL = @USE_SCHANNEL@
+USE_SECTRANSP = @USE_SECTRANSP@
 USE_UNIX_SOCKETS = @USE_UNIX_SOCKETS@
 USE_WINDOWS_SSPI = @USE_WINDOWS_SSPI@
+USE_WOLFSSL = @USE_WOLFSSL@
 VERSION = @VERSION@
 VERSIONNUM = @VERSIONNUM@
 ZLIB_LIBS = @ZLIB_LIBS@
@@ -366,7 +363,8 @@ top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
 ZSH_COMPLETION_FUNCTION_FILENAME = _curl
-CLEANFILES = $(ZSH_COMPLETION_FUNCTION_FILENAME)
+FISH_COMPLETION_FUNCTION_FILENAME = curl.fish
+CLEANFILES = $(ZSH_COMPLETION_FUNCTION_FILENAME) $(FISH_COMPLETION_FUNCTION_FILENAME)
 all: all-am
 
 .SUFFIXES:
@@ -564,17 +562,24 @@ uninstall-am:
 .PRECIOUS: Makefile
 
 
-all-local: $(ZSH_COMPLETION_FUNCTION_FILENAME)
+all-local: $(ZSH_COMPLETION_FUNCTION_FILENAME) $(FISH_COMPLETION_FUNCTION_FILENAME)
 
-$(ZSH_COMPLETION_FUNCTION_FILENAME): zsh.pl
+$(ZSH_COMPLETION_FUNCTION_FILENAME): completion.pl
 @CROSSCOMPILING_TRUE@  @echo "NOTICE: we can't generate zsh completion when cross-compiling!"
-@CROSSCOMPILING_FALSE@ @if ! test -x "$(PERL)"; then echo "No perl: can't install zsh.pl"; exit 0; fi
-@CROSSCOMPILING_FALSE@ $(PERL) $(srcdir)/zsh.pl $(top_builddir)/src/curl$(EXEEXT) > $@
+@CROSSCOMPILING_FALSE@ @if ! test -x "$(PERL)"; then echo "No perl: can't install completion.pl"; exit 0; fi
+@CROSSCOMPILING_FALSE@ $(PERL) $(srcdir)/completion.pl --curl $(top_builddir)/src/curl$(EXEEXT) --shell zsh > $@
+
+$(FISH_COMPLETION_FUNCTION_FILENAME): completion.pl
+@CROSSCOMPILING_TRUE@  @echo "NOTICE: we can't generate fish completion when cross-compiling!"
+@CROSSCOMPILING_FALSE@ @if ! test -x "$(PERL)"; then echo "No perl: can't install completion.pl"; exit 0; fi
+@CROSSCOMPILING_FALSE@ $(PERL) $(srcdir)/completion.pl --curl $(top_builddir)/src/curl$(EXEEXT) --shell fish > $@
 
 install-data-local:
 @CROSSCOMPILING_TRUE@  @echo "NOTICE: we can't install zsh completion when cross-compiling!"
 @CROSSCOMPILING_FALSE@ $(MKDIR_P) $(DESTDIR)$(ZSH_FUNCTIONS_DIR)
+@CROSSCOMPILING_FALSE@ $(MKDIR_P) $(DESTDIR)$(FISH_FUNCTIONS_DIR)
 @CROSSCOMPILING_FALSE@ $(INSTALL_DATA) $(ZSH_COMPLETION_FUNCTION_FILENAME) $(DESTDIR)$(ZSH_FUNCTIONS_DIR)/$(ZSH_COMPLETION_FUNCTION_FILENAME)
+@CROSSCOMPILING_FALSE@ $(INSTALL_DATA) $(FISH_COMPLETION_FUNCTION_FILENAME) $(DESTDIR)$(FISH_FUNCTIONS_DIR)/$(FISH_COMPLETION_FUNCTION_FILENAME)
 
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
diff --git a/scripts/completion.pl b/scripts/completion.pl
new file mode 100755 (executable)
index 0000000..1c41755
--- /dev/null
@@ -0,0 +1,134 @@
+#!/usr/bin/env perl
+
+use strict;
+use warnings;
+use Getopt::Long();
+use Pod::Usage();
+
+my $curl = 'curl';
+my $shell = 'zsh';
+my $help = 0;
+Getopt::Long::GetOptions(
+    'curl=s' => \$curl,
+    'shell=s' => \$shell,
+    'help' => \$help,
+) or Pod::Usage::pod2usage();
+Pod::Usage::pod2usage() if $help;
+
+my $regex = '\s+(?:(-[^\s]+),\s)?(--[^\s]+)\s*(\<.+?\>)?\s+(.*)';
+my @opts = parse_main_opts('--help', $regex);
+
+if ($shell eq 'fish') {
+    print "# curl fish completion\n\n";
+    print qq{$_ \n} foreach (@opts);
+} elsif ($shell eq 'zsh') {
+    my $opts_str;
+
+    $opts_str .= qq{  $_ \\\n} foreach (@opts);
+    chomp $opts_str;
+
+my $tmpl = <<"EOS";
+#compdef curl
+
+# curl zsh completion
+
+local curcontext="\$curcontext" state state_descr line
+typeset -A opt_args
+
+local rc=1
+
+_arguments -C -S \\
+$opts_str
+  '*:URL:_urls' && rc=0
+
+return rc
+EOS
+
+    print $tmpl;
+} else {
+    die("Unsupported shell: $shell");
+}
+
+sub parse_main_opts {
+    my ($cmd, $regex) = @_;
+
+    my @list;
+    my @lines = call_curl($cmd);
+
+    foreach my $line (@lines) {
+        my ($short, $long, $arg, $desc) = ($line =~ /^$regex/) or next;
+
+        my $option = '';
+
+        $arg =~ s/\:/\\\:/g if defined $arg;
+
+        $desc =~ s/'/'\\''/g if defined $desc;
+        $desc =~ s/\[/\\\[/g if defined $desc;
+        $desc =~ s/\]/\\\]/g if defined $desc;
+        $desc =~ s/\:/\\\:/g if defined $desc;
+
+        if ($shell eq 'fish') {
+            $option .= "complete --command curl";
+            $option .= " --short-option '" . strip_dash(trim($short)) . "'"
+                if defined $short;
+            $option .= " --long-option '" . strip_dash(trim($long)) . "'"
+                if defined $long;
+            $option .= " --description '" . strip_dash(trim($desc)) . "'"
+                if defined $desc;
+        } elsif ($shell eq 'zsh') {
+            $option .= '{' . trim($short) . ',' if defined $short;
+            $option .= trim($long)  if defined $long;
+            $option .= '}' if defined $short;
+            $option .= '\'[' . trim($desc) . ']\'' if defined $desc;
+
+            $option .= ":'$arg'" if defined $arg;
+
+            $option .= ':_files'
+                if defined $arg and ($arg eq '<file>' || $arg eq '<filename>'
+                    || $arg eq '<dir>');
+        }
+
+        push @list, $option;
+    }
+
+    # Sort longest first, because zsh won't complete an option listed
+    # after one that's a prefix of it.
+    @list = sort {
+        $a =~ /([^=]*)/; my $ma = $1;
+        $b =~ /([^=]*)/; my $mb = $1;
+
+        length($mb) <=> length($ma)
+    } @list if $shell eq 'zsh';
+
+    return @list;
+}
+
+sub trim { my $s = shift; $s =~ s/^\s+|\s+$//g; return $s };
+sub strip_dash { my $s = shift; $s =~ s/^-+//g; return $s };
+
+sub call_curl {
+    my ($cmd) = @_;
+    my $output = `"$curl" $cmd`;
+    if ($? == -1) {
+        die "Could not run curl: $!";
+    } elsif ((my $exit_code = $? >> 8) != 0) {
+        die "curl returned $exit_code with output:\n$output";
+    }
+    return split /\n/, $output;
+}
+
+__END__
+
+=head1 NAME
+
+completion.pl - Generates tab-completion files for various shells
+
+=head1 SYNOPSIS
+
+completion.pl [options...]
+
+    --curl   path to curl executable
+    --shell  zsh/fish
+    --help   prints this help
+
+=cut
diff --git a/scripts/zsh.pl b/scripts/zsh.pl
deleted file mode 100755 (executable)
index 1257190..0000000
+++ /dev/null
@@ -1,89 +0,0 @@
-#!/usr/bin/env perl
-
-# Generate ZSH completion
-
-use strict;
-use warnings;
-
-my $curl = $ARGV[0] || 'curl';
-
-my $regex = '\s+(?:(-[^\s]+),\s)?(--[^\s]+)\s([^\s.]+)?\s+(.*)';
-my @opts = parse_main_opts('--help', $regex);
-
-my $opts_str;
-
-$opts_str .= qq{  $_ \\\n} foreach (@opts);
-chomp $opts_str;
-
-my $tmpl = <<"EOS";
-#compdef curl
-
-# curl zsh completion
-
-local curcontext="\$curcontext" state state_descr line
-typeset -A opt_args
-
-local rc=1
-
-_arguments -C -S \\
-$opts_str
-  '*:URL:_urls' && rc=0
-
-return rc
-EOS
-
-print $tmpl;
-
-sub parse_main_opts {
-    my ($cmd, $regex) = @_;
-
-    my @list;
-    my @lines = call_curl($cmd);
-
-    foreach my $line (@lines) {
-        my ($short, $long, $arg, $desc) = ($line =~ /^$regex/) or next;
-
-        my $option = '';
-
-        $desc =~ s/'/'\\''/g if defined $desc;
-        $desc =~ s/\[/\\\[/g if defined $desc;
-        $desc =~ s/\]/\\\]/g if defined $desc;
-
-        $option .= '{' . trim($short) . ',' if defined $short;
-        $option .= trim($long)  if defined $long;
-        $option .= '}' if defined $short;
-        $option .= '\'[' . trim($desc) . ']\'' if defined $desc;
-
-        $option .= ":'$arg'" if defined $arg;
-
-        $option .= ':_files'
-            if defined $arg and ($arg eq '<file>' || $arg eq '<filename>'
-                || $arg eq '<dir>');
-
-        push @list, $option;
-    }
-
-    # Sort longest first, because zsh won't complete an option listed
-    # after one that's a prefix of it.
-    @list = sort {
-        $a =~ /([^=]*)/; my $ma = $1;
-        $b =~ /([^=]*)/; my $mb = $1;
-
-        length($mb) <=> length($ma)
-    } @list;
-
-    return @list;
-}
-
-sub trim { my $s = shift; $s =~ s/^\s+|\s+$//g; return $s };
-
-sub call_curl {
-    my ($cmd) = @_;
-    my $output = `"$curl" $cmd`;
-    if ($? == -1) {
-        die "Could not run curl: $!";
-    } elsif ((my $exit_code = $? >> 8) != 0) {
-        die "curl returned $exit_code with output:\n$output";
-    }
-    return split /\n/, $output;
-}
index f10a3d0..63e2b94 100644 (file)
@@ -9,16 +9,13 @@ if(USE_MANUAL)
     COMMAND ${CMAKE_COMMAND} -E echo "#ifndef HAVE_LIBZ" >> tool_hugehelp.c
     COMMAND env LC_ALL=C "${NROFF}" ${NROFF_MANOPT}
             "${CURL_BINARY_DIR}/docs/curl.1" |
-            "${PERL_EXECUTABLE}" "${CMAKE_CURRENT_SOURCE_DIR}/mkhelp.pl"
-            "${CURL_SOURCE_DIR}/docs/MANUAL" >> tool_hugehelp.c
+            "${PERL_EXECUTABLE}" "${CMAKE_CURRENT_SOURCE_DIR}/mkhelp.pl" >> tool_hugehelp.c
     COMMAND ${CMAKE_COMMAND} -E echo "#else" >> tool_hugehelp.c
     COMMAND env LC_ALL=C "${NROFF}" ${NROFF_MANOPT}
             "${CURL_BINARY_DIR}/docs/curl.1" |
-            "${PERL_EXECUTABLE}" "${CMAKE_CURRENT_SOURCE_DIR}/mkhelp.pl" -c
-            "${CURL_SOURCE_DIR}/docs/MANUAL" >> tool_hugehelp.c
+            "${PERL_EXECUTABLE}" "${CMAKE_CURRENT_SOURCE_DIR}/mkhelp.pl" -c >> tool_hugehelp.c
     COMMAND ${CMAKE_COMMAND} -E echo "#endif /* HAVE_LIBZ */" >> tool_hugehelp.c
     DEPENDS
-      "${CURL_SOURCE_DIR}/docs/MANUAL"
       generate-curl.1
       "${CURL_BINARY_DIR}/docs/curl.1"
       "${CMAKE_CURRENT_SOURCE_DIR}/mkhelp.pl"
index 8fd9dc3..90f1562 100644 (file)
@@ -5,7 +5,7 @@
 #                            | (__| |_| |  _ <| |___
 #                             \___|\___/|_| \_\_____|
 #
-# Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 #
 # This software is licensed as described in the file COPYING, which
 # you should have received as part of this distribution. The terms
@@ -69,10 +69,6 @@ endif
 curl_LDFLAGS = @LIBMETALINK_LDFLAGS@
 curl_CPPFLAGS = $(AM_CPPFLAGS) $(LIBMETALINK_CPPFLAGS)
 
-@CODE_COVERAGE_RULES@
-curl_LDFLAGS += $(CODE_COVERAGE_LDFLAGS)
-CFLAGS += $(CODE_COVERAGE_CFLAGS)
-
 # if unit tests are enabled, build a static library to link them with
 if BUILD_UNITTESTS
 noinst_LTLIBRARIES = libcurltool.la
@@ -95,10 +91,19 @@ EXTRA_DIST = mkhelp.pl makefile.dj                                     \
 
 # Use absolute directory to disable VPATH
 MANPAGE=$(abs_top_builddir)/docs/curl.1
-README=$(top_srcdir)/docs/MANUAL
 MKHELP=$(top_srcdir)/src/mkhelp.pl
 HUGE=tool_hugehelp.c
 
+HUGECMD = $(HUGEIT_$(V))
+HUGEIT_0 = @echo "  HUGE    " $@;
+HUGEIT_1 =
+HUGEIT_ = $(HUGEIT_0)
+
+CHECKSRC = $(CS_$(V))
+CS_0 = @echo "  RUN     " $@;
+CS_1 =
+CS_ = $(CS_0)
+
 if USE_MANUAL
 # Here are the stuff to create a built-in manual
 
@@ -108,33 +113,33 @@ $(MANPAGE):
 if HAVE_LIBZ
 # This generates the tool_hugehelp.c file in both uncompressed and
 # compressed formats.
-$(HUGE): $(MANPAGE) $(README) $(MKHELP)
-       echo '#include "tool_setup.h"' > $(HUGE)
-       echo '#ifndef HAVE_LIBZ' >> $(HUGE)
-       $(NROFF) $(MANPAGE) | $(PERL) $(MKHELP) $(README) >> $(HUGE)
-       echo '#else' >> $(HUGE)
-       $(NROFF) $(MANPAGE) | $(PERL) $(MKHELP) -c $(README) >> $(HUGE)
-       echo '#endif /* HAVE_LIBZ */' >> $(HUGE)
+$(HUGE): $(MANPAGE) $(MKHELP)
+       $(HUGECMD) (echo '#include "tool_setup.h"' > $(HUGE);   \
+       echo '#ifndef HAVE_LIBZ' >> $(HUGE);                    \
+       $(NROFF) $(MANPAGE) | $(PERL) $(MKHELP) >> $(HUGE);     \
+       echo '#else' >> $(HUGE);                                \
+       $(NROFF) $(MANPAGE) | $(PERL) $(MKHELP) -c >> $(HUGE);  \
+       echo '#endif /* HAVE_LIBZ */' >> $(HUGE) )
 else # HAVE_LIBZ
 # This generates the tool_hugehelp.c file uncompressed only
-$(HUGE): $(MANPAGE) $(README) $(MKHELP)
-       echo '#include "tool_setup.h"' > $(HUGE)
-       $(NROFF) $(MANPAGE) | $(PERL) $(MKHELP) $(README) >> $(HUGE)
+$(HUGE): $(MANPAGE) $(MKHELP)
+       $(HUGECMD)(echo '#include "tool_setup.h"' > $(HUGE);    \
+       $(NROFF) $(MANPAGE) | $(PERL) $(MKHELP) >> $(HUGE) )
 endif
 
 else # USE_MANUAL
 # built-in manual has been disabled, make a blank file
 $(HUGE):
-       echo "/* built-in manual is disabled, blank function */" > $(HUGE)
-       echo '#include "tool_hugehelp.h"' >> $(HUGE)
-       echo "void hugehelp(void) {}" >>$(HUGE)
+       $(HUGECMD)(echo "/* built-in manual is disabled, blank function */" > $(HUGE); \
+       echo '#include "tool_hugehelp.h"' >> $(HUGE); \
+       echo "void hugehelp(void) {}" >>$(HUGE) )
 endif
 
 # ignore tool_hugehelp.c since it is generated source code and it plays
 # by slightly different rules!
 checksrc:
-       @PERL@ $(top_srcdir)/lib/checksrc.pl -D$(srcdir)        \
-       -W$(srcdir)/tool_hugehelp.c $(srcdir)/*.[ch]
+       $(CHECKSRC)(@PERL@ $(top_srcdir)/lib/checksrc.pl -D$(srcdir)        \
+       -W$(srcdir)/tool_hugehelp.c $(srcdir)/*.[ch])
 
 if CURLDEBUG
 # for debug builds, we scan the sources on all regular make invokes
@@ -147,4 +152,4 @@ TIDYFLAGS=-checks=-clang-analyzer-security.insecureAPI.strcpy,-clang-analyzer-op
 TIDY:=clang-tidy
 
 tidy:
-       $(TIDY) $(CURL_CFILES) $(TIDYFLAGS) -- $(AM_CPPFLAGS) $(CPPFLAGS) -DHAVE_CONFIG_H
+       $(TIDY) $(CURL_CFILES) $(TIDYFLAGS) -- $(curl_CPPFLAGS) $(CPPFLAGS) -DHAVE_CONFIG_H
index e11f9e5..19d5db6 100644 (file)
@@ -102,8 +102,7 @@ bin_PROGRAMS = curl$(EXEEXT)
 @USE_CPPFLAG_CURL_STATICLIB_TRUE@am__append_1 = -DCURL_STATICLIB
 subdir = src
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/ax_code_coverage.m4 \
-       $(top_srcdir)/m4/ax_compile_check_sizeof.m4 \
+am__aclocal_m4_deps = $(top_srcdir)/m4/ax_compile_check_sizeof.m4 \
        $(top_srcdir)/m4/curl-compilers.m4 \
        $(top_srcdir)/m4/curl-confopts.m4 \
        $(top_srcdir)/m4/curl-functions.m4 \
@@ -140,9 +139,9 @@ am__libcurltool_la_SOURCES_DIST = slist_wc.c tool_binmode.c \
        tool_getpass.c tool_help.c tool_helpers.c tool_homedir.c \
        tool_hugehelp.c tool_libinfo.c tool_main.c tool_metalink.c \
        tool_msgs.c tool_operate.c tool_operhlp.c tool_panykey.c \
-       tool_paramhlp.c tool_parsecfg.c tool_strdup.c tool_setopt.c \
-       tool_sleep.c tool_urlglob.c tool_util.c tool_vms.c \
-       tool_writeout.c tool_xattr.c ../lib/strtoofft.c \
+       tool_paramhlp.c tool_parsecfg.c tool_progress.c tool_strdup.c \
+       tool_setopt.c tool_sleep.c tool_urlglob.c tool_util.c \
+       tool_vms.c tool_writeout.c tool_xattr.c ../lib/strtoofft.c \
        ../lib/nonblock.c ../lib/warnless.c ../lib/curl_ctype.c \
        slist_wc.h tool_binmode.h tool_bname.h tool_cb_dbg.h \
        tool_cb_hdr.h tool_cb_prg.h tool_cb_rea.h tool_cb_see.h \
@@ -151,10 +150,10 @@ am__libcurltool_la_SOURCES_DIST = slist_wc.c tool_binmode.c \
        tool_getparam.h tool_getpass.h tool_help.h tool_helpers.h \
        tool_homedir.h tool_hugehelp.h tool_libinfo.h tool_main.h \
        tool_metalink.h tool_msgs.h tool_operate.h tool_operhlp.h \
-       tool_panykey.h tool_paramhlp.h tool_parsecfg.h tool_sdecls.h \
-       tool_setopt.h tool_setup.h tool_sleep.h tool_strdup.h \
-       tool_urlglob.h tool_util.h tool_version.h tool_vms.h \
-       tool_writeout.h tool_xattr.h
+       tool_panykey.h tool_paramhlp.h tool_parsecfg.h tool_progress.h \
+       tool_sdecls.h tool_setopt.h tool_setup.h tool_sleep.h \
+       tool_strdup.h tool_urlglob.h tool_util.h tool_version.h \
+       tool_vms.h tool_writeout.h tool_xattr.h
 am__objects_1 = libcurltool_la-slist_wc.lo \
        libcurltool_la-tool_binmode.lo libcurltool_la-tool_bname.lo \
        libcurltool_la-tool_cb_dbg.lo libcurltool_la-tool_cb_hdr.lo \
@@ -171,7 +170,8 @@ am__objects_1 = libcurltool_la-slist_wc.lo \
        libcurltool_la-tool_metalink.lo libcurltool_la-tool_msgs.lo \
        libcurltool_la-tool_operate.lo libcurltool_la-tool_operhlp.lo \
        libcurltool_la-tool_panykey.lo libcurltool_la-tool_paramhlp.lo \
-       libcurltool_la-tool_parsecfg.lo libcurltool_la-tool_strdup.lo \
+       libcurltool_la-tool_parsecfg.lo \
+       libcurltool_la-tool_progress.lo libcurltool_la-tool_strdup.lo \
        libcurltool_la-tool_setopt.lo libcurltool_la-tool_sleep.lo \
        libcurltool_la-tool_urlglob.lo libcurltool_la-tool_util.lo \
        libcurltool_la-tool_vms.lo libcurltool_la-tool_writeout.lo \
@@ -210,11 +210,11 @@ am__objects_6 = curl-slist_wc.$(OBJEXT) curl-tool_binmode.$(OBJEXT) \
        curl-tool_metalink.$(OBJEXT) curl-tool_msgs.$(OBJEXT) \
        curl-tool_operate.$(OBJEXT) curl-tool_operhlp.$(OBJEXT) \
        curl-tool_panykey.$(OBJEXT) curl-tool_paramhlp.$(OBJEXT) \
-       curl-tool_parsecfg.$(OBJEXT) curl-tool_strdup.$(OBJEXT) \
-       curl-tool_setopt.$(OBJEXT) curl-tool_sleep.$(OBJEXT) \
-       curl-tool_urlglob.$(OBJEXT) curl-tool_util.$(OBJEXT) \
-       curl-tool_vms.$(OBJEXT) curl-tool_writeout.$(OBJEXT) \
-       curl-tool_xattr.$(OBJEXT)
+       curl-tool_parsecfg.$(OBJEXT) curl-tool_progress.$(OBJEXT) \
+       curl-tool_strdup.$(OBJEXT) curl-tool_setopt.$(OBJEXT) \
+       curl-tool_sleep.$(OBJEXT) curl-tool_urlglob.$(OBJEXT) \
+       curl-tool_util.$(OBJEXT) curl-tool_vms.$(OBJEXT) \
+       curl-tool_writeout.$(OBJEXT) curl-tool_xattr.$(OBJEXT)
 am__objects_7 = ../lib/curl-strtoofft.$(OBJEXT) \
        ../lib/curl-nonblock.$(OBJEXT) ../lib/curl-warnless.$(OBJEXT) \
        ../lib/curl-curl_ctype.$(OBJEXT)
@@ -277,6 +277,7 @@ am__depfiles_remade = ../lib/$(DEPDIR)/curl-curl_ctype.Po \
        ./$(DEPDIR)/curl-tool_panykey.Po \
        ./$(DEPDIR)/curl-tool_paramhlp.Po \
        ./$(DEPDIR)/curl-tool_parsecfg.Po \
+       ./$(DEPDIR)/curl-tool_progress.Po \
        ./$(DEPDIR)/curl-tool_setopt.Po ./$(DEPDIR)/curl-tool_sleep.Po \
        ./$(DEPDIR)/curl-tool_strdup.Po \
        ./$(DEPDIR)/curl-tool_urlglob.Po ./$(DEPDIR)/curl-tool_util.Po \
@@ -313,6 +314,7 @@ am__depfiles_remade = ../lib/$(DEPDIR)/curl-curl_ctype.Po \
        ./$(DEPDIR)/libcurltool_la-tool_panykey.Plo \
        ./$(DEPDIR)/libcurltool_la-tool_paramhlp.Plo \
        ./$(DEPDIR)/libcurltool_la-tool_parsecfg.Plo \
+       ./$(DEPDIR)/libcurltool_la-tool_progress.Plo \
        ./$(DEPDIR)/libcurltool_la-tool_setopt.Plo \
        ./$(DEPDIR)/libcurltool_la-tool_sleep.Plo \
        ./$(DEPDIR)/libcurltool_la-tool_strdup.Plo \
@@ -426,14 +428,8 @@ CC = @CC@
 CCDEPMODE = @CCDEPMODE@
 
 # This might hold -Werror
-CFLAGS = @CFLAGS@ @CURL_CFLAG_EXTRAS@ $(CODE_COVERAGE_CFLAGS)
+CFLAGS = @CFLAGS@ @CURL_CFLAG_EXTRAS@
 CFLAG_CURL_SYMBOL_HIDING = @CFLAG_CURL_SYMBOL_HIDING@
-CODE_COVERAGE_CFLAGS = @CODE_COVERAGE_CFLAGS@
-CODE_COVERAGE_CPPFLAGS = @CODE_COVERAGE_CPPFLAGS@
-CODE_COVERAGE_CXXFLAGS = @CODE_COVERAGE_CXXFLAGS@
-CODE_COVERAGE_ENABLED = @CODE_COVERAGE_ENABLED@
-CODE_COVERAGE_LDFLAGS = @CODE_COVERAGE_LDFLAGS@
-CODE_COVERAGE_LIBS = @CODE_COVERAGE_LIBS@
 CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
@@ -475,14 +471,15 @@ ENABLE_SHARED = @ENABLE_SHARED@
 ENABLE_STATIC = @ENABLE_STATIC@
 EXEEXT = @EXEEXT@
 FGREP = @FGREP@
+FISH_FUNCTIONS_DIR = @FISH_FUNCTIONS_DIR@
 GCOV = @GCOV@
-GENHTML = @GENHTML@
 GREP = @GREP@
 HAVE_BROTLI = @HAVE_BROTLI@
 HAVE_GNUTLS_SRP = @HAVE_GNUTLS_SRP@
 HAVE_LDAP_SSL = @HAVE_LDAP_SSL@
 HAVE_LIBZ = @HAVE_LIBZ@
 HAVE_OPENSSL_SRP = @HAVE_OPENSSL_SRP@
+HAVE_PROTO_BSDSOCKET_H = @HAVE_PROTO_BSDSOCKET_H@
 IDN_ENABLED = @IDN_ENABLED@
 INSTALL = @INSTALL@
 INSTALL_DATA = @INSTALL_DATA@
@@ -547,9 +544,7 @@ STRIP = @STRIP@
 SUPPORT_FEATURES = @SUPPORT_FEATURES@
 SUPPORT_PROTOCOLS = @SUPPORT_PROTOCOLS@
 USE_ARES = @USE_ARES@
-USE_AXTLS = @USE_AXTLS@
-USE_CYASSL = @USE_CYASSL@
-USE_DARWINSSL = @USE_DARWINSSL@
+USE_BEARSSL = @USE_BEARSSL@
 USE_GNUTLS = @USE_GNUTLS@
 USE_GNUTLS_NETTLE = @USE_GNUTLS_NETTLE@
 USE_LIBRTMP = @USE_LIBRTMP@
@@ -558,12 +553,17 @@ USE_LIBSSH2 = @USE_LIBSSH2@
 USE_MBEDTLS = @USE_MBEDTLS@
 USE_MESALINK = @USE_MESALINK@
 USE_NGHTTP2 = @USE_NGHTTP2@
+USE_NGHTTP3 = @USE_NGHTTP3@
+USE_NGTCP2 = @USE_NGTCP2@
+USE_NGTCP2_CRYPTO_OPENSSL = @USE_NGTCP2_CRYPTO_OPENSSL@
 USE_NSS = @USE_NSS@
 USE_OPENLDAP = @USE_OPENLDAP@
-USE_POLARSSL = @USE_POLARSSL@
+USE_QUICHE = @USE_QUICHE@
 USE_SCHANNEL = @USE_SCHANNEL@
+USE_SECTRANSP = @USE_SECTRANSP@
 USE_UNIX_SOCKETS = @USE_UNIX_SOCKETS@
 USE_WINDOWS_SSPI = @USE_WINDOWS_SSPI@
+USE_WOLFSSL = @USE_WOLFSSL@
 VERSION = @VERSION@
 VERSIONNUM = @VERSIONNUM@
 ZLIB_LIBS = @ZLIB_LIBS@
@@ -631,7 +631,7 @@ top_srcdir = @top_srcdir@
 #                            | (__| |_| |  _ <| |___
 #                             \___|\___/|_| \_\_____|
 #
-# Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 #
 # This software is licensed as described in the file COPYING, which
 # you should have received as part of this distribution. The terms
@@ -709,6 +709,7 @@ CURL_CFILES = \
   tool_panykey.c \
   tool_paramhlp.c \
   tool_parsecfg.c \
+  tool_progress.c \
   tool_strdup.c \
   tool_setopt.c \
   tool_sleep.c \
@@ -750,6 +751,7 @@ CURL_HFILES = \
   tool_panykey.h \
   tool_paramhlp.h \
   tool_parsecfg.h \
+  tool_progress.h \
   tool_sdecls.h \
   tool_setopt.h \
   tool_setup.h \
@@ -771,7 +773,7 @@ CURL_FILES = $(CURL_CFILES) $(CURLX_CFILES) $(CURL_HFILES)
 curl_SOURCES = $(CURL_FILES)
 @USE_EXPLICIT_LIB_DEPS_FALSE@curl_LDADD = $(top_builddir)/lib/libcurl.la @LIBMETALINK_LIBS@ @NSS_LIBS@ @SSL_LIBS@ @ZLIB_LIBS@ @CURL_NETWORK_AND_TIME_LIBS@
 @USE_EXPLICIT_LIB_DEPS_TRUE@curl_LDADD = $(top_builddir)/lib/libcurl.la @LIBMETALINK_LIBS@ @LIBCURL_LIBS@
-curl_LDFLAGS = @LIBMETALINK_LDFLAGS@ $(CODE_COVERAGE_LDFLAGS)
+curl_LDFLAGS = @LIBMETALINK_LDFLAGS@
 curl_CPPFLAGS = $(AM_CPPFLAGS) $(LIBMETALINK_CPPFLAGS)
 
 # if unit tests are enabled, build a static library to link them with
@@ -791,9 +793,16 @@ EXTRA_DIST = mkhelp.pl makefile.dj                                     \
 
 # Use absolute directory to disable VPATH
 MANPAGE = $(abs_top_builddir)/docs/curl.1
-README = $(top_srcdir)/docs/MANUAL
 MKHELP = $(top_srcdir)/src/mkhelp.pl
 HUGE = tool_hugehelp.c
+HUGECMD = $(HUGEIT_$(V))
+HUGEIT_0 = @echo "  HUGE    " $@;
+HUGEIT_1 = 
+HUGEIT_ = $(HUGEIT_0)
+CHECKSRC = $(CS_$(V))
+CS_0 = @echo "  RUN     " $@;
+CS_1 = 
+CS_ = $(CS_0)
 
 # disable the tests that are mostly causing false positives
 TIDYFLAGS = -checks=-clang-analyzer-security.insecureAPI.strcpy,-clang-analyzer-optin.performance.Padding,-clang-analyzer-valist.Uninitialized,-clang-analyzer-core.NonNullParamChecker,-clang-analyzer-core.NullDereference
@@ -969,6 +978,7 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/curl-tool_panykey.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/curl-tool_paramhlp.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/curl-tool_parsecfg.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/curl-tool_progress.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/curl-tool_setopt.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/curl-tool_sleep.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/curl-tool_strdup.Po@am__quote@ # am--include-marker
@@ -1008,6 +1018,7 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurltool_la-tool_panykey.Plo@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurltool_la-tool_paramhlp.Plo@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurltool_la-tool_parsecfg.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurltool_la-tool_progress.Plo@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurltool_la-tool_setopt.Plo@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurltool_la-tool_sleep.Plo@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurltool_la-tool_strdup.Plo@am__quote@ # am--include-marker
@@ -1264,6 +1275,13 @@ libcurltool_la-tool_parsecfg.lo: tool_parsecfg.c
 @AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurltool_la_CPPFLAGS) $(CPPFLAGS) $(libcurltool_la_CFLAGS) $(CFLAGS) -c -o libcurltool_la-tool_parsecfg.lo `test -f 'tool_parsecfg.c' || echo '$(srcdir)/'`tool_parsecfg.c
 
+libcurltool_la-tool_progress.lo: tool_progress.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurltool_la_CPPFLAGS) $(CPPFLAGS) $(libcurltool_la_CFLAGS) $(CFLAGS) -MT libcurltool_la-tool_progress.lo -MD -MP -MF $(DEPDIR)/libcurltool_la-tool_progress.Tpo -c -o libcurltool_la-tool_progress.lo `test -f 'tool_progress.c' || echo '$(srcdir)/'`tool_progress.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/libcurltool_la-tool_progress.Tpo $(DEPDIR)/libcurltool_la-tool_progress.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='tool_progress.c' object='libcurltool_la-tool_progress.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurltool_la_CPPFLAGS) $(CPPFLAGS) $(libcurltool_la_CFLAGS) $(CFLAGS) -c -o libcurltool_la-tool_progress.lo `test -f 'tool_progress.c' || echo '$(srcdir)/'`tool_progress.c
+
 libcurltool_la-tool_strdup.lo: tool_strdup.c
 @am__fastdepCC_TRUE@   $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurltool_la_CPPFLAGS) $(CPPFLAGS) $(libcurltool_la_CFLAGS) $(CFLAGS) -MT libcurltool_la-tool_strdup.lo -MD -MP -MF $(DEPDIR)/libcurltool_la-tool_strdup.Tpo -c -o libcurltool_la-tool_strdup.lo `test -f 'tool_strdup.c' || echo '$(srcdir)/'`tool_strdup.c
 @am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/libcurltool_la-tool_strdup.Tpo $(DEPDIR)/libcurltool_la-tool_strdup.Plo
@@ -1782,6 +1800,20 @@ curl-tool_parsecfg.obj: tool_parsecfg.c
 @AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(curl_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o curl-tool_parsecfg.obj `if test -f 'tool_parsecfg.c'; then $(CYGPATH_W) 'tool_parsecfg.c'; else $(CYGPATH_W) '$(srcdir)/tool_parsecfg.c'; fi`
 
+curl-tool_progress.o: tool_progress.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(curl_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT curl-tool_progress.o -MD -MP -MF $(DEPDIR)/curl-tool_progress.Tpo -c -o curl-tool_progress.o `test -f 'tool_progress.c' || echo '$(srcdir)/'`tool_progress.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/curl-tool_progress.Tpo $(DEPDIR)/curl-tool_progress.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='tool_progress.c' object='curl-tool_progress.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(curl_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o curl-tool_progress.o `test -f 'tool_progress.c' || echo '$(srcdir)/'`tool_progress.c
+
+curl-tool_progress.obj: tool_progress.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(curl_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT curl-tool_progress.obj -MD -MP -MF $(DEPDIR)/curl-tool_progress.Tpo -c -o curl-tool_progress.obj `if test -f 'tool_progress.c'; then $(CYGPATH_W) 'tool_progress.c'; else $(CYGPATH_W) '$(srcdir)/tool_progress.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/curl-tool_progress.Tpo $(DEPDIR)/curl-tool_progress.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='tool_progress.c' object='curl-tool_progress.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(curl_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o curl-tool_progress.obj `if test -f 'tool_progress.c'; then $(CYGPATH_W) 'tool_progress.c'; else $(CYGPATH_W) '$(srcdir)/tool_progress.c'; fi`
+
 curl-tool_strdup.o: tool_strdup.c
 @am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(curl_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT curl-tool_strdup.o -MD -MP -MF $(DEPDIR)/curl-tool_strdup.Tpo -c -o curl-tool_strdup.o `test -f 'tool_strdup.c' || echo '$(srcdir)/'`tool_strdup.c
 @am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/curl-tool_strdup.Tpo $(DEPDIR)/curl-tool_strdup.Po
@@ -2201,6 +2233,7 @@ distclean: distclean-recursive
        -rm -f ./$(DEPDIR)/curl-tool_panykey.Po
        -rm -f ./$(DEPDIR)/curl-tool_paramhlp.Po
        -rm -f ./$(DEPDIR)/curl-tool_parsecfg.Po
+       -rm -f ./$(DEPDIR)/curl-tool_progress.Po
        -rm -f ./$(DEPDIR)/curl-tool_setopt.Po
        -rm -f ./$(DEPDIR)/curl-tool_sleep.Po
        -rm -f ./$(DEPDIR)/curl-tool_strdup.Po
@@ -2240,6 +2273,7 @@ distclean: distclean-recursive
        -rm -f ./$(DEPDIR)/libcurltool_la-tool_panykey.Plo
        -rm -f ./$(DEPDIR)/libcurltool_la-tool_paramhlp.Plo
        -rm -f ./$(DEPDIR)/libcurltool_la-tool_parsecfg.Plo
+       -rm -f ./$(DEPDIR)/libcurltool_la-tool_progress.Plo
        -rm -f ./$(DEPDIR)/libcurltool_la-tool_setopt.Plo
        -rm -f ./$(DEPDIR)/libcurltool_la-tool_sleep.Plo
        -rm -f ./$(DEPDIR)/libcurltool_la-tool_strdup.Plo
@@ -2332,6 +2366,7 @@ maintainer-clean: maintainer-clean-recursive
        -rm -f ./$(DEPDIR)/curl-tool_panykey.Po
        -rm -f ./$(DEPDIR)/curl-tool_paramhlp.Po
        -rm -f ./$(DEPDIR)/curl-tool_parsecfg.Po
+       -rm -f ./$(DEPDIR)/curl-tool_progress.Po
        -rm -f ./$(DEPDIR)/curl-tool_setopt.Po
        -rm -f ./$(DEPDIR)/curl-tool_sleep.Po
        -rm -f ./$(DEPDIR)/curl-tool_strdup.Po
@@ -2371,6 +2406,7 @@ maintainer-clean: maintainer-clean-recursive
        -rm -f ./$(DEPDIR)/libcurltool_la-tool_panykey.Plo
        -rm -f ./$(DEPDIR)/libcurltool_la-tool_paramhlp.Plo
        -rm -f ./$(DEPDIR)/libcurltool_la-tool_parsecfg.Plo
+       -rm -f ./$(DEPDIR)/libcurltool_la-tool_progress.Plo
        -rm -f ./$(DEPDIR)/libcurltool_la-tool_setopt.Plo
        -rm -f ./$(DEPDIR)/libcurltool_la-tool_sleep.Plo
        -rm -f ./$(DEPDIR)/libcurltool_la-tool_strdup.Plo
@@ -2421,8 +2457,6 @@ uninstall-am: uninstall-binPROGRAMS
 # remove targets if the command fails
 .DELETE_ON_ERROR:
 
-@CODE_COVERAGE_RULES@
-
 # Here are the stuff to create a built-in manual
 
 @USE_MANUAL_TRUE@$(MANPAGE):
@@ -2430,35 +2464,35 @@ uninstall-am: uninstall-binPROGRAMS
 
 # This generates the tool_hugehelp.c file in both uncompressed and
 # compressed formats.
-@HAVE_LIBZ_TRUE@@USE_MANUAL_TRUE@$(HUGE): $(MANPAGE) $(README) $(MKHELP)
-@HAVE_LIBZ_TRUE@@USE_MANUAL_TRUE@      echo '#include "tool_setup.h"' > $(HUGE)
-@HAVE_LIBZ_TRUE@@USE_MANUAL_TRUE@      echo '#ifndef HAVE_LIBZ' >> $(HUGE)
-@HAVE_LIBZ_TRUE@@USE_MANUAL_TRUE@      $(NROFF) $(MANPAGE) | $(PERL) $(MKHELP) $(README) >> $(HUGE)
-@HAVE_LIBZ_TRUE@@USE_MANUAL_TRUE@      echo '#else' >> $(HUGE)
-@HAVE_LIBZ_TRUE@@USE_MANUAL_TRUE@      $(NROFF) $(MANPAGE) | $(PERL) $(MKHELP) -c $(README) >> $(HUGE)
-@HAVE_LIBZ_TRUE@@USE_MANUAL_TRUE@      echo '#endif /* HAVE_LIBZ */' >> $(HUGE)
+@HAVE_LIBZ_TRUE@@USE_MANUAL_TRUE@$(HUGE): $(MANPAGE) $(MKHELP)
+@HAVE_LIBZ_TRUE@@USE_MANUAL_TRUE@      $(HUGECMD) (echo '#include "tool_setup.h"' > $(HUGE);   \
+@HAVE_LIBZ_TRUE@@USE_MANUAL_TRUE@      echo '#ifndef HAVE_LIBZ' >> $(HUGE);                    \
+@HAVE_LIBZ_TRUE@@USE_MANUAL_TRUE@      $(NROFF) $(MANPAGE) | $(PERL) $(MKHELP) >> $(HUGE);     \
+@HAVE_LIBZ_TRUE@@USE_MANUAL_TRUE@      echo '#else' >> $(HUGE);                                \
+@HAVE_LIBZ_TRUE@@USE_MANUAL_TRUE@      $(NROFF) $(MANPAGE) | $(PERL) $(MKHELP) -c >> $(HUGE);  \
+@HAVE_LIBZ_TRUE@@USE_MANUAL_TRUE@      echo '#endif /* HAVE_LIBZ */' >> $(HUGE) )
 # This generates the tool_hugehelp.c file uncompressed only
-@HAVE_LIBZ_FALSE@@USE_MANUAL_TRUE@$(HUGE): $(MANPAGE) $(README) $(MKHELP)
-@HAVE_LIBZ_FALSE@@USE_MANUAL_TRUE@     echo '#include "tool_setup.h"' > $(HUGE)
-@HAVE_LIBZ_FALSE@@USE_MANUAL_TRUE@     $(NROFF) $(MANPAGE) | $(PERL) $(MKHELP) $(README) >> $(HUGE)
+@HAVE_LIBZ_FALSE@@USE_MANUAL_TRUE@$(HUGE): $(MANPAGE) $(MKHELP)
+@HAVE_LIBZ_FALSE@@USE_MANUAL_TRUE@     $(HUGECMD)(echo '#include "tool_setup.h"' > $(HUGE);    \
+@HAVE_LIBZ_FALSE@@USE_MANUAL_TRUE@     $(NROFF) $(MANPAGE) | $(PERL) $(MKHELP) >> $(HUGE) )
 
 # built-in manual has been disabled, make a blank file
 @USE_MANUAL_FALSE@$(HUGE):
-@USE_MANUAL_FALSE@     echo "/* built-in manual is disabled, blank function */" > $(HUGE)
-@USE_MANUAL_FALSE@     echo '#include "tool_hugehelp.h"' >> $(HUGE)
-@USE_MANUAL_FALSE@     echo "void hugehelp(void) {}" >>$(HUGE)
+@USE_MANUAL_FALSE@     $(HUGECMD)(echo "/* built-in manual is disabled, blank function */" > $(HUGE); \
+@USE_MANUAL_FALSE@     echo '#include "tool_hugehelp.h"' >> $(HUGE); \
+@USE_MANUAL_FALSE@     echo "void hugehelp(void) {}" >>$(HUGE) )
 
 # ignore tool_hugehelp.c since it is generated source code and it plays
 # by slightly different rules!
 checksrc:
-       @PERL@ $(top_srcdir)/lib/checksrc.pl -D$(srcdir)        \
-       -W$(srcdir)/tool_hugehelp.c $(srcdir)/*.[ch]
+       $(CHECKSRC)(@PERL@ $(top_srcdir)/lib/checksrc.pl -D$(srcdir)        \
+       -W$(srcdir)/tool_hugehelp.c $(srcdir)/*.[ch])
 
 # for debug builds, we scan the sources on all regular make invokes
 @CURLDEBUG_TRUE@all-local: checksrc
 
 tidy:
-       $(TIDY) $(CURL_CFILES) $(TIDYFLAGS) -- $(AM_CPPFLAGS) $(CPPFLAGS) -DHAVE_CONFIG_H
+       $(TIDY) $(CURL_CFILES) $(TIDYFLAGS) -- $(curl_CPPFLAGS) $(CPPFLAGS) -DHAVE_CONFIG_H
 
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
index e1e8306..dd6b9d3 100644 (file)
@@ -54,6 +54,7 @@ CURL_CFILES = \
   tool_panykey.c \
   tool_paramhlp.c \
   tool_parsecfg.c \
+  tool_progress.c \
   tool_strdup.c \
   tool_setopt.c \
   tool_sleep.c \
@@ -95,6 +96,7 @@ CURL_HFILES = \
   tool_panykey.h \
   tool_paramhlp.h \
   tool_parsecfg.h \
+  tool_progress.h \
   tool_sdecls.h \
   tool_setopt.h \
   tool_setup.h \
index 7f58bcd..20d9807 100644 (file)
@@ -6,7 +6,7 @@
 #                             \___|\___/|_| \_\_____|
 #
 # Copyright (C) 2004 - 2014, Guenter Knauf
-# Copyright (C) 2001 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 2001 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
 #
 # This software is licensed as described in the file COPYING, which
 # you should have received as part of this distribution. The terms
@@ -49,11 +49,6 @@ ifndef LIBSSH2_PATH
 LIBSSH2_PATH = ../../libssh2-1.5.0
 endif
 
-# Edit the path below to point to the base of your axTLS package.
-ifndef AXTLS_PATH
-AXTLS_PATH = ../../axTLS-1.2.7
-endif
-
 # Edit the path below to point to the base of your libidn package.
 ifndef LIBIDN_PATH
 LIBIDN_PATH = ../../libidn-1.18
@@ -239,14 +234,9 @@ WITH_SSH2 = 1
 WITH_SSL = 1
 WITH_ZLIB = 1
 endif
-ifeq ($(findstring -axtls,$(CFG)),-axtls)
-WITH_AXTLS = 1
-WITH_SSL =
-else
 ifeq ($(findstring -ssl,$(CFG)),-ssl)
 WITH_SSL = 1
 endif
-endif
 ifeq ($(findstring -zlib,$(CFG)),-zlib)
 WITH_ZLIB = 1
 endif
@@ -293,16 +283,6 @@ ifdef WITH_SSL
   LDLIBS += $(OPENSSL_PATH)/out_nw_$(LIBARCH_L)/ssl.$(LIBEXT)
   LDLIBS += $(OPENSSL_PATH)/out_nw_$(LIBARCH_L)/crypto.$(LIBEXT)
   IMPORTS += GetProcessSwitchCount RunningProcess
-else
-ifdef WITH_AXTLS
-  # INCLUDES += -I$(AXTLS_PATH)/inc
-  ifdef LINK_STATIC
-    LDLIBS += $(AXTLS_PATH)/lib/libaxtls.$(LIBEXT)
-  else
-    MODULES += libaxtls.nlm
-    IMPORTS += $(AXTLS_PATH)/lib/libaxtls.imp
-  endif
-endif
 endif
 ifdef WITH_ZLIB
   INCLUDES += -I$(ZLIB_PATH)
index d47f506..4dac2ae 100644 (file)
 #include <winver.h>
 #include "tool_version.h"
 
-LANGUAGE  0x09,0x01
+LANGUAGE  0, 0
 
 #define RC_VERSION  CURL_VERSION_MAJOR, CURL_VERSION_MINOR, CURL_VERSION_PATCH, 0
 
 VS_VERSION_INFO VERSIONINFO
   FILEVERSION     RC_VERSION
   PRODUCTVERSION  RC_VERSION
-  FILEFLAGSMASK   0x3fL
+  FILEFLAGSMASK   VS_FFI_FILEFLAGSMASK
 #if defined(DEBUGBUILD) || defined(_DEBUG)
-  FILEFLAGS 1
+  FILEFLAGS VS_FF_DEBUG
 #else
-  FILEFLAGS 0
+  FILEFLAGS 0L
 #endif
   FILEOS      VOS__WINDOWS32
   FILETYPE    VFT_APP
-  FILESUBTYPE 0x0L
+  FILESUBTYPE 0L
 
 BEGIN
   BLOCK "StringFileInfo"
index 757f024..5e62b4e 100755 (executable)
@@ -6,7 +6,7 @@
 #                            | (__| |_| |  _ <| |___
 #                             \___|\___/|_| \_\_____|
 #
-# Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 #
 # This software is licensed as described in the file COPYING, which
 # you should have received as part of this distribution. The terms
@@ -33,14 +33,6 @@ if($ARGV[0] eq "-c") {
     shift @ARGV;
 }
 
-my $README = $ARGV[0];
-
-if($README eq "") {
-    print "usage: mkhelp.pl [-c] <README> < manpage\n";
-    exit;
-}
-
-
 push @out, "                                  _   _ ____  _\n";
 push @out, "  Project                     ___| | | |  _ \\| |\n";
 push @out, "                             / __| | | | |_) | |\n";
@@ -89,19 +81,6 @@ while (<STDIN>) {
 }
 push @out, "\n"; # just an extra newline
 
-open(READ, "<$README") ||
-    die "couldn't read the README infile $README";
-
-while(<READ>) {
-    my $line = $_;
-
-    # remove trailing CR from line. msysgit checks out files as line+CRLF
-    $line =~ s/\r$//;
-
-    push @out, $line;
-}
-close(READ);
-
 print <<HEAD
 /*
  * NEVER EVER edit this manually, fix the mkhelp.pl script instead!
index 5233b1b..da25632 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
index 9bd6993..54f871b 100644 (file)
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
index f700156..b88a0fd 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
index 07b7ffe..1ff0f76 100644 (file)
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
index 761192f..6014c6b 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
index 66e7c17..dfde589 100644 (file)
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
index a3e0339..bb8c263 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -66,8 +66,8 @@ int tool_debug_cb(CURL *handle, curl_infotype type,
     }
     secs = epoch_offset + tv.tv_sec;
     now = localtime(&secs);  /* not thread safe but we don't care */
-    snprintf(timebuf, sizeof(timebuf), "%02d:%02d:%02d.%06ld ",
-             now->tm_hour, now->tm_min, now->tm_sec, (long)tv.tv_usec);
+    msnprintf(timebuf, sizeof(timebuf), "%02d:%02d:%02d.%06ld ",
+              now->tm_hour, now->tm_min, now->tm_sec, (long)tv.tv_usec);
   }
   else
     timebuf[0] = 0;
index 433e746..8883bb1 100644 (file)
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
index 7a7a836..77224ad 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -32,6 +32,7 @@
 #include "tool_msgs.h"
 #include "tool_cb_hdr.h"
 #include "tool_cb_wrt.h"
+#include "tool_operate.h"
 
 #include "memdebug.h" /* keep this as LAST include */
 
@@ -54,9 +55,11 @@ static char *parse_filename(const char *ptr, size_t len);
 
 size_t tool_header_cb(char *ptr, size_t size, size_t nmemb, void *userdata)
 {
-  struct HdrCbData *hdrcbdata = userdata;
-  struct OutStruct *outs = hdrcbdata->outs;
-  struct OutStruct *heads = hdrcbdata->heads;
+  struct per_transfer *per = userdata;
+  struct HdrCbData *hdrcbdata = &per->hdrcbdata;
+  struct OutStruct *outs = &per->outs;
+  struct OutStruct *heads = &per->heads;
+  struct OutStruct *etag_save = &per->etag_save;
   const char *str = ptr;
   const size_t cb = size * nmemb;
   const char *end = (char *)ptr + cb;
@@ -94,13 +97,66 @@ size_t tool_header_cb(char *ptr, size_t size, size_t nmemb, void *userdata)
   }
 
   /*
+   * Write etag to file when --etag-save option is given.
+   * etag string that we want is enveloped in double quotes
+   */
+  if(etag_save->config->etag_save_file && etag_save->stream) {
+    /* match only header that start with etag (case insensitive) */
+    if(curl_strnequal(str, "etag:", 5)) {
+      char *etag_h = NULL;
+      char *first = NULL;
+      char *last = NULL;
+      size_t etag_length = 0;
+
+      etag_h = ptr;
+      /* point to first occurence of double quote */
+      first = memchr(etag_h, '\"', cb);
+
+      /*
+       * if server side messed with the etag header and doesn't include
+       * double quotes around the etag, kindly exit with a warning
+       */
+
+      if(!first) {
+        warnf(
+          etag_save->config->global,
+          "\nReceived header etag is missing double quote/s\n");
+        return 1;
+      }
+      else {
+        /* discard first double quote */
+        first++;
+      }
+
+      /* point to last occurence of double quote */
+      last = memchr(first, '\"', cb);
+
+      if(!last) {
+        warnf(
+          etag_save->config->global,
+          "\nReceived header etag is missing double quote/s\n");
+        return 1;
+      }
+
+      /* get length of desired etag */
+      etag_length = (size_t)last - (size_t)first;
+
+      fwrite(first, size, etag_length, etag_save->stream);
+      /* terminate with new line */
+      fputc('\n', etag_save->stream);
+    }
+
+    (void)fflush(etag_save->stream);
+  }
+
+  /*
    * This callback sets the filename where output shall be written when
    * curl options --remote-name (-O) and --remote-header-name (-J) have
    * been simultaneously given and additionally server returns an HTTP
    * Content-Disposition header specifying a filename property.
    */
 
-  curl_easy_getinfo(outs->config->easy, CURLINFO_PROTOCOL, &protocol);
+  curl_easy_getinfo(per->curl, CURLINFO_PROTOCOL, &protocol);
   if(hdrcbdata->honor_cd_filename &&
      (cb > 20) && checkprefix("Content-disposition:", str) &&
      (protocol & (CURLPROTO_HTTPS|CURLPROTO_HTTP))) {
@@ -157,12 +213,12 @@ size_t tool_header_cb(char *ptr, size_t size, size_t nmemb, void *userdata)
         outs->filename = filename;
         outs->alloc_filename = TRUE;
         hdrcbdata->honor_cd_filename = FALSE; /* done now! */
-        if(!tool_create_output_file(outs, TRUE))
+        if(!tool_create_output_file(outs))
           return failure;
       }
       break;
     }
-    if(!outs->stream && !tool_create_output_file(outs, FALSE))
+    if(!outs->stream && !tool_create_output_file(outs))
       return failure;
   }
 
@@ -172,7 +228,7 @@ size_t tool_header_cb(char *ptr, size_t size, size_t nmemb, void *userdata)
     /* bold headers only for selected protocols */
     char *value = NULL;
 
-    if(!outs->stream && !tool_create_output_file(outs, FALSE))
+    if(!outs->stream && !tool_create_output_file(outs))
       return failure;
 
     if(hdrcbdata->global->isatty && hdrcbdata->global->styled_output)
@@ -274,7 +330,7 @@ static char *parse_filename(const char *ptr, size_t len)
     char *tdir = curlx_getenv("CURL_TESTDIR");
     if(tdir) {
       char buffer[512]; /* suitably large */
-      snprintf(buffer, sizeof(buffer), "%s/%s", tdir, copy);
+      msnprintf(buffer, sizeof(buffer), "%s/%s", tdir, copy);
       Curl_safefree(copy);
       copy = strdup(buffer); /* clone the buffer, we don't use the libcurl
                                 aprintf() or similar since we want to use the
index cf544df..ec5772f 100644 (file)
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -43,6 +43,7 @@ struct HdrCbData {
   struct OperationConfig *config;
   struct OutStruct *outs;
   struct OutStruct *heads;
+  struct OutStruct *etag_save;
   bool honor_cd_filename;
 };
 
index 3eb2c12..505ae75 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -32,6 +32,7 @@
 #include "tool_cfgable.h"
 #include "tool_cb_prg.h"
 #include "tool_util.h"
+#include "tool_operate.h"
 
 #include "memdebug.h" /* keep this as LAST include */
 
@@ -72,7 +73,7 @@ static void fly(struct ProgressData *bar, bool moved)
   int pos;
   int check = bar->width - 2;
 
-  snprintf(buf, sizeof(buf), "%*s\r", bar->width-1, " ");
+  msnprintf(buf, sizeof(buf), "%*s\r", bar->width-1, " ");
   memcpy(&buf[bar->bar], "-=O=-", 5);
 
   pos = sinus[bar->tick%200] / (10000 / check);
@@ -106,6 +107,13 @@ static void fly(struct ProgressData *bar, bool moved)
 
 #define MAX_BARLENGTH 256
 
+#if (SIZEOF_CURL_OFF_T == 4)
+#  define CURL_OFF_T_MAX CURL_OFF_T_C(0x7FFFFFFF)
+#else
+   /* assume CURL_SIZEOF_CURL_OFF_T == 8 */
+#  define CURL_OFF_T_MAX CURL_OFF_T_C(0x7FFFFFFFFFFFFFFF)
+#endif
+
 int tool_progress_cb(void *clientp,
                      curl_off_t dltotal, curl_off_t dlnow,
                      curl_off_t ultotal, curl_off_t ulnow)
@@ -114,15 +122,29 @@ int tool_progress_cb(void *clientp,
      and this new edition inherits some of his concepts. */
 
   struct timeval now = tvnow();
-  struct ProgressData *bar = (struct ProgressData *)clientp;
+  struct per_transfer *per = clientp;
+  struct OutStruct *outs = &per->outs;
+  struct OperationConfig *config = outs->config;
+  struct ProgressData *bar = &per->progressbar;
   curl_off_t total;
   curl_off_t point;
 
-  /* expected transfer size */
-  total = dltotal + ultotal + bar->initial_size;
+  /* Calculate expected transfer size. initial_size can be less than zero
+     when indicating that we are expecting to get the filesize from the
+     remote */
+  if(bar->initial_size < 0 ||
+     ((CURL_OFF_T_MAX - bar->initial_size) < (dltotal + ultotal)))
+    total = CURL_OFF_T_MAX;
+  else
+    total = dltotal + ultotal + bar->initial_size;
 
-  /* we've come this far */
-  point = dlnow + ulnow + bar->initial_size;
+  /* Calculate the current progress. initial_size can be less than zero when
+     indicating that we are expecting to get the filesize from the remote */
+  if(bar->initial_size < 0 ||
+     ((CURL_OFF_T_MAX - bar->initial_size) < (dlnow + ulnow)))
+    point = CURL_OFF_T_MAX;
+  else
+    point = dlnow + ulnow + bar->initial_size;
 
   if(bar->calls) {
     /* after first call... */
@@ -166,13 +188,18 @@ int tool_progress_cb(void *clientp,
       num = MAX_BARLENGTH;
     memset(line, '#', num);
     line[num] = '\0';
-    snprintf(format, sizeof(format), "\r%%-%ds %%5.1f%%%%", barwidth);
+    msnprintf(format, sizeof(format), "\r%%-%ds %%5.1f%%%%", barwidth);
     fprintf(bar->out, format, line, percent);
   }
   fflush(bar->out);
   bar->prev = point;
   bar->prevtime = now;
 
+  if(config->readbusy) {
+    config->readbusy = FALSE;
+    curl_easy_pause(per->curl, CURLPAUSE_CONT);
+  }
+
   return 0;
 }
 
@@ -192,7 +219,8 @@ void progressbarinit(struct ProgressData *bar,
   if(colp) {
     char *endptr;
     long num = strtol(colp, &endptr, 10);
-    if((endptr != colp) && (endptr == colp + strlen(colp)) && (num > 20))
+    if((endptr != colp) && (endptr == colp + strlen(colp)) && (num > 20) &&
+       (num < 10000))
       bar->width = (int)num;
     curl_free(colp);
   }
@@ -208,7 +236,7 @@ void progressbarinit(struct ProgressData *bar,
     struct winsize ts;
     if(!ioctl(STDIN_FILENO, TIOCGWINSZ, &ts))
       cols = ts.ws_col;
-#elif defined(_WIN32)
+#elif defined(WIN32)
     {
       HANDLE  stderr_hnd = GetStdHandle(STD_ERROR_HANDLE);
       CONSOLE_SCREEN_BUFFER_INFO console_info;
index 8a33c84..03ed4a4 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -27,6 +27,7 @@
 
 #include "tool_cfgable.h"
 #include "tool_cb_rea.h"
+#include "tool_operate.h"
 
 #include "memdebug.h" /* keep this as LAST include */
 
@@ -52,3 +53,28 @@ size_t tool_read_cb(void *buffer, size_t sz, size_t nmemb, void *userdata)
   in->config->readbusy = FALSE;
   return (size_t)rc;
 }
+
+/*
+** callback for CURLOPT_XFERINFOFUNCTION used to unpause busy reads
+*/
+
+int tool_readbusy_cb(void *clientp,
+                     curl_off_t dltotal, curl_off_t dlnow,
+                     curl_off_t ultotal, curl_off_t ulnow)
+{
+  struct per_transfer *per = clientp;
+  struct OutStruct *outs = &per->outs;
+  struct OperationConfig *config = outs->config;
+
+  (void)dltotal;  /* unused */
+  (void)dlnow;  /* unused */
+  (void)ultotal;  /* unused */
+  (void)ulnow;  /* unused */
+
+  if(config->readbusy) {
+    config->readbusy = FALSE;
+    curl_easy_pause(per->curl, CURLPAUSE_CONT);
+  }
+
+  return per->noprogress? 0 : CURL_PROGRESSFUNC_CONTINUE;
+}
index 475f0b1..5f7e483 100644 (file)
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
 
 size_t tool_read_cb(void *buffer, size_t sz, size_t nmemb, void *userdata);
 
+/*
+** callback for CURLOPT_XFERINFOFUNCTION used to unpause busy reads
+*/
+
+int tool_readbusy_cb(void *clientp,
+                     curl_off_t dltotal, curl_off_t dlnow,
+                     curl_off_t ultotal, curl_off_t ulnow);
+
 #endif /* HEADER_CURL_TOOL_CB_REA_H */
index 891dc45..99be273 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
index ff8de0e..fed8bbf 100644 (file)
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
index 476fef9..0f47b4d 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
 #include "tool_cfgable.h"
 #include "tool_msgs.h"
 #include "tool_cb_wrt.h"
+#include "tool_operate.h"
 
 #include "memdebug.h" /* keep this as LAST include */
 
 /* create a local file for writing, return TRUE on success */
-bool tool_create_output_file(struct OutStruct *outs,
-                             bool append)
+bool tool_create_output_file(struct OutStruct *outs)
 {
   struct GlobalConfig *global = outs->config->global;
   FILE *file;
@@ -43,7 +43,7 @@ bool tool_create_output_file(struct OutStruct *outs,
     return FALSE;
   }
 
-  if(outs->is_cd_filename && !append) {
+  if(outs->is_cd_filename) {
     /* don't overwrite existing files */
     file = fopen(outs->filename, "rb");
     if(file) {
@@ -55,7 +55,7 @@ bool tool_create_output_file(struct OutStruct *outs,
   }
 
   /* open file for writing */
-  file = fopen(outs->filename, append?"ab":"wb");
+  file = fopen(outs->filename, "wb");
   if(!file) {
     warnf(global, "Failed to create the file %s: %s\n", outs->filename,
           strerror(errno));
@@ -76,10 +76,15 @@ bool tool_create_output_file(struct OutStruct *outs,
 size_t tool_write_cb(char *buffer, size_t sz, size_t nmemb, void *userdata)
 {
   size_t rc;
-  struct OutStruct *outs = userdata;
+  struct per_transfer *per = userdata;
+  struct OutStruct *outs = &per->outs;
   struct OperationConfig *config = outs->config;
   size_t bytes = sz * nmemb;
   bool is_tty = config->global->isatty;
+#ifdef WIN32
+  CONSOLE_SCREEN_BUFFER_INFO console_info;
+  intptr_t fhnd;
+#endif
 
   /*
    * Once that libcurl has called back tool_write_cb() the returned value
@@ -142,7 +147,7 @@ size_t tool_write_cb(char *buffer, size_t sz, size_t nmemb, void *userdata)
   }
 #endif
 
-  if(!outs->stream && !tool_create_output_file(outs, FALSE))
+  if(!outs->stream && !tool_create_output_file(outs))
     return failure;
 
   if(is_tty && (outs->bytes < 2000) && !config->terminal_binary_ok) {
@@ -156,7 +161,42 @@ size_t tool_write_cb(char *buffer, size_t sz, size_t nmemb, void *userdata)
     }
   }
 
-  rc = fwrite(buffer, sz, nmemb, outs->stream);
+#ifdef WIN32
+  fhnd = _get_osfhandle(fileno(outs->stream));
+  if(isatty(fileno(outs->stream)) &&
+     GetConsoleScreenBufferInfo((HANDLE)fhnd, &console_info)) {
+    DWORD in_len = (DWORD)(sz * nmemb);
+    wchar_t* wc_buf;
+    DWORD wc_len;
+
+    /* calculate buffer size for wide characters */
+    wc_len = MultiByteToWideChar(CP_UTF8, 0, buffer, in_len,  NULL, 0);
+    wc_buf = (wchar_t*) malloc(wc_len * sizeof(wchar_t));
+    if(!wc_buf)
+      return failure;
+
+    /* calculate buffer size for multi-byte characters */
+    wc_len = MultiByteToWideChar(CP_UTF8, 0, buffer, in_len, wc_buf, wc_len);
+    if(!wc_len) {
+      free(wc_buf);
+      return failure;
+    }
+
+    if(!WriteConsoleW(
+        (HANDLE) fhnd,
+        wc_buf,
+        wc_len,
+        &wc_len,
+        NULL)) {
+      free(wc_buf);
+      return failure;
+    }
+    free(wc_buf);
+    rc = bytes;
+  }
+  else
+#endif
+    rc = fwrite(buffer, sz, nmemb, outs->stream);
 
   if(bytes == rc)
     /* we added this amount of data to the output */
@@ -164,7 +204,7 @@ size_t tool_write_cb(char *buffer, size_t sz, size_t nmemb, void *userdata)
 
   if(config->readbusy) {
     config->readbusy = FALSE;
-    curl_easy_pause(config->easy, CURLPAUSE_CONT);
+    curl_easy_pause(per->curl, CURLPAUSE_CONT);
   }
 
   if(config->nobuffer) {
index 51e002b..188d3ea 100644 (file)
@@ -30,6 +30,6 @@
 size_t tool_write_cb(char *buffer, size_t sz, size_t nmemb, void *userdata);
 
 /* create a local file for writing, return TRUE on success */
-bool tool_create_output_file(struct OutStruct *outs, bool append);
+bool tool_create_output_file(struct OutStruct *outs);
 
 #endif /* HEADER_CURL_TOOL_CB_WRT_H */
index 7d088ae..f802a5a 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -34,15 +34,16 @@ void config_init(struct OperationConfig* config)
   config->use_httpget = FALSE;
   config->create_dirs = FALSE;
   config->maxredirs = DEFAULT_MAXREDIRS;
-  config->proto = CURLPROTO_ALL; /* FIXME: better to read from library */
+  config->proto = CURLPROTO_ALL;
   config->proto_present = FALSE;
   config->proto_redir = CURLPROTO_ALL & /* All except FILE, SCP and SMB */
-                        ~(CURLPROTO_FILE | CURLPROTO_SCP | CURLPROTO_SMB |
-                          CURLPROTO_SMBS);
+    ~(CURLPROTO_FILE | CURLPROTO_SCP | CURLPROTO_SMB |
+      CURLPROTO_SMBS);
   config->proto_redir_present = FALSE;
   config->proto_default = NULL;
   config->tcp_nodelay = TRUE; /* enabled by default */
   config->happy_eyeballs_timeout_ms = CURL_HET_DEFAULT;
+  config->http09_allowed = FALSE;
 }
 
 static void free_config_fields(struct OperationConfig *config)
@@ -52,6 +53,7 @@ static void free_config_fields(struct OperationConfig *config)
   Curl_safefree(config->random_file);
   Curl_safefree(config->egd_file);
   Curl_safefree(config->useragent);
+  Curl_safefree(config->altsvc);
   Curl_safefree(config->cookie);
   Curl_safefree(config->cookiejar);
   Curl_safefree(config->cookiefile);
@@ -126,11 +128,14 @@ static void free_config_fields(struct OperationConfig *config)
   Curl_safefree(config->pubkey);
   Curl_safefree(config->hostpubmd5);
   Curl_safefree(config->engine);
+  Curl_safefree(config->etag_save_file);
+  Curl_safefree(config->etag_compare_file);
   Curl_safefree(config->request_target);
   Curl_safefree(config->customrequest);
   Curl_safefree(config->krblevel);
 
   Curl_safefree(config->oauth_bearer);
+  Curl_safefree(config->sasl_authzid);
 
   Curl_safefree(config->unix_socket_path);
   Curl_safefree(config->writeout);
@@ -143,10 +148,10 @@ static void free_config_fields(struct OperationConfig *config)
   curl_slist_free_all(config->headers);
   curl_slist_free_all(config->proxyheaders);
 
-  if(config->mimepost) {
-    curl_mime_free(config->mimepost);
-    config->mimepost = NULL;
-  }
+  curl_mime_free(config->mimepost);
+  config->mimepost = NULL;
+  tool_mime_free(config->mimeroot);
+  config->mimeroot = NULL;
   config->mimecurrent = NULL;
 
   curl_slist_free_all(config->telnet_options);
index b719fa2..32e811e 100644 (file)
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
  *
  ***************************************************************************/
 #include "tool_setup.h"
-
 #include "tool_sdecls.h"
-
 #include "tool_metalink.h"
+#include "tool_urlglob.h"
+#include "tool_formparse.h"
 
 typedef enum {
   ERR_NONE,
@@ -35,8 +35,21 @@ typedef enum {
 
 struct GlobalConfig;
 
+struct State {
+  struct getout *urlnode;
+  URLGlob *inglob;
+  URLGlob *urls;
+  char *outfiles;
+  char *httpgetfields;
+  char *uploadfile;
+  unsigned long infilenum; /* number of files to upload */
+  unsigned long up;  /* upload file counter within a single upload glob */
+  unsigned long urlnum; /* how many iterations this single URL has with ranges
+                           etc */
+  unsigned long li;
+};
+
 struct OperationConfig {
-  CURL *easy;               /* A copy of the handle from GlobalConfig */
   bool remote_time;
   char *random_file;
   char *egd_file;
@@ -44,6 +57,7 @@ struct OperationConfig {
   char *cookie;             /* single line with specified cookies */
   char *cookiejar;          /* write to this file */
   char *cookiefile;         /* read from this file */
+  char *altsvc;             /* alt-svc cache file name */
   bool cookiesession;       /* new session? */
   bool encoding;            /* Accept-Encoding please */
   bool tr_encoding;         /* Transfer-Encoding please */
@@ -69,8 +83,8 @@ struct OperationConfig {
   char *headerfile;
   char *ftpport;
   char *iface;
-  int localport;
-  int localportrange;
+  long localport;
+  long localportrange;
   unsigned short porttouse;
   char *range;
   long low_speed_limit;
@@ -94,6 +108,7 @@ struct OperationConfig {
   char *mail_from;
   struct curl_slist *mail_rcpt;
   char *mail_auth;
+  char *sasl_authzid;       /* Authorisation identity (identity to use) */
   bool sasl_ir;             /* Enable/disable SASL initial response */
   bool proxytunnel;
   bool ftp_append;          /* APPE on ftp */
@@ -141,11 +156,14 @@ struct OperationConfig {
   char *pubkey;
   char *hostpubmd5;
   char *engine;
+  char *etag_save_file;
+  char *etag_compare_file;
   bool crlf;
   char *customrequest;
   char *krblevel;
   char *request_target;
   long httpversion;
+  bool http09_allowed;
   bool nobuffer;
   bool readbusy;            /* set when reading input returns EAGAIN */
   bool globoff;
@@ -175,8 +193,9 @@ struct OperationConfig {
   curl_off_t condtime;
   struct curl_slist *headers;
   struct curl_slist *proxyheaders;
+  tool_mime *mimeroot;
+  tool_mime *mimecurrent;
   curl_mime *mimepost;
-  curl_mime *mimecurrent;
   struct curl_slist *telnet_options;
   struct curl_slist *resolve;
   struct curl_slist *connect_to;
@@ -237,9 +256,6 @@ struct OperationConfig {
   bool use_metalink;        /* process given URLs as metalink XML file */
   metalinkfile *metalinkfile_list; /* point to the first node */
   metalinkfile *metalinkfile_last; /* point to the last/current node */
-#ifdef CURLDEBUG
-  bool test_event_based;
-#endif
   char *oauth_bearer;             /* OAuth 2.0 bearer token */
   bool nonpn;                     /* enable/disable TLS NPN extension */
   bool noalpn;                    /* enable/disable TLS ALPN extension */
@@ -260,10 +276,10 @@ struct OperationConfig {
   struct GlobalConfig *global;
   struct OperationConfig *prev;
   struct OperationConfig *next;   /* Always last in the struct */
+  struct State state;             /* for create_transfer() */
 };
 
 struct GlobalConfig {
-  CURL *easy;                     /* Once we have one, we keep it here */
   int showerror;                  /* -1 == unset, default => show errors
                                       0 => -s is used to NOT show errors
                                       1 => -S has been used to show errors */
@@ -281,6 +297,12 @@ struct GlobalConfig {
   char *libcurl;                  /* Output libcurl code to this file name */
   bool fail_early;                /* exit on first transfer error */
   bool styled_output;             /* enable fancy output style detection */
+#ifdef CURLDEBUG
+  bool test_event_based;
+#endif
+  bool parallel;
+  long parallel_max;
+  bool parallel_connect;
   struct OperationConfig *first;
   struct OperationConfig *current;
   struct OperationConfig *last;   /* Always last in the struct */
index ec9d7ac..3969130 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -122,15 +122,13 @@ char convert_char(curl_infotype infotype, char this_char)
   case CURLINFO_SSL_DATA_IN:
   case CURLINFO_SSL_DATA_OUT:
     /* data, treat as ASCII */
-    if((this_char >= 0x20) && (this_char < 0x7f)) {
-      /* printable ASCII hex value: convert to host encoding */
-      (void)convert_from_network(&this_char, 1);
-    }
-    else {
+    if(this_char < 0x20 || this_char >= 0x7f) {
       /* non-printable ASCII, use a replacement character */
       return UNPRINTABLE_CHAR;
     }
-    /* fall through to default */
+    /* printable ASCII hex value: convert to host encoding */
+    (void)convert_from_network(&this_char, 1);
+    /* FALLTHROUGH */
   default:
     /* treat as host encoding */
     if(ISPRINT(this_char)
index 27b4ce9..6d78ecf 100644 (file)
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
index 24bbc49..06b3c03 100644 (file)
@@ -131,13 +131,13 @@ CURLcode create_dir_hierarchy(const char *outfile, FILE *errors)
     if(tempdir2 != NULL) {
       size_t dlen = strlen(dirbuildup);
       if(dlen)
-        snprintf(&dirbuildup[dlen], outlen - dlen, "%s%s", DIR_CHAR, tempdir);
+        msnprintf(&dirbuildup[dlen], outlen - dlen, "%s%s", DIR_CHAR, tempdir);
       else {
         if(outdup == tempdir)
           /* the output string doesn't start with a separator */
           strcpy(dirbuildup, tempdir);
         else
-          snprintf(dirbuildup, outlen, "%s%s", DIR_CHAR, tempdir);
+          msnprintf(dirbuildup, outlen, "%s%s", DIR_CHAR, tempdir);
       }
       if((-1 == mkdir(dirbuildup, (mode_t)0000750)) && (errno != EEXIST)) {
         show_dir_errno(errors, dirbuildup);
index 011a577..96fae9e 100644 (file)
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
index c3a8826..a64a816 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -28,6 +28,7 @@
 #endif
 
 #ifdef WIN32
+#  include <tlhelp32.h>
 #  include "tool_cfgable.h"
 #  include "tool_libinfo.h"
 #endif
 
 #include "memdebug.h" /* keep this as LAST include */
 
-/*
- * Macros ALWAYS_TRUE and ALWAYS_FALSE are used to avoid compiler warnings.
- */
-
-#define ALWAYS_TRUE   (1)
-#define ALWAYS_FALSE  (0)
-
-#if defined(_MSC_VER) && !defined(__POCC__)
-#  undef ALWAYS_TRUE
-#  undef ALWAYS_FALSE
-#  if (_MSC_VER < 1500)
-#    define ALWAYS_TRUE   (0, 1)
-#    define ALWAYS_FALSE  (1, 0)
-#  else
-#    define ALWAYS_TRUE \
-__pragma(warning(push)) \
-__pragma(warning(disable:4127)) \
-(1) \
-__pragma(warning(pop))
-#    define ALWAYS_FALSE \
-__pragma(warning(push)) \
-__pragma(warning(disable:4127)) \
-(0) \
-__pragma(warning(pop))
-#  endif
-#endif
-
 #ifdef WIN32
 #  undef  PATH_MAX
 #  define PATH_MAX MAX_PATH
@@ -78,9 +52,9 @@ __pragma(warning(pop))
 #endif
 
 #ifdef WIN32
-#  define _use_lfn(f) ALWAYS_TRUE   /* long file names always available */
+#  define _use_lfn(f) (1)   /* long file names always available */
 #elif !defined(__DJGPP__) || (__DJGPP__ < 2)  /* DJGPP 2.0 has _use_lfn() */
-#  define _use_lfn(f) ALWAYS_FALSE  /* long file names never available */
+#  define _use_lfn(f) (0)  /* long file names never available */
 #elif defined(__DJGPP__)
 #  include <fcntl.h>                /* _use_lfn(f) prototype */
 #endif
@@ -598,7 +572,6 @@ SANITIZEcode rename_if_reserved_dos_device_name(char **const sanitized,
       }
       memmove(base + 1, base, blen + 1);
       base[0] = '_';
-      ++blen;
     }
   }
 #endif
@@ -645,9 +618,9 @@ CURLcode FindWin32CACert(struct OperationConfig *config,
 
   /* Search and set cert file only if libcurl supports SSL.
    *
-   * If Schannel (WinSSL) is the selected SSL backend then these locations
-   * are ignored. We allow setting CA location for schannel only when
-   * explicitly specified by the user via CURLOPT_CAINFO / --cacert.
+   * If Schannel is the selected SSL backend then these locations are
+   * ignored. We allow setting CA location for schannel only when explicitly
+   * specified by the user via CURLOPT_CAINFO / --cacert.
    */
   if((curlinfo->features & CURL_VERSION_SSL) &&
      backend != CURLSSLBACKEND_SCHANNEL) {
@@ -670,6 +643,60 @@ CURLcode FindWin32CACert(struct OperationConfig *config,
   return result;
 }
 
+
+/* Get a list of all loaded modules with full paths.
+ * Returns slist on success or NULL on error.
+ */
+struct curl_slist *GetLoadedModulePaths(void)
+{
+  HANDLE hnd = INVALID_HANDLE_VALUE;
+  MODULEENTRY32 mod = {0};
+  struct curl_slist *slist = NULL;
+
+  mod.dwSize = sizeof(MODULEENTRY32);
+
+  do {
+    hnd = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, 0);
+  } while(hnd == INVALID_HANDLE_VALUE && GetLastError() == ERROR_BAD_LENGTH);
+
+  if(hnd == INVALID_HANDLE_VALUE)
+    goto error;
+
+  if(!Module32First(hnd, &mod))
+    goto error;
+
+  do {
+    char *path; /* points to stack allocated buffer */
+    struct curl_slist *temp;
+
+#ifdef UNICODE
+    /* sizeof(mod.szExePath) is the max total bytes of wchars. the max total
+       bytes of multibyte chars won't be more than twice that. */
+    char buffer[sizeof(mod.szExePath) * 2];
+    if(!WideCharToMultiByte(CP_ACP, 0, mod.szExePath, -1,
+                            buffer, sizeof(buffer), NULL, NULL))
+      goto error;
+    path = buffer;
+#else
+    path = mod.szExePath;
+#endif
+    temp = curl_slist_append(slist, path);
+    if(!temp)
+      goto error;
+    slist = temp;
+  } while(Module32Next(hnd, &mod));
+
+  goto cleanup;
+
+error:
+  curl_slist_free_all(slist);
+  slist = NULL;
+cleanup:
+  if(hnd != INVALID_HANDLE_VALUE)
+    CloseHandle(hnd);
+  return slist;
+}
+
 #endif /* WIN32 */
 
 #endif /* MSDOS || WIN32 */
index 6398390..4576376 100644 (file)
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -60,6 +60,7 @@ char **__crt0_glob_function(char *arg);
 CURLcode FindWin32CACert(struct OperationConfig *config,
                          curl_sslbackend backend,
                          const char *bundle_file);
+struct curl_slist *GetLoadedModulePaths(void);
 
 #endif /* WIN32 */
 
index cb30e40..bb1a135 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -123,7 +123,7 @@ CURLcode easysrc_addf(struct slist_wc **plist, const char *fmt, ...)
   return ret;
 }
 
-#define CHKRET(v) do {CURLcode ret = (v); if(ret) return ret;} WHILE_FALSE
+#define CHKRET(v) do {CURLcode ret = (v); if(ret) return ret;} while(0)
 
 CURLcode easysrc_init(void)
 {
index 5d1ea9c..74d1533 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -21,7 +21,6 @@
  ***************************************************************************/
 #include "tool_setup.h"
 
-#include "mime.h"
 #include "strcase.h"
 
 #define ENABLE_CURLX_PRINTF
 
 #include "memdebug.h" /* keep this as LAST include */
 
-/* Stdin parameters. */
-typedef struct {
-  char *data;  /* Memory data. */
-  curl_off_t origin;  /* File read origin offset. */
-  curl_off_t size; /* Data size. */
-  curl_off_t curpos; /* Current read position. */
-}  standard_input;
+/* Macros to free const pointers. */
+#define CONST_FREE(x)           free((void *) (x))
+#define CONST_SAFEFREE(x)       Curl_safefree(*((void **) &(x)))
 
+/* tool_mime functions. */
+static tool_mime *tool_mime_new(tool_mime *parent, toolmimekind kind)
+{
+  tool_mime *m = (tool_mime *) calloc(1, sizeof(*m));
+
+  if(m) {
+    m->kind = kind;
+    m->parent = parent;
+    if(parent) {
+      m->prev = parent->subparts;
+      parent->subparts = m;
+    }
+  }
+  return m;
+}
+
+static tool_mime *tool_mime_new_parts(tool_mime *parent)
+{
+  return tool_mime_new(parent, TOOLMIME_PARTS);
+}
+
+static tool_mime *tool_mime_new_data(tool_mime *parent, const char *data)
+{
+  tool_mime *m = NULL;
+
+  data = strdup(data);
+  if(data) {
+    m = tool_mime_new(parent, TOOLMIME_DATA);
+    if(!m)
+      CONST_FREE(data);
+    else
+      m->data = data;
+  }
+  return m;
+}
+
+static tool_mime *tool_mime_new_filedata(tool_mime *parent,
+                                         const char *filename,
+                                         bool isremotefile,
+                                         CURLcode *errcode)
+{
+  CURLcode result = CURLE_OK;
+  tool_mime *m = NULL;
+
+  *errcode = CURLE_OUT_OF_MEMORY;
+  if(strcmp(filename, "-")) {
+    /* This is a normal file. */
+    filename = strdup(filename);
+    if(filename) {
+      m = tool_mime_new(parent, TOOLMIME_FILE);
+      if(!m)
+        CONST_FREE(filename);
+      else {
+        m->data = filename;
+        if(!isremotefile)
+          m->kind = TOOLMIME_FILEDATA;
+       *errcode = CURLE_OK;
+      }
+    }
+  }
+  else {        /* Standard input. */
+    int fd = fileno(stdin);
+    char *data = NULL;
+    curl_off_t size;
+    curl_off_t origin;
+    struct_stat sbuf;
+
+    set_binmode(stdin);
+    origin = ftell(stdin);
+    /* If stdin is a regular file, do not buffer data but read it
+       when needed. */
+    if(fd >= 0 && origin >= 0 && !fstat(fd, &sbuf) &&
+#ifdef __VMS
+       sbuf.st_fab_rfm != FAB$C_VAR && sbuf.st_fab_rfm != FAB$C_VFC &&
+#endif
+       S_ISREG(sbuf.st_mode)) {
+      size = sbuf.st_size - origin;
+      if(size < 0)
+        size = 0;
+    }
+    else {  /* Not suitable for direct use, buffer stdin data. */
+      size_t stdinsize = 0;
+
+      if(file2memory(&data, &stdinsize, stdin) != PARAM_OK) {
+        /* Out of memory. */
+        return m;
+      }
+
+      if(ferror(stdin)) {
+        result = CURLE_READ_ERROR;
+        Curl_safefree(data);
+        data = NULL;
+      }
+      else if(!stdinsize) {
+        /* Zero-length data has been freed. Re-create it. */
+        data = strdup("");
+        if(!data)
+          return m;
+      }
+      size = curlx_uztoso(stdinsize);
+      origin = 0;
+    }
+    m = tool_mime_new(parent, TOOLMIME_STDIN);
+    if(!m)
+      Curl_safefree(data);
+    else {
+      m->data = data;
+      m->origin = origin;
+      m->size = size;
+      m->curpos = 0;
+      if(!isremotefile)
+        m->kind = TOOLMIME_STDINDATA;
+      *errcode = result;
+    }
+  }
+  return m;
+}
+
+void tool_mime_free(tool_mime *mime)
+{
+  if(mime) {
+    if(mime->subparts)
+      tool_mime_free(mime->subparts);
+    if(mime->prev)
+      tool_mime_free(mime->prev);
+    CONST_SAFEFREE(mime->name);
+    CONST_SAFEFREE(mime->filename);
+    CONST_SAFEFREE(mime->type);
+    CONST_SAFEFREE(mime->encoder);
+    CONST_SAFEFREE(mime->data);
+    curl_slist_free_all(mime->headers);
+    free(mime);
+  }
+}
+
+
+/* Mime part callbacks for stdin. */
+size_t tool_mime_stdin_read(char *buffer,
+                            size_t size, size_t nitems, void *arg)
+{
+  tool_mime *sip = (tool_mime *) arg;
+  curl_off_t bytesleft;
+  (void) size;  /* Always 1: ignored. */
+
+  if(sip->size >= 0) {
+    if(sip->curpos >= sip->size)
+      return 0;  /* At eof. */
+    bytesleft = sip->size - sip->curpos;
+    if(curlx_uztoso(nitems) > bytesleft)
+      nitems = curlx_sotouz(bytesleft);
+  }
+  if(nitems) {
+    if(sip->data) {
+      /* Return data from memory. */
+      memcpy(buffer, sip->data + curlx_sotouz(sip->curpos), nitems);
+    }
+    else {
+      /* Read from stdin. */
+      nitems = fread(buffer, 1, nitems, stdin);
+      if(ferror(stdin)) {
+        /* Show error only once. */
+        if(sip->config) {
+          warnf(sip->config, "stdin: %s\n", strerror(errno));
+          sip->config = NULL;
+        }
+        return CURL_READFUNC_ABORT;
+      }
+    }
+    sip->curpos += curlx_uztoso(nitems);
+  }
+  return nitems;
+}
+
+int tool_mime_stdin_seek(void *instream, curl_off_t offset, int whence)
+{
+  tool_mime *sip = (tool_mime *) instream;
+
+  switch(whence) {
+  case SEEK_CUR:
+    offset += sip->curpos;
+    break;
+  case SEEK_END:
+    offset += sip->size;
+    break;
+  }
+  if(offset < 0)
+    return CURL_SEEKFUNC_CANTSEEK;
+  if(!sip->data) {
+    if(fseek(stdin, (long) (offset + sip->origin), SEEK_SET))
+      return CURL_SEEKFUNC_CANTSEEK;
+  }
+  sip->curpos = offset;
+  return CURL_SEEKFUNC_OK;
+}
+
+/* Translate an internal mime tree into a libcurl mime tree. */
+
+static CURLcode tool2curlparts(CURL *curl, tool_mime *m, curl_mime *mime)
+{
+  CURLcode ret = CURLE_OK;
+  curl_mimepart *part = NULL;
+  curl_mime *submime = NULL;
+  const char *filename = NULL;
+
+  if(m) {
+    ret = tool2curlparts(curl, m->prev, mime);
+    if(!ret) {
+      part = curl_mime_addpart(mime);
+      if(!part)
+        ret = CURLE_OUT_OF_MEMORY;
+    }
+    if(!ret) {
+      filename = m->filename;
+      switch(m->kind) {
+      case TOOLMIME_PARTS:
+        ret = tool2curlmime(curl, m, &submime);
+        if(!ret) {
+          ret = curl_mime_subparts(part, submime);
+          if(ret)
+            curl_mime_free(submime);
+        }
+        break;
+
+      case TOOLMIME_DATA:
+#ifdef CURL_DOES_CONVERSIONS
+        /* Our data is always textual: convert it to ASCII. */
+        {
+          size_t size = strlen(m->data);
+          char *cp = malloc(size + 1);
+
+          if(!cp)
+            ret = CURLE_OUT_OF_MEMORY;
+          else {
+            memcpy(cp, m->data, size + 1);
+            ret = convert_to_network(cp, size);
+            if(!ret)
+              ret = curl_mime_data(part, cp, CURL_ZERO_TERMINATED);
+            free(cp);
+          }
+        }
+#else
+        ret = curl_mime_data(part, m->data, CURL_ZERO_TERMINATED);
+#endif
+        break;
+
+      case TOOLMIME_FILE:
+      case TOOLMIME_FILEDATA:
+        ret = curl_mime_filedata(part, m->data);
+        if(!ret && m->kind == TOOLMIME_FILEDATA && !filename)
+          ret = curl_mime_filename(part, NULL);
+        break;
+
+      case TOOLMIME_STDIN:
+        if(!filename)
+          filename = "-";
+        /* FALLTHROUGH */
+      case TOOLMIME_STDINDATA:
+        ret = curl_mime_data_cb(part, m->size,
+                                (curl_read_callback) tool_mime_stdin_read,
+                                (curl_seek_callback) tool_mime_stdin_seek,
+                                NULL, m);
+        break;
+
+      default:
+        /* Other cases not possible in this context. */
+        break;
+      }
+    }
+    if(!ret && filename)
+      ret = curl_mime_filename(part, filename);
+    if(!ret)
+      ret = curl_mime_type(part, m->type);
+    if(!ret)
+      ret = curl_mime_headers(part, m->headers, 0);
+    if(!ret)
+      ret = curl_mime_encoder(part, m->encoder);
+    if(!ret)
+      ret = curl_mime_name(part, m->name);
+  }
+  return ret;
+}
+
+CURLcode tool2curlmime(CURL *curl, tool_mime *m, curl_mime **mime)
+{
+  CURLcode ret = CURLE_OK;
+
+  *mime = curl_mime_init(curl);
+  if(!*mime)
+    ret = CURLE_OUT_OF_MEMORY;
+  else
+    ret = tool2curlparts(curl, m->subparts, *mime);
+  if(ret) {
+    curl_mime_free(*mime);
+    *mime = NULL;
+  }
+  return ret;
+}
 
 /*
  * helper function to get a word from form param
@@ -55,12 +347,11 @@ typedef struct {
 static char *get_param_word(char **str, char **end_pos, char endchar)
 {
   char *ptr = *str;
-  char *word_begin = NULL;
+  /* the first non-space char is here */
+  char *word_begin = ptr;
   char *ptr2;
   char *escape = NULL;
 
-  /* the first non-space char is here */
-  word_begin = ptr;
   if(*ptr == '"') {
     ++ptr;
     while(*ptr) {
@@ -276,7 +567,6 @@ static int get_param_part(struct OperationConfig *config, char endchar,
             endpos--;
         sep = *p;
         *endpos = '\0';
-        /* TODO: maybe special fopen for VMS? */
         fp = fopen(hdrfile, FOPEN_READTEXT);
         if(!fp)
           warnf(config->global, "Cannot read from %s: %s\n", hdrfile,
@@ -379,130 +669,15 @@ static int get_param_part(struct OperationConfig *config, char endchar,
 }
 
 
-/* Mime part callbacks for stdin. */
-static size_t stdin_read(char *buffer, size_t size, size_t nitems, void *arg)
-{
-  standard_input *sip = (standard_input *) arg;
-  curl_off_t bytesleft;
-  (void) size;  /* Always 1: ignored. */
-
-  if(sip->curpos >= sip->size)
-    return 0;  /* At eof. */
-  bytesleft = sip->size - sip->curpos;
-  if((curl_off_t) nitems > bytesleft)
-    nitems = (size_t) bytesleft;
-  if(sip->data) {
-    /* Return data from memory. */
-    memcpy(buffer, sip->data + (size_t) sip->curpos, nitems);
-  }
-  else {
-    /* Read from stdin. */
-    nitems = fread(buffer, 1, nitems, stdin);
-  }
-  sip->curpos += nitems;
-  return nitems;
-}
-
-static int stdin_seek(void *instream, curl_off_t offset, int whence)
-{
-  standard_input *sip = (standard_input *) instream;
-
-  switch(whence) {
-  case SEEK_CUR:
-    offset += sip->curpos;
-    break;
-  case SEEK_END:
-    offset += sip->size;
-    break;
-  }
-  if(offset < 0)
-    return CURL_SEEKFUNC_CANTSEEK;
-  if(!sip->data) {
-    if(fseek(stdin, (long) (offset + sip->origin), SEEK_SET))
-      return CURL_SEEKFUNC_CANTSEEK;
-  }
-  sip->curpos = offset;
-  return CURL_SEEKFUNC_OK;
-}
-
-static void stdin_free(void *ptr)
-{
-  standard_input *sip = (standard_input *) ptr;
-
-  Curl_safefree(sip->data);
-  free(sip);
-}
-
-/* Set a part's data from a file, taking care about the pseudo filename "-" as
- * a shortcut to read stdin: if so, use a callback to read OUR stdin (to
- * workaround Windows DLL file handle caveat).
- * If stdin is a regular file opened in binary mode, save current offset as
- * origin for rewind and do not buffer data. Else read to EOF and keep in
- * memory. In all cases, compute the stdin data size.
- */
-static CURLcode file_or_stdin(curl_mimepart *part, const char *file)
-{
-  standard_input *sip = NULL;
-  int fd = -1;
-  CURLcode result = CURLE_OK;
-  struct_stat sbuf;
-
-  if(strcmp(file, "-"))
-    return curl_mime_filedata(part, file);
-
-  sip = (standard_input *) calloc(1, sizeof(*sip));
-  if(!sip)
-    return CURLE_OUT_OF_MEMORY;
-
-  set_binmode(stdin);
-
-  /* If stdin is a regular file, do not buffer data but read it when needed. */
-  fd = fileno(stdin);
-  sip->origin = ftell(stdin);
-  if(fd >= 0 && sip->origin >= 0 && !fstat(fd, &sbuf) &&
-#ifdef __VMS
-     sbuf.st_fab_rfm != FAB$C_VAR && sbuf.st_fab_rfm != FAB$C_VFC &&
-#endif
-     S_ISREG(sbuf.st_mode)) {
-    sip->size = sbuf.st_size - sip->origin;
-    if(sip->size < 0)
-      sip->size = 0;
-  }
-  else {  /* Not suitable for direct use, buffer stdin data. */
-    size_t stdinsize = 0;
-
-    sip->origin = 0;
-    if(file2memory(&sip->data, &stdinsize, stdin) != PARAM_OK)
-      result = CURLE_OUT_OF_MEMORY;
-    else {
-      if(!stdinsize)
-        sip->data = NULL;  /* Has been freed if no data. */
-      sip->size = stdinsize;
-      if(ferror(stdin))
-        result = CURLE_READ_ERROR;
-    }
-  }
-
-  /* Set remote file name. */
-  if(!result)
-    result = curl_mime_filename(part, file);
-
-  /* Set part's data from callback. */
-  if(!result)
-    result = curl_mime_data_cb(part, sip->size,
-                               stdin_read, stdin_seek, stdin_free, sip);
-  if(result)
-    stdin_free(sip);
-  return result;
-}
-
-
 /***************************************************************************
  *
  * formparse()
  *
  * Reads a 'name=value' parameter and builds the appropriate linked list.
  *
+ * If the value is of the form '<filename', field data is read from the
+ * given file.
+
  * Specify files to upload with 'name=@filename', or 'name=@"filename"'
  * in case the filename contain ',' or ';'. Supports specified
  * given Content-Type of the files. Such as ';type=<content-type>'.
@@ -539,15 +714,27 @@ static CURLcode file_or_stdin(curl_mimepart *part, const char *file)
  * else curl will fail to figure out the correct filename. if the filename
  * tobe quoted contains '"' or '\', '"' and '\' must be escaped by backslash.
  *
- * This function uses curl_formadd to fulfill it's job. Is heavily based on
- * the old curl_formparse code.
- *
  ***************************************************************************/
 
+/* Convenience macros for null pointer check. */
+#define NULL_CHECK(ptr, init, retcode) {                                \
+  (ptr) = (init);                                                       \
+  if(!(ptr)) {                                                          \
+    warnf(config->global, "out of memory!\n");                          \
+    curl_slist_free_all(headers);                                       \
+    Curl_safefree(contents);                                            \
+    return retcode;                                                     \
+  }                                                                     \
+}
+#define SET_TOOL_MIME_PTR(m, field, retcode) {                          \
+  if(field)                                                             \
+    NULL_CHECK((m)->field, strdup(field), retcode);                     \
+}
+
 int formparse(struct OperationConfig *config,
               const char *input,
-              curl_mime **mimepost,
-              curl_mime **mimecurrent,
+              tool_mime **mimeroot,
+              tool_mime **mimecurrent,
               bool literal_value)
 {
   /* input MUST be a string in the format 'name=contents' and we'll
@@ -560,25 +747,17 @@ int formparse(struct OperationConfig *config,
   char *filename = NULL;
   char *encoder = NULL;
   struct curl_slist *headers = NULL;
-  curl_mimepart *part = NULL;
+  tool_mime *part = NULL;
   CURLcode res;
 
   /* Allocate the main mime structure if needed. */
-  if(!*mimepost) {
-    *mimepost = curl_mime_init(config->easy);
-    if(!*mimepost) {
-      warnf(config->global, "curl_mime_init failed!\n");
-      return 1;
-    }
-    *mimecurrent = *mimepost;
+  if(!*mimecurrent) {
+    NULL_CHECK(*mimeroot, tool_mime_new_parts(NULL), 1);
+    *mimecurrent = *mimeroot;
   }
 
   /* Make a copy we can overwrite. */
-  contents = strdup(input);
-  if(!contents) {
-    fprintf(config->global->errors, "out of memory\n");
-    return 2;
-  }
+  NULL_CHECK(contents, strdup(input), 2);
 
   /* Scan for the end of the name. */
   contp = strchr(contents, '=');
@@ -589,8 +768,6 @@ int formparse(struct OperationConfig *config,
     *contp++ = '\0';
 
     if(*contp == '(' && !literal_value) {
-      curl_mime *subparts;
-
       /* Starting a multipart. */
       sep = get_param_part(config, '\0',
                            &contp, &data, &type, NULL, NULL, &headers);
@@ -598,55 +775,26 @@ int formparse(struct OperationConfig *config,
         Curl_safefree(contents);
         return 3;
       }
-      subparts = curl_mime_init(config->easy);
-      if(!subparts) {
-        warnf(config->global, "curl_mime_init failed!\n");
-        curl_slist_free_all(headers);
-        Curl_safefree(contents);
-        return 4;
-      }
-      part = curl_mime_addpart(*mimecurrent);
-      if(!part) {
-        warnf(config->global, "curl_mime_addpart failed!\n");
-        curl_mime_free(subparts);
-        curl_slist_free_all(headers);
-        Curl_safefree(contents);
-        return 5;
-      }
-      if(curl_mime_subparts(part, subparts)) {
-        warnf(config->global, "curl_mime_subparts failed!\n");
-        curl_mime_free(subparts);
-        curl_slist_free_all(headers);
-        Curl_safefree(contents);
-        return 6;
-      }
-      *mimecurrent = subparts;
-      if(curl_mime_headers(part, headers, 1)) {
-        warnf(config->global, "curl_mime_headers failed!\n");
-        curl_slist_free_all(headers);
-        Curl_safefree(contents);
-        return 7;
-      }
-      if(curl_mime_type(part, type)) {
-        warnf(config->global, "curl_mime_type failed!\n");
-        Curl_safefree(contents);
-        return 8;
-      }
+      NULL_CHECK(part, tool_mime_new_parts(*mimecurrent), 4);
+      *mimecurrent = part;
+      part->headers = headers;
+      headers = NULL;
+      SET_TOOL_MIME_PTR(part, type, 5);
     }
     else if(!name && !strcmp(contp, ")") && !literal_value) {
-      /* Ending a mutipart. */
-      if(*mimecurrent == *mimepost) {
+      /* Ending a multipart. */
+      if(*mimecurrent == *mimeroot) {
         warnf(config->global, "no multipart to terminate!\n");
         Curl_safefree(contents);
-        return 9;
+        return 6;
         }
-      *mimecurrent = (*mimecurrent)->parent->parent;
+      *mimecurrent = (*mimecurrent)->parent;
     }
     else if('@' == contp[0] && !literal_value) {
 
       /* we use the @-letter to indicate file name(s) */
 
-      curl_mime *subparts = NULL;
+      tool_mime *subparts = NULL;
 
       do {
         /* since this was a file, it may have a content-type specifier
@@ -655,10 +803,8 @@ int formparse(struct OperationConfig *config,
         sep = get_param_part(config, ',', &contp,
                              &data, &type, &filename, &encoder, &headers);
         if(sep < 0) {
-          if(subparts != *mimecurrent)
-            curl_mime_free(subparts);
           Curl_safefree(contents);
-          return 10;
+          return 7;
         }
 
         /* now contp point to comma or string end.
@@ -666,125 +812,68 @@ int formparse(struct OperationConfig *config,
         if(!subparts) {
           if(sep != ',')    /* If there is a single file. */
             subparts = *mimecurrent;
-          else {
-            subparts = curl_mime_init(config->easy);
-            if(!subparts) {
-              warnf(config->global, "curl_mime_init failed!\n");
-              curl_slist_free_all(headers);
-              Curl_safefree(contents);
-              return 11;
-            }
-          }
-        }
-
-        /* Allocate a part for that file. */
-        part = curl_mime_addpart(subparts);
-        if(!part) {
-          warnf(config->global, "curl_mime_addpart failed!\n");
-          if(subparts != *mimecurrent)
-            curl_mime_free(subparts);
-          curl_slist_free_all(headers);
-          Curl_safefree(contents);
-          return 12;
+          else
+            NULL_CHECK(subparts, tool_mime_new_parts(*mimecurrent), 8);
         }
 
-        /* Set part headers. */
-        if(curl_mime_headers(part, headers, 1)) {
-          warnf(config->global, "curl_mime_headers failed!\n");
-          if(subparts != *mimecurrent)
-            curl_mime_free(subparts);
-          curl_slist_free_all(headers);
-          Curl_safefree(contents);
-          return 13;
-        }
-
-        /* Setup file in part. */
-        res = file_or_stdin(part, data);
-        if(res) {
-          warnf(config->global, "setting file %s  failed!\n", data);
-          if(res != CURLE_READ_ERROR) {
-            if(subparts != *mimecurrent)
-              curl_mime_free(subparts);
+        /* Store that file in a part. */
+        NULL_CHECK(part,
+                   tool_mime_new_filedata(subparts, data, TRUE, &res), 9);
+        part->headers = headers;
+        headers = NULL;
+        part->config = config->global;
+        if(res == CURLE_READ_ERROR) {
+            /* An error occurred while reading stdin: if read has started,
+               issue the error now. Else, delay it until processed by
+               libcurl. */
+          if(part->size > 0) {
+            warnf(config->global,
+                  "error while reading standard input\n");
             Curl_safefree(contents);
-            return 14;
+            return 10;
           }
+          CONST_SAFEFREE(part->data);
+          part->data = NULL;
+          part->size = -1;
+          res = CURLE_OK;
         }
-        if(filename && curl_mime_filename(part, filename)) {
-          warnf(config->global, "curl_mime_filename failed!\n");
-          if(subparts != *mimecurrent)
-            curl_mime_free(subparts);
-          Curl_safefree(contents);
-          return 15;
-        }
-        if(curl_mime_type(part, type)) {
-          warnf(config->global, "curl_mime_type failed!\n");
-          if(subparts != *mimecurrent)
-            curl_mime_free(subparts);
-          Curl_safefree(contents);
-          return 16;
-        }
-        if(curl_mime_encoder(part, encoder)) {
-          warnf(config->global, "curl_mime_encoder failed!\n");
-          if(subparts != *mimecurrent)
-            curl_mime_free(subparts);
-          Curl_safefree(contents);
-          return 17;
-        }
+        SET_TOOL_MIME_PTR(part, filename, 11);
+        SET_TOOL_MIME_PTR(part, type, 12);
+        SET_TOOL_MIME_PTR(part, encoder, 13);
 
         /* *contp could be '\0', so we just check with the delimiter */
       } while(sep); /* loop if there's another file name */
-
-      /* now we add the multiple files section */
-      if(subparts != *mimecurrent) {
-        part = curl_mime_addpart(*mimecurrent);
-        if(!part) {
-          warnf(config->global, "curl_mime_addpart failed!\n");
-          curl_mime_free(subparts);
-          Curl_safefree(contents);
-          return 18;
-        }
-        if(curl_mime_subparts(part, subparts)) {
-          warnf(config->global, "curl_mime_subparts failed!\n");
-          curl_mime_free(subparts);
-          Curl_safefree(contents);
-          return 19;
-        }
-      }
+      part = (*mimecurrent)->subparts;  /* Set name on group. */
     }
     else {
-        /* Allocate a mime part. */
-        part = curl_mime_addpart(*mimecurrent);
-        if(!part) {
-          warnf(config->global, "curl_mime_addpart failed!\n");
-          Curl_safefree(contents);
-          return 20;
-        }
-
       if(*contp == '<' && !literal_value) {
         ++contp;
         sep = get_param_part(config, '\0', &contp,
                              &data, &type, NULL, &encoder, &headers);
         if(sep < 0) {
           Curl_safefree(contents);
-          return 21;
-        }
-
-        /* Set part headers. */
-        if(curl_mime_headers(part, headers, 1)) {
-          warnf(config->global, "curl_mime_headers failed!\n");
-          curl_slist_free_all(headers);
-          Curl_safefree(contents);
-          return 22;
+          return 14;
         }
 
-        /* Setup file in part. */
-        res = file_or_stdin(part, data);
-        if(res) {
-          warnf(config->global, "setting file %s failed!\n", data);
-          if(res != CURLE_READ_ERROR) {
+        NULL_CHECK(part, tool_mime_new_filedata(*mimecurrent, data, FALSE,
+                                                &res), 15);
+        part->headers = headers;
+        headers = NULL;
+        part->config = config->global;
+        if(res == CURLE_READ_ERROR) {
+            /* An error occurred while reading stdin: if read has started,
+               issue the error now. Else, delay it until processed by
+               libcurl. */
+          if(part->size > 0) {
+            warnf(config->global,
+                  "error while reading standard input\n");
             Curl_safefree(contents);
-            return 23;
+            return 16;
           }
+          CONST_SAFEFREE(part->data);
+          part->data = NULL;
+          part->size = -1;
+          res = CURLE_OK;
         }
       }
       else {
@@ -795,48 +884,18 @@ int formparse(struct OperationConfig *config,
                                &data, &type, &filename, &encoder, &headers);
           if(sep < 0) {
             Curl_safefree(contents);
-            return 24;
+            return 17;
           }
         }
 
-        /* Set part headers. */
-        if(curl_mime_headers(part, headers, 1)) {
-          warnf(config->global, "curl_mime_headers failed!\n");
-          curl_slist_free_all(headers);
-          Curl_safefree(contents);
-          return 25;
-        }
-
-#ifdef CURL_DOES_CONVERSIONS
-        if(convert_to_network(data, strlen(data))) {
-          warnf(config->global, "curl_formadd failed!\n");
-          Curl_safefree(contents);
-          return 26;
-        }
-#endif
-
-        if(curl_mime_data(part, data, CURL_ZERO_TERMINATED)) {
-          warnf(config->global, "curl_mime_data failed!\n");
-          Curl_safefree(contents);
-          return 27;
-        }
+        NULL_CHECK(part, tool_mime_new_data(*mimecurrent, data), 18);
+        part->headers = headers;
+        headers = NULL;
       }
 
-      if(curl_mime_filename(part, filename)) {
-        warnf(config->global, "curl_mime_filename failed!\n");
-        Curl_safefree(contents);
-        return 28;
-      }
-      if(curl_mime_type(part, type)) {
-        warnf(config->global, "curl_mime_type failed!\n");
-        Curl_safefree(contents);
-        return 29;
-      }
-      if(curl_mime_encoder(part, encoder)) {
-        warnf(config->global, "curl_mime_encoder failed!\n");
-        Curl_safefree(contents);
-        return 30;
-      }
+      SET_TOOL_MIME_PTR(part, filename, 19);
+      SET_TOOL_MIME_PTR(part, type, 20);
+      SET_TOOL_MIME_PTR(part, encoder, 21);
 
       if(sep) {
         *contp = (char) sep;
@@ -846,16 +905,12 @@ int formparse(struct OperationConfig *config,
     }
 
     /* Set part name. */
-    if(name && curl_mime_name(part, name)) {
-      warnf(config->global, "curl_mime_name failed!\n");
-      Curl_safefree(contents);
-      return 31;
-    }
+    SET_TOOL_MIME_PTR(part, name, 22);
   }
   else {
     warnf(config->global, "Illegally formatted input field!\n");
     Curl_safefree(contents);
-    return 32;
+    return 23;
   }
   Curl_safefree(contents);
   return 0;
index cdf02d0..750fe45 100644 (file)
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
  ***************************************************************************/
 #include "tool_setup.h"
 
+/* Private structure for mime/parts. */
+
+typedef enum {
+  TOOLMIME_NONE = 0,
+  TOOLMIME_PARTS,
+  TOOLMIME_DATA,
+  TOOLMIME_FILE,
+  TOOLMIME_FILEDATA,
+  TOOLMIME_STDIN,
+  TOOLMIME_STDINDATA
+} toolmimekind;
+
+typedef struct tool_mime        tool_mime;
+struct tool_mime {
+  /* Structural fields. */
+  toolmimekind kind;            /* Part kind. */
+  tool_mime *parent;            /* Parent item. */
+  tool_mime *prev;              /* Previous sibling (reverse order link). */
+  /* Common fields. */
+  const char *data;             /* Actual data or data filename. */
+  const char *name;             /* Part name. */
+  const char *filename;         /* Part's filename. */
+  const char *type;             /* Part's mime type. */
+  const char *encoder;          /* Part's requested encoding. */
+  struct curl_slist *headers;   /* User-defined headers. */
+  /* TOOLMIME_PARTS fields. */
+  tool_mime *subparts;          /* Part's subparts. */
+  /* TOOLMIME_STDIN/TOOLMIME_STDINDATA fields. */
+  curl_off_t origin;            /* Stdin read origin offset. */
+  curl_off_t size;              /* Stdin data size. */
+  curl_off_t curpos;            /* Stdin current read position. */
+  struct GlobalConfig *config;  /* For access from callback. */
+};
+
+size_t tool_mime_stdin_read(char *buffer,
+                            size_t size, size_t nitems, void *arg);
+int tool_mime_stdin_seek(void *instream, curl_off_t offset, int whence);
+
 int formparse(struct OperationConfig *config,
               const char *input,
-              curl_mime **mimepost,
-              curl_mime **mimecurrent,
+              tool_mime **mimeroot,
+              tool_mime **mimecurrent,
               bool literal_value);
+CURLcode tool2curlmime(CURL *curl, tool_mime *m, curl_mime **mime);
+void tool_mime_free(tool_mime *mime);
 
 #endif /* HEADER_CURL_TOOL_FORMPARSE_H */
index 58f3f58..8df6e5e 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -40,6 +40,7 @@
 #include "tool_msgs.h"
 #include "tool_paramhlp.h"
 #include "tool_parsecfg.h"
+#include "tool_main.h"
 
 #include "memdebug.h" /* keep this as LAST include */
 
@@ -57,7 +58,7 @@
     if(!(*(str)))          \
       return PARAM_NO_MEM; \
   } \
-} WHILE_FALSE
+} while(0)
 
 struct LongShort {
   const char *letter; /* short name option */
@@ -177,7 +178,8 @@ static const struct LongShort aliases[]= {
   {"$H", "mail-auth",                ARG_STRING},
   {"$I", "post303",                  ARG_BOOL},
   {"$J", "metalink",                 ARG_BOOL},
-  {"$K", "sasl-ir",                  ARG_BOOL},
+  {"$6", "sasl-authzid",             ARG_STRING},
+  {"$K", "sasl-ir",                  ARG_BOOL },
   {"$L", "test-event",               ARG_BOOL},
   {"$M", "unix-socket",              ARG_FILENAME},
   {"$N", "path-as-is",               ARG_BOOL},
@@ -199,6 +201,8 @@ static const struct LongShort aliases[]= {
   {"01",  "http1.1",                 ARG_NONE},
   {"02",  "http2",                   ARG_NONE},
   {"03",  "http2-prior-knowledge",   ARG_NONE},
+  {"04",  "http3",                   ARG_NONE},
+  {"09",  "http0.9",                 ARG_BOOL},
   {"1",  "tlsv1",                    ARG_NONE},
   {"10",  "tlsv1.0",                 ARG_NONE},
   {"11",  "tlsv1.1",                 ARG_NONE},
@@ -213,6 +217,7 @@ static const struct LongShort aliases[]= {
   {"a",  "append",                   ARG_BOOL},
   {"A",  "user-agent",               ARG_STRING},
   {"b",  "cookie",                   ARG_STRING},
+  {"ba", "alt-svc",                  ARG_STRING},
   {"B",  "use-ascii",                ARG_BOOL},
   {"c",  "cookie-jar",               ARG_STRING},
   {"C",  "continue-at",              ARG_STRING},
@@ -238,7 +243,7 @@ static const struct LongShort aliases[]= {
   {"El", "tlspassword",              ARG_STRING},
   {"Em", "tlsauthtype",              ARG_STRING},
   {"En", "ssl-allow-beast",          ARG_BOOL},
-  {"Eo", "login-options",            ARG_STRING},
+  /* Eo */
   {"Ep", "pinnedpubkey",             ARG_STRING},
   {"EP", "proxy-pinnedpubkey",       ARG_STRING},
   {"Eq", "cert-status",              ARG_BOOL},
@@ -263,6 +268,8 @@ static const struct LongShort aliases[]= {
   {"E9", "proxy-tlsv1",              ARG_NONE},
   {"EA", "socks5-basic",             ARG_BOOL},
   {"EB", "socks5-gssapi",            ARG_BOOL},
+  {"EC", "etag-save",                ARG_FILENAME},
+  {"ED", "etag-compare",             ARG_FILENAME},
   {"f",  "fail",                     ARG_BOOL},
   {"fa", "fail-early",               ARG_BOOL},
   {"fb", "styled-output",            ARG_BOOL},
@@ -314,7 +321,11 @@ static const struct LongShort aliases[]= {
   {"Y",  "speed-limit",              ARG_STRING},
   {"y",  "speed-time",               ARG_STRING},
   {"z",  "time-cond",                ARG_STRING},
+  {"Z",  "parallel",                 ARG_BOOL},
+  {"Zb", "parallel-max",             ARG_STRING},
+  {"Zc", "parallel-immediate",       ARG_BOOL},
   {"#",  "progress-bar",             ARG_BOOL},
+  {"#m", "progress-meter",           ARG_BOOL},
   {":",  "next",                     ARG_NONE},
 };
 
@@ -513,11 +524,13 @@ ParameterError getparameter(const char *flag, /* f or -long-flag */
     const char *word = ('-' == flag[0]) ? flag + 2 : flag;
     size_t fnam = strlen(word);
     int numhits = 0;
+    bool noflagged = FALSE;
 
     if(!strncmp(word, "no-", 3)) {
       /* disable this option but ignore the "no-" part when looking for it */
       word += 3;
       toggle = FALSE;
+      noflagged = TRUE;
     }
 
     for(j = 0; j < sizeof(aliases)/sizeof(aliases[0]); j++) {
@@ -541,6 +554,9 @@ ParameterError getparameter(const char *flag, /* f or -long-flag */
     if(hit < 0) {
       return PARAM_OPTION_UNKNOWN;
     }
+    if(noflagged && (aliases[hit].desc != ARG_BOOL))
+      /* --no- prefixed an option that isn't boolean! */
+      return PARAM_NO_NOT_BOOLEAN;
   }
   else {
     flag++; /* prefixed with one dash, pass it */
@@ -900,12 +916,12 @@ ParameterError getparameter(const char *flag, /* f or -long-flag */
         config->retry_connrefused = toggle;
         break;
       case 'h': /* --retry-delay */
-        err = str2unum(&config->retry_delay, nextarg);
+        err = str2unummax(&config->retry_delay, nextarg, LONG_MAX/1000);
         if(err)
           return err;
         break;
       case 'i': /* --retry-max-time */
-        err = str2unum(&config->retry_maxtime, nextarg);
+        err = str2unummax(&config->retry_maxtime, nextarg, LONG_MAX/1000);
         if(err)
           return err;
         break;
@@ -935,22 +951,35 @@ ParameterError getparameter(const char *flag, /* f or -long-flag */
       case 'r': /* --ftp-method (undocumented at this point) */
         config->ftp_filemethod = ftpfilemethod(config, nextarg);
         break;
-      case 's': /* --local-port */
-        rc = sscanf(nextarg, "%d - %d",
-                    &config->localport,
-                    &config->localportrange);
-        if(!rc)
+      case 's': { /* --local-port */
+        char lrange[7];  /* 16bit base 10 is 5 digits, but we allow 6 so that
+                            this catches overflows, not just truncates */
+        char *p = nextarg;
+        while(ISDIGIT(*p))
+          p++;
+        if(*p) {
+          /* if there's anything more than a plain decimal number */
+          rc = sscanf(p, " - %6s", lrange);
+          *p = 0; /* zero terminate to make str2unum() work below */
+        }
+        else
+          rc = 0;
+
+        err = str2unum(&config->localport, nextarg);
+        if(err || (config->localport > 65535))
           return PARAM_BAD_USE;
-        if(rc == 1)
+        if(!rc)
           config->localportrange = 1; /* default number of ports to try */
         else {
-          config->localportrange -= config->localport;
-          if(config->localportrange < 1) {
-            warnf(global, "bad range input\n");
+          err = str2unum(&config->localportrange, lrange);
+          if(err || (config->localportrange > 65535))
+            return PARAM_BAD_USE;
+          config->localportrange -= (config->localport-1);
+          if(config->localportrange < 1)
             return PARAM_BAD_USE;
-          }
         }
         break;
+      }
       case 'u': /* --ftp-alternative-to-user */
         GetStr(&config->ftp_alternative_to_user, nextarg);
         break;
@@ -1079,12 +1108,15 @@ ParameterError getparameter(const char *flag, /* f or -long-flag */
 #endif
           break;
         }
+      case '6': /* --sasl-authzid */
+        GetStr(&config->sasl_authzid, nextarg);
+        break;
       case 'K': /* --sasl-ir */
         config->sasl_ir = toggle;
         break;
       case 'L': /* --test-event */
 #ifdef CURLDEBUG
-        config->test_event_based = toggle;
+        global->test_event_based = toggle;
 #else
         warnf(global, "--test-event is ignored unless a debug build!\n");
 #endif
@@ -1144,11 +1176,16 @@ ParameterError getparameter(const char *flag, /* f or -long-flag */
         break;
       }
       break;
-    case '#': /* --progress-bar */
-      if(toggle)
-        global->progressmode = CURL_PROGRESS_BAR;
-      else
-        global->progressmode = CURL_PROGRESS_STATS;
+    case '#':
+      switch(subletter) {
+      case 'm': /* --progress-meter */
+        global->noprogress = !toggle;
+        break;
+      default:  /* --progress-bar */
+        global->progressmode =
+          toggle ? CURL_PROGRESS_BAR : CURL_PROGRESS_STATS;
+        break;
+      }
       break;
     case ':': /* --next */
       return PARAM_NEXT_OPERATION;
@@ -1166,10 +1203,21 @@ ParameterError getparameter(const char *flag, /* f or -long-flag */
         /* HTTP version 2.0 */
         config->httpversion = CURL_HTTP_VERSION_2_0;
         break;
-      case '3':
+      case '3': /* --http2-prior-knowledge */
         /* HTTP version 2.0 over clean TCP*/
         config->httpversion = CURL_HTTP_VERSION_2_PRIOR_KNOWLEDGE;
         break;
+      case '4': /* --http3 */
+        /* HTTP version 3 go over QUIC - at once */
+        if(curlinfo->features & CURL_VERSION_HTTP3)
+          config->httpversion = CURL_HTTP_VERSION_3;
+        else
+          return PARAM_LIBCURL_DOESNT_SUPPORT;
+        break;
+      case '9':
+        /* Allow HTTP/0.9 responses! */
+        config->http09_allowed = toggle;
+        break;
       }
       break;
     case '1': /* --tlsv1* options */
@@ -1226,17 +1274,23 @@ ParameterError getparameter(const char *flag, /* f or -long-flag */
       /* This specifies the User-Agent name */
       GetStr(&config->useragent, nextarg);
       break;
-    case 'b': /* cookie string coming up: */
-      if(nextarg[0] == '@') {
-        nextarg++;
-      }
-      else if(strchr(nextarg, '=')) {
-        /* A cookie string must have a =-letter */
-        GetStr(&config->cookie, nextarg);
+    case 'b':
+      switch(subletter) {
+      case 'a': /* --alt-svc */
+        GetStr(&config->altsvc, nextarg);
         break;
+      default:  /* --cookie string coming up: */
+        if(nextarg[0] == '@') {
+          nextarg++;
+        }
+        else if(strchr(nextarg, '=')) {
+          /* A cookie string must have a =-letter */
+          GetStr(&config->cookie, nextarg);
+          break;
+        }
+        /* We have a cookie file to read from! */
+        GetStr(&config->cookiefile, nextarg);
       }
-      /* We have a cookie file to read from! */
-      GetStr(&config->cookiefile, nextarg);
       break;
     case 'B':
       /* use ASCII/text when transferring */
@@ -1326,7 +1380,7 @@ ParameterError getparameter(const char *flag, /* f or -long-flag */
           size = 0;
         }
         else {
-          char *enc = curl_easy_escape(config->easy, postdata, (int)size);
+          char *enc = curl_easy_escape(NULL, postdata, (int)size);
           Curl_safefree(postdata); /* no matter if it worked or not */
           if(enc) {
             /* now make a string with the name from above and append the
@@ -1338,7 +1392,7 @@ ParameterError getparameter(const char *flag, /* f or -long-flag */
               return PARAM_NO_MEM;
             }
             if(nlen > 0) { /* only append '=' if we have a name */
-              snprintf(n, outlen, "%.*s=%s", nlen, nextarg, enc);
+              msnprintf(n, outlen, "%.*s=%s", nlen, nextarg, enc);
               size = outlen-1;
             }
             else {
@@ -1467,7 +1521,6 @@ ParameterError getparameter(const char *flag, /* f or -long-flag */
         GetFileAndPassword(nextarg, &config->cert, &config->key_passwd);
         break;
       case 'a': /* CA info PEM file */
-        /* CA info PEM file */
         GetStr(&config->cacert, nextarg);
         break;
       case 'b': /* cert file type */
@@ -1488,8 +1541,7 @@ ParameterError getparameter(const char *flag, /* f or -long-flag */
         if(config->engine && curl_strequal(config->engine, "list"))
           return PARAM_ENGINES_REQUESTED;
         break;
-      case 'g': /* CA info PEM file */
-        /* CA cert directory */
+      case 'g': /* CA cert directory */
         GetStr(&config->capath, nextarg);
         break;
       case 'h': /* --pubkey public key file */
@@ -1500,8 +1552,7 @@ ParameterError getparameter(const char *flag, /* f or -long-flag */
         if(!config->hostpubmd5 || strlen(config->hostpubmd5) != 32)
           return PARAM_BAD_USE;
         break;
-      case 'j': /* CRL info PEM file */
-        /* CRL file */
+      case 'j': /* CRL file */
         GetStr(&config->crlfile, nextarg);
         break;
       case 'k': /* TLS username */
@@ -1530,12 +1581,7 @@ ParameterError getparameter(const char *flag, /* f or -long-flag */
           config->ssl_allow_beast = toggle;
         break;
 
-      case 'o': /* --login-options */
-        GetStr(&config->login_options, nextarg);
-        break;
-
       case 'p': /* Pinned public key DER file */
-        /* Pinned public key DER file */
         GetStr(&config->pinnedpubkey, nextarg);
         break;
 
@@ -1610,8 +1656,7 @@ ParameterError getparameter(const char *flag, /* f or -long-flag */
         GetStr(&config->proxy_cipher_list, nextarg);
         break;
 
-      case '3': /* CRL info PEM file for proxy */
-        /* CRL file */
+      case '3': /* CRL file for proxy */
         GetStr(&config->proxy_crlfile, nextarg);
         break;
 
@@ -1625,12 +1670,10 @@ ParameterError getparameter(const char *flag, /* f or -long-flag */
         break;
 
       case '6': /* CA info PEM file for proxy */
-        /* CA info PEM file */
         GetStr(&config->proxy_cacert, nextarg);
         break;
 
-      case '7': /* CA info PEM file for proxy */
-        /* CA cert directory */
+      case '7': /* CA cert directory for proxy */
         GetStr(&config->proxy_capath, nextarg);
         break;
 
@@ -1659,6 +1702,14 @@ ParameterError getparameter(const char *flag, /* f or -long-flag */
           config->socks5_auth &= ~CURLAUTH_GSSAPI;
         break;
 
+      case 'C':
+        GetStr(&config->etag_save_file, nextarg);
+        break;
+
+      case 'D':
+        GetStr(&config->etag_compare_file, nextarg);
+        break;
+
       default: /* unknown flag */
         return PARAM_OPTION_UNKNOWN;
       }
@@ -1680,7 +1731,7 @@ ParameterError getparameter(const char *flag, /* f or -long-flag */
          to sort this out slowly and carefully */
       if(formparse(config,
                    nextarg,
-                   &config->mimepost,
+                   &config->mimeroot,
                    &config->mimecurrent,
                    (subletter == 's')?TRUE:FALSE)) /* 's' is literal string */
         return PARAM_BAD_USE;
@@ -1811,8 +1862,7 @@ ParameterError getparameter(const char *flag, /* f or -long-flag */
       break;
     case 'n':
       switch(subletter) {
-      case 'o': /* CA info PEM file */
-        /* use .netrc or URL */
+      case 'o': /* use .netrc or URL */
         config->netrc_opt = toggle;
         break;
       case 'e': /* netrc-file */
@@ -1930,7 +1980,7 @@ ParameterError getparameter(const char *flag, /* f or -long-flag */
         warnf(global,
               "A specified range MUST include at least one dash (-). "
               "Appending one for you!\n");
-        snprintf(buffer, sizeof(buffer), "%" CURL_FORMAT_CURL_OFF_T "-", off);
+        msnprintf(buffer, sizeof(buffer), "%" CURL_FORMAT_CURL_OFF_T "-", off);
         Curl_safefree(config->range);
         config->range = strdup(buffer);
         if(!config->range)
@@ -1938,8 +1988,7 @@ ParameterError getparameter(const char *flag, /* f or -long-flag */
       }
       {
         /* byte range requested */
-        char *tmp_range;
-        tmp_range = nextarg;
+        const char *tmp_range = nextarg;
         while(*tmp_range != '\0') {
           if(!ISDIGIT(*tmp_range) && *tmp_range != '-' && *tmp_range != ',') {
             warnf(global, "Invalid character is found in given range. "
@@ -2061,6 +2110,7 @@ ParameterError getparameter(const char *flag, /* f or -long-flag */
           fname = nextarg;
           file = fopen(nextarg, FOPEN_READTEXT);
         }
+        Curl_safefree(config->writeout);
         err = file2string(&config->writeout, file);
         if(file && (file != stdin))
           fclose(file);
@@ -2104,6 +2154,24 @@ ParameterError getparameter(const char *flag, /* f or -long-flag */
       if(!config->low_speed_time)
         config->low_speed_time = 30;
       break;
+    case 'Z':
+      switch(subletter) {
+      case '\0':  /* --parallel */
+        global->parallel = toggle;
+        break;
+      case 'b':   /* --parallel-max */
+        err = str2unum(&global->parallel_max, nextarg);
+        if(err)
+          return err;
+        if((global->parallel_max > MAX_PARALLEL) ||
+           (global->parallel_max < 1))
+          global->parallel_max = PARALLEL_DEFAULT;
+        break;
+      case 'c':   /* --parallel-connect */
+        global->parallel_connect = toggle;
+        break;
+      }
+      break;
     case 'z': /* time condition coming up */
       switch(*nextarg) {
       case '+':
@@ -2153,14 +2221,14 @@ ParameterError getparameter(const char *flag, /* f or -long-flag */
   return PARAM_OK;
 }
 
-ParameterError parse_args(struct GlobalConfig *config, int argc,
+ParameterError parse_args(struct GlobalConfig *global, int argc,
                           argv_item_t argv[])
 {
   int i;
   bool stillflags;
   char *orig_opt = NULL;
   ParameterError result = PARAM_OK;
-  struct OperationConfig *operation = config->first;
+  struct OperationConfig *config = global->first;
 
   for(i = 1, stillflags = TRUE; i < argc && !result; i++) {
     orig_opt = argv[i];
@@ -2176,31 +2244,28 @@ ParameterError parse_args(struct GlobalConfig *config, int argc,
       else {
         char *nextarg = (i < (argc - 1)) ? argv[i + 1] : NULL;
 
-        result = getparameter(flag, nextarg, &passarg, config, operation);
+        result = getparameter(flag, nextarg, &passarg, global, config);
         if(result == PARAM_NEXT_OPERATION) {
           /* Reset result as PARAM_NEXT_OPERATION is only used here and not
              returned from this function */
           result = PARAM_OK;
 
-          if(operation->url_list && operation->url_list->url) {
+          if(config->url_list && config->url_list->url) {
             /* Allocate the next config */
-            operation->next = malloc(sizeof(struct OperationConfig));
-            if(operation->next) {
+            config->next = malloc(sizeof(struct OperationConfig));
+            if(config->next) {
               /* Initialise the newly created config */
-              config_init(operation->next);
-
-              /* Copy the easy handle */
-              operation->next->easy = config->easy;
+              config_init(config->next);
 
               /* Set the global config pointer */
-              operation->next->global = config;
+              config->next->global = global;
 
-              /* Update the last operation pointer */
-              config->last = operation->next;
+              /* Update the last config pointer */
+              global->last = config->next;
 
               /* Move onto the new config */
-              operation->next->prev = operation;
-              operation = operation->next;
+              config->next->prev = config;
+              config = config->next;
             }
             else
               result = PARAM_NO_MEM;
@@ -2214,8 +2279,8 @@ ParameterError parse_args(struct GlobalConfig *config, int argc,
       bool used;
 
       /* Just add the URL please */
-      result = getparameter((char *)"--url", argv[i], &used, config,
-                            operation);
+      result = getparameter((char *)"--url", argv[i], &used, global,
+                            config);
     }
   }
 
@@ -2226,9 +2291,9 @@ ParameterError parse_args(struct GlobalConfig *config, int argc,
     const char *reason = param2text(result);
 
     if(orig_opt && strcmp(":", orig_opt))
-      helpf(config->errors, "option %s: %s\n", orig_opt, reason);
+      helpf(global->errors, "option %s: %s\n", orig_opt, reason);
     else
-      helpf(config->errors, "%s\n", reason);
+      helpf(global->errors, "%s\n", reason);
   }
 
   return result;
index daf83b8..f6fcd5a 100644 (file)
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -42,6 +42,7 @@ typedef enum {
   PARAM_NEXT_OPERATION,
   PARAM_NO_PREFIX,
   PARAM_NUMBER_TOO_LARGE,
+  PARAM_NO_NOT_BOOLEAN,
   PARAM_LAST
 } ParameterError;
 
index e5e2d6d..dfe363b 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
  ***************************************************************************/
 #include "tool_setup.h"
 
+#if defined(__AMIGA__) && !defined(__amigaos4__)
+#  undef HAVE_TERMIOS_H
+#endif
+
 #ifndef HAVE_GETPASS_R
 /* this file is only for systems without getpass_r() */
 
@@ -89,7 +93,7 @@ char *getpass_r(const char *prompt, char *buffer, size_t buflen)
     if((sts & 1) && (iosb.iosb$w_status & 1))
       buffer[iosb.iosb$w_bcnt] = '\0';
 
-    sts = sys$dassgn(chan);
+    sys$dassgn(chan);
   }
   return buffer; /* we always return success */
 }
index d2deed3..8d3f345 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -20,6 +20,9 @@
  *
  ***************************************************************************/
 #include "tool_setup.h"
+#if defined(HAVE_STRCASECMP) && defined(HAVE_STRINGS_H)
+#include <strings.h>
+#endif
 
 #include "tool_panykey.h"
 #include "tool_help.h"
@@ -48,6 +51,8 @@ struct helptxt {
 static const struct helptxt helptext[] = {
   {"    --abstract-unix-socket <path>",
    "Connect via abstract Unix domain socket"},
+  {"    --alt-svc <file name>",
+   "Enable alt-svc with this cache file"},
   {"    --anyauth",
    "Pick any authentication method"},
   {"-a, --append",
@@ -78,7 +83,7 @@ static const struct helptxt helptext[] = {
    "Connect to host"},
   {"-C, --continue-at <offset>",
    "Resumed transfer offset"},
-  {"-b, --cookie <data>",
+  {"-b, --cookie <data|filename>",
    "Send cookies from string/file"},
   {"-c, --cookie-jar <filename>",
    "Write cookies to <filename> after operation"},
@@ -126,6 +131,10 @@ static const struct helptxt helptext[] = {
    "EGD socket path for random data"},
   {"    --engine <name>",
    "Crypto engine to use"},
+  {"    --etag-save <file>",
+   "Get an ETag from response header and save it to a FILE"},
+  {"    --etag-compare <file>",
+   "Get an ETag from a file and send a conditional request"},
   {"    --expect100-timeout <seconds>",
    "How long to wait for 100-continue"},
   {"-f, --fail",
@@ -176,6 +185,8 @@ static const struct helptxt helptext[] = {
    "This help text"},
   {"    --hostpubmd5 <md5>",
    "Acceptable MD5 hash of the host public key"},
+  {"    --http0.9",
+   "Allow HTTP 0.9 responses"},
   {"-0, --http1.0",
    "Use HTTP 1.0"},
   {"    --http1.1",
@@ -184,6 +195,8 @@ static const struct helptxt helptext[] = {
    "Use HTTP 2"},
   {"    --http2-prior-knowledge",
    "Use HTTP 2 without HTTP/1.1 Upgrade"},
+  {"    --http3",
+   "Use HTTP v3"},
   {"    --ignore-content-length",
    "Ignore the size of the remote resource"},
   {"-i, --include",
@@ -254,6 +267,8 @@ static const struct helptxt helptext[] = {
    "Disable TCP keepalive on the connection"},
   {"    --no-npn",
    "Disable the NPN TLS extension"},
+  {"    --no-progress-meter",
+   "Do not show the progress meter"},
   {"    --no-sessionid",
    "Disable SSL session-ID reusing"},
   {"    --noproxy <no-proxy-list>",
@@ -266,6 +281,12 @@ static const struct helptxt helptext[] = {
    "OAuth 2 Bearer Token"},
   {"-o, --output <file>",
    "Write to file instead of stdout"},
+  {"-Z, --parallel",
+   "Perform transfers in parallel"},
+  {"    --parallel-immediate",
+   "Do not wait for multiplexing (with --parallel)"},
+  {"    --parallel-max",
+   "Maximum concurrency for parallel transfers"},
   {"    --pass <phrase>",
    "Pass phrase for the private key"},
   {"    --path-as-is",
@@ -328,8 +349,8 @@ static const struct helptxt helptext[] = {
    "SPNEGO proxy service name"},
   {"    --proxy-ssl-allow-beast",
    "Allow security flaw for interop for HTTPS proxy"},
-  {"    --proxy-tls13-ciphers <ciphersuite list>",
-   "TLS 1.3 proxy cipher suites"},
+  {"    --proxy-tls13-ciphers <list>",
+   "TLS 1.3 ciphersuites for proxy (OpenSSL)"},
   {"    --proxy-tlsauthtype <type>",
    "TLS authentication type for HTTPS proxy"},
   {"    --proxy-tlspassword <string>",
@@ -378,6 +399,8 @@ static const struct helptxt helptext[] = {
    "Wait time between retries"},
   {"    --retry-max-time <seconds>",
    "Retry only within this period"},
+  {"    --sasl-authzid <identity> ",
+   "Use this identity to act as during SASL PLAIN authentication"},
   {"    --sasl-ir",
    "Enable initial response in SASL authentication"},
   {"    --service-name <name>",
@@ -411,7 +434,7 @@ static const struct helptxt helptext[] = {
   {"    --ssl-allow-beast",
    "Allow security flaw to improve interop"},
   {"    --ssl-no-revoke",
-   "Disable cert revocation checks (WinSSL)"},
+   "Disable cert revocation checks (Schannel)"},
   {"    --ssl-reqd",
    "Require SSL/TLS"},
   {"-2, --sslv2",
@@ -437,9 +460,9 @@ static const struct helptxt helptext[] = {
   {"-z, --time-cond <time>",
    "Transfer based on a time condition"},
   {"    --tls-max <VERSION>",
-   "Use TLSv1.0 or greater"},
-  {"    --tls13-ciphers <list of TLS 1.3 ciphersuites>",
-   "TLS 1.3 cipher suites to use"},
+   "Set maximum allowed TLS version"},
+  {"    --tls13-ciphers <list>",
+   "TLS 1.3 ciphersuites (OpenSSL)"},
   {"    --tlsauthtype <type>",
    "TLS authentication type"},
   {"    --tlspassword",
@@ -519,10 +542,13 @@ static const struct feat feats[] = {
   {"CharConv",       CURL_VERSION_CONV},
   {"TLS-SRP",        CURL_VERSION_TLSAUTH_SRP},
   {"HTTP2",          CURL_VERSION_HTTP2},
+  {"HTTP3",          CURL_VERSION_HTTP3},
   {"UnixSockets",    CURL_VERSION_UNIX_SOCKETS},
   {"HTTPS-proxy",    CURL_VERSION_HTTPS_PROXY},
   {"MultiSSL",       CURL_VERSION_MULTI_SSL},
   {"PSL",            CURL_VERSION_PSL},
+  {"alt-svc",        CURL_VERSION_ALTSVC},
+  {"ESNI",           CURL_VERSION_ESNI},
 };
 
 void tool_help(void)
@@ -538,6 +564,21 @@ void tool_help(void)
   }
 }
 
+static int
+featcomp(const void *p1, const void *p2)
+{
+  /* The arguments to this function are "pointers to pointers to char", but
+     the comparison arguments are "pointers to char", hence the following cast
+     plus dereference */
+#ifdef HAVE_STRCASECMP
+  return strcasecmp(* (char * const *) p1, * (char * const *) p2);
+#elif defined(HAVE_STRCMPI)
+  return strcmpi(* (char * const *) p1, * (char * const *) p2);
+#else
+  return strcmp(* (char * const *) p1, * (char * const *) p2);
+#endif
+}
+
 void tool_version_info(void)
 {
   const char *const *proto;
@@ -557,21 +598,31 @@ void tool_version_info(void)
     puts(""); /* newline */
   }
   if(curlinfo->features) {
+    char *featp[ sizeof(feats) / sizeof(feats[0]) + 1];
+    size_t numfeat = 0;
     unsigned int i;
-    printf("Features: ");
+    printf("Features:");
     for(i = 0; i < sizeof(feats)/sizeof(feats[0]); i++) {
       if(curlinfo->features & feats[i].bitmask)
-        printf("%s ", feats[i].name);
+        featp[numfeat++] = (char *)feats[i].name;
     }
 #ifdef USE_METALINK
-    printf("Metalink ");
+    featp[numfeat++] = (char *)"Metalink";
 #endif
+    qsort(&featp[0], numfeat, sizeof(char *), featcomp);
+    for(i = 0; i< numfeat; i++)
+      printf(" %s", featp[i]);
     puts(""); /* newline */
   }
+  if(strcmp(CURL_VERSION, curlinfo->version)) {
+    printf("WARNING: curl and libcurl versions do not match. "
+           "Functionality may be affected.\n");
+  }
 }
 
-void tool_list_engines(CURL *curl)
+void tool_list_engines(void)
 {
+  CURL *curl = curl_easy_init();
   struct curl_slist *engines = NULL;
 
   /* Get the list of engines */
@@ -588,4 +639,5 @@ void tool_list_engines(CURL *curl)
 
   /* Cleanup the list of engines */
   curl_slist_free_all(engines);
+  curl_easy_cleanup(curl);
 }
index 0289f30..bfb5dcd 100644 (file)
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -24,7 +24,7 @@
 #include "tool_setup.h"
 
 void tool_help(void);
-void tool_list_engines(CURL *curl);
+void tool_list_engines(void);
 void tool_version_info(void);
 
 #endif /* HEADER_CURL_TOOL_HELP_H */
index b3a9516..61788b7 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -66,6 +66,8 @@ const char *param2text(int res)
     return "the given option can't be reversed with a --no- prefix";
   case PARAM_NUMBER_TOO_LARGE:
     return "too large number";
+  case PARAM_NO_NOT_BOOLEAN:
+    return "used '--no-' for option that isn't a boolean";
   default:
     return "unknown error";
   }
index 33483eb..67d28be 100644 (file)
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
index 483553d..6bc6955 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
index 98d94b8..1f9d54a 100644 (file)
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
index 0bef964..d02856e 100644 (file)
@@ -159,28 +159,49 @@ void hugehelp(void)
  fputs(
 "       but prefix it with \"no-\". However, in this list we mostly only list and\n"
 "       show  the --option version of them. (This concept with --no options was\n"
-"       added in  7.19.0.  Previously  most  options  were  toggled  on/off  on\n"
-"       repeated use of the same command line option.)\n"
+"       added in 7.19.0. Previously most options were  toggled  on/off  on  re-\n"
+"       peated use of the same command line option.)\n"
 "\n"
 "       --abstract-unix-socket <path>\n"
 "              (HTTP)  Connect  through an abstract Unix domain socket, instead\n"
-"              of using the network.   Note:  netstat  shows  the  path  of  an\n"
+"              of using the network.  Note: netstat shows the path  of  an  ab-\n"
 , stdout);
  fputs(
-"              abstract  socket  prefixed with '@', however the <path> argument\n"
+"              stract  socket  prefixed  with  '@', however the <path> argument\n"
 "              should not have this leading character.\n"
 "\n"
 "              Added in 7.53.0.\n"
 "\n"
+"       --alt-svc <file name>\n"
+"              (HTTPS) WARNING: this option is experimental. Do not use in pro-\n"
+"              duction.\n"
+"\n"
+"              This option enables the alt-svc parser in curl. If the file name\n"
+"              points to an existing alt-svc cache file, that will be used. Af-\n"
+, stdout);
+ fputs(
+"              ter  a  completed  transfer, the cache will be saved to the file\n"
+"              name again if it has been modified.\n"
+"\n"
+"              Specify a \"\" file name (zero length) to avoid loading/saving and\n"
+"              make curl just handle the cache in memory.\n"
+"\n"
+"              If  this  option  is used several times, curl will load contents\n"
+"              from all the files but the the last one will be used for saving.\n"
+"\n"
+"              Added in 7.64.1.\n"
+"\n"
 "       --anyauth\n"
+, stdout);
+ fputs(
 "              (HTTP) Tells curl to figure out authentication method by itself,\n"
 "              and  use  the most secure one the remote site claims to support.\n"
 "              This is done by first doing a request and checking the response-\n"
 "              headers,  thus  possibly  inducing  an extra network round-trip.\n"
-, stdout);
- fputs(
 "              This is  used  instead  of  setting  a  specific  authentication\n"
 "              method,  which  you  can  do with --basic, --digest, --ntlm, and\n"
+, stdout);
+ fputs(
 "              --negotiate.\n"
 "\n"
 "              Using --anyauth is not recommended if you do uploads from stdin,\n"
@@ -188,86 +209,86 @@ void hugehelp(void)
 "              must be able to rewind. If the need should arise when  uploading\n"
 "              from stdin, the upload operation will fail.\n"
 "\n"
-, stdout);
- fputs(
 "              Used together with -u, --user.\n"
 "\n"
 "              See also --proxy-anyauth and --basic and --digest.\n"
 "\n"
 "       -a, --append\n"
+, stdout);
+ fputs(
 "              (FTP SFTP) When used in an upload, this makes curl append to the\n"
 "              target file instead  of  overwriting  it.  If  the  remote  file\n"
-"              doesn't  exist,  it  will  be  created.   Note that this flag is\n"
-"              ignored by some SFTP servers (including OpenSSH).\n"
+"              doesn't  exist,  it will be created.  Note that this flag is ig-\n"
+"              nored by some SFTP servers (including OpenSSH).\n"
 "\n"
 "       --basic\n"
+"              (HTTP) Tells curl to use HTTP Basic authentication with the  re-\n"
+"              mote host. This is the default and this option is usually point-\n"
 , stdout);
  fputs(
-"              (HTTP) Tells curl to use  HTTP  Basic  authentication  with  the\n"
-"              remote  host.  This  is  the  default and this option is usually\n"
-"              pointless, unless you use it to override a previously set option\n"
-"              that  sets  a  different  authentication method (such as --ntlm,\n"
-"              --digest, or --negotiate).\n"
+"              less, unless you use it to override a previously set option that\n"
+"              sets  a  different  authentication method (such as --ntlm, --di-\n"
+"              gest, or --negotiate).\n"
 "\n"
 "              Used together with -u, --user.\n"
 "\n"
 "              See also --proxy-basic.\n"
 "\n"
 "       --cacert <file>\n"
-, stdout);
- fputs(
 "              (TLS) Tells curl to use the specified certificate file to verify\n"
 "              the  peer.  The  file  may contain multiple CA certificates. The\n"
+, stdout);
+ fputs(
 "              certificate(s) must be in PEM format. Normally curl is built  to\n"
 "              use a default file for this, so this option is typically used to\n"
 "              alter that default file.\n"
 "\n"
 "              curl recognizes the environment variable named  'CURL_CA_BUNDLE'\n"
-, stdout);
- fputs(
 "              if  it  is  set,  and uses the given path as a path to a CA cert\n"
 "              bundle. This option overrides that variable.\n"
 "\n"
 "              The windows version of curl will automatically  look  for  a  CA\n"
+, stdout);
+ fputs(
 "              certs file named 'curl-ca-bundle.crt', either in the same direc-\n"
 "              tory as curl.exe, or in the Current Working Directory, or in any\n"
 "              folder along your PATH.\n"
 "\n"
 "              If  curl  is  built  against  the  NSS  SSL library, the NSS PEM\n"
-, stdout);
- fputs(
-"              PKCS#11 module (libnsspem.so) needs to  be  available  for  this\n"
-"              option to work properly.\n"
+"              PKCS#11 module (libnsspem.so) needs to be available for this op-\n"
+"              tion to work properly.\n"
 "\n"
 "              (iOS  and macOS only) If curl is built against Secure Transport,\n"
+, stdout);
+ fputs(
 "              then this option is supported for  backward  compatibility  with\n"
 "              other  SSL  engines,  but it should not be set. If the option is\n"
 "              not set, then curl will use the certificates in the  system  and\n"
-, stdout);
- fputs(
 "              user  Keychain to verify the peer, which is the preferred method\n"
 "              of verifying the peer's certificate chain.\n"
 "\n"
-"              (Schannel/WinSSL only) This option is supported  for  WinSSL  in\n"
-"              Windows  7  or  later with libcurl 7.60 or later. This option is\n"
-"              supported for backward compatibility  with  other  SSL  engines;\n"
-"              instead it is recommended to use Windows' store of root certifi-\n"
-"              cates (the default for WinSSL).\n"
-"\n"
+"              (Schannel only) This option is supported for Schannel in Windows\n"
 , stdout);
  fputs(
+"              7  or later with libcurl 7.60 or later. This option is supported\n"
+"              for backward compatibility with other SSL engines; instead it is\n"
+"              recommended  to use Windows' store of root certificates (the de-\n"
+"              fault for Schannel).\n"
+"\n"
 "              If this option is used several times, the last one will be used.\n"
 "\n"
 "       --capath <dir>\n"
 "              (TLS) Tells curl to use the specified certificate  directory  to\n"
+, stdout);
+ fputs(
 "              verify  the  peer.  Multiple paths can be provided by separating\n"
 "              them with \":\" (e.g.  \"path1:path2:path3\"). The certificates must\n"
-"              be  in  PEM  format,  and  if curl is built against OpenSSL, the\n"
-"              directory must have been processed using  the  c_rehash  utility\n"
+"              be  in PEM format, and if curl is built against OpenSSL, the di-\n"
+"              rectory must have been processed using the c_rehash utility sup-\n"
+"              plied  with  OpenSSL.  Using  --capath can allow OpenSSL-powered\n"
+"              curl to make SSL-connections much more  efficiently  than  using\n"
 , stdout);
  fputs(
-"              supplied  with OpenSSL. Using --capath can allow OpenSSL-powered\n"
-"              curl to make SSL-connections much more  efficiently  than  using\n"
 "              --cacert if the --cacert file contains many CA certificates.\n"
 "\n"
 "              If this option is set, the default capath value will be ignored,\n"
@@ -275,11 +296,11 @@ void hugehelp(void)
 "\n"
 "       --cert-status\n"
 "              (TLS) Tells curl to verify the status of the server  certificate\n"
-, stdout);
- fputs(
 "              by using the Certificate Status Request (aka. OCSP stapling) TLS\n"
 "              extension.\n"
 "\n"
+, stdout);
+ fputs(
 "              If this option is enabled and the server sends an invalid  (e.g.\n"
 "              expired) response, if the response suggests that the server cer-\n"
 "              tificate has been revoked, or no response at  all  is  received,\n"
@@ -288,11 +309,11 @@ void hugehelp(void)
 "              This  is  currently  only implemented in the OpenSSL, GnuTLS and\n"
 "              NSS backends.\n"
 "\n"
-, stdout);
- fputs(
 "              Added in 7.41.0.\n"
 "\n"
 "       --cert-type <type>\n"
+, stdout);
+ fputs(
 "              (TLS) Tells curl what type the provided  client  certificate  is\n"
 "              using. PEM, DER, ENG and P12 are recognized types.  If not spec-\n"
 "              ified, PEM is assumed.\n"
@@ -302,71 +323,71 @@ void hugehelp(void)
 "              See also -E, --cert and --key and --key-type.\n"
 "\n"
 "       -E, --cert <certificate[:password]>\n"
+"              (TLS) Tells curl to use the specified  client  certificate  file\n"
 , stdout);
  fputs(
-"              (TLS) Tells curl to use the specified  client  certificate  file\n"
 "              when getting a file with HTTPS, FTPS or another SSL-based proto-\n"
 "              col. The certificate must be in PKCS#12 format if  using  Secure\n"
-"              Transport,  or  PEM  format  if  using any other engine.  If the\n"
-"              optional password isn't specified, it will be queried for on the\n"
+"              Transport,  or PEM format if using any other engine.  If the op-\n"
+"              tional password isn't specified, it will be queried for  on  the\n"
 "              terminal.  Note  that  this  option assumes a \"certificate\" file\n"
+"              that is the private key and the client certificate concatenated!\n"
 , stdout);
  fputs(
-"              that is the private key and the client certificate concatenated!\n"
 "              See -E, --cert and --key to specify them independently.\n"
 "\n"
 "              If  curl  is  built against the NSS SSL library then this option\n"
 "              can tell curl the nickname of the certificate to use within  the\n"
 "              NSS  database defined by the environment variable SSL_DIR (or by\n"
 "              default /etc/pki/nssdb). If the NSS  PEM  PKCS#11  module  (lib-\n"
+"              nsspem.so)  is  available  then  PEM files may be loaded. If you\n"
 , stdout);
  fputs(
-"              nsspem.so)  is  available  then  PEM files may be loaded. If you\n"
 "              want to use a file from the current directory, please precede it\n"
 "              with  \"./\"  prefix, in order to avoid confusion with a nickname.\n"
 "              If the nickname contains \":\", it needs to be preceded by \"\\\"  so\n"
 "              that  it  is not recognized as password delimiter.  If the nick-\n"
 "              name contains \"\\\", it needs to be escaped as \"\\\\\" so that it  is\n"
-, stdout);
- fputs(
 "              not recognized as an escape character.\n"
 "\n"
+, stdout);
+ fputs(
 "              If  curl is built against OpenSSL library, and the engine pkcs11\n"
 "              is available, then a PKCS#11 URI (RFC 7512) can be used to spec-\n"
 "              ify  a  certificate located in a PKCS#11 device. A string begin-\n"
 "              ning with \"pkcs11:\" will be interpreted as a PKCS#11 URI.  If  a\n"
 "              PKCS#11 URI is provided, then the --engine option will be set as\n"
+"              \"pkcs11\" if none was provided and the --cert-type option will be\n"
 , stdout);
  fputs(
-"              \"pkcs11\" if none was provided and the --cert-type option will be\n"
 "              set as \"ENG\" if none was provided.\n"
 "\n"
 "              (iOS  and macOS only) If curl is built against Secure Transport,\n"
 "              then the certificate string can either be the name of a certifi-\n"
 "              cate/private  key in the system or user keychain, or the path to\n"
 "              a PKCS#12-encoded certificate and private key. If  you  want  to\n"
+"              use  a  file  from the current directory, please precede it with\n"
 , stdout);
  fputs(
-"              use  a  file  from the current directory, please precede it with\n"
 "              \"./\" prefix, in order to avoid confusion with a nickname.\n"
 "\n"
-"              (Schannel/WinSSL only) Client certificates must be specified  by\n"
-"              a  path  expression  to a certificate store. (Loading PFX is not\n"
-"              supported; you can import it to a  store  first).  You  can  use\n"
-"              \"<store  location>\\<store name>\\<thumbprint>\" to refer to a cer-\n"
+"              (Schannel only) Client certificates must be specified by a  path\n"
+"              expression  to  a  certificate  store.  (Loading PFX is not sup-\n"
+"              ported; you can import it to a store first). You can use \"<store\n"
+"              location>\\<store  name>\\<thumbprint>\"  to refer to a certificate\n"
+"              in  the  system  certificates  store,  for   example,   \"Curren-\n"
 , stdout);
  fputs(
-"              tificate in the system certificates store, for example, \"Curren-\n"
 "              tUser\\MY\\934a7ac6f8a5d579285a74fa61e19f23ddfe8d7a\".   Thumbprint\n"
 "              is usually a SHA-1 hex string which you can see  in  certificate\n"
 "              details.  Following  store locations are supported: CurrentUser,\n"
 "              LocalMachine, CurrentService, Services,  CurrentUserGroupPolicy,\n"
 "              LocalMachineGroupPolicy, LocalMachineEnterprise.\n"
 "\n"
-, stdout);
- fputs(
 "              If this option is used several times, the last one will be used.\n"
 "\n"
+, stdout);
+ fputs(
 "              See also --cert-type and --key and --key-type.\n"
 "\n"
 "       --ciphers <list of ciphers>\n"
@@ -376,11 +397,11 @@ void hugehelp(void)
 "\n"
 "               https://curl.haxx.se/docs/ssl-ciphers.html\n"
 "\n"
-, stdout);
- fputs(
 "              If this option is used several times, the last one will be used.\n"
 "\n"
 "       --compressed-ssh\n"
+, stdout);
+ fputs(
 "              (SCP SFTP) Enables built-in SSH compression.  This is a request,\n"
 "              not an order; the server may or may not do it.\n"
 "\n"
@@ -388,43 +409,43 @@ void hugehelp(void)
 "\n"
 "       --compressed\n"
 "              (HTTP) Request a compressed response using one of the algorithms\n"
-"              curl  supports,  and  save  the  uncompressed document.  If this\n"
-, stdout);
- fputs(
-"              option is used and the server  sends  an  unsupported  encoding,\n"
-"              curl will report an error.\n"
+"              curl  supports, and save the uncompressed document.  If this op-\n"
+"              tion is used and the server sends an unsupported encoding,  curl\n"
+"              will report an error.\n"
 "\n"
 "       -K, --config <file>\n"
 "\n"
+, stdout);
+ fputs(
 "              Specify  a  text  file  to read curl arguments from. The command\n"
 "              line arguments found in the text file will be used  as  if  they\n"
 "              were provided on the command line.\n"
 "\n"
 "              Options  and their parameters must be specified on the same line\n"
-, stdout);
- fputs(
 "              in the file, separated by whitespace, colon, or the equals sign.\n"
 "              Long  option  names  can  optionally be given in the config file\n"
+, stdout);
+ fputs(
 "              without the initial double dashes and if so, the colon or equals\n"
 "              characters can be used as separators. If the option is specified\n"
 "              with one or two dashes, there can be no colon or equals  charac-\n"
 "              ter between the option and its parameter.\n"
 "\n"
+"              If  the  parameter  contains whitespace (or starts with : or =),\n"
+"              the parameter must be  enclosed  within  quotes.  Within  double\n"
 , stdout);
  fputs(
-"              If the parameter is to contain whitespace, the parameter must be\n"
-"              enclosed within quotes.  Within  double  quotes,  the  following\n"
-"              escape  sequences  are  available:  \\\\, \\\", \\t, \\n, \\r and \\v. A\n"
-"              backslash preceding any other letter is ignored.  If  the  first\n"
-"              column of a config line is a '#' character, the rest of the line\n"
-"              will be treated as a comment. Only write one option per physical\n"
-, stdout);
- fputs(
-"              line in the config file.\n"
+"              quotes,  the  following  escape sequences are available: \\\\, \\\",\n"
+"              \\t, \\n, \\r and \\v. A backslash preceding any other letter is ig-\n"
+"              nored.  If the first column of a config line is a '#' character,\n"
+"              the rest of the line will be treated as a  comment.  Only  write\n"
+"              one option per physical line in the config file.\n"
 "\n"
 "              Specify  the  filename  to -K, --config as '-' to make curl read\n"
 "              the file from stdin.\n"
 "\n"
+, stdout);
+ fputs(
 "              Note that to be able to specify a URL in the  config  file,  you\n"
 "              need  to  specify  it  using the --url option, and not by simply\n"
 "              writing the URL on its own line. So, it could  look  similar  to\n"
@@ -432,32 +453,32 @@ void hugehelp(void)
 "\n"
 "              url = \"https://curl.haxx.se/docs/\"\n"
 "\n"
-, stdout);
- fputs(
 "              When  curl  is invoked, it (unless -q, --disable is used) checks\n"
 "              for a default config file and uses it if found. The default con-\n"
+, stdout);
+ fputs(
 "              fig file is checked for in the following places in this order:\n"
 "\n"
 "              1)  curl  tries  to find the \"home dir\": It first checks for the\n"
 "              CURL_HOME and then the HOME environment variables. Failing that,\n"
 "              it  uses getpwuid() on Unix-like systems (which returns the home\n"
-, stdout);
- fputs(
 "              dir given the current user in your system). On Windows, it  then\n"
 "              checks for the APPDATA variable, or as a last resort the '%USER-\n"
+, stdout);
+ fputs(
 "              PROFILE%\\Application Data'.\n"
 "\n"
-"              2) On windows, if there is no _curlrc file in the home  dir,  it\n"
+"              2) On windows, if there is no .curlrc file in the home  dir,  it\n"
 "              checks for one in the same dir the curl executable is placed. On\n"
 "              Unix-like systems, it will simply try to load .curlrc  from  the\n"
 "              determined home dir.\n"
 "\n"
-, stdout);
- fputs(
 "              # --- Example file ---\n"
 "              # this is a comment\n"
 "              url = \"example.com\"\n"
 "              output = \"curlhere.html\"\n"
+, stdout);
+ fputs(
 "              user-agent = \"superagent/1.0\"\n"
 "\n"
 "              # and fetch another URL too\n"
@@ -467,12 +488,12 @@ void hugehelp(void)
 "              # --- End of example file ---\n"
 "\n"
 "              This  option  can be used multiple times to load multiple config\n"
-, stdout);
- fputs(
 "              files.\n"
 "\n"
 "       --connect-timeout <seconds>\n"
 "              Maximum time in seconds that  you  allow  curl's  connection  to\n"
+, stdout);
+ fputs(
 "              take.   This  only  limits the connection phase, so if curl con-\n"
 "              nects within the given period it will continue - if not it  will\n"
 "              exit.  Since version 7.32.0, this option accepts decimal values.\n"
@@ -480,132 +501,132 @@ void hugehelp(void)
 "\n"
 "              See also -m, --max-time.\n"
 "\n"
-, stdout);
- fputs(
 "       --connect-to <HOST1:PORT1:HOST2:PORT2>\n"
 "\n"
 "              For  a  request  to  the  given  HOST1:PORT1  pair,  connect  to\n"
+, stdout);
+ fputs(
 "              HOST2:PORT2 instead.  This option is suitable to direct requests\n"
 "              at a specific server, e.g. at a specific cluster node in a clus-\n"
 "              ter of servers. This option is only used to establish  the  net-\n"
 "              work  connection.  It  does NOT affect the hostname/port that is\n"
-, stdout);
- fputs(
 "              used for TLS/SSL (e.g. SNI, certificate verification) or for the\n"
 "              application  protocols.  \"HOST1\"  and  \"PORT1\"  may be the empty\n"
+, stdout);
+ fputs(
 "              string, meaning \"any host/port\". \"HOST2\" and \"PORT2\" may also be\n"
 "              the   empty   string,   meaning   \"use  the  request's  original\n"
 "              host/port\".\n"
 "\n"
 "              A \"host\" specified to this option is compared as a string, so it\n"
-, stdout);
- fputs(
 "              needs  to  match  the name used in request URL. It can be either\n"
-"              numerical such as \"127.0.0.1\" or the  full  host  name  such  as\n"
-"              \"example.org\".\n"
+"              numerical such as \"127.0.0.1\" or the full host name such as \"ex-\n"
+"              ample.org\".\n"
 "\n"
+, stdout);
+ fputs(
 "              This option can be used many times to add many connect rules.\n"
 "\n"
 "              See also --resolve and -H, --header. Added in 7.49.0.\n"
 "\n"
 "       -C, --continue-at <offset>\n"
 "              Continue/Resume  a  previous  file transfer at the given offset.\n"
-, stdout);
- fputs(
 "              The given offset is the exact  number  of  bytes  that  will  be\n"
 "              skipped,  counting  from the beginning of the source file before\n"
 "              it is transferred to the destination.  If used with uploads, the\n"
+, stdout);
+ fputs(
 "              FTP server command SIZE will not be used by curl.\n"
 "\n"
 "              Use  \"-C  -\" to tell curl to automatically find out where/how to\n"
 "              resume the transfer. It then uses the given  output/input  files\n"
 "              to figure that out.\n"
 "\n"
-, stdout);
- fputs(
 "              If this option is used several times, the last one will be used.\n"
 "\n"
 "              See also -r, --range.\n"
 "\n"
 "       -c, --cookie-jar <filename>\n"
 "              (HTTP)  Specify to which file you want curl to write all cookies\n"
+, stdout);
+ fputs(
 "              after a completed operation. Curl writes all  cookies  from  its\n"
 "              in-memory  cookie storage to the given file at the end of opera-\n"
 "              tions. If no cookies are known, no data  will  be  written.  The\n"
-, stdout);
- fputs(
 "              file  will  be written using the Netscape cookie file format. If\n"
 "              you set the file name to a single dash, \"-\", the cookies will be\n"
 "              written to stdout.\n"
 "\n"
+, stdout);
+ fputs(
 "              This  command  line  option will activate the cookie engine that\n"
 "              makes curl record and use cookies. Another way to activate it is\n"
 "              to use the -b, --cookie option.\n"
 "\n"
 "              If the cookie jar can't be created or written to, the whole curl\n"
-, stdout);
- fputs(
 "              operation won't fail or even report an error clearly. Using  -v,\n"
 "              --verbose  will  get  a  warning displayed, but that is the only\n"
+, stdout);
+ fputs(
 "              visible feedback you get about this possibly lethal situation.\n"
 "\n"
 "              If this option is used several times, the  last  specified  file\n"
 "              name will be used.\n"
 "\n"
-"       -b, --cookie <data>\n"
+"       -b, --cookie <data|filename>\n"
 "              (HTTP) Pass the data to the HTTP server in the Cookie header. It\n"
-, stdout);
- fputs(
 "              is supposedly the data previously received from the server in  a\n"
 "              \"Set-Cookie:\"   line.    The   data  should  be  in  the  format\n"
+, stdout);
+ fputs(
 "              \"NAME1=VALUE1; NAME2=VALUE2\".\n"
 "\n"
 "              If no '=' symbol is used in the argument, it is instead  treated\n"
 "              as a filename to read previously stored cookie from. This option\n"
-"              also activates the cookie engine which  will  make  curl  record\n"
+"              also activates the cookie engine which will make curl record in-\n"
+"              coming  cookies, which may be handy if you're using this in com-\n"
+"              bination with the -L,  --location  option  or  do  multiple  URL\n"
 , stdout);
  fputs(
-"              incoming  cookies,  which  may  be handy if you're using this in\n"
-"              combination with the -L, --location option or  do  multiple  URL\n"
-"              transfers  on  the  same  invoke.  If the file name is exactly a\n"
-"              minus (\"-\"), curl will instead the contents from stdin.\n"
+"              transfers  on the same invoke. If the file name is exactly a mi-\n"
+"              nus (\"-\"), curl will instead the contents from stdin.\n"
 "\n"
 "              The file format of the file to read cookies from should be plain\n"
 "              HTTP  headers  (Set-Cookie style) or the Netscape/Mozilla cookie\n"
 "              file format.\n"
 "\n"
-, stdout);
- fputs(
 "              The file specified with -b, --cookie is only used as  input.  No\n"
 "              cookies  will  be written to the file. To store cookies, use the\n"
+, stdout);
+ fputs(
 "              -c, --cookie-jar option.\n"
 "\n"
 "              Exercise caution if you  are  using  this  option  and  multiple\n"
 "              transfers may occur.  If you use the NAME1=VALUE1; format, or in\n"
 "              a file use the Set-Cookie format and  don't  specify  a  domain,\n"
-, stdout);
- fputs(
 "              then the cookie is sent for any domain (even after redirects are\n"
 "              followed) and cannot be modified by a server-set cookie. If  the\n"
-"              cookie  engine is enabled and a server sets a cookie of the same\n"
-"              name then both will be sent on a future transfer to that server,\n"
-"              likely  not  what  you  intended.  To address these issues set a\n"
-"              domain in Set-Cookie (doing that will include  sub  domains)  or\n"
 , stdout);
  fputs(
-"              use the Netscape format.\n"
+"              cookie  engine is enabled and a server sets a cookie of the same\n"
+"              name then both will be sent on a future transfer to that server,\n"
+"              likely not what you intended.  To address these issues set a do-\n"
+"              main in Set-Cookie (doing that will include sub domains) or  use\n"
+"              the Netscape format.\n"
 "\n"
 "              If this option is used several times, the last one will be used.\n"
+, stdout);
+ fputs(
 "              Users very often want to both read cookies from a file and write\n"
 "              updated cookies back to a file, so using both -b,  --cookie  and\n"
 "              -c, --cookie-jar in the same command line is common.\n"
 "\n"
 "       --create-dirs\n"
 "              When used in conjunction with the -o, --output option, curl will\n"
-, stdout);
- fputs(
 "              create the necessary local directory hierarchy as  needed.  This\n"
 "              option  creates the dirs mentioned with the -o, --output option,\n"
+, stdout);
+ fputs(
 "              nothing else. If the --output file name uses no dir  or  if  the\n"
 "              dirs it mentions already exist, no dir will be created.\n"
 "\n"
@@ -613,13 +634,13 @@ void hugehelp(void)
 "              create-dirs.\n"
 "\n"
 "       --crlf (FTP SMTP)  Convert  LF  to  CRLF  in  upload.  Useful  for  MVS\n"
-, stdout);
- fputs(
 "              (OS/390).\n"
 "\n"
 "              (SMTP added in 7.40.0)\n"
 "\n"
 "       --crlfile <file>\n"
+, stdout);
+ fputs(
 "              (TLS) Provide a file using PEM format with a Certificate Revoca-\n"
 "              tion List that may specify peer certificates that are to be con-\n"
 "              sidered revoked.\n"
@@ -631,10 +652,10 @@ void hugehelp(void)
 "       --data-ascii <data>\n"
 "              (HTTP) This is just an alias for -d, --data.\n"
 "\n"
-, stdout);
- fputs(
 "       --data-binary <data>\n"
 "              (HTTP)  This  posts data exactly as specified with no extra pro-\n"
+, stdout);
+ fputs(
 "              cessing whatsoever.\n"
 "\n"
 "              If you start the data with the letter @, the rest  should  be  a\n"
@@ -642,10 +663,10 @@ void hugehelp(void)
 "              does, except that newlines and carriage  returns  are  preserved\n"
 "              and conversions are never done.\n"
 "\n"
-, stdout);
- fputs(
 "              Like  -d,  --data the default content-type sent to the server is\n"
 "              application/x-www-form-urlencoded. If you want the  data  to  be\n"
+, stdout);
+ fputs(
 "              treated as arbitrary binary data by the server then set the con-\n"
 "              tent-type to octet-stream: -H \"Content-Type:  application/octet-\n"
 "              stream\".\n"
@@ -653,12 +674,12 @@ void hugehelp(void)
 "              If  this  option  is  used several times, the ones following the\n"
 "              first will append data as described in -d, --data.\n"
 "\n"
-, stdout);
- fputs(
 "       --data-raw <data>\n"
 "              (HTTP) This posts data similarly to -d, --data but  without  the\n"
 "              special interpretation of the @ character.\n"
 "\n"
+, stdout);
+ fputs(
 "              See also -d, --data. Added in 7.43.0.\n"
 "\n"
 "       --data-urlencode <data>\n"
@@ -666,240 +687,246 @@ void hugehelp(void)
 "              with the exception that this performs URL-encoding.\n"
 "\n"
 "              To be CGI-compliant, the <data> part should begin  with  a  name\n"
-, stdout);
- fputs(
 "              followed  by a separator and a content specification. The <data>\n"
 "              part can be passed to curl using one of the following syntaxes:\n"
 "\n"
 "              content\n"
+, stdout);
+ fputs(
 "                     This will make curl URL-encode the content and pass  that\n"
 "                     on.  Just  be careful so that the content doesn't contain\n"
 "                     any = or @ symbols, as that will  then  make  the  syntax\n"
 "                     match one of the other cases below!\n"
 "\n"
 "              =content\n"
-, stdout);
- fputs(
 "                     This  will make curl URL-encode the content and pass that\n"
 "                     on. The preceding = symbol is not included in the data.\n"
 "\n"
+, stdout);
+ fputs(
 "              name=content\n"
 "                     This will make curl URL-encode the content part and  pass\n"
 "                     that  on.  Note that the name part is expected to be URL-\n"
 "                     encoded already.\n"
 "\n"
 "              @filename\n"
-"                     This will  make  curl  load  data  from  the  given  file\n"
-, stdout);
- fputs(
-"                     (including  any  newlines), URL-encode that data and pass\n"
-"                     it on in the POST.\n"
+"                     This will make curl load data from the  given  file  (in-\n"
+"                     cluding  any  newlines), URL-encode that data and pass it\n"
+"                     on in the POST.\n"
 "\n"
 "              name@filename\n"
-"                     This will  make  curl  load  data  from  the  given  file\n"
-"                     (including  any  newlines), URL-encode that data and pass\n"
-"                     it on in the POST. The  name  part  gets  an  equal  sign\n"
-"                     appended, resulting in name=urlencoded-file-content. Note\n"
 , stdout);
  fputs(
+"                     This will make curl load data from the  given  file  (in-\n"
+"                     cluding  any  newlines), URL-encode that data and pass it\n"
+"                     on in the POST. The name part  gets  an  equal  sign  ap-\n"
+"                     pended,  resulting  in name=urlencoded-file-content. Note\n"
 "                     that the name is expected to be URL-encoded already.\n"
 "       See also -d, --data and --data-raw. Added in 7.18.0.\n"
 "\n"
 "       -d, --data <data>\n"
+, stdout);
+ fputs(
 "              (HTTP) Sends the specified data in a POST request  to  the  HTTP\n"
 "              server,  in  the  same  way  that a browser does when a user has\n"
 "              filled in an HTML form and presses the submit button. This  will\n"
 "              cause curl to pass the data to the server using the content-type\n"
-, stdout);
- fputs(
 "              application/x-www-form-urlencoded.  Compare to -F, --form.\n"
 "\n"
 "              --data-raw is almost the same but does not have a special inter-\n"
+, stdout);
+ fputs(
 "              pretation  of  the  @ character. To post data purely binary, you\n"
 "              should instead use the --data-binary option.  To URL-encode  the\n"
 "              value of a form field you may use --data-urlencode.\n"
 "\n"
 "              If  any of these options is used more than once on the same com-\n"
-, stdout);
- fputs(
 "              mand line, the data pieces specified  will  be  merged  together\n"
 "              with  a  separating  &-symbol.  Thus,  using  '-d name=daniel -d\n"
+, stdout);
+ fputs(
 "              skill=lousy'  would  generate  a  post  chunk  that  looks  like\n"
 "              'name=daniel&skill=lousy'.\n"
 "\n"
 "              If  you  start  the data with the letter @, the rest should be a\n"
 "              file name to read the data from, or - if you want curl  to  read\n"
+"              the data from stdin. Multiple files can also be specified. Post-\n"
+"              ing data from a file named 'foobar' would thus be done with  -d,\n"
 , stdout);
  fputs(
-"              the data from stdin. Multiple files can also be specified. Post-\n"
-"              ing data from a file named  from  a  file  like  that,  carriage\n"
-"              returns and newlines will be stripped out. If you don't want the\n"
-"              @ character to have  a  special  interpretation  use  --data-raw\n"
-"              instead.\n"
+"              --data  @foobar.  When  --data  is told to read from a file like\n"
+"              that, carriage returns and newlines will be stripped out. If you\n"
+"              don't  want the @ character to have a special interpretation use\n"
+"              --data-raw instead.\n"
 "\n"
 "              See also --data-binary and --data-urlencode and --data-raw. This\n"
-"              option overrides -F, --form and -I,  --head  and  -T,  --upload-\n"
-, stdout);
- fputs(
+"              option  overrides  -F,  --form  and -I, --head and -T, --upload-\n"
 "              file.\n"
 "\n"
 "       --delegation <LEVEL>\n"
-"              (GSS/kerberos)  Set  LEVEL to tell the server what it is allowed\n"
+, stdout);
+ fputs(
+"              (GSS/kerberos) Set LEVEL to tell the server what it  is  allowed\n"
 "              to delegate when it comes to user credentials.\n"
 "\n"
 "              none   Don't allow any delegation.\n"
 "\n"
-"              policy Delegates if and only if the OK-AS-DELEGATE flag  is  set\n"
-"                     in  the  Kerberos  service  ticket,  which is a matter of\n"
+"              policy Delegates  if  and only if the OK-AS-DELEGATE flag is set\n"
+"                     in the Kerberos service ticket,  which  is  a  matter  of\n"
 "                     realm policy.\n"
 "\n"
-, stdout);
- fputs(
 "              always Unconditionally allow the server to delegate.\n"
 "\n"
 "       --digest\n"
-"              (HTTP) Enables HTTP Digest authentication. This is an  authenti-\n"
-"              cation  scheme  that  prevents the password from being sent over\n"
-"              the wire in clear text. Use this in combination with the  normal\n"
+, stdout);
+ fputs(
+"              (HTTP)  Enables HTTP Digest authentication. This is an authenti-\n"
+"              cation scheme that prevents the password from  being  sent  over\n"
+"              the  wire in clear text. Use this in combination with the normal\n"
 "              -u, --user option to set user name and password.\n"
 "\n"
-"              If  this  option  is  used  several times, only the first one is\n"
+"              If this option is used several times,  only  the  first  one  is\n"
 "              used.\n"
 "\n"
+"              See  also  -u, --user and --proxy-digest and --anyauth. This op-\n"
 , stdout);
  fputs(
-"              See also -u,  --user  and  --proxy-digest  and  --anyauth.  This\n"
-"              option overrides --basic and --ntlm and --negotiate.\n"
+"              tion overrides --basic and --ntlm and --negotiate.\n"
 "\n"
 "       --disable-eprt\n"
 "              (FTP) Tell curl to disable the use of the EPRT and LPRT commands\n"
 "              when doing active FTP transfers. Curl will normally always first\n"
-"              attempt  to use EPRT, then LPRT before using PORT, but with this\n"
-"              option, it will use PORT right away. EPRT and  LPRT  are  exten-\n"
+"              attempt to use EPRT, then LPRT before using PORT, but with  this\n"
+"              option,  it  will  use PORT right away. EPRT and LPRT are exten-\n"
+"              sions to the original FTP protocol, and  may  not  work  on  all\n"
 , stdout);
  fputs(
-"              sions  to  the  original  FTP  protocol, and may not work on all\n"
 "              servers, but they enable more functionality in a better way than\n"
 "              the traditional PORT command.\n"
 "\n"
 "              --eprt can be used to explicitly enable EPRT again and --no-eprt\n"
 "              is an alias for --disable-eprt.\n"
 "\n"
-"              If the server is accessed using IPv6, this option will  have  no\n"
+"              If  the  server is accessed using IPv6, this option will have no\n"
 "              effect as EPRT is necessary then.\n"
 "\n"
+"              Disabling EPRT only changes the active behavior. If you want  to\n"
 , stdout);
  fputs(
-"              Disabling  EPRT only changes the active behavior. If you want to\n"
-"              switch to passive mode you need to not  use  -P,  --ftp-port  or\n"
+"              switch  to  passive  mode  you need to not use -P, --ftp-port or\n"
 "              force it with --ftp-pasv.\n"
 "\n"
 "       --disable-epsv\n"
-"              (FTP)  (FTP)  Tell  curl  to disable the use of the EPSV command\n"
-"              when doing passive FTP  transfers.  Curl  will  normally  always\n"
-"              first  attempt to use EPSV before PASV, but with this option, it\n"
+"              (FTP) (FTP) Tell curl to disable the use  of  the  EPSV  command\n"
+"              when  doing  passive  FTP  transfers.  Curl will normally always\n"
+"              first attempt to use EPSV before PASV, but with this option,  it\n"
 "              will not try using EPSV.\n"
 "\n"
+"              --epsv can be used to explicitly enable EPSV again and --no-epsv\n"
 , stdout);
  fputs(
-"              --epsv can be used to explicitly enable EPSV again and --no-epsv\n"
 "              is an alias for --disable-epsv.\n"
 "\n"
-"              If  the  server is an IPv6 host, this option will have no effect\n"
+"              If the server is an IPv6 host, this option will have  no  effect\n"
 "              as EPSV is necessary then.\n"
 "\n"
 "              Disabling EPSV only changes the passive behavior. If you want to\n"
 "              switch to active mode you need to use -P, --ftp-port.\n"
 "\n"
 "       -q, --disable\n"
-"              If  used  as the first parameter on the command line, the curlrc\n"
+"              If used as the first parameter on the command line,  the  curlrc\n"
+"              config  file will not be read and used. See the -K, --config for\n"
 , stdout);
  fputs(
-"              config file will not be read and used. See the -K, --config  for\n"
 "              details on the default config file search path.\n"
 "\n"
 "       --disallow-username-in-url\n"
-"              (HTTP)  This  tells  curl  to  exit if passed a url containing a\n"
+"              (HTTP) This tells curl to exit if  passed  a  url  containing  a\n"
 "              username.\n"
 "\n"
 "              See also --proto. Added in 7.61.0.\n"
 "\n"
 "       --dns-interface <interface>\n"
-"              (DNS) Tell curl to send outgoing DNS  requests  through  <inter-\n"
+"              (DNS)  Tell  curl  to send outgoing DNS requests through <inter-\n"
+"              face>. This option is a counterpart to --interface  (which  does\n"
 , stdout);
  fputs(
-"              face>.  This  option is a counterpart to --interface (which does\n"
-"              not affect DNS). The supplied string must be an  interface  name\n"
+"              not  affect  DNS). The supplied string must be an interface name\n"
 "              (not an address).\n"
 "\n"
-"              See  also  --dns-ipv4-addr  and --dns-ipv6-addr. --dns-interface\n"
-"              requires that the underlying libcurl was  built  to  support  c-\n"
+"              See also --dns-ipv4-addr  and  --dns-ipv6-addr.  --dns-interface\n"
+"              requires  that  the  underlying  libcurl was built to support c-\n"
 "              ares. Added in 7.33.0.\n"
 "\n"
 "       --dns-ipv4-addr <address>\n"
-"              (DNS)  Tell  curl  to  bind to <ip-address> when making IPv4 DNS\n"
+"              (DNS) Tell curl to bind to <ip-address> when making IPv4 DNS re-\n"
+"              quests,  so  that  the DNS requests originate from this address.\n"
 , stdout);
  fputs(
-"              requests, so that the DNS requests originate from this  address.\n"
 "              The argument should be a single IPv4 address.\n"
 "\n"
-"              See  also  --dns-interface  and --dns-ipv6-addr. --dns-ipv4-addr\n"
-"              requires that the underlying libcurl was  built  to  support  c-\n"
+"              See also --dns-interface  and  --dns-ipv6-addr.  --dns-ipv4-addr\n"
+"              requires  that  the  underlying  libcurl was built to support c-\n"
 "              ares. Added in 7.33.0.\n"
 "\n"
 "       --dns-ipv6-addr <address>\n"
-"              (DNS)  Tell  curl  to  bind to <ip-address> when making IPv6 DNS\n"
+"              (DNS) Tell curl to bind to <ip-address> when making IPv6 DNS re-\n"
+"              quests,  so  that  the DNS requests originate from this address.\n"
 , stdout);
  fputs(
-"              requests, so that the DNS requests originate from this  address.\n"
 "              The argument should be a single IPv6 address.\n"
 "\n"
-"              See  also  --dns-interface  and --dns-ipv4-addr. --dns-ipv6-addr\n"
-"              requires that the underlying libcurl was  built  to  support  c-\n"
+"              See also --dns-interface  and  --dns-ipv4-addr.  --dns-ipv6-addr\n"
+"              requires  that  the  underlying  libcurl was built to support c-\n"
 "              ares. Added in 7.33.0.\n"
 "\n"
 "       --dns-servers <addresses>\n"
-"              Set  the  list  of  DNS servers to be used instead of the system\n"
+"              Set the list of DNS servers to be used instead of the system de-\n"
+"              fault.   The  list of IP addresses should be separated with com-\n"
 , stdout);
  fputs(
-"              default.  The list of IP addresses should be separated with com-\n"
 "              mas. Port numbers may also optionally be given as :<port-number>\n"
 "              after each IP address.\n"
 "\n"
-"              --dns-servers requires that the underlying libcurl was built  to\n"
+"              --dns-servers  requires that the underlying libcurl was built to\n"
 "              support c-ares. Added in 7.33.0.\n"
 "\n"
 "       --doh-url <URL>\n"
-"              (all)  Specifies  which  DNS-over-HTTPS  (DOH)  server to use to\n"
-, stdout);
- fputs(
-"              resolve hostnames, instead of using the  default  name  resolver\n"
+"              (all) Specifies which DNS-over-HTTPS (DOH) server to use to  re-\n"
+"              solve  hostnames,  instead  of  using  the default name resolver\n"
 "              mechanism. The URL must be HTTPS.\n"
 "\n"
+, stdout);
+ fputs(
 "              If this option is used several times, the last one will be used.\n"
 "\n"
+"              Added in 7.62.0.\n"
+"\n"
 "       -D, --dump-header <filename>\n"
-"              (HTTP  FTP) Write the received protocol headers to the specified\n"
+"              (HTTP FTP) Write the received protocol headers to the  specified\n"
 "              file.\n"
 "\n"
-"              This option is handy to use when you want to store  the  headers\n"
+"              This  option  is handy to use when you want to store the headers\n"
+"              that an HTTP site sends to you. Cookies from the  headers  could\n"
+"              then  be  read  in  a  second  curl  invocation by using the -b,\n"
 , stdout);
  fputs(
-"              that  an  HTTP site sends to you. Cookies from the headers could\n"
-"              then be read in a  second  curl  invocation  by  using  the  -b,\n"
-"              --cookie  option! The -c, --cookie-jar option is a better way to\n"
+"              --cookie option! The -c, --cookie-jar option is a better way  to\n"
 "              store cookies.\n"
 "\n"
+"              If  no  headers are received, the use of this option will create\n"
+"              an empty file.\n"
+"\n"
 "              When used in FTP, the FTP server response lines  are  considered\n"
 "              being \"headers\" and thus are saved there.\n"
 "\n"
 "              If this option is used several times, the last one will be used.\n"
 "\n"
-, stdout);
- fputs(
 "              See also -o, --output.\n"
 "\n"
 "       --egd-file <file>\n"
+, stdout);
+ fputs(
 "              (TLS)  Specify  the  path  name  to the Entropy Gathering Daemon\n"
 "              socket. The socket is used to seed the  random  engine  for  SSL\n"
 "              connections.\n"
@@ -909,18 +936,58 @@ void hugehelp(void)
 "       --engine <name>\n"
 "              (TLS)  Select the OpenSSL crypto engine to use for cipher opera-\n"
 "              tions. Use --engine list to print a list of build-time supported\n"
+"              engines.  Note  that  not  all  (or  none) of the engines may be\n"
 , stdout);
  fputs(
-"              engines.  Note  that  not  all  (or  none) of the engines may be\n"
 "              available at run-time.\n"
 "\n"
+"       --etag-compare <file>\n"
+"              (HTTP) This option makes a conditional HTTP request for the spe-\n"
+"              cific ETag read from the given file by sending a custom If-None-\n"
+"              Match header using the extracted ETag.\n"
+"\n"
+"              For correct results, make sure that specified file contains only\n"
+"              a single line with a desired ETag. An empty file is parsed as an\n"
+"              empty ETag.\n"
+"\n"
+, stdout);
+ fputs(
+"              Use the option --etag-save to first save the  ETag  from  a  re-\n"
+"              sponse, and then use this option to compare using the saved ETag\n"
+"              in a subsequent request.\n"
+"\n"
+"              OMPARISON: There are 2 types of comparison or  ETags,  Weak  and\n"
+"              Strong.  This option expects, and uses a strong comparison.\n"
+"\n"
+"              Added in 7.68.0.\n"
+"\n"
+"       --etag-save <file>\n"
+"              (HTTP)  This  option  saves  an HTTP ETag to the specified file.\n"
+, stdout);
+ fputs(
+"              Etag is usually part of headers  returned  by  a  request.  When\n"
+"              server  sends  an  ETag, it must be enveloped by a double quote.\n"
+"              This option extracts the ETag  without  the  double  quotes  and\n"
+"              saves it into the <file>.\n"
+"\n"
+"              A  server  can  send a week ETag which is prefixed by \"W/\". This\n"
+"              identifier is not considered, and  only  relevant  ETag  between\n"
+"              quotation marks is parsed.\n"
+"\n"
+, stdout);
+ fputs(
+"              It an ETag wasn't send by the server or it cannot be parsed, and\n"
+"              empty file is created.\n"
+"\n"
+"              Added in 7.68.0.\n"
+"\n"
 "       --expect100-timeout <seconds>\n"
 "              (HTTP) Maximum time in seconds that you allow curl to wait for a\n"
 "              100-continue  response  when curl emits an Expects: 100-continue\n"
 "              header in its request. By default curl  will  wait  one  second.\n"
-"              This  option accepts decimal values! When curl stops waiting, it\n"
 , stdout);
  fputs(
+"              This  option accepts decimal values! When curl stops waiting, it\n"
 "              will continue as if the response has been received.\n"
 "\n"
 "              See also --connect-timeout. Added in 7.47.0.\n"
@@ -929,53 +996,53 @@ void hugehelp(void)
 "              Fail and exit on the first detected transfer error.\n"
 "\n"
 "              When curl is used to do multiple transfers on the command  line,\n"
-"              it  will  attempt  to  operate on each given URL, one by one. By\n"
-"              default, it will ignore errors if there are more URLs given  and\n"
+"              it will attempt to operate on each given URL, one by one. By de-\n"
 , stdout);
  fputs(
-"              the  last  URL's  success  will  determine  the  error code curl\n"
-"              returns. So early failures will be \"hidden\" by  subsequent  suc-\n"
-"              cessful transfers.\n"
+"              fault, it will ignore errors if there are more  URLs  given  and\n"
+"              the  last  URL's  success will determine the error code curl re-\n"
+"              turns. So early failures will be \"hidden\" by subsequent success-\n"
+"              ful transfers.\n"
 "\n"
 "              Using  this  option,  curl  will  instead return an error on the\n"
 "              first transfer that fails, independent of  the  amount  of  URLs\n"
+, stdout);
+ fputs(
 "              that  are given on the command line. This way, no transfer fail-\n"
 "              ures go undetected by scripts and similar.\n"
 "\n"
-, stdout);
- fputs(
 "              This option is global and does not need to be specified for each\n"
 "              use of -:, --next.\n"
 "\n"
 "              This option does not imply -f, --fail, which causes transfers to\n"
 "              fail due to the server's HTTP status code. You can  combine  the\n"
 "              two options, however note -f, --fail is not global and is there-\n"
+, stdout);
+ fputs(
 "              fore contained by -:, --next.\n"
 "\n"
 "              Added in 7.52.0.\n"
 "\n"
 "       -f, --fail\n"
-, stdout);
- fputs(
 "              (HTTP) Fail silently (no output at all) on server  errors.  This\n"
 "              is  mostly done to better enable scripts etc to better deal with\n"
 "              failed attempts. In normal cases when an HTTP  server  fails  to\n"
 "              deliver  a  document,  it  returns  an  HTML document stating so\n"
 "              (which often also describes why and more). This flag  will  pre-\n"
-"              vent curl from outputting that and return error 22.\n"
-"\n"
 , stdout);
  fputs(
+"              vent curl from outputting that and return error 22.\n"
+"\n"
 "              This  method is not fail-safe and there are occasions where non-\n"
-"              successful response codes will  slip  through,  especially  when\n"
-"              authentication is involved (response codes 401 and 407).\n"
+"              successful response codes will slip through, especially when au-\n"
+"              thentication is involved (response codes 401 and 407).\n"
 "\n"
 "       --false-start\n"
 "              (TLS)  Tells  curl  to use false start during the TLS handshake.\n"
-"              False start is a mode where a  TLS  client  will  start  sending\n"
-"              application data before verifying the server's Finished message,\n"
+"              False start is a mode where a TLS client will start sending  ap-\n"
 , stdout);
  fputs(
+"              plication  data  before verifying the server's Finished message,\n"
 "              thus saving a round trip when performing a full handshake.\n"
 "\n"
 "              This is currently only implemented in the NSS and Secure  Trans-\n"
@@ -985,9 +1052,9 @@ void hugehelp(void)
 "\n"
 "       --form-string <name=string>\n"
 "              (HTTP  SMTP  IMAP)  Similar  to -F, --form except that the value\n"
-"              string for the named parameter is used  literally.  Leading  '@'\n"
 , stdout);
  fputs(
+"              string for the named parameter is used  literally.  Leading  '@'\n"
 "              and '<' characters, and the ';type=' string in the value have no\n"
 "              special meaning. Use this in preference to -F, --form if there's\n"
 "              any  possibility  that the string value may accidentally trigger\n"
@@ -996,9 +1063,9 @@ void hugehelp(void)
 "              See also -F, --form.\n"
 "\n"
 "       -F, --form <name=content>\n"
-"              (HTTP SMTP IMAP) For HTTP protocol family, this lets  curl  emu-\n"
 , stdout);
  fputs(
+"              (HTTP SMTP IMAP) For HTTP protocol family, this lets  curl  emu-\n"
 "              late  a  filled-in  form  in which a user has pressed the submit\n"
 "              button. This causes curl to POST  data  using  the  Content-Type\n"
 "              multipart/form-data according to RFC 2388.\n"
@@ -1006,51 +1073,51 @@ void hugehelp(void)
 "              For  SMTP and IMAP protocols, this is the mean to compose a mul-\n"
 "              tipart mail message to transmit.\n"
 "\n"
-"              This enables uploading of binary files etc. To force  the  'con-\n"
 , stdout);
  fputs(
+"              This enables uploading of binary files etc. To force  the  'con-\n"
 "              tent' part to be a file, prefix the file name with an @ sign. To\n"
 "              just get the content part from a file, prefix the file name with\n"
 "              the  symbol  <.  The  difference  between @ and < is then that @\n"
 "              makes a file get attached in the post as a  file  upload,  while\n"
 "              the < makes a text field and just get the contents for that text\n"
-"              field from a file.\n"
-"\n"
 , stdout);
  fputs(
+"              field from a file.\n"
+"\n"
 "              Tell curl to read content from stdin instead of a file by  using\n"
 "              - as filename. This goes for both @ and < constructs. When stdin\n"
-"              is used, the contents is buffered in memory  first  by  curl  to\n"
-"              determine  its  size  and  allow  a possible resend.  Defining a\n"
-"              part's data from a named non-regular file (such as a named  pipe\n"
-"              or  similar)  is unfortunately not subject to buffering and will\n"
+"              is used, the contents is buffered in memory first by curl to de-\n"
+"              termine its size and allow a possible resend.  Defining a part's\n"
+"              data from a named non-regular file (such as a named pipe or sim-\n"
 , stdout);
  fputs(
-"              be effectively read at transmission time; since the full size is\n"
-"              unknown  before the transfer starts, such data is sent as chunks\n"
-"              by HTTP and rejected by IMAP.\n"
+"              ilar)  is unfortunately not subject to buffering and will be ef-\n"
+"              fectively read at transmission time; since the full size is  un-\n"
+"              known before the transfer starts, such data is sent as chunks by\n"
+"              HTTP and rejected by IMAP.\n"
 "\n"
 "              Example: send an image to an HTTP server, where 'profile' is the\n"
 "              name  of  the  form-field to which the file portrait.jpg will be\n"
 "              the input:\n"
 "\n"
-"               curl -F profile=@portrait.jpg https://example.com/upload.cgi\n"
-"\n"
 , stdout);
  fputs(
+"               curl -F profile=@portrait.jpg https://example.com/upload.cgi\n"
+"\n"
 "              Example: send a your name and shoe size in two  text  fields  to\n"
 "              the server:\n"
 "\n"
 "               curl -F name=John -F shoesize=11 https://example.com/\n"
 "\n"
 "              Example:  send  a your essay in a text field to the server. Send\n"
-"              it as a plain text field, but get the contents  for  it  from  a\n"
-"              local file:\n"
-"\n"
-"               curl -F \"story=<hugefile.txt\" https://example.com/\n"
+"              it as a plain text field, but get the contents for it from a lo-\n"
+"              cal file:\n"
 "\n"
 , stdout);
  fputs(
+"               curl -F \"story=<hugefile.txt\" https://example.com/\n"
+"\n"
 "              You  can  also  tell  curl  what  Content-Type  to  use by using\n"
 "              'type=', in a manner similar to:\n"
 "\n"
@@ -1063,10 +1130,10 @@ void hugehelp(void)
 "              You can also explicitly change the name field of a  file  upload\n"
 "              part by setting filename=, like this:\n"
 "\n"
-"               curl -F \"file=@localfile;filename=nameinpost\" example.com\n"
-"\n"
 , stdout);
  fputs(
+"               curl -F \"file=@localfile;filename=nameinpost\" example.com\n"
+"\n"
 "              If  filename/path contains ',' or ';', it must be quoted by dou-\n"
 "              ble-quotes like:\n"
 "\n"
@@ -1078,11 +1145,11 @@ void hugehelp(void)
 "               curl -F 'file=@\"localfile\";filename=\"nameinpost\"' example.com\n"
 "\n"
 "              Note  that  if  a  filename/path is quoted by double-quotes, any\n"
+, stdout);
+ fputs(
 "              double-quote or backslash within the filename must be escaped by\n"
 "              backslash.\n"
 "\n"
-, stdout);
- fputs(
 "              Quoting  must  also  be  applied to non-file data if it contains\n"
 "              semicolons, leading/trailing spaces or leading double quotes:\n"
 "\n"
@@ -1092,21 +1159,21 @@ void hugehelp(void)
 "              You  can  add  custom  headers to the field by setting headers=,\n"
 "              like\n"
 "\n"
+, stdout);
+ fputs(
 "                curl -F \"submit=OK;headers=\\\"X-submit-type: OK\\\"\" example.com\n"
 "\n"
 "              or\n"
 "\n"
-, stdout);
- fputs(
 "                curl -F \"submit=OK;headers=@headerfile\" example.com\n"
 "\n"
 "              The headers= keyword may appear more that once and  above  notes\n"
 "              about  quoting  apply.  When headers are read from a file, Empty\n"
 "              lines and lines starting with '#' are comments and ignored; each\n"
 "              header can be folded by splitting between two words and starting\n"
-"              the continuation line with a  space;  embedded  carriage-returns\n"
 , stdout);
  fputs(
+"              the continuation line with a  space;  embedded  carriage-returns\n"
 "              and  trailing  spaces  are  stripped.   Here  is an example of a\n"
 "              header file contents:\n"
 "\n"
@@ -1117,10 +1184,10 @@ void hugehelp(void)
 "                X-header-2: this is\n"
 "                 another header\n"
 "\n"
-"              To support  sending  multipart  mail  messages,  the  syntax  is\n"
-"              extended as follows:\n"
+"              To support sending multipart mail messages, the  syntax  is  ex-\n"
 , stdout);
  fputs(
+"              tended as follows:\n"
 "              -  name can be omitted: the equal sign is the first character of\n"
 "              the argument,\n"
 "              - if data starts with '(', this signals to start  a  new  multi-\n"
@@ -1128,9 +1195,9 @@ void hugehelp(void)
 "              - a multipart can be terminated with a '=)' argument.\n"
 "\n"
 "              Example:  the  following  command sends an SMTP mime e-mail con-\n"
-"              sisting in an inline part in two alternative formats: plain text\n"
 , stdout);
  fputs(
+"              sisting in an inline part in two alternative formats: plain text\n"
 "              and HTML. It attaches a text file:\n"
 "\n"
 "               curl -F '=(;type=multipart/alternative' \\\n"
@@ -1138,20 +1205,20 @@ void hugehelp(void)
 "                       -F '= <body>HTML message</body>;type=text/html' \\\n"
 "                    -F '=)' -F '=@textfile.txt' ...  smtp://example.com\n"
 "\n"
-"              Data  can  be  encoded  for  transfer  using encoder=. Available\n"
-"              encodings are binary and 8bit that do nothing else  than  adding\n"
+"              Data  can  be encoded for transfer using encoder=. Available en-\n"
 , stdout);
  fputs(
-"              the  corresponding  Content-Transfer-Encoding  header, 7bit that\n"
-"              only rejects 8-bit characters with  a  transfer  error,  quoted-\n"
-"              printable  and  base64 that encodes data according to the corre-\n"
-"              sponding schemes, limiting lines length to 76 characters.\n"
+"              codings are binary and 8bit that do nothing else than adding the\n"
+"              corresponding  Content-Transfer-Encoding  header, 7bit that only\n"
+"              rejects 8-bit characters with a transfer error, quoted-printable\n"
+"              and  base64  that  encodes  data  according to the corresponding\n"
+"              schemes, limiting lines length to 76 characters.\n"
 "\n"
 "              Example: send multipart mail with a quoted-printable  text  mes-\n"
-"              sage and a base64 attached file:\n"
-"\n"
 , stdout);
  fputs(
+"              sage and a base64 attached file:\n"
+"\n"
 "               curl -F '=text message;encoder=quoted-printable' \\\n"
 "                    -F '=@localfile;encoder=base64' ... smtp://example.com\n"
 "\n"
@@ -1159,13 +1226,13 @@ void hugehelp(void)
 "\n"
 "              This option can be used multiple times.\n"
 "\n"
-"              This  option  overrides  -d,  --data  and  -I,  --head  and  -T,\n"
-"              --upload-file.\n"
+"              This  option  overrides  -d, --data and -I, --head and -T, --up-\n"
+"              load-file.\n"
 "\n"
 "       --ftp-account <data>\n"
-"              (FTP) When an FTP server asks for \"account data\" after user name\n"
 , stdout);
  fputs(
+"              (FTP) When an FTP server asks for \"account data\" after user name\n"
 "              and  password has been provided, this data is sent off using the\n"
 "              ACCT command.\n"
 "\n"
@@ -1175,10 +1242,10 @@ void hugehelp(void)
 "\n"
 "       --ftp-alternative-to-user <command>\n"
 "              (FTP) If authenticating with the USER and PASS  commands  fails,\n"
-"              send  this  command.   When  connecting  to  Tumbleweed's Secure\n"
-"              Transport server over FTPS using  a  client  certificate,  using\n"
 , stdout);
  fputs(
+"              send  this  command.   When  connecting  to  Tumbleweed's Secure\n"
+"              Transport server over FTPS using  a  client  certificate,  using\n"
 "              \"SITE  AUTH\"  will tell the server to retrieve the username from\n"
 "              the certificate.\n"
 "              Added in 7.15.5.\n"
@@ -1186,13 +1253,13 @@ void hugehelp(void)
 "       --ftp-create-dirs\n"
 "              (FTP SFTP) When an FTP or SFTP URL/operation uses  a  path  that\n"
 "              doesn't  currently exist on the server, the standard behavior of\n"
+, stdout);
+ fputs(
 "              curl is to fail. Using this option, curl will instead attempt to\n"
 "              create missing directories.\n"
 "\n"
 "              See also --create-dirs.\n"
 "\n"
-, stdout);
- fputs(
 "       --ftp-method <method>\n"
 "              (FTP)  Control what method curl should use to reach a file on an\n"
 "              FTP(S) server. The method argument should be one of the  follow-\n"
@@ -1200,10 +1267,10 @@ void hugehelp(void)
 "\n"
 "              multicwd\n"
 "                     curl  does  a  single CWD operation for each path part in\n"
-"                     the given URL. For deep hierarchies this means very  many\n"
-"                     commands.  This  is  how RFC 1738 says it should be done.\n"
 , stdout);
  fputs(
+"                     the given URL. For deep hierarchies this means very  many\n"
+"                     commands.  This  is  how RFC 1738 says it should be done.\n"
 "                     This is the default but the slowest behavior.\n"
 "\n"
 "              nocwd  curl does no CWD at all. curl will do  SIZE,  RETR,  STOR\n"
@@ -1211,10 +1278,10 @@ void hugehelp(void)
 "                     mands. This is the fastest behavior.\n"
 "\n"
 "              singlecwd\n"
-"                     curl does one CWD with the full target directory and then\n"
-"                     operates  on  the  file  \"normally\" (like in the multicwd\n"
 , stdout);
  fputs(
+"                     curl does one CWD with the full target directory and then\n"
+"                     operates  on  the  file  \"normally\" (like in the multicwd\n"
 "                     case). This is somewhat  more  standards  compliant  than\n"
 "                     'nocwd' but without the full penalty of 'multicwd'.\n"
 "\n"
@@ -1222,26 +1289,28 @@ void hugehelp(void)
 "\n"
 "       --ftp-pasv\n"
 "              (FTP)  Use  passive mode for the data connection. Passive is the\n"
+, stdout);
+ fputs(
 "              internal default behavior, but using this option can be used  to\n"
 "              override a previous -P, --ftp-port option.\n"
 "\n"
 "              If  this  option  is  used  several times, only the first one is\n"
-, stdout);
- fputs(
 "              used. Undoing an enforced passive really isn't  doable  but  you\n"
 "              must then instead enforce the correct -P, --ftp-port again.\n"
 "\n"
 "              Passive mode means that curl will try the EPSV command first and\n"
+, stdout);
+ fputs(
 "              then PASV, unless --disable-epsv is used.\n"
 "              See also --disable-epsv. Added in 7.11.0.\n"
 "\n"
 "       -P, --ftp-port <address>\n"
 "              (FTP) Reverses the default initiator/listener  roles  when  con-\n"
-, stdout);
- fputs(
 "              necting  with  FTP. This option makes curl use active mode. curl\n"
 "              then tells the server to connect back to the client's  specified\n"
 "              address and port, while passive mode asks the server to setup an\n"
+, stdout);
+ fputs(
 "              IP address and port for it to connect to.  <address>  should  be\n"
 "              one of:\n"
 "\n"
@@ -1249,37 +1318,37 @@ void hugehelp(void)
 "                     e.g.  \"eth0\"  to specify which interface's IP address you\n"
 "                     want to use (Unix only)\n"
 "\n"
-, stdout);
- fputs(
 "              IP address\n"
 "                     e.g. \"192.168.10.1\" to specify the exact IP address\n"
 "\n"
 "              host name\n"
 "                     e.g. \"my.host.domain\" to specify the machine\n"
 "\n"
+, stdout);
+ fputs(
 "              -      make curl pick the same IP address that is  already  used\n"
 "                     for the control connection\n"
 "\n"
 "       If  this  option is used several times, the last one will be used. Dis-\n"
 "       able the use of PORT with --ftp-pasv. Disable the attempt  to  use  the\n"
-, stdout);
- fputs(
 "       EPRT  command  instead  of PORT by using --disable-eprt. EPRT is really\n"
 "       PORT++.\n"
 "\n"
-"       Since 7.19.5, you can append  \":[start]-[end]\"  to  the  right  of  the\n"
-"       address,  to tell curl what TCP port range to use. That means you spec-\n"
-"       ify a port range, from a lower to a  higher  number.  A  single  number\n"
-"       works  as well, but do note that it increases the risk of failure since\n"
-"       the port may not be available.\n"
+"       Since 7.19.5, you can append \":[start]-[end]\" to the right of  the  ad-\n"
+, stdout);
+ fputs(
+"       dress,  to tell curl what TCP port range to use. That means you specify\n"
+"       a port range, from a lower to a higher number. A single number works as\n"
+"       well,  but do note that it increases the risk of failure since the port\n"
+"       may not be available.\n"
 "\n"
 "       See also --ftp-pasv and --disable-eprt.\n"
 "\n"
-, stdout);
- fputs(
 "       --ftp-pret\n"
 "              (FTP) Tell curl to send a PRET command before PASV  (and  EPSV).\n"
 "              Certain  FTP  servers,  mainly drftpd, require this non-standard\n"
+, stdout);
+ fputs(
 "              command for directory listings as well as up  and  downloads  in\n"
 "              PASV mode.\n"
 "\n"
@@ -1288,11 +1357,11 @@ void hugehelp(void)
 "       --ftp-skip-pasv-ip\n"
 "              (FTP) Tell curl to not use the IP address the server suggests in\n"
 "              its response to curl's PASV command when curl connects the  data\n"
+"              connection.  Instead curl will re-use the same IP address it al-\n"
+"              ready uses for the control connection.\n"
+"\n"
 , stdout);
  fputs(
-"              connection.  Instead  curl  will  re-use  the same IP address it\n"
-"              already uses for the control connection.\n"
-"\n"
 "              This option has no effect if PORT, EPRT or EPSV is used  instead\n"
 "              of PASV.\n"
 "\n"
@@ -1301,9 +1370,9 @@ void hugehelp(void)
 "       --ftp-ssl-ccc-mode <active/passive>\n"
 "              (FTP)  Sets the CCC mode. The passive mode will not initiate the\n"
 "              shutdown, but instead wait for the server to do it, and will not\n"
+"              reply to the shutdown from the server. The active mode initiates\n"
 , stdout);
  fputs(
-"              reply to the shutdown from the server. The active mode initiates\n"
 "              the shutdown and waits for a reply from the server.\n"
 "\n"
 "              See also --ftp-ssl-ccc. Added in 7.16.2.\n"
@@ -1312,10 +1381,10 @@ void hugehelp(void)
 "              (FTP) Use CCC (Clear Command Channel)  Shuts  down  the  SSL/TLS\n"
 "              layer after authenticating. The rest of the control channel com-\n"
 "              munication will be unencrypted. This allows NAT routers to  fol-\n"
-, stdout);
- fputs(
 "              low the FTP transaction. The default mode is passive.\n"
 "\n"
+, stdout);
+ fputs(
 "              See also --ssl and --ftp-ssl-ccc-mode. Added in 7.16.1.\n"
 "\n"
 "       --ftp-ssl-control\n"
@@ -1327,18 +1396,18 @@ void hugehelp(void)
 "              Added in 7.16.0.\n"
 "\n"
 "       -G, --get\n"
+"              When used, this option will make all  data  specified  with  -d,\n"
 , stdout);
  fputs(
-"              When used, this option will make all  data  specified  with  -d,\n"
 "              --data,  --data-binary or --data-urlencode to be used in an HTTP\n"
 "              GET request instead of the POST request that otherwise would  be\n"
 "              used. The data will be appended to the URL with a '?' separator.\n"
-"              If  used  in  combination  with  -I,  --head, the POST data will\n"
-"              instead be appended to the URL with a HEAD request.\n"
+"              If  used  in combination with -I, --head, the POST data will in-\n"
+"              stead be appended to the URL with a HEAD request.\n"
 "\n"
+"              If this option is used several times,  only  the  first  one  is\n"
 , stdout);
  fputs(
-"              If this option is used several times,  only  the  first  one  is\n"
 "              used.  This is because undoing a GET doesn't make sense, but you\n"
 "              should then instead enforce the alternative method you prefer.\n"
 "\n"
@@ -1346,81 +1415,79 @@ void hugehelp(void)
 "              This option switches off the \"URL globbing parser\". When you set\n"
 "              this  option, you can specify URLs that contain the letters {}[]\n"
 "              without having them being interpreted by curl itself. Note  that\n"
+"              these  letters are not normal legal URL contents but they should\n"
 , stdout);
  fputs(
-"              these  letters are not normal legal URL contents but they should\n"
 "              be encoded according to the URI standard.\n"
 "\n"
 "       --happy-eyeballs-timeout-ms <milliseconds>\n"
 "              Happy eyeballs is an algorithm that attempts to connect to  both\n"
 "              IPv4  and  IPv6  addresses for dual-stack hosts, preferring IPv6\n"
 "              first for the number of milliseconds. If the IPv6 address cannot\n"
+"              be  connected  to  within that time then a connection attempt is\n"
 , stdout);
  fputs(
-"              be  connected  to  within that time then a connection attempt is\n"
 "              made to the IPv4 address in parallel. The first connection to be\n"
 "              established is the one that is used.\n"
 "\n"
 "              The  range of suggested useful values is limited. Happy Eyeballs\n"
 "              RFC 6555 says \"It is RECOMMENDED  that  connection  attempts  be\n"
 "              paced  150-250 ms apart to balance human factors against network\n"
-, stdout);
- fputs(
 "              load.\" libcurl currently defaults to 200 ms. Firefox and  Chrome\n"
 "              currently default to 300 ms.\n"
 "\n"
+, stdout);
+ fputs(
 "              If this option is used several times, the last one will be used.\n"
 "\n"
 "              Added in 7.59.0.\n"
 "\n"
 "       --haproxy-protocol\n"
 "              (HTTP)  Send a HAProxy PROXY protocol v1 header at the beginning\n"
-"              of the connection. This is  used  by  some  load  balancers  and\n"
-"              reverse  proxies  to  indicate  the client's true IP address and\n"
+"              of the connection. This is used by some load balancers  and  re-\n"
+"              verse proxies to indicate the client's true IP address and port.\n"
+"              This  option is primarily useful when sending test requests to a\n"
 , stdout);
  fputs(
-"              port.\n"
-"\n"
-"              This option is primarily useful when sending test requests to  a\n"
 "              service that expects this header.\n"
 "\n"
 "              Added in 7.60.0.\n"
 "\n"
 "       -I, --head\n"
 "              (HTTP FTP FILE) Fetch the headers only! HTTP-servers feature the\n"
-"              command HEAD which this uses to get nothing but the header of  a\n"
-"              document.  When  used  on an FTP or FILE file, curl displays the\n"
+"              command  HEAD which this uses to get nothing but the header of a\n"
+"              document. When used on an FTP or FILE file,  curl  displays  the\n"
 "              file size and last modification time only.\n"
 "\n"
+"       -H, --header <header/@file>\n"
 , stdout);
  fputs(
-"       -H, --header <header/@file>\n"
-"              (HTTP) Extra header to include in the request when sending  HTTP\n"
-"              to  a  server. You may specify any number of extra headers. Note\n"
+"              (HTTP)  Extra header to include in the request when sending HTTP\n"
+"              to a server. You may specify any number of extra  headers.  Note\n"
 "              that if you should add a custom header that has the same name as\n"
-"              one  of  the  internal  ones curl would use, your externally set\n"
+"              one of the internal ones curl would  use,  your  externally  set\n"
 "              header will be used instead of the internal one. This allows you\n"
+"              to make even trickier stuff than curl  would  normally  do.  You\n"
 , stdout);
  fputs(
-"              to  make  even  trickier  stuff than curl would normally do. You\n"
-"              should not replace internally set headers without  knowing  per-\n"
+"              should  not  replace internally set headers without knowing per-\n"
 "              fectly well what you're doing. Remove an internal header by giv-\n"
-"              ing a replacement without content  on  the  right  side  of  the\n"
+"              ing  a  replacement  without  content  on  the right side of the\n"
 "              colon, as in: -H \"Host:\". If you send the custom header with no-\n"
-"              value then its header must be terminated with a semicolon,  such\n"
-, stdout);
- fputs(
+"              value  then its header must be terminated with a semicolon, such\n"
 "              as -H \"X-Custom-Header;\" to send \"X-Custom-Header:\".\n"
 "\n"
-"              curl  will  make  sure  that each header you add/replace is sent\n"
+, stdout);
+ fputs(
+"              curl will make sure that each header  you  add/replace  is  sent\n"
 "              with the proper end-of-line marker, you should thus not add that\n"
 "              as a part of the header content: do not add newlines or carriage\n"
 "              returns, they will only mess things up for you.\n"
 "\n"
-"              Starting in 7.55.0, this option can take an argument  in  @file-\n"
+"              Starting  in  7.55.0, this option can take an argument in @file-\n"
+"              name style, which then adds a header for each line in the  input\n"
 , stdout);
  fputs(
-"              name  style, which then adds a header for each line in the input\n"
 "              file. Using @- will make curl read the header file from stdin.\n"
 "\n"
 "              See also the -A, --user-agent and -e, --referer options.\n"
@@ -1432,30 +1499,42 @@ void hugehelp(void)
 "\n"
 "               curl -H \"X-First-Name: Joe\" http://example.com/\n"
 "\n"
+"              WARNING: headers set with this option will be  set  in  all  re-\n"
 , stdout);
  fputs(
-"              WARNING:  headers  set  with  this  option  will  be  set in all\n"
-"              requests - even after redirects are  followed,  like  when  told\n"
-"              with  -L,  --location. This can lead to the header being sent to\n"
-"              other hosts than the original host, so sensitive headers  should\n"
-"              be used with caution combined with following redirects.\n"
+"              quests  - even after redirects are followed, like when told with\n"
+"              -L, --location. This can lead to the header being sent to  other\n"
+"              hosts  than  the  original  host, so sensitive headers should be\n"
+"              used with caution combined with following redirects.\n"
 "\n"
-"              This  option  can  be  used multiple times to add/replace/remove\n"
+"              This option can be used  multiple  times  to  add/replace/remove\n"
 "              multiple headers.\n"
 "\n"
+"       -h, --help\n"
 , stdout);
  fputs(
-"       -h, --help\n"
-"              Usage help. This lists all current command line options  with  a\n"
+"              Usage  help.  This lists all current command line options with a\n"
 "              short description.\n"
 "       --hostpubmd5 <md5>\n"
-"              (SFTP  SCP)  Pass a string containing 32 hexadecimal digits. The\n"
-"              string should be the 128 bit MD5 checksum of the  remote  host's\n"
+"              (SFTP SCP) Pass a string containing 32 hexadecimal  digits.  The\n"
+"              string  should  be the 128 bit MD5 checksum of the remote host's\n"
 "              public key, curl will refuse the connection with the host unless\n"
 "              the md5sums match.\n"
 "\n"
 "              Added in 7.17.1.\n"
 "\n"
+"       --http0.9\n"
+, stdout);
+ fputs(
+"              (HTTP) Tells curl to be fine with HTTP version 0.9 response.\n"
+"\n"
+"              HTTP/0.9  is  a completely headerless response and therefore you\n"
+"              can also connect with this to non-HTTP servers and still  get  a\n"
+"              response since curl will simply transparently downgrade - if al-\n"
+"              lowed.\n"
+"\n"
+"              Since curl 7.66.0, HTTP/0.9 is disabled by default.\n"
+"\n"
 "       -0, --http1.0\n"
 , stdout);
  fputs(
@@ -1488,41 +1567,65 @@ void hugehelp(void)
 "       --http2\n"
 "              (HTTP) Tells curl to use HTTP version 2.\n"
 "\n"
-"              See also --no-alpn. --http2 requires that the underlying libcurl\n"
-"              was built to support HTTP/2. This option overrides --http1.1 and\n"
-"              -0, --http1.0 and --http2-prior-knowledge. Added in 7.33.0.\n"
+"              See also --http1.1 and --http3. --http2 requires that the under-\n"
+"              lying libcurl was built to support HTTP/2. This option overrides\n"
+"              --http1.1 and -0, --http1.0 and  --http2-prior-knowledge.  Added\n"
+"              in 7.33.0.\n"
+"\n"
+"       --http3\n"
+"              (HTTP)  WARNING: this option is experimental. Do not use in pro-\n"
+"              duction.\n"
+"\n"
+, stdout);
+ fputs(
+"              Tells curl to use HTTP version 3 directly to the host  and  port\n"
+"              number used in the URL. A normal HTTP/3 transaction will be done\n"
+"              to a host and then get redirected via Alt-SVc, but  this  option\n"
+"              allows  a  user to circumvent that when you know that the target\n"
+"              speaks HTTP/3 on the given host and port.\n"
+"\n"
+"              This option will make curl fail if a QUIC connection  cannot  be\n"
+, stdout);
+ fputs(
+"              established,  it cannot fall back to a lower HTTP version on its\n"
+"              own.\n"
+"\n"
+"              See also --http1.1 and --http2. --http3 requires that the under-\n"
+"              lying libcurl was built to support HTTP/3. This option overrides\n"
+"              --http1.1 and -0, --http1.0 and --http2 and --http2-prior-knowl-\n"
+"              edge. Added in 7.66.0.\n"
 "\n"
 "       --ignore-content-length\n"
-"              (FTP HTTP) For HTTP, Ignore the Content-Length header.  This  is\n"
-"              particularly  useful  for servers running Apache 1.x, which will\n"
+"              (FTP  HTTP)  For HTTP, Ignore the Content-Length header. This is\n"
 , stdout);
  fputs(
-"              report incorrect Content-Length for files larger  than  2  giga-\n"
+"              particularly useful for servers running Apache 1.x,  which  will\n"
+"              report  incorrect  Content-Length  for files larger than 2 giga-\n"
 "              bytes.\n"
 "\n"
-"              For  FTP (since 7.46.0), skip the RETR command to figure out the\n"
+"              For FTP (since 7.46.0), skip the RETR command to figure out  the\n"
 "              size before downloading a file.\n"
 "\n"
 "       -i, --include\n"
-"              Include the HTTP  response  headers  in  the  output.  The  HTTP\n"
-"              response  headers  can include things like server name, cookies,\n"
-"              date of the document, HTTP version and more...\n"
-"\n"
+"              Include  the  HTTP  response headers in the output. The HTTP re-\n"
+"              sponse headers can include things  like  server  name,  cookies,\n"
 , stdout);
  fputs(
+"              date of the document, HTTP version and more...\n"
+"\n"
 "              To view the request headers, consider the -v, --verbose option.\n"
 "\n"
 "              See also -v, --verbose.\n"
 "\n"
 "       -k, --insecure\n"
 "              (TLS) By default, every SSL connection curl makes is verified to\n"
-"              be  secure.  This option allows curl to proceed and operate even\n"
+"              be secure. This option allows curl to proceed and  operate  even\n"
 "              for server connections otherwise considered insecure.\n"
 "\n"
-"              The server connection is verified by making  sure  the  server's\n"
 , stdout);
  fputs(
-"              certificate  contains  the  right name and verifies successfully\n"
+"              The  server  connection  is verified by making sure the server's\n"
+"              certificate contains the right name  and  verifies  successfully\n"
 "              using the cert store.\n"
 "\n"
 "              See this online resource for further details:\n"
@@ -1531,173 +1634,174 @@ void hugehelp(void)
 "\n"
 "       --interface <name>\n"
 "\n"
-"              Perform an operation using a specified interface. You can  enter\n"
-"              interface  name,  IP address or host name. An example could look\n"
-"              like:\n"
-"\n"
+"              Perform  an operation using a specified interface. You can enter\n"
 , stdout);
  fputs(
+"              interface name, IP address or host name. An example  could  look\n"
+"              like:\n"
+"\n"
 "               curl --interface eth0:1 https://www.example.com/\n"
 "\n"
 "              If this option is used several times, the last one will be used.\n"
-"              On Linux it can be used to specify a VRF, but the  binary  needs\n"
-"              to  either  have CAP_NET_RAW or to be run as root. More informa-\n"
-"              tion  about  Linux  VRF:   https://www.kernel.org/doc/Documenta-\n"
+"              On  Linux  it can be used to specify a VRF, but the binary needs\n"
+"              to either have CAP_NET_RAW or to be run as root.  More  informa-\n"
+"              tion   about  Linux  VRF:  https://www.kernel.org/doc/Documenta-\n"
+, stdout);
+ fputs(
 "              tion/networking/vrf.txt\n"
 "\n"
 "              See also --dns-interface.\n"
 "\n"
 "       -4, --ipv4\n"
-, stdout);
- fputs(
-"              This  option tells curl to resolve names to IPv4 addresses only,\n"
+"              This option tells curl to resolve names to IPv4 addresses  only,\n"
 "              and not for example try IPv6.\n"
 "\n"
-"              See also  --http1.1  and  --http2.  This  option  overrides  -6,\n"
+"              See  also  --http1.1  and  --http2.  This  option  overrides -6,\n"
 "              --ipv6.\n"
 "\n"
 "       -6, --ipv6\n"
-"              This  option tells curl to resolve names to IPv6 addresses only,\n"
+"              This option tells curl to resolve names to IPv6 addresses  only,\n"
 "              and not for example try IPv4.\n"
 "\n"
-"              See also  --http1.1  and  --http2.  This  option  overrides  -4,\n"
-"              --ipv4.\n"
-"\n"
 , stdout);
  fputs(
+"              See  also  --http1.1  and  --http2.  This  option  overrides -4,\n"
+"              --ipv4.\n"
+"\n"
 "       -j, --junk-session-cookies\n"
 "              (HTTP) When curl is told to read cookies from a given file, this\n"
-"              option will make it discard all  \"session  cookies\".  This  will\n"
-"              basically  have  the same effect as if a new session is started.\n"
-"              Typical browsers always discard  session  cookies  when  they're\n"
+"              option will make it discard all \"session cookies\". This will ba-\n"
+"              sically have the same effect as if a  new  session  is  started.\n"
+"              Typical  browsers  always  discard  session cookies when they're\n"
 "              closed down.\n"
 "\n"
+, stdout);
+ fputs(
 "              See also -b, --cookie and -c, --cookie-jar.\n"
 "\n"
 "       --keepalive-time <seconds>\n"
-, stdout);
- fputs(
-"              This  option  sets  the  time  a connection needs to remain idle\n"
-"              before sending keepalive probes and the time between  individual\n"
+"              This option sets the time a connection needs to remain idle  be-\n"
+"              fore  sending  keepalive  probes and the time between individual\n"
 "              keepalive probes. It is currently effective on operating systems\n"
 "              offering  the  TCP_KEEPIDLE  and  TCP_KEEPINTVL  socket  options\n"
-"              (meaning  Linux, recent AIX, HP-UX and more). This option has no\n"
-"              effect if --no-keepalive is used.\n"
-"\n"
+"              (meaning Linux, recent AIX, HP-UX and more). This option has  no\n"
 , stdout);
  fputs(
+"              effect if --no-keepalive is used.\n"
+"\n"
 "              If this option is used several times, the last one will be used.\n"
 "              If unspecified, the option defaults to 60 seconds.\n"
 "\n"
 "              Added in 7.18.0.\n"
 "\n"
 "       --key-type <type>\n"
-"              (TLS)  Private key file type. Specify which type your --key pro-\n"
-"              vided private key is. DER, PEM, and ENG are  supported.  If  not\n"
+"              (TLS) Private key file type. Specify which type your --key  pro-\n"
+"              vided  private  key  is. DER, PEM, and ENG are supported. If not\n"
 "              specified, PEM is assumed.\n"
 "\n"
-"              If this option is used several times, the last one will be used.\n"
-"\n"
 , stdout);
  fputs(
+"              If this option is used several times, the last one will be used.\n"
+"\n"
 "       --key <key>\n"
 "              (TLS SSH) Private key file name. Allows you to provide your pri-\n"
-"              vate key in this separate file. For SSH, if not specified,  curl\n"
-"              tries the following candidates in order:\n"
+"              vate  key in this separate file. For SSH, if not specified, curl\n"
+"              tries  the  following  candidates  in  order:   '~/.ssh/id_rsa',\n"
+"              '~/.ssh/id_dsa', './id_rsa', './id_dsa'.\n"
 "\n"
 "              If  curl is built against OpenSSL library, and the engine pkcs11\n"
-"              is available, then a PKCS#11 URI (RFC 7512) can be used to spec-\n"
-"              ify  a  private key located in a PKCS#11 device. A string begin-\n"
 , stdout);
  fputs(
+"              is available, then a PKCS#11 URI (RFC 7512) can be used to spec-\n"
+"              ify  a  private key located in a PKCS#11 device. A string begin-\n"
 "              ning with \"pkcs11:\" will be interpreted as a PKCS#11 URI.  If  a\n"
 "              PKCS#11 URI is provided, then the --engine option will be set as\n"
 "              \"pkcs11\" if none was provided and the --key-type option will  be\n"
 "              set as \"ENG\" if none was provided.\n"
 "\n"
+, stdout);
+ fputs(
 "              If this option is used several times, the last one will be used.\n"
 "\n"
 "       --krb <level>\n"
 "              (FTP)  Enable Kerberos authentication and use. The level must be\n"
-, stdout);
- fputs(
 "              entered and should be one of 'clear', 'safe', 'confidential', or\n"
 "              'private'.  Should  you  use  a  level that is not one of these,\n"
 "              'private' will instead be used.\n"
 "\n"
 "              If this option is used several times, the last one will be used.\n"
+, stdout);
+ fputs(
 "              --krb requires that the underlying libcurl was built to  support\n"
 "              Kerberos.\n"
 "\n"
 "       --libcurl <file>\n"
 "              Append  this  option  to any ordinary curl command line, and you\n"
-, stdout);
- fputs(
 "              will get a libcurl-using C source code written to the file  that\n"
 "              does the equivalent of what your command-line operation does!\n"
 "\n"
 "              If  this  option is used several times, the last given file name\n"
 "              will be used.\n"
 "\n"
+, stdout);
+ fputs(
 "              Added in 7.16.1.\n"
 "\n"
 "       --limit-rate <speed>\n"
 "              Specify the maximum transfer rate you want curl  to  use  -  for\n"
 "              both downloads and uploads. This feature is useful if you have a\n"
-, stdout);
- fputs(
 "              limited pipe and you'd like your transfer not to use your entire\n"
 "              bandwidth. To make it slower than it otherwise would be.\n"
 "\n"
 "              The  given speed is measured in bytes/second, unless a suffix is\n"
+, stdout);
+ fputs(
 "              appended.  Appending 'k' or 'K' will count the number  as  kilo-\n"
 "              bytes,  'm' or 'M' makes it megabytes, while 'g' or 'G' makes it\n"
 "              gigabytes. Examples: 200K, 3m and 1G.\n"
 "\n"
-, stdout);
- fputs(
 "              If you also use the -Y, --speed-limit option, that  option  will\n"
 "              take precedence and might cripple the rate-limiting slightly, to\n"
 "              help keeping the speed-limit logic working.\n"
 "\n"
+, stdout);
+ fputs(
 "              If this option is used several times, the last one will be used.\n"
 "\n"
 "       -l, --list-only\n"
 "              (FTP POP3) (FTP) When listing  an  FTP  directory,  this  switch\n"
 "              forces  a  name-only view. This is especially useful if the user\n"
-, stdout);
- fputs(
 "              wants to machine-parse the contents of an  FTP  directory  since\n"
 "              the normal directory view doesn't use a standard look or format.\n"
 "              When used like this, the option causes a NLST command to be sent\n"
+, stdout);
+ fputs(
 "              to the server instead of LIST.\n"
 "\n"
 "              Note:  Some  FTP  servers  list  only files in their response to\n"
 "              NLST; they do not include sub-directories and symbolic links.\n"
 "\n"
-, stdout);
- fputs(
 "              (POP3) When retrieving a specific email from POP3,  this  switch\n"
 "              forces  a  LIST command to be performed instead of RETR. This is\n"
 "              particularly useful if the user wants to see if a specific  mes-\n"
+, stdout);
+ fputs(
 "              sage id exists on the server and what size it is.\n"
 "\n"
 "              Note:  When combined with -X, --request, this option can be used\n"
 "              to send an UIDL command instead, so the user may use the email's\n"
-, stdout);
- fputs(
-"              unique  identifier  rather  than  it's  message  id  to make the\n"
-"              request.\n"
+"              unique  identifier  rather  than it's message id to make the re-\n"
+"              quest.\n"
 "\n"
 "              Added in 7.21.5.\n"
 "\n"
 "       --local-port <num/range>\n"
 "              Set a preferred single number or range (FROM-TO) of  local  port\n"
+, stdout);
+ fputs(
 "              numbers to use for the connection(s).  Note that port numbers by\n"
 "              nature are a scarce resource that will be busy at times so  set-\n"
 "              ting  this range to something too narrow might cause unnecessary\n"
-, stdout);
- fputs(
 "              connection setup failures.\n"
 "\n"
 "              Added in 7.15.2.\n"
@@ -1705,51 +1809,51 @@ void hugehelp(void)
 "       --location-trusted\n"
 "              (HTTP) Like -L, --location, but will allow sending  the  name  +\n"
 "              password to all hosts that the site may redirect to. This may or\n"
+, stdout);
+ fputs(
 "              may not introduce a security breach if the site redirects you to\n"
 "              a  site  to which you'll send your authentication info (which is\n"
 "              plaintext in the case of HTTP Basic authentication).\n"
 "\n"
-, stdout);
- fputs(
 "              See also -u, --user.\n"
 "\n"
 "       -L, --location\n"
 "              (HTTP) If the server reports that the requested page  has  moved\n"
 "              to a different location (indicated with a Location: header and a\n"
-"              3XX response code), this option will make curl redo the  request\n"
-"              on  the  new  place.  If used together with -i, --include or -I,\n"
-"              --head, headers from all requested pages  will  be  shown.  When\n"
 , stdout);
  fputs(
-"              authentication  is  used, curl only sends its credentials to the\n"
+"              3XX response code), this option will make curl redo the  request\n"
+"              on  the  new  place.  If used together with -i, --include or -I,\n"
+"              --head, headers from all requested pages will be shown. When au-\n"
+"              thentication  is  used,  curl  only sends its credentials to the\n"
 "              initial host. If a redirect takes curl to a different  host,  it\n"
 "              won't  be  able to intercept the user+password. See also --loca-\n"
+, stdout);
+ fputs(
 "              tion-trusted on how to change this. You can limit the amount  of\n"
 "              redirects to follow by using the --max-redirs option.\n"
 "\n"
 "              When  curl follows a redirect and the request is not a plain GET\n"
-, stdout);
- fputs(
 "              (for example POST or PUT), it will do the following request with\n"
 "              a GET if the HTTP response was 301, 302, or 303. If the response\n"
-"              code was any other 3xx code, curl  will  re-send  the  following\n"
-"              request using the same unmodified method.\n"
+"              code was any other 3xx code, curl will re-send the following re-\n"
+, stdout);
+ fputs(
+"              quest using the same unmodified method.\n"
 "\n"
 "              You  can  tell  curl to not change the non-GET request method to\n"
 "              GET after a 30x response by  using  the  dedicated  options  for\n"
-, stdout);
- fputs(
 "              that: --post301, --post302 and --post303.\n"
 "\n"
 "       --login-options <options>\n"
 "              (IMAP  POP3 SMTP) Specify the login options to use during server\n"
 "              authentication.\n"
 "\n"
-"              You can use the  login  options  to  specify  protocol  specific\n"
-"              options  that may be used during authentication. At present only\n"
-"              IMAP, POP3 and SMTP support login options. For more  information\n"
+"              You can use the login options to specify protocol  specific  op-\n"
 , stdout);
  fputs(
+"              tions  that  may  be used during authentication. At present only\n"
+"              IMAP, POP3 and SMTP support login options. For more  information\n"
 "              about  the  login options please see RFC 2384, RFC 5092 and IETF\n"
 "              draft draft-earhart-url-smtp-00.txt\n"
 "\n"
@@ -1758,12 +1862,12 @@ void hugehelp(void)
 "              Added in 7.34.0.\n"
 "\n"
 "       --mail-auth <address>\n"
+, stdout);
+ fputs(
 "              (SMTP) Specify a single address. This will be  used  to  specify\n"
 "              the  authentication  address  (identity)  of a submitted message\n"
 "              that is being relayed to another server.\n"
 "\n"
-, stdout);
- fputs(
 "              See also --mail-rcpt and --mail-from. Added in 7.25.0.\n"
 "\n"
 "       --mail-from <address>\n"
@@ -1772,21 +1876,21 @@ void hugehelp(void)
 "\n"
 "              See also --mail-rcpt and --mail-auth. Added in 7.20.0.\n"
 "\n"
+, stdout);
+ fputs(
 "       --mail-rcpt <address>\n"
 "              (SMTP) Specify a single address, user name or mailing list name.\n"
 "              Repeat this option several times to send to multiple recipients.\n"
-, stdout);
- fputs(
 "              When performing a mail transfer, the recipient should specify  a\n"
 "              valid email address to send the mail to.\n"
 "\n"
-"              When  performing  an  address  verification  (VRFY command), the\n"
-"              recipient should be specified as the user name or user name  and\n"
+"              When  performing an address verification (VRFY command), the re-\n"
+"              cipient should be specified as the user name or  user  name  and\n"
+, stdout);
+ fputs(
 "              domain (as per Section 3.5 of RFC5321). (Added in 7.34.0)\n"
 "\n"
 "              When performing a mailing list expand (EXPN command), the recip-\n"
-, stdout);
- fputs(
 "              ient should be specified using the mailing list  name,  such  as\n"
 "              \"Friends\" or \"London-Office\".  (Added in 7.34.0)\n"
 "\n"
@@ -1796,21 +1900,21 @@ void hugehelp(void)
 "              Manual. Display the huge help text.\n"
 "\n"
 "       --max-filesize <bytes>\n"
+, stdout);
+ fputs(
 "              Specify  the  maximum  size (in bytes) of a file to download. If\n"
 "              the file requested is larger than this value, the transfer  will\n"
 "              not start and curl will return with exit code 63.\n"
 "\n"
-, stdout);
- fputs(
 "              A  size  modifier may be used. For example, Appending 'k' or 'K'\n"
 "              will count  the  number  as  kilobytes,  'm'  or  'M'  makes  it\n"
 "              megabytes,  while 'g' or 'G' makes it gigabytes. Examples: 200K,\n"
+, stdout);
+ fputs(
 "              3m and 1G. (Added in 7.58.0)\n"
 "\n"
 "              NOTE: The file size is not always known prior to  download,  and\n"
 "              for such files this option has no effect even if the file trans-\n"
-, stdout);
- fputs(
 "              fer ends up being larger than this given  limit.  This  concerns\n"
 "              both FTP and HTTP transfers.\n"
 "\n"
@@ -1818,20 +1922,20 @@ void hugehelp(void)
 "\n"
 "       --max-redirs <num>\n"
 "              (HTTP)  Set  maximum  number  of redirection-followings allowed.\n"
-"              When -L, --location is used, is used to prevent curl  from  fol-\n"
-"              lowing  redirections \"in absurdum\". By default, the limit is set\n"
 , stdout);
  fputs(
-"              to 50 redirections. Set this option to -1 to make it unlimited.\n"
+"              When -L, --location is used, is used to prevent curl  from  fol-\n"
+"              lowing redirections too much. By default, the limit is set to 50\n"
+"              redirections. Set this option to -1 to make it unlimited.\n"
 "\n"
 "              If this option is used several times, the last one will be used.\n"
 "\n"
 "       -m, --max-time <seconds>\n"
 "              Maximum time in seconds that you allow the  whole  operation  to\n"
-"              take.   This is useful for preventing your batch jobs from hang-\n"
-"              ing for hours due to slow networks or links going  down.   Since\n"
 , stdout);
  fputs(
+"              take.   This is useful for preventing your batch jobs from hang-\n"
+"              ing for hours due to slow networks or links going  down.   Since\n"
 "              7.32.0, this option accepts decimal values, but the actual time-\n"
 "              out will decrease in accuracy as the specified timeout increases\n"
 "              in decimal precision.\n"
@@ -1841,20 +1945,20 @@ void hugehelp(void)
 "              See also --connect-timeout.\n"
 "\n"
 "       --metalink\n"
-"              This  option  can  tell curl to parse and process a given URI as\n"
-"              Metalink file (both version 3 and 4 (RFC  5854)  are  supported)\n"
 , stdout);
  fputs(
+"              This  option  can  tell curl to parse and process a given URI as\n"
+"              Metalink file (both version 3 and 4 (RFC  5854)  are  supported)\n"
 "              and  make use of the mirrors listed within for failover if there\n"
 "              are errors (such as the file or server not being available).  It\n"
 "              will  also  verify  the hash of the file after the download com-\n"
 "              pletes. The Metalink file itself is downloaded and processed  in\n"
+, stdout);
+ fputs(
 "              memory and not stored in the local file system.\n"
 "\n"
 "              Example to use a remote Metalink file:\n"
 "\n"
-, stdout);
- fputs(
 "               curl --metalink http://www.example.com/example.metalink\n"
 "\n"
 "              To use a Metalink file in the local file system, use FILE proto-\n"
@@ -1863,34 +1967,34 @@ void hugehelp(void)
 "               curl --metalink file://example.metalink\n"
 "\n"
 "              Please note that if FILE protocol is disabled, there is  no  way\n"
-"              to  use  a local Metalink file at the time of this writing. Also\n"
-"              note that if --metalink and -i,  --include  are  used  together,\n"
 , stdout);
  fputs(
+"              to  use  a local Metalink file at the time of this writing. Also\n"
+"              note that if --metalink and -i,  --include  are  used  together,\n"
 "              --include  will be ignored. This is because including headers in\n"
 "              the response will break Metalink parser and if the  headers  are\n"
 "              included in the file described in Metalink file, hash check will\n"
 "              fail.\n"
 "\n"
 "              --metalink requires that the underlying  libcurl  was  built  to\n"
+, stdout);
+ fputs(
 "              support metalink. Added in 7.27.0.\n"
 "\n"
 "       --negotiate\n"
 "              (HTTP) Enables Negotiate (SPNEGO) authentication.\n"
 "\n"
-, stdout);
- fputs(
 "              This  option  requires a library built with GSS-API or SSPI sup-\n"
 "              port. Use -V, --version  to  see  if  your  curl  supports  GSS-\n"
 "              API/SSPI or SPNEGO.\n"
 "\n"
 "              When  using this option, you must also provide a fake -u, --user\n"
 "              option to activate the authentication code properly.  Sending  a\n"
+, stdout);
+ fputs(
 "              '-u  :'  is  enough  as  the user name and password from the -u,\n"
 "              --user option aren't actually used.\n"
 "\n"
-, stdout);
- fputs(
 "              If this option is used several times,  only  the  first  one  is\n"
 "              used.\n"
 "\n"
@@ -1898,10 +2002,10 @@ void hugehelp(void)
 "\n"
 "       --netrc-file <filename>\n"
 "              This  option  is similar to -n, --netrc, except that you provide\n"
-"              the path (absolute or relative) to  the  netrc  file  that  Curl\n"
-"              should use.  You can only specify one netrc file per invocation.\n"
+"              the path (absolute or relative) to  the  netrc  file  that  curl\n"
 , stdout);
  fputs(
+"              should use.  You can only specify one netrc file per invocation.\n"
 "              If several --netrc-file options are provided, the last one  will\n"
 "              be used.\n"
 "\n"
@@ -1913,41 +2017,41 @@ void hugehelp(void)
 "              Very  similar  to  -n, --netrc, but this option makes the .netrc\n"
 "              usage optional and not mandatory as the -n, --netrc option does.\n"
 "\n"
-"              See also --netrc-file. This option overrides -n, --netrc.\n"
-"\n"
 , stdout);
  fputs(
+"              See also --netrc-file. This option overrides -n, --netrc.\n"
+"\n"
 "       -n, --netrc\n"
 "              Makes curl scan the .netrc  (_netrc  on  Windows)  file  in  the\n"
 "              user's home directory for login name and password. This is typi-\n"
 "              cally used for FTP on Unix. If used with HTTP, curl will  enable\n"
 "              user authentication. See netrc(5) ftp(1) for details on the file\n"
 "              format. Curl will not complain if that  file  doesn't  have  the\n"
-"              right permissions (it should not be either world- or group-read-\n"
 , stdout);
  fputs(
+"              right permissions (it should not be either world- or group-read-\n"
 "              able). The environment variable \"HOME\" is used to find the  home\n"
 "              directory.\n"
 "\n"
-"              A  quick  and  very  simple  example of how to setup a .netrc to\n"
-"              allow curl to FTP to the machine host.domain.com with user  name\n"
+"              A  quick and very simple example of how to setup a .netrc to al-\n"
+"              low curl to FTP to the machine host.domain.com  with  user  name\n"
 "              'myself' and password 'secret' should look similar to:\n"
 "\n"
 "              machine host.domain.com login myself password secret\n"
 "\n"
 "       -:, --next\n"
-"              Tells curl to use a separate operation for the following URL and\n"
 , stdout);
  fputs(
-"              associated  options.  This  allows  you  to  send  several   URL\n"
-"              requests,  each  with  their  own specific options, for example,\n"
-"              such as different user names or custom requests for each.\n"
+"              Tells curl to use a separate operation for the following URL and\n"
+"              associated options. This allows you  to  send  several  URL  re-\n"
+"              quests,  each with their own specific options, for example, such\n"
+"              as different user names or custom requests for each.\n"
 "\n"
 "              -:, --next will reset all local options  and  only  global  ones\n"
 "              will  have  their values survive over to the operation following\n"
-"              the -:, --next instruction. Global options  include  -v,  --ver-\n"
 , stdout);
  fputs(
+"              the -:, --next instruction. Global options  include  -v,  --ver-\n"
 "              bose, --trace, --trace-ascii and --fail-early.\n"
 "\n"
 "              For  example,  you can do both a GET and a POST in a single com-\n"
@@ -1958,21 +2062,21 @@ void hugehelp(void)
 "              Added in 7.36.0.\n"
 "\n"
 "       --no-alpn\n"
-"              (HTTPS) Disable the ALPN  TLS  extension.  ALPN  is  enabled  by\n"
-"              default  if  libcurl was built with an SSL library that supports\n"
+"              (HTTPS) Disable the ALPN TLS extension. ALPN is enabled  by  de-\n"
 , stdout);
  fputs(
+"              fault  if  libcurl  was  built with an SSL library that supports\n"
 "              ALPN. ALPN is used by a libcurl that supports HTTP/2 to  negoti-\n"
 "              ate HTTP/2 support with the server during https sessions.\n"
 "\n"
-"              See  also  --no-npn  and  --http2.  --no-alpn  requires that the\n"
-"              underlying libcurl was built to support TLS. Added in 7.36.0.\n"
+"              See  also  --no-npn and --http2. --no-alpn requires that the un-\n"
+"              derlying libcurl was built to support TLS. Added in 7.36.0.\n"
 "\n"
 "       -N, --no-buffer\n"
 "              Disables the buffering of the output stream. In normal work sit-\n"
-"              uations,  curl  will  use a standard buffered output stream that\n"
 , stdout);
  fputs(
+"              uations,  curl  will  use a standard buffered output stream that\n"
 "              will have the effect that it will output the data in chunks, not\n"
 "              necessarily  exactly  when  the data arrives.  Using this option\n"
 "              will disable that buffering.\n"
@@ -1981,243 +2085,280 @@ void hugehelp(void)
 "              thus use --buffer to enforce the buffering.\n"
 "\n"
 "       --no-keepalive\n"
+, stdout);
+ fputs(
 "              Disables  the  use  of keepalive messages on the TCP connection.\n"
 "              curl otherwise enables them by default.\n"
 "\n"
-, stdout);
- fputs(
 "              Note that this is the negated option name  documented.  You  can\n"
 "              thus use --keepalive to enforce keepalive.\n"
 "\n"
 "       --no-npn\n"
 "              (HTTPS) Disable the NPN TLS extension. NPN is enabled by default\n"
 "              if libcurl was built with an SSL library that supports NPN.  NPN\n"
+, stdout);
+ fputs(
 "              is  used  by  a libcurl that supports HTTP/2 to negotiate HTTP/2\n"
 "              support with the server during https sessions.\n"
 "\n"
+"              See also --no-alpn and --http2. --no-npn requires that  the  un-\n"
+"              derlying libcurl was built to support TLS. Added in 7.36.0.\n"
+"\n"
+"       --no-progress-meter\n"
+"              Option to switch off the progress meter output without muting or\n"
+"              otherwise affecting warning and informational messages like  -s,\n"
 , stdout);
  fputs(
-"              See also --no-alpn  and  --http2.  --no-npn  requires  that  the\n"
-"              underlying libcurl was built to support TLS. Added in 7.36.0.\n"
+"              --silent does.\n"
+"\n"
+"              Note  that  this  is the negated option name documented. You can\n"
+"              thus use --progress-meter to enable the progress meter again.\n"
+"\n"
+"              See also -v, --verbose and -s, --silent. Added in 7.67.0.\n"
 "\n"
 "       --no-sessionid\n"
-"              (TLS)  Disable curl's use of SSL session-ID caching.  By default\n"
-"              all transfers are done using the cache. Note that while  nothing\n"
-"              should  ever  get  hurt  by attempting to reuse SSL session-IDs,\n"
-"              there seem to be broken SSL implementations in the wild that may\n"
+"              (TLS) Disable curl's use of SSL session-ID caching.  By  default\n"
+"              all  transfers are done using the cache. Note that while nothing\n"
 , stdout);
  fputs(
+"              should ever get hurt by attempting  to  reuse  SSL  session-IDs,\n"
+"              there seem to be broken SSL implementations in the wild that may\n"
 "              require you to disable this in order for you to succeed.\n"
 "\n"
-"              Note  that  this  is the negated option name documented. You can\n"
+"              Note that this is the negated option name  documented.  You  can\n"
 "              thus use --sessionid to enforce session-ID caching.\n"
 "\n"
 "              Added in 7.16.0.\n"
 "\n"
 "       --noproxy <no-proxy-list>\n"
-"              Comma-separated list of hosts which do not use a proxy,  if  one\n"
-"              is  specified.  The only wildcard is a single * character, which\n"
 , stdout);
  fputs(
+"              Comma-separated  list  of hosts which do not use a proxy, if one\n"
+"              is specified.  The only wildcard is a single * character,  which\n"
 "              matches all hosts, and effectively disables the proxy. Each name\n"
-"              in  this  list  is matched as either a domain which contains the\n"
-"              hostname, or the hostname itself. For example,  local.com  would\n"
-"              match   local.com,  local.com:80,  and  www.local.com,  but  not\n"
-"              www.notlocal.com.\n"
-"\n"
-"              Since 7.53.0, This option overrides  the  environment  variables\n"
+"              in this list is matched as either a domain  which  contains  the\n"
+"              hostname,  or  the hostname itself. For example, local.com would\n"
+"              match  local.com,  local.com:80,  and  www.local.com,  but   not\n"
 , stdout);
  fputs(
-"              that  disable the proxy. If there's an environment variable dis-\n"
+"              www.notlocal.com.\n"
+"\n"
+"              Since  7.53.0,  This  option overrides the environment variables\n"
+"              that disable the proxy. If there's an environment variable  dis-\n"
 "              abling a proxy, you can set noproxy list to \"\" to override it.\n"
 "\n"
 "              Added in 7.19.4.\n"
 "\n"
 "       --ntlm-wb\n"
 "              (HTTP) Enables NTLM much in the style --ntlm does, but hand over\n"
-"              the  authentication  to the separate binary ntlmauth application\n"
+"              the authentication to the separate binary  ntlmauth  application\n"
+, stdout);
+ fputs(
 "              that is executed when needed.\n"
 "\n"
 "              See also --ntlm and --proxy-ntlm.\n"
 "\n"
-, stdout);
- fputs(
-"       --ntlm (HTTP) Enables  NTLM  authentication.  The  NTLM  authentication\n"
+"       --ntlm (HTTP)  Enables  NTLM  authentication.  The  NTLM authentication\n"
 "              method was designed by Microsoft and is used by IIS web servers.\n"
-"              It is a proprietary protocol, reverse-engineered by clever  peo-\n"
+"              It  is a proprietary protocol, reverse-engineered by clever peo-\n"
 "              ple and implemented in curl based on their efforts. This kind of\n"
-"              behavior should not be endorsed, you should  encourage  everyone\n"
-"              who  uses  NTLM to switch to a public and documented authentica-\n"
+"              behavior  should  not be endorsed, you should encourage everyone\n"
 , stdout);
  fputs(
+"              who uses NTLM to switch to a public and  documented  authentica-\n"
 "              tion method instead, such as Digest.\n"
 "\n"
-"              If you want to enable NTLM for your proxy  authentication,  then\n"
+"              If  you  want to enable NTLM for your proxy authentication, then\n"
 "              use --proxy-ntlm.\n"
 "\n"
-"              If  this  option  is  used  several times, only the first one is\n"
+"              If this option is used several times,  only  the  first  one  is\n"
 "              used.\n"
 "\n"
-"              See also  --proxy-ntlm.  --ntlm  requires  that  the  underlying\n"
-"              libcurl  was built to support TLS. This option overrides --basic\n"
-"              and --negotiate and --digest and --anyauth.\n"
-"\n"
+"              See  also  --proxy-ntlm.  --ntlm  requires  that  the underlying\n"
 , stdout);
  fputs(
+"              libcurl was built to support TLS. This option overrides  --basic\n"
+"              and --negotiate and --digest and --anyauth.\n"
+"\n"
 "       --oauth2-bearer <token>\n"
-"              (IMAP POP3 SMTP) Specify the Bearer Token for OAUTH  2.0  server\n"
+"              (IMAP  POP3  SMTP) Specify the Bearer Token for OAUTH 2.0 server\n"
 "              authentication. The Bearer Token is used in conjunction with the\n"
-"              user name which can be specified as part of  the  --url  or  -u,\n"
+"              user  name  which  can  be specified as part of the --url or -u,\n"
 "              --user options.\n"
 "\n"
-"              The  Bearer  Token  and user name are formatted according to RFC\n"
+, stdout);
+ fputs(
+"              The Bearer Token and user name are formatted  according  to  RFC\n"
 "              6750.\n"
 "\n"
 "              If this option is used several times, the last one will be used.\n"
 "\n"
-, stdout);
- fputs(
 "       -o, --output <file>\n"
 "              Write output to <file> instead of stdout. If you are using {} or\n"
-"              []  to  fetch  multiple documents, you can use '#' followed by a\n"
-"              number in the <file> specifier. That variable will  be  replaced\n"
+"              [] to fetch multiple documents, you can use '#'  followed  by  a\n"
+"              number  in  the <file> specifier. That variable will be replaced\n"
+, stdout);
+ fputs(
 "              with the current string for the URL being fetched. Like in:\n"
 "\n"
 "               curl http://{one,two}.example.com -o \"file_#1.txt\"\n"
 "\n"
 "              or use several variables like:\n"
 "\n"
-, stdout);
- fputs(
 "               curl http://{site,host}.host[1-5].com -o \"#1_#2\"\n"
 "\n"
-"              You  may use this option as many times as the number of URLs you\n"
-"              have. For example, if you specify two URLs on the  same  command\n"
+"              You may use this option as many times as the number of URLs  you\n"
+"              have.  For  example, if you specify two URLs on the same command\n"
 "              line, you can use it like this:\n"
 "\n"
-"                curl -o aa example.com -o bb example.net\n"
-"\n"
-"              and  the  order  of  the -o options and the URLs doesn't matter,\n"
-"              just that the first -o is for the first URL and so  on,  so  the\n"
 , stdout);
  fputs(
+"                curl -o aa example.com -o bb example.net\n"
+"\n"
+"              and the order of the -o options and  the  URLs  doesn't  matter,\n"
+"              just  that  the  first -o is for the first URL and so on, so the\n"
 "              above command line can also be written as\n"
 "\n"
 "                curl example.com example.net -o aa -o bb\n"
 "\n"
-"              See  also  the --create-dirs option to create the local directo-\n"
-"              ries dynamically. Specifying the output as '-' (a  single  dash)\n"
+"              See also the --create-dirs option to create the  local  directo-\n"
+"              ries  dynamically.  Specifying the output as '-' (a single dash)\n"
+, stdout);
+ fputs(
 "              will force the output to be done to stdout.\n"
 "\n"
-"              See   also  -O,  --remote-name  and  --remote-name-all  and  -J,\n"
-"              --remote-header-name.\n"
+"              See also -O, --remote-name and --remote-name-all and  -J,  --re-\n"
+"              mote-header-name.\n"
 "\n"
-"       --pass <phrase>\n"
+"       --parallel-immediate\n"
+"              When  doing  parallel  transfers, this option will instruct curl\n"
+"              that it should rather prefer opening up more connections in par-\n"
+"              allel at once rather than waiting to see if new transfers can be\n"
+, stdout);
+ fputs(
+"              added as multiplexed streams on another connection.\n"
+"\n"
+"              See also -Z, --parallel and --parallel-max. Added in 7.68.0.\n"
+"\n"
+"       --parallel-max\n"
+"              When asked to do parallel transfers, using -Z, --parallel,  this\n"
+"              option controls the maximum amount of transfers to do simultane-\n"
+"              ously.\n"
+"\n"
+"              The default is 50.\n"
+"\n"
+"              See also -Z, --parallel. Added in 7.66.0.\n"
+"\n"
+"       -Z, --parallel\n"
 , stdout);
  fputs(
+"              Makes curl perform its transfers in parallel as compared to  the\n"
+"              regular serial manner.\n"
+"\n"
+"              Added in 7.66.0.\n"
+"\n"
+"       --pass <phrase>\n"
 "              (SSH TLS) Passphrase for the private key\n"
 "\n"
 "              If this option is used several times, the last one will be used.\n"
 "\n"
 "       --path-as-is\n"
-"              Tell curl to not handle sequences of /../ or /./  in  the  given\n"
-"              URL  path.  Normally curl will squash or merge them according to\n"
+"              Tell  curl  to  not handle sequences of /../ or /./ in the given\n"
+"              URL path. Normally curl will squash or merge them  according  to\n"
+, stdout);
+ fputs(
 "              standards but with this option set you tell it not to do that.\n"
 "\n"
 "              Added in 7.42.0.\n"
 "\n"
 "       --pinnedpubkey <hashes>\n"
-, stdout);
- fputs(
-"              (TLS) Tells curl to  use  the  specified  public  key  file  (or\n"
-"              hashes)  to  verify the peer. This can be a path to a file which\n"
+"              (TLS)  Tells  curl  to  use  the  specified  public key file (or\n"
+"              hashes) to verify the peer. This can be a path to a  file  which\n"
 "              contains a single public key in PEM or DER format, or any number\n"
 "              of base64 encoded sha256 hashes preceded by 'sha256//' and sepa-\n"
 "              rated by ';'\n"
 "\n"
-"              When negotiating a TLS or SSL connection,  the  server  sends  a\n"
 , stdout);
  fputs(
-"              certificate  indicating  its identity. A public key is extracted\n"
-"              from this certificate and if it does not exactly match the  pub-\n"
-"              lic  key provided to this option, curl will abort the connection\n"
+"              When  negotiating  a  TLS  or SSL connection, the server sends a\n"
+"              certificate indicating its identity. A public key  is  extracted\n"
+"              from  this certificate and if it does not exactly match the pub-\n"
+"              lic key provided to this option, curl will abort the  connection\n"
 "              before sending or receiving any data.\n"
 "\n"
 "              PEM/DER support:\n"
 "                7.39.0: OpenSSL, GnuTLS and GSKit\n"
-"                7.43.0: NSS and wolfSSL/CyaSSL\n"
-"                7.47.0: mbedtls\n"
-"                7.49.0: PolarSSL sha256 support:\n"
+"                7.43.0: NSS and wolfSSL\n"
 , stdout);
  fputs(
-"                7.44.0: OpenSSL, GnuTLS, NSS and wolfSSL/CyaSSL.\n"
-"                7.47.0: mbedtls\n"
-"                7.49.0: PolarSSL Other SSL backends not supported.\n"
+"                7.47.0: mbedtls sha256 support:\n"
+"                7.44.0: OpenSSL, GnuTLS, NSS and wolfSSL\n"
+"                7.47.0: mbedtls Other SSL backends not supported.\n"
 "\n"
 "              If this option is used several times, the last one will be used.\n"
 "\n"
 "       --post301\n"
 "              (HTTP) Tells curl to respect RFC 7231/6.4.2 and not convert POST\n"
 "              requests into GET requests when following a 301 redirection. The\n"
-"              non-RFC behaviour is ubiquitous in web browsers,  so  curl  does\n"
 , stdout);
  fputs(
-"              the  conversion  by  default to maintain consistency. However, a\n"
-"              server may require a POST to remain a POST after  such  a  redi-\n"
-"              rection.  This  option is meaningful only when using -L, --loca-\n"
+"              non-RFC  behaviour  is  ubiquitous in web browsers, so curl does\n"
+"              the conversion by default to maintain  consistency.  However,  a\n"
+"              server  may  require  a POST to remain a POST after such a redi-\n"
+"              rection. This option is meaningful only when using  -L,  --loca-\n"
 "              tion.\n"
 "\n"
-"              See also --post302 and --post303 and -L,  --location.  Added  in\n"
+"              See  also  --post302  and --post303 and -L, --location. Added in\n"
 "              7.17.1.\n"
 "\n"
 "       --post302\n"
-"              (HTTP) Tells curl to respect RFC 7231/6.4.3 and not convert POST\n"
 , stdout);
  fputs(
+"              (HTTP) Tells curl to respect RFC 7231/6.4.3 and not convert POST\n"
 "              requests into GET requests when following a 302 redirection. The\n"
-"              non-RFC  behaviour  is  ubiquitous in web browsers, so curl does\n"
-"              the conversion by default to maintain  consistency.  However,  a\n"
-"              server  may  require  a POST to remain a POST after such a redi-\n"
-"              rection. This option is meaningful only when using  -L,  --loca-\n"
+"              non-RFC behaviour is ubiquitous in web browsers,  so  curl  does\n"
+"              the  conversion  by  default to maintain consistency. However, a\n"
+"              server may require a POST to remain a POST after  such  a  redi-\n"
+"              rection.  This  option is meaningful only when using -L, --loca-\n"
 "              tion.\n"
 "\n"
-"              See  also  --post301  and --post303 and -L, --location. Added in\n"
 , stdout);
  fputs(
+"              See also --post301 and --post303 and -L,  --location.  Added  in\n"
 "              7.19.1.\n"
 "\n"
 "       --post303\n"
 "              (HTTP) Tells curl to violate RFC 7231/6.4.4 and not convert POST\n"
-"              requests  into  GET  requests when following 303 redirections. A\n"
+"              requests into GET requests when following  303  redirections.  A\n"
 "              server may require a POST to remain a POST after a 303 redirect-\n"
 "              ion. This option is meaningful only when using -L, --location.\n"
 "\n"
-"              See  also  --post302  and --post301 and -L, --location. Added in\n"
+, stdout);
+ fputs(
+"              See also --post302 and --post301 and -L,  --location.  Added  in\n"
 "              7.26.0.\n"
 "\n"
 "       --preproxy [protocol://]host[:port]\n"
-, stdout);
- fputs(
-"              Use the specified SOCKS proxy before connecting to  an  HTTP  or\n"
-"              HTTPS  -x,  --proxy.  In  such a case curl first connects to the\n"
-"              SOCKS proxy and then connects (through SOCKS)  to  the  HTTP  or\n"
+"              Use  the  specified  SOCKS proxy before connecting to an HTTP or\n"
+"              HTTPS -x, --proxy. In such a case curl  first  connects  to  the\n"
+"              SOCKS  proxy  and  then  connects (through SOCKS) to the HTTP or\n"
 "              HTTPS proxy. Hence pre proxy.\n"
 "\n"
-"              The pre proxy string should be specified with a protocol:// pre-\n"
-"              fix to  specify  alternative  proxy  protocols.  Use  socks4://,\n"
 , stdout);
  fputs(
-"              socks4a://,  socks5://  or  socks5h://  to  request the specific\n"
-"              SOCKS version to be used. No protocol specified will  make  curl\n"
+"              The pre proxy string should be specified with a protocol:// pre-\n"
+"              fix  to  specify  alternative  proxy  protocols.  Use socks4://,\n"
+"              socks4a://, socks5:// or  socks5h://  to  request  the  specific\n"
+"              SOCKS  version  to be used. No protocol specified will make curl\n"
 "              default to SOCKS4.\n"
 "\n"
-"              If  the  port number is not specified in the proxy string, it is\n"
+"              If the port number is not specified in the proxy string,  it  is\n"
 "              assumed to be 1080.\n"
 "\n"
-"              User and password that might be provided in the proxy string are\n"
-"              URL  decoded by curl. This allows you to pass in special charac-\n"
 , stdout);
  fputs(
+"              User and password that might be provided in the proxy string are\n"
+"              URL decoded by curl. This allows you to pass in special  charac-\n"
 "              ters such as @ by using %40 or pass in a colon with %3a.\n"
 "\n"
 "              If this option is used several times, the last one will be used.\n"
@@ -2225,114 +2366,116 @@ void hugehelp(void)
 "              Added in 7.52.0.\n"
 "\n"
 "       -#, --progress-bar\n"
-"              Make curl display transfer progress as  a  simple  progress  bar\n"
-"              instead of the standard, more informational, meter.\n"
-"\n"
-"              This  progress  bar draws a single line of '#' characters across\n"
+"              Make curl display transfer progress as a simple progress bar in-\n"
 , stdout);
  fputs(
+"              stead of the standard, more informational, meter.\n"
+"\n"
+"              This progress bar draws a single line of '#'  characters  across\n"
 "              the screen and shows a percentage if the transfer size is known.\n"
-"              For  transfers  without  a  known size, there will be space ship\n"
-"              (-=o=-) that moves back and forth but only while data  is  being\n"
+"              For transfers without a known size, there  will  be  space  ship\n"
+"              (-=o=-)  that  moves back and forth but only while data is being\n"
 "              transferred, with a set of flying hash sign symbols on top.\n"
 "\n"
 "       --proto-default <protocol>\n"
+, stdout);
+ fputs(
 "              Tells curl to use protocol for any URL missing a scheme name.\n"
 "\n"
 "              Example:\n"
 "\n"
-, stdout);
- fputs(
 "               curl --proto-default https ftp.mozilla.org\n"
 "\n"
-"              An  unknown  or  unsupported  protocol causes error CURLE_UNSUP-\n"
+"              An unknown or unsupported  protocol  causes  error  CURLE_UNSUP-\n"
 "              PORTED_PROTOCOL (1).\n"
 "\n"
 "              This option does not change the default proxy protocol (http).\n"
 "\n"
-"              Without this option curl would make a guess based on  the  host,\n"
+"              Without  this  option curl would make a guess based on the host,\n"
 "              see --url for details.\n"
 "\n"
+, stdout);
+ fputs(
 "              Added in 7.45.0.\n"
 "\n"
 "       --proto-redir <protocols>\n"
-, stdout);
- fputs(
-"              Tells  curl to limit what protocols it may use on redirect. Pro-\n"
-"              tocols denied by --proto are not overridden by this option.  See\n"
+"              Tells curl to limit what protocols it may use on redirect.  Pro-\n"
+"              tocols  denied by --proto are not overridden by this option. See\n"
 "              --proto for how protocols are represented.\n"
 "\n"
 "              Example, allow only HTTP and HTTPS on redirect:\n"
 "\n"
 "               curl --proto-redir -all,http,https http://example.com\n"
 "\n"
-"              By default curl will allow all protocols on redirect except sev-\n"
+"              By default curl will allow HTTP, HTTPS, FTP and FTPS on redirect\n"
 , stdout);
  fputs(
-"              eral disabled for security reasons: Since 7.19.4  FILE  and  SCP\n"
-"              are  disabled,  and since 7.40.0 SMB and SMBS are also disabled.\n"
-"              Specifying all  or  +all  enables  all  protocols  on  redirect,\n"
-"              including those disabled for security.\n"
+"              (7.65.2).  Older versions of curl allowed all protocols on redi-\n"
+"              rect except several disabled for security reasons: Since  7.19.4\n"
+"              FILE  and  SCP  are  disabled, and since 7.40.0 SMB and SMBS are\n"
+"              also disabled. Specifying all or +all enables all  protocols  on\n"
+"              redirect, including those disabled for security.\n"
 "\n"
 "              Added in 7.20.2.\n"
 "\n"
 "       --proto <protocols>\n"
-"              Tells  curl  to limit what protocols it may use in the transfer.\n"
 , stdout);
  fputs(
+"              Tells  curl  to limit what protocols it may use in the transfer.\n"
 "              Protocols are evaluated left to right, are comma separated,  and\n"
-"              are each a protocol name or\n"
+"              are  each  a protocol name or 'all', optionally prefixed by zero\n"
+"              or more modifiers. Available modifiers are:\n"
 "\n"
 "              +  Permit this protocol in addition to protocols already permit-\n"
 "                 ted (this is the default if no modifier is used).\n"
 "\n"
-"              -  Deny this protocol, removing it from the  list  of  protocols\n"
-"                 already permitted.\n"
-"\n"
-"              =  Permit  only this protocol (ignoring the list already permit-\n"
 , stdout);
  fputs(
-"                 ted), though subject  to  later  modification  by  subsequent\n"
-"                 entries in the comma separated list.\n"
+"              -  Deny  this  protocol,  removing it from the list of protocols\n"
+"                 already permitted.\n"
+"\n"
+"              =  Permit only this protocol (ignoring the list already  permit-\n"
+"                 ted),  though subject to later modification by subsequent en-\n"
+"                 tries in the comma separated list.\n"
 "\n"
 "              For example:\n"
 "\n"
 "              --proto -ftps  uses the default protocols, but disables ftps\n"
 "\n"
 "              --proto -all,https,+http\n"
+, stdout);
+ fputs(
 "                             only enables http and https\n"
 "\n"
 "              --proto =http,https\n"
 "                             also only enables http and https\n"
 "\n"
-, stdout);
- fputs(
 "       Unknown protocols produce a warning. This allows scripts to safely rely\n"
 "       on being able to disable potentially dangerous protocols, without rely-\n"
-"       ing  upon  support  for that protocol being built into curl to avoid an\n"
+"       ing upon support for that protocol being built into curl  to  avoid  an\n"
 "       error.\n"
 "\n"
 "       This option can be used multiple times, in which case the effect is the\n"
+, stdout);
+ fputs(
 "       same as concatenating the protocols into one instance of the option.\n"
 "\n"
 "       See also --proto-redir and --proto-default. Added in 7.20.2.\n"
 "\n"
 "       --proxy-anyauth\n"
-, stdout);
- fputs(
-"              Tells  curl to pick a suitable authentication method when commu-\n"
-"              nicating with the given HTTP proxy. This might  cause  an  extra\n"
+"              Tells curl to pick a suitable authentication method when  commu-\n"
+"              nicating  with  the  given HTTP proxy. This might cause an extra\n"
 "              request/response round-trip.\n"
 "\n"
 "              See also -x, --proxy and --proxy-basic and --proxy-digest. Added\n"
 "              in 7.13.2.\n"
 "\n"
 "       --proxy-basic\n"
-"              Tells curl to use HTTP Basic authentication  when  communicating\n"
-"              with the given proxy. Use --basic for enabling HTTP Basic with a\n"
 , stdout);
  fputs(
-"              remote host. Basic is the  default  authentication  method  curl\n"
+"              Tells  curl  to use HTTP Basic authentication when communicating\n"
+"              with the given proxy. Use --basic for enabling HTTP Basic with a\n"
+"              remote  host.  Basic  is  the default authentication method curl\n"
 "              uses with proxies.\n"
 "\n"
 "              See also -x, --proxy and --proxy-anyauth and --proxy-digest.\n"
@@ -2340,15 +2483,15 @@ void hugehelp(void)
 "       --proxy-cacert <file>\n"
 "              Same as --cacert but used in HTTPS proxy context.\n"
 "\n"
-"              See  also  --proxy-capath  and  --cacert  and  --capath  and -x,\n"
+, stdout);
+ fputs(
+"              See also  --proxy-capath  and  --cacert  and  --capath  and  -x,\n"
 "              --proxy. Added in 7.52.0.\n"
 "\n"
 "       --proxy-capath <dir>\n"
 "              Same as --capath but used in HTTPS proxy context.\n"
 "\n"
-, stdout);
- fputs(
-"              See also --proxy-cacert and -x, --proxy and --capath.  Added  in\n"
+"              See  also  --proxy-cacert and -x, --proxy and --capath. Added in\n"
 "              7.52.0.\n"
 "\n"
 "       --proxy-cert-type <type>\n"
@@ -2357,6 +2500,8 @@ void hugehelp(void)
 "              Added in 7.52.0.\n"
 "\n"
 "       --proxy-cert <cert[:passwd]>\n"
+, stdout);
+ fputs(
 "              Same as -E, --cert but used in HTTPS proxy context.\n"
 "\n"
 "              Added in 7.52.0.\n"
@@ -2366,49 +2511,49 @@ void hugehelp(void)
 "\n"
 "              Added in 7.52.0.\n"
 "\n"
-, stdout);
- fputs(
 "       --proxy-crlfile <file>\n"
 "              Same as --crlfile but used in HTTPS proxy context.\n"
 "\n"
 "              Added in 7.52.0.\n"
 "\n"
 "       --proxy-digest\n"
-"              Tells  curl to use HTTP Digest authentication when communicating\n"
+"              Tells curl to use HTTP Digest authentication when  communicating\n"
+, stdout);
+ fputs(
 "              with the given proxy. Use --digest for enabling HTTP Digest with\n"
 "              a remote host.\n"
 "\n"
 "              See also -x, --proxy and --proxy-anyauth and --proxy-basic.\n"
 "\n"
 "       --proxy-header <header/@file>\n"
+"              (HTTP) Extra header to include in the request when sending  HTTP\n"
+"              to a proxy. You may specify any number of extra headers. This is\n"
+"              the equivalent option to -H, --header but is for proxy  communi-\n"
 , stdout);
  fputs(
-"              (HTTP)  Extra header to include in the request when sending HTTP\n"
-"              to a proxy. You may specify any number of extra headers. This is\n"
-"              the  equivalent option to -H, --header but is for proxy communi-\n"
-"              cation only like in CONNECT requests when you  want  a  separate\n"
-"              header  sent  to  the proxy to what is sent to the actual remote\n"
+"              cation  only  like  in CONNECT requests when you want a separate\n"
+"              header sent to the proxy to what is sent to  the  actual  remote\n"
 "              host.\n"
 "\n"
-"              curl will make sure that each header  you  add/replace  is  sent\n"
-, stdout);
- fputs(
+"              curl  will  make  sure  that each header you add/replace is sent\n"
 "              with the proper end-of-line marker, you should thus not add that\n"
 "              as a part of the header content: do not add newlines or carriage\n"
 "              returns, they will only mess things up for you.\n"
 "\n"
-"              Headers  specified  with  this  option  will  not be included in\n"
-"              requests that curl knows will not be sent to a proxy.\n"
-"\n"
-"              Starting in 7.55.0, this option can take an argument  in  @file-\n"
 , stdout);
  fputs(
-"              name  style, which then adds a header for each line in the input\n"
+"              Headers specified with this option will not be included  in  re-\n"
+"              quests that curl knows will not be sent to a proxy.\n"
+"\n"
+"              Starting  in  7.55.0, this option can take an argument in @file-\n"
+"              name style, which then adds a header for each line in the  input\n"
 "              file. Using @- will make curl read the header file from stdin.\n"
 "\n"
-"              This option can be used  multiple  times  to  add/replace/remove\n"
+"              This  option  can  be  used multiple times to add/replace/remove\n"
 "              multiple headers.\n"
 "\n"
+, stdout);
+ fputs(
 "              Added in 7.37.0.\n"
 "       --proxy-insecure\n"
 "              Same as -k, --insecure but used in HTTPS proxy context.\n"
@@ -2416,8 +2561,6 @@ void hugehelp(void)
 "              Added in 7.52.0.\n"
 "\n"
 "       --proxy-key-type <type>\n"
-, stdout);
- fputs(
 "              Same as --key-type but used in HTTPS proxy context.\n"
 "\n"
 "              Added in 7.52.0.\n"
@@ -2426,50 +2569,50 @@ void hugehelp(void)
 "              Same as --key but used in HTTPS proxy context.\n"
 "\n"
 "       --proxy-negotiate\n"
-"              Tells  curl  to  use HTTP Negotiate (SPNEGO) authentication when\n"
+"              Tells curl to use HTTP Negotiate  (SPNEGO)  authentication  when\n"
+, stdout);
+ fputs(
 "              communicating with the given proxy. Use --negotiate for enabling\n"
 "              HTTP Negotiate (SPNEGO) with a remote host.\n"
 "\n"
-, stdout);
- fputs(
 "              See also --proxy-anyauth and --proxy-basic. Added in 7.17.1.\n"
 "\n"
 "       --proxy-ntlm\n"
-"              Tells  curl  to  use HTTP NTLM authentication when communicating\n"
+"              Tells curl to use HTTP NTLM  authentication  when  communicating\n"
 "              with the given proxy. Use --ntlm for enabling NTLM with a remote\n"
 "              host.\n"
 "\n"
 "              See also --proxy-negotiate and --proxy-anyauth.\n"
 "\n"
+, stdout);
+ fputs(
 "       --proxy-pass <phrase>\n"
 "              Same as --pass but used in HTTPS proxy context.\n"
 "\n"
 "              Added in 7.52.0.\n"
 "\n"
 "       --proxy-pinnedpubkey <hashes>\n"
-, stdout);
- fputs(
-"              (TLS)  Tells  curl  to  use  the  specified  public key file (or\n"
-"              hashes) to verify the proxy. This can be a path to a file  which\n"
+"              (TLS) Tells curl to  use  the  specified  public  key  file  (or\n"
+"              hashes)  to verify the proxy. This can be a path to a file which\n"
 "              contains a single public key in PEM or DER format, or any number\n"
 "              of base64 encoded sha256 hashes preceded by 'sha256//' and sepa-\n"
-"              rated by ';'\n"
-"\n"
-"              When  negotiating  a  TLS  or SSL connection, the server sends a\n"
 , stdout);
  fputs(
-"              certificate indicating its identity. A public key  is  extracted\n"
-"              from  this certificate and if it does not exactly match the pub-\n"
-"              lic key provided to this option, curl will abort the  connection\n"
+"              rated by ';'\n"
+"\n"
+"              When negotiating a TLS or SSL connection,  the  server  sends  a\n"
+"              certificate  indicating  its identity. A public key is extracted\n"
+"              from this certificate and if it does not exactly match the  pub-\n"
+"              lic  key provided to this option, curl will abort the connection\n"
 "              before sending or receiving any data.\n"
 "\n"
 "              If this option is used several times, the last one will be used.\n"
 "\n"
-"       --proxy-service-name <name>\n"
-"              This  option  allows  you  to  change the service name for proxy\n"
 , stdout);
  fputs(
-"              negotiation.\n"
+"       --proxy-service-name <name>\n"
+"              This option allows you to change the service name for proxy  ne-\n"
+"              gotiation.\n"
 "\n"
 "              Added in 7.43.0.\n"
 "\n"
@@ -2479,15 +2622,22 @@ void hugehelp(void)
 "              Added in 7.52.0.\n"
 "\n"
 "       --proxy-tls13-ciphers <ciphersuite list>\n"
-"              (TLS) Specifies which cipher suites to use in the connection  to\n"
-"              your HTTPS proxy when it negotiates TLS 1.3. The list of ciphers\n"
-"              suites must specify valid ciphers. Read up  on  TLS  1.3  cipher\n"
+"              (TLS)  Specifies which cipher suites to use in the connection to\n"
 , stdout);
  fputs(
+"              your HTTPS proxy when it negotiates TLS 1.3. The list of ciphers\n"
+"              suites  must  specify  valid  ciphers. Read up on TLS 1.3 cipher\n"
 "              suite details on this URL:\n"
 "\n"
 "               https://curl.haxx.se/docs/ssl-ciphers.html\n"
 "\n"
+"              This option is currently used only when curl  is  built  to  use\n"
+"              OpenSSL 1.1.1 or later. If you are using a different SSL backend\n"
+"              you can try setting TLS 1.3 cipher suites by using the  --proxy-\n"
+, stdout);
+ fputs(
+"              ciphers option.\n"
+"\n"
 "              If this option is used several times, the last one will be used.\n"
 "\n"
 "       --proxy-tlsauthtype <type>\n"
@@ -2501,10 +2651,10 @@ void hugehelp(void)
 "              Added in 7.52.0.\n"
 "\n"
 "       --proxy-tlsuser <name>\n"
-, stdout);
- fputs(
 "              Same as --tlsuser but used in HTTPS proxy context.\n"
 "\n"
+, stdout);
+ fputs(
 "              Added in 7.52.0.\n"
 "\n"
 "       --proxy-tlsv1\n"
@@ -2516,85 +2666,90 @@ void hugehelp(void)
 "              Specify  the user name and password to use for proxy authentica-\n"
 "              tion.\n"
 "\n"
-"              If you use a Windows SSPI-enabled  curl  binary  and  do  either\n"
+"              If you use a Windows SSPI-enabled curl binary and do either  Ne-\n"
+"              gotiate  or NTLM authentication then you can tell curl to select\n"
 , stdout);
  fputs(
-"              Negotiate  or  NTLM  authentication  then  you  can tell curl to\n"
-"              select the user name and password from your environment by spec-\n"
-"              ifying a single colon with this option: \"-U :\".\n"
+"              the user name and password from your environment by specifying a\n"
+"              single colon with this option: \"-U :\".\n"
 "\n"
+"              On systems where it works, curl will hide the given option argu-\n"
+"              ment from process listings. This is not enough to  protect  cre-\n"
+"              dentials  from  possibly getting seen by other users on the same\n"
+"              system as they will still be visible for a brief  moment  before\n"
+, stdout);
+ fputs(
+"              cleared. Such sensitive data should be retrieved from a file in-\n"
+"              stead or similar and never used in clear text in a command line.\n"
 "              If this option is used several times, the last one will be used.\n"
 "\n"
 "       -x, --proxy [protocol://]host[:port]\n"
 "              Use the specified proxy.\n"
 "\n"
-"              The  proxy string can be specified with a protocol:// prefix. No\n"
+"              The proxy string can be specified with a protocol:// prefix.  No\n"
+"              protocol specified or http:// will be treated as HTTP proxy. Use\n"
 , stdout);
  fputs(
-"              protocol specified or http:// will be treated as HTTP proxy. Use\n"
 "              socks4://, socks4a://, socks5:// or socks5h:// to request a spe-\n"
 "              cific SOCKS version to be used.  (The protocol support was added\n"
 "              in curl 7.21.7)\n"
 "\n"
-"              HTTPS  proxy  support  via https:// protocol prefix was added in\n"
+"              HTTPS proxy support via https:// protocol prefix  was  added  in\n"
 "              7.52.0 for OpenSSL, GnuTLS and NSS.\n"
 "\n"
-"              Unrecognized and unsupported  proxy  protocols  cause  an  error\n"
+"              Unrecognized  and  unsupported  proxy  protocols  cause an error\n"
+"              since 7.52.0.  Prior versions may ignore the  protocol  and  use\n"
 , stdout);
  fputs(
-"              since  7.52.0.   Prior  versions may ignore the protocol and use\n"
 "              http:// instead.\n"
 "\n"
-"              If the port number is not specified in the proxy string,  it  is\n"
+"              If  the  port number is not specified in the proxy string, it is\n"
 "              assumed to be 1080.\n"
 "\n"
-"              This  option  overrides  existing environment variables that set\n"
-"              the proxy to use. If there's an environment variable  setting  a\n"
+"              This option overrides existing environment  variables  that  set\n"
+"              the  proxy  to use. If there's an environment variable setting a\n"
 "              proxy, you can set proxy to \"\" to override it.\n"
 "\n"
+"              All operations that are performed over an HTTP proxy will trans-\n"
 , stdout);
  fputs(
-"              All operations that are performed over an HTTP proxy will trans-\n"
-"              parently be converted to HTTP. It means  that  certain  protocol\n"
+"              parently  be  converted  to HTTP. It means that certain protocol\n"
 "              specific operations might not be available. This is not the case\n"
 "              if you can tunnel through the proxy, as one with the -p, --prox-\n"
 "              ytunnel option.\n"
 "\n"
 "              User and password that might be provided in the proxy string are\n"
-, stdout);
- fputs(
-"              URL decoded by curl. This allows you to pass in special  charac-\n"
+"              URL  decoded by curl. This allows you to pass in special charac-\n"
 "              ters such as @ by using %40 or pass in a colon with %3a.\n"
 "\n"
-"              The  proxy host can be specified the exact same way as the proxy\n"
-"              environment variables, including the protocol  prefix  (http://)\n"
+, stdout);
+ fputs(
+"              The proxy host can be specified the exact same way as the  proxy\n"
+"              environment  variables,  including the protocol prefix (http://)\n"
 "              and the embedded user + password.\n"
 "\n"
 "              If this option is used several times, the last one will be used.\n"
 "\n"
 "       --proxy1.0 <host[:port]>\n"
-, stdout);
- fputs(
-"              Use  the  specified  HTTP  1.0  proxy. If the port number is not\n"
+"              Use the specified HTTP 1.0 proxy. If  the  port  number  is  not\n"
 "              specified, it is assumed at port 1080.\n"
 "\n"
-"              The only difference between this and the HTTP proxy  option  -x,\n"
-"              --proxy,  is that attempts to use CONNECT through the proxy will\n"
+, stdout);
+ fputs(
+"              The  only  difference between this and the HTTP proxy option -x,\n"
+"              --proxy, is that attempts to use CONNECT through the proxy  will\n"
 "              specify an HTTP 1.0 protocol instead of the default HTTP 1.1.\n"
 "\n"
 "       -p, --proxytunnel\n"
-"              When an HTTP proxy is used -x, --proxy, this option  will  cause\n"
+"              When  an  HTTP  proxy is used -x, --proxy, this option will make\n"
+"              curl tunnel through the proxy. The tunnel approach is made  with\n"
+"              the  HTTP  proxy CONNECT request and requires that the proxy al-\n"
 , stdout);
  fputs(
-"              non-HTTP  protocols  to  attempt  to  tunnel  through  the proxy\n"
-"              instead of merely using it to do HTTP-like operations. The  tun-\n"
-"              nel  approach  is  made  with the HTTP proxy CONNECT request and\n"
-"              requires that the proxy allows direct connect to the remote port\n"
-"              number curl wants to tunnel through to.\n"
+"              lows direct connect to the remote port number curl wants to tun-\n"
+"              nel through to.\n"
 "\n"
 "              To  suppress  proxy CONNECT response headers when curl is set to\n"
-, stdout);
- fputs(
 "              output headers use --suppress-connect-headers.\n"
 "\n"
 "              See also -x, --proxy.\n"
@@ -2603,93 +2758,96 @@ void hugehelp(void)
 "              (SFTP SCP) Public key file name. Allows you to provide your pub-\n"
 "              lic key in this separate file.\n"
 "\n"
+, stdout);
+ fputs(
 "              If this option is used several times, the last one will be used.\n"
 "              (As of 7.39.0, curl attempts to automatically extract the public\n"
 "              key from the private key file, so passing this option is  gener-\n"
-, stdout);
- fputs(
 "              ally not required. Note that this public key extraction requires\n"
 "              libcurl to be linked against a copy of libssh2 1.2.8  or  higher\n"
 "              that is itself linked against OpenSSL.)\n"
 "\n"
 "       -Q, --quote\n"
+, stdout);
+ fputs(
 "              (FTP  SFTP)  Send an arbitrary command to the remote FTP or SFTP\n"
 "              server. Quote commands are sent BEFORE the transfer takes  place\n"
 "              (just  after  the  initial PWD command in an FTP transfer, to be\n"
-, stdout);
- fputs(
 "              exact). To make commands take place after a successful transfer,\n"
 "              prefix  them  with  a  dash '-'.  To make commands be sent after\n"
 "              curl has changed the working directory, just before the transfer\n"
+, stdout);
+ fputs(
 "              command(s),  prefix  the  command  with a '+' (this is only sup-\n"
 "              ported for FTP). You may specify any number of commands.\n"
 "\n"
-"              If the server returns failure  for  one  of  the  commands,  the\n"
+"              If the server returns failure for one of the commands,  the  en-\n"
+"              tire operation will be aborted. You must send syntactically cor-\n"
+"              rect FTP commands as RFC 959 defines to FTP servers, or  one  of\n"
+"              the commands listed below to SFTP servers.\n"
+"\n"
 , stdout);
  fputs(
-"              entire  operation  will  be aborted. You must send syntactically\n"
-"              correct FTP commands as RFC 959 defines to FTP servers,  or  one\n"
-"              of the commands listed below to SFTP servers.\n"
+"              Prefix  the  command  with an asterisk (*) to make curl continue\n"
+"              even if the command fails as by default curl will stop at  first\n"
+"              failure.\n"
 "\n"
-"              This  option can be used multiple times. When speaking to an FTP\n"
-"              server, prefix the command with an asterisk  (*)  to  make  curl\n"
-"              continue  even if the command fails as by default curl will stop\n"
-"              at first failure.\n"
+"              This option can be used multiple times.\n"
 "\n"
+"              SFTP  is a binary protocol. Unlike for FTP, curl interprets SFTP\n"
+"              quote commands itself before sending them to the  server.   File\n"
+"              names may be quoted shell-style to embed spaces or special char-\n"
 , stdout);
  fputs(
-"              SFTP is a binary protocol. Unlike for FTP, curl interprets  SFTP\n"
-"              quote  commands  itself before sending them to the server.  File\n"
-"              names may be quoted shell-style to embed spaces or special char-\n"
-"              acters.   Following is the list of all supported SFTP quote com-\n"
+"              acters.  Following is the list of all supported SFTP quote  com-\n"
 "              mands:\n"
 "\n"
 "              chgrp group file\n"
-"                     The chgrp command sets the group ID of the file named  by\n"
-, stdout);
- fputs(
-"                     the  file  operand to the group ID specified by the group\n"
+"                     The  chgrp command sets the group ID of the file named by\n"
+"                     the file operand to the group ID specified by  the  group\n"
 "                     operand. The group operand is a decimal integer group ID.\n"
 "\n"
 "              chmod mode file\n"
-"                     The chmod command modifies the  file  mode  bits  of  the\n"
+"                     The  chmod  command  modifies  the  file mode bits of the\n"
+, stdout);
+ fputs(
 "                     specified file. The mode operand is an octal integer mode\n"
 "                     number.\n"
 "\n"
 "              chown user file\n"
 "                     The chown command sets the owner of the file named by the\n"
-, stdout);
- fputs(
-"                     file  operand  to the user ID specified by the user oper-\n"
+"                     file operand to the user ID specified by the  user  oper-\n"
 "                     and. The user operand is a decimal integer user ID.\n"
 "\n"
 "              ln source_file target_file\n"
 "                     The ln and symlink commands create a symbolic link at the\n"
-"                     target_file  location  pointing  to the source_file loca-\n"
+, stdout);
+ fputs(
+"                     target_file location pointing to  the  source_file  loca-\n"
 "                     tion.\n"
 "\n"
 "              mkdir directory_name\n"
-"                     The mkdir command creates  the  directory  named  by  the\n"
-, stdout);
- fputs(
-"                     directory_name operand.\n"
+"                     The  mkdir command creates the directory named by the di-\n"
+"                     rectory_name operand.\n"
 "\n"
 "              pwd    The pwd command returns the absolute pathname of the cur-\n"
 "                     rent working directory.\n"
 "\n"
 "              rename source target\n"
+, stdout);
+ fputs(
 "                     The rename command renames the file or directory named by\n"
-"                     the  source  operand to the destination path named by the\n"
+"                     the source operand to the destination path named  by  the\n"
 "                     target operand.\n"
 "\n"
 "              rm file\n"
-, stdout);
- fputs(
 "                     The rm command removes the file specified by the file op-\n"
 "                     erand.\n"
 "\n"
 "              rmdir directory\n"
-"                     The  rmdir  command removes the directory entry specified\n"
+"                     The rmdir command removes the directory  entry  specified\n"
+, stdout);
+ fputs(
 "                     by the directory operand, provided it is empty.\n"
 "\n"
 "              symlink source_file target_file\n"
@@ -2697,181 +2855,181 @@ void hugehelp(void)
 "\n"
 "       --random-file <file>\n"
 "              Specify the path name to file containing what will be considered\n"
-, stdout);
- fputs(
-"              as  random  data. The data may be used to seed the random engine\n"
+"              as random data. The data may be used to seed the  random  engine\n"
 "              for SSL connections.  See also the --egd-file option.\n"
 "\n"
 "       -r, --range <range>\n"
+, stdout);
+ fputs(
 "              (HTTP FTP SFTP FILE) Retrieve a byte range (i.e. a partial docu-\n"
-"              ment)  from  an  HTTP/1.1,  FTP  or SFTP server or a local FILE.\n"
+"              ment) from an HTTP/1.1, FTP or SFTP  server  or  a  local  FILE.\n"
 "              Ranges can be specified in a number of ways.\n"
 "\n"
 "              0-499     specifies the first 500 bytes\n"
 "\n"
-, stdout);
- fputs(
 "              500-999   specifies the second 500 bytes\n"
 "\n"
 "              -500      specifies the last 500 bytes\n"
 "\n"
 "              9500-     specifies the bytes from offset 9500 and forward\n"
 "\n"
+, stdout);
+ fputs(
 "              0-0,-1    specifies the first and last byte only(*)(HTTP)\n"
 "\n"
 "              100-199,500-599\n"
 "                        specifies two separate 100-byte ranges(*) (HTTP)\n"
 "\n"
-"              (*) = NOTE that this will cause the server to reply with a  mul-\n"
+"              (*)  = NOTE that this will cause the server to reply with a mul-\n"
 "              tipart response!\n"
 "\n"
+"              Only digit characters (0-9) are valid in the 'start' and  'stop'\n"
+"              fields  of the 'start-stop' range syntax. If a non-digit charac-\n"
 , stdout);
  fputs(
-"              Only  digit characters (0-9) are valid in the 'start' and 'stop'\n"
-"              fields of the 'start-stop' range syntax. If a non-digit  charac-\n"
 "              ter is given in the range, the server's response will be unspec-\n"
 "              ified, depending on the server's configuration.\n"
 "\n"
-"              You should also be aware that many HTTP/1.1 servers do not  have\n"
-"              this  feature  enabled, so that when you attempt to get a range,\n"
-, stdout);
- fputs(
+"              You  should also be aware that many HTTP/1.1 servers do not have\n"
+"              this feature enabled, so that when you attempt to get  a  range,\n"
 "              you'll instead get the whole document.\n"
 "\n"
-"              FTP and SFTP range downloads only  support  the  simple  'start-\n"
-"              stop'  syntax  (optionally with one of the numbers omitted). FTP\n"
+"              FTP  and  SFTP  range  downloads only support the simple 'start-\n"
+, stdout);
+ fputs(
+"              stop' syntax (optionally with one of the numbers  omitted).  FTP\n"
 "              use depends on the extended FTP command SIZE.\n"
 "\n"
 "              If this option is used several times, the last one will be used.\n"
 "\n"
 "       --raw  (HTTP) When used, it disables all internal HTTP decoding of con-\n"
-, stdout);
- fputs(
-"              tent  or  transfer  encodings  and  instead makes them passed on\n"
-"              unaltered, raw.\n"
+"              tent or transfer encodings and instead makes them passed on  un-\n"
+"              altered, raw.\n"
 "\n"
 "              Added in 7.16.2.\n"
 "\n"
 "       -e, --referer <URL>\n"
-"              (HTTP) Sends the \"Referrer Page\" information to the HTTP server.\n"
-"              This can also be set with the -H, --header flag of course.  When\n"
-"              used with -L, --location you  can  append  \";auto\"  to  the  -e,\n"
-"              --referer  URL  to  make curl automatically set the previous URL\n"
 , stdout);
  fputs(
-"              when it follows a Location: header. The \";auto\"  string  can  be\n"
+"              (HTTP) Sends the \"Referrer Page\" information to the HTTP server.\n"
+"              This can also be set with the -H, --header flag of course.  When\n"
+"              used  with  -L,  --location  you  can  append \";auto\" to the -e,\n"
+"              --referer URL to make curl automatically set  the  previous  URL\n"
+"              when  it  follows  a Location: header. The \";auto\" string can be\n"
 "              used alone, even if you don't set an initial -e, --referer.\n"
 "\n"
+, stdout);
+ fputs(
 "              If this option is used several times, the last one will be used.\n"
 "\n"
 "              See also -A, --user-agent and -H, --header.\n"
 "\n"
 "       -J, --remote-header-name\n"
 "              (HTTP) This option tells the -O, --remote-name option to use the\n"
-"              server-specified   Content-Disposition   filename   instead   of\n"
+"              server-specified  Content-Disposition  filename  instead  of ex-\n"
+"              tracting a filename from the URL.\n"
+"\n"
+"              If the server specifies a file name and a file  with  that  name\n"
 , stdout);
  fputs(
-"              extracting a filename from the URL.\n"
-"\n"
-"              If  the  server  specifies a file name and a file with that name\n"
-"              already exists in the current working directory it will  not  be\n"
+"              already  exists  in the current working directory it will not be\n"
 "              overwritten and an error will occur. If the server doesn't spec-\n"
 "              ify a file name then this option has no effect.\n"
 "\n"
-"              There's no attempt to decode %-sequences (yet) in  the  provided\n"
-, stdout);
- fputs(
+"              There's  no  attempt to decode %-sequences (yet) in the provided\n"
 "              file name, so this option may provide you with rather unexpected\n"
 "              file names.\n"
 "\n"
-"              WARNING: Exercise judicious use of this  option,  especially  on\n"
-"              Windows.  A  rogue  server  could  send you the name of a DLL or\n"
-"              other file that could possibly be loaded automatically  by  Win-\n"
+"              WARNING:  Exercise  judicious  use of this option, especially on\n"
+, stdout);
+ fputs(
+"              Windows. A rogue server could send you the  name  of  a  DLL  or\n"
+"              other  file  that could possibly be loaded automatically by Win-\n"
 "              dows or some third party software.\n"
 "\n"
 "       --remote-name-all\n"
-"              This  option changes the default action for all given URLs to be\n"
-, stdout);
- fputs(
+"              This option changes the default action for all given URLs to  be\n"
 "              dealt with as if -O, --remote-name were used for each one. So if\n"
 "              you want to disable that for a specific URL after --remote-name-\n"
+, stdout);
+ fputs(
 "              all has been used, you must use \"-o -\" or --no-remote-name.\n"
 "\n"
 "              Added in 7.19.0.\n"
 "\n"
 "       -O, --remote-name\n"
-"              Write output to a local file named like the remote file we  get.\n"
-"              (Only  the file part of the remote file is used, the path is cut\n"
+"              Write  output to a local file named like the remote file we get.\n"
+"              (Only the file part of the remote file is used, the path is  cut\n"
 "              off.)\n"
 "\n"
+"              The  file will be saved in the current working directory. If you\n"
+"              want the file saved in a  different  directory,  make  sure  you\n"
 , stdout);
  fputs(
-"              The file will be saved in the current working directory. If  you\n"
-"              want  the  file  saved  in  a different directory, make sure you\n"
-"              change the current working directory before invoking  curl  with\n"
+"              change  the  current working directory before invoking curl with\n"
 "              this option.\n"
 "\n"
-"              The  remote  file  name  to use for saving is extracted from the\n"
-"              given URL, nothing else, and if it already  exists  it  will  be\n"
+"              The remote file name to use for saving  is  extracted  from  the\n"
+"              given  URL,  nothing  else,  and if it already exists it will be\n"
+"              overwritten. If you want the server to be  able  to  choose  the\n"
+"              file name refer to -J, --remote-header-name which can be used in\n"
 , stdout);
  fputs(
-"              overwritten.  If  you  want  the server to be able to choose the\n"
-"              file name refer to -J, --remote-header-name which can be used in\n"
-"              addition  to  this option. If the server chooses a file name and\n"
+"              addition to this option. If the server chooses a file  name  and\n"
 "              that name already exists it will not be overwritten.\n"
 "\n"
 "              There is no URL decoding done on the file name. If it has %20 or\n"
-"              other  URL  encoded parts of the name, they will end up as-is as\n"
+"              other URL encoded parts of the name, they will end up  as-is  as\n"
 "              file name.\n"
 "\n"
-, stdout);
- fputs(
-"              You may use this option as many times as the number of URLs  you\n"
+"              You  may use this option as many times as the number of URLs you\n"
 "              have.\n"
 "\n"
 "       -R, --remote-time\n"
-"              When  used,  this will make curl attempt to figure out the time-\n"
-"              stamp of the remote file, and if  that  is  available  make  the\n"
-"              local file get that same timestamp.\n"
+, stdout);
+ fputs(
+"              When used, this will make curl attempt to figure out  the  time-\n"
+"              stamp  of the remote file, and if that is available make the lo-\n"
+"              cal file get that same timestamp.\n"
 "\n"
 "       --request-target\n"
-"              (HTTP)  Tells curl to use an alternative \"target\" (path) instead\n"
+"              (HTTP) Tells curl to use an alternative \"target\" (path)  instead\n"
+"              of  using  the  path as provided in the URL. Particularly useful\n"
+"              when wanting to issue HTTP requests  without  leading  slash  or\n"
 , stdout);
  fputs(
-"              of using the path as provided in the  URL.  Particularly  useful\n"
-"              when  wanting  to  issue  HTTP requests without leading slash or\n"
-"              other data that doesn't follow the  regular  URL  pattern,  like\n"
+"              other  data  that  doesn't  follow the regular URL pattern, like\n"
 "              \"OPTIONS *\".\n"
 "\n"
 "              Added in 7.55.0.\n"
 "\n"
 "       -X, --request <command>\n"
 "              (HTTP) Specifies a custom request method to use when communicat-\n"
-"              ing with the HTTP server.  The specified request method will  be\n"
+"              ing  with the HTTP server.  The specified request method will be\n"
+"              used instead of the method otherwise  used  (which  defaults  to\n"
+"              GET).  Read  the HTTP 1.1 specification for details and explana-\n"
 , stdout);
  fputs(
-"              used  instead  of  the  method otherwise used (which defaults to\n"
-"              GET). Read the HTTP 1.1 specification for details  and  explana-\n"
-"              tions.  Common  additional HTTP requests include PUT and DELETE,\n"
+"              tions. Common additional HTTP requests include PUT  and  DELETE,\n"
 "              but related technologies like WebDAV offers PROPFIND, COPY, MOVE\n"
 "              and more.\n"
 "\n"
-"              Normally  you  don't  need  this option. All sorts of GET, HEAD,\n"
+"              Normally you don't need this option. All  sorts  of  GET,  HEAD,\n"
 "              POST and PUT requests are rather invoked by using dedicated com-\n"
-, stdout);
- fputs(
 "              mand line options.\n"
 "\n"
-"              This  option  only  changes  the  actual  word  used in the HTTP\n"
-"              request, it does not alter the way curl behaves. So for  example\n"
-"              if  you  want  to make a proper HEAD request, using -X HEAD will\n"
-"              not suffice. You need to use the -I, --head option.\n"
+"              This option only changes the actual word used in  the  HTTP  re-\n"
+, stdout);
+ fputs(
+"              quest, it does not alter the way curl behaves. So for example if\n"
+"              you want to make a proper HEAD request, using -X HEAD  will  not\n"
+"              suffice. You need to use the -I, --head option.\n"
 "\n"
-"              The method string you set with -X, --request will  be  used  for\n"
-"              all  requests,  which  if you for example use -L, --location may\n"
+"              The  method  string  you set with -X, --request will be used for\n"
+"              all requests, which if you for example use  -L,  --location  may\n"
+"              cause  unintended  side-effects when curl doesn't change request\n"
 , stdout);
  fputs(
-"              cause unintended side-effects when curl doesn't  change  request\n"
 "              method according to the HTTP 30x response codes - and similar.\n"
 "\n"
 "              (FTP) Specifies a custom FTP command to use instead of LIST when\n"
@@ -2880,104 +3038,132 @@ void hugehelp(void)
 "              (POP3) Specifies a custom POP3 command to use instead of LIST or\n"
 "              RETR. (Added in 7.26.0)\n"
 "\n"
-"              (IMAP)  Specifies  a custom IMAP command to use instead of LIST.\n"
-, stdout);
- fputs(
+"              (IMAP) Specifies a custom IMAP command to use instead  of  LIST.\n"
 "              (Added in 7.30.0)\n"
 "\n"
+, stdout);
+ fputs(
 "              (SMTP) Specifies a custom SMTP command to use instead of HELP or\n"
 "              VRFY. (Added in 7.34.0)\n"
 "\n"
 "              If this option is used several times, the last one will be used.\n"
 "\n"
 "       --resolve <host:port:address[,address]...>\n"
-"              Provide  a  custom  address  for  a specific host and port pair.\n"
-"              Using this, you can make the curl requests(s)  use  a  specified\n"
+"              Provide a custom address for a specific host and port pair.  Us-\n"
+"              ing  this, you can make the curl requests(s) use a specified ad-\n"
+"              dress and prevent the otherwise normally resolved address to  be\n"
 , stdout);
  fputs(
-"              address  and  prevent the otherwise normally resolved address to\n"
-"              be used. Consider it a sort of /etc/hosts  alternative  provided\n"
-"              on  the  command line. The port number should be the number used\n"
-"              for the specific protocol the host will be used  for.  It  means\n"
-"              you  need several entries if you want to provide address for the\n"
-"              same host but different ports.\n"
+"              used.  Consider  it a sort of /etc/hosts alternative provided on\n"
+"              the command line. The port number should be the number used  for\n"
+"              the  specific  protocol  the host will be used for. It means you\n"
+"              need several entries if you want to provide address for the same\n"
+"              host but different ports.\n"
 "\n"
+"              By  specifying '*' as host you can tell curl to resolve any host\n"
 , stdout);
  fputs(
+"              and specific port pair to the specified address. Wildcard is re-\n"
+"              solved  last so any --resolve with a specific host and port will\n"
+"              be used first.\n"
+"\n"
 "              The provided address set by this option will be used even if -4,\n"
 "              --ipv4 or -6, --ipv6 is set to make curl use another IP version.\n"
 "              Support for providing the IP address within [brackets] was added\n"
 "              in 7.57.0.\n"
 "\n"
+, stdout);
+ fputs(
 "              Support for providing multiple IP addresses per entry was  added\n"
 "              in 7.59.0.\n"
 "\n"
-"              This  option  can  be  used many times to add many host names to\n"
-"              resolve.\n"
+"              Support for resolving with wildcard was added in 7.64.0.\n"
+"\n"
+"              This option can be used many times to add many host names to re-\n"
+"              solve.\n"
 "\n"
-, stdout);
- fputs(
 "              Added in 7.21.3.\n"
 "\n"
 "       --retry-connrefused\n"
 "              In addition to the other conditions, consider ECONNREFUSED as  a\n"
 "              transient  error  too  for --retry. This option is used together\n"
+, stdout);
+ fputs(
 "              with --retry.\n"
 "\n"
 "              Added in 7.52.0.\n"
 "\n"
 "       --retry-delay <seconds>\n"
 "              Make curl sleep this amount of time before  each  retry  when  a\n"
-"              transfer  has  failed  with  a  transient  error (it changes the\n"
-, stdout);
- fputs(
-"              default backoff time algorithm between retries). This option  is\n"
+"              transfer  has  failed with a transient error (it changes the de-\n"
+"              fault backoff time algorithm between retries).  This  option  is\n"
 "              only  interesting if --retry is also used. Setting this delay to\n"
 "              zero will make curl use the default backoff time.\n"
 "\n"
+, stdout);
+ fputs(
 "              If this option is used several times, the last one will be used.\n"
 "\n"
 "              Added in 7.12.3.\n"
 "\n"
 "       --retry-max-time <seconds>\n"
-"              The retry timer is reset  before  the  first  transfer  attempt.\n"
-, stdout);
- fputs(
-"              Retries will be done as usual (see --retry) as long as the timer\n"
+"              The retry timer is reset before the first transfer attempt.  Re-\n"
+"              tries  will  be done as usual (see --retry) as long as the timer\n"
 "              hasn't reached this given limit. Notice that if the timer hasn't\n"
 "              reached  the  limit, the request will be made and while perform-\n"
-"              ing, it may take longer than this given time period. To limit  a\n"
-"              single  request's  maximum  time,  use -m, --max-time.  Set this\n"
-"              option to zero to not timeout retries.\n"
-"\n"
 , stdout);
  fputs(
+"              ing, it may take longer than this given time period. To limit  a\n"
+"              single request's maximum time, use -m, --max-time.  Set this op-\n"
+"              tion to zero to not timeout retries.\n"
+"\n"
 "              If this option is used several times, the last one will be used.\n"
 "\n"
 "              Added in 7.12.3.\n"
 "\n"
 "       --retry <num>\n"
 "              If a transient error is returned when curl tries  to  perform  a\n"
+, stdout);
+ fputs(
 "              transfer,  it  will retry this number of times before giving up.\n"
 "              Setting the number to 0 makes curl do no retries (which  is  the\n"
 "              default).  Transient  error  means either: a timeout, an FTP 4xx\n"
-, stdout);
- fputs(
 "              response code or an HTTP 408 or 5xx response code.\n"
 "\n"
 "              When curl is about to retry a transfer, it will first  wait  one\n"
 "              second  and  then for all forthcoming retries it will double the\n"
+, stdout);
+ fputs(
 "              waiting time until it reaches 10 minutes which then will be  the\n"
 "              delay  between  the rest of the retries.  By using --retry-delay\n"
 "              you  disable  this  exponential  backoff  algorithm.  See   also\n"
-, stdout);
- fputs(
 "              --retry-max-time to limit the total time allowed for retries.\n"
 "\n"
+"              Since  curl  7.66.0,  curl will comply with the Retry-After: re-\n"
+"              sponse header if one was present to know when to issue the  next\n"
+"              retry.\n"
+"\n"
+, stdout);
+ fputs(
 "              If this option is used several times, the last one will be used.\n"
 "\n"
 "              Added in 7.12.3.\n"
 "\n"
+"       --sasl-authzid\n"
+"              Use this authorisation identity (authzid), during SASL PLAIN au-\n"
+"              thentication, in addition to the authentication identity  (auth-\n"
+"              cid) as specified by -u, --user.\n"
+"\n"
+"              If  the  option  isn't specified, the server will derive the au-\n"
+"              thzid from the authcid, but if specified, and depending  on  the\n"
+, stdout);
+ fputs(
+"              server  implementation,  it may be used to access another user's\n"
+"              inbox, that the user has been granted access  to,  or  a  shared\n"
+"              mailbox for example.\n"
+"\n"
+"              Added in 7.66.0.\n"
+"\n"
 "       --sasl-ir\n"
 "              Enable initial response in SASL authentication.\n"
 "\n"
@@ -2986,9 +3172,9 @@ void hugehelp(void)
 "       --service-name <name>\n"
 "              This option allows you to change the service name for SPNEGO.\n"
 "\n"
-"              Examples:    --negotiate    --service-name   sockd   would   use\n"
 , stdout);
  fputs(
+"              Examples:    --negotiate    --service-name   sockd   would   use\n"
 "              sockd/server-name.\n"
 "\n"
 "              Added in 7.43.0.\n"
@@ -2998,11 +3184,11 @@ void hugehelp(void)
 "       -s, --silent\n"
 "              Silent  or  quiet  mode. Don't show progress meter or error mes-\n"
 "              sages.  Makes Curl mute. It will still output the data  you  ask\n"
+, stdout);
+ fputs(
 "              for, potentially even to the terminal/stdout unless you redirect\n"
 "              it.\n"
 "\n"
-, stdout);
- fputs(
 "              Use -S, --show-error in  addition  to  this  option  to  disable\n"
 "              progress meter but still show error messages.\n"
 "\n"
@@ -3012,20 +3198,20 @@ void hugehelp(void)
 "              Use the specified SOCKS4 proxy. If the port number is not speci-\n"
 "              fied, it is assumed at port 1080.\n"
 "\n"
+, stdout);
+ fputs(
 "              This option overrides any previous use of -x, --proxy,  as  they\n"
 "              are mutually exclusive.\n"
 "\n"
-, stdout);
- fputs(
 "              Since 7.21.7, this option is superfluous since you can specify a\n"
 "              socks4 proxy with -x, --proxy using a socks4:// protocol prefix.\n"
 "              Since 7.52.0, --preproxy can be used to specify a SOCKS proxy at\n"
 "              the  same  time -x, --proxy is used with an HTTP/HTTPS proxy. In\n"
+, stdout);
+ fputs(
 "              such a case curl first connects to the SOCKS proxy and then con-\n"
 "              nects (through SOCKS) to the HTTP or HTTPS proxy.\n"
 "\n"
-, stdout);
- fputs(
 "              If this option is used several times, the last one will be used.\n"
 "\n"
 "              Added in 7.15.2.\n"
@@ -3035,37 +3221,37 @@ void hugehelp(void)
 "              ified, it is assumed at port 1080.\n"
 "\n"
 "              This option overrides any previous use of -x, --proxy,  as  they\n"
+, stdout);
+ fputs(
 "              are mutually exclusive.\n"
 "\n"
 "              Since 7.21.7, this option is superfluous since you can specify a\n"
-, stdout);
- fputs(
 "              socks4a proxy with -x, --proxy using a socks4a:// protocol  pre-\n"
 "              fix.\n"
 "\n"
 "              Since 7.52.0, --preproxy can be used to specify a SOCKS proxy at\n"
 "              the same time -x, --proxy is used with an HTTP/HTTPS  proxy.  In\n"
 "              such a case curl first connects to the SOCKS proxy and then con-\n"
+, stdout);
+ fputs(
 "              nects (through SOCKS) to the HTTP or HTTPS proxy.\n"
 "\n"
 "              If this option is used several times, the last one will be used.\n"
 "\n"
-, stdout);
- fputs(
 "              Added in 7.18.0.\n"
 "\n"
 "       --socks5-basic\n"
 "              Tells curl to use username/password authentication when connect-\n"
 "              ing  to a SOCKS5 proxy.  The username/password authentication is\n"
-"              enabled  by  default.   Use  --socks5-gssapi  to  force  GSS-API\n"
-"              authentication to SOCKS5 proxies.\n"
+"              enabled by default.  Use --socks5-gssapi to  force  GSS-API  au-\n"
+"              thentication to SOCKS5 proxies.\n"
 "\n"
+, stdout);
+ fputs(
 "              Added in 7.55.0.\n"
 "\n"
 "       --socks5-gssapi-nec\n"
 "              As  part of the GSS-API negotiation a protection mode is negoti-\n"
-, stdout);
- fputs(
 "              ated. RFC 1961 says in section 4.3/4.4 it should  be  protected,\n"
 "              but  the  NEC  reference  implementation  does  not.  The option\n"
 "              --socks5-gssapi-nec allows the unprotected exchange of the  pro-\n"
@@ -3074,11 +3260,11 @@ void hugehelp(void)
 "              Added in 7.19.4.\n"
 "\n"
 "       --socks5-gssapi-service <name>\n"
+, stdout);
+ fputs(
 "              The default service name for a socks server is rcmd/server-fqdn.\n"
 "              This option allows you to change it.\n"
 "\n"
-, stdout);
- fputs(
 "              Examples:  --socks5  proxy-name  --socks5-gssapi-service   sockd\n"
 "              would  use sockd/proxy-name --socks5 proxy-name --socks5-gssapi-\n"
 "              service sockd/real-name  would  use  sockd/real-name  for  cases\n"
@@ -3087,9 +3273,9 @@ void hugehelp(void)
 "              Added in 7.19.4.\n"
 "\n"
 "       --socks5-gssapi\n"
-"              Tells  curl  to  use GSS-API authentication when connecting to a\n"
 , stdout);
  fputs(
+"              Tells  curl  to  use GSS-API authentication when connecting to a\n"
 "              SOCKS5 proxy.  The GSS-API authentication is enabled by  default\n"
 "              (if  curl is compiled with GSS-API support).  Use --socks5-basic\n"
 "              to force username/password authentication to SOCKS5 proxies.\n"
@@ -3098,11 +3284,11 @@ void hugehelp(void)
 "\n"
 "       --socks5-hostname <host[:port]>\n"
 "              Use the specified SOCKS5 proxy (and let the  proxy  resolve  the\n"
+, stdout);
+ fputs(
 "              host  name).  If the port number is not specified, it is assumed\n"
 "              at port 1080.\n"
 "\n"
-, stdout);
- fputs(
 "              This option overrides any previous use of -x, --proxy,  as  they\n"
 "              are mutually exclusive.\n"
 "\n"
@@ -3111,9 +3297,9 @@ void hugehelp(void)
 "              col prefix.\n"
 "\n"
 "              Since 7.52.0, --preproxy can be used to specify a SOCKS proxy at\n"
-"              the same time -x, --proxy is used with an HTTP/HTTPS  proxy.  In\n"
 , stdout);
  fputs(
+"              the same time -x, --proxy is used with an HTTP/HTTPS  proxy.  In\n"
 "              such a case curl first connects to the SOCKS proxy and then con-\n"
 "              nects (through SOCKS) to the HTTP or HTTPS proxy.\n"
 "\n"
@@ -3122,21 +3308,21 @@ void hugehelp(void)
 "              Added in 7.18.0.\n"
 "\n"
 "       --socks5 <host[:port]>\n"
-"              Use the specified SOCKS5 proxy  -  but  resolve  the  host  name\n"
-"              locally.  If  the port number is not specified, it is assumed at\n"
-"              port 1080.\n"
-"\n"
+"              Use the specified SOCKS5 proxy - but resolve the host  name  lo-\n"
 , stdout);
  fputs(
+"              cally.  If  the  port  number is not specified, it is assumed at\n"
+"              port 1080.\n"
+"\n"
 "              This option overrides any previous use of -x, --proxy,  as  they\n"
 "              are mutually exclusive.\n"
 "\n"
 "              Since 7.21.7, this option is superfluous since you can specify a\n"
 "              socks5 proxy with -x, --proxy using a socks5:// protocol prefix.\n"
 "              Since 7.52.0, --preproxy can be used to specify a SOCKS proxy at\n"
-"              the  same  time -x, --proxy is used with an HTTP/HTTPS proxy. In\n"
 , stdout);
  fputs(
+"              the  same  time -x, --proxy is used with an HTTP/HTTPS proxy. In\n"
 "              such a case curl first connects to the SOCKS proxy and then con-\n"
 "              nects (through SOCKS) to the HTTP or HTTPS proxy.\n"
 "\n"
@@ -3147,9 +3333,9 @@ void hugehelp(void)
 "              Added in 7.18.0.\n"
 "\n"
 "       -Y, --speed-limit <speed>\n"
-"              If a download is slower than this given speed (in bytes per sec-\n"
 , stdout);
  fputs(
+"              If a download is slower than this given speed (in bytes per sec-\n"
 "              ond)  for  speed-time seconds it gets aborted. speed-time is set\n"
 "              with -y, --speed-time and is 30 if not set.\n"
 "\n"
@@ -3158,9 +3344,9 @@ void hugehelp(void)
 "       -y, --speed-time <seconds>\n"
 "              If a download is slower than speed-limit bytes per second during\n"
 "              a speed-time period, the download gets aborted. If speed-time is\n"
-"              used, the default speed-limit will be  1  unless  set  with  -Y,\n"
 , stdout);
  fputs(
+"              used, the default speed-limit will be  1  unless  set  with  -Y,\n"
 "              --speed-limit.\n"
 "\n"
 "              This  option  controls  transfers  and thus will not affect slow\n"
@@ -3171,9 +3357,9 @@ void hugehelp(void)
 "\n"
 "       --ssl-allow-beast\n"
 "              This option tells curl to not work around a security flaw in the\n"
-"              SSL3 and TLS1.0 protocols known as BEAST.  If this option  isn't\n"
 , stdout);
  fputs(
+"              SSL3 and TLS1.0 protocols known as BEAST.  If this option  isn't\n"
 "              used,  the SSL layer may use workarounds known to cause interop-\n"
 "              erability problems with some older SSL implementations. WARNING:\n"
 "              this option loosens the SSL security, and by using this flag you\n"
@@ -3182,10 +3368,10 @@ void hugehelp(void)
 "              Added in 7.25.0.\n"
 "\n"
 "       --ssl-no-revoke\n"
-"              (WinSSL) This option tells curl to disable  certificate  revoca-\n"
-"              tion checks.  WARNING: this option loosens the SSL security, and\n"
+"              (Schannel) This option tells curl to disable certificate revoca-\n"
 , stdout);
  fputs(
+"              tion checks.  WARNING: this option loosens the SSL security, and\n"
 "              by using this flag you ask for exactly that.\n"
 "\n"
 "              Added in 7.44.0.\n"
@@ -3198,44 +3384,44 @@ void hugehelp(void)
 "\n"
 "              Added in 7.20.0.\n"
 "\n"
-"       --ssl  (FTP  IMAP  POP3  SMTP)  Try  to use SSL/TLS for the connection.\n"
 , stdout);
  fputs(
-"              Reverts to a non-secure connection if the server doesn't support\n"
+"       --ssl  (FTP IMAP POP3 SMTP) Try to use SSL/TLS for the connection.  Re-\n"
+"              verts to a non-secure connection if the server  doesn't  support\n"
 "              SSL/TLS.   See also --ftp-ssl-control and --ssl-reqd for differ-\n"
 "              ent levels of encryption required.\n"
 "\n"
 "              This option was formerly known as --ftp-ssl (Added  in  7.11.0).\n"
-"              That  option  name  can  still  be used but will be removed in a\n"
-"              future version.\n"
+"              That  option name can still be used but will be removed in a fu-\n"
+"              ture version.\n"
 "\n"
+, stdout);
+ fputs(
 "              Added in 7.20.0.\n"
 "\n"
 "       -2, --sslv2\n"
-, stdout);
- fputs(
 "              (SSL) Forces curl to use SSL version 2 when negotiating  with  a\n"
 "              remote  SSL  server.  Sometimes curl is built without SSLv2 sup-\n"
 "              port. SSLv2 is widely considered insecure (see RFC 6176).\n"
 "\n"
 "              See also --http1.1 and --http2. -2, --sslv2  requires  that  the\n"
 "              underlying  libcurl  was built to support TLS. This option over-\n"
+, stdout);
+ fputs(
 "              rides -3, --sslv3 and -1, --tlsv1 and --tlsv1.1 and --tlsv1.2.\n"
 "\n"
 "       -3, --sslv3\n"
-, stdout);
- fputs(
 "              (SSL) Forces curl to use SSL version 3 when negotiating  with  a\n"
 "              remote  SSL  server.  Sometimes curl is built without SSLv3 sup-\n"
 "              port. SSLv3 is widely considered insecure (see RFC 7568).\n"
 "\n"
 "              See also --http1.1 and --http2. -3, --sslv3  requires  that  the\n"
 "              underlying  libcurl  was built to support TLS. This option over-\n"
+, stdout);
+ fputs(
 "              rides -2, --sslv2 and -1, --tlsv1 and --tlsv1.1 and --tlsv1.2.\n"
 "\n"
 "       --stderr\n"
-, stdout);
- fputs(
 "              Redirect all writes to stderr to the specified file instead.  If\n"
 "              the file name is a plain '-', it is instead written to stdout.\n"
 "\n"
@@ -3245,23 +3431,23 @@ void hugehelp(void)
 "\n"
 "       --styled-output\n"
 "              Enables  the automatic use of bold font styles when writing HTTP\n"
+, stdout);
+ fputs(
 "              headers to the terminal. Use --no-styled-output to  switch  them\n"
 "              off.\n"
 "\n"
-, stdout);
- fputs(
 "              Added in 7.61.0.\n"
 "\n"
 "       --suppress-connect-headers\n"
 "              When  -p,  --proxytunnel  is  used and a CONNECT request is made\n"
 "              don't output proxy CONNECT  response  headers.  This  option  is\n"
 "              meant  to  be used with -D, --dump-header or -i, --include which\n"
-"              are used to show protocol headers  in  the  output.  It  has  no\n"
-"              effect on debug options such as -v, --verbose or --trace, or any\n"
-"              statistics.\n"
-"\n"
+"              are used to show protocol headers in the output. It has  no  ef-\n"
 , stdout);
  fputs(
+"              fect  on  debug options such as -v, --verbose or --trace, or any\n"
+"              statistics.\n"
+"\n"
 "              See also -D, --dump-header and -i, --include and -p, --proxytun-\n"
 "              nel.\n"
 "\n"
@@ -3274,9 +3460,9 @@ void hugehelp(void)
 "              Turn  on the TCP_NODELAY option. See the curl_easy_setopt(3) man\n"
 "              page for details about this option.\n"
 "\n"
-"              Since 7.50.2, curl sets this option by default and you  need  to\n"
 , stdout);
  fputs(
+"              Since 7.50.2, curl sets this option by default and you  need  to\n"
 "              explicitly switch it off if you don't want it on.\n"
 "\n"
 "              Added in 7.11.2.\n"
@@ -3291,9 +3477,9 @@ void hugehelp(void)
 "              NEW_ENV=<var,val> Sets an environment variable.\n"
 "\n"
 "       --tftp-blksize <value>\n"
-"              (TFTP) Set TFTP BLKSIZE option (must be >512). This is the block\n"
 , stdout);
  fputs(
+"              (TFTP) Set TFTP BLKSIZE option (must be >512). This is the block\n"
 "              size that curl will try to use when transferring data to or from\n"
 "              a TFTP server. By default 512 bytes will be used.\n"
 "\n"
@@ -3304,9 +3490,9 @@ void hugehelp(void)
 "       --tftp-no-options\n"
 "              (TFTP) Tells curl not to send TFTP options requests.\n"
 "\n"
-"              This  option  improves  interop with some legacy servers that do\n"
 , stdout);
  fputs(
+"              This  option  improves  interop with some legacy servers that do\n"
 "              not acknowledge or properly implement TFTP  options.  When  this\n"
 "              option is used --tftp-blksize is ignored.\n"
 "\n"
@@ -3315,94 +3501,126 @@ void hugehelp(void)
 "       -z, --time-cond <time>\n"
 "              (HTTP  FTP) Request a file that has been modified later than the\n"
 "              given time and date, or one that has been modified  before  that\n"
-"              time.  The <date expression> can be all sorts of date strings or\n"
 , stdout);
  fputs(
+"              time.  The <date expression> can be all sorts of date strings or\n"
 "              if it doesn't match any internal ones, it is taken as a filename\n"
-"              and  tries  to  get  the  modification  date (mtime) from <file>\n"
-"              instead. See the curl_getdate(3) man pages for  date  expression\n"
-"              details.\n"
+"              and  tries  to get the modification date (mtime) from <file> in-\n"
+"              stead. See the curl_getdate(3) man pages for date expression de-\n"
+"              tails.\n"
 "\n"
 "              Start the date expression with a dash (-) to make it request for\n"
 "              a document that is older than the given date/time, default is  a\n"
-"              document that is newer than the specified date/time.\n"
-"\n"
 , stdout);
  fputs(
+"              document that is newer than the specified date/time.\n"
+"\n"
 "              If this option is used several times, the last one will be used.\n"
 "\n"
 "       --tls-max <VERSION>\n"
-"              (SSL)  VERSION  defines maximum supported TLS version. A minimum\n"
-"              is defined by arguments tlsv1.0 or tlsv1.1 or tlsv1.2.\n"
+"              (SSL) VERSION defines maximum supported TLS version. The minimum\n"
+"              acceptable version  is  set  by  tlsv1.0,  tlsv1.1,  tlsv1.2  or\n"
+"              tlsv1.3.\n"
 "\n"
 "              default\n"
 "                     Use up to recommended TLS version.\n"
 "\n"
 "              1.0    Use up to TLSv1.0.\n"
+, stdout);
+ fputs(
 "              1.1    Use up to TLSv1.1.\n"
 "              1.2    Use up to TLSv1.2.\n"
 "              1.3    Use up to TLSv1.3.\n"
 "\n"
-, stdout);
- fputs(
-"       See also --tlsv1.0 and --tlsv1.1 and --tlsv1.2. --tls-max requires that\n"
-"       the underlying libcurl was built to support TLS. Added in 7.54.0.\n"
+"       See also --tlsv1.0 and --tlsv1.1 and --tlsv1.2 and --tlsv1.3. --tls-max\n"
+"       requires that the underlying libcurl was built to support TLS. Added in\n"
+"       7.54.0.\n"
 "\n"
 "       --tls13-ciphers <list of TLS 1.3 ciphersuites>\n"
 "              (TLS)  Specifies which cipher suites to use in the connection if\n"
+, stdout);
+ fputs(
 "              it negotiates TLS 1.3. The list of ciphers suites  must  specify\n"
 "              valid  ciphers.  Read up on TLS 1.3 cipher suite details on this\n"
 "              URL:\n"
 "\n"
-, stdout);
- fputs(
 "               https://curl.haxx.se/docs/ssl-ciphers.html\n"
 "\n"
+"              This option is currently used only when curl  is  built  to  use\n"
+"              OpenSSL 1.1.1 or later. If you are using a different SSL backend\n"
+"              you can try setting TLS 1.3 cipher suites by using the --ciphers\n"
+"              option.\n"
+"\n"
+, stdout);
+ fputs(
 "              If this option is used several times, the last one will be used.\n"
 "\n"
 "       --tlsauthtype <type>\n"
-"              Set TLS  authentication  type.  Currently,  the  only  supported\n"
-"              option  is  \"SRP\",  for  TLS-SRP  (RFC  5054).  If --tlsuser and\n"
-"              --tlspassword are specified but --tlsauthtype is not, then  this\n"
-"              option  defaults to \"SRP\".  This option works only if the under-\n"
+"              Set  TLS  authentication type. Currently, the only supported op-\n"
+"              tion  is  \"SRP\",  for  TLS-SRP  (RFC  5054).  If  --tlsuser  and\n"
+"              --tlspassword  are specified but --tlsauthtype is not, then this\n"
+"              option defaults to \"SRP\".  This option works only if the  under-\n"
 , stdout);
  fputs(
-"              lying libcurl is built  with  TLS-SRP  support,  which  requires\n"
+"              lying  libcurl  is  built  with  TLS-SRP support, which requires\n"
 "              OpenSSL or GnuTLS with TLS-SRP support.\n"
 "\n"
 "              Added in 7.21.4.\n"
 "\n"
 "       --tlspassword\n"
-"              Set  password  for use with the TLS authentication method speci-\n"
+"              Set password for use with the TLS authentication  method  speci-\n"
 "              fied with --tlsauthtype. Requires that --tlsuser also be set.\n"
 "\n"
+"              This doesn't work with TLS 1.3.\n"
+"\n"
 "              Added in 7.21.4.\n"
 "       --tlsuser <name>\n"
-"              Set username for use with the TLS authentication  method  speci-\n"
 , stdout);
  fputs(
-"              fied  with  --tlsauthtype.  Requires  that --tlspassword also is\n"
+"              Set  username  for use with the TLS authentication method speci-\n"
+"              fied with --tlsauthtype. Requires  that  --tlspassword  also  is\n"
 "              set.\n"
 "\n"
+"              This doesn't work with TLS 1.3.\n"
+"\n"
 "              Added in 7.21.4.\n"
 "\n"
 "       --tlsv1.0\n"
-"              (TLS) Forces curl to use TLS version 1.0 or later when  connect-\n"
+"              (TLS)  Forces curl to use TLS version 1.0 or later when connect-\n"
 "              ing to a remote TLS server.\n"
 "\n"
+"              In old versions of curl this  option  was  documented  to  allow\n"
+, stdout);
+ fputs(
+"              _only_  TLS  1.0, but behavior was inconsistent depending on the\n"
+"              TLS library. Use --tls-max if you want to set a maximum TLS ver-\n"
+"              sion.\n"
+"\n"
 "              Added in 7.34.0.\n"
 "\n"
 "       --tlsv1.1\n"
 "              (TLS)  Forces curl to use TLS version 1.1 or later when connect-\n"
 "              ing to a remote TLS server.\n"
 "\n"
+"              In old versions of curl this  option  was  documented  to  allow\n"
+, stdout);
+ fputs(
+"              _only_  TLS  1.1, but behavior was inconsistent depending on the\n"
+"              TLS library. Use --tls-max if you want to set a maximum TLS ver-\n"
+"              sion.\n"
+"\n"
 "              Added in 7.34.0.\n"
 "\n"
 "       --tlsv1.2\n"
+"              (TLS)  Forces curl to use TLS version 1.2 or later when connect-\n"
+"              ing to a remote TLS server.\n"
+"\n"
+"              In old versions of curl this  option  was  documented  to  allow\n"
 , stdout);
  fputs(
-"              (TLS) Forces curl to use TLS version 1.2 or later when  connect-\n"
-"              ing to a remote TLS server.\n"
+"              _only_  TLS  1.2, but behavior was inconsistent depending on the\n"
+"              TLS library. Use --tls-max if you want to set a maximum TLS ver-\n"
+"              sion.\n"
 "\n"
 "              Added in 7.34.0.\n"
 "\n"
@@ -3411,9 +3629,9 @@ void hugehelp(void)
 "              ing to a remote TLS server.\n"
 "\n"
 "              Note that TLS 1.3 is only supported by a subset of TLS backends.\n"
-"              At the time of this writing, they are BoringSSL, NSS, and Secure\n"
 , stdout);
  fputs(
+"              At the time of this writing, they are BoringSSL, NSS, and Secure\n"
 "              Transport (on iOS 11 or later, and macOS 10.13 or later).\n"
 "\n"
 "              Added in 7.52.0.\n"
@@ -3424,9 +3642,9 @@ void hugehelp(void)
 "              higher\n"
 "\n"
 "              See also --http1.1 and --http2. -1, --tlsv1  requires  that  the\n"
-"              underlying  libcurl  was built to support TLS. This option over-\n"
 , stdout);
  fputs(
+"              underlying  libcurl  was built to support TLS. This option over-\n"
 "              rides --tlsv1.1 and --tlsv1.2 and --tlsv1.3.\n"
 "\n"
 "       --tr-encoding\n"
@@ -3437,10 +3655,10 @@ void hugehelp(void)
 "              Added in 7.21.6.\n"
 "\n"
 "       --trace-ascii <file>\n"
-"              Enables a full trace dump of all  incoming  and  outgoing  data,\n"
-"              including descriptive information, to the given output file. Use\n"
+"              Enables a full trace dump of all incoming and outgoing data, in-\n"
 , stdout);
  fputs(
+"              cluding  descriptive  information, to the given output file. Use\n"
 "              \"-\" as filename to have the output sent to stdout.\n"
 "\n"
 "              This is very similar to --trace, but leaves out the hex part and\n"
@@ -3449,24 +3667,24 @@ void hugehelp(void)
 "\n"
 "              If this option is used several times, the last one will be used.\n"
 "\n"
+, stdout);
+ fputs(
 "              This option overrides --trace and -v, --verbose.\n"
 "\n"
 "       --trace-time\n"
-, stdout);
- fputs(
 "              Prepends a time stamp to each trace or verbose  line  that  curl\n"
 "              displays.\n"
 "\n"
 "              Added in 7.14.0.\n"
 "\n"
 "       --trace <file>\n"
-"              Enables  a  full  trace  dump of all incoming and outgoing data,\n"
-"              including descriptive information, to the given output file. Use\n"
+"              Enables a full trace dump of all incoming and outgoing data, in-\n"
+"              cluding descriptive information, to the given output  file.  Use\n"
 "              \"-\"  as  filename  to have the output sent to stdout. Use \"%\" as\n"
-"              filename to have the output sent to stderr.\n"
-"\n"
 , stdout);
  fputs(
+"              filename to have the output sent to stderr.\n"
+"\n"
 "              If this option is used several times, the last one will be used.\n"
 "\n"
 "              This option overrides -v, --verbose and --trace-ascii.\n"
@@ -3494,13 +3712,13 @@ void hugehelp(void)
 "              Use the file name \"-\" (a single dash) to use stdin instead of  a\n"
 "              given  file.   Alternately,  the file name \".\" (a single period)\n"
 "              may be specified instead of \"-\" to  use  stdin  in  non-blocking\n"
-"              mode  to  allow  reading  server  output  while  stdin  is being\n"
-"              uploaded.\n"
+"              mode  to  allow  reading  server output while stdin is being up-\n"
+"              loaded.\n"
 "\n"
 "              You can specify one -T, --upload-file for each URL on  the  com-\n"
+"              mand  line.  Each -T, --upload-file + URL pair specifies what to\n"
 , stdout);
  fputs(
-"              mand  line.  Each -T, --upload-file + URL pair specifies what to\n"
 "              upload and to where. curl also supports \"globbing\"  of  the  -T,\n"
 "              --upload-file  argument,  meaning  that  you can upload multiple\n"
 "              files to a single URL by using the same URL globbing style  sup-\n"
@@ -3510,10 +3728,10 @@ void hugehelp(void)
 "\n"
 "              or even\n"
 "\n"
-, stdout);
- fputs(
 "               curl -T \"img[1-1000].png\" ftp://ftp.example.com/upload/\n"
 "\n"
+, stdout);
+ fputs(
 "              When  uploading  to an SMTP server: the uploaded data is assumed\n"
 "              to be RFC 5322 formatted. It has to feature the necessary set of\n"
 "              headers  and  mail  body formatted correctly by the user as curl\n"
@@ -3521,31 +3739,31 @@ void hugehelp(void)
 "\n"
 "       --url <url>\n"
 "              Specify a URL to fetch. This option is  mostly  handy  when  you\n"
-, stdout);
- fputs(
 "              want to specify URL(s) in a config file.\n"
 "\n"
+, stdout);
+ fputs(
 "              If  the given URL is missing a scheme name (such as \"http://\" or\n"
 "              \"ftp://\" etc) then curl will make a guess based on the host.  If\n"
 "              the  outermost  sub-domain  name  matches DICT, FTP, IMAP, LDAP,\n"
 "              POP3 or SMTP then that protocol will  be  used,  otherwise  HTTP\n"
 "              will be used. Since 7.45.0 guessing can be disabled by setting a\n"
-, stdout);
- fputs(
 "              default protocol, see --proto-default for details.\n"
 "\n"
+, stdout);
+ fputs(
 "              This option may be used any number of times.  To  control  where\n"
 "              this  URL  is written, use the -o, --output or the -O, --remote-\n"
 "              name options.\n"
 "\n"
 "       -B, --use-ascii\n"
-"              (FTP LDAP) Enable ASCII transfer. For  FTP,  this  can  also  be\n"
-"              enforced  by  using  a URL that ends with \";type=A\". This option\n"
-, stdout);
- fputs(
+"              (FTP LDAP) Enable ASCII transfer. For FTP, this can also be  en-\n"
+"              forced  by  using  a  URL  that ends with \";type=A\". This option\n"
 "              causes data sent to stdout to be in text mode for win32 systems.\n"
 "\n"
 "       -A, --user-agent <name>\n"
+, stdout);
+ fputs(
 "              (HTTP) Specify the User-Agent string to send to the HTTP server.\n"
 "              To  encode blanks in the string, surround the string with single\n"
 "              quote marks. This header can also be set with the  -H,  --header\n"
@@ -3553,10 +3771,10 @@ void hugehelp(void)
 "\n"
 "              If this option is used several times, the last one will be used.\n"
 "\n"
-, stdout);
- fputs(
 "       -u, --user <user:password>\n"
 "              Specify the user name and password to use for server authentica-\n"
+, stdout);
+ fputs(
 "              tion. Overrides -n, --netrc and --netrc-optional.\n"
 "\n"
 "              If you simply specify the user name,  curl  will  prompt  for  a\n"
@@ -3566,26 +3784,34 @@ void hugehelp(void)
 "              which makes it impossible to use a colon in the user  name  with\n"
 "              this option. The password can, still.\n"
 "\n"
+"              On systems where it works, curl will hide the given option argu-\n"
 , stdout);
  fputs(
-"              When  using  Kerberos  V5 with a Windows based server you should\n"
-"              include the Windows domain name in the user name, in  order  for\n"
-"              the  server  to  successfully  obtain  a Kerberos Ticket. If you\n"
-"              don't then the initial authentication handshake may fail.\n"
-"\n"
-"              When using NTLM, the user name can be specified  simply  as  the\n"
-"              user  name,  without the domain, if there is a single domain and\n"
+"              ment from process listings. This is not enough to  protect  cre-\n"
+"              dentials  from  possibly getting seen by other users on the same\n"
+"              system as they will still be visible for a brief  moment  before\n"
+"              cleared. Such sensitive data should be retrieved from a file in-\n"
+"              stead or similar and never used in clear text in a command line.\n"
+"              When using Kerberos V5 with a Windows based  server  you  should\n"
 , stdout);
  fputs(
+"              include  the  Windows domain name in the user name, in order for\n"
+"              the server to successfully obtain  a  Kerberos  Ticket.  If  you\n"
+"              don't then the initial authentication handshake may fail.\n"
+"\n"
+"              When  using  NTLM,  the user name can be specified simply as the\n"
+"              user name, without the domain, if there is a single  domain  and\n"
 "              forest in your setup for example.\n"
 "\n"
-"              To specify the domain name use either Down-Level Logon  Name  or\n"
+, stdout);
+ fputs(
+"              To  specify  the domain name use either Down-Level Logon Name or\n"
 "              UPN (User Principal Name) formats. For example, EXAMPLE\\user and\n"
 "              user@example.com respectively.\n"
 "\n"
-"              If you use a Windows SSPI-enabled curl binary and  perform  Ker-\n"
-"              beros  V5, Negotiate, NTLM or Digest authentication then you can\n"
-"              tell curl to select the user name and password from  your  envi-\n"
+"              If  you  use a Windows SSPI-enabled curl binary and perform Ker-\n"
+"              beros V5, Negotiate, NTLM or Digest authentication then you  can\n"
+"              tell  curl  to select the user name and password from your envi-\n"
 , stdout);
  fputs(
 "              ronment by specifying a single colon with this option: \"-u :\".\n"
@@ -3593,10 +3819,10 @@ void hugehelp(void)
 "              If this option is used several times, the last one will be used.\n"
 "\n"
 "       -v, --verbose\n"
-"              Makes  curl  verbose  during the operation. Useful for debugging\n"
-"              and seeing what's going on \"under the  hood\".  A  line  starting\n"
-"              with  '>'  means  \"header  data\" sent by curl, '<' means \"header\n"
-"              data\" received by curl that is hidden in  normal  cases,  and  a\n"
+"              Makes curl verbose during the operation.  Useful  for  debugging\n"
+"              and  seeing  what's  going  on \"under the hood\". A line starting\n"
+"              with '>' means \"header data\" sent by  curl,  '<'  means  \"header\n"
+"              data\"  received  by  curl  that is hidden in normal cases, and a\n"
 , stdout);
  fputs(
 "              line starting with '*' means additional info provided by curl.\n"
@@ -3604,22 +3830,22 @@ void hugehelp(void)
 "              If you only want HTTP headers in the output, -i, --include might\n"
 "              be the option you're looking for.\n"
 "\n"
-"              If you think this option still doesn't give you enough  details,\n"
+"              If  you think this option still doesn't give you enough details,\n"
 "              consider using --trace or --trace-ascii instead.\n"
 "\n"
 "              Use -s, --silent to make curl really quiet.\n"
 "\n"
-"              See  also  -i,  --include.  This  option  overrides  --trace and\n"
+"              See also  -i,  --include.  This  option  overrides  --trace  and\n"
 , stdout);
  fputs(
 "              --trace-ascii.\n"
 "\n"
 "       -V, --version\n"
 "              Displays information about curl and the libcurl version it uses.\n"
-"              The first line includes the full version of  curl,  libcurl  and\n"
+"              The  first  line  includes the full version of curl, libcurl and\n"
 "              other 3rd party libraries linked with the executable.\n"
 "\n"
-"              The  second  line (starts with \"Protocols:\") shows all protocols\n"
+"              The second line (starts with \"Protocols:\") shows  all  protocols\n"
 "              that libcurl reports to support.\n"
 "\n"
 "              The third line (starts with \"Features:\") shows specific features\n"
@@ -3631,23 +3857,23 @@ void hugehelp(void)
 "\n"
 "              krb4   Krb4 for FTP is supported.\n"
 "\n"
-"              SSL    SSL  versions of various protocols are supported, such as\n"
+"              SSL    SSL versions of various protocols are supported, such  as\n"
 "                     HTTPS, FTPS, POP3S and so on.\n"
 "\n"
-"              libz   Automatic decompression of compressed files over HTTP  is\n"
+"              libz   Automatic  decompression of compressed files over HTTP is\n"
 "                     supported.\n"
 "\n"
 "              NTLM   NTLM authentication is supported.\n"
 "\n"
 , stdout);
  fputs(
-"              Debug  This  curl  uses a libcurl built with Debug. This enables\n"
-"                     more error-tracking and memory debugging etc.  For  curl-\n"
+"              Debug  This curl uses a libcurl built with Debug.  This  enables\n"
+"                     more  error-tracking  and memory debugging etc. For curl-\n"
 "                     developers only!\n"
 "\n"
 "              AsynchDNS\n"
-"                     This  curl  uses asynchronous name resolves. Asynchronous\n"
-"                     name resolves can be done using either the c-ares or  the\n"
+"                     This curl uses asynchronous name  resolves.  Asynchronous\n"
+"                     name  resolves can be done using either the c-ares or the\n"
 "                     threaded resolver backends.\n"
 "\n"
 "              SPNEGO SPNEGO authentication is supported.\n"
@@ -3666,7 +3892,7 @@ void hugehelp(void)
 "              SSPI   SSPI is supported.\n"
 "\n"
 "              TLS-SRP\n"
-"                     SRP (Secure Remote Password) authentication is  supported\n"
+"                     SRP  (Secure Remote Password) authentication is supported\n"
 "                     for TLS.\n"
 "\n"
 , stdout);
@@ -3680,112 +3906,120 @@ void hugehelp(void)
 "                     This curl is built to support HTTPS proxy.\n"
 "\n"
 "              Metalink\n"
-"                     This  curl  supports  Metalink (both version 3 and 4 (RFC\n"
-"                     5854)), which describes mirrors and  hashes.   curl  will\n"
+"                     This curl supports Metalink (both version 3  and  4  (RFC\n"
+"                     5854)),  which  describes  mirrors and hashes.  curl will\n"
 "                     use mirrors for failover if there are errors (such as the\n"
 , stdout);
  fputs(
 "                     file or server not being available).\n"
 "\n"
-"              PSL    PSL is short for Public Suffix List and means  that  this\n"
-"                     curl  has  been  built  with knowledge about \"public suf-\n"
+"              PSL    PSL  is  short for Public Suffix List and means that this\n"
+"                     curl has been built with  knowledge  about  \"public  suf-\n"
 "                     fixes\".\n"
 "\n"
+"              MultiSSL\n"
+"                     This curl supports multiple TLS backends.\n"
+"\n"
 "       -w, --write-out <format>\n"
 "              Make curl display information on stdout after a completed trans-\n"
-"              fer.  The  format  is a string that may contain plain text mixed\n"
 , stdout);
  fputs(
-"              with any number of variables. The format can be specified  as  a\n"
-"              literal  \"string\",  or  you can have curl read the format from a\n"
-"              file with \"@filename\" and to tell curl to read the  format  from\n"
+"              fer. The format is a string that may contain  plain  text  mixed\n"
+"              with  any  number of variables. The format can be specified as a\n"
+"              literal \"string\", or you can have curl read the  format  from  a\n"
+"              file  with  \"@filename\" and to tell curl to read the format from\n"
 "              stdin you write \"@-\".\n"
 "\n"
-"              The  variables  present in the output format will be substituted\n"
-"              by the value or text that curl thinks fit, as  described  below.\n"
+"              The variables present in the output format will  be  substituted\n"
 , stdout);
  fputs(
-"              All  variables are specified as %{variable_name} and to output a\n"
-"              normal % you just write them as %%. You can output a newline  by\n"
+"              by  the  value or text that curl thinks fit, as described below.\n"
+"              All variables are specified as %{variable_name} and to output  a\n"
+"              normal  % you just write them as %%. You can output a newline by\n"
 "              using \\n, a carriage return with \\r and a tab space with \\t.\n"
 "\n"
+"              The output will be written to standard output, but this  can  be\n"
+"              switched to standard error by using %{stderr}.\n"
+"\n"
+, stdout);
+ fputs(
 "              NOTE: The %-symbol is a special symbol in the win32-environment,\n"
-"              where all occurrences of %  must  be  doubled  when  using  this\n"
-"              option.\n"
+"              where all occurrences of % must be doubled when using  this  op-\n"
+"              tion.\n"
 "\n"
 "              The variables available are:\n"
 "\n"
-, stdout);
- fputs(
 "              content_type   The  Content-Type  of  the requested document, if\n"
 "                             there was any.\n"
 "\n"
 "              filename_effective\n"
 "                             The ultimate filename that curl  writes  out  to.\n"
+, stdout);
+ fputs(
 "                             This  is only meaningful if curl is told to write\n"
 "                             to a file  with  the  -O,  --remote-name  or  -o,\n"
 "                             --output  option. It's most useful in combination\n"
-, stdout);
- fputs(
 "                             with the -J, --remote-header-name option.  (Added\n"
 "                             in 7.26.0)\n"
 "\n"
 "              ftp_entry_path The initial path curl ended up in when logging on\n"
+, stdout);
+ fputs(
 "                             to the remote FTP server. (Added in 7.15.4)\n"
 "\n"
 "              http_code      The numerical response code that was found in the\n"
 "                             last  retrieved  HTTP(S)  or  FTP(s) transfer. In\n"
-, stdout);
- fputs(
 "                             7.18.2 the alias response_code was added to  show\n"
 "                             the same info.\n"
 "\n"
-"              http_connect   The  numerical  code  that  was found in the last\n"
-"                             response  (from  a  proxy)  to  a  curl   CONNECT\n"
-"                             request. (Added in 7.12.4)\n"
+"              http_connect   The numerical code that was found in the last re-\n"
+, stdout);
+ fputs(
+"                             sponse (from a proxy) to a curl CONNECT  request.\n"
+"                             (Added in 7.12.4)\n"
 "\n"
 "              http_version   The  http  version  that  was  effectively  used.\n"
 "                             (Added in 7.50.0)\n"
 "\n"
-, stdout);
- fputs(
-"              local_ip       The IP address of  the  local  end  of  the  most\n"
-"                             recently  done connection - can be either IPv4 or\n"
+"              local_ip       The IP address of the local end of the  most  re-\n"
+"                             cently  done  connection  - can be either IPv4 or\n"
 "                             IPv6 (Added in 7.29.0)\n"
 "\n"
+, stdout);
+ fputs(
 "              local_port     The local port number of the most  recently  done\n"
 "                             connection (Added in 7.29.0)\n"
 "\n"
 "              num_connects   Number  of new connects made in the recent trans-\n"
 "                             fer. (Added in 7.12.3)\n"
 "\n"
-, stdout);
- fputs(
-"              num_redirects  Number of redirects that  were  followed  in  the\n"
-"                             request. (Added in 7.12.3)\n"
+"              num_redirects  Number of redirects that were followed in the re-\n"
+"                             quest. (Added in 7.12.3)\n"
 "\n"
 "              proxy_ssl_verify_result\n"
+, stdout);
+ fputs(
 "                             The result of the HTTPS proxy's SSL peer certifi-\n"
 "                             cate verification that was requested. 0 means the\n"
 "                             verification was successful. (Added in 7.52.0)\n"
 "\n"
 "              redirect_url   When an HTTP request was made without -L, --loca-\n"
-, stdout);
- fputs(
 "                             tion to follow redirects (or when --max-redir  is\n"
 "                             met),  this  variable  will show the actual URL a\n"
+, stdout);
+ fputs(
 "                             redirect would have gone to. (Added in 7.18.2)\n"
 "\n"
 "              remote_ip      The remote IP address of the most  recently  done\n"
 "                             connection - can be either IPv4 or IPv6 (Added in\n"
 "                             7.29.0)\n"
 "\n"
-, stdout);
- fputs(
 "              remote_port    The remote port number of the most recently  done\n"
 "                             connection (Added in 7.29.0)\n"
 "\n"
 "              scheme         The  URL  scheme (sometimes called protocol) that\n"
+, stdout);
+ fputs(
 "                             was effectively used (Added in 7.52.0)\n"
 "\n"
 "              size_download  The total amount of bytes that were downloaded.\n"
@@ -3793,91 +4027,102 @@ void hugehelp(void)
 "              size_header    The total amount of bytes of the downloaded head-\n"
 "                             ers.\n"
 "\n"
-, stdout);
- fputs(
 "              size_request   The  total  amount of bytes that were sent in the\n"
 "                             HTTP request.\n"
 "\n"
 "              size_upload    The total amount of bytes that were uploaded.\n"
 "\n"
+, stdout);
+ fputs(
 "              speed_download The average download speed that curl measured for\n"
 "                             the complete download. Bytes per second.\n"
 "\n"
 "              speed_upload   The  average  upload speed that curl measured for\n"
 "                             the complete upload. Bytes per second.\n"
 "\n"
-, stdout);
- fputs(
 "              ssl_verify_result\n"
 "                             The result of the SSL peer certificate  verifica-\n"
 "                             tion that was requested. 0 means the verification\n"
+, stdout);
+ fputs(
 "                             was successful. (Added in 7.19.0)\n"
 "\n"
-"              time_appconnect\n"
-"                             The time, in seconds,  it  took  from  the  start\n"
-"                             until  the  SSL/SSH/etc  connect/handshake to the\n"
+"              stderr         From this point on, the  -w,  --write-out  output\n"
+"                             will  be  written  to  standard  error. (Added in\n"
+"                             7.63.0)\n"
+"\n"
+"              stdout         From this point on, the  -w,  --write-out  output\n"
+"                             will  be written to standard output.  This is the\n"
+"                             default, but can be used  to  switch  back  after\n"
 , stdout);
  fputs(
-"                             remote host was completed. (Added in 7.19.0)\n"
+"                             switching to stderr.  (Added in 7.63.0)\n"
+"\n"
+"              time_appconnect\n"
+"                             The  time, in seconds, it took from the start un-\n"
+"                             til the SSL/SSH/etc connect/handshake to the  re-\n"
+"                             mote host was completed. (Added in 7.19.0)\n"
 "\n"
-"              time_connect   The time, in seconds,  it  took  from  the  start\n"
-"                             until  the  TCP  connect  to  the remote host (or\n"
-"                             proxy) was completed.\n"
+"              time_connect   The  time, in seconds, it took from the start un-\n"
+"                             til the TCP connect to the remote host (or proxy)\n"
+, stdout);
+ fputs(
+"                             was completed.\n"
 "\n"
 "              time_namelookup\n"
-"                             The time, in seconds,  it  took  from  the  start\n"
-"                             until the name resolving was completed.\n"
+"                             The  time, in seconds, it took from the start un-\n"
+"                             til the name resolving was completed.\n"
 "\n"
 "              time_pretransfer\n"
+"                             The time, in seconds, it took from the start  un-\n"
+"                             til  the  file  transfer was just about to begin.\n"
+"                             This includes all pre-transfer commands and nego-\n"
 , stdout);
  fputs(
-"                             The  time,  in  seconds,  it  took from the start\n"
-"                             until the file transfer was just about to  begin.\n"
-"                             This includes all pre-transfer commands and nego-\n"
 "                             tiations that are specific to the particular pro-\n"
 "                             tocol(s) involved.\n"
 "\n"
 "              time_redirect  The time, in seconds, it took for all redirection\n"
+"                             steps including name lookup, connect, pretransfer\n"
+"                             and transfer before  the  final  transaction  was\n"
+"                             started.  time_redirect shows the complete execu-\n"
 , stdout);
  fputs(
-"                             steps including name lookup, connect, pretransfer\n"
-"                             and  transfer  before  the  final transaction was\n"
-"                             started. time_redirect shows the complete  execu-\n"
-"                             tion  time  for  multiple redirections. (Added in\n"
+"                             tion time for multiple  redirections.  (Added  in\n"
 "                             7.12.3)\n"
 "\n"
 "              time_starttransfer\n"
-"                             The time, in seconds,  it  took  from  the  start\n"
+"                             The  time, in seconds, it took from the start un-\n"
+"                             til the first byte was just about  to  be  trans-\n"
+"                             ferred.  This  includes time_pretransfer and also\n"
+"                             the time the server needed to calculate  the  re-\n"
 , stdout);
  fputs(
-"                             until  the first byte was just about to be trans-\n"
-"                             ferred. This includes time_pretransfer  and  also\n"
-"                             the  time  the  server  needed  to  calculate the\n"
-"                             result.\n"
+"                             sult.\n"
 "\n"
-"              time_total     The total time, in seconds, that the full  opera-\n"
+"              time_total     The  total time, in seconds, that the full opera-\n"
 "                             tion lasted.\n"
 "\n"
 "              url_effective  The URL that was fetched last. This is most mean-\n"
-, stdout);
- fputs(
-"                             ingful if you've told curl  to  follow  location:\n"
+"                             ingful  if  you've  told curl to follow location:\n"
 "                             headers.\n"
 "\n"
 "              If this option is used several times, the last one will be used.\n"
 "\n"
 "       --xattr\n"
-"              When  saving  output  to a file, this option tells curl to store\n"
-"              certain file metadata in extended  file  attributes.  Currently,\n"
-"              the URL is stored in the xdg.origin.url attribute and, for HTTP,\n"
 , stdout);
  fputs(
-"              the content type is stored in the mime_type  attribute.  If  the\n"
-"              file  system  does not support extended attributes, a warning is\n"
+"              When saving output to a file, this option tells  curl  to  store\n"
+"              certain  file  metadata  in extended file attributes. Currently,\n"
+"              the URL is stored in the xdg.origin.url attribute and, for HTTP,\n"
+"              the  content  type  is stored in the mime_type attribute. If the\n"
+"              file system does not support extended attributes, a  warning  is\n"
 "              issued.\n"
 "\n"
 "FILES\n"
 "       ~/.curlrc\n"
+, stdout);
+ fputs(
 "              Default config file, see -K, --config for details.\n"
 "\n"
 "ENVIRONMENT\n"
@@ -3885,70 +4130,68 @@ void hugehelp(void)
 "       The lower case version has precedence. http_proxy is an exception as it\n"
 "       is only available in lower case.\n"
 "\n"
-, stdout);
- fputs(
-"       Using an environment variable to set the proxy has the same  effect  as\n"
+"       Using  an  environment variable to set the proxy has the same effect as\n"
 "       using the -x, --proxy option.\n"
 "\n"
 "       http_proxy [protocol://]<host>[:port]\n"
 "              Sets the proxy server to use for HTTP.\n"
-"       HTTPS_PROXY [protocol://]<host>[:port]\n"
+, stdout);
+ fputs(
+"       HTTPS_PROXY [protocol://]<host>[:port]\n"
 "              Sets the proxy server to use for HTTPS.\n"
 "\n"
 "       [url-protocol]_PROXY [protocol://]<host>[:port]\n"
-"              Sets  the proxy server to use for [url-protocol], where the pro-\n"
-, stdout);
- fputs(
-"              tocol is a protocol that curl supports and  as  specified  in  a\n"
+"              Sets the proxy server to use for [url-protocol], where the  pro-\n"
+"              tocol  is  a  protocol  that curl supports and as specified in a\n"
 "              URL. FTP, FTPS, POP3, IMAP, SMTP, LDAP etc.\n"
 "\n"
 "       ALL_PROXY [protocol://]<host>[:port]\n"
-"              Sets  the  proxy  server to use if no protocol-specific proxy is\n"
+"              Sets the proxy server to use if no  protocol-specific  proxy  is\n"
+, stdout);
+ fputs(
 "              set.\n"
 "\n"
 "       NO_PROXY <comma-separated list of hosts/domains>\n"
-"              list of host names that shouldn't go through any proxy.  If  set\n"
+"              list  of  host names that shouldn't go through any proxy. If set\n"
 "              to an asterisk '*' only, it matches all hosts. Each name in this\n"
-, stdout);
- fputs(
 "              list is matched as either a domain name which contains the host-\n"
 "              name, or the hostname itself.\n"
 "\n"
-"              This  environment  variable  disables use of the proxy even when\n"
-"              specified   with   the   -x,    --proxy    option.    That    is\n"
-"              NO_PROXY=direct.example.com   curl  -x  http://proxy.example.com\n"
-"              http://direct.example.com accesses the target URL directly,  and\n"
+"              This environment variable disables use of the  proxy  even  when\n"
 , stdout);
  fputs(
-"              NO_PROXY=direct.example.com   curl  -x  http://proxy.example.com\n"
+"              specified  with  the  -x,  --proxy  option. That is NO_PROXY=di-\n"
+"              rect.example.com  curl  -x  http://proxy.example.com  http://di-\n"
+"              rect.example.com   accesses   the   target   URL  directly,  and\n"
+"              NO_PROXY=direct.example.com  curl  -x   http://proxy.example.com\n"
 "              http://somewhere.example.com accesses the target URL through the\n"
 "              proxy.\n"
 "\n"
-"              The  list  of  host  names  can  also  be  include  numerical IP\n"
-"              addresses, and  IPv6  versions  should  then  be  given  without\n"
-"              enclosing brackets.\n"
-"\n"
-"PROXY PROTOCOL PREFIXES\n"
-"       Since  curl  version  7.21.7,  the proxy string may be specified with a\n"
+"              The list of host names can also  be  include  numerical  IP  ad-\n"
 , stdout);
  fputs(
+"              dresses,  and IPv6 versions should then be given without enclos-\n"
+"              ing brackets.\n"
+"\n"
+"PROXY PROTOCOL PREFIXES\n"
+"       Since curl version 7.21.7, the proxy string may  be  specified  with  a\n"
 "       protocol:// prefix to specify alternative proxy protocols.\n"
 "\n"
-"       If no protocol is specified in  the  proxy  string  or  if  the  string\n"
-"       doesn't  match  a  supported  one, the proxy will be treated as an HTTP\n"
+"       If  no  protocol  is  specified  in  the  proxy string or if the string\n"
+"       doesn't match a supported one, the proxy will be  treated  as  an  HTTP\n"
 "       proxy.\n"
 "\n"
+, stdout);
+ fputs(
 "       The supported proxy protocol prefixes are as follows:\n"
 "\n"
 "       http://\n"
-"              Makes it use it as an HTTP proxy. The default if no scheme  pre-\n"
+"              Makes  it use it as an HTTP proxy. The default if no scheme pre-\n"
 "              fix is used.\n"
 "\n"
 "       https://\n"
 "              Makes it treated as an HTTPS proxy.\n"
 "\n"
-, stdout);
- fputs(
 "       socks4://\n"
 "              Makes it the equivalent of --socks4\n"
 "\n"
@@ -3959,15 +4202,15 @@ void hugehelp(void)
 "              Makes it the equivalent of --socks5\n"
 "\n"
 "       socks5h://\n"
+, stdout);
+ fputs(
 "              Makes it the equivalent of --socks5-hostname\n"
 "\n"
 "EXIT CODES\n"
-"       There  are  a  bunch  of  different error codes and their corresponding\n"
-"       error messages that may appear during bad conditions. At  the  time  of\n"
-"       this writing, the exit codes are:\n"
+"       There are a bunch of different error codes and their corresponding  er-\n"
+"       ror messages that may appear during bad conditions. At the time of this\n"
+"       writing, the exit codes are:\n"
 "\n"
-, stdout);
- fputs(
 "       1      Unsupported protocol. This build of curl has no support for this\n"
 "              protocol.\n"
 "\n"
@@ -3975,106 +4218,106 @@ void hugehelp(void)
 "\n"
 "       3      URL malformed. The syntax was not correct.\n"
 "\n"
-"       4      A feature or option that  was  needed  to  perform  the  desired\n"
-"              request  was  not  enabled  or was explicitly disabled at build-\n"
-"              time. To make curl able to do this, you  probably  need  another\n"
-"              build of libcurl!\n"
-"\n"
 , stdout);
  fputs(
-"       5      Couldn't  resolve  proxy.  The  given  proxy  host  could not be\n"
-"              resolved.\n"
+"       4      A  feature  or option that was needed to perform the desired re-\n"
+"              quest was not enabled or was explicitly disabled at  build-time.\n"
+"              To make curl able to do this, you probably need another build of\n"
+"              libcurl!\n"
+"\n"
+"       5      Couldn't resolve proxy. The given proxy host could  not  be  re-\n"
+"              solved.\n"
 "\n"
 "       6      Couldn't resolve host. The given remote host was not resolved.\n"
 "\n"
 "       7      Failed to connect to host.\n"
 "\n"
-"       8      Weird server reply. The server sent data curl couldn't parse.\n"
-"\n"
-"       9      FTP access denied. The server denied login or denied  access  to\n"
-"              the  particular  resource or directory you wanted to reach. Most\n"
 , stdout);
  fputs(
-"              often you tried to change to a directory that doesn't  exist  on\n"
+"       8      Weird server reply. The server sent data curl couldn't parse.\n"
+"\n"
+"       9      FTP  access  denied. The server denied login or denied access to\n"
+"              the particular resource or directory you wanted to  reach.  Most\n"
+"              often  you  tried to change to a directory that doesn't exist on\n"
 "              the server.\n"
 "\n"
-"       10     FTP  accept failed. While waiting for the server to connect back\n"
-"              when an active FTP session is used, an error code was sent  over\n"
+"       10     FTP accept failed. While waiting for the server to connect  back\n"
+"              when  an active FTP session is used, an error code was sent over\n"
+, stdout);
+ fputs(
 "              the control connection or similar.\n"
 "\n"
-"       11     FTP  weird PASS reply. Curl couldn't parse the reply sent to the\n"
+"       11     FTP weird PASS reply. Curl couldn't parse the reply sent to  the\n"
 "              PASS request.\n"
 "\n"
-, stdout);
- fputs(
-"       12     During an active FTP session while waiting  for  the  server  to\n"
+"       12     During  an  active  FTP  session while waiting for the server to\n"
 "              connect back to curl, the timeout expired.\n"
 "\n"
-"       13     FTP  weird PASV reply, Curl couldn't parse the reply sent to the\n"
+"       13     FTP weird PASV reply, Curl couldn't parse the reply sent to  the\n"
 "              PASV request.\n"
 "\n"
-"       14     FTP weird 227 format.  Curl  couldn't  parse  the  227-line  the\n"
+"       14     FTP  weird  227  format.  Curl  couldn't  parse the 227-line the\n"
+, stdout);
+ fputs(
 "              server sent.\n"
 "\n"
-"       15     FTP  can't  get host. Couldn't resolve the host IP we got in the\n"
+"       15     FTP can't get host. Couldn't resolve the host IP we got  in  the\n"
 "              227-line.\n"
 "\n"
-, stdout);
- fputs(
 "       16     HTTP/2 error. A problem was detected in the HTTP2 framing layer.\n"
 "              This is somewhat generic and can be one out of several problems,\n"
 "              see the error message for details.\n"
 "\n"
-"       17     FTP couldn't set binary.  Couldn't  change  transfer  method  to\n"
-"              binary.\n"
+"       17     FTP  couldn't set binary. Couldn't change transfer method to bi-\n"
+"              nary.\n"
 "\n"
+, stdout);
+ fputs(
 "       18     Partial file. Only a part of the file was transferred.\n"
 "\n"
-"       19     FTP  couldn't download/access the given file, the RETR (or simi-\n"
+"       19     FTP couldn't download/access the given file, the RETR (or  simi-\n"
 "              lar) command failed.\n"
 "\n"
-, stdout);
- fputs(
 "       21     FTP quote error. A quote command returned error from the server.\n"
-"       22     HTTP page not retrieved. The requested  url  was  not  found  or\n"
-"              returned  another  error  with  the HTTP error code being 400 or\n"
+"       22     HTTP  page not retrieved. The requested url was not found or re-\n"
+"              turned another error with the  HTTP  error  code  being  400  or\n"
 "              above. This return code only appears if -f, --fail is used.\n"
 "\n"
-"       23     Write error. Curl couldn't write data to a local  filesystem  or\n"
-"              similar.\n"
-"\n"
-"       25     FTP  couldn't  STOR  file. The server denied the STOR operation,\n"
 , stdout);
  fputs(
+"       23     Write  error.  Curl couldn't write data to a local filesystem or\n"
+"              similar.\n"
+"\n"
+"       25     FTP couldn't STOR file. The server denied  the  STOR  operation,\n"
 "              used for FTP uploading.\n"
 "\n"
 "       26     Read error. Various reading problems.\n"
 "\n"
 "       27     Out of memory. A memory allocation request failed.\n"
 "\n"
-"       28     Operation timeout. The specified  time-out  period  was  reached\n"
-"              according to the conditions.\n"
-"\n"
-"       30     FTP  PORT  failed.  The PORT command failed. Not all FTP servers\n"
-"              support the PORT  command,  try  doing  a  transfer  using  PASV\n"
-"              instead!\n"
+"       28     Operation timeout. The specified time-out period was reached ac-\n"
+"              cording to the conditions.\n"
 "\n"
 , stdout);
  fputs(
-"       31     FTP  couldn't use REST. The REST command failed. This command is\n"
+"       30     FTP PORT failed. The PORT command failed. Not  all  FTP  servers\n"
+"              support  the  PORT  command, try doing a transfer using PASV in-\n"
+"              stead!\n"
+"\n"
+"       31     FTP couldn't use REST. The REST command failed. This command  is\n"
 "              used for resumed FTP transfers.\n"
 "\n"
 "       33     HTTP range error. The range \"command\" didn't work.\n"
 "\n"
 "       34     HTTP post error. Internal post-request generation error.\n"
 "\n"
+, stdout);
+ fputs(
 "       35     SSL connect error. The SSL handshaking failed.\n"
 "\n"
-"       36     Bad download resume. Couldn't continue an earlier aborted  down-\n"
+"       36     Bad  download resume. Couldn't continue an earlier aborted down-\n"
 "              load.\n"
 "\n"
-, stdout);
- fputs(
 "       37     FILE couldn't read file. Failed to open the file. Permissions?\n"
 "\n"
 "       38     LDAP cannot bind. LDAP bind operation failed.\n"
@@ -4084,29 +4327,29 @@ void hugehelp(void)
 "       41     Function not found. A required LDAP function was not found.\n"
 "\n"
 "       42     Aborted by callback. An application told curl to abort the oper-\n"
+, stdout);
+ fputs(
 "              ation.\n"
 "\n"
 "       43     Internal error. A function was called with a bad parameter.\n"
 "\n"
-, stdout);
- fputs(
-"       45     Interface error. A specified outgoing  interface  could  not  be\n"
+"       45     Interface  error.  A  specified  outgoing interface could not be\n"
 "              used.\n"
 "\n"
 "       47     Too many redirects. When following redirects, curl hit the maxi-\n"
 "              mum amount.\n"
 "\n"
-"       48     Unknown option specified to libcurl.  This  indicates  that  you\n"
-"              passed  a weird option to curl that was passed on to libcurl and\n"
+"       48     Unknown  option  specified  to  libcurl. This indicates that you\n"
+"              passed a weird option to curl that was passed on to libcurl  and\n"
+, stdout);
+ fputs(
 "              rejected. Read up in the manual!\n"
 "\n"
 "       49     Malformed telnet option.\n"
 "\n"
-, stdout);
- fputs(
 "       51     The peer's SSL certificate or SSH MD5 fingerprint was not OK.\n"
 "\n"
-"       52     The server didn't reply anything, which here  is  considered  an\n"
+"       52     The  server  didn't  reply anything, which here is considered an\n"
 "              error.\n"
 "\n"
 "       53     SSL crypto engine not found.\n"
@@ -4117,13 +4360,13 @@ void hugehelp(void)
 "\n"
 "       56     Failure in receiving network data.\n"
 "\n"
+, stdout);
+ fputs(
 "       58     Problem with the local certificate.\n"
 "\n"
 "       59     Couldn't use specified SSL cipher.\n"
 "\n"
-, stdout);
- fputs(
-"       60     Peer  certificate cannot be authenticated with known CA certifi-\n"
+"       60     Peer certificate cannot be authenticated with known CA  certifi-\n"
 "              cates.\n"
 "\n"
 "       61     Unrecognized transfer encoding.\n"
@@ -4138,11 +4381,11 @@ void hugehelp(void)
 "\n"
 "       66     Failed to initialise SSL Engine.\n"
 "\n"
-"       67     The user name, password, or similar was not  accepted  and  curl\n"
-"              failed to log in.\n"
-"\n"
 , stdout);
  fputs(
+"       67     The  user  name,  password, or similar was not accepted and curl\n"
+"              failed to log in.\n"
+"\n"
 "       68     File not found on TFTP server.\n"
 "\n"
 "       69     Permission problem on TFTP server.\n"
@@ -4159,31 +4402,31 @@ void hugehelp(void)
 "\n"
 "       75     Character conversion failed.\n"
 "\n"
+, stdout);
+ fputs(
 "       76     Character conversion functions required.\n"
 "\n"
 "       77     Problem with reading the SSL CA cert (path? access rights?).\n"
 "\n"
-, stdout);
- fputs(
 "       78     The resource referenced in the URL does not exist.\n"
 "\n"
 "       79     An unspecified error occurred during the SSH session.\n"
 "\n"
 "       80     Failed to shut down the SSL connection.\n"
 "\n"
-"       82     Could  not  load  CRL  file,  missing  or wrong format (added in\n"
+"       82     Could not load CRL file,  missing  or  wrong  format  (added  in\n"
 "              7.19.0).\n"
 "\n"
 "       83     Issuer check failed (added in 7.19.0).\n"
 "\n"
+, stdout);
+ fputs(
 "       84     The FTP PRET command failed\n"
 "\n"
 "       85     RTSP: mismatch of CSeq numbers\n"
 "\n"
 "       86     RTSP: mismatch of Session Identifiers\n"
 "\n"
-, stdout);
- fputs(
 "       87     unable to parse FTP file list\n"
 "\n"
 "       88     FTP chunk callback reported error\n"
@@ -4196,13 +4439,13 @@ void hugehelp(void)
 "\n"
 "       92     Stream error in HTTP/2 framing layer.\n"
 "\n"
+, stdout);
+ fputs(
 "       XX     More error codes will appear here in future releases. The exist-\n"
 "              ing ones are meant to never change.\n"
 "\n"
 "AUTHORS / CONTRIBUTORS\n"
-, stdout);
- fputs(
-"       Daniel  Stenberg is the main author, but the whole list of contributors\n"
+"       Daniel Stenberg is the main author, but the whole list of  contributors\n"
 "       is found in the separate THANKS file.\n"
 "\n"
 "WWW\n"
@@ -4211,1236 +4454,6 @@ void hugehelp(void)
 "SEE ALSO\n"
 "       ftp(1), wget(1)\n"
 "\n"
-"LATEST VERSION\n"
-"\n"
-"  You always find news about what's going on as well as the latest versions\n"
-"  from the curl web pages, located at:\n"
-"\n"
-"        https://curl.haxx.se\n"
-"\n"
-"SIMPLE USAGE\n"
-"\n"
-"  Get the main page from Netscape's web-server:\n"
-"\n"
-"        curl http://www.netscape.com/\n"
-"\n"
-, stdout);
- fputs(
-"  Get the README file the user's home directory at funet's ftp-server:\n"
-"\n"
-"        curl ftp://ftp.funet.fi/README\n"
-"\n"
-"  Get a web page from a server using port 8000:\n"
-"\n"
-"        curl http://www.weirdserver.com:8000/\n"
-"\n"
-"  Get a directory listing of an FTP site:\n"
-"\n"
-"        curl ftp://cool.haxx.se/\n"
-"\n"
-"  Get the definition of curl from a dictionary:\n"
-"\n"
-"        curl dict://dict.org/m:curl\n"
-"\n"
-"  Fetch two documents at once:\n"
-"\n"
-"        curl ftp://cool.haxx.se/ http://www.weirdserver.com:8000/\n"
-"\n"
-, stdout);
- fputs(
-"  Get a file off an FTPS server:\n"
-"\n"
-"        curl ftps://files.are.secure.com/secrets.txt\n"
-"\n"
-"  or use the more appropriate FTPS way to get the same file:\n"
-"\n"
-"        curl --ftp-ssl ftp://files.are.secure.com/secrets.txt\n"
-"\n"
-"  Get a file from an SSH server using SFTP:\n"
-"\n"
-"        curl -u username sftp://example.com/etc/issue\n"
-"\n"
-"  Get a file from an SSH server using SCP using a private key\n"
-"  (not password-protected) to authenticate:\n"
-"\n"
-"        curl -u username: --key ~/.ssh/id_rsa \\\n"
-, stdout);
- fputs(
-"             scp://example.com/~/file.txt\n"
-"\n"
-"  Get a file from an SSH server using SCP using a private key\n"
-"  (password-protected) to authenticate:\n"
-"\n"
-"        curl -u username: --key ~/.ssh/id_rsa --pass private_key_password \\\n"
-"             scp://example.com/~/file.txt\n"
-"\n"
-"  Get the main page from an IPv6 web server:\n"
-"\n"
-"        curl \"http://[2001:1890:1112:1::20]/\"\n"
-"\n"
-"  Get a file from an SMB server:\n"
-"\n"
-"        curl -u \"domain\\username:passwd\" smb://server.example.com/share/file.txt\n"
-"\n"
-"DOWNLOAD TO A FILE\n"
-"\n"
-, stdout);
- fputs(
-"  Get a web page and store in a local file with a specific name:\n"
-"\n"
-"        curl -o thatpage.html http://www.netscape.com/\n"
-"\n"
-"  Get a web page and store in a local file, make the local file get the name\n"
-"  of the remote document (if no file name part is specified in the URL, this\n"
-"  will fail):\n"
-"\n"
-"        curl -O http://www.netscape.com/index.html\n"
-"\n"
-"  Fetch two files and store them with their remote names:\n"
-"\n"
-"        curl -O www.haxx.se/index.html -O curl.haxx.se/download.html\n"
-"\n"
-"USING PASSWORDS\n"
-"\n"
-" FTP\n"
-"\n"
-, stdout);
- fputs(
-"   To ftp files using name+passwd, include them in the URL like:\n"
-"\n"
-"        curl ftp://name:passwd@machine.domain:port/full/path/to/file\n"
-"\n"
-"   or specify them with the -u flag like\n"
-"\n"
-"        curl -u name:passwd ftp://machine.domain:port/full/path/to/file\n"
-"\n"
-" FTPS\n"
-"\n"
-"   It is just like for FTP, but you may also want to specify and use\n"
-"   SSL-specific options for certificates etc.\n"
-"\n"
-"   Note that using FTPS:// as prefix is the \"implicit\" way as described in the\n"
-, stdout);
- fputs(
-"   standards while the recommended \"explicit\" way is done by using FTP:// and\n"
-"   the --ftp-ssl option.\n"
-"\n"
-" SFTP / SCP\n"
-"\n"
-"   This is similar to FTP, but you can use the --key option to specify a\n"
-"   private key to use instead of a password. Note that the private key may\n"
-"   itself be protected by a password that is unrelated to the login password\n"
-"   of the remote system; this password is specified using the --pass option.\n"
-"   Typically, curl will automatically extract the public key from the private\n"
-, stdout);
- fputs(
-"   key file, but in cases where curl does not have the proper library support,\n"
-"   a matching public key file must be specified using the --pubkey option.\n"
-"\n"
-" HTTP\n"
-"\n"
-"   Curl also supports user and password in HTTP URLs, thus you can pick a file\n"
-"   like:\n"
-"\n"
-"        curl http://name:passwd@machine.domain/full/path/to/file\n"
-"\n"
-"   or specify user and password separately like in\n"
-"\n"
-"        curl -u name:passwd http://machine.domain/full/path/to/file\n"
-"\n"
-, stdout);
- fputs(
-"   HTTP offers many different methods of authentication and curl supports\n"
-"   several: Basic, Digest, NTLM and Negotiate (SPNEGO). Without telling which\n"
-"   method to use, curl defaults to Basic. You can also ask curl to pick the\n"
-"   most secure ones out of the ones that the server accepts for the given URL,\n"
-"   by using --anyauth.\n"
-"\n"
-"   NOTE! According to the URL specification, HTTP URLs can not contain a user\n"
-"   and password, so that style will not work when using curl via a proxy, even\n"
-, stdout);
- fputs(
-"   though curl allows it at other times. When using a proxy, you _must_ use\n"
-"   the -u style for user and password.\n"
-"\n"
-" HTTPS\n"
-"\n"
-"   Probably most commonly used with private certificates, as explained below.\n"
-"\n"
-"PROXY\n"
-"\n"
-" curl supports both HTTP and SOCKS proxy servers, with optional authentication.\n"
-" It does not have special support for FTP proxy servers since there are no\n"
-" standards for those, but it can still be made to work with many of them. You\n"
-, stdout);
- fputs(
-" can also use both HTTP and SOCKS proxies to transfer files to and from FTP\n"
-" servers.\n"
-"\n"
-" Get an ftp file using an HTTP proxy named my-proxy that uses port 888:\n"
-"\n"
-"        curl -x my-proxy:888 ftp://ftp.leachsite.com/README\n"
-"\n"
-" Get a file from an HTTP server that requires user and password, using the\n"
-" same proxy as above:\n"
-"\n"
-"        curl -u user:passwd -x my-proxy:888 http://www.get.this/\n"
-"\n"
-" Some proxies require special authentication. Specify by using -U as above:\n"
-"\n"
-, stdout);
- fputs(
-"        curl -U user:passwd -x my-proxy:888 http://www.get.this/\n"
-"\n"
-" A comma-separated list of hosts and domains which do not use the proxy can\n"
-" be specified as:\n"
-"\n"
-"        curl --noproxy localhost,get.this -x my-proxy:888 http://www.get.this/\n"
-"\n"
-" If the proxy is specified with --proxy1.0 instead of --proxy or -x, then\n"
-" curl will use HTTP/1.0 instead of HTTP/1.1 for any CONNECT attempts.\n"
-"\n"
-" curl also supports SOCKS4 and SOCKS5 proxies with --socks4 and --socks5.\n"
-"\n"
-, stdout);
- fputs(
-" See also the environment variables Curl supports that offer further proxy\n"
-" control.\n"
-"\n"
-" Most FTP proxy servers are set up to appear as a normal FTP server from the\n"
-" client's perspective, with special commands to select the remote FTP server.\n"
-" curl supports the -u, -Q and --ftp-account options that can be used to\n"
-" set up transfers through many FTP proxies. For example, a file can be\n"
-" uploaded to a remote FTP server using a Blue Coat FTP proxy with the\n"
-" options:\n"
-"\n"
-, stdout);
- fputs(
-"   curl -u \"Remote-FTP-Username@remote.ftp.server Proxy-Username:Remote-Pass\" \\\n"
-"        --ftp-account Proxy-Password --upload-file local-file \\\n"
-"        ftp://my-ftp.proxy.server:21/remote/upload/path/\n"
-"\n"
-" See the manual for your FTP proxy to determine the form it expects to set up\n"
-" transfers, and curl's -v option to see exactly what curl is sending.\n"
-"\n"
-"RANGES\n"
-"\n"
-"  HTTP 1.1 introduced byte-ranges. Using this, a client can request\n"
-, stdout);
- fputs(
-"  to get only one or more subparts of a specified document. Curl supports\n"
-"  this with the -r flag.\n"
-"\n"
-"  Get the first 100 bytes of a document:\n"
-"\n"
-"        curl -r 0-99 http://www.get.this/\n"
-"\n"
-"  Get the last 500 bytes of a document:\n"
-"\n"
-"        curl -r -500 http://www.get.this/\n"
-"\n"
-"  Curl also supports simple ranges for FTP files as well. Then you can only\n"
-"  specify start and stop position.\n"
-"\n"
-"  Get the first 100 bytes of a document using FTP:\n"
-"\n"
-"        curl -r 0-99 ftp://www.get.this/README\n"
-"\n"
-"UPLOADING\n"
-"\n"
-, stdout);
- fputs(
-" FTP / FTPS / SFTP / SCP\n"
-"\n"
-"  Upload all data on stdin to a specified server:\n"
-"\n"
-"        curl -T - ftp://ftp.upload.com/myfile\n"
-"\n"
-"  Upload data from a specified file, login with user and password:\n"
-"\n"
-"        curl -T uploadfile -u user:passwd ftp://ftp.upload.com/myfile\n"
-"\n"
-"  Upload a local file to the remote site, and use the local file name at the remote\n"
-"  site too:\n"
-"\n"
-"        curl -T uploadfile -u user:passwd ftp://ftp.upload.com/\n"
-"\n"
-"  Upload a local file to get appended to the remote file:\n"
-"\n"
-, stdout);
- fputs(
-"        curl -T localfile -a ftp://ftp.upload.com/remotefile\n"
-"\n"
-"  Curl also supports ftp upload through a proxy, but only if the proxy is\n"
-"  configured to allow that kind of tunneling. If it does, you can run curl in\n"
-"  a fashion similar to:\n"
-"\n"
-"        curl --proxytunnel -x proxy:port -T localfile ftp.upload.com\n"
-"\n"
-"SMB / SMBS\n"
-"\n"
-"        curl -T file.txt -u \"domain\\username:passwd\" \\\n"
-"             smb://server.example.com/share/\n"
-"\n"
-" HTTP\n"
-"\n"
-"  Upload all data on stdin to a specified HTTP site:\n"
-"\n"
-, stdout);
- fputs(
-"        curl -T - http://www.upload.com/myfile\n"
-"\n"
-"  Note that the HTTP server must have been configured to accept PUT before\n"
-"  this can be done successfully.\n"
-"\n"
-"  For other ways to do HTTP data upload, see the POST section below.\n"
-"\n"
-"VERBOSE / DEBUG\n"
-"\n"
-"  If curl fails where it isn't supposed to, if the servers don't let you in,\n"
-"  if you can't understand the responses: use the -v flag to get verbose\n"
-"  fetching. Curl will output lots of info and what it sends and receives in\n"
-, stdout);
- fputs(
-"  order to let the user see all client-server interaction (but it won't show\n"
-"  you the actual data).\n"
-"\n"
-"        curl -v ftp://ftp.upload.com/\n"
-"\n"
-"  To get even more details and information on what curl does, try using the\n"
-"  --trace or --trace-ascii options with a given file name to log to, like\n"
-"  this:\n"
-"\n"
-"        curl --trace trace.txt www.haxx.se\n"
-"\n"
-"\n"
-"DETAILED INFORMATION\n"
-"\n"
-"  Different protocols provide different ways of getting detailed information\n"
-, stdout);
- fputs(
-"  about specific files/documents. To get curl to show detailed information\n"
-"  about a single file, you should use -I/--head option. It displays all\n"
-"  available info on a single file for HTTP and FTP. The HTTP information is a\n"
-"  lot more extensive.\n"
-"\n"
-"  For HTTP, you can get the header information (the same as -I would show)\n"
-"  shown before the data by using -i/--include. Curl understands the\n"
-"  -D/--dump-header option when getting files from both FTP and HTTP, and it\n"
-, stdout);
- fputs(
-"  will then store the headers in the specified file.\n"
-"\n"
-"  Store the HTTP headers in a separate file (headers.txt in the example):\n"
-"\n"
-"        curl --dump-header headers.txt curl.haxx.se\n"
-"\n"
-"  Note that headers stored in a separate file can be very useful at a later\n"
-"  time if you want curl to use cookies sent by the server. More about that in\n"
-"  the cookies section.\n"
-"\n"
-"POST (HTTP)\n"
-"\n"
-"  It's easy to post data using curl. This is done using the -d <data>\n"
-"  option.  The post data must be urlencoded.\n"
-"\n"
-, stdout);
- fputs(
-"  Post a simple \"name\" and \"phone\" guestbook.\n"
-"\n"
-"        curl -d \"name=Rafael%20Sagula&phone=3320780\" \\\n"
-"             http://www.where.com/guest.cgi\n"
-"\n"
-"  How to post a form with curl, lesson #1:\n"
-"\n"
-"  Dig out all the <input> tags in the form that you want to fill in.\n"
-"\n"
-"  If there's a \"normal\" post, you use -d to post. -d takes a full \"post\n"
-"  string\", which is in the format\n"
-"\n"
-"        <variable1>=<data1>&<variable2>=<data2>&...\n"
-"\n"
-, stdout);
- fputs(
-"  The 'variable' names are the names set with \"name=\" in the <input> tags, and\n"
-"  the data is the contents you want to fill in for the inputs. The data *must*\n"
-"  be properly URL encoded. That means you replace space with + and that you\n"
-"  replace weird letters with %XX where XX is the hexadecimal representation of\n"
-"  the letter's ASCII code.\n"
-"\n"
-"  Example:\n"
-"\n"
-"  (page located at http://www.formpost.com/getthis/\n"
-"\n"
-"        <form action=\"post.cgi\" method=\"post\">\n"
-"        <input name=user size=10>\n"
-, stdout);
- fputs(
-"        <input name=pass type=password size=10>\n"
-"        <input name=id type=hidden value=\"blablabla\">\n"
-"        <input name=ding value=\"submit\">\n"
-"        </form>\n"
-"\n"
-"  We want to enter user 'foobar' with password '12345'.\n"
-"\n"
-"  To post to this, you enter a curl command line like:\n"
-"\n"
-"        curl -d \"user=foobar&pass=12345&id=blablabla&ding=submit\" \\\n"
-"             http://www.formpost.com/getthis/post.cgi\n"
-"\n"
-"\n"
-"  While -d uses the application/x-www-form-urlencoded mime-type, generally\n"
-, stdout);
- fputs(
-"  understood by CGI's and similar, curl also supports the more capable\n"
-"  multipart/form-data type. This latter type supports things like file upload.\n"
-"\n"
-"  -F accepts parameters like -F \"name=contents\". If you want the contents to\n"
-"  be read from a file, use <@filename> as contents. When specifying a file,\n"
-"  you can also specify the file content type by appending ';type=<mime type>'\n"
-"  to the file name. You can also post the contents of several files in one\n"
-, stdout);
- fputs(
-"  field.  For example, the field name 'coolfiles' is used to send three files,\n"
-"  with different content types using the following syntax:\n"
-"\n"
-"        curl -F \"coolfiles=@fil1.gif;type=image/gif,fil2.txt,fil3.html\" \\\n"
-"             http://www.post.com/postit.cgi\n"
-"\n"
-"  If the content-type is not specified, curl will try to guess from the file\n"
-"  extension (it only knows a few), or use the previously specified type (from\n"
-"  an earlier file if several files are specified in a list) or else it will\n"
-, stdout);
- fputs(
-"  use the default type 'application/octet-stream'.\n"
-"\n"
-"  Emulate a fill-in form with -F. Let's say you fill in three fields in a\n"
-"  form. One field is a file name which to post, one field is your name and one\n"
-"  field is a file description. We want to post the file we have written named\n"
-"  \"cooltext.txt\". To let curl do the posting of this data instead of your\n"
-"  favourite browser, you have to read the HTML source of the form page and\n"
-, stdout);
- fputs(
-"  find the names of the input fields. In our example, the input field names\n"
-"  are 'file', 'yourname' and 'filedescription'.\n"
-"\n"
-"        curl -F \"file=@cooltext.txt\" -F \"yourname=Daniel\" \\\n"
-"             -F \"filedescription=Cool text file with cool text inside\" \\\n"
-"             http://www.post.com/postit.cgi\n"
-"\n"
-"  To send two files in one post you can do it in two ways:\n"
-"\n"
-"  1. Send multiple files in a single \"field\" with a single field name:\n"
-"\n"
-"        curl -F \"pictures=@dog.gif,cat.gif\"\n"
-"\n"
-, stdout);
- fputs(
-"  2. Send two fields with two field names:\n"
-"\n"
-"        curl -F \"docpicture=@dog.gif\" -F \"catpicture=@cat.gif\"\n"
-"\n"
-"  To send a field value literally without interpreting a leading '@'\n"
-"  or '<', or an embedded ';type=', use --form-string instead of\n"
-"  -F. This is recommended when the value is obtained from a user or\n"
-"  some other unpredictable source. Under these circumstances, using\n"
-"  -F instead of --form-string would allow a user to trick curl into\n"
-"  uploading a file.\n"
-"\n"
-"REFERRER\n"
-"\n"
-, stdout);
- fputs(
-"  An HTTP request has the option to include information about which address\n"
-"  referred it to the actual page.  Curl allows you to specify the\n"
-"  referrer to be used on the command line. It is especially useful to\n"
-"  fool or trick stupid servers or CGI scripts that rely on that information\n"
-"  being available or contain certain data.\n"
-"\n"
-"        curl -e www.coolsite.com http://www.showme.com/\n"
-"\n"
-"  NOTE: The Referer: [sic] field is defined in the HTTP spec to be a full URL.\n"
-"\n"
-"USER AGENT\n"
-"\n"
-, stdout);
- fputs(
-"  An HTTP request has the option to include information about the browser\n"
-"  that generated the request. Curl allows it to be specified on the command\n"
-"  line. It is especially useful to fool or trick stupid servers or CGI\n"
-"  scripts that only accept certain browsers.\n"
-"\n"
-"  Example:\n"
-"\n"
-"  curl -A 'Mozilla/3.0 (Win95; I)' http://www.nationsbank.com/\n"
-"\n"
-"  Other common strings:\n"
-"    'Mozilla/3.0 (Win95; I)'     Netscape Version 3 for Windows 95\n"
-, stdout);
- fputs(
-"    'Mozilla/3.04 (Win95; U)'    Netscape Version 3 for Windows 95\n"
-"    'Mozilla/2.02 (OS/2; U)'     Netscape Version 2 for OS/2\n"
-"    'Mozilla/4.04 [en] (X11; U; AIX 4.2; Nav)'           NS for AIX\n"
-"    'Mozilla/4.05 [en] (X11; U; Linux 2.0.32 i586)'      NS for Linux\n"
-"\n"
-"  Note that Internet Explorer tries hard to be compatible in every way:\n"
-"    'Mozilla/4.0 (compatible; MSIE 4.01; Windows 95)'    MSIE for W95\n"
-"\n"
-"  Mozilla is not the only possible User-Agent name:\n"
-, stdout);
- fputs(
-"    'Konqueror/1.0'             KDE File Manager desktop client\n"
-"    'Lynx/2.7.1 libwww-FM/2.14' Lynx command line browser\n"
-"\n"
-"COOKIES\n"
-"\n"
-"  Cookies are generally used by web servers to keep state information at the\n"
-"  client's side. The server sets cookies by sending a response line in the\n"
-"  headers that looks like 'Set-Cookie: <data>' where the data part then\n"
-"  typically contains a set of NAME=VALUE pairs (separated by semicolons ';'\n"
-, stdout);
- fputs(
-"  like \"NAME1=VALUE1; NAME2=VALUE2;\"). The server can also specify for what\n"
-"  path the \"cookie\" should be used for (by specifying \"path=value\"), when the\n"
-"  cookie should expire (\"expire=DATE\"), for what domain to use it\n"
-"  (\"domain=NAME\") and if it should be used on secure connections only\n"
-"  (\"secure\").\n"
-"\n"
-"  If you've received a page from a server that contains a header like:\n"
-"        Set-Cookie: sessionid=boo123; path=\"/foo\";\n"
-"\n"
-, stdout);
- fputs(
-"  it means the server wants that first pair passed on when we get anything in\n"
-"  a path beginning with \"/foo\".\n"
-"\n"
-"  Example, get a page that wants my name passed in a cookie:\n"
-"\n"
-"        curl -b \"name=Daniel\" www.sillypage.com\n"
-"\n"
-"  Curl also has the ability to use previously received cookies in following\n"
-"  sessions. If you get cookies from a server and store them in a file in a\n"
-"  manner similar to:\n"
-"\n"
-"        curl --dump-header headers www.example.com\n"
-"\n"
-, stdout);
- fputs(
-"  ... you can then in a second connect to that (or another) site, use the\n"
-"  cookies from the 'headers' file like:\n"
-"\n"
-"        curl -b headers www.example.com\n"
-"\n"
-"  While saving headers to a file is a working way to store cookies, it is\n"
-"  however error-prone and not the preferred way to do this. Instead, make curl\n"
-"  save the incoming cookies using the well-known netscape cookie format like\n"
-"  this:\n"
-"\n"
-"        curl -c cookies.txt www.example.com\n"
-"\n"
-, stdout);
- fputs(
-"  Note that by specifying -b you enable the \"cookie awareness\" and with -L\n"
-"  you can make curl follow a location: (which often is used in combination\n"
-"  with cookies). So that if a site sends cookies and a location, you can\n"
-"  use a non-existing file to trigger the cookie awareness like:\n"
-"\n"
-"        curl -L -b empty.txt www.example.com\n"
-"\n"
-"  The file to read cookies from must be formatted using plain HTTP headers OR\n"
-"  as netscape's cookie file. Curl will determine what kind it is based on the\n"
-, stdout);
- fputs(
-"  file contents.  In the above command, curl will parse the header and store\n"
-"  the cookies received from www.example.com.  curl will send to the server the\n"
-"  stored cookies which match the request as it follows the location.  The\n"
-"  file \"empty.txt\" may be a nonexistent file.\n"
-"\n"
-"  To read and write cookies from a netscape cookie file, you can set both -b\n"
-"  and -c to use the same file:\n"
-"\n"
-"        curl -b cookies.txt -c cookies.txt www.example.com\n"
-"\n"
-"PROGRESS METER\n"
-"\n"
-, stdout);
- fputs(
-"  The progress meter exists to show a user that something actually is\n"
-"  happening. The different fields in the output have the following meaning:\n"
-"\n"
-"  % Total    % Received % Xferd  Average Speed          Time             Curr.\n"
-"                                 Dload  Upload Total    Current  Left    Speed\n"
-"  0  151M    0 38608    0     0   9406      0  4:41:43  0:00:04  4:41:39  9287\n"
-"\n"
-"  From left-to-right:\n"
-"   %             - percentage completed of the whole transfer\n"
-, stdout);
- fputs(
-"   Total         - total size of the whole expected transfer\n"
-"   %             - percentage completed of the download\n"
-"   Received      - currently downloaded amount of bytes\n"
-"   %             - percentage completed of the upload\n"
-"   Xferd         - currently uploaded amount of bytes\n"
-"   Average Speed\n"
-"   Dload         - the average transfer speed of the download\n"
-"   Average Speed\n"
-"   Upload        - the average transfer speed of the upload\n"
-"   Time Total    - expected time to complete the operation\n"
-, stdout);
- fputs(
-"   Time Current  - time passed since the invoke\n"
-"   Time Left     - expected time left to completion\n"
-"   Curr.Speed    - the average transfer speed the last 5 seconds (the first\n"
-"                   5 seconds of a transfer is based on less time of course.)\n"
-"\n"
-"  The -# option will display a totally different progress bar that doesn't\n"
-"  need much explanation!\n"
-"\n"
-"SPEED LIMIT\n"
-"\n"
-"  Curl allows the user to set the transfer speed conditions that must be met\n"
-, stdout);
- fputs(
-"  to let the transfer keep going. By using the switch -y and -Y you\n"
-"  can make curl abort transfers if the transfer speed is below the specified\n"
-"  lowest limit for a specified time.\n"
-"\n"
-"  To have curl abort the download if the speed is slower than 3000 bytes per\n"
-"  second for 1 minute, run:\n"
-"\n"
-"        curl -Y 3000 -y 60 www.far-away-site.com\n"
-"\n"
-"  This can very well be used in combination with the overall time limit, so\n"
-"  that the above operation must be completed in whole within 30 minutes:\n"
-"\n"
-, stdout);
- fputs(
-"        curl -m 1800 -Y 3000 -y 60 www.far-away-site.com\n"
-"\n"
-"  Forcing curl not to transfer data faster than a given rate is also possible,\n"
-"  which might be useful if you're using a limited bandwidth connection and you\n"
-"  don't want your transfer to use all of it (sometimes referred to as\n"
-"  \"bandwidth throttle\").\n"
-"\n"
-"  Make curl transfer data no faster than 10 kilobytes per second:\n"
-"\n"
-"        curl --limit-rate 10K www.far-away-site.com\n"
-"\n"
-"    or\n"
-"\n"
-"        curl --limit-rate 10240 www.far-away-site.com\n"
-"\n"
-, stdout);
- fputs(
-"  Or prevent curl from uploading data faster than 1 megabyte per second:\n"
-"\n"
-"        curl -T upload --limit-rate 1M ftp://uploadshereplease.com\n"
-"\n"
-"  When using the --limit-rate option, the transfer rate is regulated on a\n"
-"  per-second basis, which will cause the total transfer speed to become lower\n"
-"  than the given number. Sometimes of course substantially lower, if your\n"
-"  transfer stalls during periods.\n"
-"\n"
-"CONFIG FILE\n"
-"\n"
-"  Curl automatically tries to read the .curlrc file (or _curlrc file on win32\n"
-, stdout);
- fputs(
-"  systems) from the user's home dir on startup.\n"
-"\n"
-"  The config file could be made up with normal command line switches, but you\n"
-"  can also specify the long options without the dashes to make it more\n"
-"  readable. You can separate the options and the parameter with spaces, or\n"
-"  with = or :. Comments can be used within the file. If the first letter on a\n"
-"  line is a '#'-symbol the rest of the line is treated as a comment.\n"
-"\n"
-"  If you want the parameter to contain spaces, you must enclose the entire\n"
-, stdout);
- fputs(
-"  parameter within double quotes (\"). Within those quotes, you specify a\n"
-"  quote as \\\".\n"
-"\n"
-"  NOTE: You must specify options and their arguments on the same line.\n"
-"\n"
-"  Example, set default time out and proxy in a config file:\n"
-"\n"
-"        # We want a 30 minute timeout:\n"
-"        -m 1800\n"
-"        # ... and we use a proxy for all accesses:\n"
-"        proxy = proxy.our.domain.com:8080\n"
-"\n"
-"  White spaces ARE significant at the end of lines, but all white spaces\n"
-, stdout);
- fputs(
-"  leading up to the first characters of each line are ignored.\n"
-"\n"
-"  Prevent curl from reading the default file by using -q as the first command\n"
-"  line parameter, like:\n"
-"\n"
-"        curl -q www.thatsite.com\n"
-"\n"
-"  Force curl to get and display a local help page in case it is invoked\n"
-"  without URL by making a config file similar to:\n"
-"\n"
-"        # default url to get\n"
-"        url = \"http://help.with.curl.com/curlhelp.html\"\n"
-"\n"
-"  You can specify another config file to be read by using the -K/--config\n"
-, stdout);
- fputs(
-"  flag. If you set config file name to \"-\" it'll read the config from stdin,\n"
-"  which can be handy if you want to hide options from being visible in process\n"
-"  tables etc:\n"
-"\n"
-"        echo \"user = user:passwd\" | curl -K - http://that.secret.site.com\n"
-"\n"
-"EXTRA HEADERS\n"
-"\n"
-"  When using curl in your own very special programs, you may end up needing\n"
-"  to pass on your own custom headers when getting a web page. You can do\n"
-"  this by using the -H flag.\n"
-"\n"
-, stdout);
- fputs(
-"  Example, send the header \"X-you-and-me: yes\" to the server when getting a\n"
-"  page:\n"
-"\n"
-"        curl -H \"X-you-and-me: yes\" www.love.com\n"
-"\n"
-"  This can also be useful in case you want curl to send a different text in a\n"
-"  header than it normally does. The -H header you specify then replaces the\n"
-"  header curl would normally send. If you replace an internal header with an\n"
-"  empty one, you prevent that header from being sent. To prevent the Host:\n"
-"  header from being used:\n"
-"\n"
-, stdout);
- fputs(
-"        curl -H \"Host:\" www.server.com\n"
-"\n"
-"FTP and PATH NAMES\n"
-"\n"
-"  Do note that when getting files with the ftp:// URL, the given path is\n"
-"  relative the directory you enter. To get the file 'README' from your home\n"
-"  directory at your ftp site, do:\n"
-"\n"
-"        curl ftp://user:passwd@my.site.com/README\n"
-"\n"
-"  But if you want the README file from the root directory of that very same\n"
-"  site, you need to specify the absolute file name:\n"
-"\n"
-"        curl ftp://user:passwd@my.site.com//README\n"
-"\n"
-, stdout);
- fputs(
-"  (I.e with an extra slash in front of the file name.)\n"
-"\n"
-"SFTP and SCP and PATH NAMES\n"
-"\n"
-"  With sftp: and scp: URLs, the path name given is the absolute name on the\n"
-"  server. To access a file relative to the remote user's home directory,\n"
-"  prefix the file with /~/ , such as:\n"
-"\n"
-"        curl -u $USER sftp://home.example.com/~/.bashrc\n"
-"\n"
-"FTP and firewalls\n"
-"\n"
-"  The FTP protocol requires one of the involved parties to open a second\n"
-, stdout);
- fputs(
-"  connection as soon as data is about to get transferred. There are two ways to\n"
-"  do this.\n"
-"\n"
-"  The default way for curl is to issue the PASV command which causes the\n"
-"  server to open another port and await another connection performed by the\n"
-"  client. This is good if the client is behind a firewall that doesn't allow\n"
-"  incoming connections.\n"
-"\n"
-"        curl ftp.download.com\n"
-"\n"
-"  If the server, for example, is behind a firewall that doesn't allow connections\n"
-, stdout);
- fputs(
-"  on ports other than 21 (or if it just doesn't support the PASV command), the\n"
-"  other way to do it is to use the PORT command and instruct the server to\n"
-"  connect to the client on the given IP number and port (as parameters to the\n"
-"  PORT command).\n"
-"\n"
-"  The -P flag to curl supports a few different options. Your machine may have\n"
-"  several IP-addresses and/or network interfaces and curl allows you to select\n"
-"  which of them to use. Default address can also be used:\n"
-"\n"
-, stdout);
- fputs(
-"        curl -P - ftp.download.com\n"
-"\n"
-"  Download with PORT but use the IP address of our 'le0' interface (this does\n"
-"  not work on windows):\n"
-"\n"
-"        curl -P le0 ftp.download.com\n"
-"\n"
-"  Download with PORT but use 192.168.0.10 as our IP address to use:\n"
-"\n"
-"        curl -P 192.168.0.10 ftp.download.com\n"
-"\n"
-"NETWORK INTERFACE\n"
-"\n"
-"  Get a web page from a server using a specified port for the interface:\n"
-"\n"
-"        curl --interface eth0:1 http://www.netscape.com/\n"
-"\n"
-"  or\n"
-"\n"
-, stdout);
- fputs(
-"        curl --interface 192.168.1.10 http://www.netscape.com/\n"
-"\n"
-"HTTPS\n"
-"\n"
-"  Secure HTTP requires SSL libraries to be installed and used when curl is\n"
-"  built. If that is done, curl is capable of retrieving and posting documents\n"
-"  using the HTTPS protocol.\n"
-"\n"
-"  Example:\n"
-"\n"
-"        curl https://www.secure-site.com\n"
-"\n"
-"  Curl is also capable of using your personal certificates to get/post files\n"
-"  from sites that require valid certificates. The only drawback is that the\n"
-, stdout);
- fputs(
-"  certificate needs to be in PEM-format. PEM is a standard and open format to\n"
-"  store certificates with, but it is not used by the most commonly used\n"
-"  browsers (Netscape and MSIE both use the so called PKCS#12 format). If you\n"
-"  want curl to use the certificates you use with your (favourite) browser, you\n"
-"  may need to download/compile a converter that can convert your browser's\n"
-"  formatted certificates to PEM formatted ones. This kind of converter is\n"
-, stdout);
- fputs(
-"  included in recent versions of OpenSSL, and for older versions Dr Stephen\n"
-"  N. Henson has written a patch for SSLeay that adds this functionality. You\n"
-"  can get his patch (that requires an SSLeay installation) from his site at:\n"
-"  https://web.archive.org/web/20170715155512/www.drh-consultancy.demon.co.uk/\n"
-"\n"
-"  Example on how to automatically retrieve a document using a certificate with\n"
-"  a personal password:\n"
-"\n"
-"        curl -E /path/to/cert.pem:password https://secure.site.com/\n"
-"\n"
-, stdout);
- fputs(
-"  If you neglect to specify the password on the command line, you will be\n"
-"  prompted for the correct password before any data can be received.\n"
-"\n"
-"  Many older SSL-servers have problems with SSLv3 or TLS, which newer versions\n"
-"  of OpenSSL etc use, therefore it is sometimes useful to specify what\n"
-"  SSL-version curl should use. Use -3, -2 or -1 to specify that exact SSL\n"
-"  version to use (for SSLv3, SSLv2 or TLSv1 respectively):\n"
-"\n"
-"        curl -2 https://secure.site.com/\n"
-"\n"
-, stdout);
- fputs(
-"  Otherwise, curl will first attempt to use v3 and then v2.\n"
-"\n"
-"  To use OpenSSL to convert your favourite browser's certificate into a PEM\n"
-"  formatted one that curl can use, do something like this:\n"
-"\n"
-"    In Netscape, you start with hitting the 'Security' menu button.\n"
-"\n"
-"    Select 'certificates->yours' and then pick a certificate in the list\n"
-"\n"
-"    Press the 'Export' button\n"
-"\n"
-"    enter your PIN code for the certs\n"
-"\n"
-"    select a proper place to save it\n"
-"\n"
-, stdout);
- fputs(
-"    Run the 'openssl' application to convert the certificate. If you cd to the\n"
-"    openssl installation, you can do it like:\n"
-"\n"
-"     # ./apps/openssl pkcs12 -in [file you saved] -clcerts -out [PEMfile]\n"
-"\n"
-"    In Firefox, select Options, then Advanced, then the Encryption tab,\n"
-"    View Certificates. This opens the Certificate Manager, where you can\n"
-"    Export. Be sure to select PEM for the Save as type.\n"
-"\n"
-"    In Internet Explorer, select Internet Options, then the Content tab, then\n"
-, stdout);
- fputs(
-"    Certificates. Then you can Export, and depending on the format you may\n"
-"    need to convert to PEM.\n"
-"\n"
-"    In Chrome, select Settings, then Show Advanced Settings. Under HTTPS/SSL\n"
-"    select Manage Certificates.\n"
-"\n"
-"RESUMING FILE TRANSFERS\n"
-"\n"
-" To continue a file transfer where it was previously aborted, curl supports\n"
-" resume on HTTP(S) downloads as well as FTP uploads and downloads.\n"
-"\n"
-" Continue downloading a document:\n"
-"\n"
-"        curl -C - -o file ftp://ftp.server.com/path/file\n"
-"\n"
-, stdout);
- fputs(
-" Continue uploading a document(*1):\n"
-"\n"
-"        curl -C - -T file ftp://ftp.server.com/path/file\n"
-"\n"
-" Continue downloading a document from a web server(*2):\n"
-"\n"
-"        curl -C - -o file http://www.server.com/\n"
-"\n"
-" (*1) = This requires that the FTP server supports the non-standard command\n"
-"        SIZE. If it doesn't, curl will say so.\n"
-"\n"
-" (*2) = This requires that the web server supports at least HTTP/1.1. If it\n"
-"        doesn't, curl will say so.\n"
-"\n"
-"TIME CONDITIONS\n"
-"\n"
-, stdout);
- fputs(
-" HTTP allows a client to specify a time condition for the document it\n"
-" requests. It is If-Modified-Since or If-Unmodified-Since. Curl allows you to\n"
-" specify them with the -z/--time-cond flag.\n"
-"\n"
-" For example, you can easily make a download that only gets performed if the\n"
-" remote file is newer than a local copy. It would be made like:\n"
-"\n"
-"        curl -z local.html http://remote.server.com/remote.html\n"
-"\n"
-" Or you can download a file only if the local file is newer than the remote\n"
-, stdout);
- fputs(
-" one. Do this by prepending the date string with a '-', as in:\n"
-"\n"
-"        curl -z -local.html http://remote.server.com/remote.html\n"
-"\n"
-" You can specify a \"free text\" date as condition. Tell curl to only download\n"
-" the file if it was updated since January 12, 2012:\n"
-"\n"
-"        curl -z \"Jan 12 2012\" http://remote.server.com/remote.html\n"
-"\n"
-" Curl will then accept a wide range of date formats. You always make the date\n"
-" check the other way around by prepending it with a dash '-'.\n"
-"\n"
-"DICT\n"
-"\n"
-"  For fun try\n"
-"\n"
-, stdout);
- fputs(
-"        curl dict://dict.org/m:curl\n"
-"        curl dict://dict.org/d:heisenbug:jargon\n"
-"        curl dict://dict.org/d:daniel:web1913\n"
-"\n"
-"  Aliases for 'm' are 'match' and 'find', and aliases for 'd' are 'define'\n"
-"  and 'lookup'. For example,\n"
-"\n"
-"        curl dict://dict.org/find:curl\n"
-"\n"
-"  Commands that break the URL description of the RFC (but not the DICT\n"
-"  protocol) are\n"
-"\n"
-"        curl dict://dict.org/show:db\n"
-"        curl dict://dict.org/show:strat\n"
-"\n"
-, stdout);
- fputs(
-"  Authentication is still missing (but this is not required by the RFC)\n"
-"\n"
-"LDAP\n"
-"\n"
-"  If you have installed the OpenLDAP library, curl can take advantage of it\n"
-"  and offer ldap:// support.\n"
-"  On Windows, curl will use WinLDAP from Platform SDK by default.\n"
-"\n"
-"  Default protocol version used by curl is LDAPv3. LDAPv2 will be used as\n"
-"  fallback mechanism in case if LDAPv3 will fail to connect.\n"
-"\n"
-"  LDAP is a complex thing and writing an LDAP query is not an easy task. I do\n"
-, stdout);
- fputs(
-"  advise you to dig up the syntax description for that elsewhere. One such\n"
-"  place might be:\n"
-"\n"
-"  RFC 2255, \"The LDAP URL Format\" https://curl.haxx.se/rfc/rfc2255.txt\n"
-"\n"
-"  To show you an example, this is how I can get all people from my local LDAP\n"
-"  server that has a certain sub-domain in their email address:\n"
-"\n"
-"        curl -B \"ldap://ldap.frontec.se/o=frontec??sub?mail=*sth.frontec.se\"\n"
-"\n"
-"  If I want the same info in HTML format, I can get it by not using the -B\n"
-"  (enforce ASCII) flag.\n"
-"\n"
-, stdout);
- fputs(
-"  You also can use authentication when accessing LDAP catalog:\n"
-"\n"
-"      curl -u user:passwd \"ldap://ldap.frontec.se/o=frontec??sub?mail=*\"\n"
-"      curl \"ldap://user:passwd@ldap.frontec.se/o=frontec??sub?mail=*\"\n"
-"\n"
-"  By default, if user and password provided, OpenLDAP/WinLDAP will use basic\n"
-"  authentication. On Windows you can control this behavior by providing\n"
-"  one of --basic, --ntlm or --digest option in curl command line\n"
-"\n"
-"      curl --ntlm \"ldap://user:passwd@ldap.frontec.se/o=frontec??sub?mail=*\"\n"
-, stdout);
- fputs(
-"\n"
-"  On Windows, if no user/password specified, auto-negotiation mechanism will\n"
-"  be used with current logon credentials (SSPI/SPNEGO).\n"
-"\n"
-"ENVIRONMENT VARIABLES\n"
-"\n"
-"  Curl reads and understands the following environment variables:\n"
-"\n"
-"        http_proxy, HTTPS_PROXY, FTP_PROXY\n"
-"\n"
-"  They should be set for protocol-specific proxies. General proxy should be\n"
-"  set with\n"
-"\n"
-"        ALL_PROXY\n"
-"\n"
-"  A comma-separated list of host names that shouldn't go through any proxy is\n"
-, stdout);
- fputs(
-"  set in (only an asterisk, '*' matches all hosts)\n"
-"\n"
-"        NO_PROXY\n"
-"\n"
-"  If the host name matches one of these strings, or the host is within the\n"
-"  domain of one of these strings, transactions with that node will not be\n"
-"  proxied. When a domain is used, it needs to start with a period. A user can\n"
-"  specify that both www.example.com and foo.example.com should not use a\n"
-"  proxy by setting NO_PROXY to \".example.com\". By including the full name you\n"
-, stdout);
- fputs(
-"  can exclude specific host names, so to make www.example.com not use a proxy\n"
-"  but still have foo.example.com do it, set NO_PROXY to \"www.example.com\"\n"
-"\n"
-"  The usage of the -x/--proxy flag overrides the environment variables.\n"
-"\n"
-"NETRC\n"
-"\n"
-"  Unix introduced the .netrc concept a long time ago. It is a way for a user\n"
-"  to specify name and password for commonly visited FTP sites in a file so\n"
-"  that you don't have to type them in each time you visit those sites. You\n"
-, stdout);
- fputs(
-"  realize this is a big security risk if someone else gets hold of your\n"
-"  passwords, so therefore most unix programs won't read this file unless it is\n"
-"  only readable by yourself (curl doesn't care though).\n"
-"\n"
-"  Curl supports .netrc files if told to (using the -n/--netrc and\n"
-"  --netrc-optional options). This is not restricted to just FTP,\n"
-"  so curl can use it for all protocols where authentication is used.\n"
-"\n"
-"  A very simple .netrc file could look something like:\n"
-"\n"
-, stdout);
- fputs(
-"        machine curl.haxx.se login iamdaniel password mysecret\n"
-"\n"
-"CUSTOM OUTPUT\n"
-"\n"
-"  To better allow script programmers to get to know about the progress of\n"
-"  curl, the -w/--write-out option was introduced. Using this, you can specify\n"
-"  what information from the previous transfer you want to extract.\n"
-"\n"
-"  To display the amount of bytes downloaded together with some text and an\n"
-"  ending newline:\n"
-"\n"
-"        curl -w 'We downloaded %{size_download} bytes\\n' www.download.com\n"
-"\n"
-"KERBEROS FTP TRANSFER\n"
-"\n"
-, stdout);
- fputs(
-"  Curl supports kerberos4 and kerberos5/GSSAPI for FTP transfers. You need\n"
-"  the kerberos package installed and used at curl build time for it to be\n"
-"  available.\n"
-"\n"
-"  First, get the krb-ticket the normal way, like with the kinit/kauth tool.\n"
-"  Then use curl in way similar to:\n"
-"\n"
-"        curl --krb private ftp://krb4site.com -u username:fakepwd\n"
-"\n"
-"  There's no use for a password on the -u switch, but a blank one will make\n"
-"  curl ask for one and you already entered the real password to kinit/kauth.\n"
-"\n"
-, stdout);
- fputs(
-"TELNET\n"
-"\n"
-"  The curl telnet support is basic and very easy to use. Curl passes all data\n"
-"  passed to it on stdin to the remote server. Connect to a remote telnet\n"
-"  server using a command line similar to:\n"
-"\n"
-"        curl telnet://remote.server.com\n"
-"\n"
-"  And enter the data to pass to the server on stdin. The result will be sent\n"
-"  to stdout or to the file you specify with -o.\n"
-"\n"
-"  You might want the -N/--no-buffer option to switch off the buffered output\n"
-"  for slow connections or similar.\n"
-"\n"
-, stdout);
- fputs(
-"  Pass options to the telnet protocol negotiation, by using the -t option. To\n"
-"  tell the server we use a vt100 terminal, try something like:\n"
-"\n"
-"        curl -tTTYPE=vt100 telnet://remote.server.com\n"
-"\n"
-"  Other interesting options for it -t include:\n"
-"\n"
-"   - XDISPLOC=<X display> Sets the X display location.\n"
-"\n"
-"   - NEW_ENV=<var,val> Sets an environment variable.\n"
-"\n"
-"  NOTE: The telnet protocol does not specify any way to login with a specified\n"
-, stdout);
- fputs(
-"  user and password so curl can't do that automatically. To do that, you need\n"
-"  to track when the login prompt is received and send the username and\n"
-"  password accordingly.\n"
-"\n"
-"PERSISTENT CONNECTIONS\n"
-"\n"
-"  Specifying multiple files on a single command line will make curl transfer\n"
-"  all of them, one after the other in the specified order.\n"
-"\n"
-"  libcurl will attempt to use persistent connections for the transfers so that\n"
-"  the second transfer to the same host can use the same connection that was\n"
-, stdout);
- fputs(
-"  already initiated and was left open in the previous transfer. This greatly\n"
-"  decreases connection time for all but the first transfer and it makes a far\n"
-"  better use of the network.\n"
-"\n"
-"  Note that curl cannot use persistent connections for transfers that are used\n"
-"  in subsequence curl invokes. Try to stuff as many URLs as possible on the\n"
-"  same command line if they are using the same host, as that'll make the\n"
-"  transfers faster. If you use an HTTP proxy for file transfers, practically\n"
-, stdout);
- fputs(
-"  all transfers will be persistent.\n"
-"\n"
-"MULTIPLE TRANSFERS WITH A SINGLE COMMAND LINE\n"
-"\n"
-"  As is mentioned above, you can download multiple files with one command line\n"
-"  by simply adding more URLs. If you want those to get saved to a local file\n"
-"  instead of just printed to stdout, you need to add one save option for each\n"
-"  URL you specify. Note that this also goes for the -O option (but not\n"
-"  --remote-name-all).\n"
-"\n"
-"  For example: get two files and use -O for the first and a custom file\n"
-, stdout);
- fputs(
-"  name for the second:\n"
-"\n"
-"    curl -O http://url.com/file.txt ftp://ftp.com/moo.exe -o moo.jpg\n"
-"\n"
-"  You can also upload multiple files in a similar fashion:\n"
-"\n"
-"    curl -T local1 ftp://ftp.com/moo.exe -T local2 ftp://ftp.com/moo2.txt\n"
-"\n"
-"IPv6\n"
-"\n"
-"  curl will connect to a server with IPv6 when a host lookup returns an IPv6\n"
-"  address and fall back to IPv4 if the connection fails. The --ipv4 and --ipv6\n"
-"  options can specify which address to use when both are available. IPv6\n"
-, stdout);
- fputs(
-"  addresses can also be specified directly in URLs using the syntax:\n"
-"\n"
-"    http://[2001:1890:1112:1::20]/overview.html\n"
-"\n"
-"  When this style is used, the -g option must be given to stop curl from\n"
-"  interpreting the square brackets as special globbing characters.  Link local\n"
-"  and site local addresses including a scope identifier, such as fe80::1234%1,\n"
-"  may also be used, but the scope portion must be numeric or match an existing\n"
-, stdout);
- fputs(
-"  network interface on Linux and the percent character must be URL escaped. The\n"
-"  previous example in an SFTP URL might look like:\n"
-"\n"
-"    sftp://[fe80::1234%251]/\n"
-"\n"
-"  IPv6 addresses provided other than in URLs (e.g. to the --proxy, --interface\n"
-"  or --ftp-port options) should not be URL encoded.\n"
-"\n"
-"METALINK\n"
-"\n"
-"  Curl supports Metalink (both version 3 and 4 (RFC 5854) are supported), a way\n"
-"  to list multiple URIs and hashes for a file. Curl will make use of the mirrors\n"
-, stdout);
- fputs(
-"  listed within for failover if there are errors (such as the file or server not\n"
-"  being available). It will also verify the hash of the file after the download\n"
-"  completes. The Metalink file itself is downloaded and processed in memory and\n"
-"  not stored in the local file system.\n"
-"\n"
-"  Example to use a remote Metalink file:\n"
-"\n"
-"    curl --metalink http://www.example.com/example.metalink\n"
-"\n"
-"  To use a Metalink file in the local file system, use FILE protocol (file://):\n"
-"\n"
-, stdout);
- fputs(
-"    curl --metalink file://example.metalink\n"
-"\n"
-"  Please note that if FILE protocol is disabled, there is no way to use a local\n"
-"  Metalink file at the time of this writing. Also note that if --metalink and\n"
-"  --include are used together, --include will be ignored. This is because including\n"
-"  headers in the response will break Metalink parser and if the headers are included\n"
-"  in the file described in Metalink file, hash check will fail.\n"
-"\n"
-"MAILING LISTS\n"
-"\n"
-, stdout);
- fputs(
-"  For your convenience, we have several open mailing lists to discuss curl,\n"
-"  its development and things relevant to this. Get all info at\n"
-"  https://curl.haxx.se/mail/. Some of the lists available are:\n"
-"\n"
-"  curl-users\n"
-"\n"
-"    Users of the command line tool. How to use it, what doesn't work, new\n"
-"    features, related tools, questions, news, installations, compilations,\n"
-"    running, porting etc.\n"
-"\n"
-"  curl-library\n"
-"\n"
-"    Developers using or developing libcurl. Bugs, extensions, improvements.\n"
-"\n"
-, stdout);
- fputs(
-"  curl-announce\n"
-"\n"
-"    Low-traffic. Only receives announcements of new public versions. At worst,\n"
-"    that makes something like one or two mails per month, but usually only one\n"
-"    mail every second month.\n"
-"\n"
-"  curl-and-php\n"
-"\n"
-"    Using the curl functions in PHP. Everything curl with a PHP angle. Or PHP\n"
-"    with a curl angle.\n"
-"\n"
-"  curl-and-python\n"
-"\n"
-"    Python hackers using curl with or without the python binding pycurl.\n"
-"\n"
-"  Please direct curl questions, feature requests and trouble reports to one of\n"
-, stdout);
- fputs(
-"  these mailing lists instead of mailing any individual.\n"
 , stdout) ;
 }
 #else /* !USE_MANUAL */
@@ -5458,4984 +4471,4033 @@ void hugehelp(void) {}
 #include "memdebug.h" /* keep this as LAST include */
 static const unsigned char hugehelpgz[] = {
   /* This mumbo-jumbo is the huge help text compressed with gzip.
-     Thanks to this operation, the size of this data shrank from 202949
-     to 59691 bytes. You can disable the use of compressed help
+     Thanks to this operation, the size of this data shrank from 172264
+     to 48278 bytes. You can disable the use of compressed help
      texts by NOT passing -c to the mkhelp.pl tool. */
-  0x1f, 0x8b, 0x08, 0x01, 0x00, 0x00, 0x00, 0x00, 0x02, 0x03, 0xec, 0xfd,
-  0x6b, 0x7b, 0xdc, 0x46, 0x92, 0x26, 0x0c, 0x7f, 0xe7, 0xaf, 0x40, 0x57,
-  0xbf, 0x3d, 0x24, 0xbb, 0xab, 0x8a, 0x07, 0x1d, 0x6c, 0xd1, 0x92, 0xc7,
-  0x34, 0x45, 0x59, 0x1c, 0x53, 0x22, 0x97, 0x45, 0xd9, 0xee, 0xb5, 0x7d,
-  0xe9, 0x42, 0x55, 0x81, 0x24, 0x5a, 0x55, 0x40, 0x35, 0x80, 0x12, 0xc5,
-  0x9e, 0x9d, 0xfd, 0xed, 0x4f, 0xc6, 0x1d, 0x11, 0x99, 0x09, 0x64, 0x56,
-  0x91, 0x76, 0xdb, 0x3d, 0xfb, 0x3e, 0xfb, 0xcc, 0x6e, 0x5b, 0x12, 0x09,
-  0x24, 0xf2, 0x18, 0x19, 0x87, 0x3b, 0xee, 0x48, 0x92, 0xfb, 0xfe, 0xef,
-  0x3d, 0xfe, 0xf7, 0xde, 0xfc, 0x9f, 0xf9, 0x73, 0x23, 0x49, 0xce, 0xab,
-  0xf2, 0x6f, 0xd9, 0xa4, 0x89, 0x3f, 0xfb, 0xfe, 0xfd, 0xff, 0x4a, 0xf8,
-  0xff, 0x99, 0x77, 0x7e, 0x32, 0x7f, 0x6e, 0xac, 0x6d, 0x7b, 0x27, 0x71,
-  0x2f, 0xfc, 0xaf, 0xf7, 0xdb, 0xc9, 0x7d, 0x2f, 0xfc, 0xaf, 0x64, 0x0b,
-  0x2f, 0xbc, 0x97, 0x2f, 0x3c, 0xa7, 0xbf, 0xbf, 0x7f, 0xbf, 0xfe, 0x23,
-  0x3f, 0x51, 0xaf, 0xe8, 0x3f, 0x3b, 0xf4, 0xde, 0x4f, 0xef, 0xe9, 0xaf,
-  0xe6, 0x27, 0x1b, 0x1b, 0x6f, 0x0f, 0xdf, 0x1c, 0xeb, 0xab, 0x93, 0x65,
-  0x35, 0x4b, 0x06, 0x49, 0x53, 0xa5, 0x45, 0x7d, 0x95, 0x55, 0x49, 0x9a,
-  0xbc, 0xbb, 0x38, 0xdd, 0xd8, 0x18, 0xfd, 0xf5, 0xed, 0xd9, 0xf9, 0xe8,
-  0x64, 0xd4, 0x7a, 0xec, 0xc7, 0x72, 0xd1, 0xe4, 0x65, 0x51, 0x9b, 0xee,
-  0x9b, 0x87, 0xea, 0x9f, 0x37, 0x36, 0x5e, 0x1e, 0x8f, 0x8e, 0x2e, 0x4e,
-  0xce, 0x2f, 0x4f, 0xce, 0xde, 0xb6, 0x9e, 0x4c, 0xf2, 0x3a, 0x31, 0x4d,
-  0x35, 0x65, 0x39, 0x33, 0xff, 0x71, 0xad, 0x4f, 0xd3, 0x26, 0x4d, 0xae,
-  0xaa, 0x72, 0x9e, 0x94, 0x15, 0xfd, 0x22, 0x4d, 0xea, 0xac, 0xfa, 0x98,
-  0x55, 0xfd, 0x64, 0x59, 0xe7, 0xc5, 0x75, 0x52, 0x16, 0x59, 0x52, 0x5e,
-  0x25, 0xcd, 0x4d, 0xa6, 0xcd, 0xd5, 0xcb, 0xc5, 0xa2, 0xac, 0x9a, 0x6c,
-  0x9a, 0x2c, 0xaa, 0xb2, 0x29, 0x27, 0xe5, 0xac, 0x4e, 0xb6, 0x5e, 0x9e,
-  0x1c, 0x5d, 0xf6, 0x93, 0x57, 0x27, 0xa7, 0xc7, 0xe6, 0xbf, 0x97, 0xe7,
-  0xf8, 0xcf, 0xa8, 0x9f, 0x7c, 0x73, 0x76, 0xfe, 0xfa, 0xf8, 0xa2, 0x9f,
-  0xbc, 0xbe, 0xa4, 0x9f, 0xd1, 0x7f, 0xcd, 0x0f, 0x93, 0x93, 0x37, 0x87,
-  0xe7, 0x7d, 0x6d, 0x8e, 0xfe, 0x41, 0x3f, 0x3c, 0x7d, 0x69, 0x7e, 0xc8,
-  0x7f, 0xd0, 0x3f, 0xcf, 0xcf, 0xce, 0x1f, 0xc9, 0x1f, 0xf4, 0xcf, 0x8b,
-  0xcb, 0x37, 0xe6, 0xb7, 0x17, 0x97, 0x23, 0xf3, 0xdf, 0xd1, 0x11, 0xfd,
-  0x07, 0x5f, 0x19, 0xbd, 0xf9, 0x1a, 0xff, 0x19, 0xd9, 0xe6, 0x46, 0x6f,
-  0xf8, 0xe7, 0xf8, 0xd2, 0xe5, 0xf1, 0xe9, 0xdb, 0xe3, 0xcb, 0x24, 0x2d,
-  0xa6, 0xc9, 0xa5, 0x79, 0x7e, 0x7b, 0x98, 0x5c, 0xde, 0x64, 0xc9, 0xa4,
-  0x9c, 0xcf, 0xe9, 0x47, 0x66, 0x46, 0xa6, 0x59, 0x9d, 0x5f, 0x17, 0x66,
-  0x28, 0x66, 0xe4, 0xb7, 0x65, 0xf5, 0x21, 0x49, 0x6e, 0xf3, 0xe6, 0xa6,
-  0x5c, 0x36, 0xda, 0xdc, 0xd2, 0xcc, 0x46, 0x92, 0x17, 0x4d, 0x56, 0xa5,
-  0x13, 0x9a, 0xe9, 0xe1, 0x46, 0x6b, 0x56, 0xcb, 0x2b, 0x33, 0x87, 0xb5,
-  0x99, 0xb4, 0xf1, 0xb2, 0x9e, 0x95, 0xe9, 0x94, 0xa6, 0xca, 0xbc, 0x72,
-  0xb5, 0x34, 0x93, 0x5c, 0xe5, 0x93, 0x0f, 0x75, 0x32, 0xcb, 0x3f, 0x64,
-  0x34, 0x51, 0x9f, 0xee, 0x74, 0xe2, 0xfa, 0xdc, 0x68, 0xba, 0x34, 0x73,
-  0x5a, 0x0c, 0xb4, 0xb9, 0x26, 0x9f, 0xa4, 0xf4, 0x01, 0xcc, 0x5c, 0xb2,
-  0x5c, 0x50, 0x6b, 0x3c, 0x63, 0xc9, 0xa2, 0xac, 0xcd, 0x4b, 0xa3, 0xd1,
-  0xa9, 0xe9, 0x79, 0x51, 0x64, 0xe8, 0x47, 0xdd, 0x37, 0xff, 0x28, 0x3f,
-  0xe4, 0x99, 0xf9, 0xcb, 0x55, 0x3e, 0xcb, 0x12, 0x5e, 0x51, 0xdb, 0x1c,
-  0x2d, 0x6d, 0x52, 0x65, 0xf5, 0x72, 0x9e, 0x99, 0xd9, 0x7b, 0x93, 0x35,
-  0xe9, 0x2c, 0x2f, 0x3e, 0x98, 0xbf, 0xd2, 0xc0, 0xe7, 0x65, 0x95, 0x0d,
-  0x93, 0xc3, 0x3a, 0xb9, 0x2b, 0x97, 0x66, 0xc0, 0xb3, 0x99, 0x59, 0xf3,
-  0x2c, 0x19, 0x67, 0xb3, 0xf2, 0xb6, 0x4f, 0x2b, 0x9d, 0x14, 0xcb, 0xf9,
-  0xd8, 0x34, 0x50, 0x5e, 0xb9, 0xe6, 0xd2, 0x66, 0x69, 0x9a, 0xe3, 0xa7,
-  0xe7, 0xa9, 0x19, 0x93, 0x79, 0xb7, 0x4a, 0x6e, 0x32, 0x33, 0xe6, 0x7a,
-  0x91, 0x17, 0x7f, 0x68, 0xcf, 0x8b, 0x99, 0xda, 0x45, 0x79, 0x9b, 0x55,
-  0x66, 0x66, 0xc7, 0x77, 0x89, 0x99, 0x84, 0x31, 0x6f, 0xc2, 0x2b, 0xb3,
-  0xc9, 0x92, 0xd4, 0x34, 0x61, 0x37, 0xe0, 0xa0, 0xca, 0x66, 0x29, 0x6d,
-  0x26, 0xfb, 0x8d, 0xa1, 0x59, 0xc4, 0xcc, 0xee, 0x36, 0x79, 0x75, 0xeb,
-  0xd1, 0x36, 0x5e, 0x9e, 0x9a, 0x91, 0xe4, 0xb3, 0xda, 0x2c, 0x03, 0x1d,
-  0x0a, 0x79, 0x86, 0x16, 0x95, 0xf6, 0xbf, 0xd9, 0x9b, 0x77, 0x45, 0x93,
-  0x7e, 0xc2, 0xe7, 0x65, 0x6f, 0x0e, 0xa6, 0xd9, 0x22, 0x2b, 0xa6, 0x59,
-  0xd1, 0x0c, 0x93, 0xbf, 0x96, 0xcb, 0x4d, 0xf3, 0xed, 0xab, 0xdc, 0xcc,
-  0x41, 0x2a, 0x4d, 0x99, 0x2f, 0x9b, 0x4d, 0x30, 0xa9, 0xf2, 0x85, 0xb7,
-  0x14, 0x65, 0x61, 0xd6, 0x3c, 0xb9, 0x78, 0x75, 0x94, 0x3c, 0x7a, 0xf6,
-  0xf9, 0x53, 0xb7, 0xe6, 0xa6, 0x81, 0x64, 0x92, 0x16, 0x66, 0xc4, 0xd9,
-  0x24, 0xbf, 0xba, 0x4b, 0xe6, 0xcb, 0x59, 0x93, 0x2f, 0xcc, 0xec, 0xd3,
-  0xe1, 0xa3, 0x03, 0xb4, 0x48, 0xab, 0xa6, 0xa6, 0x4d, 0x80, 0x1f, 0x60,
-  0xec, 0xb7, 0x55, 0xde, 0xd0, 0x41, 0xc2, 0xef, 0x4c, 0x0f, 0xb3, 0xa6,
-  0xd6, 0xe6, 0x68, 0xaf, 0x99, 0xef, 0x8c, 0xcd, 0xde, 0x32, 0x53, 0x9b,
-  0xd6, 0xe6, 0xa3, 0x07, 0x1b, 0x4e, 0x82, 0xdc, 0x34, 0xcd, 0xe2, 0x60,
-  0x67, 0xa7, 0xce, 0x9b, 0x6c, 0xf8, 0x9f, 0xe6, 0x1c, 0xf6, 0x9b, 0xdb,
-  0xb2, 0xdf, 0xdc, 0x54, 0x59, 0xf6, 0x5f, 0x43, 0xb3, 0x87, 0xed, 0x93,
-  0xe6, 0xbb, 0x77, 0xd2, 0xb1, 0xeb, 0xac, 0x31, 0x5f, 0xf8, 0xfb, 0x32,
-  0x2b, 0xa8, 0x45, 0xd3, 0x8f, 0x74, 0xb6, 0xb8, 0x49, 0xcd, 0x72, 0x66,
-  0x66, 0x37, 0xd2, 0xc9, 0x36, 0x1b, 0x86, 0x7a, 0xc5, 0x67, 0xfb, 0xc7,
-  0x9f, 0xc3, 0x8f, 0x5e, 0xe1, 0x9b, 0xe6, 0xbf, 0xc3, 0xec, 0x53, 0x3a,
-  0x37, 0x63, 0xa3, 0x4f, 0xed, 0xd0, 0x16, 0xfb, 0x71, 0x6f, 0xb0, 0xb7,
-  0xbb, 0xfb, 0xf3, 0xb0, 0xf9, 0xd4, 0x3c, 0xec, 0xf9, 0xdd, 0x5d, 0xf7,
-  0x06, 0x3d, 0xba, 0x45, 0xe3, 0x4d, 0x66, 0x66, 0xcb, 0xd0, 0xc7, 0xff,
-  0x91, 0x55, 0x65, 0xbd, 0xfd, 0xb0, 0x96, 0xd2, 0xc1, 0x3f, 0xda, 0xdf,
-  0x7d, 0x9b, 0xd5, 0xd8, 0x33, 0x6e, 0xac, 0x49, 0x5a, 0x99, 0x7d, 0x5b,
-  0x36, 0x4e, 0x3c, 0xf5, 0xcd, 0xa1, 0x6c, 0xec, 0xcc, 0x98, 0x33, 0x67,
-  0x9e, 0x36, 0x82, 0x2d, 0x9d, 0x91, 0x4c, 0xab, 0x93, 0x22, 0xfb, 0x64,
-  0x4f, 0xb9, 0x39, 0xfd, 0x59, 0x3a, 0xb9, 0x49, 0x4a, 0xb3, 0xf9, 0xab,
-  0xc8, 0x12, 0xf8, 0x1d, 0x4a, 0xab, 0xc9, 0x4d, 0xfe, 0xd1, 0xcc, 0xc6,
-  0xb3, 0x67, 0x4f, 0x07, 0xe6, 0x3f, 0xcf, 0x7e, 0xde, 0xf9, 0x58, 0xce,
-  0xcc, 0xe4, 0x3c, 0xfe, 0x79, 0x87, 0x96, 0xf8, 0x3f, 0xd3, 0xfe, 0xb8,
-  0x3f, 0xf9, 0xaf, 0xe1, 0x4d, 0x33, 0x9f, 0xad, 0xdc, 0x38, 0x69, 0x61,
-  0xfe, 0x37, 0x2f, 0x97, 0x45, 0x63, 0x37, 0x8b, 0xd9, 0x73, 0x8d, 0x27,
-  0x9c, 0xcc, 0x71, 0x35, 0x67, 0x94, 0xb6, 0x36, 0xed, 0x21, 0x3a, 0x75,
-  0xe6, 0x80, 0xba, 0xe3, 0xd8, 0x4c, 0x6e, 0x68, 0xfc, 0x66, 0xf7, 0xa4,
-  0x32, 0x09, 0x4d, 0x9e, 0xd2, 0xc9, 0x34, 0x02, 0x82, 0x04, 0x16, 0xda,
-  0xe2, 0xaf, 0xe5, 0xe6, 0xc1, 0xb2, 0x9a, 0x66, 0xd5, 0xb0, 0xdb, 0x0d,
-  0x7b, 0x64, 0xbd, 0x6f, 0x26, 0x7a, 0xa3, 0xd0, 0x0f, 0xd0, 0xb1, 0x79,
-  0xfe, 0xc9, 0xb4, 0x00, 0x81, 0x59, 0xa0, 0xe3, 0xdc, 0x5a, 0x42, 0x3d,
-  0xc6, 0x67, 0xf4, 0x7d, 0x77, 0x64, 0x4d, 0xd7, 0x5b, 0x43, 0xc7, 0x47,
-  0xdd, 0xe0, 0x13, 0xb3, 0x78, 0x0b, 0xf3, 0xd6, 0x92, 0xe4, 0x2a, 0x8e,
-  0x35, 0x35, 0x63, 0x04, 0xc2, 0xb5, 0x59, 0x17, 0xb3, 0x16, 0xb4, 0x8b,
-  0x69, 0xa9, 0xee, 0x92, 0xb7, 0x66, 0xc3, 0xb0, 0x30, 0xf2, 0x36, 0xfb,
-  0x2c, 0x6b, 0x9a, 0x7b, 0x97, 0xc9, 0xed, 0xd8, 0x83, 0xbd, 0x60, 0xd3,
-  0xae, 0x7a, 0xde, 0xec, 0xb3, 0x83, 0xfd, 0xf6, 0xc3, 0xdf, 0x1b, 0x21,
-  0xed, 0x8e, 0x8b, 0xf9, 0xfa, 0x7f, 0xfe, 0x97, 0xb7, 0xeb, 0x6e, 0xe9,
-  0xb7, 0x79, 0xf1, 0xb1, 0xfc, 0x60, 0xa6, 0x08, 0xb7, 0x68, 0xda, 0x9e,
-  0x4d, 0x92, 0x43, 0xf3, 0x45, 0x63, 0xaf, 0x27, 0xda, 0x8e, 0xe6, 0x47,
-  0xe3, 0x74, 0x3c, 0xbb, 0x4b, 0x6e, 0xd2, 0x8f, 0x19, 0x8d, 0x77, 0x61,
-  0xf6, 0x29, 0xcd, 0x80, 0xb9, 0x36, 0x66, 0x90, 0x63, 0x22, 0x18, 0xa6,
-  0xe5, 0x72, 0x6c, 0x84, 0xcb, 0xdf, 0x97, 0x65, 0xc3, 0x13, 0x93, 0x7e,
-  0x2c, 0xf3, 0x69, 0xeb, 0x2e, 0xbe, 0xc9, 0x48, 0xa0, 0xd1, 0x87, 0x71,
-  0x49, 0x19, 0x81, 0x4a, 0x3d, 0xc5, 0x41, 0xcb, 0x1b, 0xba, 0xee, 0x8c,
-  0x28, 0x4c, 0x67, 0x75, 0x99, 0x24, 0xd7, 0x25, 0x9d, 0x12, 0x08, 0x60,
-  0x6c, 0x73, 0xb3, 0x28, 0x37, 0x29, 0xdd, 0x6a, 0xe6, 0x02, 0xb3, 0xe7,
-  0xa0, 0xca, 0x20, 0x8b, 0xb1, 0x52, 0xe9, 0xac, 0xcf, 0xb7, 0x17, 0xbd,
-  0x23, 0x53, 0x95, 0x6c, 0xfe, 0xdb, 0x66, 0x3f, 0xd9, 0xfc, 0xf7, 0x4d,
-  0xec, 0x87, 0xcd, 0x3f, 0x6f, 0xba, 0x75, 0x36, 0xca, 0xd8, 0xc7, 0x7c,
-  0x9a, 0xf1, 0x96, 0x38, 0x39, 0xff, 0xf8, 0x34, 0xf9, 0x07, 0xe9, 0x0e,
-  0x46, 0xd6, 0x66, 0x9f, 0x74, 0x43, 0xea, 0xd8, 0xcc, 0xdb, 0x89, 0x11,
-  0xba, 0xe9, 0x82, 0x94, 0x88, 0xac, 0x9a, 0x98, 0xdd, 0x9b, 0x5e, 0x9b,
-  0xfd, 0x6a, 0xee, 0x62, 0x6d, 0x8e, 0xda, 0xa7, 0x57, 0x78, 0x58, 0x46,
-  0x40, 0x26, 0x45, 0x3a, 0x37, 0x27, 0xe2, 0x94, 0x7a, 0x94, 0x17, 0xe1,
-  0x62, 0xfe, 0x78, 0x95, 0x7d, 0xbe, 0x7b, 0x70, 0xf0, 0xe8, 0x4f, 0xfb,
-  0x4f, 0xb2, 0xe6, 0x66, 0xf7, 0xe7, 0x1d, 0xfb, 0xc8, 0xc9, 0x15, 0xa6,
-  0x5d, 0xb7, 0x9f, 0x76, 0xc2, 0xdc, 0xf2, 0xf6, 0x96, 0x30, 0xef, 0x9b,
-  0xbf, 0x67, 0x57, 0xf9, 0xa7, 0xbe, 0xea, 0x4b, 0x7c, 0xe6, 0x52, 0xb3,
-  0xd5, 0xcc, 0xfa, 0x91, 0x88, 0xd0, 0xe6, 0xae, 0x97, 0x59, 0x6d, 0x66,
-  0xf2, 0xf6, 0x26, 0x6d, 0x12, 0xdb, 0x00, 0xaf, 0xec, 0x3c, 0xbf, 0xbe,
-  0x69, 0x92, 0xdb, 0x94, 0x2e, 0x9b, 0x93, 0x86, 0x9b, 0xa0, 0x5b, 0xde,
-  0x5c, 0x31, 0x57, 0xa9, 0xb9, 0x2b, 0x68, 0x0d, 0x71, 0xa5, 0x8f, 0x9d,
-  0x86, 0xd1, 0x98, 0x6d, 0xce, 0x0b, 0xe2, 0xd4, 0xa9, 0x71, 0x5a, 0xd3,
-  0xa1, 0x2d, 0x8c, 0x70, 0x68, 0x8c, 0x8e, 0xb0, 0xa4, 0x7f, 0xdd, 0x18,
-  0x2d, 0x00, 0x73, 0x20, 0x1d, 0xc5, 0x45, 0xf9, 0x8a, 0x96, 0x93, 0xd6,
-  0xc6, 0x5e, 0x5e, 0x66, 0x91, 0xfa, 0xb2, 0xcc, 0xf6, 0x8d, 0xda, 0x1c,
-  0x38, 0x23, 0x99, 0xec, 0xce, 0xe8, 0x91, 0x90, 0xed, 0xf1, 0x38, 0xd1,
-  0xc7, 0xb4, 0x26, 0x45, 0x81, 0xd5, 0x01, 0xd3, 0x79, 0x6f, 0xb0, 0x66,
-  0xd2, 0xd2, 0x0f, 0xa4, 0x92, 0x74, 0x14, 0x1f, 0xbc, 0x36, 0x2d, 0xcd,
-  0x26, 0x33, 0xbd, 0x35, 0xc2, 0x98, 0x46, 0x46, 0x22, 0x16, 0xb3, 0x82,
-  0x4d, 0x6e, 0xda, 0xa4, 0x1f, 0xe6, 0x0d, 0xdd, 0x31, 0xd0, 0x61, 0x4d,
-  0x7f, 0xcd, 0xa4, 0x40, 0x11, 0x35, 0x82, 0xda, 0x1b, 0x3f, 0xae, 0x47,
-  0xf3, 0x6c, 0xf2, 0xd1, 0x68, 0x29, 0x46, 0x21, 0xcd, 0xec, 0x5b, 0xb8,
-  0xcf, 0x27, 0xa4, 0x1b, 0xcd, 0xcc, 0x79, 0x99, 0x94, 0x55, 0x45, 0xfa,
-  0x3e, 0xad, 0xe0, 0x98, 0x85, 0xe8, 0x3c, 0x33, 0x6a, 0x84, 0x3f, 0x9d,
-  0x39, 0x5d, 0x68, 0x46, 0xbe, 0x18, 0xbd, 0x04, 0x12, 0xc4, 0xe8, 0x0f,
-  0x90, 0xf9, 0x18, 0x38, 0x7a, 0x47, 0x6d, 0x4f, 0x26, 0xd9, 0xa2, 0xa9,
-  0x63, 0x63, 0xd2, 0x05, 0x37, 0xdd, 0xa9, 0x32, 0x9a, 0x79, 0x5f, 0xe9,
-  0xc2, 0xbc, 0xda, 0x4b, 0x1f, 0x7a, 0x97, 0xea, 0x31, 0x46, 0x0f, 0xab,
-  0xed, 0xac, 0x35, 0xd8, 0x1b, 0x46, 0x8c, 0x61, 0xce, 0xe7, 0xd4, 0x51,
-  0x7a, 0xb8, 0xe6, 0x93, 0x0a, 0xd1, 0x4c, 0x0b, 0xc9, 0x9a, 0x36, 0x7f,
-  0x97, 0xae, 0x2e, 0x33, 0x9f, 0xb6, 0x71, 0xf3, 0x55, 0xbb, 0xa6, 0xf4,
-  0x79, 0x52, 0xf1, 0xcd, 0x4d, 0x3e, 0xad, 0x6f, 0x8c, 0xf2, 0x55, 0xcb,
-  0xc9, 0xce, 0xe7, 0x66, 0xcf, 0x7c, 0xa4, 0xf5, 0x5d, 0x64, 0xd9, 0x74,
-  0x98, 0x9c, 0x5d, 0x91, 0x54, 0xad, 0x4c, 0xa7, 0x1b, 0xfc, 0x9a, 0x6e,
-  0x15, 0x33, 0x6f, 0x53, 0x28, 0xf1, 0xf6, 0x68, 0x71, 0x57, 0xbc, 0xdb,
-  0x01, 0x92, 0x3c, 0x35, 0x3f, 0x31, 0xbd, 0x9d, 0xb5, 0xaf, 0x20, 0x9c,
-  0x43, 0x23, 0xbd, 0xa9, 0x7b, 0xe3, 0x2c, 0xc1, 0x4e, 0x1c, 0x67, 0xcd,
-  0x6d, 0x96, 0xd9, 0xe6, 0xea, 0xcc, 0x5c, 0x7b, 0xb4, 0x68, 0xac, 0xf9,
-  0x41, 0x18, 0xd2, 0xd4, 0x9e, 0x5f, 0x9c, 0x7d, 0x73, 0x71, 0x3c, 0x1a,
-  0x25, 0x6f, 0x8e, 0x2f, 0x8f, 0x2f, 0x5a, 0x33, 0x5d, 0x94, 0xd5, 0x1c,
-  0x2b, 0x3a, 0xcd, 0xeb, 0xc5, 0x2c, 0xbd, 0xa3, 0xa5, 0x36, 0x23, 0xb9,
-  0xae, 0xe8, 0x64, 0xcd, 0x33, 0xba, 0x15, 0xa6, 0x4b, 0x48, 0x32, 0x73,
-  0x1d, 0x99, 0xe5, 0x13, 0x8d, 0x97, 0x84, 0x09, 0xd4, 0xe4, 0xe2, 0xda,
-  0xcd, 0xb4, 0x91, 0x38, 0x72, 0x93, 0xd2, 0x55, 0x6a, 0xd7, 0x83, 0x54,
-  0x4f, 0x18, 0x37, 0x7d, 0xf7, 0x33, 0x9e, 0x26, 0xbe, 0xda, 0xcc, 0x9e,
-  0xcd, 0xe7, 0x10, 0x76, 0xe6, 0x4f, 0xa7, 0x6d, 0x66, 0x57, 0x46, 0xd5,
-  0x36, 0xb7, 0x2b, 0x5b, 0x0a, 0xdd, 0x3e, 0x69, 0x6f, 0xad, 0x7e, 0x6c,
-  0xb6, 0x21, 0x89, 0x66, 0x6a, 0x90, 0xbb, 0xc2, 0x5f, 0xb0, 0x42, 0xcc,
-  0xe8, 0x24, 0x24, 0xfb, 0xe4, 0xb1, 0x05, 0x75, 0x21, 0x33, 0x2b, 0x3b,
-  0xe5, 0xe6, 0xeb, 0xe5, 0x15, 0x0e, 0x72, 0xb2, 0x65, 0x34, 0xf3, 0x37,
-  0xc6, 0x5a, 0x32, 0x16, 0x4b, 0x3f, 0x39, 0xdf, 0xc6, 0x7b, 0x7b, 0xbb,
-  0xfb, 0x8f, 0x59, 0x10, 0x0c, 0xb5, 0xb9, 0x57, 0x9e, 0x20, 0xde, 0xfb,
-  0x40, 0xcb, 0xcb, 0x0f, 0x51, 0xe3, 0xc3, 0x64, 0xef, 0x0d, 0xff, 0xe4,
-  0xf1, 0xe7, 0x4f, 0x3e, 0x7b, 0x2a, 0x3f, 0x6c, 0x6f, 0x70, 0xdb, 0x7f,
-  0xec, 0x0e, 0x58, 0x7e, 0x64, 0x0a, 0x9a, 0x9e, 0x98, 0xd1, 0xcd, 0xf3,
-  0xc2, 0x1c, 0x13, 0x73, 0xac, 0x44, 0x56, 0xd1, 0x7e, 0x36, 0x9d, 0xbf,
-  0x62, 0xc9, 0x26, 0xeb, 0xda, 0x36, 0x29, 0xcd, 0xcb, 0x66, 0xcb, 0x1a,
-  0x59, 0x6e, 0x17, 0x89, 0xd5, 0x84, 0x86, 0x3a, 0x92, 0x8e, 0x49, 0xc0,
-  0x92, 0x5d, 0x65, 0x14, 0xe0, 0x2c, 0xfa, 0x35, 0x7b, 0x2b, 0x9a, 0x37,
-  0x4c, 0xdf, 0xcc, 0x9d, 0x48, 0xd7, 0x5c, 0x38, 0xef, 0x46, 0x14, 0x40,
-  0x42, 0xde, 0xe6, 0x35, 0x44, 0xc3, 0x6d, 0xb9, 0x9c, 0x19, 0x2b, 0x86,
-  0x1e, 0x58, 0x2e, 0xf0, 0x82, 0xf9, 0xd4, 0xc2, 0xc9, 0x00, 0xa3, 0xb1,
-  0xd0, 0xde, 0xe9, 0xb6, 0x62, 0xba, 0x66, 0xfe, 0xb9, 0x30, 0x5b, 0x89,
-  0xbb, 0x33, 0xec, 0xde, 0x10, 0x90, 0x7d, 0xc1, 0x4e, 0xa4, 0x33, 0x0f,
-  0xa1, 0x7d, 0x7e, 0x36, 0xba, 0x24, 0x0d, 0xe0, 0xfc, 0xdd, 0xa5, 0x69,
-  0xc8, 0xa8, 0x00, 0x75, 0x63, 0x36, 0x25, 0xbd, 0x58, 0x64, 0x30, 0x21,
-  0xb5, 0x39, 0xb3, 0xf7, 0x72, 0x08, 0x2a, 0xa8, 0x35, 0xfa, 0x49, 0xee,
-  0x23, 0xdb, 0xd8, 0x74, 0x04, 0xd5, 0xc2, 0xe6, 0x3b, 0xdc, 0xbe, 0x93,
-  0x6c, 0x7d, 0xb9, 0x6d, 0xf6, 0xec, 0xa0, 0xb4, 0xb3, 0x33, 0x18, 0xc8,
-  0xab, 0xe6, 0xdb, 0x75, 0x3e, 0xcf, 0x67, 0x69, 0xe5, 0x75, 0x9d, 0x25,
-  0x2a, 0x9d, 0x4f, 0x2b, 0x57, 0x26, 0x66, 0xd7, 0xa0, 0xdb, 0xce, 0x94,
-  0xa4, 0x39, 0x84, 0x54, 0x72, 0x4b, 0x35, 0x25, 0x85, 0x00, 0x1a, 0xf3,
-  0x22, 0xb7, 0x53, 0x47, 0x6b, 0x46, 0xe2, 0xaa, 0x35, 0x51, 0xdd, 0x75,
-  0x0b, 0x26, 0x8e, 0x6e, 0x24, 0x78, 0x2a, 0xec, 0xd4, 0x25, 0xbd, 0x71,
-  0x5a, 0xf5, 0x12, 0x2b, 0x8b, 0xf9, 0x6c, 0xd2, 0x09, 0xa9, 0xb2, 0xeb,
-  0xa5, 0x19, 0x41, 0xc2, 0xb3, 0x4b, 0x23, 0xfd, 0xa3, 0x37, 0x52, 0x6d,
-  0x60, 0x30, 0xa6, 0x47, 0xf2, 0x9a, 0xcd, 0xcc, 0x2b, 0x63, 0xb7, 0xd0,
-  0xa1, 0x51, 0xfd, 0x15, 0x1a, 0x8d, 0xec, 0x98, 0xc8, 0x86, 0xf1, 0xf4,
-  0x5a, 0x73, 0x54, 0x9a, 0xcc, 0x08, 0x1a, 0x88, 0x7f, 0x7a, 0x72, 0x60,
-  0x96, 0x6c, 0x30, 0xa8, 0xcd, 0xfc, 0x93, 0xee, 0xbd, 0x10, 0x9b, 0xfe,
-  0x0c, 0x0e, 0x13, 0xeb, 0x5b, 0x39, 0x13, 0x1d, 0x18, 0xd7, 0x26, 0xbf,
-  0x0b, 0x11, 0x6a, 0x14, 0xd5, 0x5b, 0xf3, 0xe1, 0xd4, 0x2c, 0x99, 0x39,
-  0x70, 0x6f, 0x68, 0xa2, 0xd8, 0x37, 0x92, 0x58, 0xb5, 0x19, 0x3b, 0x23,
-  0xa7, 0x73, 0x9f, 0x3a, 0x5d, 0x66, 0x3a, 0xcd, 0xe9, 0xb7, 0xe6, 0x7c,
-  0x99, 0x1b, 0x6e, 0x99, 0xc1, 0xf6, 0x90, 0x49, 0x9d, 0xbb, 0xc9, 0x84,
-  0x19, 0x5b, 0xdf, 0x94, 0x64, 0x26, 0xf6, 0x58, 0x16, 0x0f, 0xe8, 0x5b,
-  0x3d, 0xdc, 0xe7, 0xf3, 0x44, 0xbf, 0x25, 0x9f, 0x32, 0xe3, 0x98, 0xfa,
-  0xba, 0x59, 0xdf, 0x5c, 0x34, 0x77, 0x9e, 0x91, 0x00, 0x59, 0xcd, 0x7d,
-  0xaf, 0xac, 0xc2, 0x63, 0xae, 0xd4, 0x05, 0x29, 0x53, 0x22, 0xc3, 0x71,
-  0x19, 0xe2, 0xc8, 0xd6, 0xdc, 0xb5, 0xbe, 0x99, 0x5b, 0x7a, 0xf2, 0xfa,
-  0x46, 0x1f, 0xf5, 0x2e, 0xd6, 0xd4, 0x0c, 0x8e, 0x2e, 0x07, 0xb2, 0xa7,
-  0xa7, 0x2a, 0xf7, 0xcb, 0x8a, 0x85, 0xd9, 0xac, 0x34, 0x7b, 0xb9, 0xc7,
-  0x2a, 0xab, 0x74, 0x9b, 0x7a, 0x4d, 0xbd, 0xa4, 0x19, 0x67, 0x3f, 0x53,
-  0x69, 0xd7, 0xc6, 0x76, 0x5a, 0xe6, 0xab, 0xbe, 0xb7, 0x6b, 0x6e, 0xa2,
-  0x46, 0x98, 0x23, 0x73, 0x75, 0xd6, 0xb4, 0x8f, 0x75, 0xe6, 0xb1, 0xbd,
-  0xcd, 0x55, 0xb7, 0xd9, 0xf0, 0x79, 0x84, 0x8d, 0xd5, 0x99, 0xf9, 0x1a,
-  0xdb, 0x47, 0x2e, 0x32, 0x3b, 0x32, 0x33, 0xa2, 0x69, 0x9e, 0x62, 0x9f,
-  0xf0, 0xd2, 0x40, 0x19, 0x71, 0x16, 0x61, 0x44, 0x0f, 0xbe, 0xeb, 0x1a,
-  0x74, 0xb3, 0x99, 0x7f, 0x25, 0x69, 0x9f, 0x06, 0x67, 0x66, 0xec, 0xa7,
-  0x18, 0xc7, 0xe0, 0x63, 0x42, 0xc7, 0xcf, 0x98, 0x0d, 0x74, 0x16, 0x07,
-  0x67, 0xa7, 0x1f, 0xbd, 0x63, 0x44, 0x96, 0x7b, 0x41, 0x7a, 0x4a, 0x1f,
-  0xde, 0x91, 0x71, 0x59, 0x1a, 0x33, 0xd9, 0x0d, 0x8d, 0xee, 0x83, 0xac,
-  0xa0, 0xdd, 0x2e, 0x2b, 0x6a, 0x44, 0xc2, 0xc2, 0xca, 0xdb, 0x3b, 0x63,
-  0x2e, 0xa5, 0xd7, 0x69, 0x6e, 0xf7, 0x9b, 0x9c, 0x8c, 0x69, 0xa2, 0x0f,
-  0x17, 0xa5, 0x3c, 0x4f, 0x4b, 0x45, 0x2a, 0x90, 0xc8, 0xad, 0x65, 0xcd,
-  0xc7, 0xc7, 0x8c, 0xca, 0x48, 0x1e, 0xc8, 0x0e, 0x69, 0x97, 0xd4, 0x46,
-  0x6d, 0x6e, 0x0c, 0x45, 0x99, 0x74, 0x4e, 0x08, 0x5f, 0x68, 0x90, 0xa6,
-  0xc5, 0xde, 0x30, 0x79, 0x5d, 0xde, 0x66, 0xf0, 0x15, 0x42, 0xbf, 0xcf,
-  0xc9, 0xdb, 0x65, 0x54, 0xc1, 0xdb, 0x2c, 0x99, 0x1b, 0xd5, 0xd3, 0xcc,
-  0x26, 0xb4, 0x0f, 0xfc, 0xcc, 0x33, 0x0f, 0xcd, 0x0e, 0xbf, 0xe5, 0x59,
-  0xb2, 0xa3, 0xb0, 0x4b, 0x79, 0xc5, 0x47, 0x22, 0xd9, 0x82, 0x7a, 0x33,
-  0xa1, 0xd9, 0x5a, 0x34, 0x6e, 0x14, 0x76, 0x42, 0x6e, 0xd3, 0xda, 0x3b,
-  0x5c, 0x19, 0x4c, 0xd3, 0xe4, 0xb3, 0xe1, 0xde, 0xb3, 0xe1, 0xee, 0x90,
-  0x4c, 0x91, 0xec, 0x63, 0x5e, 0x2e, 0x6b, 0x5a, 0x4f, 0xea, 0x89, 0x77,
-  0x3a, 0xc9, 0x27, 0x45, 0xcb, 0x7b, 0x7d, 0x3d, 0x63, 0xc5, 0x67, 0xa7,
-  0xbc, 0xba, 0x4a, 0x3c, 0xe5, 0xa8, 0xca, 0x16, 0x6c, 0x03, 0xd1, 0xdc,
-  0xc8, 0x81, 0x63, 0xa1, 0x1a, 0x1a, 0xc9, 0x43, 0xe7, 0xbe, 0x18, 0x0c,
-  0xd2, 0x71, 0xdd, 0x90, 0x39, 0x35, 0x58, 0x16, 0xf9, 0xa7, 0x41, 0x5d,
-  0x4e, 0x3e, 0x98, 0x65, 0x79, 0xbe, 0x48, 0x9b, 0x9b, 0x2f, 0x3b, 0x4e,
-  0xe1, 0x2d, 0xba, 0x4d, 0xb6, 0x93, 0xe4, 0x88, 0x15, 0x4b, 0x9a, 0x8b,
-  0x8a, 0x4f, 0x9c, 0x59, 0x4f, 0x69, 0x25, 0x79, 0x67, 0x5a, 0x31, 0xbb,
-  0x79, 0x6e, 0x96, 0x35, 0xe1, 0xc6, 0xfa, 0x2a, 0x4c, 0x3b, 0xcd, 0xc1,
-  0xe5, 0x48, 0x17, 0x09, 0x3c, 0x77, 0xe6, 0xf0, 0x94, 0xd5, 0x87, 0x21,
-  0xf9, 0x48, 0x8c, 0xd5, 0x78, 0x40, 0x1b, 0xba, 0x31, 0x62, 0xac, 0xe1,
-  0x79, 0xaf, 0x45, 0x08, 0x53, 0xb7, 0x58, 0x26, 0x3b, 0x29, 0xa5, 0xf3,
-  0xa9, 0x3d, 0x90, 0xcf, 0x26, 0x6a, 0x6f, 0xc8, 0xd6, 0xdb, 0xfc, 0xca,
-  0x58, 0x80, 0x37, 0xbc, 0xf0, 0x68, 0x8c, 0xc7, 0x68, 0xf6, 0xe8, 0xb5,
-  0xb1, 0x21, 0x8a, 0xa6, 0xd3, 0x9c, 0xf9, 0x2a, 0x5d, 0xd6, 0x74, 0xcf,
-  0xb0, 0xb9, 0x8b, 0x6d, 0x22, 0x3e, 0x20, 0x6b, 0x81, 0x0e, 0x37, 0x3a,
-  0xaf, 0x1d, 0xea, 0xaa, 0x7e, 0x36, 0x7c, 0xf2, 0xc8, 0x2c, 0xaa, 0x3f,
-  0xd1, 0xc5, 0x1d, 0xf9, 0x4e, 0xe3, 0x93, 0x7a, 0x69, 0xee, 0xd2, 0x9a,
-  0xd5, 0x13, 0x73, 0x86, 0xaf, 0xf2, 0xeb, 0x65, 0x95, 0xf1, 0xa5, 0x06,
-  0x77, 0xab, 0x7a, 0x59, 0xe9, 0x9e, 0xb8, 0x29, 0xe1, 0x9c, 0x34, 0xf2,
-  0x25, 0x9b, 0x5d, 0xf5, 0xbb, 0xb3, 0x40, 0x1a, 0x1d, 0x6d, 0x01, 0x0c,
-  0x11, 0x9b, 0xc8, 0x68, 0x6e, 0x68, 0xac, 0xc8, 0xe4, 0x5e, 0x9f, 0x9b,
-  0x09, 0x4e, 0xc8, 0x3b, 0x97, 0x4c, 0x66, 0x69, 0x3e, 0x87, 0xb9, 0x23,
-  0xde, 0xa7, 0x61, 0xa7, 0xb9, 0x4b, 0x51, 0xc7, 0xa1, 0x89, 0x8f, 0xc9,
-  0x1a, 0xa8, 0x6a, 0x12, 0x56, 0x34, 0x09, 0xa9, 0x2a, 0x13, 0xac, 0x6b,
-  0xdf, 0x64, 0x93, 0x0f, 0xba, 0x9a, 0x7a, 0x0b, 0x0f, 0x3a, 0xcd, 0x91,
-  0xdb, 0x15, 0x26, 0x87, 0x79, 0x6a, 0x69, 0xd6, 0x74, 0x51, 0xd6, 0x75,
-  0x4e, 0x1e, 0x05, 0xd2, 0x90, 0x97, 0x13, 0x28, 0xce, 0x64, 0x62, 0x7f,
-  0x32, 0x2b, 0xa9, 0x5b, 0x22, 0x31, 0x7b, 0xac, 0x98, 0x0e, 0x9a, 0x2a,
-  0x5f, 0xac, 0xea, 0x1d, 0x5f, 0x19, 0xed, 0x3b, 0xbb, 0x16, 0x23, 0x06,
-  0xf6, 0x01, 0x5b, 0x0c, 0x93, 0xa4, 0x33, 0x9b, 0x9d, 0xe6, 0x78, 0x6e,
-  0xfb, 0x64, 0x22, 0xe7, 0x46, 0x84, 0xb2, 0xfe, 0x08, 0x0f, 0x90, 0xd1,
-  0x16, 0xe5, 0x2c, 0x1b, 0xc5, 0x36, 0x9f, 0xe0, 0x5e, 0xc8, 0xaf, 0x33,
-  0x72, 0x6f, 0x9b, 0xe3, 0xdd, 0xcc, 0xcc, 0x6d, 0xe1, 0x09, 0x0a, 0xbb,
-  0xe2, 0x45, 0x76, 0x5d, 0x36, 0x24, 0xa0, 0x83, 0x6d, 0xf2, 0x0e, 0x1b,
-  0xdf, 0xee, 0x09, 0xd5, 0x84, 0xfc, 0x6b, 0x2a, 0x67, 0x15, 0xc5, 0x7c,
-  0x9a, 0x35, 0x21, 0x31, 0xc2, 0xea, 0xc6, 0xec, 0xc0, 0xee, 0xaa, 0x9b,
-  0xd6, 0x26, 0x19, 0xd4, 0x51, 0xdc, 0xa5, 0x7a, 0x95, 0xab, 0x0e, 0x34,
-  0x26, 0x93, 0x8d, 0xcc, 0xe3, 0xdb, 0x7c, 0x92, 0xa9, 0x87, 0x42, 0xdc,
-  0x76, 0xb3, 0x3c, 0xdc, 0xfb, 0xf3, 0x65, 0x0d, 0xab, 0x89, 0xd5, 0x14,
-  0x32, 0x28, 0x6f, 0x73, 0x52, 0x63, 0x4e, 0xae, 0xe4, 0xac, 0xd2, 0x2d,
-  0xca, 0xe7, 0x23, 0xad, 0x72, 0x58, 0xcf, 0xa6, 0x39, 0xe9, 0xa7, 0x67,
-  0xe4, 0xa8, 0xdd, 0xe6, 0xfa, 0x8d, 0xf7, 0x45, 0xb3, 0x73, 0x1a, 0x1d,
-  0x0c, 0xc9, 0xab, 0x34, 0x9f, 0x45, 0xe6, 0x09, 0x0a, 0xaa, 0xb1, 0x48,
-  0x6f, 0xb2, 0x4a, 0xd6, 0x60, 0x49, 0x93, 0x4e, 0xa1, 0x88, 0xe0, 0xe9,
-  0x51, 0x96, 0xb1, 0x8a, 0x05, 0x7d, 0xec, 0xd3, 0x9d, 0x9d, 0x5e, 0xdc,
-  0x63, 0xbc, 0x76, 0xf2, 0x77, 0x5e, 0x3e, 0xef, 0x78, 0xa6, 0xd4, 0x6a,
-  0xba, 0x20, 0x9f, 0x7b, 0xf7, 0x84, 0x92, 0x36, 0x4a, 0x61, 0x9b, 0x6d,
-  0x75, 0xaa, 0x65, 0xe2, 0x52, 0xb4, 0xe1, 0x0e, 0x08, 0x07, 0x8a, 0x2e,
-  0xc8, 0x11, 0xe6, 0x76, 0x44, 0x53, 0xea, 0x34, 0x67, 0x54, 0x33, 0xf2,
-  0x13, 0xc2, 0x08, 0x6f, 0xed, 0x58, 0x63, 0x10, 0x57, 0xd6, 0xe9, 0x4e,
-  0x4e, 0x30, 0x9a, 0x6f, 0xd5, 0x3d, 0x71, 0x66, 0xf1, 0x52, 0xa7, 0x39,
-  0xd2, 0x86, 0x49, 0x75, 0x30, 0x87, 0x26, 0xa7, 0xfd, 0x88, 0x4d, 0xa0,
-  0x7e, 0x57, 0xb3, 0x7d, 0xd9, 0x33, 0xa6, 0x72, 0x95, 0x95, 0x0d, 0x74,
-  0xf7, 0x6a, 0x96, 0x5e, 0x9b, 0x7d, 0xd7, 0x69, 0x2e, 0xbf, 0x36, 0x36,
-  0x2e, 0x47, 0x3f, 0xea, 0xd2, 0xdc, 0x1e, 0x34, 0x6e, 0xb1, 0xf7, 0x8d,
-  0xb9, 0x67, 0xb6, 0xd9, 0x6c, 0x09, 0x09, 0x78, 0x66, 0x06, 0x38, 0x1a,
-  0xbd, 0xde, 0xf6, 0x05, 0x1c, 0xe6, 0xf7, 0x21, 0xe2, 0x0d, 0xf2, 0x09,
-  0xa6, 0x49, 0xf2, 0x35, 0xd6, 0xa4, 0x2b, 0xe5, 0x78, 0xa5, 0x23, 0x93,
-  0xa7, 0x13, 0x41, 0x2e, 0xa2, 0xa1, 0x08, 0x00, 0x48, 0x00, 0x4c, 0x93,
-  0x7a, 0xab, 0x78, 0x87, 0x93, 0x17, 0x81, 0xaf, 0x69, 0xf3, 0xb7, 0x65,
-  0xbd, 0x24, 0xc3, 0xbd, 0xd3, 0xdc, 0xc2, 0x08, 0xb2, 0xc6, 0x18, 0x6f,
-  0x46, 0x22, 0x2d, 0x0b, 0xfa, 0xd3, 0x6a, 0x17, 0x39, 0xf4, 0x5c, 0x5a,
-  0x92, 0x8a, 0x9c, 0x83, 0x64, 0x21, 0xd8, 0xbb, 0xd9, 0x88, 0x16, 0x69,
-  0xb9, 0xbb, 0xb4, 0x70, 0x9f, 0x50, 0xa4, 0x04, 0x62, 0x67, 0x9a, 0x53,
-  0x94, 0x8d, 0x0e, 0xde, 0x0a, 0x29, 0xbe, 0x55, 0x2f, 0x8d, 0x9c, 0x21,
-  0xad, 0x8a, 0x85, 0x48, 0x20, 0x40, 0x54, 0xc8, 0x18, 0x05, 0xce, 0x93,
-  0x26, 0xdb, 0xbf, 0xf5, 0x31, 0xc1, 0xc2, 0xf9, 0x2b, 0x39, 0x31, 0xfa,
-  0xac, 0xd1, 0x54, 0x9f, 0xd3, 0x7e, 0x0b, 0xb4, 0x80, 0xcb, 0xd3, 0x51,
-  0x6c, 0x41, 0xdb, 0x8e, 0x7b, 0x7a, 0x9f, 0x44, 0x2e, 0xf9, 0x57, 0xd8,
-  0xdf, 0x54, 0x92, 0xb6, 0xe4, 0x39, 0xef, 0x7d, 0x47, 0xc8, 0x22, 0x23,
-  0x2f, 0x3f, 0x1b, 0x12, 0x1c, 0x15, 0x24, 0x31, 0x66, 0xd4, 0xa8, 0x86,
-  0xd4, 0x08, 0xeb, 0x5b, 0x3a, 0x3a, 0xf4, 0xdb, 0x85, 0x33, 0xa9, 0xbb,
-  0x41, 0xbc, 0xdf, 0x6f, 0xd5, 0xdb, 0x56, 0x92, 0x99, 0x56, 0xce, 0x8f,
-  0xdf, 0x40, 0xb1, 0x4f, 0xcd, 0xc6, 0x79, 0xab, 0x7e, 0x1c, 0x0d, 0xfa,
-  0x8d, 0x97, 0xf9, 0xac, 0xe5, 0x2c, 0x75, 0xb6, 0x08, 0x22, 0x6e, 0xbc,
-  0xaf, 0xd0, 0x35, 0x76, 0xfb, 0xe7, 0xf0, 0x9b, 0x75, 0x77, 0x59, 0x73,
-  0xb7, 0x10, 0x97, 0xdf, 0xb2, 0x6e, 0x59, 0xd6, 0x7a, 0x3b, 0xcf, 0x1a,
-  0x28, 0x1f, 0xa4, 0xf0, 0x7b, 0x6d, 0x06, 0x2b, 0x84, 0x6e, 0xd1, 0x65,
-  0x70, 0x5d, 0xe4, 0xff, 0x10, 0xdf, 0x42, 0x56, 0x7c, 0xcc, 0xab, 0xb2,
-  0x20, 0x55, 0xc5, 0xd8, 0x04, 0x55, 0x0e, 0xe1, 0x4c, 0xea, 0xae, 0x11,
-  0x1f, 0x9b, 0x47, 0xef, 0x2e, 0x4e, 0xdf, 0x1f, 0x1d, 0xbe, 0xff, 0xfa,
-  0xdd, 0xdb, 0x97, 0xa7, 0xc7, 0x9b, 0xdd, 0x43, 0x7d, 0xc5, 0x62, 0x81,
-  0x0e, 0x4a, 0x4d, 0x0a, 0x19, 0x4e, 0x88, 0xe9, 0x22, 0xb7, 0x7c, 0x9d,
-  0x7f, 0x34, 0x62, 0x0d, 0xaa, 0x15, 0x9c, 0x97, 0xf8, 0x1b, 0xcc, 0x7d,
-  0x99, 0xf0, 0x4e, 0x73, 0x63, 0x73, 0x1f, 0x9b, 0x4e, 0xf3, 0xe9, 0x93,
-  0xc1, 0xeb, 0x49, 0x11, 0x73, 0x46, 0x3b, 0x18, 0x8c, 0x8c, 0x96, 0x98,
-  0x2e, 0x13, 0x52, 0xe9, 0x3c, 0xed, 0xd9, 0xf3, 0x63, 0x2e, 0x1b, 0xa3,
-  0x3c, 0xaa, 0xe7, 0xd4, 0x58, 0x67, 0xe5, 0x07, 0x0d, 0xbf, 0x1a, 0xcd,
-  0xf3, 0x30, 0xb2, 0xdc, 0x35, 0xaf, 0x0b, 0x4f, 0xc5, 0x26, 0xb5, 0x64,
-  0xf6, 0xef, 0x40, 0x3a, 0x39, 0xa9, 0x1a, 0xa3, 0xf6, 0x65, 0x39, 0x0e,
-  0x86, 0x86, 0x97, 0x48, 0x2d, 0x86, 0xd7, 0xa2, 0xab, 0x9f, 0x18, 0xa3,
-  0xf0, 0x8e, 0xe6, 0x80, 0x1a, 0x19, 0x66, 0x9f, 0x32, 0x9c, 0x3c, 0x79,
-  0xeb, 0x68, 0x59, 0xe1, 0x2c, 0x7f, 0x6f, 0x74, 0x12, 0x92, 0x80, 0x2f,
-  0xe1, 0xf6, 0x30, 0x2f, 0xe8, 0x43, 0xe6, 0xb2, 0xe9, 0x5e, 0x7c, 0xe5,
-  0x8c, 0x02, 0x4e, 0x29, 0x4c, 0x4c, 0x38, 0x04, 0xce, 0x0f, 0x2f, 0x5f,
-  0x07, 0x73, 0x42, 0x62, 0xde, 0x61, 0x1d, 0x64, 0x2b, 0xc2, 0x30, 0xaa,
-  0x1b, 0x39, 0x20, 0x6f, 0x47, 0xa3, 0x04, 0x91, 0xf4, 0x59, 0x3e, 0xae,
-  0x52, 0xfa, 0x26, 0xfd, 0x98, 0x7e, 0x6a, 0xb6, 0x75, 0xa7, 0xb9, 0xf3,
-  0x6f, 0x8f, 0x46, 0x7f, 0xdc, 0xdb, 0x33, 0xca, 0xdf, 0x74, 0x69, 0xe6,
-  0x65, 0xcb, 0xbc, 0x52, 0xd4, 0xe6, 0x64, 0xce, 0x87, 0x75, 0xb9, 0x8d,
-  0xcb, 0x1b, 0x1a, 0x1f, 0xae, 0x87, 0xf4, 0xa3, 0xb9, 0x75, 0xb1, 0x93,
-  0x78, 0x8e, 0x69, 0x3f, 0x77, 0xd5, 0x74, 0x5e, 0x60, 0x05, 0x1a, 0x18,
-  0x89, 0x61, 0xee, 0xed, 0xd9, 0x5d, 0x30, 0x8a, 0xad, 0xfc, 0x6c, 0x24,
-  0x61, 0xfa, 0x74, 0x62, 0xfe, 0x4a, 0x36, 0xd4, 0x36, 0x8d, 0xad, 0x7d,
-  0xc6, 0x74, 0x5c, 0x23, 0xd6, 0x4a, 0x2f, 0xc9, 0xc5, 0x09, 0x74, 0x41,
-  0x28, 0x17, 0x8a, 0xee, 0xf1, 0x72, 0x08, 0x0e, 0x74, 0x76, 0x9c, 0x4e,
-  0x3e, 0xdc, 0xa6, 0xd5, 0x94, 0x1d, 0x26, 0x66, 0xcf, 0x8c, 0xf3, 0x59,
-  0xde, 0xdc, 0xf1, 0xed, 0xd1, 0x1d, 0x05, 0x87, 0x8e, 0x68, 0x0a, 0xcd,
-  0x49, 0xba, 0x36, 0xb6, 0x10, 0x69, 0xa1, 0x64, 0x21, 0x9a, 0x83, 0xe1,
-  0xe9, 0xfa, 0x50, 0x95, 0x1a, 0xab, 0xea, 0xd8, 0x6f, 0x77, 0x9a, 0x83,
-  0xfb, 0x89, 0x4e, 0x12, 0xba, 0xe9, 0x76, 0xaf, 0x0a, 0x42, 0x5f, 0x4c,
-  0xe9, 0x06, 0x4a, 0xea, 0x3b, 0x73, 0xdb, 0xcf, 0x93, 0x88, 0xaa, 0x08,
-  0x60, 0x45, 0xf2, 0x6d, 0x76, 0x67, 0x0c, 0x8b, 0xbc, 0x70, 0xb2, 0x92,
-  0x7d, 0x44, 0x19, 0x59, 0xaa, 0xac, 0x93, 0xe6, 0xea, 0x67, 0xcc, 0xc4,
-  0x55, 0xcc, 0x37, 0x49, 0x68, 0x59, 0xf1, 0xfb, 0xaa, 0x8f, 0x53, 0x13,
-  0x9b, 0x75, 0x4b, 0x28, 0xe3, 0x4b, 0xe1, 0x22, 0x8e, 0xcc, 0xcf, 0x8d,
-  0x75, 0x37, 0xdb, 0xf9, 0x3e, 0x2f, 0x68, 0xb2, 0x78, 0x15, 0x2f, 0x57,
-  0xad, 0x03, 0x2f, 0x84, 0x3c, 0x9b, 0xe4, 0xdd, 0x0b, 0xf1, 0x7b, 0x39,
-  0xe9, 0xc9, 0x67, 0x08, 0x80, 0x26, 0x84, 0x98, 0x90, 0xfb, 0x49, 0xa1,
-  0x15, 0x9f, 0x0d, 0x9f, 0xee, 0x22, 0x38, 0x4a, 0xbf, 0x1a, 0x76, 0xbe,
-  0xd4, 0x55, 0x73, 0x5b, 0xeb, 0x6f, 0x97, 0x3f, 0xb2, 0xfa, 0xd1, 0x05,
-  0xff, 0xa2, 0x2b, 0x16, 0x45, 0xfb, 0x62, 0xbf, 0xaf, 0xaf, 0x7b, 0xcb,
-  0x95, 0x26, 0xdd, 0xdf, 0x34, 0xca, 0x6b, 0x59, 0xc1, 0xaa, 0xae, 0x4a,
-  0xb3, 0xf0, 0x32, 0x8d, 0x5d, 0xe1, 0xc1, 0x8b, 0xbd, 0x45, 0xf3, 0x6d,
-  0x85, 0xbb, 0xe9, 0x26, 0x4f, 0xce, 0x76, 0xec, 0xd4, 0x07, 0x3a, 0x0a,
-  0xbc, 0x53, 0x1c, 0xeb, 0x27, 0xef, 0x7e, 0xcd, 0xc7, 0x7c, 0x96, 0xd6,
-  0x0d, 0xcc, 0x37, 0x6c, 0x31, 0x71, 0x02, 0xb5, 0xaf, 0x6b, 0x88, 0xec,
-  0xe7, 0x46, 0xa6, 0xfd, 0xf3, 0xb7, 0x35, 0x4b, 0x46, 0x48, 0xc2, 0xf0,
-  0x02, 0x93, 0x6d, 0xd9, 0xba, 0xb5, 0xdf, 0xe8, 0xf5, 0x4c, 0x9d, 0xb0,
-  0x8e, 0xaa, 0x05, 0x87, 0x55, 0x59, 0x93, 0x64, 0x8f, 0x5b, 0x68, 0x19,
-  0x90, 0xd3, 0x44, 0x1c, 0x33, 0x07, 0xbd, 0x64, 0x2b, 0x1b, 0x5e, 0x9b,
-  0xf6, 0x7a, 0xd4, 0xce, 0xde, 0x01, 0xfd, 0x77, 0x1f, 0xff, 0x7d, 0xd4,
-  0x53, 0x00, 0x94, 0x7f, 0xaa, 0xe8, 0x6a, 0xef, 0x5e, 0x4c, 0x12, 0xb5,
-  0xa0, 0xab, 0x5e, 0xee, 0x7a, 0xb9, 0xeb, 0xe8, 0x0a, 0x8c, 0xcb, 0x21,
-  0x56, 0x64, 0x4f, 0xfb, 0x11, 0x65, 0xd3, 0x4d, 0x04, 0xd4, 0x08, 0xb8,
-  0x01, 0xc6, 0xe4, 0xe1, 0x33, 0x63, 0x9b, 0x18, 0x65, 0x11, 0xce, 0x16,
-  0x8e, 0x01, 0x02, 0x4d, 0xf0, 0xbe, 0xca, 0x6e, 0xd2, 0xda, 0xec, 0xbd,
-  0x65, 0x83, 0xad, 0x18, 0xd9, 0xbd, 0xb3, 0xdc, 0x7a, 0xb7, 0xe4, 0xc3,
-  0x43, 0x6b, 0x0b, 0xca, 0x2a, 0xb2, 0x9f, 0x78, 0x56, 0xde, 0xea, 0x13,
-  0x03, 0x41, 0x24, 0xc5, 0x74, 0x04, 0xb3, 0x9a, 0x00, 0x35, 0xd1, 0x63,
-  0x7e, 0xbc, 0x6f, 0x4e, 0x8a, 0x25, 0xc1, 0xa5, 0xcc, 0xe6, 0xbf, 0x32,
-  0x33, 0x46, 0x46, 0xde, 0x0c, 0xeb, 0x46, 0xe6, 0x2c, 0x7a, 0x1d, 0x28,
-  0x9b, 0xa2, 0xf4, 0xe5, 0x57, 0xe2, 0xe3, 0x92, 0x7f, 0xe3, 0x72, 0x15,
-  0x55, 0xac, 0xe6, 0x98, 0x60, 0x57, 0x0f, 0xbb, 0x7f, 0x6b, 0xab, 0xac,
-  0xb4, 0x27, 0x43, 0x06, 0xcb, 0x6e, 0x65, 0xdd, 0xd7, 0x62, 0x7c, 0xc4,
-  0x7c, 0x1a, 0xa6, 0x57, 0x7c, 0x4c, 0x7f, 0xfd, 0x21, 0x31, 0x3d, 0x1e,
-  0x90, 0x47, 0x69, 0x59, 0x3f, 0xe0, 0x8c, 0x78, 0xf2, 0x97, 0xdf, 0xb1,
-  0x3e, 0x35, 0x8e, 0x7d, 0xfa, 0x13, 0xd0, 0xdd, 0x85, 0x77, 0x9e, 0x5f,
-  0xeb, 0xc8, 0x3b, 0x59, 0x23, 0x6e, 0xe8, 0x42, 0xbc, 0x26, 0x5b, 0xe9,
-  0x87, 0x74, 0x98, 0x9c, 0x1d, 0x8d, 0xce, 0xe9, 0x13, 0x66, 0x6b, 0x14,
-  0xd7, 0xa6, 0x17, 0xa7, 0xa3, 0x4e, 0x73, 0xd9, 0xa7, 0x26, 0x2b, 0xea,
-  0x16, 0x84, 0x6f, 0xe5, 0x34, 0xab, 0xaf, 0x55, 0x41, 0x08, 0xd2, 0x59,
-  0x63, 0xfc, 0x23, 0x7a, 0x48, 0xc1, 0x30, 0x8a, 0x54, 0x27, 0x7c, 0xd4,
-  0x82, 0x0f, 0x2d, 0xcc, 0x86, 0x9f, 0x6e, 0x5b, 0xef, 0x4d, 0x5f, 0xf7,
-  0x82, 0x0d, 0xaa, 0xd4, 0xcb, 0x6b, 0x32, 0x48, 0x6a, 0x35, 0x23, 0xed,
-  0x17, 0xcc, 0x6c, 0x04, 0xba, 0x94, 0x0e, 0xdb, 0x9c, 0x09, 0x3e, 0x36,
-  0xc6, 0x82, 0x22, 0xbc, 0x09, 0xf4, 0xa5, 0xa2, 0x74, 0xad, 0x92, 0xd1,
-  0x04, 0x6c, 0x5d, 0x8e, 0x30, 0xc4, 0x24, 0x33, 0xfa, 0xe8, 0x34, 0xa2,
-  0x0f, 0xf0, 0xa2, 0xa8, 0x0d, 0x75, 0x25, 0x78, 0xba, 0x88, 0x4b, 0x08,
-  0x0d, 0x4d, 0x58, 0x5f, 0xa3, 0x5d, 0x0f, 0x77, 0x6e, 0x4e, 0xfe, 0x6f,
-  0xd2, 0x9e, 0xd9, 0x7a, 0xa7, 0xf6, 0xec, 0xd9, 0xff, 0xa6, 0x58, 0x9a,
-  0x89, 0x8f, 0x5c, 0xcc, 0xa4, 0x61, 0xd1, 0x3d, 0x43, 0x13, 0xb8, 0xce,
-  0xd7, 0xf7, 0x78, 0xaf, 0xed, 0xeb, 0xc3, 0x66, 0x33, 0xd6, 0x40, 0x96,
-  0x3c, 0xa7, 0xff, 0xde, 0x2b, 0x95, 0x11, 0xe0, 0xc7, 0xf3, 0x12, 0x15,
-  0x62, 0xd9, 0x29, 0xee, 0x99, 0xa4, 0x2d, 0xa0, 0x83, 0x7b, 0x11, 0xdb,
-  0x6d, 0x48, 0x62, 0xaf, 0x9f, 0xbc, 0x24, 0xd8, 0xea, 0xf1, 0xdb, 0x6f,
-  0xb0, 0x07, 0xce, 0xf7, 0xf6, 0xe1, 0x83, 0xb7, 0xa6, 0xc4, 0x14, 0x1f,
-  0xa9, 0xd9, 0xb7, 0xc0, 0x31, 0xb4, 0x50, 0x0b, 0xc6, 0x9d, 0xd0, 0x87,
-  0x14, 0xa5, 0xe0, 0x09, 0x30, 0x16, 0xd3, 0xdf, 0xef, 0xfe, 0x0a, 0xac,
-  0xd2, 0xe3, 0xbe, 0xcc, 0xa0, 0xf8, 0x6a, 0x3e, 0x64, 0x77, 0xee, 0x6f,
-  0x98, 0x55, 0x6f, 0xaa, 0xdd, 0xc3, 0xcf, 0xbd, 0x49, 0xfa, 0xf1, 0x80,
-  0x70, 0x1c, 0x46, 0x61, 0x9d, 0xfe, 0xfc, 0xeb, 0x6e, 0xc4, 0xf8, 0xcc,
-  0x47, 0xfc, 0x2f, 0x70, 0x7d, 0x29, 0x62, 0x82, 0x03, 0xa4, 0x2c, 0xdf,
-  0x05, 0x34, 0x4c, 0x78, 0x62, 0xda, 0xf0, 0x69, 0xc1, 0x1a, 0x09, 0x49,
-  0x6a, 0x86, 0xc9, 0x00, 0x36, 0x13, 0x28, 0x11, 0xe5, 0x2c, 0xb8, 0xeb,
-  0x5a, 0x56, 0x2c, 0x94, 0xfb, 0x7d, 0xb9, 0xdd, 0x60, 0xd9, 0xc9, 0x1d,
-  0xc4, 0x0a, 0x75, 0xf7, 0x38, 0x58, 0xf5, 0x9a, 0x15, 0x30, 0xef, 0x66,
-  0x4c, 0xbc, 0x97, 0x11, 0x10, 0x44, 0xf7, 0x58, 0x55, 0x1a, 0xca, 0xf2,
-  0x66, 0x51, 0x5b, 0xc0, 0xac, 0xae, 0xce, 0xae, 0x59, 0x76, 0x72, 0x3e,
-  0xd9, 0x79, 0xeb, 0x73, 0xa4, 0x85, 0x97, 0xd9, 0x88, 0xb9, 0x2a, 0x17,
-  0x65, 0x8d, 0x51, 0x82, 0xdd, 0x33, 0xad, 0x71, 0x59, 0x71, 0x4e, 0x89,
-  0x03, 0x05, 0xdb, 0x4a, 0xf7, 0x15, 0x6f, 0x3f, 0x32, 0x4b, 0x7b, 0xde,
-  0x94, 0xf4, 0x62, 0x4b, 0xd1, 0x70, 0x88, 0x48, 0x8e, 0x50, 0xfe, 0x91,
-  0xa6, 0x4e, 0xf7, 0x8e, 0xf3, 0x75, 0xb6, 0xb5, 0xe0, 0xb2, 0xa0, 0x3f,
-  0x0b, 0xf2, 0x91, 0xfd, 0x21, 0xb2, 0x21, 0xa3, 0x7b, 0x91, 0xdc, 0xe5,
-  0x12, 0x3e, 0x83, 0x02, 0x43, 0x50, 0x31, 0xc1, 0xea, 0x46, 0xec, 0xa2,
-  0x98, 0x75, 0xa7, 0xca, 0x87, 0x1a, 0x71, 0x9e, 0x65, 0x17, 0x18, 0x3e,
-  0x81, 0x96, 0x69, 0x7e, 0x4b, 0x81, 0x77, 0xde, 0xbb, 0xe4, 0x8e, 0xcd,
-  0x27, 0x1f, 0x80, 0xaf, 0x92, 0x1b, 0xca, 0x1f, 0x9f, 0xa2, 0x9b, 0x18,
-  0x97, 0x17, 0x59, 0x02, 0x18, 0x96, 0xe4, 0x27, 0xa6, 0x3d, 0x49, 0xb7,
-  0x73, 0x5e, 0xb0, 0xce, 0xb6, 0xd2, 0xe5, 0x60, 0xfa, 0xfa, 0xfe, 0xe5,
-  0xc9, 0x45, 0xb2, 0x45, 0x2a, 0x78, 0x57, 0xc7, 0xd1, 0xeb, 0x7d, 0x27,
-  0x6b, 0x26, 0x3b, 0x8b, 0x0f, 0xf9, 0x8e, 0xb1, 0x3c, 0xa7, 0xe3, 0x6d,
-  0x6b, 0x4f, 0xe1, 0x73, 0xd8, 0x84, 0x6a, 0xa5, 0xaa, 0x99, 0x0a, 0x3b,
-  0xb5, 0x7b, 0x1a, 0x3c, 0xbb, 0x95, 0xf3, 0x00, 0x9c, 0xb9, 0x8a, 0x69,
-  0x62, 0xa7, 0x0e, 0x60, 0x41, 0x1c, 0x43, 0x4e, 0xc8, 0x1f, 0x9b, 0xb1,
-  0xab, 0xda, 0x18, 0xdc, 0xdd, 0xb3, 0xca, 0x18, 0x31, 0xf1, 0xea, 0xb0,
-  0x37, 0x47, 0x81, 0x4d, 0x72, 0x5d, 0x38, 0xa5, 0xaf, 0x4f, 0x90, 0x34,
-  0x9a, 0x94, 0x05, 0x5d, 0x49, 0x53, 0x72, 0x09, 0x76, 0x9b, 0x83, 0xa1,
-  0xd1, 0x1b, 0xee, 0xf4, 0x12, 0x0b, 0xc2, 0x33, 0xb3, 0xcc, 0x28, 0x53,
-  0x8b, 0x7a, 0x34, 0x5b, 0xec, 0x6a, 0x59, 0xb3, 0x9b, 0x9b, 0x3c, 0x2c,
-  0x76, 0xbd, 0x86, 0x31, 0x81, 0xea, 0x2d, 0xa7, 0xd5, 0xb9, 0x8c, 0x6e,
-  0x8c, 0x73, 0x65, 0x4d, 0xf7, 0xb1, 0xed, 0x14, 0x96, 0xaa, 0xf7, 0x53,
-  0x2f, 0xf1, 0x40, 0x5c, 0x2d, 0x67, 0x64, 0xee, 0x60, 0x16, 0xde, 0x25,
-  0x60, 0x6e, 0x64, 0x7b, 0x82, 0xa7, 0xd9, 0x2c, 0x9f, 0xe7, 0x30, 0xbe,
-  0xfc, 0x2e, 0x04, 0x4b, 0xd1, 0xee, 0xd2, 0x4f, 0x61, 0x97, 0x14, 0x18,
-  0x99, 0xd2, 0xaf, 0x4d, 0x97, 0xe0, 0x1e, 0x63, 0xdc, 0x5a, 0xdc, 0x80,
-  0x6e, 0x77, 0xc8, 0x42, 0x2b, 0xd7, 0x44, 0xd7, 0xec, 0x59, 0x5a, 0xa5,
-  0xc6, 0x3b, 0xff, 0x88, 0x1e, 0x7a, 0x16, 0x68, 0xc9, 0xe2, 0xc3, 0xa4,
-  0xde, 0xdb, 0xeb, 0x5e, 0x74, 0xb5, 0xdb, 0x51, 0x62, 0xca, 0xa7, 0x76,
-  0x63, 0xbe, 0xbb, 0x38, 0x49, 0xb6, 0x08, 0x4a, 0xff, 0xd9, 0x93, 0xbd,
-  0xfd, 0x6d, 0x3f, 0xfe, 0xae, 0x02, 0x20, 0xbc, 0x37, 0xef, 0xe0, 0xa5,
-  0xf2, 0x0f, 0xe0, 0xac, 0x9c, 0xa4, 0xa2, 0x71, 0xb8, 0xa6, 0xa7, 0xd9,
-  0xc7, 0x7c, 0x42, 0x99, 0x0c, 0x46, 0xf1, 0x03, 0x5a, 0x6c, 0x9c, 0x99,
-  0x4e, 0x06, 0x33, 0xee, 0x70, 0x8f, 0xdc, 0x7b, 0x63, 0x22, 0x59, 0x4d,
-  0x99, 0xd0, 0xa5, 0x66, 0x0f, 0x34, 0x32, 0x77, 0x7e, 0xaf, 0x25, 0x70,
-  0x90, 0xae, 0x70, 0x0b, 0xd1, 0xb8, 0x38, 0xcf, 0x00, 0x3a, 0x46, 0xdf,
-  0xc5, 0x82, 0x06, 0x03, 0x99, 0x2c, 0x11, 0xbd, 0xfa, 0x31, 0xf2, 0x77,
-  0xa7, 0xdd, 0x05, 0x94, 0x3e, 0xf5, 0xe8, 0x16, 0x29, 0x70, 0xb9, 0xa7,
-  0xae, 0x51, 0x3b, 0xfb, 0xbe, 0x26, 0xd4, 0x6e, 0xb5, 0x6b, 0x1c, 0xe1,
-  0x1b, 0x49, 0xcf, 0x68, 0x2e, 0xf1, 0x26, 0xff, 0x45, 0xfe, 0xa6, 0xb6,
-  0xf8, 0x94, 0xe5, 0xa1, 0xb5, 0x17, 0x17, 0xe2, 0x98, 0x15, 0x05, 0x95,
-  0xb7, 0xe9, 0x3a, 0x67, 0xc0, 0x8e, 0x5e, 0x42, 0xb8, 0x85, 0xd4, 0xf9,
-  0xc8, 0x4e, 0x20, 0x23, 0x3c, 0xe1, 0xf4, 0xf9, 0x20, 0x3e, 0x1f, 0x28,
-  0xc5, 0xb8, 0xb8, 0xd8, 0xf9, 0xda, 0x35, 0x81, 0xf4, 0xe2, 0x37, 0x4b,
-  0x34, 0x29, 0xa7, 0x1d, 0x93, 0x9d, 0x26, 0xc1, 0xbb, 0xf0, 0x20, 0xfd,
-  0x38, 0x7a, 0x09, 0x89, 0x17, 0x77, 0x6b, 0xd3, 0x4e, 0x65, 0x5f, 0xfb,
-  0x2f, 0x92, 0x81, 0x31, 0xe7, 0x1a, 0x44, 0xe0, 0xaf, 0x92, 0x80, 0x0f,
-  0x73, 0x3f, 0x1d, 0x05, 0x17, 0x77, 0x6d, 0x75, 0x22, 0x4f, 0x65, 0x0b,
-  0x6e, 0xa3, 0x54, 0x01, 0x03, 0xc6, 0xb4, 0x21, 0x94, 0x15, 0x42, 0x4b,
-  0x70, 0x6c, 0xb7, 0x17, 0x19, 0x69, 0x45, 0x5b, 0xa7, 0x1c, 0xbc, 0x4c,
-  0xce, 0x5f, 0xfd, 0x20, 0x22, 0x73, 0x95, 0xfb, 0xe9, 0x0b, 0x0b, 0xa3,
-  0x31, 0x46, 0x05, 0x41, 0x7a, 0x72, 0x81, 0xc7, 0x89, 0xa3, 0x88, 0xc3,
-  0xe4, 0xe6, 0xd6, 0xf3, 0x92, 0x08, 0xcc, 0x94, 0x77, 0x67, 0xed, 0xb9,
-  0x3c, 0x0d, 0x19, 0x61, 0xfa, 0xf6, 0xe5, 0x4f, 0xf2, 0x13, 0x9a, 0x1b,
-  0xf3, 0x8f, 0xe6, 0x66, 0x39, 0x1f, 0x9b, 0x75, 0x2d, 0x9a, 0x2f, 0x7b,
-  0x1c, 0x86, 0xbd, 0x92, 0x69, 0x5d, 0x6b, 0x6f, 0xb5, 0x37, 0x5a, 0x6b,
-  0xd2, 0xd0, 0x7c, 0xbf, 0x0d, 0xbe, 0xea, 0xb1, 0x63, 0x3b, 0x68, 0xee,
-  0x9d, 0xd9, 0x9e, 0x3f, 0xbd, 0xf9, 0xeb, 0x4f, 0xcf, 0x1e, 0x3d, 0x4e,
-  0x3f, 0x4b, 0x27, 0x4f, 0xaf, 0x3e, 0x4f, 0x9f, 0x4c, 0x9f, 0x7c, 0xf6,
-  0x6c, 0xff, 0xf3, 0x27, 0xe9, 0x67, 0x8f, 0xaf, 0xd2, 0xa7, 0x7b, 0xd9,
-  0xde, 0xb3, 0xab, 0xfd, 0x47, 0xd3, 0xe9, 0x55, 0xf6, 0xf9, 0xf4, 0xb3,
-  0xb4, 0x37, 0x84, 0xf9, 0xa5, 0x5d, 0x0e, 0x45, 0xad, 0x84, 0xe0, 0x4c,
-  0xef, 0x47, 0xaf, 0x0f, 0x07, 0x7b, 0xc9, 0x4d, 0xf6, 0x49, 0x0f, 0x18,
-  0x3b, 0x37, 0x2d, 0x36, 0x29, 0x13, 0x3f, 0xce, 0x6a, 0x1b, 0x5b, 0xd3,
-  0xa9, 0x08, 0x5b, 0x4a, 0xbe, 0x12, 0x68, 0xc0, 0x3c, 0x79, 0x3a, 0x9b,
-  0x8c, 0x3e, 0xb2, 0x6b, 0x76, 0xa0, 0x0e, 0x7c, 0x1a, 0x57, 0xf7, 0xf0,
-  0x9f, 0x9a, 0x77, 0x66, 0x6f, 0xd2, 0x89, 0x51, 0x92, 0xcc, 0x8c, 0xc8,
-  0x83, 0x23, 0x63, 0xda, 0x1a, 0x31, 0xdd, 0x4f, 0xe4, 0x2f, 0xe4, 0x30,
-  0xf6, 0xda, 0xf8, 0xa6, 0x2a, 0x97, 0x8b, 0xf3, 0x72, 0x96, 0x4f, 0xee,
-  0xd6, 0x35, 0xe7, 0x3f, 0xd6, 0xfa, 0xc5, 0x31, 0x8b, 0xf0, 0xbc, 0xce,
-  0xfe, 0x85, 0xa6, 0x95, 0x27, 0x8e, 0x1f, 0x60, 0x5b, 0x0d, 0x26, 0xf9,
-  0xe2, 0x86, 0x02, 0xbf, 0xcf, 0x81, 0x85, 0xa2, 0x38, 0x0d, 0xff, 0x20,
-  0x6e, 0x53, 0x8d, 0xe4, 0x28, 0xd6, 0xb2, 0x9e, 0xfa, 0xb6, 0x68, 0x5c,
-  0xb9, 0x26, 0x0a, 0xa9, 0x9b, 0x4a, 0xf0, 0x77, 0x79, 0xe0, 0xc7, 0x73,
-  0x1f, 0xe2, 0x63, 0xae, 0xda, 0x36, 0x3b, 0x2f, 0xe4, 0x57, 0xc3, 0xe4,
-  0x02, 0xa1, 0xf3, 0xe5, 0x82, 0x71, 0xe0, 0xf0, 0xf4, 0xf2, 0xef, 0x3a,
-  0xcd, 0xa1, 0xf3, 0xb2, 0x63, 0xd8, 0x10, 0x31, 0x33, 0xfa, 0xee, 0xe2,
-  0xf4, 0xa0, 0x3b, 0x4f, 0x48, 0xc9, 0xa8, 0x0f, 0x76, 0x76, 0x10, 0xff,
-  0xb9, 0x49, 0x3f, 0x7d, 0x1a, 0xd6, 0xd9, 0xce, 0xb4, 0x9c, 0xd4, 0x3b,
-  0x75, 0x3d, 0xd3, 0xd9, 0x68, 0x67, 0x48, 0xfd, 0x0e, 0xde, 0xdc, 0x72,
-  0x0e, 0x69, 0x95, 0x4d, 0x07, 0x75, 0x1d, 0xc0, 0x85, 0x46, 0x47, 0x0a,
-  0x46, 0x38, 0x2e, 0x18, 0x78, 0x8c, 0x7b, 0x6e, 0x60, 0x66, 0x77, 0x34,
-  0x7a, 0x9d, 0xe8, 0xcb, 0x98, 0x5e, 0x0b, 0x90, 0xb1, 0x50, 0x9d, 0x7e,
-  0x44, 0x0d, 0x4b, 0x45, 0x60, 0x7f, 0xe1, 0x3b, 0x74, 0x48, 0x9d, 0x2e,
-  0xf9, 0x0f, 0x41, 0xf8, 0xe7, 0xcd, 0x5a, 0xb0, 0xd3, 0xd3, 0x8e, 0x03,
-  0xc4, 0x0e, 0x22, 0x0e, 0x08, 0x50, 0x27, 0x58, 0x9a, 0xb8, 0x27, 0x9d,
-  0x47, 0xa8, 0x9b, 0xc2, 0x6b, 0x76, 0xef, 0x75, 0x59, 0x99, 0xcb, 0x63,
-  0x5e, 0xc7, 0xbc, 0xa0, 0x7a, 0xca, 0x6b, 0xf5, 0xf6, 0xd6, 0xe4, 0xaa,
-  0x65, 0xaf, 0xec, 0xb2, 0xf0, 0x3e, 0x60, 0x96, 0x12, 0x58, 0xaf, 0xa1,
-  0x5d, 0xb0, 0x78, 0xb0, 0x4b, 0x97, 0xaf, 0xe3, 0x47, 0x13, 0x47, 0x5a,
-  0x02, 0x79, 0x5e, 0x78, 0x51, 0x10, 0x5c, 0xca, 0xa6, 0xcb, 0xfd, 0x58,
-  0xef, 0xb0, 0xce, 0x55, 0x86, 0x8b, 0x82, 0x14, 0x89, 0xaa, 0x2a, 0x3d,
-  0xcd, 0x76, 0xf0, 0x2d, 0x2c, 0x4c, 0x73, 0x45, 0xe6, 0xd7, 0x1a, 0x70,
-  0xef, 0x1e, 0x5f, 0xd9, 0xfe, 0x74, 0xc1, 0x34, 0x80, 0x79, 0x4a, 0xe6,
-  0x2c, 0x5d, 0x09, 0xe6, 0x08, 0x30, 0xe4, 0x44, 0x60, 0x6c, 0x0c, 0x13,
-  0x6a, 0x25, 0x0c, 0x07, 0xc7, 0x81, 0xd2, 0x23, 0xdc, 0xe3, 0x04, 0xaf,
-  0xd2, 0xc3, 0x89, 0xe6, 0xc5, 0x87, 0xe1, 0x76, 0x67, 0x42, 0xaa, 0x19,
-  0xdc, 0x05, 0xe6, 0x99, 0xee, 0x25, 0x0b, 0x64, 0xa2, 0x55, 0xfc, 0x62,
-  0xd9, 0x80, 0xdd, 0xf1, 0x28, 0x4a, 0x59, 0xa7, 0x37, 0x47, 0xfe, 0x69,
-  0x0a, 0x08, 0x74, 0xec, 0x62, 0x2f, 0xbd, 0xb0, 0x2d, 0x35, 0x18, 0x84,
-  0x71, 0x38, 0x09, 0x0d, 0xd0, 0x74, 0x4d, 0xea, 0x80, 0x61, 0x64, 0xc4,
-  0x90, 0xb9, 0xf5, 0x08, 0x9c, 0x4b, 0x59, 0xc7, 0xb3, 0xd2, 0x69, 0x59,
-  0x66, 0xf7, 0x19, 0x81, 0x88, 0xc4, 0xad, 0x61, 0x20, 0xbc, 0x39, 0x7d,
-  0x83, 0x81, 0x28, 0x9c, 0x86, 0xc4, 0x57, 0xb8, 0x7a, 0x3f, 0x66, 0xb0,
-  0x34, 0x39, 0x6a, 0xee, 0x84, 0x1a, 0xad, 0x5f, 0xcc, 0x3f, 0x24, 0x00,
-  0x66, 0xce, 0x09, 0xcb, 0x91, 0xed, 0x28, 0xf9, 0x71, 0x8c, 0xc7, 0x56,
-  0xf7, 0x76, 0x5d, 0xf6, 0xa5, 0xa9, 0x19, 0xc5, 0xc4, 0x2b, 0xe9, 0x63,
-  0x77, 0x47, 0xd9, 0xdc, 0xb7, 0x96, 0x45, 0x92, 0xd6, 0x0e, 0xd6, 0x5c,
-  0x87, 0xd1, 0x4b, 0x37, 0x99, 0x31, 0x13, 0x36, 0x80, 0x88, 0xa3, 0x23,
-  0x55, 0xa6, 0x5f, 0x28, 0xca, 0x6e, 0xa7, 0xb4, 0x1f, 0x83, 0xd0, 0xa1,
-  0x63, 0x61, 0xd0, 0x5e, 0x07, 0x14, 0x0e, 0x6d, 0x57, 0x39, 0x7e, 0xe3,
-  0x65, 0xee, 0x01, 0xb8, 0x71, 0x4a, 0x8b, 0x00, 0xf1, 0x17, 0xb2, 0xfd,
-  0x9c, 0xec, 0x96, 0xae, 0x2b, 0xbb, 0x98, 0xcc, 0x4a, 0x85, 0x91, 0x9b,
-  0xf7, 0x39, 0x13, 0x71, 0x48, 0x01, 0x49, 0x76, 0x84, 0xc8, 0x0a, 0xc8,
-  0x2f, 0xfa, 0x22, 0x2b, 0xae, 0x54, 0x97, 0xe8, 0x36, 0xc7, 0x76, 0x69,
-  0x37, 0x6b, 0xd7, 0x19, 0x8f, 0x07, 0x49, 0xf2, 0xd3, 0x4f, 0xfd, 0x84,
-  0x8c, 0xe2, 0x9f, 0x1a, 0xf3, 0x3f, 0xb3, 0xd1, 0x7e, 0xe2, 0xc4, 0x8d,
-  0x9f, 0x3e, 0x1a, 0x33, 0xaf, 0x1b, 0x20, 0x48, 0x27, 0x1f, 0xea, 0x19,
-  0x45, 0x8a, 0x58, 0xad, 0x6e, 0x7b, 0xe0, 0x38, 0x4b, 0x14, 0xf9, 0x60,
-  0x1c, 0x0e, 0xf1, 0x81, 0x60, 0x50, 0x2c, 0x43, 0x97, 0xe1, 0x72, 0x5e,
-  0x88, 0x35, 0xc2, 0xfb, 0x10, 0x47, 0x1c, 0x72, 0x7f, 0xf3, 0x8f, 0x9b,
-  0x6e, 0xcf, 0xf4, 0xd5, 0x9b, 0xdf, 0xa8, 0x5c, 0x8d, 0x1c, 0x27, 0x3d,
-  0xf8, 0x9a, 0x53, 0x09, 0xf3, 0x92, 0x43, 0xa3, 0x46, 0x6e, 0x9e, 0x91,
-  0x2b, 0x9d, 0x33, 0x63, 0x4a, 0x67, 0x29, 0x52, 0x82, 0xd0, 0xe2, 0xe6,
-  0xae, 0x26, 0xd4, 0x46, 0x4c, 0xda, 0x84, 0xa7, 0x64, 0xb8, 0x52, 0xc8,
-  0x35, 0x0a, 0x02, 0x82, 0x8d, 0x45, 0xbb, 0xa0, 0x25, 0x22, 0x4d, 0x77,
-  0x36, 0x07, 0x9b, 0x36, 0xf0, 0x25, 0x48, 0x99, 0x00, 0x5c, 0xac, 0x12,
-  0xc1, 0x03, 0x1f, 0x06, 0x9f, 0xf4, 0x00, 0x71, 0xa5, 0x0f, 0x77, 0x74,
-  0xf9, 0xbe, 0x94, 0xb0, 0xa7, 0xd1, 0x7b, 0xf9, 0xbe, 0xc8, 0x99, 0x88,
-  0x77, 0x09, 0xb0, 0x48, 0x20, 0x2b, 0xb4, 0x01, 0xb8, 0x3e, 0x5c, 0x2c,
-  0x68, 0x30, 0x00, 0xf5, 0xc2, 0x82, 0xe9, 0x12, 0x68, 0x77, 0x00, 0x71,
-  0x70, 0x47, 0xc9, 0x31, 0x8b, 0x00, 0x9b, 0xa6, 0x50, 0x40, 0xcd, 0x3f,
-  0xa5, 0x83, 0x4c, 0x39, 0xfa, 0xb7, 0x85, 0xe4, 0x58, 0x8f, 0x4a, 0xb8,
-  0x60, 0x26, 0xc0, 0x2e, 0x08, 0x50, 0x46, 0xd2, 0x6c, 0x22, 0x26, 0x1f,
-  0x5d, 0x76, 0x81, 0xc2, 0x43, 0xfd, 0x79, 0x91, 0xf4, 0x56, 0xab, 0x3d,
-  0xbd, 0xee, 0x1b, 0x40, 0x40, 0x3a, 0x7f, 0xa6, 0xa4, 0x10, 0xa3, 0x23,
-  0x5b, 0x02, 0xa1, 0x1b, 0xfc, 0x9d, 0xf1, 0xb1, 0x9c, 0xe5, 0x22, 0x57,
-  0xe9, 0x36, 0x03, 0x84, 0xeb, 0x00, 0x21, 0x53, 0x79, 0xf8, 0x2a, 0x6f,
-  0x7f, 0x38, 0x84, 0x52, 0x0e, 0x2f, 0x37, 0x6e, 0x29, 0xbe, 0xd5, 0xbc,
-  0xa7, 0xbb, 0xf2, 0xc7, 0xbe, 0x4d, 0x20, 0x7c, 0xfa, 0x9e, 0x78, 0x9f,
-  0xf5, 0x8a, 0xb0, 0xb6, 0xc2, 0x62, 0x06, 0xea, 0x02, 0x85, 0xff, 0x43,
-  0xff, 0x09, 0x66, 0x67, 0x6f, 0xdb, 0x26, 0x8c, 0x81, 0x7f, 0x80, 0x91,
-  0xd9, 0xa2, 0x12, 0xf4, 0x6e, 0x4a, 0x46, 0x11, 0xf5, 0x0e, 0x28, 0x97,
-  0x89, 0x81, 0xd1, 0x3c, 0x46, 0xcd, 0x0c, 0xef, 0x34, 0x07, 0x8c, 0xd6,
-  0xeb, 0xb3, 0x37, 0xc7, 0x6d, 0x04, 0x2e, 0x7e, 0x12, 0xf3, 0xb4, 0x1a,
-  0x79, 0xf5, 0xca, 0xc8, 0x17, 0xde, 0x03, 0x69, 0xa0, 0xba, 0xf1, 0xde,
-  0x32, 0xdd, 0xba, 0xce, 0x9a, 0xc5, 0xed, 0x32, 0x9f, 0x6e, 0x6d, 0xd3,
-  0x1e, 0x21, 0xfc, 0xfd, 0x00, 0x69, 0x1f, 0x6c, 0x00, 0xd6, 0xc9, 0x16,
-  0x6b, 0xe3, 0x55, 0xd6, 0x2c, 0xab, 0x82, 0xbd, 0xe3, 0xd4, 0xf7, 0x30,
-  0xd8, 0x2d, 0x57, 0x9a, 0xef, 0x09, 0x10, 0x1a, 0x11, 0x06, 0x2f, 0x71,
-  0x83, 0xdb, 0x24, 0x04, 0x14, 0x1a, 0x81, 0x85, 0xc7, 0x58, 0x82, 0x7b,
-  0xca, 0x9f, 0x89, 0xe4, 0xf0, 0xfc, 0xfc, 0xe5, 0xe1, 0xe5, 0xa1, 0x1d,
-  0x1b, 0x2e, 0x62, 0x48, 0x16, 0xa8, 0xc3, 0x46, 0x24, 0x91, 0x76, 0x44,
-  0x4f, 0x6e, 0xfe, 0xe9, 0xdd, 0xe8, 0xf8, 0xa2, 0xbb, 0xb0, 0xe7, 0x17,
-  0x67, 0xc4, 0xd1, 0xf2, 0xa7, 0x9f, 0x0e, 0x29, 0x86, 0x2e, 0x11, 0xc0,
-  0x97, 0x69, 0x93, 0x6e, 0x06, 0xa7, 0x7a, 0x7f, 0x9b, 0xfa, 0x77, 0x6b,
-  0xfb, 0x77, 0x25, 0x97, 0x19, 0x4c, 0xfa, 0xe4, 0x3d, 0x2d, 0x68, 0x35,
-  0x51, 0xf8, 0xad, 0x9d, 0x0d, 0x4c, 0x00, 0xd0, 0xb3, 0xab, 0x07, 0x52,
-  0x3a, 0x49, 0xa6, 0x10, 0x32, 0x9d, 0xac, 0x99, 0xb1, 0xa7, 0xb3, 0xc9,
-  0xb2, 0xd1, 0x2d, 0x8f, 0xfd, 0x45, 0x89, 0xad, 0xdd, 0x79, 0x09, 0x96,
-  0xc7, 0x45, 0x4c, 0x58, 0x0a, 0x20, 0xaf, 0xda, 0x6c, 0x34, 0x40, 0xa4,
-  0x87, 0xd2, 0x5b, 0x96, 0x62, 0x31, 0x88, 0x42, 0xc6, 0x31, 0x14, 0xe4,
-  0x59, 0x73, 0x97, 0x82, 0x09, 0xf9, 0xa3, 0x39, 0x8d, 0x83, 0xe4, 0x58,
-  0x12, 0x80, 0x30, 0x70, 0xf3, 0x83, 0xe0, 0xa1, 0xc6, 0xda, 0x0a, 0x22,
-  0xec, 0xe3, 0xb2, 0xc2, 0xe3, 0x1e, 0xe8, 0x75, 0x95, 0x67, 0xce, 0xf6,
-  0x33, 0x0f, 0x51, 0xb7, 0x69, 0xd2, 0x61, 0x2a, 0xf5, 0x22, 0x60, 0xa7,
-  0x41, 0x7a, 0x4d, 0xdb, 0xcb, 0x3c, 0x6a, 0xb4, 0x68, 0x63, 0x21, 0xd1,
-  0xbf, 0x76, 0xf6, 0x86, 0xbb, 0xbd, 0xb0, 0xf3, 0x74, 0x58, 0xc0, 0x1b,
-  0x61, 0x43, 0x68, 0x24, 0x0d, 0x9b, 0xb2, 0xbc, 0xb7, 0x7f, 0x2c, 0xc2,
-  0x8c, 0x1e, 0xba, 0x30, 0xed, 0x47, 0xbb, 0x32, 0x38, 0x0b, 0xf0, 0xc5,
-  0x84, 0xd8, 0xad, 0x54, 0x28, 0x1a, 0x99, 0x58, 0x94, 0xb7, 0x34, 0x12,
-  0xb3, 0xd5, 0x66, 0xb3, 0x16, 0xc1, 0x47, 0x2f, 0x3e, 0xcd, 0x05, 0xb8,
-  0x74, 0xb2, 0xee, 0x6c, 0x47, 0xc3, 0xd4, 0xaa, 0x64, 0xfa, 0x9a, 0x9c,
-  0x05, 0xbb, 0xc2, 0x64, 0xb4, 0x3b, 0xc1, 0xcf, 0xaf, 0x36, 0x52, 0x2e,
-  0x90, 0x7b, 0x33, 0x1f, 0x86, 0x31, 0x50, 0x2c, 0xc8, 0x80, 0x1a, 0x21,
-  0xed, 0xf3, 0x39, 0xa7, 0xef, 0x06, 0x86, 0xfb, 0x9b, 0xf4, 0x53, 0x3e,
-  0x5f, 0xce, 0xf1, 0x31, 0xda, 0xdb, 0xf2, 0x98, 0x04, 0x0f, 0xe0, 0x42,
-  0x64, 0x2c, 0x0a, 0x36, 0xf9, 0x66, 0x9d, 0x78, 0xe6, 0x7b, 0xec, 0x92,
-  0x31, 0x57, 0xf2, 0xd0, 0x0d, 0xaf, 0x00, 0x82, 0x93, 0xa2, 0x0b, 0x75,
-  0xc7, 0xf4, 0x37, 0xda, 0x42, 0x4a, 0x00, 0x83, 0xba, 0xb4, 0xc8, 0x9c,
-  0x88, 0x38, 0xe7, 0xfc, 0x71, 0xd1, 0xe1, 0x3c, 0xa4, 0x6a, 0x56, 0xe5,
-  0xe5, 0xd4, 0x9e, 0x1b, 0x52, 0x12, 0xf3, 0x62, 0x69, 0xe6, 0x99, 0x1d,
-  0xc7, 0x8d, 0x85, 0xc0, 0x07, 0x00, 0x07, 0xa0, 0xea, 0x47, 0x48, 0x96,
-  0x50, 0xf0, 0xe9, 0x67, 0xc3, 0x47, 0xfb, 0xc3, 0xdd, 0x7e, 0xcb, 0x7a,
-  0x97, 0x34, 0x7b, 0x73, 0xba, 0x26, 0xf9, 0xdc, 0xa6, 0xe0, 0x0d, 0xff,
-  0x65, 0x5e, 0x1a, 0x4a, 0x3e, 0x1c, 0xcc, 0xd3, 0x4f, 0x58, 0xbe, 0xe8,
-  0xb2, 0x96, 0xc9, 0xf3, 0xd7, 0x67, 0xa3, 0xcb, 0xbd, 0x83, 0xf3, 0xb3,
-  0x0b, 0xf3, 0x5f, 0xfa, 0xfb, 0x3e, 0xfe, 0xbe, 0x1f, 0x58, 0x8f, 0xaf,
-  0x04, 0x3b, 0xab, 0xc9, 0x3a, 0xd0, 0x50, 0xa0, 0xd1, 0xf0, 0x6c, 0x26,
-  0x5e, 0x43, 0xe4, 0x2f, 0x85, 0x18, 0x9c, 0xd8, 0x14, 0xaf, 0xee, 0x12,
-  0x7b, 0x9f, 0x52, 0x00, 0x9d, 0x3a, 0x1a, 0x7c, 0x80, 0x60, 0xde, 0xa8,
-  0x36, 0x25, 0xe9, 0xc1, 0x9a, 0x78, 0xdc, 0x75, 0xd1, 0x72, 0x6a, 0xa7,
-  0xe4, 0xe7, 0x28, 0x85, 0x17, 0x80, 0x60, 0xed, 0x5f, 0x4d, 0x66, 0x46,
-  0xd3, 0xcf, 0x08, 0x38, 0x32, 0xcd, 0x38, 0x9a, 0x42, 0x3f, 0x89, 0x19,
-  0x20, 0xe6, 0xf8, 0x49, 0xc2, 0x42, 0x17, 0x4e, 0xc8, 0x3b, 0x52, 0x43,
-  0x38, 0xa6, 0x37, 0xa6, 0x8f, 0x79, 0x7d, 0x23, 0xd3, 0x51, 0x64, 0x4d,
-  0xb7, 0x39, 0xa6, 0xd6, 0xf2, 0x3d, 0x56, 0xc8, 0x5b, 0x46, 0x06, 0xf2,
-  0xdb, 0xb3, 0xcb, 0x24, 0xbd, 0xba, 0xd2, 0x74, 0x69, 0xca, 0x48, 0x20,
-  0x8d, 0x75, 0x67, 0xc1, 0x37, 0x19, 0x42, 0xd1, 0xa1, 0xe4, 0x63, 0x7d,
-  0xe4, 0xf2, 0x74, 0xb4, 0x43, 0xfe, 0x2a, 0x46, 0xbc, 0x8d, 0xde, 0x9e,
-  0xf4, 0x5b, 0x1e, 0x69, 0x1f, 0xe7, 0xb2, 0x4d, 0x37, 0x65, 0x5c, 0xa1,
-  0x48, 0xbd, 0xbb, 0xd0, 0x91, 0x70, 0x10, 0x82, 0x0e, 0x4b, 0xda, 0x13,
-  0x67, 0x48, 0x0f, 0x4b, 0xdb, 0x4b, 0x34, 0x44, 0x0a, 0xfb, 0x77, 0xbe,
-  0x08, 0xf1, 0x69, 0xf0, 0xc5, 0xf6, 0x41, 0x4d, 0x41, 0x4a, 0x47, 0x8f,
-  0x6c, 0x12, 0x1a, 0x16, 0x86, 0xd4, 0x1b, 0x72, 0xb3, 0xfb, 0x3d, 0xb4,
-  0x8a, 0x46, 0xcd, 0xdf, 0xa9, 0x4d, 0x6c, 0xda, 0x71, 0x16, 0x03, 0xf6,
-  0xf3, 0x87, 0xbc, 0xc6, 0x13, 0xdb, 0xbc, 0xe9, 0x98, 0xcd, 0x53, 0xd3,
-  0xdd, 0x41, 0x02, 0xa6, 0xac, 0xf2, 0x6b, 0x02, 0x05, 0x74, 0x53, 0xc7,
-  0x5c, 0x47, 0x02, 0x37, 0x14, 0x29, 0x63, 0x75, 0xd3, 0xf3, 0x5c, 0x06,
-  0x4d, 0x00, 0xcd, 0x07, 0x48, 0xb4, 0x52, 0x7b, 0x46, 0xbb, 0x43, 0xf2,
-  0xa7, 0x89, 0xe8, 0xf1, 0xac, 0xec, 0x99, 0xd1, 0xd1, 0xbd, 0xe3, 0x22,
-  0x3e, 0x9a, 0xfa, 0xa3, 0x67, 0x09, 0xe4, 0x20, 0x27, 0x8d, 0x0a, 0x70,
-  0x8e, 0x11, 0x75, 0x9b, 0x63, 0x12, 0x2b, 0x23, 0x11, 0x34, 0xdb, 0xa3,
-  0xb7, 0xb7, 0xff, 0xd9, 0x70, 0xd7, 0xfc, 0x3f, 0xb3, 0x28, 0xa2, 0x1f,
-  0x31, 0x85, 0x0e, 0x33, 0x9f, 0xf0, 0xa7, 0xf8, 0xe9, 0x48, 0xdc, 0x4d,
-  0xef, 0xa0, 0xb2, 0xba, 0xee, 0xc5, 0xe1, 0x4f, 0x32, 0xe8, 0xd6, 0xad,
-  0x42, 0x6b, 0x69, 0x6f, 0x94, 0x74, 0x2a, 0x3f, 0xd1, 0x63, 0x5e, 0x2d,
-  0x67, 0x11, 0x18, 0x9f, 0xe7, 0x36, 0x26, 0x05, 0x6d, 0xf6, 0x51, 0x9c,
-  0xc6, 0xaf, 0x49, 0x3c, 0x71, 0x2a, 0xdf, 0xb0, 0x05, 0x82, 0x7a, 0xd6,
-  0xf2, 0x01, 0x1e, 0x89, 0xd5, 0x06, 0xe1, 0x3c, 0x30, 0xe7, 0xe1, 0x79,
-  0x79, 0x75, 0x55, 0x67, 0x4d, 0xf7, 0x0e, 0x3a, 0x92, 0x47, 0x76, 0x2e,
-  0x40, 0xfb, 0xc6, 0x61, 0x1b, 0xc9, 0xb6, 0x49, 0xda, 0x64, 0x25, 0x89,
-  0xa0, 0xce, 0x58, 0x72, 0x71, 0x73, 0xc3, 0x48, 0x86, 0x81, 0xff, 0x7b,
-  0x45, 0x84, 0x70, 0xae, 0xb0, 0x52, 0x60, 0x20, 0xe3, 0x8a, 0xd9, 0x2d,
-  0xe4, 0xb2, 0xeb, 0x72, 0x55, 0xe9, 0xa9, 0xf8, 0x90, 0x2f, 0x16, 0x64,
-  0xe1, 0x30, 0xef, 0x13, 0x76, 0xae, 0x0d, 0x98, 0x21, 0x6e, 0x8b, 0xdd,
-  0xac, 0xe8, 0x40, 0xa3, 0x27, 0x4f, 0xe4, 0xda, 0x1f, 0x67, 0xe6, 0xd8,
-  0x66, 0xa1, 0xd6, 0x4e, 0xfd, 0xf1, 0xc8, 0x3e, 0x84, 0xa3, 0x60, 0x4a,
-  0xc4, 0x1e, 0x45, 0xaa, 0x52, 0xe6, 0xca, 0x4b, 0x83, 0x97, 0xfc, 0xbf,
-  0x18, 0x44, 0xd5, 0x65, 0x67, 0x59, 0x97, 0xdb, 0xe8, 0xe4, 0x7f, 0x1e,
-  0x3b, 0x6a, 0x16, 0xcb, 0x7d, 0xc2, 0xb9, 0x2e, 0xb1, 0xcc, 0x21, 0xb3,
-  0xa7, 0x06, 0x47, 0x66, 0xbd, 0x10, 0x63, 0xf2, 0xa0, 0x25, 0x65, 0x27,
-  0x17, 0x03, 0xa6, 0x0f, 0x29, 0x13, 0x50, 0x88, 0x76, 0x28, 0x1b, 0x3a,
-  0xb8, 0x1d, 0x98, 0xb9, 0x8f, 0x5d, 0x89, 0x32, 0x46, 0x1c, 0x90, 0x46,
-  0x12, 0xe7, 0xfc, 0x84, 0x13, 0xd1, 0x17, 0x77, 0xf2, 0x82, 0xb4, 0x46,
-  0xd6, 0x61, 0x82, 0x7c, 0x0c, 0x4d, 0x85, 0x65, 0x0e, 0x88, 0x65, 0xf3,
-  0x2f, 0x8c, 0x95, 0x54, 0xb4, 0x7f, 0x41, 0xee, 0xe5, 0x6d, 0xea, 0x09,
-  0x6f, 0x6a, 0x62, 0x30, 0x1c, 0xfc, 0xcd, 0x18, 0xda, 0xcf, 0xd5, 0x53,
-  0xb1, 0x2a, 0x59, 0x5a, 0xfd, 0x1a, 0x94, 0x3f, 0x01, 0x3b, 0x0c, 0x7b,
-  0xc3, 0xb2, 0x76, 0xe8, 0x54, 0xb3, 0x4b, 0x25, 0x85, 0x3a, 0x03, 0x7a,
-  0xc4, 0xae, 0xac, 0xbf, 0x02, 0x15, 0x88, 0xa5, 0x86, 0xf0, 0xd2, 0x27,
-  0x87, 0x14, 0x95, 0x9a, 0x71, 0x0b, 0x35, 0x03, 0x29, 0xa5, 0x0d, 0xb5,
-  0x1b, 0xf2, 0xe0, 0xda, 0xcd, 0x8b, 0xc1, 0x3c, 0x9b, 0x03, 0xe3, 0xcd,
-  0xcf, 0x22, 0x78, 0x46, 0x5c, 0x56, 0xb2, 0x1d, 0x79, 0x89, 0xd8, 0x12,
-  0x6f, 0x04, 0x48, 0x01, 0xcd, 0x16, 0x9f, 0x0d, 0x63, 0x8f, 0x65, 0xc1,
-  0x6e, 0x47, 0xf8, 0x0a, 0xf9, 0xe3, 0xe4, 0x22, 0xfb, 0x60, 0xd4, 0xe7,
-  0xa2, 0x4f, 0x3f, 0x45, 0x2e, 0xaa, 0x97, 0x98, 0x48, 0xdd, 0x6d, 0x32,
-  0x0e, 0x52, 0x64, 0x11, 0x75, 0xd6, 0x7b, 0x56, 0x1e, 0xf5, 0x3c, 0x29,
-  0x6f, 0xb3, 0x46, 0xa0, 0x22, 0xdc, 0x79, 0x4d, 0xcc, 0x42, 0x72, 0xd7,
-  0xc9, 0x55, 0xa7, 0x39, 0x90, 0x68, 0x65, 0x8d, 0xf3, 0x09, 0x41, 0xc0,
-  0x32, 0x67, 0x28, 0x33, 0x07, 0x91, 0xdb, 0xb3, 0x6f, 0x8e, 0x41, 0x4f,
-  0x5d, 0xb0, 0x3c, 0x82, 0x38, 0x54, 0x41, 0xbb, 0x43, 0x9e, 0xa2, 0x66,
-  0x1a, 0xdb, 0x93, 0xac, 0xfe, 0xea, 0x81, 0x14, 0x42, 0x35, 0x1f, 0xfe,
-  0x40, 0xd4, 0x50, 0x88, 0xd6, 0xbb, 0xaf, 0x29, 0x50, 0x85, 0x36, 0x7a,
-  0x37, 0x1d, 0xd7, 0x25, 0x96, 0x12, 0x64, 0xa6, 0x9a, 0xaa, 0x73, 0x44,
-  0x3b, 0x6a, 0xa4, 0xb0, 0x98, 0x46, 0xb7, 0x29, 0x76, 0x9a, 0x6d, 0x3f,
-  0x8f, 0x68, 0x21, 0x1e, 0xde, 0x71, 0x30, 0x76, 0xdb, 0xd9, 0x91, 0x8a,
-  0x44, 0x5d, 0xb3, 0xf2, 0x10, 0xed, 0x79, 0x73, 0xb1, 0x6c, 0x42, 0xb2,
-  0x48, 0x72, 0x29, 0x78, 0x3a, 0xec, 0xa4, 0xf0, 0x14, 0xde, 0xde, 0x94,
-  0x33, 0xb6, 0x8c, 0x83, 0x08, 0x8b, 0xcd, 0xfa, 0x05, 0xe5, 0x05, 0xc1,
-  0x78, 0xe1, 0x58, 0xfe, 0x08, 0x84, 0x70, 0x2b, 0x4a, 0x62, 0x54, 0xbc,
-  0x2c, 0xa5, 0x5c, 0x23, 0xc1, 0xc8, 0x27, 0x83, 0x8f, 0x61, 0x8e, 0xa4,
-  0x39, 0xe7, 0xe3, 0xb2, 0xb6, 0xfb, 0x85, 0x72, 0x6b, 0xe9, 0x06, 0xb9,
-  0x4d, 0x2b, 0x08, 0x66, 0xe1, 0x0e, 0x52, 0x5a, 0x45, 0x1f, 0x23, 0x48,
-  0xda, 0x60, 0x37, 0xbf, 0x21, 0xa7, 0x7c, 0x74, 0xb3, 0x4d, 0x8c, 0x0e,
-  0x40, 0x6e, 0x5a, 0xec, 0x1d, 0x6a, 0x52, 0x58, 0x81, 0x6e, 0x40, 0x10,
-  0x2a, 0x49, 0xeb, 0xe6, 0x1c, 0xde, 0xd0, 0xb5, 0x9e, 0x37, 0xcb, 0xb4,
-  0x79, 0x18, 0x40, 0x7b, 0x95, 0x6c, 0x62, 0xe1, 0xe4, 0x83, 0x19, 0x22,
-  0xa1, 0x04, 0x6c, 0xdb, 0x15, 0x51, 0x43, 0x7f, 0x21, 0x9f, 0xd3, 0x59,
-  0x5b, 0x21, 0x8f, 0xce, 0x41, 0x6f, 0x76, 0xd3, 0xe6, 0xc7, 0x41, 0x2a,
-  0xae, 0x5c, 0x23, 0x9a, 0xed, 0xc6, 0x4d, 0xe9, 0x2d, 0x7f, 0x12, 0x89,
-  0xe7, 0x23, 0xfe, 0x65, 0x7a, 0x31, 0xbb, 0x73, 0x0d, 0x7a, 0x59, 0xb2,
-  0x0a, 0xe4, 0xf6, 0xb8, 0xc3, 0xec, 0x17, 0x02, 0x70, 0x52, 0x6f, 0x64,
-  0x94, 0x6f, 0xfe, 0xe6, 0x41, 0x4f, 0xa9, 0x18, 0x2d, 0xb7, 0x8c, 0x08,
-  0x0f, 0x49, 0xd3, 0xb2, 0x69, 0x1e, 0xe2, 0xb3, 0xa7, 0x53, 0xdf, 0x6d,
-  0x8e, 0x78, 0x89, 0xf7, 0x5e, 0x7c, 0x77, 0x78, 0xfa, 0xee, 0x78, 0xef,
-  0x8b, 0x84, 0xfe, 0xb5, 0xcf, 0xff, 0xda, 0xef, 0xc5, 0x56, 0xc9, 0xc8,
-  0xa7, 0xcd, 0x17, 0x9b, 0x49, 0x7d, 0x37, 0x1f, 0x97, 0x33, 0xbb, 0x4e,
-  0x32, 0x15, 0x1a, 0x2a, 0xeb, 0xcb, 0xe5, 0x6d, 0x93, 0xb6, 0xc5, 0x43,
-  0xde, 0x95, 0xd4, 0xb5, 0x60, 0x0b, 0x55, 0xca, 0x20, 0x46, 0xe7, 0xa7,
-  0x0f, 0x37, 0xc8, 0xb0, 0x56, 0xd1, 0x25, 0xd1, 0xba, 0x55, 0x78, 0x4f,
-  0xdc, 0x45, 0x7a, 0x9e, 0xeb, 0x88, 0xc0, 0x10, 0xb2, 0x02, 0xde, 0xfd,
-  0xf0, 0x89, 0x8b, 0xd3, 0x92, 0x65, 0x45, 0x20, 0xf8, 0x8d, 0x58, 0xc2,
-  0x59, 0xb2, 0x34, 0xbc, 0xda, 0x02, 0xa9, 0xf2, 0x34, 0xb7, 0xc4, 0xd6,
-  0x76, 0x27, 0xf4, 0x03, 0x9b, 0x55, 0x66, 0xc5, 0x2e, 0x86, 0x1e, 0xc4,
-  0x1e, 0xe6, 0x63, 0xd1, 0x5a, 0x3c, 0xaa, 0xa2, 0x53, 0xda, 0x8c, 0x8a,
-  0xc3, 0xb0, 0x19, 0xa2, 0x15, 0x78, 0x14, 0x9c, 0x27, 0x23, 0xf1, 0x98,
-  0x70, 0x2d, 0xa7, 0x9e, 0x90, 0xd2, 0x79, 0x24, 0x9d, 0x70, 0xb5, 0x89,
-  0xa3, 0xd9, 0x41, 0x14, 0x9d, 0x1c, 0xa7, 0xb4, 0x07, 0x52, 0xed, 0x08,
-  0x59, 0xd2, 0x15, 0x9c, 0x46, 0xad, 0xac, 0x93, 0x2d, 0x23, 0xd7, 0xb7,
-  0xfb, 0x5e, 0x2c, 0x56, 0x17, 0x50, 0x5c, 0x12, 0x8d, 0x8d, 0x9a, 0xae,
-  0x88, 0x13, 0x5c, 0xde, 0xb4, 0x6e, 0x18, 0xd5, 0xf5, 0x34, 0xad, 0x99,
-  0x63, 0xb0, 0x72, 0x65, 0x70, 0x33, 0xbc, 0x51, 0x09, 0xa6, 0x39, 0x4b,
-  0x83, 0x39, 0xe3, 0xc4, 0x77, 0xa1, 0xc2, 0xa0, 0x88, 0xbe, 0xdd, 0xfa,
-  0xe6, 0xfb, 0x77, 0xb3, 0x6c, 0x5b, 0x8d, 0x02, 0xbd, 0xe5, 0x76, 0xde,
-  0x94, 0xff, 0x30, 0xfd, 0x4e, 0xe5, 0x23, 0xb1, 0xcb, 0x52, 0xee, 0xbe,
-  0x95, 0x3d, 0x77, 0x82, 0x85, 0x93, 0xc3, 0x7d, 0x71, 0xd1, 0xb2, 0x8b,
-  0x11, 0xe8, 0x25, 0x85, 0x0c, 0x98, 0xec, 0x60, 0xb5, 0x45, 0xad, 0x08,
-  0xae, 0x66, 0x11, 0x24, 0x88, 0xec, 0x24, 0x97, 0xa5, 0x40, 0x71, 0xec,
-  0x16, 0x93, 0xfb, 0xa6, 0x2b, 0xbb, 0xbb, 0xca, 0xd4, 0x8a, 0x1b, 0xe8,
-  0xf8, 0x53, 0x56, 0x4d, 0x88, 0x66, 0x62, 0x62, 0x14, 0x52, 0x08, 0xd2,
-  0x2b, 0x71, 0x4d, 0x51, 0x10, 0xce, 0xa6, 0x60, 0xf9, 0x1e, 0x35, 0xdc,
-  0xbb, 0xba, 0xd3, 0x56, 0x6e, 0x32, 0x80, 0x1c, 0x26, 0x66, 0x63, 0x0c,
-  0x2d, 0x23, 0x98, 0xde, 0x8c, 0x6d, 0x01, 0xa2, 0xb9, 0x64, 0x08, 0x25,
-  0x04, 0x20, 0x33, 0xcc, 0xb0, 0xbe, 0xe8, 0xad, 0xa6, 0x6c, 0x17, 0xf4,
-  0x85, 0xf9, 0x9d, 0x5c, 0x64, 0x88, 0xe8, 0x01, 0x40, 0x92, 0xb3, 0x1a,
-  0x87, 0x68, 0x57, 0x07, 0xdc, 0x1d, 0x88, 0x94, 0x14, 0x77, 0x4a, 0xad,
-  0xb3, 0x85, 0xfb, 0x92, 0xb5, 0x42, 0xa5, 0x60, 0x83, 0xca, 0x15, 0xa6,
-  0x20, 0xcf, 0xca, 0x5b, 0x8a, 0xbf, 0xb4, 0x09, 0x11, 0xe7, 0xe5, 0x94,
-  0xf7, 0xc3, 0xf8, 0xce, 0x52, 0xa7, 0x0f, 0x48, 0x49, 0xe2, 0xcf, 0x0e,
-  0x35, 0xe4, 0x18, 0xdd, 0x01, 0x9a, 0x51, 0xd9, 0x4d, 0x39, 0x4a, 0x5d,
-  0xc2, 0x51, 0xc3, 0x8e, 0x64, 0x56, 0x2c, 0x1c, 0x1b, 0x51, 0xec, 0x46,
-  0xc3, 0x88, 0xc7, 0x25, 0xd1, 0x5c, 0x5a, 0xc0, 0x29, 0x71, 0x9c, 0x91,
-  0x8f, 0xe7, 0x6a, 0xd9, 0x40, 0xfb, 0x57, 0xfb, 0xaf, 0x11, 0x4c, 0xb1,
-  0x38, 0x8a, 0x82, 0x58, 0xe3, 0x07, 0xe6, 0xc2, 0x2a, 0x1b, 0xe5, 0x39,
-  0x15, 0x0e, 0xc0, 0x06, 0x79, 0x9d, 0xa4, 0x6c, 0xc2, 0xfa, 0x05, 0xe5,
-  0x9a, 0xf9, 0x2e, 0xa1, 0x92, 0xea, 0x9a, 0xe8, 0xb5, 0x80, 0x3f, 0x0d,
-  0xa8, 0x35, 0x30, 0xd5, 0x84, 0xac, 0x71, 0x8b, 0xba, 0xc5, 0xe4, 0x37,
-  0xe8, 0x85, 0x48, 0x13, 0xe2, 0xc4, 0x80, 0xc1, 0x3e, 0xd6, 0x77, 0xea,
-  0x6d, 0xf2, 0x63, 0x44, 0x40, 0x97, 0x2d, 0xe5, 0x75, 0xc5, 0xa1, 0xfd,
-  0xa7, 0x2d, 0x9a, 0xc0, 0xc2, 0xab, 0x6a, 0xe6, 0x14, 0x05, 0x2b, 0xab,
-  0x45, 0xc1, 0x63, 0xca, 0x43, 0xe1, 0x95, 0xba, 0xf8, 0x1b, 0x4c, 0x8a,
-  0xee, 0x28, 0x16, 0x53, 0xe8, 0x7c, 0xfa, 0x0e, 0xb4, 0x24, 0x8f, 0x1b,
-  0xb0, 0x2e, 0xe5, 0x44, 0xa2, 0x79, 0x12, 0x34, 0x4e, 0xd2, 0xc4, 0x48,
-  0x72, 0xba, 0x32, 0xc0, 0x0f, 0xb0, 0xb4, 0xa8, 0xab, 0xd8, 0x87, 0x33,
-  0xf7, 0xe5, 0x83, 0x79, 0x11, 0x57, 0xf0, 0xc0, 0xec, 0xff, 0x3a, 0x16,
-  0xa8, 0xd4, 0x6b, 0xdc, 0x48, 0xf9, 0xbf, 0x2d, 0x8b, 0x49, 0xe7, 0x9a,
-  0x2a, 0xfb, 0x1e, 0x45, 0xa1, 0x44, 0x65, 0xed, 0x2d, 0xd1, 0xdd, 0xf8,
-  0xf8, 0x90, 0xd0, 0xdf, 0x50, 0xf2, 0x27, 0xa5, 0x6a, 0xd0, 0x15, 0x37,
-  0xf3, 0xd2, 0x44, 0x6f, 0x72, 0xb3, 0x42, 0xd5, 0xe4, 0x06, 0x1c, 0x02,
-  0xf0, 0x23, 0x65, 0xea, 0x1c, 0x8d, 0xe3, 0x8c, 0xa4, 0x59, 0xd1, 0xc8,
-  0x72, 0x12, 0x49, 0xc4, 0x12, 0x52, 0x16, 0x2a, 0xa8, 0x57, 0xf5, 0x33,
-  0x84, 0x71, 0xdd, 0xd0, 0x9c, 0x67, 0xb3, 0x3a, 0xb3, 0xe8, 0x0f, 0xfb,
-  0x8e, 0xbb, 0x2b, 0x61, 0x81, 0x17, 0xf0, 0xc9, 0x72, 0x3e, 0x50, 0x1e,
-  0x3d, 0xe5, 0xe8, 0x89, 0x51, 0x76, 0xa4, 0x33, 0x64, 0x54, 0xd2, 0x3e,
-  0xb9, 0x53, 0x8e, 0x19, 0x69, 0x41, 0x77, 0x9d, 0x72, 0xcc, 0x04, 0xb7,
-  0x4f, 0x69, 0xe7, 0x4d, 0x78, 0x5b, 0x74, 0xaa, 0x72, 0xa5, 0xa0, 0xe6,
-  0xad, 0x42, 0x5e, 0x0c, 0xd3, 0x1b, 0x2e, 0x8d, 0x40, 0xf1, 0xaf, 0xc1,
-  0xe0, 0xaa, 0x59, 0x0c, 0xa2, 0x4b, 0x80, 0xb5, 0x6e, 0x6f, 0x81, 0xd9,
-  0x95, 0x70, 0xf4, 0xbc, 0x51, 0x7a, 0xb2, 0x8f, 0x94, 0xb0, 0x93, 0x9c,
-  0xbe, 0x62, 0x2f, 0xde, 0xd1, 0x05, 0xfd, 0x2d, 0xb7, 0x0c, 0x45, 0x43,
-  0x1c, 0x0a, 0xaa, 0x75, 0xc0, 0xe9, 0xeb, 0x6f, 0xbe, 0xeb, 0xe6, 0x5c,
-  0x6e, 0x9d, 0x8d, 0x76, 0x1e, 0x3d, 0xdb, 0xdd, 0x8e, 0x00, 0x94, 0xcd,
-  0x37, 0x1c, 0x75, 0xdb, 0x67, 0xc3, 0xc7, 0xbb, 0xc3, 0xdd, 0xed, 0x4e,
-  0x6f, 0x68, 0xba, 0xd7, 0x50, 0xa7, 0x28, 0xe1, 0xb4, 0xbd, 0x38, 0x00,
-  0x3a, 0xb6, 0xec, 0x24, 0x0a, 0x92, 0xf6, 0x33, 0x47, 0x2f, 0xb2, 0x8f,
-  0x66, 0xab, 0xc5, 0xac, 0xee, 0xe4, 0x34, 0xaf, 0xc5, 0xaa, 0xa1, 0xdb,
-  0x4c, 0xef, 0x17, 0x4a, 0xcd, 0x6e, 0x43, 0x7f, 0xf1, 0x08, 0x5d, 0x98,
-  0x8c, 0x75, 0x88, 0x44, 0x5b, 0x6a, 0xd3, 0xa9, 0x0a, 0x28, 0x3c, 0xc4,
-  0xf4, 0x7f, 0x77, 0x4f, 0x8b, 0xe7, 0x39, 0xdc, 0x7b, 0x36, 0xfc, 0xcc,
-  0x5f, 0x53, 0xd2, 0xf7, 0x07, 0x69, 0x3d, 0xc9, 0xf3, 0xb5, 0xc6, 0x8c,
-  0xc2, 0x1b, 0xff, 0xb6, 0x04, 0x09, 0x99, 0xd9, 0xa6, 0x79, 0xca, 0xa1,
-  0x5a, 0xc7, 0xdd, 0x18, 0x34, 0x4b, 0xfa, 0xaa, 0xd9, 0x62, 0xeb, 0xda,
-  0x15, 0x03, 0x9e, 0xea, 0x57, 0x08, 0xdd, 0xac, 0xd5, 0x30, 0xeb, 0xae,
-  0x2a, 0x65, 0xce, 0x02, 0xd3, 0x95, 0x2d, 0xaa, 0x30, 0x99, 0x8f, 0x80,
-  0x98, 0x80, 0x37, 0xa7, 0x4d, 0x5d, 0xd2, 0x3c, 0xc5, 0x26, 0x15, 0xee,
-  0x09, 0x10, 0x76, 0x5a, 0x33, 0xca, 0x9e, 0x7d, 0x01, 0x03, 0x7d, 0xe5,
-  0x21, 0x77, 0x5a, 0x66, 0x50, 0x1a, 0x51, 0x06, 0x99, 0x6f, 0x3c, 0x41,
-  0x78, 0x9c, 0xd3, 0xa6, 0x68, 0x20, 0xc2, 0xba, 0x0f, 0x9f, 0x07, 0x63,
-  0x44, 0x84, 0x73, 0x9f, 0xe8, 0x87, 0xec, 0x6c, 0x45, 0xc8, 0xa5, 0xfa,
-  0x66, 0x7c, 0x60, 0x33, 0xc4, 0x0e, 0x2a, 0xb2, 0x5b, 0x92, 0xc6, 0xb5,
-  0xa8, 0x13, 0x55, 0x95, 0x93, 0xd3, 0xc8, 0x82, 0x0b, 0x58, 0x25, 0x23,
-  0xb8, 0x25, 0x5d, 0xd0, 0xd3, 0x48, 0x22, 0xf7, 0x04, 0xa7, 0xb3, 0xb6,
-  0x00, 0xed, 0x02, 0x7c, 0x7c, 0xc4, 0x2f, 0x17, 0xcc, 0x0d, 0x28, 0xd3,
-  0xd1, 0x39, 0xe5, 0xe1, 0x6c, 0xda, 0xf0, 0x0f, 0xd2, 0xdc, 0x19, 0xcc,
-  0xcc, 0xf4, 0x66, 0x65, 0xcb, 0xcc, 0xac, 0x57, 0x87, 0x4b, 0x76, 0x3e,
-  0x0d, 0x6e, 0x6f, 0x6f, 0x07, 0x74, 0xe0, 0x08, 0x93, 0x23, 0x39, 0x15,
-  0xc3, 0x16, 0x9f, 0x2e, 0x33, 0x4a, 0x61, 0x0e, 0x99, 0x2d, 0x25, 0x50,
-  0x23, 0x1d, 0x3e, 0xaa, 0x1a, 0xe7, 0x0d, 0x92, 0xf7, 0x64, 0x73, 0xe1,
-  0x35, 0x49, 0xa2, 0x93, 0xee, 0x40, 0xcb, 0x51, 0x2f, 0x54, 0xe4, 0xf4,
-  0xb9, 0xb1, 0x10, 0xef, 0xd4, 0xa4, 0xc9, 0x28, 0x59, 0xdd, 0x7c, 0x62,
-  0x7e, 0x90, 0x0c, 0x5e, 0x27, 0xbd, 0x23, 0x19, 0xed, 0xa5, 0x79, 0xe2,
-  0xa0, 0x3d, 0x16, 0x7e, 0x38, 0x0c, 0xe6, 0x98, 0x77, 0xa3, 0xc6, 0x6e,
-  0x47, 0x55, 0xb6, 0xfc, 0x79, 0x91, 0x83, 0x8c, 0x82, 0x13, 0x0e, 0x35,
-  0xd3, 0x44, 0x3c, 0x75, 0x04, 0x7b, 0x61, 0x9f, 0x16, 0x73, 0x9e, 0x61,
-  0xe8, 0x69, 0x2d, 0xc5, 0x49, 0xc6, 0x7c, 0xc2, 0xd7, 0x1c, 0xc7, 0x2a,
-  0xbd, 0xbd, 0xff, 0x8c, 0x7b, 0x27, 0x51, 0x76, 0xef, 0x0c, 0x7e, 0x2e,
-  0x8f, 0xa2, 0x95, 0x9c, 0x3b, 0x16, 0x6c, 0x19, 0xe9, 0xa9, 0x94, 0x06,
-  0x70, 0x99, 0x53, 0x62, 0x9c, 0xf2, 0x5d, 0xf9, 0xd5, 0x9a, 0xa4, 0x33,
-  0xe7, 0x11, 0x76, 0xa3, 0x68, 0x85, 0x3d, 0x3a, 0x3c, 0x8f, 0x18, 0x96,
-  0xdd, 0x55, 0x0f, 0x10, 0x34, 0x6e, 0x74, 0x7d, 0x7b, 0x38, 0x65, 0x2f,
-  0xb3, 0x57, 0xcf, 0x1b, 0xa6, 0x10, 0x82, 0xc6, 0x60, 0x9c, 0x1c, 0xe4,
-  0xa0, 0xa3, 0x0a, 0xbe, 0x1e, 0x4b, 0xf4, 0xb6, 0xc8, 0x2a, 0xda, 0xe8,
-  0x80, 0xbc, 0x0f, 0x14, 0xa9, 0x1c, 0xbb, 0xac, 0x8d, 0x40, 0x39, 0xfa,
-  0xe6, 0x04, 0xd0, 0x6d, 0x23, 0x48, 0x0b, 0x61, 0x6c, 0xe0, 0xfe, 0x73,
-  0x15, 0x18, 0x6b, 0xd8, 0x5e, 0xe7, 0x96, 0xa4, 0x2d, 0x4d, 0x5a, 0xa4,
-  0xab, 0x1d, 0xbb, 0x23, 0x51, 0x03, 0x43, 0xc0, 0xa9, 0x62, 0x27, 0xc8,
-  0xe1, 0xb5, 0xe1, 0xdd, 0xd4, 0xe5, 0x03, 0x44, 0xe7, 0x0b, 0x5f, 0x57,
-  0x66, 0x91, 0xb4, 0x96, 0x08, 0x2e, 0x94, 0xb5, 0x00, 0x2b, 0xee, 0xf6,
-  0x2b, 0x57, 0xd5, 0xc9, 0x42, 0xdc, 0x9b, 0x7c, 0x3e, 0x5e, 0xf4, 0x0a,
-  0x6b, 0xe2, 0xea, 0x05, 0xe1, 0x23, 0x76, 0xea, 0x32, 0xdf, 0x6b, 0xc0,
-  0x89, 0x57, 0xe4, 0x51, 0x8b, 0xb9, 0x6d, 0x55, 0xd5, 0x23, 0x1f, 0xf7,
-  0x7f, 0xd0, 0x0d, 0x85, 0x7b, 0xd7, 0xc8, 0x3c, 0xd2, 0x3c, 0x34, 0x39,
-  0xd2, 0x6f, 0x4d, 0xa9, 0xfc, 0x04, 0xf5, 0x1a, 0x6f, 0x8e, 0x6c, 0xc0,
-  0x17, 0xa4, 0x2d, 0x7d, 0x25, 0xee, 0x2a, 0x73, 0x54, 0x95, 0x23, 0x9b,
-  0xcd, 0x72, 0xce, 0x8c, 0x65, 0x4f, 0x90, 0xf0, 0x0e, 0xd1, 0x34, 0xc4,
-  0x9b, 0xe3, 0x08, 0xa7, 0x37, 0x7b, 0xbc, 0xe3, 0x88, 0x89, 0xbb, 0xe6,
-  0xca, 0x4a, 0x7f, 0xe8, 0x4e, 0xde, 0x8b, 0xfb, 0x67, 0xef, 0x97, 0x4e,
-  0xdf, 0xfa, 0xd9, 0x63, 0x46, 0x7b, 0x45, 0xca, 0xbe, 0xf0, 0xdc, 0x74,
-  0x00, 0x7b, 0xb0, 0xfd, 0x65, 0xdd, 0x75, 0x6d, 0x29, 0xe3, 0x19, 0x9a,
-  0x2f, 0x7e, 0xab, 0x55, 0xc7, 0x66, 0x84, 0x55, 0x4f, 0x9d, 0x8f, 0x37,
-  0xc7, 0x31, 0x45, 0xac, 0xbd, 0xcf, 0xbb, 0x28, 0x7a, 0x38, 0x5a, 0x80,
-  0xe3, 0xca, 0xec, 0xff, 0x86, 0x37, 0xf3, 0x18, 0x30, 0xcf, 0x41, 0xbc,
-  0x39, 0xcd, 0xfa, 0x13, 0x45, 0x3c, 0x18, 0xdf, 0x57, 0x7a, 0xf1, 0xdf,
-  0x37, 0xb8, 0x96, 0x87, 0x10, 0xc8, 0x22, 0xb9, 0xe3, 0x2c, 0xc2, 0xcc,
-  0xe2, 0x42, 0x22, 0x1e, 0x68, 0x9b, 0x7a, 0x69, 0x79, 0x20, 0xb9, 0xb0,
-  0x8e, 0x6a, 0x05, 0xdb, 0xfd, 0xf6, 0x9c, 0x11, 0xcf, 0x1d, 0xee, 0x03,
-  0x59, 0xe8, 0x78, 0x73, 0x39, 0x8c, 0x7d, 0x59, 0x3e, 0x22, 0xab, 0x8f,
-  0x2e, 0xdf, 0xff, 0xcb, 0x86, 0xc8, 0x9e, 0x6d, 0x0e, 0xf5, 0x73, 0x85,
-  0xad, 0x6b, 0xe6, 0x8d, 0x34, 0xdd, 0x02, 0xc8, 0x3e, 0x69, 0x95, 0x95,
-  0x09, 0x54, 0x19, 0x38, 0x34, 0xfa, 0x08, 0xb8, 0xce, 0x10, 0x95, 0xce,
-  0x99, 0xfc, 0xfa, 0x85, 0xd3, 0x67, 0x06, 0x34, 0xbc, 0x81, 0xec, 0xda,
-  0x21, 0xf6, 0xe1, 0x9a, 0xcd, 0x6a, 0x37, 0x67, 0x7c, 0x5f, 0x06, 0x3b,
-  0x70, 0xf5, 0xed, 0xa8, 0x14, 0xab, 0x72, 0xbd, 0xb7, 0x2e, 0xcb, 0xbd,
-  0xcf, 0x5b, 0x97, 0xa5, 0x7b, 0x67, 0xdd, 0x35, 0x39, 0xca, 0x18, 0x93,
-  0xe6, 0xfb, 0x31, 0xf1, 0x12, 0x67, 0x55, 0x53, 0x79, 0x83, 0x10, 0xdd,
-  0x44, 0xaf, 0x06, 0x49, 0xc6, 0x0c, 0x2f, 0x72, 0xd1, 0x03, 0x76, 0x2e,
-  0x53, 0xd4, 0x4c, 0x0c, 0xa4, 0x64, 0x5c, 0x95, 0xb7, 0x35, 0x34, 0x52,
-  0xb5, 0x51, 0x53, 0x46, 0xc1, 0xde, 0x04, 0x50, 0x0c, 0x33, 0xbd, 0x33,
-  0x4b, 0x05, 0xfb, 0xfa, 0xf2, 0xcd, 0x29, 0xd3, 0xdd, 0x73, 0x36, 0x2e,
-  0x25, 0x1c, 0x49, 0x9f, 0x97, 0xe3, 0xb9, 0x59, 0x7f, 0xa3, 0xa0, 0x34,
-  0x2c, 0xcd, 0x54, 0x40, 0x06, 0x29, 0xc3, 0x08, 0xe9, 0x49, 0x40, 0x78,
-  0x11, 0x0b, 0xd4, 0x88, 0x2e, 0xe9, 0x02, 0xa1, 0xbe, 0x12, 0xfc, 0xcb,
-  0xd5, 0x5d, 0x63, 0x2a, 0x03, 0x14, 0x03, 0x55, 0xea, 0x15, 0x2d, 0x05,
-  0x3d, 0x12, 0x9c, 0x3e, 0x4f, 0x53, 0x43, 0x55, 0x26, 0xb0, 0x4a, 0x5b,
-  0x27, 0x0d, 0x29, 0x5e, 0xb6, 0x24, 0x03, 0x38, 0xb2, 0xd2, 0xb6, 0xb2,
-  0xd5, 0x15, 0x69, 0x4e, 0xf9, 0x72, 0xc5, 0x15, 0x7c, 0xfd, 0x8b, 0x54,
-  0x11, 0x52, 0x89, 0x24, 0xa2, 0xb4, 0xac, 0xc8, 0xa7, 0xc7, 0x8a, 0x75,
-  0x3f, 0x02, 0xbb, 0x17, 0x9d, 0x44, 0x9d, 0xfa, 0x36, 0xb4, 0xd9, 0xb2,
-  0xf6, 0x94, 0x45, 0x9e, 0xda, 0xf6, 0x8e, 0x6f, 0x44, 0x4f, 0x64, 0x46,
-  0x2a, 0x24, 0x53, 0x60, 0x35, 0xcd, 0x66, 0x33, 0xad, 0xa3, 0x48, 0x52,
-  0x0a, 0x1f, 0x79, 0xa0, 0xe1, 0x45, 0x75, 0x6c, 0x57, 0x62, 0xa1, 0x76,
-  0xac, 0xfa, 0x6a, 0x32, 0x83, 0x98, 0x0b, 0x54, 0x5c, 0xa0, 0xd5, 0x2f,
-  0xdb, 0x2e, 0xaf, 0x41, 0x10, 0xfe, 0x15, 0x17, 0x58, 0xdf, 0x8b, 0xb3,
-  0xe5, 0xe4, 0x84, 0xf2, 0xe3, 0x85, 0x2e, 0xb2, 0x3e, 0xcf, 0xaa, 0x6b,
-  0xce, 0x44, 0x60, 0x3e, 0xd8, 0x28, 0x6b, 0x45, 0x9a, 0x78, 0xac, 0x6c,
-  0x49, 0xf2, 0x6f, 0x03, 0xbe, 0x54, 0xe1, 0xad, 0x5a, 0x52, 0x50, 0x48,
-  0xdc, 0xea, 0x9b, 0x83, 0x29, 0x8b, 0x95, 0x69, 0x5a, 0x98, 0x99, 0x30,
-  0x27, 0x36, 0xc4, 0xc7, 0xcc, 0x66, 0x2f, 0x66, 0xe5, 0xb2, 0xbe, 0xdb,
-  0x4c, 0xa4, 0xc2, 0x89, 0x14, 0x05, 0x68, 0x04, 0xcb, 0x03, 0x50, 0xd3,
-  0xe4, 0x66, 0x59, 0x7c, 0xd0, 0x7b, 0x91, 0x92, 0x15, 0x6a, 0xf6, 0xd7,
-  0x76, 0x9a, 0xdb, 0xf4, 0x3e, 0xf6, 0x6f, 0x7e, 0xdb, 0xd1, 0x59, 0x86,
-  0x77, 0x97, 0x6d, 0xe7, 0x87, 0x19, 0xcf, 0x2e, 0x32, 0x13, 0xb3, 0x9c,
-  0x93, 0x56, 0xc8, 0xce, 0x36, 0x48, 0xf7, 0x06, 0x73, 0xf0, 0x6a, 0xe4,
-  0xc1, 0x41, 0x37, 0x20, 0x6f, 0x56, 0xe4, 0x9f, 0xb8, 0x12, 0xa5, 0x1c,
-  0x57, 0x72, 0x4c, 0x79, 0x4c, 0x59, 0x62, 0x2b, 0x82, 0xf8, 0xd9, 0x6e,
-  0xc3, 0xe4, 0xdc, 0xcc, 0x57, 0x40, 0x2d, 0x41, 0x91, 0x6c, 0xdb, 0x5c,
-  0xea, 0x33, 0x9e, 0xca, 0xb5, 0x66, 0xb3, 0xf9, 0x01, 0x2e, 0xe7, 0x8c,
-  0x81, 0xc4, 0x5a, 0xe8, 0x01, 0x4c, 0x87, 0xcd, 0x75, 0xe4, 0xa0, 0xa8,
-  0x45, 0x6f, 0xbd, 0xef, 0x44, 0xb5, 0x4e, 0x44, 0x1e, 0x04, 0x6d, 0x50,
-  0x93, 0x98, 0xe3, 0x17, 0x6a, 0x18, 0x77, 0xb5, 0x0f, 0x77, 0x7a, 0x69,
-  0x3e, 0x20, 0x04, 0x2c, 0xef, 0x3a, 0xdd, 0x64, 0x1d, 0xa3, 0x8b, 0xf9,
-  0x07, 0x9c, 0x58, 0x89, 0xf3, 0x32, 0xae, 0xc3, 0xa3, 0xf9, 0x67, 0xdb,
-  0xbb, 0x6d, 0x9c, 0xd5, 0xd5, 0xbd, 0x82, 0x56, 0xfb, 0x60, 0x1d, 0x73,
-  0xad, 0x13, 0x81, 0xfc, 0xfa, 0x09, 0x1c, 0x0f, 0x28, 0x15, 0xca, 0xea,
-  0xde, 0xe0, 0x12, 0x3f, 0x61, 0x2f, 0xe2, 0x20, 0xb2, 0x81, 0x5a, 0x66,
-  0x60, 0x36, 0xcb, 0xae, 0x79, 0xbc, 0xcf, 0x4f, 0x8f, 0xbf, 0x3b, 0x3e,
-  0x0d, 0x2e, 0xb7, 0x6f, 0x46, 0xa3, 0x9d, 0x0f, 0x59, 0x35, 0x46, 0x41,
-  0x49, 0x1a, 0x1e, 0xf9, 0x2c, 0xe9, 0x49, 0x0b, 0xc4, 0xf2, 0x64, 0xbe,
-  0x96, 0x00, 0x83, 0x04, 0x86, 0x69, 0x15, 0xc2, 0x3a, 0xe4, 0x93, 0xc2,
-  0xc7, 0x8e, 0xdc, 0x20, 0x41, 0xfc, 0xe1, 0x06, 0x9b, 0x54, 0xd9, 0x94,
-  0xeb, 0x2d, 0x86, 0x58, 0x3f, 0xf0, 0x6d, 0x24, 0xc9, 0x4b, 0x2c, 0x33,
-  0x43, 0xbe, 0x11, 0x6d, 0xb2, 0x83, 0x08, 0xde, 0x58, 0x20, 0xa7, 0x3d,
-  0x79, 0x29, 0xdf, 0xac, 0xe9, 0x6c, 0xd0, 0x2c, 0x31, 0xd9, 0x1a, 0x1b,
-  0x13, 0x67, 0xdf, 0x0e, 0x0e, 0x47, 0x83, 0x97, 0xc7, 0xa7, 0xc7, 0xdf,
-  0x1c, 0x5e, 0x1e, 0x33, 0xe5, 0xb8, 0xb2, 0x10, 0xaf, 0x50, 0x94, 0xf4,
-  0x66, 0xfe, 0x56, 0x26, 0x86, 0x6f, 0x6d, 0xe2, 0xad, 0xa7, 0x52, 0xb3,
-  0x28, 0x27, 0xe1, 0xb8, 0x50, 0x53, 0xb2, 0x5f, 0x9a, 0x56, 0xc5, 0xd7,
-  0xee, 0x46, 0x37, 0xd7, 0x95, 0x74, 0x35, 0x18, 0x41, 0x3a, 0xbb, 0xa5,
-  0xa2, 0x52, 0xef, 0x0a, 0xc2, 0xbc, 0xe7, 0x36, 0xb7, 0x93, 0x47, 0xef,
-  0xbb, 0x6e, 0xdc, 0xcc, 0xb6, 0x16, 0x18, 0xe4, 0xdc, 0x71, 0x8d, 0x45,
-  0x73, 0xb3, 0x11, 0xeb, 0x7d, 0x89, 0x07, 0x3b, 0x1c, 0xe0, 0x43, 0x97,
-  0x9c, 0x5d, 0x38, 0x7e, 0xf0, 0x08, 0x8d, 0x08, 0x0e, 0x4c, 0x3d, 0xb9,
-  0xc9, 0xe6, 0x96, 0x20, 0x8b, 0xc0, 0x04, 0x08, 0x5a, 0x73, 0x2e, 0xa4,
-  0x10, 0xf9, 0x40, 0x0e, 0x8c, 0x33, 0x18, 0xbe, 0x08, 0xa0, 0x7d, 0x0c,
-  0x64, 0x3f, 0x90, 0x39, 0x54, 0x19, 0x80, 0x62, 0x22, 0x84, 0xad, 0x41,
-  0xc2, 0xef, 0x10, 0x28, 0x40, 0x09, 0xf0, 0xc7, 0x43, 0xfa, 0x52, 0xf9,
-  0xac, 0xab, 0x18, 0x58, 0x8e, 0x71, 0x8f, 0x25, 0x98, 0x7c, 0x5c, 0xf8,
-  0x11, 0x84, 0xa9, 0xaa, 0xc5, 0xd4, 0xc3, 0x5f, 0xe2, 0x8c, 0xea, 0x7a,
-  0xa3, 0xb0, 0xab, 0x38, 0xc4, 0x5c, 0x89, 0x73, 0x39, 0x0a, 0xaf, 0x5e,
-  0x23, 0x34, 0x96, 0x7c, 0x78, 0x41, 0xb5, 0xcb, 0xc7, 0x59, 0xe8, 0xcf,
-  0x79, 0x21, 0xed, 0x0f, 0xa5, 0x68, 0xc0, 0xda, 0xc0, 0x8d, 0x27, 0x34,
-  0x5a, 0x65, 0x05, 0x88, 0xc6, 0x5d, 0xff, 0x1a, 0x16, 0x7f, 0xb0, 0x59,
-  0x71, 0x83, 0x6c, 0x11, 0xb0, 0x6a, 0x6f, 0xbd, 0x52, 0xa2, 0x7c, 0xab,
-  0x03, 0xfa, 0x95, 0xa2, 0xbc, 0xb2, 0x2e, 0xc7, 0xe7, 0x17, 0x5c, 0x1b,
-  0xfa, 0x94, 0xfe, 0x22, 0x41, 0xb2, 0x3a, 0xc6, 0x4b, 0x27, 0x85, 0x3a,
-  0x08, 0x3d, 0x92, 0x21, 0xca, 0x62, 0x63, 0xdf, 0x0a, 0x1a, 0x64, 0x9c,
-  0xa8, 0xb0, 0xa1, 0xcb, 0x81, 0x88, 0x25, 0x99, 0x7a, 0xf5, 0x24, 0xd1,
-  0x15, 0xea, 0x83, 0x50, 0x07, 0xa1, 0x17, 0x0c, 0x76, 0xd5, 0x60, 0xc6,
-  0x19, 0xfd, 0x92, 0x14, 0x43, 0xd9, 0x40, 0x2b, 0xa6, 0xd1, 0xe5, 0x3e,
-  0x51, 0x93, 0xf4, 0x56, 0x52, 0xa1, 0x12, 0x65, 0x6a, 0xfa, 0x31, 0x74,
-  0xe3, 0xe4, 0x4f, 0xb0, 0x6f, 0x19, 0x74, 0x98, 0x61, 0xe8, 0x02, 0xf9,
-  0xe4, 0x56, 0xf7, 0x57, 0x0c, 0x39, 0x03, 0x64, 0x2d, 0x36, 0xbe, 0x2f,
-  0x74, 0x41, 0xcc, 0x69, 0x00, 0x70, 0x7f, 0x59, 0xf8, 0x25, 0x90, 0x5a,
-  0x76, 0x42, 0xad, 0x88, 0xb1, 0xec, 0x4e, 0xa2, 0xdc, 0xac, 0xb8, 0x5d,
-  0x49, 0x24, 0x31, 0x05, 0xdd, 0x30, 0x4c, 0x90, 0x31, 0x6b, 0x1a, 0x40,
-  0xdf, 0xdd, 0xa4, 0x45, 0xe4, 0xd4, 0x99, 0x89, 0xb7, 0x15, 0x9d, 0x30,
-  0x50, 0x59, 0xb6, 0x88, 0xb2, 0x4d, 0x7b, 0xa3, 0x4b, 0x37, 0x65, 0x0c,
-  0x32, 0x23, 0xc2, 0x72, 0x0a, 0x41, 0x48, 0x57, 0x78, 0x72, 0x88, 0xdc,
-  0x48, 0xf7, 0x5b, 0x19, 0xdb, 0x55, 0x2c, 0x5f, 0xbc, 0xc0, 0x48, 0x6b,
-  0x0b, 0xae, 0x02, 0xfb, 0x59, 0x17, 0x3a, 0x52, 0x61, 0x3c, 0xa6, 0x5b,
-  0xaa, 0x8f, 0xda, 0xce, 0x95, 0x61, 0xbd, 0x93, 0xaf, 0xfc, 0xa2, 0x0b,
-  0x18, 0xc9, 0x38, 0x3f, 0xc2, 0x7c, 0x1b, 0xdd, 0x25, 0x8f, 0x8d, 0x0d,
-  0x9e, 0xd2, 0xde, 0x09, 0xbe, 0xff, 0x12, 0x9d, 0x83, 0xe6, 0x89, 0x37,
-  0x70, 0xec, 0x89, 0x13, 0xe8, 0x5a, 0x8c, 0x29, 0xd9, 0xcb, 0xe3, 0xcc,
-  0x7c, 0x31, 0xa7, 0x12, 0x5e, 0x2d, 0x97, 0x7d, 0xf7, 0xfb, 0xb5, 0xd9,
-  0x7f, 0x93, 0x1b, 0x35, 0xa7, 0xe8, 0xc5, 0x39, 0x29, 0x07, 0x5e, 0xe9,
-  0x3b, 0xc6, 0x0a, 0xb0, 0x3e, 0x72, 0x0e, 0x01, 0x41, 0x91, 0x47, 0xa0,
-  0x10, 0xc3, 0x08, 0xbe, 0x99, 0xc0, 0x89, 0xe5, 0x40, 0xd2, 0x47, 0xd3,
-  0xfa, 0x63, 0xfc, 0x84, 0xd7, 0x1f, 0xa3, 0x27, 0x5c, 0xff, 0xc0, 0x49,
-  0xf7, 0x0a, 0x12, 0xae, 0x3a, 0xeb, 0xa3, 0xef, 0x56, 0xf0, 0x38, 0x78,
-  0x27, 0x5c, 0x47, 0x87, 0xdd, 0xee, 0x9d, 0x71, 0x3e, 0xe4, 0xb2, 0x46,
-  0xf6, 0x98, 0xcb, 0x39, 0x8f, 0xba, 0xf2, 0xfd, 0x3a, 0xa2, 0x7c, 0xce,
-  0xcd, 0xf7, 0xe5, 0x70, 0x9f, 0x1f, 0x8e, 0xbe, 0xeb, 0x1c, 0x6b, 0xef,
-  0x20, 0xc7, 0xd2, 0xc8, 0x51, 0xdd, 0xaf, 0x52, 0x3e, 0x5c, 0x6a, 0x2b,
-  0xba, 0xdf, 0xeb, 0x8f, 0x0f, 0xd9, 0xef, 0xa6, 0x23, 0xc1, 0x7e, 0x0f,
-  0xe6, 0x78, 0xdd, 0x7e, 0xf7, 0x17, 0xaa, 0x75, 0x03, 0x65, 0x89, 0xbf,
-  0xe3, 0x0b, 0xae, 0x02, 0x7c, 0x83, 0xea, 0xf5, 0xc1, 0x56, 0xc7, 0x4e,
-  0xa7, 0xa0, 0x1f, 0xb6, 0x76, 0x88, 0xfd, 0x43, 0x3f, 0x7f, 0xc9, 0x46,
-  0xc7, 0x0b, 0xc1, 0x3e, 0xd7, 0x15, 0xfd, 0xc5, 0x1b, 0x5d, 0x0e, 0x48,
-  0xb0, 0xcf, 0x61, 0xb9, 0x9e, 0xf7, 0xbd, 0x0d, 0xee, 0xed, 0x5a, 0x3f,
-  0x63, 0x3b, 0x32, 0x43, 0x96, 0x03, 0xc4, 0x5d, 0xc0, 0x8e, 0x81, 0x21,
-  0xc2, 0xf8, 0xd1, 0xb7, 0x69, 0xb1, 0xd5, 0x24, 0xf4, 0xbc, 0xdb, 0x24,
-  0x6d, 0x3f, 0x49, 0x01, 0x16, 0x97, 0xc0, 0x9a, 0x8d, 0x0d, 0x44, 0xb7,
-  0x36, 0xac, 0x78, 0x3f, 0xf5, 0xdf, 0x2f, 0xc3, 0xd7, 0xe6, 0x81, 0xd2,
-  0x4e, 0xc4, 0x12, 0xc9, 0xeb, 0x8c, 0x20, 0x19, 0x20, 0x02, 0xeb, 0x9e,
-  0x53, 0x52, 0xf4, 0xa0, 0x10, 0x90, 0xaa, 0x32, 0xc8, 0x8b, 0x41, 0x08,
-  0x57, 0x6e, 0x47, 0x84, 0x1b, 0xb0, 0xc6, 0x7a, 0x96, 0x1f, 0xa5, 0x14,
-  0x92, 0xb2, 0x2b, 0x31, 0x89, 0x34, 0x91, 0x4c, 0x46, 0xf2, 0xdf, 0xe3,
-  0xea, 0x8d, 0xe4, 0xbe, 0x46, 0x99, 0xcf, 0xda, 0x35, 0x59, 0x9a, 0xb2,
-  0xe5, 0x34, 0x7b, 0xda, 0x61, 0x17, 0x9e, 0x16, 0xf5, 0xc0, 0xd5, 0x97,
-  0x7e, 0x6e, 0xff, 0x1a, 0x58, 0x18, 0x2f, 0xdf, 0x8e, 0x3a, 0x2a, 0x45,
-  0x9d, 0x71, 0x12, 0xc7, 0x35, 0xe4, 0x86, 0xf9, 0xbd, 0xcd, 0xbd, 0xaa,
-  0x5d, 0x3d, 0x37, 0x69, 0x32, 0xb0, 0x70, 0xe8, 0x13, 0xc3, 0x4e, 0xf2,
-  0xaa, 0x64, 0x0c, 0xa3, 0x24, 0x3a, 0xfc, 0x98, 0xe4, 0x4b, 0xf2, 0x7a,
-  0x27, 0xd9, 0xe7, 0xe4, 0x21, 0x8a, 0x71, 0x0f, 0xf1, 0x05, 0x41, 0xfd,
-  0xd4, 0xd2, 0xb2, 0x42, 0x92, 0x2e, 0xcc, 0x60, 0xb6, 0x14, 0x55, 0x91,
-  0x78, 0x25, 0xb5, 0x63, 0x11, 0xa7, 0x2d, 0xe1, 0x32, 0x12, 0x78, 0xd7,
-  0x76, 0x74, 0x8a, 0xa5, 0xa6, 0xb8, 0x4c, 0xe1, 0xe2, 0xe3, 0xe3, 0x01,
-  0x3d, 0x9e, 0xa8, 0xb9, 0xc8, 0x3f, 0x7c, 0x8a, 0x1f, 0x0e, 0xbb, 0x13,
-  0x1d, 0xd8, 0xd0, 0x52, 0xff, 0xd1, 0x7a, 0x4f, 0x97, 0xc5, 0x94, 0x2a,
-  0x63, 0x50, 0xb7, 0xb5, 0xba, 0x01, 0x31, 0x18, 0xba, 0xe2, 0x32, 0x96,
-  0xa8, 0xc8, 0x6c, 0xa1, 0xee, 0xe4, 0x1a, 0xe5, 0xa6, 0x6e, 0x2d, 0xfa,
-  0xa3, 0x47, 0x91, 0x45, 0xb7, 0x3d, 0x7e, 0x2e, 0xc3, 0x8c, 0x2f, 0x79,
-  0xf7, 0x72, 0x21, 0xf7, 0x19, 0xa4, 0xc0, 0xf3, 0x7c, 0x31, 0xd0, 0x37,
-  0xf9, 0x02, 0x99, 0xa7, 0x1f, 0xe4, 0x62, 0x7f, 0x4c, 0xcb, 0x10, 0x19,
-  0x24, 0x97, 0x8b, 0xf5, 0x03, 0x56, 0xb4, 0x6d, 0xec, 0xae, 0x11, 0x5d,
-  0xab, 0xb1, 0x5c, 0xaa, 0x20, 0x6a, 0xe5, 0x6f, 0xc4, 0x72, 0xb3, 0x14,
-  0x4e, 0xed, 0xfb, 0x62, 0x34, 0x0f, 0x03, 0xbd, 0xb0, 0xef, 0xde, 0xbb,
-  0x7e, 0x6e, 0x3f, 0xac, 0x5b, 0x3f, 0x9d, 0xb3, 0xff, 0x33, 0xd6, 0xef,
-  0xe9, 0xef, 0xb6, 0x7e, 0x4f, 0xff, 0x8f, 0x58, 0xbf, 0xa7, 0xff, 0xfc,
-  0xfa, 0x3d, 0xee, 0xae, 0xdf, 0xd3, 0xff, 0x53, 0xd6, 0x4f, 0x0b, 0xa1,
-  0xe9, 0xea, 0x65, 0xc1, 0xfa, 0xc1, 0x89, 0xc3, 0x19, 0x1d, 0x79, 0x2d,
-  0xa5, 0xbd, 0x69, 0xba, 0xf5, 0x4d, 0x0e, 0xa8, 0x08, 0x2e, 0x91, 0x3d,
-  0xd6, 0x0a, 0x8f, 0x05, 0x1f, 0x44, 0x9c, 0x4f, 0x59, 0x6a, 0x63, 0x29,
-  0x0b, 0xdf, 0xc9, 0x79, 0x62, 0x3b, 0xe0, 0x2d, 0x83, 0xe3, 0xbe, 0x82,
-  0x7e, 0x16, 0x75, 0x25, 0xd7, 0xe4, 0x5f, 0x34, 0x13, 0xc0, 0x69, 0x90,
-  0xb5, 0xcb, 0xdf, 0x8d, 0x91, 0x5b, 0x99, 0xc9, 0x3b, 0x78, 0x4e, 0xf3,
-  0x35, 0xe0, 0xc7, 0xbf, 0x8c, 0x26, 0xa5, 0xa1, 0xde, 0xac, 0xeb, 0x52,
-  0x2c, 0x7c, 0xe0, 0x4d, 0xdd, 0x83, 0x97, 0x6d, 0x55, 0x49, 0x2e, 0x5d,
-  0xc2, 0xc9, 0xe0, 0xfe, 0x25, 0x2b, 0x6f, 0x40, 0xb9, 0xf3, 0xfc, 0xdd,
-  0x45, 0xe8, 0x7d, 0x33, 0x43, 0xb5, 0xe9, 0x79, 0x0c, 0x6a, 0xe7, 0x34,
-  0x08, 0xb3, 0x5a, 0x03, 0x32, 0xef, 0x07, 0x20, 0x70, 0xa7, 0x13, 0x79,
-  0xf6, 0x7a, 0x3b, 0xf1, 0x7c, 0x41, 0x88, 0x30, 0x44, 0x12, 0x1f, 0x91,
-  0x20, 0xab, 0x69, 0xe0, 0x75, 0xdf, 0x5f, 0x5f, 0x17, 0xb0, 0xb1, 0x2a,
-  0x8a, 0x84, 0xfe, 0xe4, 0xbd, 0x2a, 0x28, 0x45, 0x49, 0xca, 0x60, 0x5e,
-  0x0b, 0x91, 0x1b, 0x31, 0x5e, 0xe8, 0x4d, 0x88, 0x6e, 0xfd, 0x8e, 0xd5,
-  0x64, 0x5e, 0x42, 0x17, 0x5c, 0xce, 0x17, 0x92, 0xe2, 0x7b, 0x4f, 0x8a,
-  0x23, 0x4c, 0xec, 0xed, 0xe4, 0x7b, 0xe4, 0x2f, 0xb2, 0x9f, 0x5d, 0xf2,
-  0x7e, 0xd4, 0xea, 0xb6, 0xa9, 0x0e, 0x1a, 0xc4, 0x5a, 0xc1, 0x45, 0x16,
-  0xa5, 0x85, 0xea, 0x24, 0xf0, 0x73, 0x6e, 0x8a, 0xb2, 0x9a, 0x93, 0xfc,
-  0xf3, 0x74, 0x62, 0x65, 0x5f, 0xc5, 0x3c, 0xcb, 0x47, 0xa3, 0xa4, 0xd8,
-  0xa4, 0x4c, 0x70, 0xce, 0x13, 0x75, 0x9a, 0x49, 0xfd, 0xcc, 0xeb, 0xa6,
-  0xa9, 0xa1, 0x24, 0x3e, 0xd5, 0x2e, 0x6b, 0x49, 0x7b, 0x0f, 0x9e, 0xa5,
-  0x18, 0x58, 0x5f, 0xb5, 0x57, 0x78, 0x02, 0x84, 0x41, 0xc3, 0x52, 0x24,
-  0x15, 0x1f, 0x35, 0x0d, 0x86, 0x80, 0x30, 0xad, 0x7a, 0x31, 0x83, 0x71,
-  0x98, 0xcc, 0xa6, 0x40, 0x69, 0x1e, 0xf1, 0x1f, 0xb0, 0xf8, 0x2b, 0xd2,
-  0x24, 0x58, 0xf3, 0xf2, 0x3d, 0x0f, 0xc1, 0x49, 0xf1, 0x93, 0x30, 0x86,
-  0x1b, 0xeb, 0x00, 0xd2, 0x8c, 0xbc, 0xbd, 0xc9, 0xfc, 0x84, 0x62, 0xcb,
-  0xc6, 0xc8, 0xe1, 0x01, 0x76, 0xbf, 0x98, 0xc1, 0x09, 0x4e, 0x34, 0xa8,
-  0xbd, 0x03, 0xce, 0x00, 0x99, 0xad, 0x9e, 0x70, 0x1c, 0x2d, 0x85, 0x85,
-  0x35, 0xa5, 0x0d, 0x01, 0x1e, 0x9e, 0x7f, 0x61, 0x02, 0xaf, 0x87, 0x9b,
-  0xf6, 0xa5, 0x42, 0x76, 0xcd, 0x91, 0xf1, 0x75, 0x18, 0xdd, 0x0e, 0x1d,
-  0x19, 0xb3, 0x08, 0x5b, 0x42, 0x32, 0x18, 0xe6, 0x45, 0x53, 0x95, 0x8b,
-  0xbb, 0xe4, 0x9b, 0x94, 0x86, 0x05, 0x65, 0x3a, 0xcd, 0xe6, 0x41, 0xfa,
-  0x16, 0xd7, 0x22, 0x16, 0xdd, 0x96, 0xeb, 0x12, 0xeb, 0x08, 0xa1, 0x8d,
-  0xf3, 0xb4, 0x18, 0x39, 0x60, 0xe6, 0x8b, 0xc2, 0x38, 0x92, 0x58, 0xc1,
-  0xc0, 0xe4, 0xd1, 0xe8, 0x34, 0x34, 0x9f, 0xb4, 0xc6, 0xcf, 0xda, 0x74,
-  0x7d, 0xb4, 0x36, 0xe8, 0x86, 0x24, 0xa4, 0xf1, 0xe7, 0xd1, 0xc3, 0x2c,
-  0xe3, 0xce, 0x66, 0xca, 0x68, 0xa1, 0x94, 0xea, 0x93, 0xea, 0x6e, 0x41,
-  0x26, 0xb9, 0xe4, 0xa7, 0xf2, 0xd9, 0xa3, 0xfe, 0x31, 0x1f, 0xea, 0xda,
-  0x8c, 0xe0, 0x77, 0xb5, 0x47, 0x2b, 0x8e, 0xeb, 0x8b, 0x7c, 0x31, 0xc4,
-  0x0f, 0x4c, 0xd4, 0x4f, 0x72, 0x9d, 0x91, 0xa4, 0x9f, 0x82, 0xeb, 0xc4,
-  0xd1, 0xf5, 0x06, 0x84, 0x7e, 0xa8, 0xe0, 0xd5, 0x29, 0x14, 0x01, 0xdf,
-  0x0d, 0x12, 0x9e, 0xa9, 0x18, 0x01, 0x62, 0x18, 0xdb, 0x7a, 0x9d, 0xca,
-  0x1b, 0x9d, 0xda, 0xf2, 0x7a, 0x71, 0xd9, 0x3a, 0x02, 0x29, 0x91, 0x1f,
-  0x14, 0x01, 0xd1, 0x0a, 0x03, 0x20, 0xf6, 0x76, 0x77, 0xef, 0x65, 0xd0,
-  0x11, 0x03, 0x71, 0x2d, 0x91, 0x0e, 0xc9, 0x28, 0x8e, 0x2a, 0xd8, 0x74,
-  0xef, 0x34, 0x97, 0x94, 0x9e, 0x2e, 0xe7, 0x98, 0xf9, 0xa4, 0x25, 0xb4,
-  0x71, 0x47, 0x90, 0x65, 0x1d, 0x13, 0x4d, 0x81, 0x4e, 0xc7, 0x88, 0xb0,
-  0x63, 0xf4, 0xb1, 0x3e, 0x68, 0xbd, 0x13, 0x2d, 0xb8, 0x4c, 0x1d, 0xa2,
-  0x97, 0x44, 0xe7, 0x1b, 0x26, 0x5f, 0xdf, 0x39, 0x53, 0xd9, 0xf3, 0x10,
-  0xa1, 0x57, 0x38, 0x61, 0xd2, 0xff, 0xe1, 0x3a, 0xda, 0xa2, 0x38, 0x4b,
-  0xce, 0x1f, 0x58, 0xb0, 0xa0, 0x59, 0x23, 0x80, 0x16, 0x35, 0x5a, 0x05,
-  0xd9, 0x46, 0xdc, 0x47, 0x64, 0x47, 0x9b, 0xd6, 0x41, 0xbd, 0x21, 0xaf,
-  0x74, 0x10, 0x5f, 0x2a, 0x6b, 0xa9, 0x8d, 0xdb, 0x9c, 0x47, 0x6d, 0x8c,
-  0xe6, 0x67, 0x6d, 0xcd, 0x80, 0xb2, 0x8e, 0x07, 0xc8, 0x2d, 0xee, 0x12,
-  0x2a, 0x50, 0x3a, 0x32, 0xc9, 0x2e, 0x58, 0xf6, 0x65, 0xe1, 0xb9, 0x3c,
-  0x88, 0x6b, 0x8b, 0x41, 0x31, 0x9a, 0x8d, 0xd4, 0xa1, 0x72, 0xf5, 0x05,
-  0xab, 0x92, 0xd0, 0xeb, 0x49, 0x9f, 0x96, 0x1e, 0xb3, 0x93, 0x4d, 0x40,
-  0xeb, 0xf8, 0x4e, 0xd8, 0x79, 0x12, 0xe1, 0x79, 0xe3, 0xe5, 0xf1, 0x7d,
-  0xf0, 0x92, 0x47, 0x0d, 0xf0, 0x00, 0x14, 0x30, 0xd6, 0xd8, 0x8c, 0xa2,
-  0xd0, 0x4f, 0xa4, 0x56, 0x37, 0x41, 0xaa, 0xcd, 0x4a, 0xc7, 0x35, 0x4a,
-  0xe7, 0x7a, 0x67, 0x96, 0x49, 0x1e, 0x4b, 0xed, 0xe8, 0xd2, 0x48, 0x6c,
-  0xc3, 0xdd, 0x6d, 0x9a, 0xac, 0x15, 0x2f, 0x15, 0x3a, 0x21, 0xbd, 0xe4,
-  0x65, 0xf3, 0x20, 0xf1, 0xb7, 0xd4, 0x4b, 0xb8, 0x8c, 0xb5, 0xd3, 0x96,
-  0xa1, 0x4c, 0x9e, 0x95, 0xc4, 0x6e, 0x72, 0x4f, 0x45, 0xb2, 0xc3, 0x25,
-  0x30, 0x4d, 0xe4, 0x86, 0x09, 0x96, 0x07, 0xf9, 0xe1, 0xcb, 0xca, 0x0b,
-  0x4f, 0xf7, 0x6e, 0x72, 0xb3, 0xae, 0x45, 0x0f, 0xf7, 0x69, 0xbd, 0x1c,
-  0x33, 0x29, 0x67, 0x83, 0x0f, 0xc7, 0x00, 0xf8, 0x84, 0xb6, 0x74, 0x2e,
-  0xd1, 0x78, 0x21, 0xee, 0x56, 0x14, 0xaa, 0x9f, 0xb4, 0x0e, 0x85, 0xaa,
-  0x71, 0xdc, 0x35, 0x97, 0x9b, 0x1e, 0xad, 0x68, 0xc3, 0x3b, 0xc5, 0xa5,
-  0xab, 0xd1, 0xe9, 0x47, 0xa1, 0xaa, 0xbe, 0x5f, 0x25, 0xc6, 0xe1, 0x5e,
-  0xd2, 0x39, 0x79, 0x4e, 0xd8, 0x4c, 0xa0, 0x89, 0x8e, 0xab, 0x2b, 0x95,
-  0x65, 0x34, 0x89, 0xb0, 0xeb, 0x0a, 0xf2, 0x2d, 0xbd, 0x43, 0x5e, 0x8e,
-  0xfd, 0x34, 0x76, 0x78, 0x40, 0x91, 0x46, 0x74, 0x81, 0x25, 0x34, 0x6e,
-  0xd9, 0xcb, 0xc4, 0x3e, 0x39, 0xa9, 0xf2, 0x45, 0xc3, 0x60, 0x00, 0x81,
-  0x1f, 0xdf, 0xa7, 0x86, 0x5d, 0xcf, 0xca, 0x71, 0xca, 0xe7, 0xc4, 0x42,
-  0x7f, 0xd4, 0xd1, 0xd8, 0xa2, 0xee, 0x05, 0xd3, 0xbc, 0xd9, 0x9e, 0x91,
-  0x54, 0x38, 0x33, 0xe4, 0xc1, 0x01, 0xea, 0xa7, 0x53, 0x08, 0x72, 0xdd,
-  0x07, 0xed, 0x27, 0x98, 0x20, 0x6f, 0x70, 0xd5, 0x97, 0x13, 0xac, 0x55,
-  0x31, 0x81, 0x9c, 0xaa, 0xbd, 0x73, 0x15, 0xa8, 0x42, 0x60, 0x19, 0x98,
-  0x2e, 0xb3, 0x36, 0x90, 0x6a, 0x53, 0x02, 0xb4, 0x52, 0xe1, 0x0d, 0x60,
-  0x1e, 0x50, 0xf6, 0x83, 0xee, 0x97, 0x03, 0xa1, 0x51, 0x90, 0x10, 0x51,
-  0xe5, 0x0a, 0xa8, 0xa7, 0x6f, 0x54, 0xfe, 0x5b, 0xe4, 0x30, 0x14, 0x74,
-  0x33, 0xb9, 0xce, 0x29, 0x3e, 0xd5, 0x9b, 0x2b, 0xe6, 0x1d, 0xa8, 0xb2,
-  0x41, 0x18, 0x57, 0xb0, 0xb5, 0x55, 0x78, 0x4d, 0xd6, 0xcc, 0x8c, 0x4f,
-  0xba, 0xbd, 0xdf, 0x92, 0x6a, 0xf6, 0xd3, 0xf1, 0x2b, 0x0a, 0xa2, 0xad,
-  0x26, 0x5d, 0x9e, 0xdc, 0xea, 0x5b, 0x66, 0xb3, 0x48, 0x7e, 0x58, 0x8a,
-  0x88, 0x3f, 0xd8, 0x23, 0x95, 0xe8, 0x9a, 0xa5, 0x41, 0x3c, 0x04, 0x4a,
-  0x27, 0x85, 0x20, 0x60, 0xb3, 0x3b, 0xa4, 0x6d, 0xf0, 0x9a, 0x43, 0x0b,
-  0x15, 0x57, 0xbd, 0x6e, 0xa8, 0xac, 0x99, 0x78, 0xbf, 0x9c, 0x66, 0xe9,
-  0x2c, 0x56, 0x3c, 0x82, 0x3a, 0x4c, 0xae, 0x53, 0x16, 0x6e, 0xc4, 0x22,
-  0x52, 0x48, 0xa8, 0x42, 0x50, 0xc8, 0x0c, 0xc2, 0x2b, 0x24, 0x6f, 0x5a,
-  0x7b, 0x88, 0x53, 0x15, 0x31, 0x0f, 0xa9, 0x9c, 0x0d, 0x1e, 0x40, 0x86,
-  0xed, 0x44, 0x32, 0xf7, 0x21, 0x45, 0x5d, 0x92, 0x0a, 0xf4, 0xff, 0x37,
-  0xa7, 0xf6, 0x01, 0xec, 0x00, 0x04, 0xce, 0xbb, 0xcd, 0x89, 0xfb, 0x92,
-  0x33, 0x27, 0x71, 0xd1, 0x68, 0x62, 0x03, 0x75, 0x8c, 0xc1, 0x27, 0x24,
-  0x26, 0xb7, 0xe5, 0x1c, 0x32, 0xc4, 0x81, 0x25, 0xc7, 0x22, 0x5c, 0xe9,
-  0x8f, 0x99, 0x02, 0x87, 0x60, 0x5f, 0xf0, 0x02, 0x34, 0x36, 0xa1, 0x94,
-  0x5a, 0x13, 0x39, 0xc3, 0x42, 0x66, 0x7f, 0x7f, 0x05, 0xb9, 0x88, 0x54,
-  0x10, 0x97, 0x3d, 0x86, 0xc3, 0x5e, 0xa7, 0x57, 0x99, 0x52, 0x8b, 0x8a,
-  0x00, 0x2f, 0x27, 0x66, 0x0a, 0x11, 0x1b, 0x05, 0x67, 0x0f, 0x69, 0x48,
-  0x41, 0xe8, 0x94, 0xc5, 0x35, 0x49, 0x49, 0x7b, 0xed, 0xd2, 0x41, 0x50,
-  0x30, 0x6d, 0x3d, 0xcb, 0x17, 0xd6, 0x33, 0xdc, 0x27, 0x2e, 0x64, 0x06,
-  0xf5, 0x50, 0x1c, 0xe9, 0x36, 0xe4, 0xfd, 0xec, 0x14, 0x3a, 0x17, 0x8a,
-  0xd8, 0x19, 0xa9, 0xff, 0x5b, 0x9d, 0xf6, 0x1f, 0xef, 0xee, 0xa1, 0xbb,
-  0x8f, 0x77, 0x3f, 0xdb, 0x6e, 0xdf, 0xcd, 0xb3, 0x3a, 0x1b, 0x00, 0xd5,
-  0x15, 0xd7, 0x51, 0x2f, 0x3b, 0x5e, 0x78, 0xe8, 0xa3, 0xf4, 0x92, 0x40,
-  0xc1, 0xa6, 0xcb, 0x4a, 0xcd, 0x6d, 0xaa, 0xea, 0x47, 0x36, 0x63, 0x7d,
-  0x43, 0xcc, 0x84, 0xc1, 0x5d, 0xef, 0xde, 0x61, 0x30, 0x09, 0xdd, 0x4a,
-  0x3c, 0x53, 0x66, 0xf7, 0xd0, 0xbb, 0xb6, 0x0c, 0x9c, 0x4c, 0x06, 0x43,
-  0xcd, 0xc8, 0x62, 0x0c, 0x59, 0xa2, 0x7d, 0x3a, 0x36, 0x4e, 0x49, 0xe1,
-  0xb0, 0x59, 0xbb, 0x14, 0xaf, 0x95, 0x3c, 0xaf, 0x72, 0x63, 0xdf, 0xdf,
-  0xa0, 0x84, 0x6f, 0x5d, 0xa7, 0xd7, 0x59, 0x98, 0x08, 0x6e, 0x44, 0x92,
-  0x31, 0x9c, 0xb8, 0xae, 0x5c, 0x05, 0x96, 0x76, 0x42, 0x66, 0xf1, 0x79,
-  0x90, 0xa4, 0x0e, 0x29, 0x3a, 0xb7, 0x44, 0x60, 0xca, 0x0e, 0x33, 0xb6,
-  0x63, 0xf2, 0xda, 0xab, 0x88, 0xb8, 0xaa, 0x20, 0x22, 0x95, 0xe7, 0x02,
-  0x87, 0x14, 0x17, 0xcb, 0xe1, 0x6a, 0x39, 0x01, 0x7e, 0x93, 0xbc, 0x2f,
-  0x5b, 0xb4, 0xb8, 0x67, 0x23, 0x23, 0x84, 0x5c, 0xf5, 0x5e, 0x60, 0xe4,
-  0xcc, 0xcf, 0x7e, 0x30, 0x1a, 0xe9, 0xf0, 0x99, 0xfd, 0xf1, 0xf6, 0xc3,
-  0x2a, 0x28, 0xee, 0x77, 0x34, 0x34, 0x02, 0xab, 0x4a, 0x10, 0x00, 0x06,
-  0xcb, 0x0b, 0xfe, 0xc7, 0x0a, 0x27, 0x04, 0xf2, 0x32, 0x93, 0x93, 0x37,
-  0x87, 0xe0, 0x5c, 0x72, 0x2c, 0xc8, 0x3e, 0xa8, 0xcb, 0xcf, 0x63, 0x43,
-  0x39, 0x49, 0x52, 0x58, 0xa3, 0x24, 0x78, 0x96, 0xb7, 0x96, 0x21, 0x76,
-  0x2d, 0x5a, 0x72, 0x0e, 0x86, 0xcd, 0xa8, 0x62, 0x16, 0x9d, 0x02, 0x23,
-  0x23, 0x4f, 0x33, 0x2e, 0x1c, 0x93, 0x6c, 0x7e, 0xb5, 0x19, 0xc9, 0x78,
-  0xdb, 0x7c, 0xee, 0x51, 0x70, 0xd7, 0xae, 0x32, 0xd5, 0xe6, 0x17, 0x84,
-  0xda, 0x25, 0xda, 0x11, 0xfe, 0xa6, 0xac, 0x01, 0x03, 0x50, 0x25, 0xcc,
-  0xb8, 0x22, 0x89, 0x49, 0x38, 0xf4, 0xda, 0xc0, 0x1d, 0x2e, 0x0a, 0x4d,
-  0xfc, 0xe4, 0x9d, 0x71, 0xab, 0x4e, 0xb7, 0x19, 0x64, 0xc4, 0x11, 0xb0,
-  0x9d, 0xe9, 0x6c, 0xa4, 0x76, 0xb2, 0xab, 0xeb, 0xc9, 0x7d, 0xe2, 0xce,
-  0xc0, 0x49, 0x38, 0x99, 0xe4, 0xa4, 0xbb, 0xe0, 0xe4, 0x9b, 0x5f, 0x5e,
-  0x5f, 0x47, 0xd1, 0x45, 0x66, 0x0a, 0x68, 0xe1, 0x69, 0xcc, 0x57, 0x59,
-  0xda, 0x40, 0xe3, 0xa0, 0x9b, 0x7e, 0x35, 0xba, 0xd8, 0x69, 0xf0, 0x91,
-  0x67, 0xbc, 0x51, 0x3c, 0xf7, 0x73, 0x38, 0xe2, 0xbb, 0x00, 0x9b, 0x80,
-  0xf7, 0x00, 0xb1, 0x5e, 0xe2, 0x67, 0xd6, 0x0b, 0x75, 0x95, 0x9a, 0x4d,
-  0x71, 0x27, 0x11, 0xdd, 0x19, 0xb0, 0xf6, 0x2c, 0x41, 0xb2, 0xf9, 0xb2,
-  0xbb, 0xc5, 0x67, 0x8a, 0x5d, 0x65, 0x88, 0x37, 0x15, 0xd7, 0x60, 0x34,
-  0x70, 0xc2, 0x64, 0xf4, 0xc4, 0xe3, 0x67, 0x51, 0xe1, 0x89, 0x56, 0x97,
-  0x70, 0x60, 0xef, 0xae, 0x6f, 0xc4, 0x87, 0x7e, 0x8b, 0xb2, 0xa2, 0x96,
-  0x20, 0xd0, 0xeb, 0x92, 0xa0, 0xe0, 0x7b, 0x87, 0xfc, 0x84, 0xbf, 0xae,
-  0x73, 0x10, 0x86, 0x84, 0x91, 0x44, 0x3b, 0x38, 0x24, 0x0c, 0xb9, 0x9f,
-  0x10, 0xd9, 0x0b, 0x84, 0x4c, 0x99, 0x50, 0xd5, 0xb2, 0xfd, 0x47, 0x9f,
-  0x7f, 0x3e, 0x8c, 0x72, 0x81, 0x72, 0x0a, 0xb3, 0xd9, 0x84, 0x34, 0x53,
-  0x8e, 0x37, 0xb2, 0x6f, 0x19, 0x80, 0xe9, 0xfb, 0xb4, 0xc3, 0x98, 0x81,
-  0x7f, 0x4e, 0x24, 0x3f, 0x24, 0x1c, 0x97, 0xb3, 0xd0, 0xc8, 0x47, 0xc4,
-  0x6f, 0x4e, 0x8a, 0x85, 0x48, 0x31, 0x28, 0x58, 0x24, 0x35, 0xe6, 0xf9,
-  0x0a, 0xa5, 0x2e, 0x13, 0x68, 0x1c, 0xa3, 0x28, 0x85, 0x3b, 0x4f, 0xa0,
-  0x9c, 0x8c, 0x8b, 0x35, 0x7a, 0x03, 0x40, 0xe0, 0x0c, 0xb7, 0xe0, 0xe9,
-  0xd8, 0x5c, 0x91, 0x32, 0xb9, 0x99, 0x68, 0xd0, 0x71, 0x9c, 0x59, 0x0e,
-  0x02, 0x2e, 0x45, 0xd5, 0xe1, 0x89, 0xe1, 0xb4, 0xea, 0x82, 0xf2, 0xa6,
-  0xa8, 0xea, 0x83, 0xf9, 0x40, 0xa7, 0x39, 0x64, 0x11, 0x5f, 0x67, 0x4d,
-  0x98, 0xeb, 0xe3, 0x81, 0x6e, 0xd7, 0x34, 0x1e, 0xb3, 0x8c, 0x24, 0x55,
-  0x29, 0x79, 0x2e, 0x1e, 0xfc, 0x64, 0x9a, 0x5f, 0xe9, 0x21, 0xb5, 0x95,
-  0x12, 0xbe, 0xc2, 0x6a, 0x3c, 0x97, 0xa9, 0x97, 0xd4, 0xbd, 0xaf, 0xa2,
-  0x24, 0x60, 0x82, 0xfc, 0x05, 0x23, 0x55, 0xd3, 0x18, 0xc5, 0xda, 0xc9,
-  0x6e, 0xc0, 0xac, 0x41, 0x3e, 0x24, 0x40, 0x60, 0x9e, 0x60, 0x86, 0x4b,
-  0xce, 0x62, 0xec, 0x9c, 0xcf, 0x6d, 0xa3, 0x52, 0xf6, 0x83, 0x90, 0xee,
-  0xd4, 0x95, 0xd8, 0x4c, 0x28, 0x97, 0x37, 0xc9, 0x07, 0xf3, 0x74, 0x60,
-  0xf7, 0xd0, 0xbb, 0xde, 0x3c, 0x85, 0x6b, 0xef, 0x47, 0xa1, 0x85, 0x75,
-  0x82, 0xa7, 0xd8, 0x21, 0xa4, 0x7d, 0x97, 0xb9, 0x8c, 0xd4, 0x3a, 0x4d,
-  0xbb, 0xae, 0x52, 0x1a, 0xaa, 0xcb, 0x76, 0xc6, 0xce, 0xba, 0x2e, 0x33,
-  0xee, 0x25, 0xa8, 0x27, 0x74, 0x56, 0xc9, 0x63, 0xd9, 0x54, 0xcb, 0x09,
-  0xa9, 0x96, 0x30, 0xcd, 0xf1, 0xa9, 0x58, 0x79, 0x2a, 0x29, 0x86, 0xe7,
-  0x46, 0x8c, 0x22, 0x72, 0x58, 0x2f, 0xcc, 0xb2, 0x32, 0xe6, 0x09, 0x52,
-  0x86, 0xba, 0xa6, 0x3a, 0xc8, 0x2a, 0x5a, 0x6e, 0x70, 0xef, 0x11, 0x3e,
-  0xed, 0x1f, 0x12, 0xe4, 0x52, 0x3a, 0xe5, 0x54, 0x69, 0xc4, 0xe0, 0xed,
-  0xc8, 0x88, 0xdb, 0x3e, 0x79, 0x49, 0xd5, 0x37, 0x63, 0xa8, 0x01, 0xda,
-  0x84, 0x9b, 0x75, 0x0b, 0x00, 0xce, 0x17, 0x13, 0xe9, 0x73, 0x55, 0x76,
-  0xbd, 0xa4, 0xcb, 0x0e, 0xd3, 0xb5, 0xa5, 0x1c, 0xa3, 0xfa, 0x44, 0xb2,
-  0xc8, 0x03, 0xf9, 0x41, 0x42, 0x40, 0x0c, 0x3d, 0xae, 0xab, 0xb9, 0x2c,
-  0xcc, 0xac, 0x35, 0x4b, 0x0a, 0x02, 0xce, 0x18, 0x1b, 0x67, 0xc4, 0xd8,
-  0xdf, 0xe0, 0x07, 0x2c, 0x65, 0x06, 0xb8, 0x46, 0xc5, 0x34, 0x96, 0xb7,
-  0x42, 0xc4, 0xa7, 0x08, 0xe3, 0x1b, 0xbd, 0x1b, 0xbc, 0x5f, 0x84, 0xe4,
-  0x68, 0x54, 0x0a, 0x70, 0xd5, 0x35, 0xf2, 0xc9, 0x7c, 0x41, 0x51, 0xc2,
-  0x09, 0x07, 0x09, 0xa0, 0xb1, 0x60, 0x56, 0x42, 0x14, 0x67, 0x01, 0xd2,
-  0xc0, 0x44, 0xd5, 0x27, 0x9f, 0x4b, 0x92, 0x15, 0x30, 0x8a, 0x66, 0xd2,
-  0x30, 0x39, 0x05, 0x48, 0xf8, 0x71, 0xd2, 0x9a, 0x53, 0x0c, 0xea, 0xb0,
-  0x1a, 0x37, 0xee, 0x01, 0x56, 0xad, 0xff, 0x66, 0xad, 0x5e, 0x12, 0x7e,
-  0x11, 0xa6, 0x21, 0x70, 0xab, 0x1e, 0x30, 0x4c, 0x02, 0xf5, 0xdd, 0x44,
-  0xa6, 0xa9, 0xfd, 0xa1, 0x29, 0x44, 0xac, 0x25, 0x6e, 0x1a, 0xe9, 0x49,
-  0xf3, 0xbe, 0x29, 0x67, 0x37, 0x46, 0x6f, 0xe3, 0x8c, 0x7d, 0x48, 0x6b,
-  0x3e, 0x29, 0x96, 0x0d, 0xd2, 0x8a, 0x11, 0xd2, 0xaa, 0xaa, 0xd4, 0x08,
-  0xcd, 0xbf, 0x2d, 0xae, 0x57, 0x10, 0x0f, 0x72, 0x09, 0x19, 0x63, 0x30,
-  0x84, 0x85, 0xab, 0xb0, 0x0f, 0x07, 0xaf, 0x12, 0xe9, 0xcf, 0x8b, 0xaf,
-  0x5a, 0xcd, 0x69, 0x7d, 0x07, 0x9f, 0xbe, 0x5c, 0xa8, 0x30, 0x26, 0xd7,
-  0xf9, 0x3d, 0x93, 0xc0, 0xdc, 0xff, 0x16, 0xcc, 0x5b, 0xdf, 0x94, 0x99,
-  0xac, 0x5c, 0x01, 0x3b, 0xd8, 0x96, 0x24, 0x32, 0xe3, 0xaa, 0xa3, 0x85,
-  0x27, 0x54, 0xe9, 0x5d, 0xdd, 0x6d, 0x5c, 0xed, 0xff, 0x51, 0xde, 0x14,
-  0xf4, 0x0f, 0xfa, 0x02, 0x7d, 0xe0, 0xc5, 0xde, 0x5e, 0xb4, 0xe7, 0x2b,
-  0xfb, 0xcb, 0x1d, 0xd6, 0x1e, 0xd3, 0x7d, 0x24, 0xf0, 0x4c, 0x4f, 0xbc,
-  0xb5, 0xec, 0xff, 0x21, 0x32, 0xcb, 0x42, 0x7f, 0x1b, 0xce, 0x0f, 0xa8,
-  0xbb, 0xbc, 0x57, 0x19, 0xf9, 0x16, 0x48, 0x45, 0xf6, 0xd4, 0x93, 0x79,
-  0x29, 0x79, 0x18, 0x5d, 0x55, 0x02, 0x1c, 0x31, 0xb4, 0x28, 0xab, 0x87,
-  0xdf, 0xa3, 0x48, 0xcd, 0xdd, 0x8b, 0xe7, 0x37, 0xcb, 0xeb, 0x0c, 0xc2,
-  0xb3, 0xf9, 0xd4, 0xf4, 0x1e, 0x34, 0x76, 0x57, 0x5f, 0x90, 0x03, 0xeb,
-  0x8d, 0x87, 0x1b, 0x60, 0x02, 0x24, 0x5f, 0x8f, 0x60, 0xcf, 0x21, 0x99,
-  0x4b, 0x5a, 0xa3, 0xbe, 0x9b, 0x7d, 0xc3, 0x1a, 0x69, 0x9f, 0xa7, 0x4d,
-  0x08, 0x22, 0x5c, 0x4a, 0xfa, 0x9a, 0x11, 0xdc, 0x66, 0xe3, 0x17, 0x5f,
-  0x91, 0x8b, 0xeb, 0x13, 0x88, 0xf6, 0x59, 0xb5, 0xa5, 0xc9, 0xdb, 0x01,
-  0xef, 0x7e, 0xe2, 0x0d, 0x62, 0x23, 0x10, 0x47, 0xab, 0x9b, 0xf5, 0xb2,
-  0x81, 0xbc, 0x26, 0xaf, 0xca, 0x72, 0x6d, 0x8b, 0xea, 0xc2, 0xc1, 0x9c,
-  0x78, 0x50, 0x42, 0x06, 0xd8, 0xb9, 0x4c, 0x47, 0xde, 0x12, 0xb8, 0x6c,
-  0x5a, 0x77, 0x66, 0x2c, 0xf9, 0x9c, 0x1c, 0x65, 0x52, 0xe5, 0x5b, 0xaf,
-  0x9d, 0x17, 0x7d, 0x4e, 0xb6, 0x89, 0x96, 0x56, 0x71, 0x63, 0xe0, 0x03,
-  0x89, 0x7d, 0x40, 0x7f, 0xfd, 0xc2, 0xbe, 0x4e, 0xff, 0x31, 0xe7, 0x19,
-  0xd4, 0xd5, 0x6b, 0x46, 0x43, 0x08, 0x3c, 0x7d, 0x67, 0x07, 0x91, 0x28,
-  0x5b, 0x86, 0x77, 0xb3, 0xcf, 0xda, 0xf6, 0x17, 0x9b, 0xf0, 0xe7, 0x6a,
-  0x88, 0x18, 0x55, 0x8d, 0x20, 0xe5, 0xa6, 0x65, 0xa0, 0xdb, 0x12, 0x16,
-  0x92, 0xcb, 0x1e, 0xa1, 0xf7, 0x2b, 0x3a, 0x4e, 0x3d, 0xd7, 0xae, 0xff,
-  0xd4, 0xb3, 0x9d, 0xff, 0xa9, 0xe7, 0xba, 0xff, 0x53, 0xcf, 0x0d, 0xe0,
-  0xa7, 0x1e, 0xb1, 0x36, 0xd2, 0x20, 0x02, 0x6b, 0xf1, 0x17, 0x2f, 0xfa,
-  0x26, 0x7f, 0xd5, 0x7d, 0xd4, 0xfb, 0xa6, 0xf7, 0xc9, 0xde, 0xe6, 0xba,
-  0x49, 0xf3, 0xc3, 0x44, 0x44, 0x72, 0x94, 0x76, 0xe7, 0xd0, 0x08, 0xec,
-  0xd6, 0x34, 0xb9, 0x69, 0x21, 0x0b, 0x2d, 0xf0, 0x9a, 0x7b, 0x0f, 0xd0,
-  0x8c, 0xbb, 0x12, 0x4e, 0x5e, 0x75, 0x02, 0x4b, 0xfa, 0xa8, 0xeb, 0xa0,
-  0x15, 0x91, 0x83, 0xc2, 0xa4, 0xf6, 0xf5, 0xe0, 0x06, 0xfa, 0x1f, 0xe6,
-  0x0b, 0x30, 0x02, 0xd0, 0x86, 0x9c, 0x6a, 0x30, 0xbd, 0x08, 0x2e, 0x0e,
-  0x90, 0xe5, 0x82, 0x03, 0x98, 0x7c, 0x01, 0x5e, 0x71, 0xa6, 0x0f, 0x6f,
-  0x89, 0x00, 0xc9, 0x3e, 0xcf, 0x51, 0xbb, 0xcb, 0x8c, 0x6a, 0xc6, 0x66,
-  0xea, 0x0e, 0xdd, 0x0b, 0x40, 0x9e, 0xa2, 0xa0, 0x56, 0x0d, 0x3b, 0x5d,
-  0x2c, 0x58, 0x29, 0x8b, 0xc5, 0xf3, 0xb0, 0x7a, 0x4b, 0x93, 0x36, 0x3e,
-  0x2b, 0xab, 0xfa, 0x45, 0xaf, 0xa2, 0x62, 0xa8, 0xc9, 0x75, 0x65, 0xd4,
-  0xd8, 0x2f, 0x68, 0x6b, 0x2d, 0xcd, 0x62, 0xb9, 0x73, 0xfa, 0x69, 0x30,
-  0xbf, 0x33, 0xfd, 0xde, 0xfc, 0x45, 0x3b, 0xc3, 0x13, 0x69, 0x53, 0xc4,
-  0xd1, 0x8d, 0x70, 0x9c, 0x27, 0x5d, 0x10, 0x01, 0x1f, 0x5d, 0xef, 0x50,
-  0xca, 0xef, 0x5f, 0xc4, 0x38, 0xe1, 0x82, 0x81, 0x78, 0x92, 0x17, 0xf6,
-  0xda, 0x8b, 0xb3, 0x6f, 0xbf, 0xd0, 0x06, 0x7e, 0xea, 0xfd, 0x30, 0xe0,
-  0x9f, 0x22, 0xab, 0xf6, 0x20, 0x39, 0xfb, 0x96, 0x76, 0xf7, 0x2f, 0x13,
-  0x60, 0xeb, 0x3e, 0xf0, 0x15, 0xff, 0x05, 0x3b, 0x7b, 0x5d, 0xb3, 0x97,
-  0x0e, 0x7c, 0xf0, 0x82, 0xca, 0xfa, 0x22, 0xc9, 0x07, 0xa6, 0xf8, 0x62,
-  0x41, 0xa9, 0x3b, 0x9a, 0x45, 0xda, 0x70, 0x16, 0x29, 0x6b, 0x97, 0xe3,
-  0x92, 0x81, 0xf8, 0x4d, 0xc8, 0x20, 0x0d, 0x06, 0x5b, 0xac, 0x2d, 0x67,
-  0xb5, 0x9b, 0x0d, 0x45, 0xde, 0x0b, 0xe8, 0xc4, 0x3a, 0xbb, 0xe4, 0x34,
-  0x84, 0x02, 0xd7, 0x32, 0x79, 0x8e, 0x23, 0xd5, 0x02, 0x1c, 0x0b, 0x10,
-  0xff, 0x0d, 0x9a, 0x99, 0xad, 0x58, 0x4d, 0x65, 0xc7, 0xd2, 0x2a, 0xd3,
-  0x52, 0x32, 0x52, 0xe4, 0x8e, 0xeb, 0x99, 0x7d, 0x11, 0x8b, 0x08, 0x48,
-  0xa0, 0x52, 0x60, 0xe0, 0x57, 0xe5, 0x4c, 0x6a, 0x9b, 0xd7, 0x66, 0xd7,
-  0xf3, 0x02, 0xdb, 0xba, 0x72, 0x46, 0xe7, 0xa0, 0xa9, 0x90, 0x80, 0x85,
-  0x7c, 0x36, 0xa2, 0x74, 0x48, 0x60, 0x91, 0x1d, 0x72, 0xa0, 0x90, 0x13,
-  0x66, 0x2d, 0xde, 0xf8, 0x5f, 0x90, 0xe5, 0x3f, 0xce, 0xe0, 0x81, 0xb2,
-  0x79, 0x92, 0x03, 0xf1, 0x11, 0x47, 0xdc, 0x38, 0x89, 0x3d, 0x37, 0x7a,
-  0x70, 0x18, 0x11, 0xa1, 0xe9, 0x92, 0x44, 0xb9, 0xf4, 0x9a, 0x94, 0x42,
-  0x01, 0x91, 0x6b, 0x09, 0x18, 0xba, 0x5e, 0xe2, 0x83, 0xc5, 0x19, 0x56,
-  0x45, 0x22, 0x3c, 0x6d, 0xc9, 0x1f, 0xc5, 0xa5, 0xac, 0x8f, 0xa5, 0xa2,
-  0x71, 0xc9, 0x62, 0x0d, 0x83, 0x17, 0x7e, 0x10, 0xc8, 0xce, 0x60, 0xef,
-  0xc0, 0x2b, 0xe7, 0xc3, 0x3f, 0x8b, 0x37, 0xef, 0xb3, 0xa5, 0x68, 0xac,
-  0xb8, 0x96, 0xe9, 0x5f, 0xd3, 0xfe, 0xbe, 0x6d, 0x7f, 0x23, 0x42, 0x50,
-  0xc2, 0x14, 0x22, 0xf1, 0xcf, 0x12, 0x37, 0xa8, 0x62, 0xf0, 0xc4, 0x8d,
-  0xea, 0x39, 0x34, 0x12, 0xf6, 0x25, 0xa8, 0x33, 0xc1, 0x16, 0xe6, 0x63,
-  0x06, 0x93, 0x48, 0x19, 0x79, 0x64, 0x03, 0x4d, 0x99, 0x85, 0x89, 0x47,
-  0x62, 0x26, 0xb2, 0x6b, 0x29, 0x4a, 0xed, 0x7a, 0xde, 0x5a, 0xe5, 0x9c,
-  0x18, 0x4b, 0xa7, 0x07, 0xae, 0x0c, 0x24, 0xfc, 0x01, 0xea, 0xf7, 0xd0,
-  0x3a, 0x5e, 0x9a, 0xce, 0x1a, 0x24, 0x16, 0xb6, 0x18, 0x81, 0x83, 0x4f,
-  0x19, 0x61, 0xcc, 0x2c, 0x45, 0xb0, 0x53, 0xe4, 0x2c, 0x6c, 0x6d, 0x8a,
-  0x6f, 0x85, 0x3e, 0x44, 0xd5, 0x13, 0x01, 0x55, 0xc2, 0x70, 0x53, 0x10,
-  0x4b, 0xc8, 0x0c, 0x0c, 0x22, 0x7a, 0xc7, 0x01, 0x84, 0xbb, 0x3d, 0x15,
-  0xcc, 0xa9, 0x03, 0x4a, 0x1d, 0x35, 0x9f, 0x99, 0xff, 0xaa, 0xc5, 0xa3,
-  0x13, 0xda, 0xca, 0xde, 0x14, 0x4b, 0x63, 0x6c, 0xa0, 0x3a, 0xb4, 0x60,
-  0x9a, 0x6c, 0xbe, 0xd8, 0xde, 0xb4, 0x43, 0x5b, 0x6d, 0x1a, 0x75, 0x4a,
-  0x25, 0x3a, 0x9e, 0x73, 0xc6, 0x51, 0x99, 0xd6, 0xe1, 0x60, 0x9a, 0x13,
-  0x10, 0x22, 0x1b, 0x60, 0x3d, 0xa3, 0x64, 0x73, 0xb5, 0xb2, 0x56, 0x90,
-  0x99, 0x55, 0xe0, 0x7c, 0x32, 0x2d, 0x0a, 0x6f, 0xf2, 0x74, 0xd6, 0x10,
-  0x54, 0x1e, 0xc9, 0x0c, 0x4c, 0x8c, 0x57, 0x1f, 0x78, 0x3a, 0x79, 0xe4,
-  0x80, 0x52, 0x44, 0x07, 0xc5, 0x06, 0xc4, 0x33, 0xe2, 0x39, 0x36, 0xd6,
-  0x29, 0xdf, 0x9b, 0x2f, 0xb6, 0xf8, 0xca, 0x72, 0x6e, 0x35, 0xef, 0xdb,
-  0x9b, 0xc9, 0x4f, 0xf1, 0xcc, 0xd2, 0x84, 0xdf, 0xf5, 0xac, 0x04, 0xd9,
-  0xb4, 0xf7, 0xbd, 0x91, 0x3c, 0x1f, 0x97, 0xd3, 0xbb, 0x2f, 0x11, 0x7f,
-  0x92, 0x57, 0x9e, 0xef, 0xe0, 0x47, 0x1d, 0xa5, 0x79, 0x55, 0x43, 0x68,
-  0xc5, 0x2c, 0x15, 0xfe, 0xfc, 0x8a, 0x1e, 0x57, 0x9b, 0x61, 0x33, 0x19,
-  0x0e, 0x8d, 0x18, 0xaa, 0xe7, 0xa8, 0x5c, 0xb5, 0xe6, 0x6a, 0x61, 0x6a,
-  0x38, 0x5c, 0xb2, 0xe3, 0xcc, 0xb1, 0xcb, 0xb0, 0x2d, 0x63, 0x8d, 0x6d,
-  0xf1, 0x47, 0xf2, 0x6f, 0xab, 0x17, 0xc3, 0xe4, 0x50, 0x61, 0x33, 0x1b,
-  0x11, 0x76, 0x1a, 0xf3, 0x28, 0xdf, 0x1f, 0x5e, 0x5a, 0xf6, 0xe7, 0xe3,
-  0x5c, 0xfc, 0xed, 0xd3, 0xb2, 0x45, 0x52, 0x99, 0x30, 0xfd, 0x01, 0x5d,
-  0xf1, 0x71, 0xe1, 0x6d, 0xf6, 0x4c, 0xc5, 0xf1, 0x22, 0x16, 0x11, 0xd6,
-  0x8c, 0x91, 0xce, 0x0d, 0x8e, 0xe5, 0x9b, 0x2a, 0x4d, 0xfb, 0xc9, 0x67,
-  0xfa, 0xb1, 0xee, 0xf5, 0x5c, 0xc0, 0x2b, 0xf1, 0x37, 0x30, 0xe4, 0x7e,
-  0x3e, 0xa0, 0xa7, 0xbc, 0x2a, 0xaa, 0x96, 0x0e, 0xc1, 0x0d, 0x1b, 0xa1,
-  0xb7, 0xbe, 0x14, 0x07, 0x9d, 0x86, 0xf4, 0x15, 0x79, 0xc1, 0xc5, 0x8d,
-  0xf8, 0x5a, 0x18, 0xa7, 0x75, 0xf6, 0xf4, 0x31, 0x8f, 0x92, 0xa7, 0x4a,
-  0x3c, 0x35, 0x2d, 0x97, 0x2c, 0x5f, 0x48, 0x55, 0x18, 0x11, 0xb4, 0x43,
-  0xe4, 0x14, 0x5f, 0xd2, 0xd3, 0xa8, 0x60, 0x16, 0xa3, 0x61, 0xe9, 0x62,
-  0x35, 0x3a, 0xe5, 0x75, 0x83, 0xd4, 0x9e, 0xcf, 0x9e, 0x7a, 0x1d, 0xbf,
-  0xc7, 0x77, 0xe1, 0xce, 0x3b, 0x4e, 0xa0, 0x1c, 0x71, 0x19, 0x91, 0x37,
-  0x04, 0x36, 0xde, 0xcd, 0x77, 0x83, 0x7e, 0x91, 0xe3, 0x83, 0xc9, 0xba,
-  0x64, 0x84, 0xd6, 0xe1, 0x78, 0xdf, 0x79, 0xf2, 0x4f, 0xc3, 0x17, 0xba,
-  0x7b, 0xba, 0x9f, 0x5e, 0xbb, 0xbb, 0x3d, 0x6b, 0x49, 0xdf, 0xe7, 0x4e,
-  0xf0, 0x0e, 0xbf, 0x7f, 0x83, 0x53, 0x50, 0xe1, 0x6a, 0x59, 0xe1, 0x22,
-  0x92, 0xc7, 0x58, 0x5f, 0xd0, 0x84, 0x21, 0x51, 0xd9, 0xdf, 0x1c, 0xbe,
-  0x7d, 0x77, 0x78, 0xfa, 0xf0, 0x32, 0x3a, 0xad, 0xe2, 0x6c, 0xc3, 0xf5,
-  0x55, 0xdd, 0x5c, 0x8e, 0x70, 0x8b, 0xc3, 0x50, 0xd2, 0x8c, 0x63, 0xe4,
-  0x02, 0x01, 0x1c, 0x54, 0x98, 0x06, 0xba, 0x38, 0x3e, 0xca, 0xe0, 0xa2,
-  0xdd, 0x45, 0xd0, 0x91, 0x38, 0x6f, 0x0e, 0x63, 0x72, 0x25, 0x70, 0xee,
-  0x61, 0x3a, 0xd3, 0x5a, 0x6a, 0x19, 0xf6, 0xf4, 0x7d, 0x7a, 0xbd, 0x27,
-  0x48, 0x6e, 0x9b, 0xb6, 0x1d, 0x53, 0x7f, 0x6c, 0x9e, 0xb9, 0x05, 0x65,
-  0x69, 0xd1, 0x67, 0xb9, 0xdd, 0x5a, 0xee, 0xb8, 0xf2, 0xca, 0x43, 0x3d,
-  0x77, 0xa3, 0x7e, 0x47, 0x47, 0xab, 0xf3, 0x5f, 0x7f, 0x4f, 0x96, 0xd1,
-  0x0e, 0x3c, 0x1c, 0xd3, 0xe8, 0x44, 0xfd, 0xa0, 0x29, 0x39, 0x3b, 0xfc,
-  0xb9, 0xf4, 0x2d, 0x3e, 0xab, 0xa6, 0x83, 0x7e, 0x90, 0x5b, 0x35, 0x5e,
-  0x94, 0x69, 0x1d, 0x1d, 0x5f, 0x60, 0xb2, 0xce, 0x0f, 0x47, 0x23, 0x7b,
-  0x31, 0xd6, 0x02, 0x56, 0xe8, 0x07, 0xb6, 0x19, 0xb4, 0x4a, 0xbf, 0x56,
-  0xc8, 0x30, 0xb1, 0x15, 0x56, 0x05, 0xe8, 0x89, 0x78, 0x90, 0x31, 0x01,
-  0x2f, 0x97, 0x73, 0x73, 0x68, 0x8c, 0x02, 0x3c, 0xdd, 0xac, 0x25, 0x3c,
-  0xdb, 0xdd, 0x7c, 0x24, 0xbf, 0xa0, 0x58, 0xc9, 0x5a, 0xd3, 0xfe, 0xa3,
-  0xb5, 0x1f, 0x69, 0x5c, 0x29, 0x75, 0xe1, 0x6c, 0x8f, 0x1a, 0xb6, 0x1f,
-  0x77, 0xb0, 0xf7, 0x46, 0x27, 0x97, 0xc7, 0x66, 0xfa, 0xde, 0x5d, 0xbe,
-  0xee, 0x49, 0xf8, 0xbb, 0x4b, 0x49, 0x01, 0x47, 0x3e, 0x95, 0x46, 0xfd,
-  0x68, 0xd3, 0x56, 0x2b, 0xf6, 0xab, 0x18, 0xe3, 0x21, 0xa6, 0x90, 0xbb,
-  0x8f, 0x0e, 0xd7, 0xac, 0xd2, 0x93, 0xe1, 0x93, 0xee, 0x2a, 0xad, 0xa6,
-  0x79, 0x66, 0xe2, 0xdf, 0x60, 0xbb, 0x0b, 0x9b, 0x30, 0x61, 0xaa, 0x76,
-  0x5c, 0xc5, 0x11, 0x04, 0xde, 0x40, 0x49, 0x03, 0x3c, 0x6f, 0xe4, 0xae,
-  0x50, 0x0a, 0x3e, 0x2f, 0x56, 0x0e, 0xce, 0x63, 0xcb, 0xd1, 0x23, 0xee,
-  0x5f, 0x0e, 0x91, 0x9a, 0x15, 0x4b, 0xab, 0xa9, 0xcd, 0xd1, 0x0c, 0x95,
-  0x45, 0x45, 0x01, 0x52, 0x1d, 0x23, 0xb3, 0x05, 0xb4, 0x8e, 0x49, 0x2b,
-  0x73, 0x36, 0xac, 0x4b, 0xe0, 0x52, 0x70, 0xe3, 0x24, 0xd4, 0x70, 0xaa,
-  0xa3, 0xb4, 0x89, 0x65, 0x53, 0x5e, 0x8b, 0x8b, 0x8c, 0xf3, 0x26, 0xd3,
-  0xbc, 0x0a, 0x8a, 0xe4, 0x39, 0xff, 0x19, 0xdf, 0xef, 0xb8, 0x7a, 0xab,
-  0x72, 0xc6, 0xfe, 0x44, 0x79, 0x83, 0xe1, 0x9d, 0x9c, 0x79, 0xc2, 0xf9,
-  0x10, 0x64, 0x36, 0x22, 0x2c, 0x0a, 0x73, 0x05, 0x45, 0xbf, 0xc3, 0x5a,
-  0x55, 0x5b, 0xa3, 0x6d, 0xeb, 0x7a, 0xbd, 0x44, 0x94, 0x11, 0xad, 0x45,
-  0x52, 0x8a, 0x3c, 0x46, 0x42, 0xd1, 0x35, 0x63, 0x94, 0x38, 0xde, 0xe9,
-  0x0d, 0x0d, 0x28, 0x08, 0xeb, 0xc9, 0xed, 0x34, 0xae, 0x8d, 0xb1, 0x97,
-  0x0b, 0xd0, 0x32, 0x98, 0x84, 0x9c, 0xc0, 0x74, 0xf4, 0xfd, 0x4b, 0xaf,
-  0x42, 0x8d, 0xa2, 0xd7, 0x78, 0xbf, 0x88, 0x76, 0xba, 0x8a, 0x42, 0x2d,
-  0x73, 0x10, 0xcc, 0x21, 0x02, 0xad, 0xd3, 0x2c, 0x5b, 0x58, 0x4a, 0xf0,
-  0x1c, 0x19, 0x2f, 0x79, 0x8d, 0xc0, 0xaa, 0xd0, 0xb1, 0xa3, 0x06, 0xdb,
-  0x8a, 0xde, 0x89, 0xe8, 0xb0, 0xd9, 0x96, 0xf4, 0x3f, 0xaa, 0xb8, 0x45,
-  0xa1, 0xdd, 0xbd, 0xcf, 0x1e, 0x7d, 0x6e, 0xee, 0xe7, 0x3b, 0x70, 0x74,
-  0xbb, 0x29, 0x63, 0x0e, 0xdd, 0xd5, 0xe4, 0x78, 0x62, 0xe1, 0x28, 0xf0,
-  0x57, 0xb8, 0x0d, 0x92, 0x9a, 0x6c, 0x0a, 0xf8, 0xab, 0x24, 0xd3, 0x38,
-  0xa4, 0x86, 0x31, 0x93, 0x28, 0x13, 0x26, 0x50, 0x3c, 0xcc, 0x13, 0xc3,
-  0xc6, 0x86, 0xde, 0x06, 0xa6, 0xf2, 0x1e, 0x54, 0x7e, 0xcc, 0x88, 0x94,
-  0x8b, 0xe3, 0xcb, 0x0b, 0xf3, 0xc7, 0xe8, 0xf2, 0xec, 0x62, 0x05, 0xa3,
-  0x61, 0xc3, 0x9c, 0x19, 0x34, 0x69, 0x0a, 0x61, 0xc1, 0x34, 0xb7, 0xa9,
-  0xce, 0x80, 0x91, 0x66, 0xb1, 0x53, 0x47, 0xd9, 0xb1, 0x3c, 0x92, 0xac,
-  0x7a, 0xd8, 0x1a, 0xe8, 0x95, 0xb9, 0x1f, 0xd6, 0x0e, 0x8c, 0xd7, 0x7c,
-  0xfd, 0x0e, 0xc1, 0x80, 0x69, 0x33, 0xd2, 0x88, 0xad, 0xa0, 0x47, 0x6f,
-  0x8d, 0x05, 0x47, 0xd1, 0x00, 0x47, 0xff, 0xae, 0x65, 0x9d, 0x57, 0x30,
-  0x59, 0x32, 0x60, 0xd7, 0x2f, 0x6d, 0xc2, 0x3e, 0xe7, 0x9e, 0x26, 0xe6,
-  0xf7, 0x92, 0x2d, 0xf8, 0x93, 0x45, 0x37, 0xb9, 0x67, 0xff, 0x1a, 0x7d,
-  0x68, 0xdb, 0x0d, 0xb8, 0x2e, 0xe7, 0x19, 0x3b, 0xfc, 0xe1, 0x16, 0xb2,
-  0xc2, 0x89, 0xef, 0x16, 0xe6, 0x73, 0x4d, 0x62, 0xe4, 0x14, 0x96, 0x77,
-  0x8b, 0x56, 0x79, 0xd3, 0x66, 0xf7, 0x97, 0xb2, 0x3b, 0x78, 0x5d, 0x32,
-  0x63, 0xb6, 0x36, 0x20, 0x34, 0xdb, 0xd4, 0x5e, 0x79, 0x84, 0x5c, 0x6d,
-  0xe1, 0xbd, 0xd7, 0x15, 0x32, 0xc4, 0x90, 0x10, 0x97, 0x2c, 0x28, 0x3e,
-  0xd7, 0x62, 0x66, 0x50, 0xdc, 0x0d, 0x74, 0x09, 0xbf, 0xee, 0xe6, 0xb9,
-  0x3c, 0x15, 0x8d, 0xb3, 0x21, 0x91, 0x90, 0x98, 0x35, 0xec, 0xde, 0x96,
-  0x25, 0xe7, 0x98, 0xcd, 0xb2, 0x2b, 0x74, 0x5b, 0x3a, 0x5d, 0x28, 0x66,
-  0x55, 0x71, 0x4b, 0x5c, 0x3d, 0xa3, 0x4e, 0xea, 0xfc, 0x9a, 0x5a, 0x59,
-  0xbf, 0x39, 0xa1, 0x4d, 0xf2, 0xae, 0x10, 0x1a, 0x97, 0xc2, 0xd8, 0x17,
-  0xc0, 0x44, 0x4c, 0xed, 0xa4, 0x11, 0xbf, 0x11, 0x41, 0xb9, 0xf8, 0xd2,
-  0x9a, 0x96, 0xac, 0xd4, 0x83, 0x0b, 0x39, 0x64, 0xca, 0x83, 0x4b, 0x19,
-  0x08, 0x03, 0xbd, 0x69, 0xa4, 0x3d, 0x67, 0x9d, 0x4c, 0x9a, 0xee, 0x48,
-  0x41, 0xb9, 0x10, 0x0c, 0xf4, 0xdc, 0x5f, 0x34, 0x16, 0x69, 0x30, 0x80,
-  0x9c, 0x2c, 0x68, 0x98, 0xf9, 0xa0, 0x45, 0x60, 0x21, 0x63, 0x8d, 0xa2,
-  0xc8, 0x0b, 0xa1, 0x97, 0xd0, 0x22, 0xf2, 0x2d, 0xde, 0x06, 0x55, 0x03,
-  0x87, 0x6b, 0x18, 0xc1, 0x7c, 0x9a, 0x87, 0xd6, 0x96, 0x6c, 0x27, 0xcf,
-  0xb7, 0x47, 0xb7, 0x32, 0x0d, 0x17, 0x1b, 0xf4, 0x82, 0x96, 0x4c, 0x69,
-  0x1c, 0x75, 0x6f, 0xe5, 0x45, 0x4e, 0xb4, 0x3e, 0x65, 0xb5, 0x43, 0xf9,
-  0x2b, 0x44, 0x74, 0x97, 0x24, 0xe6, 0x7a, 0xe4, 0x0c, 0x42, 0x51, 0xdd,
-  0x62, 0x85, 0x8c, 0xa1, 0x82, 0xb1, 0xb5, 0x69, 0x1a, 0x6f, 0x97, 0xa6,
-  0xf5, 0x2a, 0xbc, 0xd1, 0x6d, 0xea, 0x71, 0x38, 0x0c, 0x63, 0x28, 0x79,
-  0x46, 0x89, 0x00, 0x05, 0xd9, 0x56, 0xc7, 0xb4, 0x9e, 0xa7, 0x16, 0xe5,
-  0xc0, 0xba, 0x42, 0xe5, 0x03, 0x32, 0x7f, 0x45, 0xe2, 0x9d, 0x16, 0x44,
-  0x01, 0x57, 0x93, 0x99, 0x95, 0x3e, 0x23, 0x46, 0xda, 0x27, 0x13, 0x96,
-  0x43, 0xfb, 0x6b, 0x75, 0xd6, 0x2c, 0x17, 0xe1, 0x3d, 0xef, 0x52, 0x41,
-  0x6d, 0x8b, 0x38, 0xd7, 0x79, 0xe3, 0x77, 0x91, 0x28, 0x0e, 0xdc, 0xf4,
-  0xfb, 0xac, 0xf6, 0x81, 0xf9, 0x4e, 0x9a, 0x40, 0x70, 0xbb, 0xaf, 0x4a,
-  0xcb, 0xd7, 0xeb, 0x85, 0x0a, 0xeb, 0x26, 0x3d, 0xa3, 0x5f, 0xec, 0xf6,
-  0xa0, 0x41, 0x6b, 0x65, 0x04, 0xe1, 0x0e, 0xd3, 0xb7, 0xcd, 0xbc, 0x78,
-  0xfd, 0x0d, 0xcf, 0x8c, 0x66, 0xaa, 0x48, 0x86, 0x21, 0xad, 0xce, 0x16,
-  0xd5, 0x70, 0xc7, 0xf9, 0xdd, 0xde, 0x58, 0x39, 0xf4, 0x35, 0xbd, 0xea,
-  0xed, 0x3d, 0xdb, 0x1f, 0xee, 0x3d, 0xfd, 0x7c, 0xb8, 0x87, 0x0a, 0xb0,
-  0x5e, 0xdf, 0x5c, 0x99, 0x52, 0xaf, 0xa1, 0x48, 0x1d, 0xdc, 0x64, 0x35,
-  0x0d, 0x2e, 0x7f, 0x61, 0x7e, 0x37, 0xa4, 0xe7, 0x86, 0x5c, 0x8d, 0x26,
-  0xf8, 0xc6, 0xdc, 0xe8, 0x34, 0x79, 0x11, 0x84, 0x45, 0x06, 0x0e, 0x69,
-  0xc4, 0x7b, 0x71, 0x91, 0xd3, 0x36, 0x52, 0x6a, 0x4a, 0x6f, 0x9e, 0xb4,
-  0x8a, 0x9e, 0x2d, 0x0c, 0x82, 0xd3, 0x19, 0xef, 0x91, 0x8a, 0xf4, 0x89,
-  0xa8, 0x91, 0x4e, 0xaa, 0xdb, 0xef, 0x07, 0x62, 0xf3, 0x17, 0x5b, 0x7d,
-  0xc4, 0xa7, 0x62, 0x0f, 0x5d, 0x97, 0x47, 0x07, 0x7c, 0x4b, 0x5d, 0xca,
-  0x1e, 0x61, 0x60, 0xe1, 0x07, 0x5b, 0x99, 0x35, 0x5a, 0x95, 0x58, 0x9b,
-  0x03, 0x11, 0x91, 0xcb, 0xd1, 0xb1, 0xe5, 0xdf, 0xb4, 0x65, 0x8d, 0xa5,
-  0x77, 0xb9, 0x95, 0x2c, 0xe7, 0x11, 0x0b, 0x69, 0x6d, 0x8e, 0xde, 0xf9,
-  0xcb, 0x5f, 0x9c, 0x44, 0xe2, 0x72, 0xe4, 0xa8, 0x81, 0xf1, 0x04, 0xfc,
-  0xa6, 0x1c, 0xba, 0x66, 0x36, 0xfd, 0xa4, 0x77, 0xf0, 0x23, 0x5c, 0xc5,
-  0x3f, 0x0f, 0x7e, 0x34, 0xff, 0xfe, 0xb9, 0xe7, 0x91, 0x5c, 0x31, 0x55,
-  0x96, 0xc2, 0x4b, 0x36, 0xda, 0x87, 0xb9, 0x9f, 0xb4, 0xab, 0xb9, 0x42,
-  0x37, 0xb8, 0x3c, 0x3a, 0xe7, 0xe3, 0x58, 0x71, 0x1c, 0x1c, 0xfb, 0x99,
-  0x24, 0x11, 0x14, 0x7b, 0x12, 0xe2, 0xa8, 0x45, 0x61, 0x76, 0x8a, 0x9d,
-  0x4b, 0xda, 0x32, 0xa9, 0xf7, 0x52, 0x5f, 0x23, 0x43, 0xa4, 0x35, 0x56,
-  0x5c, 0xf8, 0xc7, 0x28, 0xb9, 0xd7, 0xe4, 0x68, 0x91, 0xa4, 0xf2, 0x21,
-  0x55, 0x64, 0x56, 0x85, 0x5a, 0x7e, 0xa6, 0xcd, 0x11, 0xe7, 0x56, 0x0d,
-  0x2a, 0x99, 0x5b, 0xd3, 0xb5, 0xbe, 0x90, 0xc7, 0x72, 0xea, 0x44, 0xa3,
-  0x0c, 0x87, 0x05, 0x59, 0x2c, 0x2a, 0x76, 0xab, 0xbc, 0xfe, 0x40, 0x63,
-  0x94, 0x3c, 0x20, 0xc6, 0x10, 0x6d, 0x78, 0x5a, 0x37, 0xfa, 0xa6, 0x9c,
-  0x5e, 0x04, 0x02, 0x54, 0x27, 0xa5, 0x37, 0xc5, 0xee, 0x9a, 0xd0, 0xf5,
-  0x57, 0xc6, 0x81, 0x28, 0x19, 0x96, 0x3c, 0x56, 0x65, 0x0f, 0xe0, 0x68,
-  0x13, 0x90, 0xcc, 0xb9, 0x51, 0x78, 0xed, 0x1e, 0xf1, 0xf8, 0x92, 0x28,
-  0xd1, 0x9c, 0xd6, 0x91, 0xae, 0xc1, 0xed, 0xee, 0xf5, 0x45, 0x25, 0x5e,
-  0xc8, 0x7d, 0xcc, 0xbc, 0x4d, 0x96, 0x75, 0x8c, 0x5c, 0x76, 0xa4, 0x1d,
-  0x4c, 0x2b, 0xd3, 0x0d, 0x70, 0x3c, 0x23, 0x65, 0x9e, 0x8f, 0x08, 0x05,
-  0x7f, 0x55, 0xb9, 0xdb, 0x88, 0x1a, 0x0d, 0x38, 0x71, 0x4e, 0x2b, 0x9d,
-  0xb1, 0xa7, 0xbd, 0xd6, 0x49, 0xa7, 0x3f, 0x8d, 0xd8, 0xd6, 0xb2, 0x64,
-  0xb7, 0x05, 0x8a, 0x0b, 0x27, 0xa1, 0x65, 0x83, 0xee, 0xcf, 0x63, 0x04,
-  0xb7, 0xde, 0xed, 0xba, 0xbf, 0x1b, 0xfa, 0x54, 0xa8, 0x64, 0x32, 0x26,
-  0x79, 0x90, 0x2f, 0xee, 0x9f, 0x40, 0x5a, 0x36, 0x25, 0xed, 0x6d, 0x89,
-  0x18, 0x7b, 0xd5, 0xd4, 0xcb, 0xeb, 0x6b, 0x50, 0x55, 0x84, 0xb0, 0x3d,
-  0x24, 0x35, 0x4a, 0x56, 0x81, 0x14, 0x04, 0x30, 0x12, 0x1d, 0x3d, 0xd7,
-  0xd9, 0x70, 0x99, 0x93, 0x22, 0x79, 0x6a, 0x57, 0xda, 0x63, 0x65, 0x76,
-  0x2d, 0x15, 0x84, 0xd3, 0x73, 0xee, 0x27, 0x83, 0x55, 0xd9, 0xc0, 0x16,
-  0x2d, 0xef, 0x0a, 0xc5, 0x00, 0xf6, 0xab, 0xc2, 0x11, 0x6e, 0x87, 0xd5,
-  0x62, 0x70, 0xad, 0xf7, 0x91, 0x9c, 0x6d, 0x96, 0x6d, 0x8a, 0xc2, 0x4b,
-  0xcc, 0xad, 0xc7, 0xe4, 0x68, 0x95, 0x65, 0x9b, 0x62, 0x15, 0x53, 0x44,
-  0x53, 0xf7, 0x02, 0xbd, 0xc2, 0x84, 0xac, 0x73, 0x11, 0x38, 0xa9, 0xe8,
-  0x2b, 0x4e, 0x8f, 0x87, 0xfb, 0xc1, 0xd2, 0xd6, 0xb3, 0xc1, 0x64, 0x32,
-  0x19, 0x40, 0x25, 0x78, 0xce, 0x7a, 0xca, 0x8e, 0xe8, 0x09, 0x2b, 0xdc,
-  0x07, 0xa3, 0x4c, 0x66, 0xfc, 0xe8, 0xe8, 0x48, 0x54, 0x9a, 0xcb, 0x9b,
-  0x8e, 0x72, 0x61, 0x99, 0xa0, 0x44, 0xb9, 0x8a, 0x55, 0x0b, 0xac, 0x6f,
-  0x96, 0xcd, 0x14, 0xd5, 0x84, 0x49, 0x68, 0xa8, 0x14, 0xb6, 0x89, 0xb4,
-  0x1d, 0xbe, 0x4e, 0xaa, 0xeb, 0xde, 0xb7, 0x88, 0x45, 0x6a, 0x3b, 0xc8,
-  0x34, 0x5c, 0x70, 0x0d, 0x11, 0xbc, 0x28, 0x6d, 0x77, 0x6b, 0x95, 0x72,
-  0x57, 0x7d, 0x4a, 0x2d, 0xed, 0x60, 0x1d, 0x43, 0xb9, 0x69, 0x2b, 0xf8,
-  0x6c, 0x9a, 0x0b, 0x66, 0x36, 0x95, 0x6f, 0x75, 0xdb, 0xbe, 0x67, 0x3d,
-  0x64, 0xaa, 0xdb, 0x4b, 0xf2, 0x74, 0xe5, 0x92, 0x44, 0x27, 0x9f, 0x0c,
-  0x2c, 0x9a, 0xf6, 0xad, 0x23, 0x90, 0x7d, 0x1e, 0xc9, 0x91, 0x38, 0xba,
-  0x21, 0x64, 0x17, 0xe8, 0x2f, 0x4c, 0x97, 0x6b, 0x16, 0x03, 0x72, 0xab,
-  0x8c, 0x46, 0xa7, 0x3b, 0x97, 0xa7, 0xa3, 0x00, 0x10, 0x7f, 0x47, 0xde,
-  0x63, 0x2e, 0x42, 0xdd, 0xf2, 0x7e, 0xf2, 0x14, 0x81, 0x5c, 0xb9, 0xbc,
-  0x6a, 0xef, 0x70, 0xfe, 0x4a, 0x94, 0x87, 0x64, 0x59, 0x68, 0xa6, 0x8c,
-  0xbd, 0xc6, 0x8b, 0xac, 0x40, 0xa6, 0x39, 0xdd, 0xe6, 0x38, 0x01, 0x40,
-  0xca, 0xd6, 0xc9, 0xdb, 0xc3, 0x4b, 0xca, 0x7e, 0x69, 0x04, 0xfc, 0x41,
-  0xde, 0xa0, 0x00, 0xae, 0x2f, 0x7c, 0xad, 0x96, 0xe1, 0x32, 0x9d, 0xb8,
-  0x7a, 0x22, 0xaa, 0xb7, 0xf3, 0xf2, 0xd5, 0xba, 0xf1, 0xd6, 0x4d, 0xbf,
-  0x99, 0x52, 0xb9, 0x1f, 0xba, 0x7b, 0xbe, 0xbb, 0x1a, 0x7b, 0xd1, 0xd5,
-  0xe0, 0x09, 0x88, 0x1f, 0x87, 0x0b, 0x11, 0xe6, 0x3a, 0xd1, 0x1a, 0x74,
-  0x93, 0xee, 0xcf, 0xca, 0xeb, 0x9c, 0x9c, 0x82, 0x58, 0x2f, 0xec, 0x6b,
-  0x2d, 0xa3, 0xde, 0x95, 0xc1, 0x3c, 0x3b, 0x35, 0x67, 0xea, 0xb4, 0xd3,
-  0xae, 0xf8, 0x88, 0xd0, 0x4d, 0x61, 0xe7, 0xd4, 0x96, 0x32, 0xd2, 0x1c,
-  0xc9, 0x30, 0x05, 0x11, 0x74, 0x8d, 0xf9, 0xc4, 0x58, 0x0b, 0x13, 0xc2,
-  0x85, 0x20, 0x5f, 0xb0, 0x6e, 0xc3, 0x6f, 0xf3, 0x16, 0x3d, 0xa4, 0x3a,
-  0x4b, 0xeb, 0xe5, 0x22, 0x9a, 0x23, 0x24, 0x23, 0x5c, 0xeb, 0x92, 0x7f,
-  0xda, 0xba, 0x3e, 0xbe, 0x21, 0xe3, 0xec, 0x3a, 0xb8, 0x76, 0x2d, 0x55,
-  0x45, 0x84, 0x8f, 0x0f, 0xda, 0x2a, 0x38, 0x00, 0xa4, 0x48, 0xb0, 0x4f,
-  0x89, 0x4e, 0xc6, 0xd6, 0x60, 0xda, 0x8f, 0xf2, 0xd9, 0xf7, 0xbb, 0x15,
-  0xc1, 0x98, 0x2d, 0xb0, 0x4d, 0x23, 0xdd, 0xa2, 0xeb, 0x51, 0x10, 0x70,
-  0xa7, 0xb9, 0x6f, 0x8e, 0x5d, 0xf9, 0x81, 0x0e, 0xa7, 0x4f, 0xab, 0x34,
-  0x01, 0x43, 0x75, 0x28, 0x24, 0x75, 0x4b, 0xc5, 0x4c, 0x6f, 0x57, 0xd8,
-  0x3b, 0xac, 0xcf, 0x5e, 0x3a, 0x36, 0x73, 0x3e, 0x1f, 0x5a, 0xf2, 0x41,
-  0x45, 0x16, 0x51, 0xc2, 0x68, 0xe0, 0xfe, 0xdf, 0x37, 0x5d, 0x81, 0x9d,
-  0xe1, 0x4a, 0xfe, 0xbe, 0xbc, 0x68, 0xd7, 0xeb, 0xd5, 0xf9, 0x71, 0x91,
-  0xa8, 0xbe, 0xeb, 0xb4, 0xfd, 0x76, 0x9c, 0x9b, 0xfb, 0x9e, 0x1e, 0xbd,
-  0x3e, 0x3e, 0x7c, 0x69, 0xd9, 0x06, 0x7e, 0x5d, 0x84, 0x87, 0x1d, 0x24,
-  0xea, 0x27, 0x03, 0xe0, 0x1e, 0xc4, 0x04, 0x2b, 0x9c, 0x24, 0xd6, 0x11,
-  0x36, 0xce, 0xb8, 0x8e, 0xc2, 0x52, 0xbd, 0x26, 0x58, 0x1f, 0xdd, 0xaa,
-  0xd8, 0x2d, 0x46, 0x65, 0xab, 0x33, 0x3e, 0x23, 0x2b, 0xcb, 0x09, 0xac,
-  0x74, 0x93, 0xf8, 0xb8, 0x04, 0x71, 0x5f, 0x93, 0xd2, 0xcc, 0xc9, 0x57,
-  0xde, 0x56, 0xbe, 0xc6, 0x56, 0x9e, 0x95, 0xe3, 0xf2, 0xea, 0x6a, 0xcd,
-  0xfd, 0xce, 0xc4, 0x8d, 0x48, 0x92, 0xe2, 0x2d, 0xd3, 0xa3, 0x69, 0xa4,
-  0xf7, 0xc6, 0x4c, 0xec, 0x59, 0x99, 0xc3, 0xd6, 0x93, 0xcc, 0x05, 0x29,
-  0x64, 0x1f, 0x5c, 0x3d, 0x7e, 0xee, 0xba, 0x1a, 0x10, 0x6a, 0xef, 0x21,
-  0x7d, 0x9f, 0x7d, 0x33, 0x0a, 0x21, 0xb2, 0xd4, 0xf8, 0x75, 0xf2, 0x9f,
-  0xff, 0xf5, 0xe3, 0xcf, 0x91, 0xfa, 0x00, 0xe4, 0xfd, 0xbb, 0xe1, 0xd4,
-  0x43, 0xf3, 0xb4, 0xb2, 0x4a, 0x5b, 0x16, 0x77, 0x86, 0xa0, 0x70, 0x70,
-  0xa3, 0xa9, 0xb3, 0xd9, 0xd5, 0xd0, 0xc3, 0x5b, 0x86, 0x17, 0x23, 0x29,
-  0x4c, 0xfa, 0x41, 0x94, 0x7c, 0xa3, 0x6c, 0x71, 0xce, 0xf0, 0x25, 0x56,
-  0x6d, 0xd4, 0xd9, 0x71, 0x80, 0x6a, 0xcb, 0xb9, 0xcb, 0x2b, 0x11, 0x49,
-  0x36, 0xd0, 0x4a, 0x24, 0xdd, 0xf8, 0xfa, 0xbb, 0x8b, 0x13, 0xeb, 0xf7,
-  0xf4, 0xe5, 0xf2, 0x8d, 0xd9, 0xa9, 0x77, 0x83, 0xec, 0x2e, 0x1b, 0x1b,
-  0x39, 0x51, 0x2b, 0x3f, 0xc4, 0x60, 0x5e, 0x27, 0xcf, 0xe7, 0x66, 0x87,
-  0xe7, 0x2b, 0x98, 0x3d, 0x5e, 0xd3, 0x6b, 0x89, 0xbe, 0x66, 0x99, 0x45,
-  0xaf, 0xcb, 0xca, 0xcc, 0xd0, 0x5c, 0x12, 0x76, 0x25, 0x6b, 0xb9, 0xed,
-  0xd9, 0x48, 0x90, 0x81, 0x12, 0xf8, 0x06, 0x3e, 0x3e, 0x16, 0xad, 0x1b,
-  0x34, 0x69, 0x1e, 0x85, 0x17, 0x14, 0xf6, 0x65, 0x3a, 0x23, 0xc5, 0xde,
-  0x58, 0xdc, 0x64, 0xba, 0xd7, 0x7d, 0xd9, 0x52, 0x95, 0xb2, 0xbb, 0x45,
-  0x99, 0x06, 0x6c, 0x9e, 0x22, 0xac, 0x2c, 0x12, 0x3b, 0xfe, 0x88, 0x6c,
-  0x29, 0x50, 0x9f, 0x97, 0x4d, 0x8a, 0x00, 0x87, 0xf3, 0xaa, 0x03, 0x60,
-  0x9f, 0x68, 0xe2, 0x90, 0xad, 0x94, 0xcc, 0x91, 0x6b, 0xa1, 0x5e, 0xdf,
-  0x2d, 0x6b, 0xed, 0xe6, 0xe0, 0x50, 0xce, 0xd3, 0xa9, 0xcd, 0xb5, 0xf7,
-  0x49, 0xfd, 0x90, 0xa7, 0x98, 0x52, 0xe2, 0x64, 0x36, 0x1b, 0x4a, 0x79,
-  0x6a, 0x00, 0xae, 0x5c, 0x9b, 0x10, 0xb9, 0x5d, 0x80, 0x49, 0x4d, 0x98,
-  0x01, 0x4e, 0x97, 0x15, 0xef, 0x3e, 0x32, 0xcf, 0xc5, 0x0d, 0x11, 0x0d,
-  0xfc, 0x5e, 0x0a, 0xad, 0xce, 0x35, 0x7c, 0x00, 0x62, 0x43, 0x80, 0xc8,
-  0x18, 0x05, 0xb8, 0x98, 0xad, 0x84, 0xde, 0x06, 0xde, 0x82, 0x64, 0x08,
-  0x2f, 0xf8, 0xb1, 0x2c, 0x78, 0xa7, 0x39, 0x0a, 0xbc, 0x3c, 0x7d, 0xf2,
-  0xe4, 0x09, 0x07, 0x5e, 0x7a, 0x27, 0xf8, 0xf0, 0xc5, 0xf1, 0xd1, 0xd9,
-  0x9b, 0x37, 0xc7, 0x6f, 0x5f, 0x1e, 0xbf, 0x54, 0xb0, 0xb1, 0x37, 0x12,
-  0xb7, 0x3b, 0xc2, 0x11, 0x11, 0x82, 0xd0, 0xcc, 0xf3, 0xde, 0x93, 0xdd,
-  0xc1, 0xfe, 0x93, 0xdd, 0xc4, 0xec, 0xc5, 0xd4, 0x26, 0xb2, 0xa5, 0xb3,
-  0x94, 0x5c, 0x02, 0x37, 0x4b, 0xa3, 0xac, 0x11, 0xe9, 0x66, 0x43, 0xc4,
-  0x1c, 0xf0, 0xc3, 0x92, 0xeb, 0x27, 0x6b, 0xc8, 0x88, 0x0e, 0x34, 0xa0,
-  0x74, 0x3a, 0xec, 0x59, 0xfe, 0x34, 0x17, 0xbd, 0x14, 0xed, 0x07, 0x1b,
-  0x74, 0x7f, 0x97, 0x3e, 0x34, 0x4c, 0x5e, 0x19, 0xfd, 0xe3, 0xaa, 0xfc,
-  0xc4, 0x7b, 0xf1, 0xe8, 0xc6, 0xa8, 0xa5, 0x59, 0x18, 0xb7, 0x6c, 0xbf,
-  0x4f, 0xaf, 0x3f, 0xe2, 0xd7, 0xff, 0x85, 0x01, 0xfb, 0x27, 0xcf, 0xda,
-  0xc6, 0xa5, 0x39, 0xc8, 0x20, 0x6c, 0xd7, 0x9c, 0xc5, 0x15, 0x5c, 0xad,
-  0x23, 0x36, 0xc9, 0x5f, 0x1f, 0x9e, 0xd3, 0xd3, 0xc6, 0x34, 0x3f, 0xfb,
-  0xe1, 0xaf, 0x2e, 0x0f, 0xf4, 0xe3, 0x9e, 0x22, 0x1d, 0x25, 0xd5, 0x15,
-  0xd5, 0xec, 0x8a, 0x30, 0x02, 0xee, 0xd4, 0x59, 0x6b, 0x14, 0xea, 0x25,
-  0x23, 0x37, 0x2a, 0x18, 0x48, 0x4a, 0xca, 0xf1, 0xe1, 0x32, 0x53, 0xb2,
-  0x72, 0x55, 0x1d, 0x63, 0x4a, 0xa9, 0xd8, 0x99, 0x0c, 0x36, 0xf2, 0x4f,
-  0x20, 0x9c, 0xa3, 0x43, 0x96, 0x17, 0x53, 0x2e, 0xf1, 0xda, 0xf6, 0xd5,
-  0x36, 0xd5, 0x32, 0xeb, 0x38, 0x52, 0x23, 0x1a, 0xd6, 0x7d, 0x34, 0x1d,
-  0x8b, 0x2a, 0x9f, 0xa7, 0x55, 0xce, 0xb5, 0xdd, 0x69, 0xd3, 0xdf, 0x72,
-  0x11, 0x4a, 0x06, 0x1c, 0x21, 0x38, 0x66, 0x69, 0x20, 0xa9, 0x33, 0x69,
-  0x84, 0x07, 0x3d, 0x9f, 0xc8, 0x39, 0x63, 0x4a, 0x24, 0x89, 0x62, 0xf2,
-  0x0c, 0xae, 0x5b, 0xbb, 0xa7, 0x6d, 0xc7, 0xc0, 0x49, 0x5f, 0x74, 0x8c,
-  0x68, 0xe2, 0x2e, 0x69, 0xbe, 0xaf, 0x4e, 0x4e, 0x8f, 0xb7, 0x93, 0x57,
-  0x59, 0x23, 0x59, 0x51, 0x0a, 0x49, 0x26, 0x3d, 0xe0, 0x0f, 0xd0, 0xbb,
-  0x2c, 0x87, 0xa0, 0x64, 0x16, 0x47, 0xeb, 0x93, 0xb3, 0x85, 0x03, 0x05,
-  0x44, 0x33, 0xac, 0x78, 0x4b, 0x62, 0x88, 0x14, 0xb0, 0x53, 0x1c, 0x9a,
-  0x06, 0x40, 0x65, 0x37, 0x90, 0x1f, 0x2d, 0xac, 0x7f, 0xca, 0xfc, 0x10,
-  0x0a, 0x93, 0x96, 0x75, 0x2f, 0x7d, 0x9c, 0x01, 0xf5, 0x5b, 0x70, 0xd2,
-  0x1c, 0x31, 0xcc, 0xeb, 0xc5, 0x8c, 0x64, 0x44, 0x8c, 0x1d, 0x66, 0x26,
-  0xb9, 0x53, 0xc0, 0x4d, 0xd3, 0x71, 0xe0, 0x3a, 0xec, 0x62, 0x0b, 0x41,
-  0xca, 0xd2, 0x78, 0xbd, 0x89, 0x7b, 0xad, 0x13, 0x47, 0xc0, 0x14, 0xfe,
-  0x73, 0xe7, 0xab, 0x28, 0x71, 0x99, 0x54, 0x9e, 0x40, 0x31, 0x5a, 0x79,
-  0xc1, 0x8c, 0x58, 0xcb, 0x93, 0xcb, 0xc5, 0xaf, 0xca, 0x68, 0x6b, 0x27,
-  0xc4, 0xb4, 0x5a, 0xec, 0x87, 0xc4, 0xda, 0xc1, 0x7f, 0x95, 0x02, 0x48,
-  0xaa, 0x56, 0x50, 0xea, 0xb8, 0xbb, 0x74, 0x32, 0xef, 0xa3, 0x75, 0xb4,
-  0xd2, 0x18, 0x8b, 0x6a, 0x29, 0x76, 0xcb, 0x2a, 0x16, 0xc1, 0xfb, 0x53,
-  0xc5, 0xf7, 0x6b, 0x87, 0xe9, 0xb1, 0x1b, 0x61, 0x9a, 0x86, 0x83, 0x85,
-  0x13, 0xcf, 0xea, 0x48, 0x50, 0xc0, 0x25, 0xd6, 0xd9, 0xf8, 0x1f, 0x17,
-  0x2c, 0x65, 0x87, 0xa7, 0x62, 0x13, 0xfa, 0x92, 0x0e, 0xf6, 0x89, 0x9f,
-  0x99, 0xdd, 0x45, 0x54, 0x28, 0xf9, 0xba, 0x2f, 0x97, 0xba, 0xaa, 0xbc,
-  0xfd, 0x46, 0x69, 0x39, 0x77, 0xc4, 0x40, 0x0d, 0x75, 0x48, 0x9a, 0x3b,
-  0x2e, 0x42, 0x97, 0x81, 0x36, 0xa9, 0xa9, 0xf2, 0xc9, 0x87, 0x9c, 0x3c,
-  0xa4, 0x75, 0xb3, 0x84, 0x9e, 0x97, 0x16, 0x7e, 0x2f, 0x2d, 0x33, 0xfb,
-  0xb4, 0xc4, 0x4c, 0xc7, 0x55, 0x52, 0x52, 0x9b, 0xc8, 0x93, 0x40, 0x84,
-  0xa9, 0xda, 0x1b, 0x1e, 0x8d, 0x3d, 0x2b, 0xb6, 0xfe, 0x29, 0xa5, 0x50,
-  0x62, 0x65, 0x17, 0x11, 0x1a, 0xe7, 0x0c, 0xa5, 0x8c, 0xe1, 0x0b, 0xbc,
-  0x15, 0x7a, 0xb2, 0xcd, 0x2a, 0x63, 0x2a, 0xf9, 0xa1, 0x31, 0x50, 0xe7,
-  0x94, 0x43, 0x00, 0x54, 0xae, 0x0c, 0x59, 0xa6, 0xc7, 0x88, 0xbb, 0xeb,
-  0xfc, 0x63, 0x14, 0x87, 0xa1, 0x1d, 0x03, 0x8a, 0x43, 0x7b, 0xa1, 0x08,
-  0x65, 0x17, 0xf0, 0x16, 0x97, 0x35, 0x31, 0x08, 0x06, 0x8e, 0x6b, 0x7b,
-  0x82, 0x67, 0xa4, 0xc6, 0x12, 0x19, 0x58, 0xc1, 0xa5, 0x6f, 0x5f, 0x1b,
-  0x75, 0xe8, 0xa0, 0x67, 0x09, 0xd0, 0xe1, 0x70, 0x65, 0x7e, 0x71, 0x7f,
-  0xe7, 0x48, 0x31, 0xe6, 0x41, 0xb4, 0x9c, 0x17, 0x6b, 0xf3, 0x8d, 0xca,
-  0x2d, 0x9b, 0xa0, 0x13, 0x82, 0xa0, 0x6d, 0xc2, 0x4c, 0x1f, 0xd4, 0x28,
-  0x37, 0x21, 0xc1, 0x3b, 0x75, 0xe9, 0x87, 0xc1, 0x11, 0x3e, 0x3e, 0x78,
-  0x8d, 0xf6, 0xbe, 0xe8, 0x59, 0x4f, 0x70, 0xf7, 0x57, 0x07, 0x61, 0x09,
-  0x5e, 0xdf, 0x9f, 0xc8, 0xbb, 0xa4, 0x5e, 0x56, 0x9a, 0xac, 0x04, 0xb8,
-  0x89, 0xf4, 0x12, 0xb4, 0x71, 0xd3, 0xe9, 0x8e, 0x5d, 0x74, 0xc6, 0xd6,
-  0xad, 0xaa, 0xfd, 0x6a, 0xee, 0x95, 0x05, 0x48, 0x78, 0xa6, 0x83, 0xf2,
-  0x6a, 0x00, 0x40, 0xb5, 0x91, 0xfe, 0x1f, 0x08, 0xae, 0xe4, 0x9d, 0x3a,
-  0xd0, 0x8a, 0x80, 0x2a, 0x7b, 0x3a, 0x8d, 0xe9, 0xeb, 0x9c, 0xfb, 0x48,
-  0xaa, 0x88, 0x6c, 0x7c, 0xcd, 0xcc, 0xe0, 0xc5, 0x3c, 0x10, 0x77, 0x3d,
-  0x5e, 0xb7, 0xa5, 0xa3, 0x88, 0xd1, 0x6b, 0x6d, 0xa5, 0xa9, 0x3e, 0xab,
-  0xf4, 0x18, 0x34, 0x0c, 0xbb, 0x39, 0xfb, 0x78, 0xe1, 0x98, 0x5e, 0x2e,
-  0xa0, 0xc7, 0x12, 0xfd, 0x66, 0xe0, 0x94, 0xd1, 0xac, 0x12, 0xd6, 0x07,
-  0x9e, 0x0c, 0x77, 0xfb, 0x41, 0x20, 0xbf, 0x81, 0x07, 0xa0, 0x70, 0x28,
-  0x22, 0x58, 0xba, 0x90, 0x91, 0x83, 0x68, 0x42, 0x6e, 0xdd, 0xdc, 0x91,
-  0xb4, 0xb6, 0x09, 0xb8, 0xe0, 0x0c, 0x77, 0x99, 0x12, 0x0e, 0xf6, 0x83,
-  0x39, 0x14, 0xc1, 0x89, 0xc4, 0xdb, 0x18, 0x63, 0xa9, 0x60, 0xba, 0xbe,
-  0x1a, 0x74, 0xab, 0x87, 0xda, 0x22, 0x62, 0x7e, 0xba, 0x87, 0x57, 0x0e,
-  0x6c, 0xa5, 0x03, 0x0a, 0xc4, 0xf7, 0x87, 0x5a, 0x5a, 0x67, 0x60, 0x26,
-  0x55, 0x6a, 0xa5, 0x0e, 0x32, 0xfa, 0x21, 0xd3, 0x7c, 0x28, 0x0d, 0x68,
-  0x7d, 0xcf, 0x9c, 0x3d, 0xfa, 0x8c, 0xe6, 0xcc, 0x56, 0x02, 0xd0, 0x9a,
-  0x37, 0xee, 0x82, 0xc0, 0xb6, 0xf5, 0xce, 0x52, 0x77, 0xce, 0x48, 0xae,
-  0x90, 0x24, 0x80, 0xa9, 0xcf, 0xfe, 0x4c, 0x34, 0xb1, 0x12, 0x80, 0xbc,
-  0x02, 0x19, 0x8c, 0x63, 0xf3, 0x8a, 0xb4, 0xfd, 0xc1, 0x5b, 0xb3, 0x0c,
-  0x07, 0xc9, 0x7f, 0x94, 0x19, 0x27, 0xb9, 0xde, 0x93, 0xe3, 0xfa, 0xfd,
-  0xe1, 0xc5, 0xdb, 0x93, 0xb7, 0xdf, 0x1c, 0xb8, 0x1c, 0x30, 0xc8, 0x3c,
-  0x71, 0x5f, 0xb4, 0xe1, 0x16, 0xae, 0x0a, 0x1e, 0x3d, 0x92, 0xc7, 0x8a,
-  0xbb, 0x58, 0x8d, 0x67, 0xc0, 0xd2, 0x99, 0x9d, 0x9a, 0x55, 0xc6, 0x11,
-  0x13, 0xb6, 0x50, 0x6d, 0xaa, 0x45, 0x5f, 0xeb, 0xa9, 0x71, 0x68, 0xbf,
-  0x29, 0x03, 0x83, 0x54, 0x9c, 0x28, 0xa7, 0x70, 0xa2, 0xcc, 0xca, 0x56,
-  0x71, 0x27, 0xda, 0x9d, 0x33, 0xec, 0x82, 0xd2, 0xdf, 0x08, 0x5e, 0x8d,
-  0xa6, 0x10, 0x7b, 0xc2, 0xb9, 0x33, 0xa8, 0x08, 0x8d, 0x6b, 0x02, 0xb6,
-  0x8e, 0x96, 0xb3, 0xe1, 0x9a, 0x14, 0x35, 0x16, 0xad, 0xce, 0xe1, 0x83,
-  0x70, 0x73, 0xb2, 0xc2, 0x5c, 0xc6, 0x65, 0xc6, 0x84, 0xd0, 0xe9, 0x92,
-  0x0f, 0x0d, 0x13, 0x9b, 0xc9, 0x4f, 0x5d, 0x26, 0x87, 0x9d, 0x83, 0x7b,
-  0x80, 0xcd, 0x36, 0x6f, 0x20, 0x82, 0x89, 0x46, 0x44, 0xd0, 0xc9, 0x2c,
-  0xf3, 0x27, 0xdd, 0x26, 0x51, 0x02, 0x93, 0x59, 0xe6, 0x32, 0x99, 0xac,
-  0xba, 0x73, 0xc3, 0xea, 0xce, 0x6c, 0x11, 0xf0, 0xf4, 0x11, 0x1e, 0x9d,
-  0x7e, 0x21, 0x73, 0x4b, 0x61, 0x2d, 0x5c, 0xc1, 0x6a, 0xac, 0xb4, 0x58,
-  0xf1, 0x6c, 0xc9, 0x45, 0xc5, 0xf7, 0x87, 0x57, 0x2a, 0x11, 0x45, 0x65,
-  0x4c, 0x55, 0xe6, 0xe7, 0xcc, 0x98, 0xaf, 0x9b, 0x49, 0x5e, 0x2c, 0xc7,
-  0xf3, 0xe9, 0x93, 0xe4, 0xb9, 0xf9, 0x4f, 0xa0, 0x67, 0x01, 0x58, 0x9a,
-  0x8c, 0x8e, 0xc8, 0xd4, 0x20, 0x1c, 0x0c, 0xdd, 0x1a, 0xcc, 0x96, 0xe3,
-  0x15, 0x7e, 0x78, 0xb4, 0x6f, 0x3a, 0xfb, 0x29, 0x55, 0x6e, 0xcc, 0xa9,
-  0x59, 0xc0, 0x06, 0xf8, 0xb4, 0x15, 0x84, 0x43, 0x0e, 0xc6, 0x47, 0x0b,
-  0xbe, 0xb7, 0xff, 0x79, 0x42, 0x79, 0x0a, 0x6f, 0x5e, 0x3e, 0x49, 0x26,
-  0x37, 0xd9, 0xe4, 0x43, 0xbd, 0x9c, 0x5b, 0x38, 0x24, 0x4d, 0x29, 0x19,
-  0x0c, 0xd4, 0xcf, 0x80, 0xd2, 0xc7, 0x74, 0x7c, 0x96, 0x4f, 0x28, 0x5d,
-  0xd0, 0x47, 0x96, 0x52, 0xcd, 0xe9, 0x3a, 0xeb, 0x98, 0x33, 0xee, 0xe6,
-  0x00, 0xa6, 0x80, 0x81, 0x37, 0x91, 0xb0, 0x86, 0x99, 0x03, 0xf3, 0xf9,
-  0x9a, 0x4b, 0x45, 0xaf, 0x75, 0xe6, 0x7e, 0xd6, 0xf2, 0x87, 0xef, 0x62,
-  0x29, 0xcd, 0xf9, 0xde, 0x1b, 0xee, 0xae, 0xa8, 0xed, 0x0e, 0x08, 0x8b,
-  0x06, 0x02, 0xa9, 0x87, 0xb0, 0x06, 0x48, 0xc7, 0xa7, 0xfe, 0x99, 0xf7,
-  0x7c, 0x2d, 0x4c, 0x61, 0xcc, 0x66, 0x22, 0x57, 0xe0, 0xbf, 0xcc, 0xbd,
-  0x22, 0x4e, 0x93, 0x6c, 0xda, 0x6a, 0x6a, 0xad, 0xa1, 0xe4, 0xd7, 0xf2,
-  0xe2, 0xee, 0xee, 0x89, 0xf7, 0x9f, 0xfe, 0xd5, 0x8a, 0xb7, 0xc8, 0xaf,
-  0x7f, 0xe5, 0x68, 0xf6, 0x7e, 0x41, 0xc2, 0xc0, 0x6e, 0xdf, 0x7d, 0x6f,
-  0xd7, 0x96, 0x26, 0xe3, 0x0e, 0xb9, 0x49, 0xef, 0x34, 0x17, 0x32, 0xa0,
-  0xe3, 0x05, 0x4a, 0xba, 0x28, 0xab, 0x01, 0xe9, 0x84, 0xb3, 0x6c, 0x1a,
-  0x5c, 0xd1, 0xd1, 0xee, 0x1b, 0x65, 0xa3, 0x5e, 0x2a, 0x7d, 0x09, 0x45,
-  0x12, 0x10, 0xaa, 0x60, 0xae, 0x2d, 0x57, 0x30, 0x24, 0x06, 0x1c, 0xa7,
-  0x67, 0x76, 0xf6, 0x9d, 0x1f, 0x91, 0x7f, 0x40, 0x93, 0x9a, 0xbc, 0x5b,
-  0x5c, 0x57, 0x29, 0x05, 0x51, 0x28, 0x4b, 0xcb, 0x12, 0xc1, 0xa3, 0x77,
-  0xc9, 0xaa, 0xde, 0x39, 0x46, 0x2a, 0x0d, 0x06, 0x23, 0x7b, 0xb0, 0xd6,
-  0xef, 0xd4, 0x94, 0x96, 0x09, 0xad, 0x92, 0x8b, 0x86, 0x25, 0x42, 0xdb,
-  0xae, 0x9d, 0x8c, 0x51, 0xce, 0x9a, 0x97, 0x98, 0x9b, 0xb4, 0xd4, 0x56,
-  0x5a, 0x78, 0x6e, 0x22, 0xd3, 0x66, 0x75, 0x52, 0x4b, 0xb8, 0x39, 0x32,
-  0xf3, 0x80, 0xcf, 0x8f, 0x17, 0x57, 0x94, 0x84, 0x0e, 0xdd, 0x5c, 0x10,
-  0x77, 0x88, 0x2e, 0xc7, 0x83, 0x29, 0xf1, 0x03, 0x56, 0xa9, 0x9c, 0x1d,
-  0x33, 0x9a, 0x50, 0xc9, 0x63, 0x19, 0x3e, 0x6c, 0x73, 0xef, 0xf6, 0xa3,
-  0xbd, 0xa3, 0xdd, 0xe6, 0x6f, 0xfe, 0x16, 0x45, 0xdb, 0xb3, 0xc8, 0xe6,
-  0xfa, 0x55, 0x67, 0x61, 0x7f, 0x5d, 0xf4, 0xcd, 0x28, 0xf1, 0xe9, 0x6c,
-  0x51, 0x0c, 0xf5, 0x0b, 0x0f, 0x9a, 0x9f, 0xee, 0x32, 0xdb, 0x02, 0x02,
-  0xbf, 0x6e, 0x7e, 0xba, 0x73, 0xe3, 0xcb, 0x32, 0x7f, 0x7e, 0xba, 0x6b,
-  0xb9, 0xb6, 0x1c, 0x01, 0xe7, 0x3f, 0x6b, 0x41, 0xee, 0x01, 0x27, 0x76,
-  0xc5, 0xf2, 0x19, 0x84, 0xaf, 0x53, 0x28, 0xcc, 0xfa, 0xc9, 0x09, 0x53,
-  0xf4, 0x22, 0x88, 0x2e, 0x2f, 0x9f, 0x72, 0x56, 0x98, 0xf8, 0x61, 0x1c,
-  0x4a, 0x3c, 0x92, 0x42, 0x9a, 0x4f, 0x88, 0x1f, 0x68, 0xc6, 0x20, 0x2d,
-  0xf2, 0x02, 0x41, 0x8b, 0xb3, 0xf5, 0x18, 0x96, 0xf0, 0x7d, 0x25, 0x87,
-  0x0b, 0x4a, 0xee, 0x32, 0x52, 0xea, 0x93, 0x6a, 0xc6, 0x91, 0xe8, 0x8f,
-  0xb9, 0xd5, 0x4b, 0x80, 0xe0, 0x15, 0x2c, 0xda, 0xe9, 0x0e, 0x35, 0xcc,
-  0x1c, 0x5e, 0x33, 0x02, 0x47, 0x57, 0x9a, 0xe6, 0xb7, 0x4f, 0x15, 0xd7,
-  0xaf, 0x03, 0x92, 0xf0, 0xf1, 0x5d, 0x13, 0x49, 0x5d, 0x00, 0x49, 0x19,
-  0x4d, 0xc3, 0x56, 0x2d, 0xd0, 0xa8, 0xc7, 0x4f, 0x87, 0xbb, 0xdb, 0x7d,
-  0x2a, 0x35, 0xbc, 0xc0, 0x24, 0x10, 0xb8, 0xdc, 0x5e, 0xf7, 0x94, 0x5b,
-  0x91, 0x5f, 0x93, 0x05, 0x25, 0x98, 0xe5, 0x00, 0xe5, 0xfd, 0x8f, 0x4c,
-  0x11, 0x39, 0x0a, 0x77, 0x11, 0xda, 0xc4, 0x76, 0x5a, 0x55, 0xde, 0x47,
-  0xe1, 0x22, 0xb8, 0x4b, 0xba, 0x3e, 0x4e, 0x71, 0xa2, 0xd0, 0xc7, 0x55,
-  0x06, 0x2a, 0x33, 0xb7, 0x55, 0xc0, 0x6c, 0xe9, 0x52, 0xa1, 0x9c, 0x17,
-  0x17, 0x74, 0xc4, 0xb7, 0x12, 0x79, 0x79, 0x02, 0x7b, 0x5b, 0xbf, 0x02,
-  0xb3, 0x08, 0x8a, 0xa7, 0x48, 0x3d, 0x32, 0x5c, 0xfa, 0x4a, 0xe5, 0xdf,
-  0x3d, 0xb9, 0x53, 0xf0, 0x40, 0xb3, 0x76, 0xe0, 0x28, 0x4f, 0x5b, 0x07,
-  0x4e, 0x69, 0x4a, 0x87, 0xc3, 0x61, 0x24, 0x23, 0xfb, 0x63, 0x9e, 0xdd,
-  0xb6, 0xbc, 0x43, 0xd2, 0xad, 0xbe, 0xa5, 0xfb, 0x67, 0x9b, 0xe4, 0x23,
-  0xcd, 0x90, 0x69, 0x72, 0x5c, 0xda, 0xa2, 0xd6, 0x6b, 0x0e, 0xb2, 0xff,
-  0xb4, 0x37, 0xcd, 0x1f, 0x78, 0x9a, 0xeb, 0x58, 0x0e, 0x13, 0x13, 0x7c,
-  0x3a, 0x76, 0xf2, 0x3e, 0xa9, 0xe8, 0xd5, 0x5d, 0x02, 0x1a, 0x7a, 0xa7,
-  0xb8, 0x40, 0xae, 0x30, 0x66, 0x36, 0xaf, 0x99, 0x5f, 0x93, 0xa9, 0x31,
-  0x22, 0x41, 0x0d, 0xfe, 0xce, 0xb0, 0x7d, 0xe5, 0x8b, 0xe7, 0xc6, 0xd6,
-  0x5a, 0xaf, 0xca, 0x09, 0x19, 0x47, 0x28, 0x5f, 0x2b, 0xbc, 0xda, 0x64,
-  0x1b, 0x44, 0x62, 0xe4, 0xb2, 0x1e, 0x1e, 0x0f, 0xbf, 0x17, 0xd2, 0x75,
-  0xc5, 0x11, 0x12, 0x1d, 0x60, 0x34, 0x2c, 0x11, 0x34, 0xd2, 0x1a, 0xc6,
-  0xf8, 0x4e, 0x8b, 0xfa, 0x58, 0xc7, 0x80, 0x2d, 0x50, 0x17, 0xe8, 0x7b,
-  0x5e, 0x4e, 0x55, 0xe2, 0x78, 0x61, 0x7c, 0x6f, 0x8b, 0x65, 0x6e, 0x92,
-  0x0f, 0xd4, 0x1e, 0xe5, 0x6b, 0x40, 0x7f, 0xee, 0x55, 0x96, 0xcf, 0x28,
-  0x93, 0x8c, 0x2a, 0x48, 0x44, 0x97, 0x98, 0x8d, 0x70, 0x4e, 0xdb, 0xa6,
-  0x1a, 0x26, 0x4b, 0x8a, 0x8f, 0xe2, 0xf8, 0x4b, 0xd6, 0xa5, 0x24, 0x5a,
-  0x76, 0xb3, 0xf1, 0x2d, 0xab, 0x11, 0xcd, 0xfd, 0xf0, 0x26, 0xfd, 0xf4,
-  0x69, 0x58, 0x67, 0x3b, 0x66, 0xd7, 0xd6, 0x3b, 0x75, 0x3d, 0xa3, 0x8f,
-  0xd6, 0x20, 0x10, 0x5a, 0x5b, 0x1e, 0xcd, 0xd8, 0xaf, 0x3a, 0xbf, 0x22,
-  0x8c, 0x27, 0x29, 0xbd, 0xda, 0x12, 0xb6, 0xae, 0x3e, 0x1a, 0x97, 0x3b,
-  0xe8, 0xa2, 0xdb, 0x98, 0x40, 0x95, 0x1c, 0x07, 0x7e, 0x82, 0x18, 0x4b,
-  0x06, 0x07, 0x22, 0xb0, 0xcd, 0x78, 0xc4, 0xd0, 0x44, 0x99, 0x5a, 0xad,
-  0x82, 0x23, 0x27, 0x72, 0x56, 0x7d, 0xef, 0x7d, 0x59, 0x39, 0xd8, 0xae,
-  0xb9, 0x21, 0x1c, 0x37, 0x04, 0x6a, 0x8a, 0xa0, 0x1a, 0x7a, 0x84, 0xb5,
-  0x64, 0x95, 0x21, 0xed, 0x0d, 0x8d, 0xe0, 0xcd, 0x07, 0x8e, 0x25, 0xeb,
-  0xf6, 0xf6, 0x76, 0xb8, 0xce, 0x92, 0xfe, 0xa7, 0x43, 0x35, 0xed, 0xe6,
-  0xce, 0x8a, 0xe4, 0x34, 0x2f, 0x96, 0x9f, 0x3c, 0x8a, 0x02, 0x5b, 0xd8,
-  0x42, 0xdd, 0xc4, 0xc9, 0x77, 0x17, 0xaf, 0x6c, 0x1d, 0xd5, 0x44, 0x73,
-  0xc3, 0xe1, 0x8b, 0xa8, 0x23, 0x5e, 0xd3, 0x2c, 0xc7, 0xe6, 0x61, 0xfa,
-  0xd3, 0xa3, 0xc3, 0xf3, 0xf7, 0x6f, 0x8f, 0x2f, 0xdf, 0x5f, 0x1c, 0x7e,
-  0x4f, 0x53, 0xc8, 0x58, 0x0c, 0x73, 0x5f, 0x91, 0x8f, 0xaa, 0x2a, 0x4b,
-  0x23, 0x61, 0xdf, 0x94, 0xa8, 0x65, 0x0c, 0x7e, 0x80, 0x58, 0x05, 0x0a,
-  0xcb, 0x7a, 0xc2, 0xfd, 0xa4, 0xce, 0x1c, 0x78, 0x7b, 0x90, 0xe6, 0xeb,
-  0x83, 0xb1, 0x1c, 0xb2, 0xd9, 0xb0, 0xac, 0xae, 0x69, 0x17, 0xee, 0xbc,
-  0x14, 0xf9, 0x19, 0x6d, 0x6e, 0x47, 0x82, 0x6f, 0xc4, 0xa2, 0xf3, 0xb1,
-  0xba, 0xa2, 0x94, 0xfb, 0x75, 0x35, 0xca, 0xfd, 0x12, 0x57, 0xde, 0xd6,
-  0x7c, 0x0c, 0x01, 0xb8, 0xf8, 0xf8, 0x78, 0x9d, 0x31, 0xd0, 0xb4, 0x14,
-  0x28, 0xad, 0x2e, 0x84, 0xca, 0x42, 0xf4, 0x03, 0x3f, 0xa6, 0x9a, 0x71,
-  0x8c, 0xa4, 0x1f, 0x49, 0xda, 0x05, 0x37, 0x74, 0x69, 0x53, 0xa0, 0x91,
-  0x94, 0x41, 0xb1, 0xe0, 0xd5, 0x52, 0xdb, 0x53, 0x83, 0xba, 0x46, 0xc7,
-  0x6a, 0x63, 0xe5, 0x69, 0xa8, 0x4b, 0x52, 0xd5, 0x2e, 0x6f, 0xcc, 0x4f,
-  0x65, 0xcc, 0x4f, 0xff, 0xb9, 0x31, 0x3f, 0xfd, 0xf5, 0x63, 0x7e, 0xfc,
-  0x1b, 0x8f, 0xf9, 0x71, 0x74, 0xcc, 0xde, 0x57, 0x06, 0x7f, 0xa3, 0x31,
-  0xff, 0x6d, 0x59, 0x7c, 0x18, 0x98, 0xee, 0xd2, 0x2d, 0x2c, 0x35, 0x7c,
-  0xea, 0xb8, 0xca, 0xdc, 0x2a, 0x1b, 0x41, 0x8e, 0x26, 0x8f, 0x28, 0xd3,
-  0x2b, 0x49, 0x94, 0x4a, 0x9a, 0x21, 0x47, 0x9c, 0x56, 0x96, 0x56, 0xf6,
-  0x9c, 0x91, 0x39, 0xe5, 0xa8, 0xd5, 0x13, 0xb2, 0x6c, 0x80, 0x93, 0xea,
-  0x49, 0x77, 0x12, 0x6d, 0xb8, 0x67, 0x07, 0x1a, 0x63, 0x77, 0xa4, 0xea,
-  0xd6, 0x4c, 0xf7, 0xcd, 0x45, 0x7e, 0x6d, 0x64, 0xc6, 0x15, 0xf7, 0xa5,
-  0xca, 0xef, 0xe0, 0x31, 0xd1, 0x96, 0x73, 0xe1, 0x03, 0x0a, 0x65, 0xc6,
-  0xe5, 0xdd, 0x82, 0x9a, 0x4b, 0xc6, 0x95, 0xb9, 0x80, 0x01, 0x08, 0xe1,
-  0x9a, 0xd3, 0xda, 0xc3, 0xa4, 0xdb, 0x39, 0xeb, 0x7a, 0xbb, 0xc9, 0xee,
-  0x36, 0x03, 0x85, 0x61, 0x32, 0x2b, 0x49, 0xe2, 0x90, 0x5e, 0xb7, 0x46,
-  0x13, 0x19, 0xbb, 0x02, 0x4a, 0x7c, 0x5f, 0x74, 0x2a, 0x2a, 0xf9, 0xf7,
-  0xc6, 0x87, 0x2c, 0x5b, 0xa4, 0x33, 0xa4, 0x83, 0x53, 0x34, 0x6e, 0x55,
-  0xd9, 0x97, 0xf6, 0xc6, 0xa8, 0xb3, 0x46, 0x2f, 0x5d, 0xbc, 0xd5, 0x46,
-  0x49, 0x40, 0xd8, 0xf1, 0x6a, 0x12, 0xb2, 0x3b, 0xc9, 0xa7, 0x01, 0x83,
-  0x86, 0xe8, 0xa7, 0x1a, 0x90, 0xb3, 0x9d, 0x20, 0xd5, 0x64, 0x2c, 0xd4,
-  0x05, 0x40, 0xe2, 0x51, 0xeb, 0xca, 0x84, 0x84, 0xe0, 0xf1, 0xc7, 0x9c,
-  0x90, 0x23, 0x9d, 0xe6, 0xba, 0xef, 0x83, 0x16, 0xa5, 0xc5, 0x00, 0x6e,
-  0x19, 0x3b, 0x29, 0x38, 0x23, 0x17, 0x20, 0xb9, 0xa1, 0x50, 0x84, 0x2e,
-  0xd8, 0x52, 0xca, 0x00, 0xca, 0x43, 0xbc, 0x3c, 0x3a, 0x7f, 0xff, 0xed,
-  0xf1, 0xf1, 0xf9, 0xc9, 0xcb, 0xd3, 0x63, 0x39, 0x31, 0xf6, 0x47, 0x6f,
-  0x2f, 0xbf, 0x3b, 0xd5, 0xaa, 0x47, 0x3a, 0x3f, 0xc1, 0x86, 0x17, 0xfa,
-  0x6a, 0x11, 0xcb, 0x7d, 0x54, 0x77, 0x29, 0x9a, 0xe4, 0xf0, 0xe4, 0x07,
-  0xa3, 0xb6, 0x9e, 0x0f, 0xde, 0xfd, 0x10, 0xd0, 0xea, 0xb7, 0xd0, 0xd0,
-  0xf1, 0x22, 0xd3, 0x66, 0x13, 0xc2, 0x76, 0x74, 0x63, 0x5f, 0x85, 0x0c,
-  0xf9, 0x8d, 0xaf, 0x41, 0xd3, 0xdc, 0xb2, 0xb0, 0x1a, 0x03, 0xbf, 0xa8,
-  0x95, 0x2b, 0x3c, 0xf4, 0xc5, 0xd3, 0x5d, 0x2d, 0x0a, 0xb4, 0xd6, 0x87,
-  0xf6, 0x79, 0xdb, 0x66, 0xfc, 0x90, 0xdd, 0x81, 0x86, 0x2c, 0x79, 0x4e,
-  0xff, 0x5d, 0x51, 0xb4, 0xe9, 0xbc, 0xca, 0x3f, 0x92, 0x02, 0x68, 0x1e,
-  0xe6, 0x28, 0x03, 0x3d, 0x3b, 0xb4, 0x35, 0xac, 0x24, 0xd0, 0x41, 0xad,
-  0x20, 0x14, 0x8a, 0x56, 0x69, 0x67, 0x04, 0xc1, 0x32, 0x62, 0x73, 0x20,
-  0x7f, 0x8c, 0x6d, 0x2d, 0x37, 0x5b, 0xe7, 0xe5, 0xf1, 0x45, 0x3f, 0x39,
-  0x3f, 0x7e, 0xc3, 0x70, 0xea, 0xe3, 0xb7, 0xdf, 0x08, 0xef, 0x95, 0x96,
-  0x6a, 0x1a, 0x32, 0xc8, 0x30, 0xc4, 0x14, 0x79, 0x73, 0x62, 0x5e, 0x07,
-  0x80, 0xaa, 0xae, 0xcd, 0xed, 0xfa, 0x3b, 0x92, 0x3e, 0xf0, 0xd0, 0x9e,
-  0x9b, 0xff, 0xc4, 0xa6, 0xca, 0xd8, 0x11, 0xaf, 0xb7, 0xc3, 0xd9, 0x12,
-  0xb5, 0xcc, 0x46, 0x73, 0xc5, 0x24, 0xa0, 0xd9, 0xe0, 0x09, 0x33, 0x33,
-  0x12, 0xc6, 0x15, 0x75, 0x86, 0x0a, 0xe1, 0x76, 0x92, 0xe2, 0x8b, 0x12,
-  0x14, 0x22, 0x23, 0xd6, 0x7c, 0xad, 0x4f, 0xdb, 0x12, 0x84, 0xba, 0x6e,
-  0x2e, 0xa2, 0x19, 0x7d, 0x55, 0x2e, 0xf9, 0x2e, 0xce, 0x1d, 0x6f, 0x54,
-  0xaa, 0x69, 0x3e, 0x45, 0xca, 0xb0, 0xf9, 0x48, 0x59, 0x4d, 0x23, 0x0c,
-  0xaa, 0x34, 0xf1, 0x7a, 0x67, 0xb0, 0xbf, 0x43, 0x71, 0x42, 0x5a, 0xbd,
-  0x6b, 0x96, 0x8f, 0x2b, 0xa3, 0x72, 0x39, 0xda, 0x79, 0x29, 0xc6, 0xb5,
-  0xf8, 0x30, 0xa9, 0xf7, 0xf6, 0x22, 0xd5, 0xb3, 0x35, 0x7d, 0xa6, 0xaf,
-  0x78, 0xaf, 0xf3, 0x6f, 0x8f, 0x46, 0x7f, 0xdc, 0xdb, 0x03, 0xbc, 0x6e,
-  0x8b, 0x60, 0x50, 0x9f, 0x3d, 0xd9, 0xdb, 0xdf, 0x8e, 0x69, 0x7c, 0x41,
-  0x68, 0x98, 0x0a, 0xa8, 0xa5, 0x49, 0x6b, 0x47, 0x21, 0x44, 0x22, 0x70,
-  0x5a, 0xdb, 0xf4, 0x34, 0x23, 0x9c, 0x89, 0x59, 0x03, 0x75, 0x87, 0x03,
-  0x93, 0x13, 0x44, 0xef, 0x2c, 0xd9, 0x46, 0x8f, 0x7b, 0x7f, 0xd0, 0xb3,
-  0xdb, 0xc0, 0xc7, 0x26, 0x22, 0x84, 0xe9, 0xf5, 0x5a, 0x36, 0x68, 0x37,
-  0x06, 0xe0, 0x8f, 0x0b, 0x60, 0x19, 0xc7, 0x66, 0x92, 0xb1, 0x3b, 0xcf,
-  0x56, 0x2e, 0xf3, 0xef, 0x54, 0x14, 0xda, 0x6c, 0x42, 0x48, 0x82, 0xf4,
-  0xa9, 0xc7, 0x2b, 0x4e, 0x3b, 0x34, 0x75, 0x8d, 0xda, 0xd9, 0xf7, 0x4e,
-  0xb4, 0xdf, 0x68, 0x08, 0x10, 0xe3, 0x6f, 0x24, 0x3d, 0x73, 0xde, 0xe2,
-  0x4d, 0xfe, 0xae, 0x87, 0xa8, 0x1a, 0x27, 0xcf, 0x67, 0xe6, 0xc5, 0xd9,
-  0x8a, 0xa4, 0x8e, 0x63, 0xae, 0xf4, 0xf2, 0xad, 0xb1, 0xee, 0xb3, 0xaa,
-  0xac, 0xbb, 0x65, 0x3f, 0xa4, 0x90, 0x37, 0x23, 0xfc, 0xd0, 0x8e, 0x86,
-  0xdc, 0x03, 0xe6, 0xa8, 0x06, 0xe6, 0xb2, 0x30, 0x0b, 0xb7, 0xc9, 0x1f,
-  0x36, 0x81, 0x82, 0xdf, 0xec, 0x27, 0x9b, 0x54, 0xda, 0x84, 0xfe, 0x44,
-  0x5d, 0x6f, 0xaa, 0x42, 0x90, 0xa7, 0xb3, 0x4d, 0x2a, 0x37, 0xd1, 0xe5,
-  0xaf, 0x95, 0x9d, 0xb6, 0x39, 0xa4, 0xd4, 0x06, 0x06, 0x58, 0xd3, 0x81,
-  0xe6, 0x9c, 0xbe, 0x34, 0x91, 0xbe, 0x28, 0x6e, 0x90, 0x0e, 0xa6, 0x23,
-  0x9a, 0xa8, 0x83, 0x12, 0x1c, 0xb6, 0xb9, 0x36, 0x3f, 0xc7, 0x2a, 0xe4,
-  0xda, 0x6f, 0x7c, 0xaf, 0xf0, 0x32, 0xfc, 0xc2, 0x7a, 0xa9, 0x5e, 0x91,
-  0xdb, 0x4e, 0x73, 0xba, 0x56, 0xfe, 0x3a, 0xeb, 0xfb, 0xd1, 0x4a, 0x88,
-  0x87, 0x92, 0x82, 0xd8, 0x8e, 0xb0, 0x82, 0x0b, 0x9b, 0xc0, 0xf2, 0x53,
-  0x36, 0xe5, 0x24, 0xb3, 0xca, 0x2f, 0xfe, 0x4e, 0x7f, 0x0b, 0x41, 0x31,
-  0x18, 0x2a, 0x88, 0xeb, 0xb5, 0xdb, 0x03, 0x36, 0xb7, 0x8f, 0x12, 0x71,
-  0x1f, 0x00, 0x71, 0x7f, 0x5b, 0x11, 0x3f, 0x5f, 0xe1, 0x78, 0x3e, 0x67,
-  0xd9, 0x4a, 0xa6, 0x16, 0xe5, 0xf0, 0x33, 0x8b, 0x34, 0x93, 0xb2, 0x5a,
-  0x0a, 0x68, 0xa9, 0xb4, 0x4f, 0x03, 0x09, 0x07, 0xaa, 0x89, 0x4f, 0xef,
-  0xfd, 0xe1, 0xde, 0xbc, 0xfd, 0xfb, 0xd6, 0xce, 0xe9, 0xe0, 0xb1, 0x5c,
-  0xdc, 0x07, 0x13, 0x12, 0x75, 0x12, 0x48, 0x80, 0x44, 0x1d, 0xe0, 0x16,
-  0x79, 0x6e, 0xe4, 0x69, 0x16, 0x30, 0xb2, 0x8c, 0x5a, 0x49, 0xbc, 0x52,
-  0x71, 0x50, 0x93, 0x33, 0xf0, 0x9e, 0x2d, 0x87, 0xea, 0x6a, 0x47, 0x63,
-  0xef, 0x0f, 0xe0, 0xbe, 0xea, 0x6a, 0x9d, 0xc4, 0x93, 0xef, 0x52, 0x00,
-  0x71, 0x6a, 0xc1, 0x38, 0xa5, 0x4c, 0x1a, 0x0a, 0xb4, 0xe3, 0xe9, 0x20,
-  0xdf, 0xb1, 0x40, 0xb8, 0x60, 0x0a, 0x04, 0x54, 0xd7, 0x0c, 0xa4, 0x05,
-  0xe5, 0xbc, 0x6e, 0x82, 0xcd, 0x29, 0xfb, 0x31, 0xb1, 0x24, 0xb6, 0xab,
-  0x74, 0xf0, 0x24, 0x2e, 0xc0, 0xe0, 0x2c, 0x73, 0xa2, 0x03, 0xdd, 0x7e,
-  0x6c, 0x9a, 0xb8, 0xcd, 0xa7, 0xcd, 0x0d, 0x8a, 0x41, 0xa8, 0x29, 0x53,
-  0x4b, 0xe2, 0x29, 0xf9, 0x95, 0xf3, 0x30, 0x9f, 0x62, 0x1c, 0xf7, 0xb8,
-  0xc9, 0x82, 0x61, 0x52, 0x13, 0x66, 0x61, 0x21, 0xdf, 0x1a, 0xd6, 0x01,
-  0x5e, 0xe8, 0x1d, 0xd6, 0xcd, 0x2c, 0xff, 0x40, 0x6a, 0x4e, 0xd1, 0x15,
-  0xd5, 0x79, 0x08, 0xec, 0x2b, 0x4d, 0x7b, 0x18, 0xea, 0x09, 0xa1, 0x3d,
-  0xbc, 0xf9, 0x81, 0x89, 0x98, 0xbf, 0xdd, 0xd4, 0xa2, 0x86, 0xc4, 0xad,
-  0xe5, 0x21, 0xb3, 0x49, 0x96, 0x27, 0x1f, 0xf2, 0x59, 0x19, 0xf5, 0x81,
-  0x1b, 0xa5, 0x60, 0x73, 0xce, 0x2d, 0xbc, 0xd9, 0x54, 0xcf, 0x26, 0xe5,
-  0xe4, 0x5e, 0xa7, 0xf2, 0x7b, 0xce, 0xc8, 0xdf, 0xbc, 0xe6, 0x87, 0xbe,
-  0x71, 0x0f, 0x75, 0x9a, 0x23, 0x37, 0x3b, 0xbb, 0xd5, 0x15, 0x8f, 0x51,
-  0x1f, 0x10, 0xf0, 0xf7, 0xdb, 0x7e, 0xf2, 0x68, 0x8e, 0x45, 0xd9, 0xfb,
-  0x26, 0x26, 0xb8, 0xb8, 0x44, 0x65, 0x5d, 0xda, 0x54, 0xcc, 0xc1, 0x5f,
-  0xc9, 0x46, 0xc2, 0x84, 0xf1, 0xbe, 0xb4, 0x19, 0x06, 0x8c, 0x73, 0xf6,
-  0x11, 0x17, 0x5d, 0x65, 0x86, 0x96, 0x6a, 0x41, 0x4a, 0xfd, 0x34, 0x53,
-  0x66, 0xda, 0x39, 0x7c, 0x91, 0x14, 0x6d, 0x5f, 0x48, 0xce, 0x35, 0x6d,
-  0xd7, 0x81, 0xe5, 0xba, 0xab, 0x67, 0xf4, 0x00, 0xea, 0xb3, 0x94, 0x01,
-  0x38, 0x6f, 0xb6, 0x80, 0x45, 0x63, 0x4b, 0x28, 0x79, 0x9d, 0xa2, 0x7c,
-  0xa9, 0x49, 0x22, 0x4e, 0x99, 0xdf, 0xf1, 0x4a, 0x9c, 0xf5, 0x71, 0x3e,
-  0xeb, 0x66, 0x40, 0x7e, 0x87, 0x58, 0xd0, 0xe6, 0xfc, 0xec, 0xfc, 0xd1,
-  0xb6, 0xcf, 0xbc, 0x26, 0x89, 0xb7, 0x5c, 0x6e, 0x0c, 0x98, 0x01, 0x9b,
-  0x94, 0xdb, 0x57, 0x71, 0xc3, 0xe9, 0x1f, 0xa1, 0x9f, 0x79, 0x22, 0xb4,
-  0x44, 0x24, 0x5c, 0xf0, 0x45, 0xf8, 0xe8, 0x1d, 0x00, 0xd9, 0xab, 0xc2,
-  0xe5, 0x0e, 0xa6, 0x72, 0x70, 0x6d, 0x84, 0xdc, 0x05, 0xb0, 0x40, 0x24,
-  0xed, 0x7f, 0x80, 0xa4, 0x92, 0x36, 0x8b, 0x3d, 0x91, 0xd4, 0x06, 0xbd,
-  0x4c, 0xda, 0xc9, 0xd6, 0x1e, 0x24, 0x40, 0xb2, 0x37, 0xdc, 0x93, 0x88,
-  0x20, 0x68, 0x92, 0x0d, 0x28, 0x2c, 0x5c, 0x38, 0x95, 0xdc, 0x9b, 0xb4,
-  0x6b, 0x99, 0xc5, 0x73, 0xb8, 0xb2, 0x0c, 0xb1, 0xe5, 0x52, 0x6f, 0x99,
-  0x50, 0x52, 0x2e, 0x27, 0x4d, 0xde, 0x9e, 0x8e, 0x2e, 0xfd, 0xa0, 0x0f,
-  0xf4, 0xb0, 0x00, 0x0d, 0xd7, 0x66, 0x0f, 0xf2, 0xd0, 0x03, 0xa7, 0x27,
-  0xa3, 0xcb, 0x61, 0x8c, 0x25, 0xfc, 0xc0, 0x88, 0x55, 0x60, 0xb8, 0xfd,
-  0x24, 0x6c, 0x5b, 0xbe, 0x9d, 0xa6, 0x9e, 0x23, 0x5a, 0x1c, 0xe2, 0xcd,
-  0x2b, 0x3f, 0xe1, 0xb8, 0xdb, 0x9c, 0xe9, 0xe2, 0x17, 0x8c, 0x74, 0x13,
-  0x94, 0x9c, 0x86, 0x74, 0xea, 0xe5, 0x78, 0xe0, 0xd1, 0x75, 0xb1, 0xbe,
-  0x83, 0xda, 0x30, 0x66, 0xf7, 0x9a, 0x1b, 0xea, 0x43, 0x68, 0x14, 0x6e,
-  0xf1, 0x86, 0xc2, 0xfc, 0x08, 0xcd, 0x5a, 0xcb, 0x39, 0x3d, 0x49, 0x32,
-  0x50, 0x3b, 0xc2, 0x2b, 0x44, 0xcf, 0x3e, 0x78, 0x53, 0xd1, 0x54, 0x74,
-  0x66, 0x52, 0xca, 0x89, 0xb5, 0x61, 0xaf, 0x14, 0x66, 0xb3, 0x5b, 0x6e,
-  0x5d, 0x60, 0x31, 0xdc, 0x82, 0x6e, 0xd3, 0xd5, 0x59, 0xc6, 0xfe, 0x21,
-  0xdb, 0xed, 0x95, 0x6c, 0x93, 0xf9, 0x94, 0xc9, 0xd6, 0xea, 0x36, 0xdb,
-  0x1a, 0xa7, 0xd3, 0x92, 0xd0, 0xe1, 0xb2, 0x13, 0xa4, 0xba, 0xad, 0x5a,
-  0x49, 0x76, 0xa2, 0xb5, 0xf0, 0x4d, 0x83, 0x1f, 0x18, 0x34, 0x87, 0xc8,
-  0x56, 0x7f, 0x15, 0x0d, 0x50, 0xb8, 0x8d, 0xb4, 0x04, 0xc8, 0xbb, 0x93,
-  0x97, 0xa7, 0x76, 0xb6, 0x64, 0x76, 0x80, 0xc1, 0xb2, 0x63, 0x25, 0x5c,
-  0xb4, 0x8a, 0x4d, 0xac, 0xc9, 0x66, 0x58, 0xd3, 0x24, 0xff, 0x3b, 0xd0,
-  0x14, 0xd0, 0x5d, 0xaf, 0x00, 0x05, 0xae, 0x52, 0x76, 0x75, 0x73, 0x84,
-  0x34, 0x07, 0x43, 0x8b, 0x16, 0x51, 0xa2, 0xa9, 0xe0, 0x13, 0xfb, 0x21,
-  0x86, 0x72, 0x5f, 0x95, 0x59, 0xe7, 0xe7, 0xe5, 0xef, 0xb5, 0x59, 0xf4,
-  0x40, 0xa8, 0x29, 0x9c, 0x37, 0xe6, 0x4a, 0xda, 0x41, 0x62, 0x4c, 0xa0,
-  0x5e, 0x40, 0x3b, 0x73, 0x10, 0x1a, 0xe1, 0x70, 0x50, 0x9c, 0x77, 0x25,
-  0xe9, 0x34, 0x5b, 0xaf, 0x2e, 0xce, 0xde, 0x0c, 0x2e, 0xcf, 0x50, 0x6b,
-  0x59, 0x0a, 0x5c, 0x24, 0x11, 0x8d, 0x93, 0xdf, 0xab, 0xfd, 0x92, 0xd1,
-  0x6d, 0x04, 0xd2, 0x56, 0xbd, 0xad, 0x15, 0x9d, 0x71, 0xa9, 0xa0, 0x7b,
-  0xfa, 0x56, 0x40, 0x9a, 0x5f, 0xb0, 0x2e, 0x92, 0xa2, 0x3a, 0x1f, 0x79,
-  0x0b, 0x27, 0x5e, 0xe8, 0x09, 0xef, 0xab, 0xec, 0x1e, 0x2f, 0xeb, 0xbb,
-  0x44, 0xb2, 0x96, 0x88, 0x1a, 0x0b, 0xd6, 0x54, 0xe8, 0xd0, 0xb7, 0x85,
-  0x5f, 0x2d, 0x1d, 0x06, 0x25, 0x73, 0x70, 0x72, 0x40, 0x53, 0x9a, 0x03,
-  0x9c, 0x56, 0x55, 0x79, 0xab, 0x57, 0x97, 0x64, 0x15, 0x9a, 0xae, 0xd3,
-  0x22, 0x55, 0x77, 0x2b, 0xb9, 0x03, 0x84, 0x17, 0x47, 0x0b, 0xd7, 0xae,
-  0x55, 0x00, 0x9f, 0xb4, 0xf3, 0xb9, 0x15, 0x3f, 0x38, 0x68, 0xaa, 0x65,
-  0x1d, 0x56, 0xc1, 0x16, 0x4f, 0xf1, 0x29, 0x09, 0x4a, 0x42, 0x1c, 0xba,
-  0x17, 0xfa, 0x42, 0xdc, 0x45, 0xf4, 0x0e, 0x28, 0x30, 0x64, 0xa1, 0xfd,
-  0xf0, 0xd8, 0x31, 0xee, 0xf5, 0x2f, 0xc1, 0x19, 0x16, 0x46, 0x4f, 0xd2,
-  0xe9, 0x67, 0x33, 0x87, 0x3a, 0x14, 0xc0, 0x4d, 0xde, 0x70, 0xe9, 0x37,
-  0xc5, 0x05, 0x82, 0xb3, 0x07, 0xe2, 0x80, 0x7e, 0x1a, 0x68, 0x93, 0xca,
-  0xc1, 0x91, 0x53, 0xf6, 0xf3, 0x74, 0x39, 0xc1, 0x32, 0x51, 0x90, 0x8e,
-  0x2a, 0xcb, 0x8d, 0x99, 0x1e, 0x50, 0x13, 0x88, 0xa9, 0x69, 0x07, 0xb9,
-  0x64, 0x9f, 0x4b, 0x57, 0xcf, 0x4a, 0xf8, 0x31, 0x57, 0x2b, 0x87, 0xd4,
-  0x49, 0x2a, 0x1b, 0x94, 0xb1, 0x6a, 0x59, 0x05, 0xc5, 0x26, 0x8b, 0xab,
-  0x52, 0x0b, 0x76, 0x86, 0x02, 0x8b, 0x88, 0x9a, 0xc1, 0x4c, 0x2b, 0x58,
-  0x1d, 0x22, 0x50, 0xa3, 0x0d, 0x8c, 0x38, 0xf9, 0xd7, 0xe4, 0xe5, 0xee,
-  0xb4, 0xb7, 0xbd, 0xc6, 0xa3, 0xbc, 0x54, 0x74, 0xae, 0xb7, 0x7a, 0xad,
-  0x05, 0x89, 0xaf, 0xdc, 0x49, 0x2b, 0x7f, 0x9a, 0xd1, 0x14, 0xde, 0x8c,
-  0xcb, 0xb9, 0x06, 0xbf, 0x17, 0x49, 0x01, 0x72, 0x77, 0x26, 0x84, 0x9f,
-  0x8c, 0x88, 0xa7, 0xd4, 0x96, 0x12, 0x6b, 0x12, 0xfd, 0x68, 0xb2, 0xa5,
-  0xe9, 0x44, 0x16, 0xcf, 0x7e, 0x2a, 0xbf, 0x3a, 0xb0, 0x49, 0x4f, 0x24,
-  0xd5, 0x3a, 0xcd, 0x3d, 0xfa, 0xe1, 0x87, 0x76, 0xf1, 0xcf, 0xed, 0x55,
-  0x89, 0xd6, 0x02, 0x6c, 0x9e, 0x96, 0x0a, 0x45, 0x44, 0x87, 0x83, 0xe4,
-  0x0c, 0xdd, 0x76, 0x44, 0x6d, 0x0e, 0x1c, 0x28, 0xbb, 0x60, 0xc4, 0x57,
-  0x64, 0x8c, 0xc0, 0x1b, 0x45, 0xec, 0xb7, 0x50, 0x17, 0x48, 0xc1, 0x3e,
-  0x89, 0x00, 0x93, 0x20, 0x72, 0x15, 0x2b, 0xc1, 0x61, 0x10, 0xa0, 0x1a,
-  0xfd, 0xe9, 0xaa, 0x5b, 0xe8, 0xdf, 0x1b, 0x8a, 0x08, 0xf0, 0x7d, 0xb0,
-  0xbe, 0x42, 0xa9, 0x4d, 0xe7, 0x12, 0xbc, 0x24, 0x6e, 0x7c, 0xa6, 0x32,
-  0x27, 0xec, 0xdb, 0xa4, 0xca, 0xc4, 0xdf, 0xa0, 0xa5, 0x27, 0x82, 0xc0,
-  0x2f, 0x11, 0x42, 0xf0, 0xe1, 0x41, 0x8e, 0x42, 0xea, 0x9d, 0x17, 0x47,
-  0xeb, 0xd5, 0x59, 0x31, 0x41, 0xf2, 0x46, 0x4a, 0xa2, 0x97, 0x60, 0x72,
-  0x43, 0xc5, 0x0f, 0xb0, 0x13, 0x95, 0xec, 0xda, 0x92, 0xca, 0x95, 0x7c,
-  0xe3, 0xfc, 0x45, 0x4f, 0xee, 0xd0, 0x8f, 0x37, 0xd2, 0x2e, 0x88, 0x45,
-  0x2d, 0x55, 0x98, 0xd0, 0xba, 0x10, 0x85, 0x24, 0xa5, 0xaa, 0x6a, 0x21,
-  0x1c, 0xf2, 0xef, 0x6a, 0x5c, 0x9b, 0x15, 0x6a, 0xe4, 0x38, 0xdb, 0xaa,
-  0xd4, 0xc1, 0xc5, 0xa3, 0x47, 0x96, 0x50, 0x37, 0xf0, 0x54, 0x3a, 0xfa,
-  0x23, 0x76, 0x6f, 0x19, 0xb3, 0x74, 0x80, 0xc7, 0xea, 0x55, 0x08, 0x11,
-  0x21, 0xb8, 0x45, 0x11, 0x5c, 0xa6, 0xec, 0xf7, 0xe7, 0x4c, 0x1d, 0x65,
-  0x36, 0xa3, 0x5e, 0xb2, 0x15, 0x84, 0xfb, 0xfd, 0x9b, 0xe3, 0xcb, 0xee,
-  0xd1, 0xf2, 0x83, 0x7d, 0xc8, 0x5d, 0x37, 0xff, 0x3e, 0x7f, 0x77, 0xb9,
-  0xed, 0x4a, 0x9c, 0xcb, 0x76, 0xf5, 0x91, 0xce, 0x92, 0x05, 0x15, 0x96,
-  0xed, 0xe3, 0x7c, 0x71, 0x91, 0x53, 0x90, 0x0d, 0xf6, 0x64, 0x90, 0x97,
-  0xe5, 0xd1, 0xee, 0x9e, 0xb1, 0xa4, 0x76, 0xf7, 0x51, 0xeb, 0xf4, 0xd1,
-  0xee, 0x23, 0x9b, 0x62, 0xab, 0x4f, 0x05, 0xd7, 0xc2, 0x94, 0x5f, 0x84,
-  0xd3, 0x04, 0xfb, 0xfe, 0xd1, 0xa7, 0x4f, 0xf8, 0x71, 0xbf, 0xcb, 0x2c,
-  0xa3, 0x84, 0xc0, 0x3e, 0xbd, 0x7e, 0xfc, 0xe6, 0xf7, 0x66, 0x1c, 0xa1,
-  0xb8, 0x65, 0xc1, 0x79, 0x64, 0xa8, 0x26, 0x4b, 0x39, 0xe9, 0xc3, 0xd5,
-  0x55, 0x55, 0xbc, 0x12, 0x51, 0xc2, 0xbe, 0xe3, 0x97, 0x45, 0x32, 0xdb,
-  0xc5, 0xe7, 0x33, 0x90, 0x0c, 0xf7, 0x40, 0x38, 0xd3, 0x33, 0xc2, 0x06,
-  0x62, 0x66, 0xe1, 0x93, 0x9b, 0x23, 0x5b, 0xaf, 0x4f, 0x06, 0x62, 0xae,
-  0x3a, 0x11, 0x48, 0x0e, 0x92, 0x1d, 0x3a, 0x22, 0x48, 0x02, 0x1e, 0x10,
-  0xb6, 0xc3, 0x9c, 0x0a, 0xcc, 0xb0, 0xfe, 0x75, 0x5f, 0xf0, 0x1d, 0xfc,
-  0xaf, 0x47, 0xed, 0xbb, 0x92, 0x5c, 0xc4, 0xda, 0xe8, 0x73, 0xf9, 0x4b,
-  0xe0, 0xaf, 0x44, 0x91, 0x4b, 0xe8, 0xc7, 0xa8, 0x4b, 0xb0, 0xdd, 0xf2,
-  0xa1, 0xa0, 0x0d, 0xdb, 0x31, 0xd1, 0x53, 0xa4, 0x7c, 0x30, 0x0b, 0xe9,
-  0xb5, 0xc2, 0x63, 0xb8, 0xaa, 0xf0, 0x94, 0x6a, 0x83, 0xf2, 0x01, 0x37,
-  0x74, 0xb8, 0xe7, 0xa4, 0x03, 0x2e, 0x25, 0xd5, 0xea, 0xc6, 0xd1, 0x50,
-  0x6e, 0x2d, 0x20, 0x58, 0xba, 0x5f, 0xd5, 0xe1, 0x2e, 0x7d, 0xec, 0x74,
-  0x27, 0x39, 0x6c, 0x50, 0x8c, 0x14, 0xbe, 0xb0, 0xd0, 0x4c, 0xa5, 0xa9,
-  0xe8, 0xf3, 0x54, 0xa0, 0xc8, 0x2f, 0x95, 0x69, 0x50, 0x6c, 0x64, 0x6b,
-  0x26, 0x38, 0x7c, 0xc1, 0x44, 0xa2, 0x82, 0xae, 0x88, 0xdc, 0x69, 0x02,
-  0xad, 0xf0, 0xc6, 0xa9, 0xfd, 0x35, 0x27, 0x91, 0x2e, 0x57, 0x52, 0xfd,
-  0xa5, 0x14, 0xe9, 0xe3, 0x3e, 0xfe, 0xf6, 0x64, 0xf7, 0x19, 0xaf, 0xe8,
-  0xc9, 0xf1, 0xe5, 0xab, 0xae, 0x43, 0xaf, 0x32, 0x1b, 0x8a, 0xff, 0x3b,
-  0xc8, 0xd2, 0xea, 0xc6, 0x18, 0x18, 0x44, 0xc4, 0x31, 0x20, 0xb2, 0xf7,
-  0xc1, 0xee, 0x6e, 0x0c, 0x6c, 0xf1, 0x3b, 0xa6, 0x1e, 0x3f, 0x7a, 0xdc,
-  0x8e, 0xc3, 0x91, 0x5a, 0x3f, 0xa0, 0xe9, 0x5e, 0x4d, 0x19, 0xd9, 0xde,
-  0x5e, 0xa9, 0x6a, 0xcf, 0xf2, 0xb8, 0x68, 0x4e, 0xfa, 0x7d, 0xcb, 0x3d,
-  0x6a, 0xf7, 0x43, 0xac, 0x08, 0x42, 0xf7, 0xae, 0x52, 0x40, 0x91, 0xb9,
-  0xe8, 0x71, 0x2b, 0x35, 0x77, 0xdb, 0x09, 0xd7, 0x2f, 0xe3, 0x32, 0x43,
-  0x8d, 0x2b, 0x27, 0x1d, 0xcd, 0xbf, 0xac, 0x25, 0xf7, 0xa4, 0xca, 0x88,
-  0xd0, 0x87, 0x15, 0x3f, 0x29, 0xd7, 0x72, 0x3f, 0x29, 0x11, 0xa6, 0xa0,
-  0x9a, 0x2c, 0x24, 0x17, 0x89, 0xff, 0x4d, 0x97, 0x71, 0x0b, 0xf4, 0xba,
-  0xff, 0x24, 0x32, 0x71, 0xb8, 0xb2, 0x7f, 0xe5, 0xc4, 0x39, 0xf5, 0x88,
-  0x7d, 0x78, 0x5c, 0x21, 0x46, 0xe9, 0x22, 0x43, 0xb2, 0x98, 0x5a, 0x6b,
-  0x8a, 0xfe, 0xe2, 0xb1, 0xd0, 0x6c, 0x0f, 0xd7, 0x91, 0x9b, 0xb9, 0xb7,
-  0x7e, 0xe5, 0x58, 0xfa, 0x8e, 0x62, 0x9f, 0xee, 0x8f, 0xb9, 0x14, 0x14,
-  0x82, 0xaf, 0x01, 0x51, 0xc8, 0x2e, 0xe9, 0x40, 0xb6, 0xc8, 0x30, 0x78,
-  0x8f, 0x30, 0xc4, 0xdf, 0xdc, 0xd6, 0x4e, 0x25, 0x5b, 0x51, 0x93, 0x6a,
-  0xcc, 0x35, 0x9a, 0x2f, 0x28, 0x8f, 0xbc, 0x8e, 0xfa, 0x5a, 0x5a, 0x95,
-  0xc3, 0x31, 0x99, 0xea, 0x96, 0xed, 0xcb, 0x45, 0x26, 0xaf, 0xeb, 0x1c,
-  0x5b, 0x79, 0x95, 0x86, 0xb9, 0x95, 0x64, 0xb2, 0xa3, 0x0d, 0xbb, 0x58,
-  0xa5, 0x4b, 0xd0, 0xe4, 0xc6, 0xcb, 0x15, 0x0a, 0x80, 0xd7, 0x8f, 0x24,
-  0xf5, 0xf7, 0x36, 0xe3, 0x14, 0x75, 0xcb, 0x6f, 0x7d, 0x77, 0xf1, 0xea,
-  0xaf, 0x6a, 0x7f, 0x43, 0x2f, 0x0d, 0xad, 0xe1, 0x4e, 0x87, 0xc7, 0x99,
-  0x07, 0xe0, 0x93, 0x5c, 0xe2, 0xd6, 0xbc, 0xbb, 0x7f, 0x44, 0xb0, 0xde,
-  0xcc, 0x99, 0x99, 0x6c, 0x51, 0xa8, 0xcd, 0x3c, 0x36, 0x12, 0xa3, 0xee,
-  0xd1, 0xf0, 0x09, 0x7c, 0x22, 0xaf, 0x8e, 0x9e, 0x3c, 0xda, 0xdf, 0x33,
-  0x76, 0xeb, 0x56, 0x47, 0x5a, 0x6c, 0x6f, 0x3c, 0x68, 0xb6, 0xed, 0x7a,
-  0x67, 0x9f, 0x16, 0xb4, 0xf7, 0xb6, 0x8e, 0x7f, 0x38, 0x7f, 0xdb, 0x1e,
-  0x1f, 0x8f, 0x28, 0x08, 0xa6, 0xae, 0x1a, 0xa1, 0xd3, 0x05, 0x5a, 0xed,
-  0x2b, 0x0e, 0x11, 0xa5, 0x52, 0x23, 0xe1, 0xca, 0x57, 0x55, 0x4e, 0x5a,
-  0x6e, 0x8f, 0x26, 0xa4, 0x77, 0x5a, 0x16, 0x53, 0x73, 0xf5, 0x9f, 0x11,
-  0x01, 0x54, 0x46, 0x78, 0xa0, 0x7b, 0x47, 0xb7, 0xfa, 0x98, 0xbc, 0xe9,
-  0xe3, 0xa8, 0x14, 0x21, 0x2c, 0xe5, 0x0d, 0x7e, 0x08, 0xea, 0x4d, 0x4a,
-  0x91, 0xe7, 0xdc, 0xa3, 0xa5, 0xe4, 0x75, 0xa1, 0x14, 0x49, 0xfb, 0xb4,
-  0x7d, 0x42, 0xe5, 0x0b, 0x78, 0x7d, 0x9e, 0xc3, 0xa9, 0xbd, 0x2a, 0x1e,
-  0xc2, 0xd2, 0x52, 0x23, 0x22, 0xec, 0x27, 0xda, 0x52, 0xd7, 0xfe, 0xb6,
-  0x57, 0x4e, 0x18, 0xd4, 0x70, 0x1c, 0xef, 0x20, 0xcd, 0x2d, 0x22, 0x73,
-  0xf1, 0x98, 0xb3, 0x2c, 0x72, 0x0b, 0x65, 0x97, 0x6c, 0x3c, 0x42, 0xea,
-  0x52, 0x4e, 0x71, 0xbf, 0xcd, 0x8c, 0x15, 0xf3, 0x83, 0x23, 0xee, 0x8f,
-  0x3a, 0x4f, 0x69, 0x31, 0x6d, 0x65, 0x63, 0x51, 0x4e, 0x2c, 0xdb, 0x3f,
-  0xd9, 0x27, 0x14, 0xef, 0x33, 0x4a, 0xe2, 0xd3, 0x47, 0xe1, 0x7d, 0xa4,
-  0x95, 0x83, 0x45, 0xbb, 0xab, 0x7c, 0x1d, 0x80, 0x2f, 0x69, 0x51, 0x7c,
-  0xfb, 0xd1, 0x58, 0x44, 0x2c, 0x2c, 0xc5, 0x91, 0x09, 0xb1, 0xcf, 0x3a,
-  0xb1, 0x09, 0x3f, 0x16, 0x81, 0x2a, 0xc1, 0x14, 0x8d, 0x90, 0x48, 0x43,
-  0x68, 0xaa, 0x78, 0xd1, 0x89, 0xd5, 0xe1, 0x89, 0x35, 0x01, 0x89, 0xae,
-  0x11, 0x6a, 0xc3, 0x13, 0xad, 0xcd, 0xf7, 0xe4, 0xf3, 0xc8, 0xe6, 0x7b,
-  0x7b, 0x76, 0x79, 0x7c, 0x20, 0xf4, 0x31, 0x4a, 0xa9, 0xa0, 0x86, 0x02,
-  0xe3, 0xc9, 0xb8, 0x86, 0x30, 0xa7, 0x16, 0xd1, 0x25, 0xab, 0xab, 0xde,
-  0x8f, 0x1d, 0x79, 0x00, 0xbb, 0xe9, 0x98, 0xb0, 0xa7, 0xb7, 0x59, 0xc9,
-  0xbf, 0x88, 0x84, 0x51, 0xb1, 0x0d, 0x78, 0x3f, 0xd1, 0xfa, 0x87, 0x09,
-  0xf6, 0xc8, 0xc2, 0x46, 0x62, 0x33, 0xdf, 0xb7, 0xc1, 0x16, 0xe2, 0xab,
-  0x8c, 0x4d, 0x2e, 0x8b, 0xbe, 0x9b, 0x50, 0x1d, 0xbf, 0xb0, 0xf8, 0x1c,
-  0xa2, 0x74, 0xaf, 0xa4, 0x84, 0x31, 0x2c, 0x12, 0x4b, 0xe2, 0xb6, 0xee,
-  0x8a, 0x73, 0xc1, 0xc4, 0xee, 0xa1, 0x12, 0xf3, 0x8c, 0xfc, 0x80, 0x5f,
-  0xae, 0xa4, 0x50, 0x69, 0xbc, 0xf3, 0xa4, 0xfb, 0xc4, 0x9c, 0x23, 0xb5,
-  0xd3, 0xc8, 0xae, 0xb4, 0x46, 0x8a, 0x50, 0x21, 0x84, 0x21, 0x6c, 0x88,
-  0xc0, 0xb6, 0x63, 0xc4, 0x95, 0xda, 0x56, 0x75, 0x0d, 0x68, 0x1b, 0x9a,
-  0x59, 0x0d, 0x5a, 0x72, 0x21, 0xdd, 0x38, 0xcf, 0x1f, 0xae, 0x0b, 0xaf,
-  0x13, 0x75, 0xd2, 0x23, 0x24, 0xc9, 0xb8, 0x5e, 0x56, 0xd3, 0xe5, 0xdc,
-  0x48, 0x2e, 0x3f, 0x79, 0x00, 0x9a, 0x1f, 0xac, 0x5a, 0x00, 0x74, 0x22,
-  0xb1, 0x82, 0x27, 0xbb, 0xad, 0xc6, 0x86, 0x18, 0xb8, 0xbf, 0xfe, 0xe6,
-  0x99, 0xc1, 0x9e, 0x75, 0xc5, 0xe6, 0x48, 0x93, 0x14, 0xbe, 0xa0, 0xdf,
-  0x2f, 0xd8, 0x34, 0xef, 0xcb, 0x4a, 0xad, 0x85, 0x20, 0xbe, 0xd1, 0x00,
-  0x30, 0x3d, 0x94, 0x17, 0x8a, 0x2e, 0x63, 0x7d, 0x89, 0xe3, 0x79, 0x4a,
-  0x8c, 0x68, 0xce, 0x67, 0x49, 0x71, 0x74, 0x17, 0x06, 0x8f, 0xd4, 0x69,
-  0xa6, 0x94, 0xb5, 0xc4, 0x11, 0xa9, 0x89, 0x53, 0x9f, 0xce, 0x86, 0x2c,
-  0x0f, 0xcd, 0x3d, 0xfc, 0x6e, 0x63, 0xca, 0x04, 0x4d, 0xfe, 0x56, 0x8e,
-  0xc5, 0x19, 0x43, 0xf6, 0x63, 0x8c, 0x16, 0xe2, 0x0a, 0xc0, 0xf7, 0xa5,
-  0xd9, 0x6b, 0xd3, 0x25, 0xfb, 0x57, 0xa9, 0x43, 0x02, 0xa2, 0xe6, 0xc2,
-  0xa3, 0x14, 0xfa, 0x48, 0xae, 0xc1, 0xd4, 0xc6, 0x28, 0x4e, 0x65, 0x44,
-  0x0e, 0x53, 0x1b, 0xf7, 0xbb, 0xc9, 0xff, 0xe9, 0x84, 0xbc, 0x22, 0xa6,
-  0x71, 0x49, 0xb2, 0x65, 0x4a, 0x27, 0x87, 0x36, 0x4f, 0x27, 0xcd, 0x52,
-  0x26, 0xbe, 0xdb, 0xbb, 0x52, 0xbd, 0xa5, 0xe6, 0x5d, 0x90, 0x0d, 0x03,
-  0x8f, 0x34, 0x31, 0xfb, 0x2f, 0x9d, 0xdc, 0xa9, 0xce, 0xe0, 0xae, 0x58,
-  0xa1, 0x0c, 0x73, 0xd4, 0xc4, 0xc1, 0x60, 0x6d, 0x27, 0x28, 0xee, 0x99,
-  0xd7, 0x2b, 0x8a, 0x03, 0xfc, 0xa6, 0xd6, 0x8a, 0x5f, 0xe2, 0x85, 0x9d,
-  0xcf, 0x4a, 0x6d, 0xd6, 0x3a, 0xf0, 0x59, 0x93, 0xd2, 0x2c, 0xdf, 0x9f,
-  0xd1, 0xdd, 0xf8, 0xac, 0xbc, 0x1c, 0x23, 0x04, 0x7f, 0x3b, 0x25, 0xc7,
-  0x20, 0x22, 0xae, 0xf5, 0x4d, 0x4e, 0x42, 0x6d, 0xe2, 0x8d, 0x7c, 0x45,
-  0xaa, 0xd0, 0x43, 0x64, 0x69, 0xee, 0x11, 0x5b, 0x9b, 0x8f, 0x19, 0x3b,
-  0x96, 0x3c, 0xf9, 0xfc, 0xc9, 0xe3, 0xed, 0xa4, 0x03, 0x21, 0xdc, 0x8e,
-  0x15, 0x9c, 0xc2, 0x89, 0x13, 0x0a, 0x6f, 0x68, 0x37, 0x39, 0xd5, 0x65,
-  0xe3, 0xcc, 0x6f, 0x71, 0x70, 0xe6, 0x5c, 0xa3, 0x85, 0x5c, 0xed, 0xa8,
-  0x76, 0xc4, 0xa2, 0x39, 0x40, 0x12, 0xd0, 0xc7, 0x32, 0x7e, 0x79, 0x0b,
-  0x72, 0x3e, 0xad, 0x9d, 0x08, 0x77, 0x49, 0x3d, 0x4c, 0x20, 0x0d, 0x55,
-  0x4d, 0x41, 0x70, 0xdb, 0xc8, 0x55, 0x8d, 0xe6, 0x90, 0x32, 0x74, 0x1c,
-  0xca, 0xaa, 0x28, 0x20, 0x37, 0x54, 0x0f, 0xb8, 0xf4, 0x6e, 0x07, 0xf6,
-  0x90, 0x70, 0x5a, 0x16, 0x5f, 0x3f, 0x31, 0x32, 0x54, 0x73, 0x25, 0xe2,
-  0x7a, 0xa4, 0xeb, 0xac, 0x3d, 0x8f, 0x4c, 0xae, 0x47, 0x3b, 0x45, 0xdf,
-  0x17, 0xa8, 0x94, 0xac, 0x09, 0xb3, 0x3a, 0x06, 0xd7, 0xf2, 0x5c, 0x8b,
-  0x91, 0xb0, 0x02, 0x52, 0x0a, 0xce, 0x81, 0x1d, 0x1e, 0x5a, 0x8d, 0x5c,
-  0xa0, 0xbe, 0xab, 0x58, 0x1c, 0xd4, 0x19, 0x92, 0x6a, 0xba, 0x79, 0xab,
-  0x67, 0x2b, 0x53, 0x53, 0x74, 0xb7, 0x29, 0xaf, 0x43, 0x37, 0x23, 0x45,
-  0xff, 0x6e, 0x77, 0x65, 0x98, 0x8c, 0xc6, 0x5f, 0xed, 0x4c, 0xc4, 0x8a,
-  0xde, 0xc3, 0x9e, 0x62, 0x06, 0x26, 0x38, 0x53, 0x06, 0x21, 0x99, 0x4c,
-  0xb2, 0x85, 0x0e, 0xef, 0xec, 0x6c, 0xdf, 0xdf, 0x69, 0x79, 0xf2, 0xbe,
-  0x4e, 0x9e, 0xb3, 0x7b, 0xc3, 0x23, 0x2d, 0xbf, 0xf2, 0xfa, 0x40, 0xdf,
-  0xcc, 0x01, 0x68, 0xa7, 0x0d, 0xc4, 0x70, 0x42, 0x86, 0xd0, 0x90, 0x22,
-  0x41, 0xc9, 0xc5, 0x91, 0xbc, 0x17, 0xc1, 0xa7, 0xf1, 0x00, 0xdb, 0x63,
-  0x17, 0xe3, 0x97, 0xb9, 0xa1, 0x44, 0x84, 0x10, 0x48, 0x0a, 0x64, 0x3d,
-  0x87, 0x66, 0x13, 0x86, 0x5a, 0xa7, 0xeb, 0x96, 0x37, 0x38, 0x18, 0xba,
-  0x79, 0x3f, 0xf1, 0xdc, 0xed, 0x7c, 0x0a, 0xd5, 0x13, 0xc1, 0x6e, 0xf9,
-  0x48, 0x5a, 0x83, 0x3e, 0x6d, 0xb1, 0x96, 0x5c, 0xc7, 0x77, 0x18, 0x70,
-  0x6e, 0xf2, 0x93, 0x5e, 0x35, 0xe6, 0x70, 0x77, 0xfa, 0xae, 0x52, 0x69,
-  0xd0, 0x48, 0xd4, 0x0f, 0x6e, 0xcc, 0xcc, 0x78, 0xc9, 0xf5, 0x82, 0x85,
-  0xf0, 0xc0, 0x26, 0x49, 0xa6, 0x55, 0xe8, 0x7d, 0x47, 0xdf, 0xec, 0xfe,
-  0xe6, 0xb2, 0xd8, 0xa0, 0x75, 0x18, 0xf3, 0x4f, 0x5b, 0x93, 0xd9, 0xe7,
-  0x33, 0x0a, 0x4a, 0x85, 0x98, 0xc6, 0x8e, 0x22, 0x5d, 0x61, 0xda, 0xb6,
-  0x9d, 0xc3, 0xb5, 0x60, 0x3c, 0x8b, 0xc6, 0x83, 0xbf, 0x57, 0xf0, 0x78,
-  0xe1, 0x3d, 0xab, 0x1e, 0x37, 0x6d, 0xb4, 0xed, 0x71, 0xf8, 0xac, 0xed,
-  0x71, 0xb0, 0x19, 0xe8, 0x2b, 0xc8, 0xbe, 0x00, 0xc3, 0xac, 0x93, 0xb7,
-  0xfa, 0x58, 0xb2, 0x35, 0x3a, 0x7f, 0x7b, 0xfc, 0xcd, 0xd9, 0xf6, 0x7d,
-  0x9e, 0xca, 0xb6, 0xfc, 0xb7, 0xe3, 0x4a, 0x15, 0x2f, 0x2c, 0xdd, 0x87,
-  0x8d, 0xf2, 0xcd, 0x68, 0x34, 0x38, 0x3c, 0x3f, 0x41, 0x51, 0xb5, 0x91,
-  0xf9, 0x73, 0x05, 0xdf, 0xef, 0x10, 0x74, 0xd3, 0x83, 0xef, 0x24, 0xed,
-  0xb3, 0x56, 0xb8, 0x20, 0xfc, 0x80, 0x28, 0xc2, 0x0e, 0xe5, 0x41, 0x94,
-  0x3c, 0x9b, 0xc7, 0x8f, 0xe6, 0xbb, 0x86, 0xcf, 0xf9, 0xc9, 0x0e, 0x3e,
-  0x45, 0x9f, 0xc4, 0x80, 0x56, 0x38, 0x11, 0x96, 0x61, 0x3d, 0x35, 0xd2,
-  0x7c, 0x00, 0x36, 0x85, 0x80, 0x56, 0x1c, 0xb7, 0xb1, 0xff, 0xe8, 0x3a,
-  0x71, 0x81, 0xbb, 0x78, 0xd6, 0x0c, 0x39, 0xc4, 0x28, 0x2d, 0x42, 0x28,
-  0xc8, 0xbb, 0x0e, 0x38, 0x18, 0x6a, 0xcc, 0xb3, 0x84, 0xda, 0xd9, 0x23,
-  0x8d, 0xb2, 0x76, 0x5d, 0x23, 0x9b, 0x83, 0x65, 0x92, 0x1c, 0x6c, 0x72,
-  0x74, 0x29, 0x2b, 0xca, 0xe5, 0xf5, 0x0d, 0x9b, 0x59, 0x6d, 0x5f, 0x04,
-  0x64, 0xb9, 0x46, 0x61, 0x2d, 0x3f, 0xb8, 0xe9, 0x64, 0x58, 0x09, 0xb2,
-  0xb6, 0x8c, 0x3f, 0x74, 0x0c, 0x28, 0x48, 0xc4, 0xea, 0x0d, 0xc3, 0x2f,
-  0xa6, 0xff, 0x12, 0x96, 0xdd, 0x35, 0x1a, 0xc8, 0x98, 0x03, 0xa8, 0x70,
-  0xa6, 0x15, 0xcd, 0x6c, 0x2e, 0x7f, 0x4d, 0x8b, 0x3b, 0x38, 0x4d, 0xc5,
-  0x8b, 0x8f, 0xd4, 0x4d, 0xbb, 0xa7, 0xdb, 0x1b, 0xbd, 0xa9, 0x26, 0x5c,
-  0xd5, 0x1e, 0x60, 0x54, 0xce, 0xd9, 0x5c, 0xb7, 0x67, 0x51, 0x4f, 0x79,
-  0x6e, 0xae, 0x69, 0x18, 0x78, 0x83, 0xa2, 0xaf, 0xad, 0xf4, 0x8d, 0x51,
-  0x2c, 0xe1, 0x32, 0x51, 0x84, 0x65, 0x13, 0x44, 0x44, 0x11, 0x2a, 0x8e,
-  0x6d, 0x19, 0xf3, 0xa1, 0x9c, 0x2d, 0x1b, 0xe8, 0x02, 0xe4, 0x1a, 0xa5,
-  0xbc, 0x98, 0x6d, 0x57, 0x68, 0x03, 0xad, 0x26, 0x1e, 0x14, 0x35, 0x49,
-  0x8e, 0x42, 0x08, 0xbf, 0xab, 0x86, 0x37, 0x74, 0x81, 0x00, 0x8e, 0x26,
-  0x8a, 0x97, 0x82, 0x66, 0x96, 0xdb, 0x42, 0x53, 0x0b, 0x00, 0x94, 0x3e,
-  0x96, 0xf1, 0xa2, 0xcd, 0x66, 0xfd, 0x74, 0xad, 0x5a, 0xb3, 0xa3, 0x3e,
-  0x76, 0x12, 0xdd, 0x2d, 0xc8, 0xba, 0xd3, 0x1a, 0xa3, 0x69, 0x5c, 0xab,
-  0x30, 0xcb, 0x8a, 0x1a, 0x18, 0xd3, 0x29, 0x19, 0xdf, 0xd9, 0x8f, 0xf1,
-  0x77, 0x52, 0xa0, 0x7a, 0xac, 0x22, 0xfc, 0x50, 0x1e, 0x15, 0xb7, 0x18,
-  0xc3, 0x75, 0xa0, 0x94, 0xf6, 0x97, 0x3a, 0x4d, 0x7f, 0x97, 0x31, 0x02,
-  0x8d, 0x97, 0x18, 0xab, 0xd1, 0x5a, 0x64, 0xd6, 0xf2, 0xbb, 0x35, 0x94,
-  0x68, 0x22, 0x86, 0x78, 0x22, 0xd8, 0xc0, 0x14, 0x52, 0xb7, 0xa3, 0x52,
-  0xf5, 0x88, 0xbc, 0x6e, 0x29, 0x57, 0x6f, 0xe3, 0x97, 0xbd, 0x6f, 0xd8,
-  0x2c, 0x9e, 0x72, 0x7d, 0x81, 0x45, 0xb7, 0x3a, 0xc3, 0x07, 0x4c, 0x88,
-  0x1b, 0xbf, 0xfb, 0x61, 0x60, 0xd9, 0xd9, 0xb8, 0x71, 0x3d, 0x11, 0x0e,
-  0xa8, 0xa1, 0xec, 0xc2, 0xad, 0xf7, 0xf2, 0x17, 0x3a, 0x03, 0xdf, 0xe7,
-  0x85, 0xd1, 0x0c, 0xeb, 0x6d, 0xdd, 0x9c, 0x42, 0x41, 0x10, 0x9e, 0xdd,
-  0x6a, 0xb3, 0x36, 0x96, 0x98, 0x91, 0x38, 0x0e, 0xb2, 0x47, 0x8a, 0x33,
-  0x87, 0x6d, 0x02, 0x51, 0xe4, 0xd5, 0xd1, 0xbb, 0x5b, 0x04, 0xa9, 0x2f,
-  0x13, 0x2b, 0x74, 0xd0, 0x06, 0x68, 0x30, 0x8d, 0x59, 0x50, 0xe4, 0x9f,
-  0x86, 0x36, 0xc8, 0x8f, 0x7b, 0x83, 0xc9, 0x2b, 0x9c, 0xdf, 0xcb, 0x08,
-  0xc2, 0x48, 0xf1, 0x68, 0x48, 0xb6, 0x6e, 0x20, 0x8b, 0x66, 0x17, 0xe3,
-  0xdc, 0x7a, 0xb2, 0x9d, 0x5c, 0x35, 0x8b, 0xad, 0xbd, 0x6d, 0x66, 0x49,
-  0x96, 0xf2, 0xbd, 0xa5, 0xbb, 0xee, 0x43, 0x5f, 0x0e, 0xa1, 0x0c, 0x71,
-  0x42, 0x5d, 0x5d, 0x09, 0xd4, 0xc0, 0x43, 0xee, 0xdd, 0x95, 0x9c, 0x60,
-  0x9e, 0x30, 0x5b, 0xef, 0xd3, 0xe6, 0x36, 0x76, 0x9d, 0xcb, 0x00, 0xff,
-  0x2c, 0x88, 0x27, 0x10, 0x79, 0x89, 0xc6, 0x82, 0x70, 0x45, 0x17, 0xa5,
-  0xe2, 0x8c, 0x24, 0x2d, 0x9b, 0x99, 0x9b, 0x4d, 0x07, 0x24, 0x43, 0xae,
-  0xab, 0xd2, 0x5c, 0x91, 0x55, 0x84, 0x4c, 0x4d, 0x6c, 0x8a, 0x4b, 0xe4,
-  0xe1, 0x7c, 0xcc, 0xab, 0xb2, 0x00, 0x63, 0xdd, 0xc7, 0xb4, 0xca, 0x11,
-  0xee, 0xef, 0xbd, 0x3e, 0x7b, 0x73, 0xdc, 0xf3, 0x5d, 0x23, 0x57, 0xb9,
-  0x78, 0xd3, 0xb1, 0x7e, 0x5d, 0x5f, 0xb5, 0xae, 0x66, 0xcc, 0x75, 0x68,
-  0xae, 0x74, 0xa3, 0xe5, 0xb0, 0x2d, 0xf5, 0x51, 0x0f, 0x13, 0xa9, 0xf6,
-  0x36, 0x5a, 0x6e, 0xd4, 0x49, 0x01, 0x04, 0x48, 0x29, 0x2f, 0xdd, 0x65,
-  0x21, 0x18, 0x07, 0xae, 0x04, 0x35, 0x0e, 0x51, 0x67, 0xa1, 0xf4, 0x4b,
-  0x49, 0x25, 0x5e, 0xb9, 0x29, 0x52, 0xf4, 0x79, 0x03, 0x60, 0x69, 0x63,
-  0x00, 0xf9, 0xcd, 0xf9, 0x1d, 0x59, 0x36, 0x9b, 0xed, 0x0b, 0x70, 0xb3,
-  0x26, 0x63, 0xbc, 0xd9, 0xd4, 0xe9, 0x05, 0x70, 0xd4, 0xc9, 0xf8, 0xb0,
-  0xc0, 0xe7, 0x8a, 0x6f, 0xf3, 0xae, 0xe6, 0x4f, 0xb8, 0xd6, 0xb9, 0x71,
-  0x77, 0xfa, 0x0e, 0xf8, 0xf4, 0x05, 0xa5, 0xe4, 0x43, 0xea, 0x9a, 0xd4,
-  0x25, 0x77, 0xb5, 0x6b, 0x83, 0xb6, 0x41, 0x05, 0xc4, 0x62, 0x1e, 0xfa,
-  0x16, 0xcd, 0xe7, 0xcb, 0x49, 0xde, 0x8a, 0x80, 0x5b, 0x87, 0x9f, 0xd0,
-  0x50, 0x70, 0x8a, 0x0a, 0x6b, 0x4a, 0x85, 0x57, 0x29, 0x30, 0xa1, 0x26,
-  0x57, 0xb0, 0xd7, 0x99, 0xab, 0x1b, 0x80, 0x2a, 0xcb, 0x82, 0x47, 0xc8,
-  0xd4, 0x84, 0x7c, 0x9e, 0x16, 0x67, 0x29, 0x5f, 0xeb, 0xfb, 0xd9, 0xd0,
-  0x41, 0x0d, 0x62, 0xb1, 0x86, 0x1d, 0x32, 0xc5, 0x2a, 0x27, 0xcc, 0xea,
-  0xc8, 0xbc, 0x80, 0x96, 0xf1, 0x49, 0xa9, 0x11, 0x43, 0x25, 0xd9, 0x4e,
-  0xa7, 0xfa, 0xb8, 0x91, 0xc0, 0x64, 0xfe, 0xc6, 0x36, 0x8d, 0x0d, 0x65,
-  0x63, 0x3b, 0xb2, 0xd6, 0x41, 0x2c, 0xf7, 0x4a, 0xda, 0x1a, 0x35, 0xb1,
-  0xed, 0xa1, 0x34, 0x63, 0x13, 0xbe, 0xee, 0x7a, 0x59, 0x7d, 0x44, 0xd6,
-  0xaa, 0x14, 0x7a, 0x61, 0xa4, 0xb0, 0x5b, 0x94, 0x38, 0x6c, 0x02, 0x82,
-  0xdd, 0xf5, 0x90, 0x50, 0x9c, 0xd5, 0x52, 0x38, 0x9d, 0xbf, 0xe1, 0x5e,
-  0xd8, 0x0e, 0x5a, 0x73, 0x87, 0x08, 0x4c, 0x58, 0x95, 0x0d, 0x30, 0xfb,
-  0x65, 0x0d, 0x26, 0xc6, 0xa6, 0x4a, 0x27, 0xee, 0x2f, 0x83, 0xb4, 0x9e,
-  0xe4, 0xb9, 0x16, 0x0e, 0xa1, 0x50, 0x61, 0x46, 0xe8, 0xd8, 0x38, 0xbf,
-  0x8d, 0xf5, 0xdb, 0x5b, 0xc2, 0xfe, 0x69, 0xc9, 0x9e, 0x5e, 0x06, 0xa0,
-  0x70, 0xe5, 0x75, 0xc0, 0x59, 0x90, 0x29, 0x27, 0x71, 0xc4, 0x58, 0x2d,
-  0x15, 0x4d, 0xbc, 0x59, 0x61, 0xdf, 0x1a, 0x13, 0x7c, 0xcf, 0xb7, 0xc1,
-  0x75, 0x12, 0x06, 0x54, 0x9a, 0xaf, 0x6e, 0xd8, 0x9e, 0xbc, 0xbd, 0xdd,
-  0x1f, 0xae, 0x29, 0xa7, 0xee, 0x07, 0x83, 0x9e, 0x76, 0x2c, 0x14, 0x66,
-  0x6b, 0x8a, 0xd9, 0x27, 0xa3, 0xed, 0x56, 0x91, 0xb5, 0xc3, 0xd3, 0xf3,
-  0xb7, 0x09, 0x28, 0xb2, 0x40, 0xc6, 0x5b, 0xd4, 0x5c, 0x67, 0x89, 0x7f,
-  0xcc, 0x7a, 0x32, 0x2c, 0xe6, 0x24, 0x84, 0x7e, 0x2a, 0x0b, 0x39, 0xac,
-  0x88, 0x30, 0xe9, 0x89, 0xb1, 0x6e, 0x45, 0xe2, 0xe5, 0x3b, 0xb2, 0x94,
-  0x57, 0x23, 0xa3, 0x3b, 0x1c, 0xf3, 0xc9, 0x21, 0x7f, 0x58, 0x25, 0xed,
-  0xf8, 0xce, 0xe5, 0x25, 0xb5, 0xdf, 0xb5, 0x14, 0x61, 0x65, 0x22, 0x84,
-  0x60, 0x81, 0x50, 0x6f, 0x32, 0xcb, 0x46, 0x26, 0xc6, 0x9d, 0xa5, 0xd6,
-  0xd3, 0x52, 0x29, 0x8c, 0xd7, 0x00, 0xf1, 0x84, 0xa6, 0xb8, 0xc7, 0x75,
-  0x0a, 0x4b, 0x49, 0x60, 0x26, 0xb6, 0x58, 0x14, 0x01, 0x23, 0x81, 0x9d,
-  0xf1, 0x24, 0xb4, 0x46, 0x03, 0xd4, 0xf1, 0xfa, 0x44, 0x31, 0xed, 0x2c,
-  0xd5, 0x68, 0x59, 0xb3, 0xc4, 0x6f, 0xfb, 0xfc, 0xd1, 0xf1, 0x92, 0x64,
-  0x44, 0xe7, 0x1b, 0xb2, 0xc0, 0xac, 0x3b, 0xf1, 0x13, 0xf4, 0x3d, 0xf1,
-  0x82, 0x31, 0x13, 0x12, 0x25, 0x75, 0x66, 0xe9, 0xdc, 0x68, 0x07, 0x85,
-  0x66, 0x0e, 0x90, 0x03, 0x98, 0xe0, 0x9d, 0xdd, 0xa9, 0x5c, 0xa6, 0x22,
-  0xb3, 0x5a, 0xd8, 0xa8, 0x4e, 0x42, 0x01, 0x7f, 0x86, 0x00, 0x6d, 0x7e,
-  0xf3, 0xb1, 0x24, 0x31, 0xbc, 0x0e, 0x29, 0x02, 0x6c, 0x36, 0x07, 0x71,
-  0xb4, 0xce, 0x1c, 0x93, 0xd1, 0x72, 0x13, 0xb6, 0xe6, 0xac, 0x99, 0x80,
-  0xc9, 0xcd, 0xb2, 0xf8, 0x60, 0xba, 0x10, 0x26, 0x34, 0x2b, 0xf6, 0x97,
-  0x18, 0xd5, 0xb9, 0x50, 0x23, 0xfd, 0xc5, 0xf2, 0x13, 0x70, 0x0b, 0xc4,
-  0x83, 0xfb, 0x91, 0xfc, 0x79, 0x61, 0xb1, 0xef, 0x58, 0xef, 0xa6, 0xf6,
-  0x84, 0xa4, 0x8d, 0x9b, 0xc0, 0x28, 0xbe, 0x5d, 0xd7, 0xd9, 0x95, 0x38,
-  0x36, 0xfb, 0x11, 0x37, 0x8b, 0x28, 0x9c, 0x1c, 0xd2, 0x56, 0x0a, 0x28,
-  0xa4, 0x28, 0x29, 0xee, 0x2b, 0x10, 0x88, 0x4b, 0x6c, 0x7c, 0xb2, 0xdc,
-  0xf0, 0x4d, 0xda, 0x0f, 0x7e, 0x99, 0x93, 0x48, 0x4f, 0xda, 0xd9, 0xf5,
-  0xab, 0xf6, 0x01, 0xeb, 0x2a, 0xf0, 0x67, 0x99, 0x4d, 0xe0, 0x92, 0xf1,
-  0x05, 0x96, 0x62, 0x55, 0x37, 0xaa, 0x45, 0xe8, 0xd7, 0x40, 0x8b, 0x48,
-  0x2e, 0x97, 0xdb, 0x95, 0x15, 0x76, 0x93, 0xcd, 0xe9, 0xa8, 0x8a, 0x3c,
-  0xf8, 0x17, 0xce, 0x92, 0x1b, 0x88, 0x37, 0x51, 0xf6, 0x87, 0x9d, 0x49,
-  0x2a, 0x1e, 0x24, 0x0f, 0xdf, 0x1a, 0xf1, 0x43, 0xd2, 0xd0, 0x13, 0x86,
-  0x6f, 0x59, 0x22, 0xa9, 0x20, 0x74, 0x23, 0x0d, 0x12, 0xab, 0x7f, 0x8d,
-  0x14, 0xa4, 0xe6, 0x09, 0x6f, 0x7f, 0xfe, 0x36, 0x4c, 0xfb, 0xf6, 0x2a,
-  0x1a, 0xdc, 0x2f, 0x07, 0xad, 0x05, 0x2f, 0x3f, 0x5b, 0xe1, 0xe1, 0xfa,
-  0xf5, 0x42, 0xb0, 0xcd, 0x04, 0x18, 0x97, 0x81, 0x45, 0x4b, 0x04, 0x8a,
-  0x56, 0xff, 0xbb, 0x09, 0x41, 0xfa, 0xa2, 0x74, 0x39, 0x9f, 0xc6, 0x59,
-  0x18, 0x74, 0x6d, 0xa5, 0x08, 0xa1, 0x44, 0x2e, 0x68, 0x35, 0x94, 0xff,
-  0xe5, 0xe4, 0xa5, 0xd9, 0x64, 0xa4, 0xb3, 0x52, 0x6d, 0xda, 0xaf, 0x57,
-  0x2d, 0x2e, 0xca, 0x9d, 0x6b, 0x84, 0x17, 0x76, 0x3e, 0x55, 0x76, 0xf7,
-  0xa9, 0xb9, 0x88, 0xa9, 0x6f, 0xe8, 0x6d, 0x76, 0x8e, 0xbe, 0x6b, 0x61,
-  0x83, 0xb8, 0x5f, 0x02, 0x4c, 0x6a, 0xc0, 0x4b, 0x19, 0xbd, 0x6a, 0x59,
-  0x35, 0x58, 0x6b, 0x29, 0x50, 0x22, 0x35, 0x74, 0xaa, 0x8c, 0xfa, 0xdc,
-  0xee, 0x70, 0x40, 0x36, 0xc7, 0xde, 0xec, 0x3a, 0x33, 0x07, 0x91, 0x53,
-  0x87, 0xc6, 0x55, 0xf9, 0x21, 0xe3, 0x5d, 0x07, 0xf3, 0x02, 0xec, 0x49,
-  0xac, 0x4b, 0x89, 0x53, 0xd6, 0xc8, 0xb9, 0xa9, 0x85, 0x30, 0x46, 0xf4,
-  0x59, 0x2a, 0x87, 0x26, 0xb4, 0x0b, 0x4e, 0x1a, 0xe6, 0x8e, 0xf5, 0x40,
-  0xd9, 0xc1, 0x79, 0xb9, 0x26, 0x44, 0xd5, 0x16, 0x3f, 0xf9, 0x76, 0x13,
-  0x30, 0x17, 0xe2, 0xca, 0xc3, 0xef, 0x9f, 0x7d, 0xf1, 0xd4, 0xac, 0x3e,
-  0xf9, 0x76, 0xd5, 0xfd, 0x93, 0x1f, 0x59, 0xd1, 0x87, 0x57, 0x39, 0x33,
-  0x7b, 0x09, 0x9e, 0xb0, 0xe4, 0xb9, 0xd9, 0x54, 0xec, 0x13, 0xa3, 0x98,
-  0x56, 0xd7, 0xdd, 0x85, 0x6a, 0x7d, 0x03, 0x35, 0x3d, 0xa6, 0x8c, 0xea,
-  0x81, 0xc9, 0x46, 0x9a, 0x38, 0xa7, 0x39, 0x4c, 0x5d, 0xfd, 0x4c, 0xa1,
-  0xe5, 0xee, 0xb3, 0x92, 0x64, 0x76, 0x4c, 0xe4, 0x90, 0x3b, 0x47, 0x0e,
-  0xa7, 0xc5, 0x42, 0x0f, 0xa7, 0xe5, 0x01, 0xf7, 0x4e, 0x5e, 0x3b, 0x45,
-  0xf3, 0xcf, 0x84, 0x0a, 0x36, 0x5a, 0x6d, 0x43, 0xb0, 0x30, 0x7c, 0x2b,
-  0x50, 0x3b, 0xb9, 0x6e, 0x95, 0x4d, 0x1c, 0xe1, 0xbc, 0x6f, 0xcb, 0x2b,
-  0x43, 0xd5, 0x0c, 0x7c, 0xdd, 0x80, 0x39, 0xc3, 0x93, 0x63, 0x32, 0x5a,
-  0x22, 0x16, 0x21, 0x7b, 0x2e, 0x72, 0x9b, 0x78, 0x97, 0x0b, 0xdf, 0x30,
-  0x23, 0xb8, 0xc4, 0xc2, 0x4e, 0x15, 0x9c, 0xc5, 0x83, 0xb7, 0x74, 0x77,
-  0xe1, 0xa9, 0xa7, 0x1e, 0x31, 0xfe, 0x49, 0xcc, 0x34, 0xfd, 0x81, 0x2d,
-  0x58, 0xd5, 0x02, 0xcf, 0xb0, 0x91, 0x02, 0xed, 0x98, 0xf3, 0x88, 0x63,
-  0x83, 0x4d, 0xbc, 0xc7, 0xfc, 0x57, 0x0e, 0x3e, 0xdf, 0xed, 0x8b, 0x88,
-  0xa2, 0x70, 0x97, 0xff, 0x0c, 0x0a, 0xb1, 0x87, 0x7a, 0x04, 0x3d, 0x66,
-  0x7e, 0x6a, 0x9f, 0x0c, 0x65, 0xa0, 0x10, 0x5f, 0x3e, 0x79, 0x44, 0x31,
-  0xef, 0xb8, 0x4f, 0x89, 0x2f, 0x5a, 0xdf, 0x8b, 0x60, 0xdd, 0x08, 0x75,
-  0x0c, 0xfc, 0xe9, 0x9d, 0x2d, 0xbb, 0x1a, 0x27, 0x12, 0x2f, 0xdd, 0xac,
-  0xb9, 0xba, 0x7c, 0xc4, 0x23, 0x31, 0xcd, 0xeb, 0x88, 0x13, 0x83, 0xf1,
-  0x6c, 0xb2, 0xe1, 0x6c, 0xc9, 0x31, 0x14, 0x57, 0xe1, 0xad, 0x8d, 0x55,
-  0x34, 0x07, 0xa6, 0x87, 0xd2, 0x08, 0xda, 0x6b, 0x33, 0xfb, 0x6b, 0xcf,
-  0xc9, 0xb3, 0xe1, 0xe3, 0xd6, 0x39, 0x69, 0x66, 0xf3, 0xc1, 0xed, 0xf8,
-  0x9e, 0xd8, 0xc7, 0xe5, 0xe9, 0x9b, 0x64, 0xbe, 0x44, 0x51, 0x6f, 0xe1,
-  0xf1, 0xbd, 0x9b, 0x65, 0xea, 0x86, 0x26, 0x07, 0x0f, 0xfb, 0x0a, 0x6f,
-  0xc0, 0xee, 0x18, 0x42, 0xba, 0xa3, 0x40, 0x5b, 0x9b, 0x46, 0x2a, 0x76,
-  0xbf, 0xf0, 0xd6, 0x51, 0x93, 0xec, 0xcf, 0x5e, 0x2c, 0x66, 0x79, 0x34,
-  0xd3, 0x47, 0x81, 0xb6, 0xd9, 0xa7, 0x6c, 0xb2, 0x44, 0x9c, 0x9a, 0xd4,
-  0x43, 0xa2, 0x80, 0x5a, 0xef, 0x40, 0xf7, 0x9c, 0xe6, 0xe2, 0x26, 0x37,
-  0x3f, 0xe8, 0x4e, 0x46, 0x77, 0xec, 0x3c, 0xf8, 0xc0, 0x7b, 0xc6, 0x29,
-  0xef, 0xb1, 0xdf, 0x05, 0xb1, 0x62, 0xc0, 0xfb, 0xe9, 0x42, 0x34, 0x5b,
-  0x2a, 0xbf, 0x2e, 0x58, 0xe9, 0x78, 0x93, 0x4f, 0xaa, 0xb2, 0x2e, 0xaf,
-  0x18, 0xb8, 0xe6, 0x99, 0x48, 0x27, 0x27, 0xa3, 0xe4, 0x36, 0x1b, 0x6b,
-  0x96, 0xec, 0x30, 0x74, 0x26, 0x43, 0x86, 0x50, 0x84, 0xa4, 0xca, 0xb3,
-  0x86, 0xa6, 0x4c, 0x63, 0xa2, 0x7d, 0x2d, 0x80, 0x24, 0x9c, 0x2a, 0x50,
-  0xe0, 0xa9, 0x8a, 0xdc, 0x8c, 0x2f, 0xa6, 0x45, 0x56, 0x46, 0x02, 0xe3,
-  0xdc, 0x01, 0xbd, 0x56, 0x78, 0x9f, 0xe0, 0x0e, 0x1f, 0xa7, 0x35, 0x67,
-  0xb4, 0xb0, 0x77, 0xc0, 0x88, 0x1d, 0xd2, 0x51, 0xc4, 0x71, 0xf9, 0x81,
-  0x7c, 0x66, 0x41, 0xf2, 0xca, 0x38, 0xa3, 0x92, 0x76, 0x14, 0xee, 0x6f,
-  0x7b, 0xef, 0x8a, 0x69, 0x59, 0x01, 0x90, 0xe4, 0x55, 0xc9, 0x40, 0x91,
-  0xb9, 0x65, 0x85, 0x2c, 0x2c, 0x50, 0x90, 0x86, 0xf2, 0xf4, 0xf6, 0x86,
-  0xe3, 0xb6, 0xba, 0x0a, 0x74, 0x39, 0x21, 0xf1, 0x96, 0x73, 0x7d, 0x84,
-  0x88, 0x9d, 0xfa, 0xef, 0xae, 0x1b, 0x6f, 0x35, 0xa2, 0x74, 0x85, 0xb2,
-  0x1e, 0x2e, 0xcb, 0x54, 0xdc, 0x33, 0x2f, 0xf3, 0xeb, 0x15, 0x95, 0x14,
-  0x2d, 0xdf, 0x03, 0x2e, 0x27, 0x9c, 0x58, 0xf4, 0x46, 0xae, 0xcc, 0x8a,
-  0xcf, 0x68, 0x12, 0x14, 0x08, 0x05, 0xc9, 0x4d, 0xe8, 0x89, 0x5d, 0xb1,
-  0xfb, 0x56, 0xd1, 0x64, 0x78, 0x9a, 0x63, 0x27, 0xb0, 0x84, 0x9b, 0xa5,
-  0xb1, 0xf5, 0xdd, 0x48, 0x81, 0xf9, 0x85, 0x31, 0xa5, 0x76, 0x57, 0xec,
-  0x09, 0x88, 0xa9, 0x7c, 0xbe, 0x96, 0x17, 0x70, 0x52, 0x78, 0x31, 0xd9,
-  0xb8, 0xd2, 0xb7, 0x8a, 0x0e, 0x1a, 0x21, 0xad, 0x08, 0x30, 0xc5, 0x8b,
-  0xca, 0xda, 0x2a, 0xe2, 0xb4, 0x3c, 0xed, 0x90, 0x97, 0x7f, 0x74, 0x4b,
-  0xfa, 0xc1, 0xfe, 0x60, 0x9c, 0xa5, 0x54, 0xb7, 0xe3, 0x79, 0x43, 0x0a,
-  0x53, 0x3c, 0x51, 0x65, 0x45, 0x9e, 0xca, 0xd7, 0xfc, 0xe6, 0x25, 0x34,
-  0x2d, 0x5a, 0xda, 0xb3, 0xc3, 0x77, 0x97, 0xaf, 0x93, 0x64, 0x9f, 0xb8,
-  0xe1, 0x1f, 0x92, 0xa8, 0x02, 0x89, 0xd0, 0x6a, 0x45, 0x4f, 0x35, 0x1d,
-  0xa8, 0xb2, 0xf8, 0xdb, 0xb2, 0x68, 0xd7, 0x04, 0x88, 0x39, 0xe9, 0x71,
-  0x7f, 0xca, 0xd5, 0xcb, 0x99, 0xd3, 0x2d, 0x98, 0xb5, 0x16, 0x8d, 0xe1,
-  0x15, 0x19, 0x0c, 0x30, 0xed, 0xe4, 0xeb, 0xba, 0x27, 0x9e, 0x59, 0xc7,
-  0x19, 0x3b, 0xa4, 0xb7, 0xd2, 0x5d, 0xa5, 0x14, 0xd2, 0xc0, 0x69, 0x95,
-  0x89, 0xa7, 0xbf, 0xe9, 0x56, 0x82, 0xbc, 0x78, 0x75, 0xd4, 0x69, 0xee,
-  0xe9, 0x67, 0x4f, 0x76, 0x7f, 0x47, 0xb4, 0x5e, 0x49, 0xfe, 0x11, 0xf1,
-  0x23, 0x44, 0x89, 0x74, 0xbe, 0xaf, 0x28, 0x8f, 0x55, 0x3d, 0x0d, 0xa5,
-  0x3c, 0xe4, 0x67, 0xda, 0xd7, 0xcd, 0x94, 0x60, 0x5b, 0x96, 0x88, 0xa3,
-  0x52, 0x75, 0xff, 0x3f, 0xff, 0x2b, 0xcc, 0xb3, 0xfd, 0xf1, 0x67, 0x76,
-  0x16, 0x5f, 0xa1, 0x54, 0x9a, 0xc3, 0xfd, 0xab, 0x98, 0xa9, 0xdd, 0x8d,
-  0x4c, 0x27, 0x7a, 0xf3, 0x8f, 0x9b, 0xb6, 0x9c, 0x09, 0x74, 0xfe, 0x68,
-  0x96, 0xb6, 0x5e, 0x9e, 0xd2, 0x37, 0x5d, 0x58, 0x54, 0xc0, 0x4e, 0x3d,
-  0x75, 0xc0, 0xa5, 0x58, 0x4a, 0x85, 0x8f, 0xe9, 0xaa, 0x72, 0x44, 0x5a,
-  0x96, 0x43, 0x18, 0xbd, 0xd4, 0x5f, 0x4e, 0x5e, 0x72, 0x06, 0x59, 0xa1,
-  0xff, 0xa4, 0x8a, 0x22, 0x9f, 0x39, 0x2f, 0x56, 0xf8, 0x2f, 0x05, 0x49,
-  0xf4, 0x9f, 0x66, 0x05, 0xfa, 0xcd, 0x6d, 0xf9, 0x5f, 0x6d, 0x5f, 0xa6,
-  0xd1, 0x30, 0xa8, 0xc7, 0xef, 0xff, 0xb8, 0x47, 0x09, 0x42, 0xbd, 0x6e,
-  0x13, 0x0c, 0xf6, 0xb7, 0xab, 0x6a, 0x15, 0xa4, 0x75, 0x04, 0xbb, 0xfa,
-  0x41, 0xca, 0x3e, 0xee, 0x93, 0xde, 0xf8, 0x5f, 0x43, 0xfa, 0xef, 0x8f,
-  0x7b, 0x83, 0x27, 0x3f, 0xdb, 0x8f, 0xfe, 0x71, 0xef, 0xfd, 0x1f, 0xf7,
-  0x7b, 0xd1, 0x2c, 0x3b, 0x47, 0x07, 0xe0, 0x41, 0x15, 0x49, 0x9d, 0x2d,
-  0xee, 0x24, 0x6b, 0x43, 0x42, 0x8d, 0xae, 0x7e, 0x1a, 0x8a, 0xb4, 0x86,
-  0x94, 0x49, 0xe4, 0xb9, 0xea, 0x68, 0xaa, 0x5a, 0x42, 0x4d, 0x85, 0xc3,
-  0x6d, 0xc9, 0x2f, 0x8b, 0x57, 0x85, 0xd3, 0x01, 0x35, 0x9d, 0x20, 0x90,
-  0x85, 0x45, 0xd6, 0xde, 0x1b, 0x44, 0xa0, 0xa2, 0xac, 0x1b, 0xe1, 0x6c,
-  0x08, 0x3e, 0xca, 0xdc, 0x66, 0x69, 0xd2, 0x99, 0xf4, 0xf1, 0xd8, 0xfe,
-  0xa4, 0xc8, 0x82, 0xbc, 0xac, 0xd4, 0xe6, 0x31, 0xb2, 0xfd, 0x66, 0xa5,
-  0x82, 0x79, 0xd3, 0xc6, 0xaf, 0x25, 0xac, 0x85, 0xde, 0xbb, 0xf2, 0xbc,
-  0x54, 0x25, 0xb6, 0x2b, 0x2d, 0xfe, 0xb6, 0xd4, 0xea, 0xc9, 0xee, 0x42,
-  0x31, 0x2d, 0xe5, 0xb5, 0x0b, 0xc2, 0xe0, 0x67, 0x12, 0x80, 0x41, 0xc2,
-  0x3f, 0x17, 0xf0, 0x2a, 0x63, 0x1e, 0x81, 0x74, 0x4c, 0xf5, 0xcd, 0x5a,
-  0xd5, 0x62, 0x26, 0xa8, 0xec, 0x5a, 0xc3, 0x9e, 0x55, 0x02, 0xaa, 0xb4,
-  0x5e, 0x31, 0x21, 0xfe, 0x54, 0x78, 0x93, 0x20, 0x13, 0x85, 0xc9, 0x59,
-  0xe3, 0xd8, 0xe5, 0x2c, 0x59, 0x82, 0x91, 0x36, 0xd9, 0xc0, 0x4b, 0x93,
-  0x45, 0x5a, 0x2e, 0x7e, 0xea, 0x41, 0xdd, 0x24, 0xbe, 0x37, 0x08, 0x82,
-  0x92, 0x66, 0x13, 0x4d, 0xef, 0x8c, 0x24, 0x64, 0x6a, 0x56, 0x4b, 0xf5,
-  0xa8, 0x1e, 0x02, 0x91, 0x35, 0x66, 0x9f, 0x6d, 0x0e, 0x36, 0x93, 0x2d,
-  0xa4, 0xd2, 0xc3, 0xac, 0x4b, 0xa6, 0x69, 0x7d, 0xb3, 0x1d, 0xf3, 0x43,
-  0x3a, 0xd7, 0x9f, 0x13, 0x54, 0x63, 0x71, 0x3d, 0xd0, 0x8d, 0xc9, 0x12,
-  0x2a, 0x3a, 0x30, 0xbd, 0xaf, 0xcf, 0x10, 0x2f, 0x61, 0xbc, 0xe0, 0xc0,
-  0xa6, 0xd7, 0x74, 0x7e, 0x36, 0x00, 0x07, 0x2d, 0xff, 0xfc, 0x3f, 0xc2,
-  0x7b, 0x41, 0x9e, 0x64, 0xc8, 0xd7, 0x80, 0x73, 0xa2, 0xdc, 0x45, 0x4a,
-  0xc1, 0xbc, 0xe4, 0xf9, 0xe2, 0xa6, 0x32, 0xda, 0x5f, 0x98, 0x7a, 0x35,
-  0x7a, 0x9d, 0xc0, 0x13, 0x43, 0x45, 0x79, 0xf8, 0x19, 0xbb, 0x41, 0x3c,
-  0x06, 0xc2, 0xdf, 0x91, 0x36, 0x8f, 0xd0, 0x24, 0x83, 0xb4, 0x1e, 0x04,
-  0x9a, 0xce, 0xa5, 0x0f, 0xad, 0x25, 0xbd, 0x93, 0x8c, 0x11, 0x42, 0x31,
-  0x52, 0x5c, 0xad, 0x98, 0xa0, 0xfc, 0x73, 0xb2, 0x33, 0x1c, 0xee, 0x90,
-  0xc0, 0xda, 0x31, 0x7f, 0xb8, 0x62, 0x02, 0x00, 0xdd, 0x76, 0x8b, 0x21,
-  0x99, 0x8d, 0x0e, 0xe8, 0x0a, 0xd8, 0x33, 0xa4, 0x76, 0xa0, 0x8b, 0xb3,
-  0xd7, 0x7f, 0x5f, 0x02, 0x89, 0x5a, 0x19, 0x7d, 0xb2, 0xe2, 0xc4, 0xde,
-  0x79, 0xeb, 0x8e, 0x0c, 0x4a, 0x10, 0xb1, 0x63, 0xbd, 0x16, 0x12, 0x89,
-  0xe6, 0xa6, 0x93, 0x71, 0xc6, 0x28, 0x1a, 0xe0, 0x83, 0xf3, 0x46, 0xc9,
-  0xbb, 0x90, 0x54, 0x9d, 0xae, 0xb5, 0xe7, 0x1e, 0xef, 0xb7, 0xfd, 0x1e,
-  0x8b, 0xbc, 0x30, 0x16, 0x86, 0xd1, 0x8c, 0x41, 0xd2, 0x49, 0x50, 0xbc,
-  0x30, 0xa5, 0x87, 0x9d, 0x69, 0x9d, 0x62, 0x34, 0x70, 0x27, 0xb3, 0x7c,
-  0x73, 0xe5, 0xdd, 0x45, 0xc3, 0x06, 0xab, 0xa4, 0x84, 0xf3, 0xb7, 0x82,
-  0xcb, 0x92, 0x3f, 0xb2, 0xcd, 0x37, 0xa6, 0x80, 0x75, 0xb1, 0x21, 0x32,
-  0xbe, 0xdb, 0xa4, 0x4a, 0xd7, 0x18, 0xfe, 0x13, 0x02, 0x03, 0x41, 0x79,
-  0x47, 0x6b, 0x31, 0xaf, 0x87, 0x75, 0x39, 0x58, 0x47, 0x89, 0x2b, 0xb8,
-  0x44, 0x63, 0x26, 0x9e, 0x53, 0x33, 0xef, 0x2f, 0x8f, 0x2f, 0x44, 0x3d,
-  0x81, 0x03, 0xc2, 0x15, 0xcb, 0x0c, 0x4b, 0xcc, 0x92, 0x21, 0xf3, 0xf4,
-  0xb1, 0x2d, 0x6a, 0x5d, 0xdf, 0xa4, 0xfb, 0x4f, 0x9e, 0x4a, 0xb7, 0x95,
-  0x44, 0x0b, 0xf7, 0xf6, 0x26, 0xff, 0x6a, 0x67, 0x87, 0xa3, 0xe6, 0x64,
-  0x9a, 0x06, 0x72, 0x21, 0x95, 0xd2, 0xdc, 0x9b, 0x5f, 0x6c, 0x46, 0xf1,
-  0x72, 0xaa, 0xb8, 0xb2, 0xf9, 0x4e, 0xce, 0x67, 0x60, 0xfa, 0xfc, 0xe2,
-  0x0a, 0xfd, 0x56, 0xbd, 0x81, 0x44, 0xa8, 0x10, 0x02, 0xad, 0xa1, 0x55,
-  0x77, 0x40, 0x58, 0x27, 0xb4, 0x3a, 0x53, 0xa2, 0xc9, 0xa9, 0x44, 0xe8,
-  0xe9, 0xcf, 0x4f, 0xcd, 0x85, 0x42, 0x27, 0x21, 0xb3, 0x89, 0x60, 0xdf,
-  0x68, 0x35, 0xbc, 0x86, 0x05, 0x04, 0x4a, 0x04, 0xd6, 0xc4, 0xf6, 0x47,
-  0x1b, 0x4f, 0xa3, 0x2e, 0xec, 0x91, 0x41, 0x4f, 0xcd, 0x17, 0x82, 0x44,
-  0x11, 0xdd, 0x17, 0x96, 0x7f, 0x13, 0x06, 0xbd, 0x87, 0x12, 0x74, 0xa7,
-  0xc5, 0x5c, 0x07, 0x55, 0xd3, 0x21, 0xa6, 0x59, 0xcf, 0xce, 0x0c, 0x94,
-  0xd8, 0x24, 0xcb, 0x99, 0x8f, 0xc9, 0xac, 0x2d, 0xc5, 0x7d, 0x82, 0x73,
-  0x60, 0xb6, 0xc2, 0x0e, 0xed, 0x03, 0xb1, 0x35, 0x82, 0x42, 0x08, 0xe4,
-  0x63, 0x7e, 0x36, 0xdc, 0x3d, 0x50, 0xa6, 0xd6, 0x7e, 0xf2, 0x4d, 0xb1,
-  0xa4, 0x25, 0xa1, 0x51, 0x7f, 0x33, 0xfa, 0x36, 0xc8, 0xb7, 0xa2, 0x37,
-  0x1e, 0x3f, 0xa2, 0x37, 0xde, 0x8e, 0xf8, 0xa9, 0xdb, 0x72, 0x76, 0x65,
-  0xde, 0xdc, 0x39, 0xba, 0x4b, 0xcd, 0x1f, 0xb1, 0xc7, 0x3f, 0xa3, 0xc7,
-  0xcd, 0xc6, 0x9b, 0x36, 0x41, 0x41, 0xeb, 0x44, 0x2a, 0xfa, 0x1c, 0x24,
-  0xe7, 0xe5, 0x2c, 0xad, 0xe0, 0xf6, 0xe5, 0xcd, 0xb7, 0xa6, 0xc7, 0x8f,
-  0x1f, 0x47, 0x7a, 0xdc, 0x5f, 0xd1, 0xa1, 0xe1, 0x3f, 0xdf, 0xa3, 0x33,
-  0xf8, 0xfd, 0xe8, 0x6f, 0xe3, 0x74, 0xf2, 0x01, 0x5b, 0x11, 0xa0, 0x76,
-  0xcb, 0x3d, 0xfc, 0x7b, 0x4a, 0x73, 0x26, 0x23, 0x78, 0x48, 0x81, 0xa3,
-  0x0a, 0x7c, 0x6c, 0x0d, 0x72, 0xdc, 0x3f, 0xdb, 0x7f, 0xb4, 0xb7, 0xf3,
-  0x74, 0xf8, 0x78, 0xb8, 0x6f, 0x41, 0x66, 0x66, 0x63, 0x7d, 0xa4, 0x72,
-  0x1a, 0x14, 0xce, 0x5f, 0x55, 0x8d, 0x30, 0x2f, 0x4c, 0x3b, 0x1e, 0xf5,
-  0x42, 0xcd, 0x8e, 0x23, 0x07, 0x2f, 0x21, 0xa2, 0x85, 0x3d, 0x3f, 0x5b,
-  0x29, 0x56, 0x4d, 0x8e, 0xf8, 0x1b, 0xa8, 0x13, 0xe2, 0xeb, 0x30, 0xf6,
-  0x3f, 0xcd, 0xc0, 0x38, 0x37, 0x26, 0x73, 0x53, 0x2e, 0xe1, 0x52, 0x27,
-  0xff, 0x8d, 0xb2, 0xaf, 0x8b, 0x8e, 0xc4, 0x16, 0x32, 0x9d, 0xb1, 0x98,
-  0x6f, 0x8c, 0x7b, 0xcf, 0x70, 0x5e, 0x8a, 0x0f, 0x79, 0x25, 0xc1, 0xc9,
-  0x19, 0x4b, 0xf2, 0x90, 0x2b, 0x9f, 0x18, 0x73, 0xa6, 0x98, 0x98, 0x43,
-  0xff, 0xda, 0x98, 0x1a, 0x1f, 0xc9, 0x6f, 0x1c, 0xab, 0x27, 0x2d, 0x49,
-  0x8c, 0xea, 0xf7, 0x17, 0x8c, 0x83, 0x23, 0x47, 0x97, 0x1f, 0x70, 0xea,
-  0x84, 0x26, 0xaf, 0x72, 0xca, 0xd7, 0x20, 0x4c, 0xfc, 0xb5, 0xfe, 0xae,
-  0x36, 0x77, 0xa7, 0x10, 0x8c, 0x53, 0xfe, 0x12, 0xbb, 0xb8, 0x99, 0x64,
-  0x8e, 0xa6, 0xd1, 0x65, 0xa3, 0xc5, 0x3c, 0x30, 0xeb, 0x3c, 0x74, 0x51,
-  0x46, 0x0a, 0xfe, 0x57, 0xb7, 0xfa, 0xa3, 0x5c, 0x82, 0xb1, 0x0a, 0x6d,
-  0x9d, 0x22, 0x79, 0xda, 0xea, 0xaf, 0xde, 0x65, 0x8f, 0x7e, 0xfb, 0x5d,
-  0xb6, 0xff, 0xd0, 0x5d, 0xe6, 0x6d, 0x33, 0xf6, 0x04, 0xad, 0xd9, 0x68,
-  0x66, 0x0a, 0xb9, 0x3c, 0x76, 0x7c, 0x97, 0x79, 0x9b, 0x6c, 0x7c, 0x17,
-  0xdd, 0x62, 0xed, 0x3d, 0xe6, 0x36, 0xd9, 0xaa, 0x5d, 0x86, 0x6d, 0x66,
-  0xf7, 0xd9, 0x3d, 0x1b, 0x8d, 0x1d, 0x6d, 0xeb, 0x77, 0x59, 0xa7, 0xb8,
-  0xfa, 0x9a, 0x3d, 0xe6, 0x6f, 0x88, 0x07, 0xef, 0x32, 0xe7, 0xf5, 0x62,
-  0xb9, 0x93, 0xac, 0xd8, 0x68, 0xfe, 0x3e, 0x5b, 0x59, 0x07, 0x70, 0xef,
-  0x59, 0x6c, 0x97, 0x3d, 0x7a, 0xc8, 0x2e, 0x33, 0xeb, 0x39, 0xa3, 0xcb,
-  0xb7, 0xb5, 0xcb, 0x1e, 0xff, 0xa2, 0x5d, 0xc6, 0xdb, 0x0c, 0xfb, 0x6c,
-  0xe5, 0x46, 0xa3, 0x21, 0xb5, 0x53, 0x2f, 0x0f, 0xff, 0x59, 0x69, 0x91,
-  0xb6, 0x1a, 0x0d, 0x12, 0x12, 0x7f, 0xd9, 0x1a, 0x76, 0xa6, 0xfa, 0x01,
-  0x2b, 0xb6, 0xdf, 0x5e, 0xb1, 0xbd, 0x5f, 0xb6, 0x62, 0xfb, 0x9d, 0x18,
-  0xa1, 0x51, 0xfd, 0xd8, 0x75, 0xfb, 0xa3, 0x7a, 0xd0, 0x0f, 0x76, 0x76,
-  0x7e, 0x86, 0x23, 0xe2, 0x80, 0xee, 0xbe, 0x9f, 0x83, 0x02, 0xa9, 0x59,
-  0x27, 0x69, 0x71, 0x74, 0x76, 0xf4, 0xed, 0x48, 0xfc, 0xbf, 0xa2, 0xc1,
-  0xa8, 0x86, 0xc3, 0x9e, 0x32, 0xd0, 0x2e, 0x70, 0x39, 0xb3, 0x40, 0x6f,
-  0x96, 0x2a, 0x8a, 0x83, 0x4f, 0x7d, 0xeb, 0x88, 0xa5, 0x54, 0xb8, 0x42,
-  0x21, 0x83, 0x4c, 0x9f, 0xc6, 0x24, 0x4e, 0x30, 0xbe, 0xa5, 0xe9, 0x15,
-  0x2c, 0x59, 0x7e, 0x5f, 0xc4, 0xf2, 0x2f, 0xdc, 0x2b, 0x5b, 0xcd, 0x4d,
-  0x85, 0x14, 0x09, 0x3c, 0x26, 0xca, 0x7a, 0xa3, 0xc5, 0xd3, 0x56, 0xf6,
-  0x4e, 0x7a, 0xf5, 0x1a, 0x24, 0xb3, 0x8b, 0x2a, 0x5b, 0x51, 0x97, 0xf8,
-  0xf2, 0xc6, 0xfb, 0x6d, 0x58, 0x6f, 0xd5, 0x4d, 0x98, 0x50, 0xa6, 0x79,
-  0xf3, 0x4d, 0xef, 0x05, 0xd9, 0xdd, 0xf9, 0xa7, 0x36, 0x8d, 0x4f, 0x3a,
-  0x43, 0xf5, 0x51, 0x14, 0xd3, 0x50, 0x77, 0xbb, 0xb6, 0xc1, 0x30, 0xa0,
-  0x8c, 0x2b, 0x62, 0xd4, 0x8f, 0x4d, 0x93, 0x01, 0x02, 0x13, 0xbf, 0x48,
-  0xe9, 0x37, 0xf2, 0x8f, 0x27, 0xf4, 0x61, 0x38, 0x4e, 0xf9, 0x9f, 0x37,
-  0xf8, 0x37, 0x7d, 0x52, 0x59, 0x99, 0xbc, 0x75, 0x9e, 0x44, 0x27, 0x5a,
-  0x45, 0x29, 0xdb, 0xf0, 0xcc, 0x16, 0xf0, 0xb6, 0x74, 0xf9, 0x69, 0xfe,
-  0x98, 0x5d, 0x19, 0xf2, 0x48, 0x5d, 0x02, 0x4f, 0x10, 0xa3, 0xe5, 0xc7,
-  0x2b, 0x62, 0x02, 0x59, 0xe2, 0x93, 0x37, 0x6a, 0x2e, 0xbe, 0x5f, 0x46,
-  0xcb, 0x85, 0x1d, 0x65, 0x09, 0xfa, 0xcc, 0xe4, 0x19, 0xc2, 0x65, 0xa9,
-  0x42, 0x84, 0xf4, 0x7c, 0x6f, 0xf7, 0xf3, 0xd0, 0x73, 0xfb, 0x4e, 0xf3,
-  0xc3, 0x1c, 0x7f, 0x21, 0xb0, 0x05, 0x40, 0x6a, 0x8f, 0x5d, 0x56, 0x44,
-  0xec, 0xa3, 0x91, 0x14, 0x32, 0x18, 0xd3, 0xd3, 0x8c, 0xcd, 0xaf, 0x31,
-  0xdb, 0xd1, 0x22, 0x28, 0xd2, 0x76, 0x49, 0x08, 0x72, 0x3e, 0xe4, 0x02,
-  0xb0, 0x35, 0xba, 0x24, 0x07, 0xc8, 0x03, 0xf9, 0x4e, 0xa0, 0x0d, 0x8d,
-  0xdb, 0x7c, 0xe5, 0xd8, 0xd1, 0xfe, 0xf4, 0x78, 0x97, 0xd6, 0x54, 0x1b,
-  0x49, 0xb9, 0xd0, 0x3d, 0xef, 0xb9, 0x3f, 0x3d, 0x4a, 0x87, 0xff, 0x42,
-  0x6e, 0xa3, 0x27, 0x6d, 0xb3, 0xfc, 0x8f, 0x7d, 0x3e, 0xe1, 0xd7, 0x44,
-  0xbf, 0x32, 0x18, 0xa7, 0x55, 0x24, 0x1b, 0x41, 0xee, 0x6e, 0xe5, 0xed,
-  0x50, 0xd6, 0x0b, 0x7d, 0x0b, 0xa9, 0x4d, 0xa9, 0x03, 0x98, 0xdb, 0x9f,
-  0x27, 0x61, 0x73, 0x9e, 0xdb, 0xdb, 0xaf, 0xba, 0xda, 0x67, 0xbe, 0x29,
-  0x8f, 0x6e, 0x2a, 0x9d, 0xf5, 0x29, 0x20, 0x16, 0x21, 0x25, 0x62, 0x75,
-  0xaf, 0xf5, 0x11, 0x22, 0x8e, 0xba, 0xf5, 0xcc, 0x72, 0x66, 0x7d, 0xbf,
-  0x82, 0xf7, 0xdb, 0x22, 0x19, 0xcc, 0xef, 0x29, 0xb0, 0x19, 0xd3, 0x3f,
-  0xea, 0x49, 0x45, 0x25, 0x75, 0xa4, 0x0e, 0x01, 0x5a, 0x5a, 0x10, 0xeb,
-  0x9e, 0xd1, 0x3d, 0xae, 0x33, 0xcd, 0x44, 0xb4, 0xe3, 0x56, 0xc2, 0x09,
-  0xb0, 0x4c, 0x0c, 0x63, 0xf8, 0x5e, 0x07, 0xe0, 0x71, 0x85, 0x70, 0xcd,
-  0x04, 0x31, 0x2d, 0x05, 0xbd, 0xae, 0x79, 0xa1, 0xb6, 0xa6, 0xc4, 0x82,
-  0x0a, 0xba, 0xd5, 0x37, 0x79, 0xb7, 0xf2, 0xf5, 0xd6, 0xe0, 0x45, 0xf9,
-  0x62, 0xb0, 0x2d, 0x9b, 0xbc, 0xfc, 0x68, 0x0c, 0x61, 0xb2, 0x85, 0xd0,
-  0x55, 0x0a, 0x7a, 0xde, 0xc0, 0x6b, 0x23, 0xd7, 0x17, 0xd2, 0x1f, 0x09,
-  0x85, 0x08, 0x7d, 0x0c, 0x7e, 0xf6, 0xa0, 0xd2, 0x08, 0x77, 0xac, 0xa2,
-  0x88, 0xa7, 0x48, 0x3c, 0xf2, 0xf0, 0x98, 0xb9, 0xba, 0x62, 0x98, 0x14,
-  0x52, 0x24, 0x29, 0x18, 0x2c, 0x0c, 0xc5, 0xec, 0x5c, 0x2e, 0x17, 0xed,
-  0xdb, 0x89, 0xb2, 0x6d, 0x55, 0x3a, 0x3c, 0x57, 0xc1, 0xf2, 0xe5, 0xbd,
-  0x58, 0x7a, 0x2b, 0x82, 0xae, 0xc4, 0x2f, 0x42, 0xc7, 0x0f, 0xb9, 0x15,
-  0xcc, 0x6d, 0x3c, 0xb9, 0xc9, 0xe6, 0x52, 0x91, 0xe5, 0x17, 0xd6, 0x97,
-  0xef, 0xf4, 0x89, 0x51, 0x66, 0x57, 0xcd, 0x62, 0x38, 0x2f, 0xff, 0x61,
-  0xe6, 0x38, 0xa5, 0x12, 0x6f, 0xc1, 0xa1, 0xa0, 0x14, 0xc2, 0x82, 0x17,
-  0x05, 0x12, 0x77, 0x59, 0x58, 0xd3, 0xd2, 0xe3, 0x67, 0x13, 0x0e, 0x6a,
-  0xa4, 0x90, 0x27, 0x47, 0xa6, 0xc7, 0xc7, 0xef, 0xdf, 0xbd, 0x1d, 0xbd,
-  0x3b, 0xef, 0x9e, 0xfd, 0xf3, 0xb3, 0x8b, 0xcb, 0xe3, 0x97, 0xef, 0xcf,
-  0x2f, 0xce, 0x2e, 0xcf, 0x8e, 0xce, 0x4e, 0x93, 0xad, 0xbd, 0xed, 0xb5,
-  0x19, 0x53, 0xd6, 0xab, 0xe1, 0x31, 0xf0, 0x69, 0xff, 0x59, 0x6a, 0xd9,
-  0x2e, 0x6c, 0xd1, 0x78, 0xc2, 0xd6, 0xbe, 0x97, 0xbd, 0xd5, 0x62, 0x35,
-  0x86, 0x6b, 0x03, 0xd7, 0x1b, 0xe4, 0x7a, 0x9a, 0x5c, 0x2f, 0xe9, 0x98,
-  0xd8, 0x90, 0xb9, 0xa6, 0x93, 0xd4, 0x4d, 0x70, 0x19, 0x65, 0x99, 0x04,
-  0xee, 0xbc, 0x64, 0x9b, 0xb5, 0x1e, 0xbe, 0x27, 0x5d, 0xad, 0x85, 0xd6,
-  0x00, 0x2a, 0x98, 0xdb, 0x15, 0x75, 0x7c, 0x5b, 0xd8, 0x7d, 0xc1, 0x14,
-  0x1d, 0x60, 0x78, 0xb6, 0xaf, 0x80, 0xfe, 0x5e, 0x02, 0x29, 0x65, 0x61,
-  0x95, 0xba, 0x61, 0x72, 0x1e, 0x96, 0x2d, 0x92, 0x37, 0xa6, 0x59, 0x21,
-  0xe5, 0x33, 0xa5, 0x1f, 0x88, 0xa3, 0xa1, 0xc6, 0x07, 0x47, 0x75, 0xcd,
-  0x03, 0xf4, 0x5b, 0x6f, 0xae, 0x90, 0xc2, 0x99, 0x05, 0x4e, 0x68, 0x7e,
-  0x9b, 0xd9, 0x2b, 0x6e, 0xbd, 0x3e, 0x51, 0x7b, 0xa4, 0x96, 0x81, 0x61,
-  0x2f, 0x22, 0x63, 0x8f, 0x35, 0x4a, 0xc3, 0xe9, 0x32, 0x38, 0x93, 0xd0,
-  0x60, 0x94, 0xb9, 0x65, 0xe4, 0x8f, 0xe5, 0x9e, 0x8d, 0xcc, 0x93, 0x48,
-  0xee, 0xf2, 0x3e, 0xad, 0x7d, 0x9f, 0x37, 0xb4, 0x04, 0xa7, 0xd6, 0x60,
-  0xf5, 0x1d, 0xae, 0xd0, 0x77, 0x72, 0xa1, 0x43, 0xe4, 0x7a, 0x77, 0xa3,
-  0xf1, 0xba, 0xa2, 0x19, 0x93, 0xe6, 0x76, 0xe9, 0x4e, 0x2e, 0x6e, 0x1b,
-  0x4d, 0x66, 0x97, 0x12, 0xa8, 0xc2, 0xe9, 0x4b, 0x54, 0x18, 0x46, 0x73,
-  0x3f, 0xb0, 0x70, 0x25, 0xc2, 0xef, 0x24, 0x9c, 0x0a, 0xcf, 0x1e, 0xfe,
-  0xd1, 0xd1, 0x79, 0x84, 0x8a, 0xc1, 0xcb, 0x8d, 0x67, 0x81, 0xab, 0x65,
-  0x7e, 0x77, 0x87, 0xbb, 0xc9, 0xe8, 0xcd, 0xd7, 0xc2, 0x4e, 0xf8, 0xf5,
-  0x88, 0xb9, 0x9e, 0x49, 0xc9, 0xd6, 0x37, 0x86, 0x71, 0x02, 0x28, 0x08,
-  0x8f, 0x99, 0x84, 0x9b, 0xff, 0x92, 0xba, 0x5c, 0x33, 0x4e, 0xb2, 0xf1,
-  0xf4, 0x31, 0xce, 0x9b, 0xd3, 0x71, 0xf7, 0xa3, 0xe9, 0xe4, 0x1c, 0x45,
-  0xa1, 0x1a, 0xb7, 0xd1, 0x71, 0x0f, 0xd7, 0x53, 0x61, 0xed, 0x07, 0xe7,
-  0xe1, 0x81, 0x27, 0xe1, 0x21, 0x47, 0x41, 0x54, 0x1a, 0x15, 0xe2, 0xdd,
-  0xe9, 0x38, 0x6f, 0x6d, 0xd5, 0x8c, 0x72, 0x66, 0x18, 0x3a, 0x98, 0x5d,
-  0x41, 0x87, 0x43, 0x36, 0x5b, 0x1f, 0xbf, 0x44, 0xfc, 0xcb, 0x02, 0x9c,
-  0xe2, 0xbc, 0x48, 0x68, 0x24, 0x9d, 0xf8, 0x4a, 0xb1, 0x72, 0xa8, 0x75,
-  0xe7, 0xe0, 0x2f, 0xa8, 0xa8, 0xca, 0x04, 0xb2, 0x5c, 0x4c, 0x49, 0x98,
-  0x10, 0x0a, 0x22, 0x76, 0xcb, 0x35, 0xc2, 0xe5, 0x9d, 0xa5, 0x19, 0xe5,
-  0xc7, 0xdd, 0x71, 0x6a, 0x5d, 0x60, 0xac, 0x41, 0x91, 0x9a, 0x92, 0x61,
-  0xe0, 0x60, 0xdc, 0xba, 0xab, 0x51, 0x0c, 0xc9, 0x51, 0x62, 0x89, 0x66,
-  0x14, 0xca, 0xc6, 0x41, 0x92, 0xbc, 0xcc, 0x8a, 0xbb, 0x76, 0x87, 0xfa,
-  0xe0, 0xb3, 0x80, 0xe7, 0x36, 0x6f, 0x5c, 0xca, 0xb5, 0xd2, 0xfd, 0x5f,
-  0x79, 0x5b, 0x25, 0xec, 0x52, 0xbb, 0xcf, 0x31, 0x09, 0xf0, 0xc2, 0x4e,
-  0x83, 0x22, 0x60, 0xfc, 0xc9, 0xd8, 0x02, 0x73, 0x82, 0x06, 0xe9, 0xf0,
-  0xc9, 0x87, 0x4c, 0x03, 0x58, 0xe1, 0x60, 0x1f, 0xd5, 0xcb, 0xf1, 0xdf,
-  0xe8, 0xb8, 0xc2, 0x1a, 0x20, 0x2b, 0xbd, 0x52, 0x6e, 0x30, 0x05, 0xae,
-  0x91, 0x83, 0xce, 0x3c, 0xc5, 0x81, 0xa5, 0xd0, 0x83, 0x4c, 0x95, 0x56,
-  0x10, 0x3d, 0x54, 0x12, 0xec, 0xf6, 0x2e, 0x40, 0x9f, 0xa2, 0x09, 0x4b,
-  0xd9, 0x8a, 0xcb, 0x57, 0xb7, 0xf8, 0xe0, 0x8a, 0xa4, 0x13, 0xe3, 0xa1,
-  0x3a, 0xd7, 0x18, 0xcf, 0x26, 0x83, 0xf0, 0x2c, 0x24, 0x94, 0x1e, 0x5f,
-  0xd9, 0x96, 0xca, 0xbc, 0xba, 0xff, 0x17, 0xfa, 0x23, 0x1c, 0x45, 0x2b,
-  0x86, 0x42, 0xf3, 0xac, 0xa7, 0x9d, 0x1e, 0x87, 0xf8, 0xc0, 0xeb, 0xab,
-  0x3e, 0xf0, 0xc2, 0x09, 0xd4, 0xf5, 0x6d, 0x43, 0xf6, 0x3c, 0xe4, 0x03,
-  0xef, 0x0a, 0x25, 0x1c, 0xd3, 0xfd, 0xbd, 0xb0, 0x1c, 0xe8, 0xb7, 0x69,
-  0x55, 0x00, 0xf2, 0xed, 0xdb, 0x14, 0xc4, 0x50, 0xb1, 0x90, 0x0a, 0x09,
-  0xe9, 0x15, 0xa1, 0x65, 0xab, 0xcc, 0x11, 0xb6, 0x92, 0x17, 0x8c, 0x89,
-  0x68, 0x84, 0x03, 0x5a, 0xb1, 0x9b, 0x8b, 0xb2, 0x61, 0x36, 0x6a, 0x82,
-  0xd7, 0x92, 0xce, 0x50, 0x91, 0xb3, 0xcd, 0x9b, 0x64, 0x55, 0x36, 0xa9,
-  0x35, 0xbb, 0x9b, 0xe0, 0x93, 0x5a, 0x2e, 0x50, 0xa9, 0x52, 0x90, 0x4f,
-  0x12, 0x19, 0xf5, 0xe4, 0x8c, 0x7c, 0x91, 0x31, 0x52, 0x70, 0xe0, 0x58,
-  0xe2, 0xea, 0x8f, 0x65, 0x4e, 0xbc, 0x33, 0x1b, 0xf6, 0x4a, 0x30, 0x7a,
-  0x90, 0xdb, 0x25, 0x97, 0xf1, 0x8a, 0x0a, 0x0e, 0x98, 0x22, 0xb6, 0x8a,
-  0xc3, 0xed, 0xa6, 0x75, 0x2b, 0x21, 0x27, 0x6f, 0x21, 0x78, 0x81, 0x60,
-  0x30, 0xf6, 0x04, 0xb1, 0xa1, 0x99, 0x3d, 0x59, 0x70, 0x5c, 0x49, 0x0c,
-  0x39, 0x95, 0x88, 0xd4, 0x3d, 0x60, 0xca, 0x0a, 0xb2, 0x1f, 0x26, 0x96,
-  0x23, 0xa8, 0x4b, 0x39, 0xdd, 0xae, 0x1b, 0x6d, 0x6f, 0x55, 0x8b, 0xb3,
-  0x74, 0x0a, 0xe3, 0xf0, 0x1e, 0x31, 0xfe, 0xe9, 0x4e, 0x91, 0x5d, 0xeb,
-  0x95, 0x99, 0x05, 0x25, 0xdd, 0x12, 0x1f, 0x6b, 0xde, 0x60, 0xc5, 0x3a,
-  0xc8, 0x52, 0x45, 0x5c, 0x4a, 0x9d, 0x8a, 0xf9, 0x32, 0x2c, 0x72, 0x27,
-  0x91, 0x34, 0x0b, 0xa4, 0x61, 0xda, 0x25, 0xe8, 0x11, 0xe2, 0xf1, 0x60,
-  0x0e, 0x7e, 0xd8, 0xbb, 0x52, 0x97, 0x00, 0xae, 0x1c, 0x04, 0xd7, 0xe2,
-  0x3e, 0xb9, 0x1d, 0xcb, 0xb9, 0x62, 0x36, 0x4c, 0x31, 0x1d, 0x18, 0x21,
-  0xb0, 0x58, 0xe3, 0xeb, 0xfe, 0xd4, 0xd7, 0x41, 0xb7, 0x20, 0xa9, 0x3e,
-  0xc9, 0x03, 0xff, 0x84, 0x91, 0x6f, 0x32, 0x77, 0x21, 0xa4, 0xdb, 0xa8,
-  0x04, 0x8f, 0x62, 0x33, 0x19, 0x83, 0xd6, 0x85, 0xb6, 0xc2, 0x4a, 0x66,
-  0x7e, 0xcd, 0xb9, 0xc2, 0x04, 0xea, 0x84, 0xad, 0xc2, 0x21, 0xf1, 0xf4,
-  0xc9, 0xcc, 0xbd, 0xe3, 0x94, 0x27, 0xb4, 0x89, 0x5c, 0xd6, 0x42, 0xc0,
-  0xcc, 0xde, 0xb7, 0xd8, 0x28, 0x0a, 0xe6, 0x11, 0x2c, 0x48, 0xcc, 0xf2,
-  0xce, 0xcf, 0xc9, 0xb5, 0xe4, 0x92, 0x13, 0xbb, 0x9d, 0x94, 0xb5, 0x8e,
-  0xf9, 0x55, 0x20, 0x27, 0xf1, 0x21, 0xea, 0x58, 0xbe, 0x96, 0x5f, 0x60,
-  0xc5, 0x62, 0xc4, 0xa8, 0x35, 0xa6, 0x1d, 0x9c, 0xa8, 0xfe, 0x9c, 0xcb,
-  0xa3, 0xc7, 0xd1, 0x69, 0x23, 0x39, 0x6f, 0x5a, 0x44, 0x1d, 0x72, 0x5a,
-  0xa1, 0x81, 0x9e, 0xa3, 0x8d, 0x8b, 0x05, 0x7d, 0x6a, 0xee, 0x71, 0x85,
-  0xca, 0xf7, 0x10, 0x4b, 0x57, 0xf8, 0x87, 0x34, 0xec, 0xfe, 0xe9, 0x7e,
-  0x6b, 0x46, 0x17, 0x13, 0xd2, 0xb4, 0x56, 0xab, 0x3d, 0x16, 0xed, 0xaf,
-  0x3c, 0x37, 0x27, 0x7a, 0xdd, 0xa0, 0xf0, 0xd0, 0xaf, 0x19, 0x54, 0xab,
-  0xe0, 0xbc, 0x8c, 0x41, 0xfa, 0xdc, 0x59, 0x11, 0xfe, 0xc8, 0xda, 0xb8,
-  0xcf, 0x8a, 0x21, 0x98, 0x36, 0xd7, 0xd4, 0x77, 0xf5, 0x86, 0x61, 0x1f,
-  0xfc, 0xa5, 0x23, 0xb9, 0x7f, 0x1a, 0xb1, 0x35, 0xe8, 0xbf, 0x3f, 0x1e,
-  0xc0, 0xa5, 0x36, 0xfd, 0x79, 0x65, 0x3f, 0x8e, 0xfb, 0xd2, 0x97, 0xdf,
-  0xa1, 0x1b, 0xf9, 0xe2, 0x86, 0xfc, 0x25, 0xcf, 0x63, 0xb9, 0x30, 0xde,
-  0x44, 0xc8, 0x63, 0xbf, 0xfd, 0xf7, 0xab, 0x99, 0xa3, 0x9f, 0x59, 0xf3,
-  0x7d, 0x79, 0xec, 0x37, 0xff, 0x3e, 0x9f, 0xdd, 0xf5, 0x97, 0x8b, 0x95,
-  0x8a, 0x2f, 0x05, 0x71, 0xdc, 0x96, 0x38, 0xee, 0x56, 0xf9, 0x15, 0x42,
-  0x51, 0x40, 0xcc, 0xa1, 0x54, 0x94, 0x6f, 0x45, 0x6b, 0x25, 0xf8, 0x62,
-  0xf1, 0x37, 0x91, 0x60, 0x10, 0xcd, 0xe1, 0xe4, 0x48, 0xf1, 0x92, 0xe7,
-  0xfc, 0xe7, 0xce, 0x57, 0xb1, 0x35, 0x52, 0xee, 0xd2, 0x63, 0xba, 0x06,
-  0xb5, 0xdc, 0x09, 0xea, 0x67, 0x70, 0x42, 0xbf, 0xa8, 0xbc, 0xb6, 0xf6,
-  0x03, 0x4d, 0x96, 0x42, 0x3a, 0xe8, 0xd5, 0x58, 0x8d, 0x15, 0x99, 0x21,
-  0xc2, 0x75, 0x92, 0x09, 0xa6, 0x3e, 0x7f, 0x07, 0xe8, 0x21, 0xc5, 0x23,
-  0xf3, 0x3e, 0x58, 0xaf, 0x2a, 0x98, 0xc5, 0xd9, 0x3a, 0x5e, 0xad, 0x4a,
-  0xc7, 0x2f, 0xfa, 0xba, 0x2f, 0x35, 0x4e, 0x4c, 0x73, 0xb4, 0xad, 0x04,
-  0xd8, 0xa8, 0xfb, 0x09, 0xcb, 0x19, 0x92, 0xb0, 0x30, 0x5e, 0x9d, 0x74,
-  0xd3, 0x19, 0xe3, 0x67, 0x93, 0xa3, 0xb3, 0xb7, 0x6f, 0x8f, 0x8f, 0xba,
-  0xb1, 0x5d, 0x90, 0x4b, 0x20, 0x45, 0x00, 0x1e, 0x5a, 0x51, 0xf5, 0x83,
-  0x1a, 0x7b, 0xf8, 0x3a, 0x93, 0xa7, 0xdb, 0xf0, 0x0b, 0xf7, 0x00, 0xf5,
-  0x77, 0x52, 0xe1, 0x50, 0xe5, 0x4c, 0x03, 0x8f, 0x5d, 0x93, 0x77, 0x40,
-  0x24, 0xfd, 0x2a, 0xd8, 0x0f, 0xce, 0x1b, 0x01, 0xb7, 0x14, 0xd5, 0x5f,
-  0x64, 0x0d, 0x14, 0x26, 0xa6, 0xf6, 0x00, 0xdd, 0x35, 0x26, 0xe3, 0x8e,
-  0xe0, 0x8b, 0x25, 0x71, 0x2d, 0x34, 0x66, 0xec, 0x5e, 0x66, 0x3e, 0x2e,
-  0xca, 0xe3, 0x18, 0x94, 0x57, 0x5c, 0xee, 0x73, 0x9e, 0x56, 0x1f, 0x28,
-  0x36, 0xec, 0x65, 0x74, 0x20, 0xa3, 0x0f, 0x04, 0xc1, 0xd3, 0x69, 0x2c,
-  0x55, 0x1c, 0x45, 0x83, 0x15, 0xc2, 0x8e, 0x8c, 0x31, 0xee, 0x90, 0x94,
-  0xc8, 0x3b, 0xd0, 0x54, 0x3b, 0x7a, 0xbd, 0xc8, 0x6e, 0xe9, 0x33, 0xcc,
-  0x90, 0x41, 0xf9, 0xde, 0x21, 0xdf, 0x3e, 0x73, 0x3c, 0xb3, 0x87, 0xfe,
-  0x4e, 0x52, 0xcd, 0x69, 0xad, 0xe6, 0xcc, 0x68, 0x0f, 0xd2, 0x5c, 0x2a,
-  0x12, 0xc5, 0x69, 0x1a, 0xc1, 0x5c, 0xbd, 0x56, 0xca, 0x3b, 0x0f, 0xef,
-  0xa6, 0x4c, 0x1f, 0x7e, 0xfe, 0x05, 0x87, 0x6f, 0x24, 0x93, 0xc5, 0x23,
-  0xc3, 0x5b, 0x15, 0x99, 0xc5, 0x7c, 0x63, 0x21, 0xc8, 0x5e, 0xa9, 0x1d,
-  0x41, 0x8e, 0x54, 0xd3, 0xf3, 0x77, 0x7d, 0x70, 0x9e, 0x89, 0xca, 0x1a,
-  0x86, 0x33, 0x84, 0xd8, 0x93, 0x2e, 0x1d, 0x2b, 0x98, 0x8a, 0xe0, 0x70,
-  0x24, 0x8a, 0xb2, 0xeb, 0x25, 0xe7, 0xa4, 0x51, 0xe4, 0x1e, 0xc7, 0x35,
-  0x50, 0x74, 0x01, 0x10, 0x45, 0xb2, 0x56, 0x5f, 0x4b, 0x94, 0xa3, 0xe0,
-  0xf4, 0x94, 0x4a, 0x91, 0xea, 0xf4, 0x2b, 0xe1, 0x08, 0x3b, 0xf4, 0xe5,
-  0x08, 0xe7, 0xc5, 0x62, 0xd9, 0x04, 0x61, 0x39, 0xa2, 0x5f, 0xe2, 0x94,
-  0xfb, 0xaf, 0x06, 0x61, 0xc9, 0xa2, 0x74, 0xea, 0xaf, 0x2a, 0x44, 0x38,
-  0xac, 0xff, 0xba, 0x31, 0x02, 0x60, 0xad, 0x97, 0xd6, 0xb7, 0x69, 0x9c,
-  0x51, 0x23, 0x50, 0x6e, 0x8e, 0xa3, 0xba, 0xed, 0xba, 0x03, 0xf7, 0x42,
-  0x77, 0x37, 0xd8, 0xb7, 0x54, 0x48, 0xac, 0x23, 0xd8, 0x00, 0x05, 0x60,
-  0x47, 0xfe, 0x19, 0x3b, 0x87, 0xbc, 0x4f, 0xd9, 0xaa, 0x6b, 0xe9, 0x03,
-  0x57, 0x51, 0xe2, 0x87, 0x7e, 0xfb, 0xbb, 0x69, 0x7d, 0x15, 0x7a, 0x77,
-  0x39, 0xda, 0xe7, 0x7e, 0x8f, 0x1e, 0x44, 0xcb, 0xba, 0xb7, 0xbe, 0xfd,
-  0xf0, 0xcf, 0x06, 0x5c, 0x74, 0xf7, 0xf8, 0xe5, 0xdc, 0xcd, 0x7b, 0x2f,
-  0xd5, 0x22, 0xa4, 0x6e, 0x00, 0x1b, 0xf5, 0xee, 0xe4, 0xb5, 0xb7, 0xb0,
-  0x4b, 0x2d, 0xf2, 0x2f, 0xe2, 0x48, 0xf8, 0x3b, 0xd6, 0x11, 0x09, 0xe7,
-  0x3c, 0xec, 0x52, 0xbe, 0xf7, 0x12, 0x6e, 0x65, 0x66, 0x76, 0x51, 0x4b,
-  0x36, 0x33, 0xeb, 0xe1, 0x13, 0x47, 0x69, 0x69, 0xbf, 0xa5, 0xc2, 0x82,
-  0x74, 0xb0, 0x96, 0xba, 0x82, 0x4f, 0xb4, 0x26, 0xe1, 0x21, 0xf7, 0x52,
-  0x30, 0x25, 0xdd, 0xf4, 0xae, 0xd6, 0x44, 0x85, 0xb3, 0xb0, 0x0e, 0x94,
-  0xee, 0xb6, 0x27, 0x9e, 0xfa, 0xcd, 0x8f, 0xc5, 0xc3, 0x11, 0xd5, 0xf1,
-  0x95, 0x59, 0x05, 0xaa, 0xa6, 0xe6, 0x98, 0xca, 0x79, 0x25, 0xa2, 0x9a,
-  0xa0, 0x42, 0x1e, 0x9e, 0xda, 0xf3, 0x4c, 0xac, 0x02, 0x54, 0xff, 0xbf,
-  0x11, 0x51, 0xdd, 0x82, 0x54, 0x93, 0x82, 0x05, 0x7e, 0xa3, 0x08, 0xaa,
-  0xda, 0xe3, 0xc1, 0x60, 0x48, 0xf5, 0x3a, 0x44, 0xb5, 0x07, 0xa8, 0x5e,
-  0x83, 0xa7, 0x66, 0xd2, 0xa4, 0x75, 0x88, 0xea, 0x5f, 0x09, 0xa9, 0x5e,
-  0x81, 0xa8, 0xfe, 0xc5, 0x80, 0xea, 0xdf, 0x18, 0x51, 0xfd, 0x5b, 0x62,
-  0x7b, 0x71, 0x7a, 0x68, 0x3d, 0xf2, 0x89, 0xe4, 0xaa, 0x3c, 0xbf, 0x9f,
-  0x72, 0x34, 0xe0, 0x6b, 0xf3, 0xe2, 0xb6, 0xd2, 0x16, 0xab, 0x35, 0x56,
-  0x7d, 0x0f, 0x08, 0x84, 0x64, 0xb3, 0x44, 0x10, 0x65, 0x7e, 0x54, 0xf5,
-  0x51, 0xec, 0xac, 0xd7, 0xf5, 0x6c, 0x80, 0x1e, 0x50, 0x22, 0x69, 0x60,
-  0x29, 0x3a, 0x49, 0xd3, 0x79, 0xee, 0xb7, 0x17, 0x3a, 0xcd, 0xac, 0xde,
-  0x7b, 0xe4, 0xec, 0x75, 0xf9, 0xcb, 0x92, 0x92, 0x1c, 0x63, 0xb6, 0x3b,
-  0xcb, 0x9f, 0x91, 0xc8, 0x18, 0x65, 0xae, 0xe0, 0xb7, 0xe0, 0x27, 0xcd,
-  0x6c, 0xe9, 0x35, 0x1b, 0x95, 0xb0, 0xb5, 0x54, 0xc3, 0x6c, 0x15, 0x64,
-  0x35, 0xfb, 0xe3, 0xc0, 0x25, 0x42, 0x79, 0x29, 0x2a, 0xb6, 0x6b, 0x1c,
-  0xc2, 0xbd, 0xe1, 0x23, 0x4e, 0x7b, 0x55, 0xde, 0x0c, 0xe9, 0x67, 0x40,
-  0x56, 0x83, 0x0e, 0x80, 0x31, 0x58, 0xcd, 0x3b, 0x2e, 0x6c, 0x24, 0xcf,
-  0x0f, 0x93, 0x0b, 0x52, 0x1e, 0x8d, 0xb2, 0x8e, 0xd0, 0x21, 0xce, 0xb7,
-  0x69, 0x3b, 0x91, 0xdf, 0xc7, 0x9a, 0x6b, 0xd3, 0x54, 0x9a, 0x1d, 0xf4,
-  0xee, 0xe2, 0x34, 0x8c, 0xf6, 0x22, 0x82, 0x70, 0xb0, 0xb3, 0x03, 0xc0,
-  0xd1, 0x4d, 0xfa, 0xe9, 0xd3, 0xb0, 0xce, 0x76, 0xa6, 0xe5, 0xa4, 0xde,
-  0xa1, 0x15, 0xd4, 0xaf, 0xdf, 0x34, 0xf3, 0xd9, 0xef, 0x7e, 0x10, 0xcc,
-  0x8a, 0xd2, 0xdd, 0xf6, 0x10, 0x15, 0xcf, 0x7f, 0xf4, 0xf7, 0xd8, 0x59,
-  0x16, 0xd4, 0xf5, 0x9c, 0x11, 0x5b, 0x6b, 0x7b, 0x62, 0x1f, 0xfe, 0x3d,
-  0x7a, 0x82, 0x6c, 0xe3, 0xa8, 0x54, 0x68, 0xf5, 0x01, 0x8f, 0xfd, 0x1e,
-  0xdf, 0xff, 0xb8, 0xb7, 0xea, 0xb3, 0x28, 0x90, 0x88, 0x27, 0x7e, 0xc3,
-  0x0f, 0xbf, 0xb3, 0x4e, 0x1a, 0x4e, 0xce, 0x7e, 0x4e, 0xff, 0x3d, 0xd0,
-  0x19, 0x5e, 0x5b, 0x79, 0x69, 0x05, 0xa1, 0xb5, 0x57, 0xf7, 0x59, 0x9c,
-  0x3f, 0x6b, 0xd9, 0x0f, 0x56, 0xd1, 0x1b, 0x30, 0xb9, 0x8d, 0x50, 0xdd,
-  0x82, 0x81, 0x7c, 0x60, 0x99, 0x02, 0x59, 0x9b, 0x11, 0x76, 0x0e, 0xf6,
-  0x2f, 0x1b, 0x3b, 0x5d, 0xf8, 0x62, 0xba, 0x14, 0x41, 0x56, 0xad, 0x03,
-  0x4c, 0x20, 0x46, 0x8f, 0xc1, 0xb4, 0x08, 0x22, 0xe0, 0x61, 0xcf, 0x7a,
-  0x89, 0x7b, 0x01, 0x56, 0x66, 0xc6, 0x6c, 0x72, 0xeb, 0x09, 0xbd, 0x21,
-  0xae, 0x7c, 0x66, 0x95, 0x31, 0xbb, 0x91, 0x02, 0x78, 0xb2, 0xa0, 0x18,
-  0x1c, 0xd3, 0xe3, 0xcc, 0xa5, 0xe3, 0xdb, 0xb3, 0x7e, 0x90, 0xf4, 0x06,
-  0xef, 0x92, 0x83, 0xde, 0xef, 0x78, 0x37, 0x7a, 0xce, 0xba, 0x5f, 0x0d,
-  0x3d, 0x5e, 0x0d, 0xc4, 0x6d, 0xa3, 0x31, 0x03, 0x1a, 0x81, 0x38, 0x04,
-  0xf7, 0x8a, 0xa8, 0x85, 0xdf, 0x76, 0x17, 0x20, 0x82, 0x66, 0x25, 0xc4,
-  0x0e, 0x03, 0x64, 0xec, 0xe8, 0x1a, 0xe4, 0xd4, 0x82, 0xa0, 0xc0, 0x0f,
-  0xa1, 0xbd, 0x0b, 0x2a, 0xb5, 0x3a, 0x84, 0x6e, 0x0b, 0x93, 0xeb, 0x20,
-  0xb9, 0x04, 0x01, 0x71, 0x80, 0x5c, 0x60, 0xd0, 0xd9, 0x93, 0x88, 0xda,
-  0xf6, 0x81, 0x83, 0x0e, 0x1c, 0xac, 0xab, 0xe1, 0xb8, 0xe6, 0x5a, 0xf4,
-  0x42, 0x9a, 0x8e, 0x33, 0x8d, 0xfc, 0x50, 0xf1, 0x60, 0x1a, 0xb6, 0x21,
-  0x48, 0xb4, 0x3f, 0x0b, 0x0a, 0x62, 0x09, 0x5c, 0x5b, 0xd0, 0xc7, 0x36,
-  0xc8, 0xfb, 0x31, 0x4f, 0xed, 0x35, 0xe3, 0xbe, 0xc5, 0x33, 0xea, 0x3e,
-  0xb5, 0x2a, 0x5c, 0xc1, 0x4c, 0x13, 0x91, 0xec, 0xb4, 0xb7, 0xa3, 0x51,
-  0x88, 0xca, 0x2d, 0x8c, 0x06, 0x57, 0x5e, 0x17, 0xf9, 0x3f, 0xa4, 0x46,
-  0x49, 0x17, 0x4a, 0xd7, 0x82, 0x45, 0xb7, 0xe3, 0x96, 0x14, 0x4f, 0xee,
-  0xae, 0x06, 0x30, 0x41, 0x2a, 0xa5, 0x00, 0x6d, 0x21, 0xea, 0x16, 0x9d,
-  0x4a, 0x2e, 0x41, 0xce, 0x85, 0x28, 0x5a, 0xb1, 0x61, 0xe5, 0x89, 0xd8,
-  0x08, 0xef, 0x5a, 0x9a, 0x03, 0x01, 0x9f, 0xc6, 0x8f, 0x4f, 0xf6, 0x2b,
-  0x30, 0xcc, 0xa4, 0x78, 0xfc, 0x2a, 0x14, 0x73, 0x5b, 0xb3, 0xf4, 0x68,
-  0x9d, 0xb2, 0x4f, 0x46, 0x5f, 0xa1, 0xc3, 0x11, 0xa3, 0x63, 0x12, 0x0f,
-  0x5e, 0xa4, 0x96, 0x95, 0xef, 0xae, 0x05, 0x07, 0xfd, 0x03, 0xb8, 0x9d,
-  0xa8, 0x9d, 0x26, 0x5a, 0xbf, 0x20, 0xc2, 0xec, 0x64, 0x5b, 0x7f, 0x00,
-  0xa5, 0x13, 0x79, 0x3b, 0x95, 0x94, 0x57, 0xba, 0x0c, 0xbe, 0x7a, 0x2e,
-  0x86, 0x98, 0x31, 0x0f, 0x13, 0x75, 0xcb, 0x1d, 0x49, 0x3e, 0xb0, 0xd1,
-  0x7a, 0x6a, 0x0b, 0x2a, 0x78, 0x40, 0x16, 0xca, 0x58, 0xf3, 0x84, 0x1a,
-  0x9e, 0x5b, 0x7a, 0x7b, 0x48, 0xac, 0x43, 0x94, 0xc7, 0x61, 0x09, 0x61,
-  0xc8, 0xdc, 0x41, 0xc2, 0x90, 0xee, 0x89, 0xee, 0xd6, 0x72, 0x04, 0xc9,
-  0xb6, 0x8b, 0x1c, 0x4c, 0x17, 0x47, 0xa8, 0xad, 0xfe, 0xe3, 0x78, 0xd0,
-  0x91, 0xf3, 0x2c, 0x45, 0xe3, 0x43, 0x2e, 0x46, 0x9d, 0xa6, 0x66, 0x69,
-  0xf4, 0x56, 0xa2, 0x4d, 0xe4, 0x6c, 0x06, 0xbb, 0x26, 0x7d, 0x92, 0x3e,
-  0x2c, 0x72, 0xc5, 0x9d, 0x31, 0x58, 0xa8, 0x94, 0xed, 0x0e, 0xf6, 0x4e,
-  0x1a, 0x59, 0x51, 0x3c, 0xfb, 0x77, 0x00, 0xbf, 0xff, 0x1a, 0xec, 0xfb,
-  0xef, 0x0c, 0x7e, 0xf7, 0x6e, 0x0a, 0xba, 0x76, 0xc2, 0x7b, 0x02, 0xe8,
-  0x11, 0xb2, 0x5b, 0x19, 0x2e, 0x72, 0x9b, 0x5a, 0xfe, 0xfe, 0x98, 0xd9,
-  0x15, 0x3d, 0x49, 0xfd, 0x16, 0xda, 0xcf, 0x93, 0x20, 0x2a, 0x1f, 0x19,
-  0x73, 0x4b, 0x95, 0x83, 0x22, 0xf4, 0x16, 0xe8, 0x00, 0xa5, 0xb1, 0x4e,
-  0x33, 0xe1, 0xa5, 0xf9, 0x8b, 0xa3, 0xcf, 0xff, 0xbd, 0xf5, 0xf5, 0x3d,
-  0x23, 0x9b, 0x9f, 0x7b, 0xf7, 0xf1, 0x97, 0x91, 0x0b, 0x39, 0xf0, 0xec,
-  0x70, 0x2a, 0x0d, 0xbd, 0xda, 0x66, 0x7f, 0x8b, 0x08, 0xbd, 0xf8, 0x81,
-  0x41, 0xcd, 0x3e, 0x66, 0xf8, 0x12, 0xf1, 0x46, 0xe8, 0x21, 0x7a, 0x79,
-  0x85, 0x80, 0x13, 0x7e, 0x41, 0xe5, 0x16, 0x37, 0xf2, 0x7c, 0x9c, 0x35,
-  0xb7, 0x04, 0xb3, 0xc7, 0x6c, 0xe8, 0x34, 0x7a, 0x32, 0xc0, 0xca, 0xc3,
-  0x95, 0xb0, 0x80, 0xbe, 0x10, 0x3b, 0x92, 0x44, 0x61, 0xf2, 0x4a, 0x6b,
-  0x3c, 0x6a, 0xf8, 0x2b, 0x38, 0x7e, 0xb1, 0x7a, 0x18, 0x2e, 0x92, 0xc7,
-  0xdf, 0xa7, 0x79, 0xf1, 0x40, 0x8b, 0xad, 0x14, 0x05, 0x05, 0x78, 0xc8,
-  0x83, 0xbe, 0x23, 0xd4, 0x1e, 0x63, 0x39, 0xb6, 0x31, 0x17, 0x51, 0x5b,
-  0xcc, 0xe9, 0xe2, 0x7b, 0x7a, 0x56, 0x3b, 0x8c, 0x22, 0x31, 0x1d, 0xdc,
-  0x8f, 0x91, 0xbc, 0x4b, 0x5e, 0x46, 0xef, 0x22, 0x45, 0x00, 0x82, 0xa7,
-  0x42, 0x22, 0x77, 0x2c, 0x40, 0xec, 0x3c, 0xac, 0x3c, 0x16, 0xde, 0x30,
-  0xe7, 0x19, 0x01, 0xc6, 0xe4, 0xb4, 0xe6, 0xca, 0xef, 0x40, 0xdf, 0x1a,
-  0x20, 0xba, 0xe8, 0x44, 0x25, 0xdb, 0xd4, 0xf4, 0x91, 0x20, 0xa0, 0x43,
-  0x1f, 0x4d, 0x17, 0xe6, 0x4b, 0x20, 0xa6, 0xa7, 0xeb, 0x6d, 0x9e, 0x72,
-  0xdd, 0x28, 0x91, 0x7a, 0xde, 0x34, 0x74, 0x62, 0x95, 0x11, 0xf0, 0x69,
-  0x58, 0x6b, 0x49, 0x8c, 0x08, 0x16, 0x4c, 0x02, 0x5c, 0x16, 0x57, 0x81,
-  0x06, 0x25, 0xc5, 0xf5, 0x4d, 0xbb, 0x32, 0x4e, 0x73, 0x24, 0x04, 0xb0,
-  0x85, 0x24, 0xaa, 0x75, 0x04, 0x76, 0x58, 0xab, 0xf8, 0xb2, 0x64, 0x75,
-  0x8a, 0x13, 0x4d, 0xba, 0x7d, 0x17, 0x4c, 0x95, 0x16, 0xa8, 0x62, 0x77,
-  0x36, 0x7d, 0x81, 0xeb, 0x4d, 0x86, 0x46, 0x83, 0x70, 0xab, 0xe8, 0x0b,
-  0xc2, 0x30, 0x2a, 0xed, 0xdb, 0x32, 0x7e, 0xab, 0xa2, 0x44, 0xb1, 0x88,
-  0x7a, 0x4b, 0x38, 0x88, 0x1f, 0x38, 0x12, 0x27, 0xd9, 0x1a, 0x51, 0xd1,
-  0x86, 0xd1, 0xd1, 0xf9, 0x76, 0x72, 0xde, 0x71, 0xf1, 0x22, 0xd9, 0x82,
-  0xee, 0x6c, 0x5f, 0xde, 0x4b, 0xd9, 0x24, 0xa6, 0x90, 0x5b, 0xed, 0x0e,
-  0xcc, 0xe5, 0x2c, 0x5b, 0xa2, 0x44, 0x84, 0xe1, 0x7e, 0x73, 0xf9, 0xd7,
-  0x19, 0xcb, 0x21, 0xf8, 0x52, 0x98, 0x3f, 0x41, 0x3c, 0x8f, 0xbe, 0x30,
-  0x30, 0x36, 0x5d, 0x49, 0x29, 0x44, 0x5c, 0xa8, 0x44, 0x1c, 0xa4, 0xea,
-  0xd8, 0x9c, 0x05, 0xc0, 0x33, 0x4c, 0x84, 0x02, 0x81, 0x3d, 0xa2, 0x18,
-  0xa9, 0x18, 0x56, 0xf3, 0xed, 0xd7, 0xa1, 0xf2, 0xc6, 0xf6, 0xbe, 0xce,
-  0x8a, 0xb0, 0x38, 0x00, 0x3e, 0x4a, 0xfa, 0x82, 0x6c, 0xe0, 0xe9, 0xb0,
-  0x4b, 0x4b, 0xed, 0xb9, 0x70, 0xa5, 0x73, 0x39, 0xb0, 0xf8, 0xbc, 0xdf,
-  0x57, 0x10, 0xd8, 0xb1, 0x2a, 0x49, 0x05, 0xc3, 0x48, 0xf0, 0x5e, 0x93,
-  0xcb, 0xbc, 0xc1, 0x45, 0xba, 0xb8, 0xa3, 0xc9, 0x30, 0x8f, 0xd5, 0xf5,
-  0xcd, 0xbe, 0x11, 0x4f, 0xfb, 0xc3, 0xcf, 0xd9, 0xc0, 0xbd, 0x31, 0x3a,
-  0x41, 0x84, 0xed, 0x92, 0x23, 0xf9, 0x52, 0x5a, 0xb0, 0xd3, 0x9e, 0x28,
-  0xfb, 0x43, 0x67, 0x5f, 0x0c, 0xfe, 0x07, 0xed, 0xb4, 0xbf, 0x2f, 0xc3,
-  0x58, 0xca, 0x16, 0x6d, 0xa8, 0x84, 0xb6, 0xd5, 0x36, 0x17, 0xc2, 0xe2,
-  0xb8, 0xef, 0x38, 0x6f, 0xc0, 0x3c, 0xad, 0xfc, 0x4a, 0xed, 0x83, 0x89,
-  0x62, 0x31, 0x15, 0xde, 0x8a, 0x66, 0xfb, 0x0e, 0x93, 0xff, 0x41, 0x9f,
-  0xd2, 0xb7, 0x19, 0xc7, 0x8e, 0xc0, 0xf4, 0xd7, 0xc7, 0xaf, 0xce, 0x2e,
-  0x8e, 0xdb, 0x69, 0x58, 0x0d, 0x57, 0x26, 0x46, 0xe0, 0xb5, 0xdb, 0x3b,
-  0x90, 0x46, 0x29, 0x8d, 0x00, 0xee, 0xc2, 0xbc, 0xc8, 0x09, 0x39, 0x9b,
-  0x9c, 0x7f, 0xff, 0xd2, 0xf6, 0x2e, 0x87, 0x78, 0x7e, 0xe5, 0xd5, 0xd4,
-  0xed, 0xf3, 0x4c, 0x77, 0x35, 0x08, 0xd2, 0x35, 0xa8, 0x70, 0x8b, 0x14,
-  0x82, 0xb5, 0xfd, 0x43, 0xc0, 0x9b, 0x81, 0x0a, 0x9a, 0x84, 0x0c, 0x8a,
-  0xe2, 0xba, 0xa6, 0xa4, 0x62, 0xdb, 0x68, 0xa0, 0x5e, 0xb3, 0x86, 0x01,
-  0x66, 0x1e, 0x09, 0xec, 0xa7, 0x4c, 0xce, 0x44, 0x8c, 0x4d, 0xc3, 0x24,
-  0xfc, 0x90, 0x06, 0xe8, 0xf1, 0x95, 0x18, 0xb2, 0x82, 0x2a, 0x15, 0xb3,
-  0x3f, 0x9a, 0xaf, 0x55, 0xa2, 0xd8, 0xa7, 0x4d, 0x6b, 0x6b, 0xc4, 0xf4,
-  0x99, 0x48, 0x4b, 0x5c, 0xef, 0xfe, 0x44, 0x46, 0xa2, 0x95, 0xe6, 0x9b,
-  0x5b, 0xf5, 0x76, 0xbf, 0xd5, 0x55, 0xfb, 0x9b, 0x44, 0xed, 0xf4, 0xcd,
-  0xbf, 0x6c, 0x3a, 0x8c, 0x3e, 0xd7, 0xba, 0x8a, 0xd7, 0x86, 0x73, 0xb5,
-  0x82, 0xb6, 0xef, 0x43, 0xd3, 0xe8, 0x88, 0x57, 0xd9, 0x68, 0x12, 0x44,
-  0x11, 0x80, 0x05, 0x4a, 0xf6, 0x51, 0xcc, 0x1b, 0xed, 0x73, 0xf9, 0x2b,
-  0xcb, 0x41, 0xa8, 0x4d, 0xf5, 0x63, 0x34, 0x60, 0xe4, 0xf5, 0xa9, 0xda,
-  0x35, 0x71, 0x2d, 0xb9, 0x1d, 0x42, 0x18, 0xca, 0x0e, 0xcd, 0xae, 0x61,
-  0xda, 0xe0, 0xf5, 0x5d, 0xd1, 0xd0, 0x69, 0x85, 0x60, 0x09, 0x26, 0xad,
-  0xc2, 0x85, 0x44, 0x7b, 0xc9, 0xed, 0xde, 0x1a, 0x69, 0xf4, 0xcf, 0x9e,
-  0x3c, 0x23, 0x25, 0x02, 0x90, 0x11, 0x29, 0x9f, 0x23, 0x0c, 0xaa, 0x7d,
-  0x3e, 0xaa, 0x21, 0xbb, 0xa8, 0xa8, 0x1e, 0xb6, 0x25, 0x29, 0x7a, 0x3a,
-  0xce, 0x66, 0x5c, 0xb0, 0x67, 0xe4, 0x35, 0xb2, 0xde, 0xb6, 0x5c, 0x0d,
-  0xc9, 0x1e, 0xb2, 0x7e, 0x62, 0x96, 0x21, 0xfd, 0x20, 0x29, 0xe1, 0x7c,
-  0x18, 0xa2, 0x47, 0xb3, 0xaf, 0x5b, 0xc1, 0xeb, 0x97, 0xe5, 0x9c, 0x37,
-  0x62, 0x3b, 0xab, 0xf2, 0xfa, 0x83, 0x39, 0x78, 0x7f, 0x96, 0xfc, 0xed,
-  0x95, 0x39, 0xc5, 0xe4, 0x9a, 0xcc, 0x8b, 0x25, 0x33, 0xab, 0xda, 0x72,
-  0xda, 0xda, 0xe2, 0x15, 0x1c, 0xe7, 0x44, 0xd6, 0x19, 0xcb, 0x63, 0xaa,
-  0x9b, 0x72, 0x11, 0x54, 0xdf, 0x90, 0x0c, 0x74, 0xd9, 0x09, 0xe1, 0xad,
-  0x49, 0x53, 0x05, 0x5e, 0x5a, 0xf1, 0x13, 0xaa, 0xf2, 0x34, 0x4c, 0xde,
-  0x15, 0xd0, 0x6e, 0x64, 0x6b, 0xca, 0x55, 0x92, 0x17, 0x66, 0x2c, 0x66,
-  0xac, 0x44, 0x64, 0x10, 0x11, 0x54, 0x90, 0x85, 0x6e, 0x6f, 0x25, 0x2a,
-  0x4a, 0x3b, 0x21, 0x2d, 0x1c, 0x6d, 0x4b, 0x23, 0xcc, 0xb2, 0x2d, 0x79,
-  0x15, 0xd6, 0xab, 0xe2, 0x52, 0x3b, 0x52, 0xd7, 0x1d, 0x6d, 0x53, 0xc8,
-  0x32, 0x9b, 0xcd, 0x06, 0xcc, 0x63, 0x4c, 0xbc, 0xae, 0x64, 0x67, 0x70,
-  0x82, 0x28, 0x20, 0x47, 0x7e, 0x02, 0x72, 0x70, 0xfb, 0x20, 0xcf, 0x75,
-  0x88, 0xac, 0x0d, 0xa5, 0x5a, 0x10, 0xa0, 0xb2, 0xc6, 0x41, 0x28, 0x21,
-  0xca, 0xb9, 0x66, 0x30, 0x3b, 0x7f, 0x57, 0xa1, 0x1b, 0x2b, 0x2e, 0x13,
-  0x32, 0x03, 0x4e, 0x6e, 0xae, 0xab, 0x05, 0x57, 0xb9, 0x8a, 0x95, 0xe0,
-  0xf2, 0x0c, 0x00, 0x7e, 0x52, 0xd7, 0xb6, 0xce, 0x1a, 0xee, 0x0a, 0xbf,
-  0x7a, 0xf2, 0xb2, 0x55, 0x2d, 0x97, 0x66, 0x22, 0x56, 0xfc, 0xc5, 0x07,
-  0xd0, 0x71, 0x1c, 0x19, 0x47, 0xd6, 0xdd, 0x2d, 0xb6, 0x35, 0x67, 0xed,
-  0x8c, 0xef, 0xdc, 0x6f, 0xe2, 0xcd, 0x49, 0x1b, 0xac, 0xce, 0x72, 0x0b,
-  0xda, 0x2c, 0xf6, 0x8a, 0xd6, 0x73, 0xa6, 0xdd, 0x40, 0xb5, 0xdb, 0xf5,
-  0x23, 0x21, 0xac, 0xed, 0x66, 0x5e, 0x4e, 0x29, 0x0b, 0x27, 0xbb, 0x77,
-  0x2e, 0xe8, 0x41, 0x9d, 0x0b, 0xc9, 0x5f, 0xaa, 0xfd, 0x71, 0xa1, 0x11,
-  0xb3, 0x4b, 0x69, 0xe7, 0x89, 0x10, 0x8b, 0x37, 0xe7, 0x06, 0xaa, 0x55,
-  0xe7, 0x32, 0x7e, 0xd9, 0x1f, 0x42, 0x91, 0x94, 0x93, 0xc6, 0x1b, 0x01,
-  0x3d, 0x10, 0x6f, 0x8e, 0x85, 0x6f, 0x64, 0x64, 0x94, 0xd2, 0x02, 0xe3,
-  0xf6, 0xbe, 0x91, 0xd1, 0x83, 0xc1, 0x2a, 0x9b, 0x1f, 0xb2, 0x48, 0xef,
-  0x2c, 0x31, 0x2f, 0x4e, 0xbc, 0xb9, 0xf6, 0x02, 0xeb, 0x0a, 0xa3, 0x0f,
-  0xb1, 0x05, 0x16, 0x1a, 0xd9, 0x50, 0x0b, 0x73, 0xa6, 0x3a, 0xcf, 0x8e,
-  0x7d, 0x70, 0xe5, 0x02, 0xcb, 0x37, 0x82, 0x59, 0x98, 0x19, 0x09, 0x69,
-  0xb4, 0xe0, 0x49, 0xf6, 0x1e, 0x7d, 0x6b, 0xd2, 0xea, 0x3a, 0x6b, 0xde,
-  0xaf, 0x9f, 0x90, 0x99, 0x64, 0x92, 0xdf, 0xcd, 0x51, 0x36, 0xd6, 0xca,
-  0x0a, 0x21, 0x78, 0x4c, 0x25, 0xb3, 0xda, 0x28, 0x81, 0x5c, 0x9a, 0xb7,
-  0x59, 0x3d, 0x21, 0xde, 0xf7, 0x98, 0x73, 0x9e, 0xaf, 0xaa, 0x45, 0x99,
-  0x73, 0x41, 0x76, 0x2b, 0x63, 0xbc, 0x3e, 0xc6, 0x78, 0x67, 0xd6, 0x05,
-  0x5a, 0xe6, 0x1f, 0x28, 0x29, 0xc6, 0x2a, 0x0a, 0xef, 0x23, 0xfc, 0xfc,
-  0xde, 0xe0, 0xf8, 0x69, 0x5d, 0x6d, 0x1e, 0x92, 0xd2, 0xd1, 0xbb, 0xf2,
-  0x82, 0xee, 0x38, 0xaf, 0xd9, 0xc7, 0xed, 0x4f, 0xda, 0x33, 0xd9, 0xed,
-  0xdf, 0xe2, 0x76, 0x6a, 0x89, 0x3c, 0x6e, 0xdd, 0x11, 0x52, 0x15, 0x00,
-  0x68, 0x54, 0x2d, 0xe1, 0x49, 0x98, 0x13, 0x6e, 0xec, 0x4a, 0x69, 0x68,
-  0x57, 0x4c, 0x05, 0xd8, 0x69, 0x03, 0x2d, 0x29, 0xf8, 0x78, 0x85, 0x5a,
-  0xa4, 0x32, 0xbf, 0xb2, 0x1c, 0xab, 0x27, 0x47, 0x9e, 0x76, 0x5d, 0x64,
-  0xf9, 0xee, 0x57, 0x1b, 0x77, 0x73, 0xa4, 0xc7, 0x61, 0x8d, 0xc0, 0x93,
-  0xcf, 0x76, 0x45, 0xde, 0x34, 0x23, 0x1f, 0x31, 0xef, 0x05, 0xa0, 0x6c,
-  0xee, 0x3f, 0x59, 0xdc, 0xf3, 0x95, 0x73, 0x5c, 0xcd, 0xef, 0x39, 0xe4,
-  0xe6, 0x01, 0x37, 0x2a, 0xe6, 0x21, 0xb0, 0xa3, 0x0a, 0xce, 0xa5, 0x94,
-  0x2a, 0x5d, 0x31, 0xf3, 0xab, 0x7a, 0xd0, 0xda, 0x85, 0xab, 0x7b, 0x22,
-  0x4f, 0x46, 0xbb, 0xe3, 0x26, 0x97, 0x32, 0x1d, 0xef, 0x5c, 0xcf, 0xe2,
-  0xcd, 0x49, 0x77, 0xdd, 0x5b, 0x32, 0x3d, 0x7d, 0xcf, 0x91, 0xca, 0x74,
-  0xfe, 0xc6, 0xb8, 0x0c, 0xf7, 0x86, 0x1e, 0xf0, 0x5f, 0x24, 0x20, 0xc8,
-  0x8a, 0x9f, 0x15, 0xbe, 0xdd, 0x4e, 0x5f, 0x34, 0x77, 0xef, 0x9a, 0xf4,
-  0x03, 0x8f, 0x0b, 0xdc, 0x2e, 0x37, 0x57, 0x87, 0x44, 0xa8, 0x10, 0x10,
-  0x2a, 0x40, 0x0b, 0x51, 0x0e, 0x46, 0x6c, 0x67, 0x10, 0x66, 0x4d, 0x89,
-  0x68, 0x3f, 0xc4, 0x3a, 0x27, 0xfc, 0xcd, 0x84, 0x91, 0x36, 0x98, 0x56,
-  0xf0, 0x46, 0x88, 0x22, 0xa2, 0xd5, 0x27, 0xeb, 0x4c, 0xac, 0x09, 0x79,
-  0x9c, 0xb9, 0xfb, 0xc3, 0x92, 0x9b, 0x1d, 0xb8, 0x53, 0x3d, 0xf4, 0x9c,
-  0x15, 0xcc, 0x78, 0x9b, 0x5d, 0x4f, 0xfd, 0x02, 0xb6, 0xde, 0xf0, 0xab,
-  0x3e, 0x4f, 0xc1, 0xb5, 0x19, 0x3c, 0xfe, 0x88, 0x02, 0xfb, 0xa1, 0x35,
-  0x43, 0x59, 0xa1, 0xfc, 0xf2, 0xed, 0xe4, 0x22, 0xa3, 0x44, 0xd6, 0x8f,
-  0x24, 0x4c, 0xc7, 0x77, 0x0d, 0x3a, 0x68, 0x1a, 0xd8, 0xca, 0x87, 0xe6,
-  0x3a, 0x64, 0x20, 0x37, 0xa9, 0x48, 0xc4, 0x89, 0x1d, 0xe8, 0x34, 0x66,
-  0x67, 0x6c, 0x2b, 0x40, 0x4a, 0x29, 0x90, 0x76, 0xf6, 0x86, 0x7b, 0x46,
-  0x19, 0x7f, 0xc5, 0x74, 0x43, 0xbe, 0x7a, 0x0d, 0xb8, 0x99, 0xf0, 0xf1,
-  0xd2, 0xa7, 0xbb, 0xde, 0x88, 0x0b, 0xfa, 0x70, 0x1d, 0xba, 0xa8, 0xe1,
-  0xe7, 0x76, 0x66, 0xcd, 0x6d, 0x7a, 0x17, 0x2a, 0xea, 0xbb, 0x83, 0xc7,
-  0xcf, 0x9e, 0xb5, 0x6e, 0xf4, 0xda, 0xe3, 0x33, 0x7e, 0xb2, 0xbb, 0x8b,
-  0xb1, 0x05, 0x79, 0xac, 0xe6, 0x17, 0x83, 0x67, 0x78, 0xb1, 0xfd, 0x5a,
-  0x9d, 0x99, 0x25, 0x98, 0xae, 0x7e, 0x6f, 0x40, 0xbf, 0x89, 0x7c, 0x0e,
-  0x5e, 0x97, 0x95, 0x6f, 0x3d, 0xa3, 0xcf, 0x45, 0xde, 0xc2, 0xc3, 0x3c,
-  0x8d, 0xe5, 0xd5, 0x15, 0xb9, 0xbb, 0xe8, 0x49, 0xe5, 0x25, 0xb9, 0x4d,
-  0xab, 0x69, 0x38, 0xdc, 0xdd, 0xfe, 0x60, 0x6f, 0xd5, 0x70, 0xc1, 0xc6,
-  0x0c, 0xc0, 0x12, 0xad, 0x27, 0x59, 0x93, 0xc6, 0x96, 0xe0, 0xa4, 0x8e,
-  0x6e, 0x43, 0x7b, 0xa6, 0x47, 0x7b, 0xcf, 0x9e, 0xf5, 0xa9, 0x67, 0x4f,
-  0x9e, 0x3d, 0x5b, 0x99, 0xc4, 0xeb, 0x7d, 0xe6, 0xb6, 0x74, 0x4e, 0x2a,
-  0x7a, 0xdd, 0x6d, 0x9a, 0x9a, 0x4c, 0x96, 0xf8, 0x77, 0xe8, 0x37, 0x2f,
-  0x92, 0xb7, 0x67, 0x97, 0xc7, 0x9e, 0xfb, 0x06, 0xc7, 0x8b, 0xc3, 0x97,
-  0x9e, 0x3d, 0x8a, 0x78, 0xf0, 0x02, 0xe5, 0x74, 0x60, 0x1a, 0x93, 0xad,
-  0x15, 0xa2, 0x1c, 0x90, 0x60, 0xa0, 0x7e, 0xc3, 0x3f, 0x74, 0x3f, 0x77,
-  0x86, 0xb2, 0x98, 0xd3, 0xfc, 0x3a, 0x6f, 0x7c, 0xd2, 0x9a, 0x2d, 0xb3,
-  0xda, 0xdb, 0xf0, 0x84, 0x30, 0x30, 0x49, 0x42, 0x3b, 0x9b, 0x35, 0x01,
-  0xf2, 0x19, 0xbb, 0xb8, 0x49, 0x86, 0xd1, 0x66, 0x00, 0x89, 0xcf, 0x66,
-  0xd3, 0x5a, 0x2f, 0x42, 0x7e, 0x7c, 0x80, 0x07, 0xe5, 0xb4, 0xc0, 0x9e,
-  0xe5, 0xaa, 0xbd, 0x29, 0x9c, 0xcb, 0xfc, 0xe9, 0xd5, 0xc1, 0x1d, 0x92,
-  0x84, 0x8c, 0xc4, 0xd5, 0x64, 0x1a, 0x6a, 0xc7, 0x07, 0x37, 0x6e, 0xd6,
-  0xce, 0x2d, 0x6a, 0x7d, 0x78, 0x45, 0x1c, 0xf0, 0x80, 0x88, 0xc2, 0x34,
-  0x5b, 0x28, 0x08, 0xb0, 0x68, 0xb7, 0x63, 0xf6, 0xf2, 0x55, 0x7e, 0xbd,
-  0xac, 0xe2, 0x70, 0xb9, 0xbf, 0xba, 0xd4, 0x0e, 0x65, 0xee, 0x4e, 0x6f,
-  0x53, 0x4d, 0x29, 0x01, 0xd9, 0xba, 0x9e, 0x6b, 0xb5, 0x93, 0x35, 0x85,
-  0x03, 0xbc, 0xea, 0x81, 0x5f, 0x8c, 0x4c, 0xe6, 0x2b, 0xa3, 0xcb, 0xc0,
-  0x99, 0x20, 0x00, 0x13, 0x78, 0xff, 0xa4, 0xc4, 0x96, 0xa4, 0xd2, 0xa8,
-  0xab, 0xdd, 0xac, 0x37, 0x5d, 0xa7, 0xa9, 0x4c, 0x41, 0x08, 0x52, 0xdb,
-  0x9c, 0xb9, 0x40, 0x02, 0x3d, 0x09, 0x9f, 0xcc, 0x4d, 0xe9, 0x11, 0xf5,
-  0x87, 0x89, 0xf6, 0x42, 0x15, 0x02, 0xe9, 0xc3, 0x4b, 0x34, 0x35, 0x4a,
-  0xf4, 0xac, 0x4c, 0xa7, 0xe2, 0x5e, 0x71, 0xa1, 0x7d, 0xd6, 0x0e, 0x84,
-  0x6f, 0x49, 0xd6, 0x36, 0xe0, 0x75, 0xa6, 0xa5, 0x96, 0x55, 0x26, 0x72,
-  0x64, 0x29, 0x7e, 0xad, 0x9b, 0xb4, 0x2c, 0xac, 0x96, 0xc4, 0x72, 0xca,
-  0x7c, 0x84, 0x79, 0x0d, 0xb6, 0x87, 0x11, 0x37, 0x00, 0x6d, 0x78, 0x5e,
-  0x2d, 0x4b, 0x37, 0x8f, 0xd2, 0x75, 0x74, 0x49, 0x7a, 0x5e, 0x8f, 0x64,
-  0x74, 0xf2, 0x3f, 0x8f, 0x7f, 0xcf, 0x10, 0x58, 0x95, 0xde, 0xda, 0x64,
-  0xaf, 0xef, 0x99, 0xb0, 0x4f, 0x42, 0x53, 0x96, 0x5d, 0x20, 0x9d, 0x89,
-  0x19, 0x4f, 0xa5, 0xbe, 0x71, 0x7b, 0x20, 0xc8, 0x29, 0x95, 0x29, 0xcd,
-  0xc6, 0x0a, 0xf7, 0x36, 0xe5, 0xaa, 0xf8, 0xc4, 0x4d, 0x5c, 0x02, 0x66,
-  0x8a, 0x44, 0x1d, 0x06, 0x16, 0xe9, 0x62, 0xda, 0x42, 0xe3, 0x73, 0x38,
-  0x86, 0xc1, 0xa9, 0x13, 0x14, 0x9d, 0x03, 0x29, 0x1c, 0x75, 0xcb, 0xf4,
-  0xf6, 0x9e, 0xd2, 0x60, 0x7e, 0x7e, 0x34, 0xaa, 0xc9, 0x56, 0x19, 0xc5,
-  0xcb, 0xaa, 0xe4, 0xf9, 0xbb, 0x8b, 0xd3, 0x15, 0x49, 0x6e, 0x23, 0xac,
-  0x02, 0x4d, 0x57, 0xef, 0x22, 0x03, 0x9b, 0x53, 0x95, 0x9c, 0xa7, 0xd7,
-  0x59, 0xcf, 0x27, 0xd0, 0x52, 0x65, 0x11, 0x13, 0x20, 0x3e, 0x88, 0x98,
-  0xa7, 0xc8, 0x67, 0xbf, 0x27, 0x31, 0xee, 0xa2, 0xd4, 0x7e, 0x66, 0xda,
-  0xd5, 0x2c, 0x95, 0xd9, 0x5b, 0x56, 0xa8, 0x71, 0xff, 0x7d, 0xb4, 0x82,
-  0x8c, 0xf8, 0x84, 0xda, 0xbc, 0x87, 0x0e, 0x50, 0x45, 0x01, 0x22, 0x14,
-  0x39, 0xee, 0x7d, 0x41, 0x6e, 0xfa, 0x9e, 0xc7, 0xf5, 0x37, 0xc8, 0x62,
-  0x74, 0xf0, 0x3c, 0x15, 0xcc, 0xd2, 0x66, 0xdd, 0x4a, 0xec, 0xf2, 0x6f,
-  0xb9, 0xf9, 0xeb, 0x4c, 0x83, 0x44, 0x19, 0x31, 0x92, 0xd6, 0x91, 0xda,
-  0xc9, 0x0a, 0x14, 0x65, 0x12, 0x4a, 0xb2, 0x01, 0x4f, 0xa5, 0x7f, 0x07,
-  0x12, 0x91, 0x61, 0x45, 0xc8, 0x76, 0x4d, 0xc2, 0xe6, 0xdc, 0xf1, 0x71,
-  0x16, 0x1b, 0x6c, 0x3a, 0xa3, 0xba, 0x14, 0xd6, 0x93, 0x45, 0xe3, 0x9c,
-  0x96, 0x54, 0xca, 0x00, 0xe5, 0x8f, 0x0b, 0xeb, 0x74, 0x6e, 0xad, 0xec,
-  0xef, 0x4e, 0xf6, 0xe6, 0x02, 0x45, 0x87, 0x7d, 0x29, 0xb6, 0x32, 0x30,
-  0xbb, 0xa3, 0x90, 0xfc, 0x65, 0x6f, 0x59, 0xbd, 0xbd, 0xf7, 0x1f, 0xfd,
-  0x28, 0xff, 0xfe, 0x0a, 0xce, 0x50, 0xaf, 0xbb, 0x0d, 0x32, 0x0b, 0xb0,
-  0x61, 0xce, 0xfa, 0x9d, 0x0a, 0x00, 0x2e, 0xcd, 0x51, 0xee, 0xcb, 0xa8,
-  0x6f, 0x71, 0xe0, 0xc5, 0xa9, 0x93, 0x23, 0xce, 0xb8, 0x1b, 0xbc, 0xcc,
-  0xcd, 0x3d, 0x52, 0x33, 0x75, 0x0c, 0x3b, 0x06, 0x38, 0x65, 0xcc, 0x1e,
-  0xc4, 0x24, 0xac, 0xf1, 0xa4, 0xf1, 0x14, 0x20, 0xe9, 0xec, 0x2b, 0x36,
-  0xba, 0x63, 0xf6, 0xc4, 0x6a, 0x02, 0x43, 0xcb, 0x78, 0x6e, 0x95, 0x86,
-  0xd4, 0x79, 0x2d, 0xa4, 0x20, 0x33, 0x13, 0xc3, 0xf3, 0xf9, 0x30, 0xb7,
-  0x42, 0x64, 0x7e, 0x94, 0xd0, 0x05, 0x30, 0x1e, 0xc7, 0xb3, 0x22, 0xc5,
-  0x50, 0x02, 0x73, 0xd3, 0x16, 0xa2, 0xe5, 0x9b, 0x29, 0xd8, 0x64, 0x04,
-  0x94, 0xb1, 0x15, 0x29, 0x38, 0xc6, 0xc2, 0x34, 0x64, 0x9c, 0x52, 0x38,
-  0x31, 0x0d, 0x0f, 0x3b, 0x9e, 0x71, 0x2d, 0xa6, 0xb1, 0x02, 0x65, 0xd8,
-  0x1a, 0x15, 0xe0, 0x8e, 0xfe, 0xd6, 0xa3, 0x28, 0x42, 0x51, 0x0a, 0x33,
-  0x47, 0x2c, 0xa6, 0x0f, 0x40, 0x91, 0x79, 0xc2, 0xbb, 0x07, 0x19, 0x40,
-  0x92, 0xfc, 0x69, 0xe0, 0xca, 0x19, 0x6c, 0xdd, 0x65, 0x46, 0xc7, 0xb6,
-  0x45, 0x0c, 0xd4, 0x98, 0x8a, 0xe4, 0xec, 0x25, 0x5c, 0xa6, 0xaf, 0x6e,
-  0xa5, 0x13, 0xc0, 0x0c, 0xf1, 0x62, 0x90, 0x3c, 0xe5, 0x46, 0x13, 0x20,
-  0xc8, 0xf8, 0xb2, 0xc8, 0x3e, 0x11, 0x0f, 0xf2, 0xea, 0xe6, 0x42, 0x45,
-  0xfb, 0xfb, 0xc3, 0x8b, 0xb7, 0x27, 0x6f, 0xbf, 0x39, 0x48, 0x8e, 0x3f,
-  0x65, 0xd5, 0x84, 0x4a, 0xca, 0xfe, 0x6d, 0x39, 0xcd, 0x27, 0x10, 0x14,
-  0x52, 0xa8, 0xd3, 0x4f, 0xac, 0xa4, 0xea, 0xea, 0xe2, 0x65, 0xa5, 0x4b,
-  0x37, 0x90, 0xef, 0x02, 0x46, 0xa5, 0x84, 0x7f, 0x63, 0x49, 0x95, 0xd7,
-  0x4b, 0x6f, 0xfb, 0x4c, 0xb8, 0x80, 0x18, 0x02, 0x06, 0x88, 0xa6, 0xde,
-  0xc8, 0x5c, 0x93, 0xeb, 0x35, 0x79, 0x79, 0x7a, 0x1a, 0xd2, 0x99, 0xa2,
-  0xd0, 0x2d, 0x77, 0x9f, 0x13, 0x34, 0xd1, 0x84, 0xd9, 0xfc, 0x75, 0x3e,
-  0x66, 0xd8, 0x13, 0xa9, 0x00, 0x5c, 0x3e, 0xcc, 0x13, 0x79, 0xf0, 0xad,
-  0x98, 0xae, 0x74, 0x17, 0x19, 0x38, 0x59, 0xa0, 0x15, 0xb1, 0xc2, 0x79,
-  0x35, 0x85, 0x3d, 0x64, 0x64, 0x64, 0x79, 0xd5, 0x90, 0x8e, 0xd4, 0xba,
-  0x4d, 0xdb, 0xa5, 0x39, 0xd6, 0x46, 0x12, 0x6e, 0xd8, 0xd4, 0xf1, 0x31,
-  0x11, 0x12, 0xbc, 0x04, 0x9b, 0x9f, 0xd9, 0x90, 0xac, 0x1c, 0xa2, 0xa6,
-  0x4b, 0x2c, 0x8c, 0x36, 0xcd, 0x52, 0x5b, 0xa8, 0xb6, 0x26, 0x79, 0x19,
-  0x0a, 0x8c, 0xdb, 0xac, 0x12, 0xf3, 0xd3, 0xa6, 0x7e, 0x1a, 0x71, 0x37,
-  0x4c, 0x46, 0xa5, 0x79, 0x3e, 0xd4, 0xb2, 0x6c, 0xf1, 0xb3, 0x56, 0x1d,
-  0x65, 0x74, 0xc7, 0x01, 0xbd, 0x50, 0x18, 0x06, 0xd1, 0xb9, 0xf6, 0x78,
-  0x23, 0x85, 0x57, 0x69, 0xff, 0x8f, 0x33, 0xab, 0x54, 0xdc, 0x69, 0xfc,
-  0x87, 0x36, 0x49, 0x6f, 0x60, 0x04, 0x6a, 0x8f, 0x66, 0x16, 0xe5, 0x60,
-  0xbd, 0x96, 0xee, 0x29, 0x6a, 0xe8, 0xc3, 0xac, 0xbb, 0x03, 0xbe, 0xa7,
-  0x56, 0x94, 0x5a, 0x9e, 0x9e, 0xfb, 0x54, 0x2a, 0xf6, 0xd8, 0x98, 0x2a,
-  0xcb, 0xa4, 0x0c, 0xb5, 0x5d, 0x83, 0x50, 0x39, 0x9b, 0x14, 0xd6, 0x25,
-  0xe3, 0x27, 0x38, 0xfb, 0xaf, 0xcb, 0x8d, 0xd3, 0x77, 0x1e, 0x06, 0xd2,
-  0x0b, 0x82, 0x24, 0x5b, 0x63, 0xe7, 0x0d, 0xb7, 0x63, 0x40, 0x1f, 0x91,
-  0x8b, 0x42, 0x65, 0x69, 0xd4, 0xeb, 0xe9, 0xbd, 0x92, 0x0f, 0x62, 0x2b,
-  0x52, 0xf4, 0x88, 0x53, 0xd5, 0x3d, 0xaf, 0x38, 0x37, 0x07, 0x61, 0x92,
-  0x5a, 0x30, 0x51, 0xe3, 0xc7, 0x35, 0x5d, 0x3e, 0x79, 0xd8, 0x9c, 0x97,
-  0xa2, 0xb3, 0x5a, 0x08, 0x4b, 0xec, 0x26, 0x2f, 0x3e, 0x96, 0x1f, 0xf8,
-  0xc6, 0x97, 0xea, 0xe3, 0x01, 0xe5, 0x81, 0x4f, 0x1e, 0x18, 0x45, 0xad,
-  0xc9, 0xac, 0x4a, 0xdf, 0xf9, 0xc6, 0xf2, 0x80, 0xf0, 0x66, 0x30, 0x12,
-  0x92, 0xb1, 0x89, 0x5b, 0xf6, 0x7a, 0xea, 0x34, 0x67, 0xcf, 0x52, 0x5f,
-  0x2b, 0xfb, 0x26, 0xd9, 0xac, 0xce, 0xfa, 0x5e, 0x0e, 0x97, 0x5e, 0x36,
-  0x7a, 0xdb, 0x00, 0x8d, 0xaa, 0x51, 0xcc, 0xd5, 0x37, 0xc9, 0x30, 0xd1,
-  0xb9, 0xf7, 0xa7, 0xdb, 0x19, 0xb2, 0x88, 0x80, 0x72, 0xec, 0x69, 0x72,
-  0x53, 0x96, 0xd1, 0x8b, 0xdb, 0xdd, 0x21, 0x50, 0x6a, 0x40, 0x64, 0xb0,
-  0x42, 0x83, 0x68, 0xd7, 0x8c, 0x93, 0x6c, 0x85, 0xee, 0xd9, 0x53, 0x92,
-  0x38, 0xd1, 0x07, 0x3d, 0x8a, 0xc6, 0xf6, 0xed, 0xc6, 0x1d, 0x0a, 0xee,
-  0xe6, 0x18, 0xcc, 0x81, 0x7f, 0xd7, 0xb9, 0x8f, 0x9b, 0x56, 0xce, 0xbb,
-  0x3f, 0x29, 0xd1, 0xcb, 0x8e, 0x11, 0x71, 0x0e, 0x27, 0x89, 0x7d, 0x03,
-  0xc3, 0xa9, 0x68, 0x87, 0x35, 0xd0, 0xcf, 0xbc, 0x81, 0x00, 0xf9, 0xd3,
-  0xfe, 0xee, 0x2a, 0x21, 0xcf, 0x8a, 0xac, 0xe6, 0x26, 0xd2, 0x71, 0xb4,
-  0x06, 0x3a, 0x5f, 0x84, 0x8e, 0x2f, 0x80, 0x2e, 0x90, 0xe5, 0x22, 0x41,
-  0x3d, 0x21, 0xaa, 0x46, 0xb5, 0x62, 0xfe, 0xa3, 0x96, 0xf1, 0xaf, 0xad,
-  0x41, 0xb6, 0xaa, 0x08, 0x99, 0x93, 0x5f, 0x17, 0xde, 0x1a, 0x53, 0x4b,
-  0xd1, 0xa4, 0x48, 0x96, 0x25, 0x9e, 0xbb, 0xc4, 0xd3, 0xda, 0x9d, 0xde,
-  0x00, 0xeb, 0x1e, 0xc2, 0x8e, 0xd1, 0x08, 0x79, 0x28, 0x92, 0x8d, 0x5d,
-  0x3b, 0x5f, 0x44, 0x04, 0x96, 0x3d, 0x04, 0x82, 0xf9, 0xa5, 0x5b, 0xca,
-  0xc2, 0x76, 0x35, 0xf6, 0x1c, 0x6e, 0x5a, 0x4f, 0x96, 0xb2, 0x49, 0x9e,
-  0x0a, 0x80, 0x14, 0x73, 0x42, 0xdf, 0x6a, 0x5f, 0x8d, 0xc0, 0xa6, 0x0d,
-  0xa2, 0x3e, 0x7f, 0x65, 0x1b, 0x09, 0x69, 0xab, 0x60, 0x4d, 0x39, 0x4a,
-  0xf0, 0x1e, 0xbf, 0xde, 0x4b, 0xb6, 0x48, 0xae, 0x6e, 0xab, 0xf6, 0x1a,
-  0xc6, 0xfb, 0x5d, 0x81, 0x6f, 0x08, 0xe0, 0xb4, 0x0e, 0xc0, 0xbc, 0xd0,
-  0x5f, 0x13, 0x63, 0xe8, 0x55, 0x46, 0x05, 0x58, 0xce, 0xd2, 0x8a, 0x64,
-  0xbb, 0xf9, 0xe4, 0xd5, 0x72, 0x16, 0x33, 0x75, 0x70, 0xb6, 0x35, 0x46,
-  0x64, 0xa6, 0xa8, 0x5e, 0x2a, 0xa3, 0xba, 0x63, 0x08, 0x11, 0xba, 0xb8,
-  0x99, 0xe9, 0x11, 0x68, 0xd1, 0x67, 0x5c, 0x39, 0x2a, 0xba, 0x77, 0xe1,
-  0x20, 0xc6, 0x9c, 0xa9, 0x8a, 0xc9, 0x96, 0x14, 0xf7, 0xad, 0xca, 0xae,
-  0xa9, 0x4b, 0xae, 0x3a, 0x15, 0x4d, 0x01, 0xd5, 0x49, 0x36, 0xd7, 0x55,
-  0xa7, 0xb9, 0xde, 0xd9, 0xf9, 0xe5, 0xc9, 0xd9, 0xdb, 0x51, 0xf2, 0xe7,
-  0xde, 0xda, 0x04, 0xa5, 0x36, 0xb9, 0xec, 0x0f, 0x7d, 0xb7, 0x26, 0xc9,
-  0x73, 0xf1, 0x36, 0xac, 0xb2, 0x8f, 0x3d, 0x1d, 0x7e, 0x62, 0xee, 0x6f,
-  0x23, 0x60, 0xf5, 0x4d, 0x61, 0xe5, 0x92, 0xc5, 0xea, 0x64, 0xa0, 0x07,
-  0xfa, 0xb2, 0x9f, 0xae, 0xef, 0xdb, 0xd1, 0x2c, 0xed, 0x9d, 0xd9, 0xd2,
-  0x69, 0x7d, 0x85, 0x0c, 0x66, 0x0e, 0x09, 0x6b, 0xbf, 0x58, 0xa0, 0x8a,
-  0xbc, 0x85, 0x69, 0xbe, 0x25, 0xed, 0x14, 0x0f, 0x6e, 0x49, 0x8d, 0x6f,
-  0x56, 0xb5, 0xea, 0x10, 0x4d, 0xf8, 0xcd, 0xf1, 0xe5, 0xb6, 0xa4, 0x27,
-  0xda, 0xfe, 0xc1, 0xdf, 0x25, 0x8a, 0x4f, 0x6a, 0x75, 0x33, 0x4d, 0x48,
-  0x64, 0x4f, 0x86, 0xd1, 0x9f, 0x67, 0x69, 0x11, 0x4d, 0xc2, 0x22, 0x9d,
-  0x96, 0x0a, 0x8f, 0x23, 0xdd, 0x55, 0x64, 0xb2, 0xfa, 0x50, 0xbc, 0x2a,
-  0x22, 0xcc, 0xa8, 0x73, 0xfe, 0xee, 0x12, 0x0d, 0xbe, 0x3c, 0x3e, 0x3d,
-  0xbe, 0x3c, 0xee, 0x5a, 0xef, 0x63, 0xa6, 0x21, 0x44, 0xf6, 0x4d, 0x93,
-  0x4d, 0x6e, 0x8a, 0x72, 0x56, 0x5e, 0xe7, 0x52, 0x7b, 0x31, 0xf9, 0x3e,
-  0x1b, 0xbf, 0x3c, 0xfc, 0x8e, 0x34, 0x0a, 0xf2, 0x3b, 0x9d, 0x5f, 0x9c,
-  0x9d, 0xbf, 0x3a, 0x79, 0xfb, 0xb2, 0x9f, 0x1c, 0x9d, 0x9d, 0xff, 0xb5,
-  0x9f, 0xbc, 0x39, 0xfb, 0xee, 0x38, 0x82, 0xba, 0x26, 0x8a, 0xf0, 0x48,
-  0xe9, 0x77, 0xa9, 0x80, 0xc6, 0x17, 0x1a, 0x9b, 0xdf, 0xa8, 0xb8, 0xdc,
-  0xb9, 0x48, 0x28, 0x2d, 0xa1, 0x2e, 0x45, 0xe2, 0x9a, 0xb9, 0xeb, 0x27,
-  0xaf, 0x8f, 0x0f, 0x5f, 0xf6, 0x03, 0x12, 0xe7, 0x11, 0x8f, 0x8a, 0x46,
-  0x67, 0x87, 0x0c, 0xea, 0x5f, 0xb6, 0x3f, 0xa0, 0x25, 0x70, 0xa8, 0x8b,
-  0x8f, 0xac, 0xd9, 0xb0, 0x48, 0xae, 0x9e, 0xae, 0x42, 0x50, 0x08, 0x1b,
-  0xf9, 0xca, 0x6a, 0xa7, 0xad, 0x4c, 0x10, 0x28, 0x6c, 0xaa, 0x6a, 0x4b,
-  0x75, 0x6a, 0xa6, 0xda, 0x49, 0x80, 0xf7, 0xb7, 0xe9, 0x7e, 0xba, 0xe4,
-  0x71, 0xae, 0x97, 0x7e, 0x2b, 0xc7, 0x1b, 0x02, 0x89, 0x5d, 0x90, 0xa9,
-  0x94, 0x8a, 0x43, 0xed, 0x16, 0x02, 0x01, 0x8d, 0x98, 0xea, 0x58, 0x29,
-  0x3e, 0xc3, 0xf4, 0x86, 0x96, 0xa2, 0x50, 0x2a, 0xa9, 0xb4, 0xd0, 0xee,
-  0xd0, 0x14, 0xba, 0x6f, 0x4a, 0xed, 0x8c, 0x1f, 0xf8, 0xc7, 0x11, 0xdc,
-  0x35, 0x57, 0x6f, 0xba, 0x32, 0x9b, 0x33, 0x63, 0x74, 0x15, 0xd6, 0xc9,
-  0xb9, 0x07, 0x92, 0xc1, 0x89, 0x3a, 0x27, 0xd6, 0xa9, 0x59, 0x72, 0x60,
-  0xc4, 0x41, 0x03, 0x9a, 0x1f, 0x75, 0x5c, 0xb5, 0xe5, 0x84, 0xab, 0x57,
-  0xca, 0x67, 0xef, 0x2a, 0x90, 0x6d, 0xe0, 0x07, 0xd6, 0x75, 0xee, 0x0b,
-  0x49, 0x81, 0x4d, 0xeb, 0xb8, 0x72, 0xdc, 0xa7, 0x8c, 0xd6, 0x6d, 0xfb,
-  0xb5, 0xcc, 0x3d, 0x1b, 0x10, 0x33, 0xd1, 0x63, 0x46, 0x9a, 0x14, 0xe2,
-  0x1a, 0xa5, 0x10, 0xdc, 0x80, 0xed, 0x69, 0x1f, 0x21, 0xac, 0x22, 0x54,
-  0x15, 0x54, 0xed, 0x42, 0xbc, 0x42, 0x77, 0xab, 0xc2, 0xad, 0x3d, 0xeb,
-  0x8f, 0x76, 0x3f, 0x39, 0x6f, 0x3b, 0x69, 0x14, 0x75, 0x32, 0x10, 0x46,
-  0xe5, 0xb9, 0xb9, 0x0a, 0x43, 0x3f, 0xd3, 0xd6, 0xab, 0x15, 0xc2, 0xd1,
-  0xf7, 0xdf, 0xda, 0x5c, 0x6c, 0x8b, 0x0e, 0x3f, 0x3d, 0x31, 0x47, 0x22,
-  0x42, 0x6b, 0x32, 0x2d, 0x51, 0xc7, 0x15, 0x90, 0x83, 0x5c, 0xaf, 0x13,
-  0x6a, 0x2b, 0xfc, 0x30, 0x15, 0x36, 0x8e, 0x7e, 0x19, 0x15, 0x8f, 0xef,
-  0xf9, 0x74, 0xb0, 0x66, 0x17, 0xc7, 0x97, 0x17, 0xc3, 0x64, 0xcb, 0x67,
-  0xec, 0x7c, 0x3a, 0xdc, 0x0d, 0xc3, 0x37, 0x54, 0x53, 0x79, 0x3b, 0xf1,
-  0x3e, 0xeb, 0xbe, 0x8b, 0x72, 0xcb, 0xeb, 0xbf, 0x1b, 0xe2, 0x8e, 0x3d,
-  0x96, 0x9e, 0xdd, 0xd8, 0xf7, 0xfc, 0xca, 0xcd, 0xad, 0x51, 0xd2, 0x2f,
-  0xd6, 0x7c, 0xed, 0xf5, 0xf1, 0xe9, 0x79, 0x38, 0xca, 0xef, 0x2e, 0x5e,
-  0xfd, 0xb5, 0x3d, 0xca, 0x47, 0x8f, 0x23, 0x5f, 0xfd, 0x2d, 0x5d, 0xeb,
-  0x59, 0x5d, 0xce, 0x8c, 0xce, 0x82, 0xe4, 0x12, 0xe4, 0x96, 0x1c, 0x98,
-  0x4b, 0x80, 0xb0, 0xe9, 0x3f, 0xf6, 0xe5, 0x2f, 0x3f, 0x0f, 0x87, 0xc3,
-  0x2f, 0x43, 0xda, 0x69, 0x78, 0x6a, 0x28, 0xec, 0x25, 0x03, 0x4e, 0xe4,
-  0x71, 0xc1, 0x65, 0x7a, 0xc6, 0x38, 0x12, 0x7a, 0x90, 0xc1, 0x44, 0x71,
-  0x8c, 0x45, 0x9a, 0x07, 0x4e, 0xe9, 0x77, 0x16, 0x6c, 0xed, 0x32, 0xd0,
-  0x20, 0x74, 0xc4, 0x88, 0x9b, 0xd9, 0xe3, 0xba, 0x45, 0x95, 0x1d, 0x39,
-  0x8f, 0x30, 0x59, 0x19, 0xea, 0xb7, 0x3d, 0xc1, 0xdd, 0x47, 0xfe, 0x61,
-  0x10, 0x5d, 0x11, 0x40, 0xc9, 0xde, 0xb7, 0x85, 0xde, 0x21, 0x32, 0x03,
-  0x53, 0xfb, 0x56, 0x70, 0xe9, 0xda, 0x0c, 0xce, 0x23, 0x09, 0xaf, 0xc3,
-  0x10, 0xc3, 0xc5, 0x82, 0x2a, 0x9e, 0x59, 0x33, 0xd9, 0xa1, 0x31, 0xd6,
-  0x61, 0x65, 0x98, 0x98, 0x0f, 0xcc, 0xf2, 0xf1, 0xfb, 0x05, 0x69, 0xd9,
-  0x0f, 0xed, 0x27, 0xe6, 0xb8, 0x7a, 0x35, 0x9e, 0xd6, 0x4e, 0xfd, 0x88,
-  0xc4, 0xe2, 0xfd, 0xf2, 0x30, 0x2e, 0xa9, 0x05, 0xec, 0x57, 0x65, 0xdd,
-  0xb4, 0x16, 0x1f, 0x2f, 0x90, 0x39, 0xd8, 0x24, 0x9c, 0x44, 0x17, 0xf1,
-  0xb0, 0xb0, 0x88, 0xd6, 0xed, 0x64, 0x09, 0xa4, 0xdb, 0xb5, 0xe7, 0xd5,
-  0x59, 0xa7, 0xd3, 0x26, 0xfd, 0xe8, 0xaa, 0xf3, 0xa4, 0x6b, 0xa3, 0x13,
-  0x4c, 0x06, 0xad, 0xb6, 0x3c, 0x8d, 0xb4, 0x5e, 0x51, 0xb8, 0x47, 0x54,
-  0x60, 0x6d, 0x98, 0xe4, 0x7c, 0x9b, 0xc4, 0xbf, 0x3d, 0x20, 0xf5, 0xc4,
-  0x0f, 0x1e, 0x87, 0xd1, 0x84, 0x7c, 0xf1, 0xf1, 0x31, 0xdc, 0x37, 0x4f,
-  0xfb, 0xfc, 0xaf, 0xa7, 0x2e, 0x51, 0xc3, 0x33, 0x51, 0x58, 0x89, 0x67,
-  0x9d, 0xf7, 0xe4, 0x5c, 0x53, 0x4e, 0x03, 0xea, 0x79, 0x89, 0xc4, 0x49,
-  0x7a, 0xbb, 0xe9, 0xa5, 0xaa, 0xef, 0xe6, 0x1d, 0xed, 0x2d, 0x09, 0x44,
-  0x73, 0x72, 0x7f, 0x1c, 0x57, 0x54, 0xbe, 0xb0, 0xa9, 0x7f, 0x5e, 0x97,
-  0xe0, 0x6b, 0x34, 0xde, 0xcf, 0x86, 0x61, 0x22, 0x55, 0xfc, 0x43, 0x16,
-  0xca, 0xeb, 0xbe, 0x46, 0xf4, 0x36, 0x20, 0xc2, 0x23, 0xe0, 0xcb, 0x2d,
-  0x4a, 0xb2, 0xac, 0xfc, 0xd0, 0xb3, 0xe1, 0x7d, 0x29, 0xa9, 0x12, 0xf4,
-  0x90, 0x8b, 0xd3, 0xb3, 0x1c, 0xc9, 0x2b, 0x35, 0x95, 0x9f, 0x60, 0x2d,
-  0x05, 0xe2, 0x54, 0x06, 0x8a, 0x08, 0x8e, 0xd2, 0x5a, 0xba, 0x7c, 0x22,
-  0xe9, 0x68, 0xc9, 0x1f, 0xd3, 0x75, 0xa4, 0xc1, 0x54, 0xc6, 0xa8, 0x09,
-  0x77, 0xf7, 0x49, 0x9b, 0x4d, 0xde, 0x9e, 0x61, 0x0a, 0xe9, 0xf1, 0x8f,
-  0x8d, 0xc8, 0x50, 0xd8, 0x4b, 0x72, 0x4c, 0x89, 0x3a, 0x17, 0xc7, 0xaf,
-  0xde, 0x8d, 0x8e, 0x5f, 0x72, 0x85, 0x9a, 0x58, 0x2d, 0x94, 0x1c, 0xa1,
-  0x3f, 0x76, 0xaa, 0x9b, 0x46, 0x4b, 0x3e, 0x43, 0xd2, 0x97, 0xa0, 0x62,
-  0x98, 0x00, 0x63, 0x8c, 0x41, 0x17, 0xe6, 0x56, 0xb0, 0xfa, 0x21, 0x2f,
-  0xfe, 0x02, 0xc6, 0x07, 0x1e, 0xf5, 0x34, 0xa3, 0xd2, 0x3a, 0xcf, 0x19,
-  0xc3, 0x11, 0x90, 0x38, 0xb9, 0x22, 0x3c, 0xf5, 0x2c, 0xcb, 0x16, 0x92,
-  0x41, 0x37, 0x2f, 0x97, 0x05, 0xfb, 0xf3, 0xcc, 0xca, 0xa8, 0x17, 0x8b,
-  0x9d, 0xa6, 0x09, 0x5a, 0x55, 0x4b, 0x30, 0x5d, 0x51, 0x05, 0x06, 0x74,
-  0x4e, 0x09, 0xa0, 0xd3, 0x8e, 0x62, 0x30, 0x8d, 0xcc, 0xcc, 0x56, 0xde,
-  0xf8, 0xfe, 0xdf, 0x15, 0x65, 0xa2, 0xa8, 0x30, 0x8d, 0xd1, 0xe8, 0xb9,
-  0x3b, 0xe9, 0xec, 0xba, 0xac, 0x4c, 0x83, 0x73, 0x9b, 0xf6, 0x57, 0x01,
-  0xb3, 0x53, 0x6f, 0xb7, 0x67, 0x35, 0x4c, 0x9f, 0x66, 0x1d, 0x18, 0x01,
-  0xdc, 0x8c, 0x73, 0xa1, 0xe9, 0x40, 0xf3, 0x3c, 0x01, 0xbc, 0x49, 0xa1,
-  0x2d, 0x16, 0xc2, 0x23, 0xc9, 0x60, 0xc6, 0x7c, 0xf0, 0x14, 0x06, 0x1b,
-  0xf1, 0x1f, 0x59, 0x55, 0x76, 0xdd, 0x10, 0xaa, 0x6e, 0xc6, 0x7a, 0xfe,
-  0xaf, 0xac, 0xc5, 0xb4, 0xb7, 0x1f, 0x3b, 0x01, 0xf3, 0xf4, 0x13, 0x9c,
-  0x2b, 0x2b, 0xb7, 0x03, 0x43, 0x0d, 0x69, 0x3a, 0xe8, 0x31, 0xe0, 0x32,
-  0xa8, 0x2a, 0x49, 0x63, 0x99, 0x95, 0xd4, 0x81, 0x4a, 0xc0, 0x1a, 0x6f,
-  0xb5, 0xc5, 0xfb, 0x12, 0x60, 0x98, 0x78, 0x61, 0x6c, 0xaf, 0xe1, 0xe1,
-  0x4a, 0x69, 0x98, 0x64, 0x77, 0x6c, 0x71, 0x59, 0x18, 0x7c, 0x6f, 0x9b,
-  0x7e, 0x3c, 0x2b, 0x29, 0xbe, 0x56, 0x5b, 0xaf, 0x4d, 0x84, 0x22, 0x8c,
-  0x54, 0xdb, 0x8a, 0x36, 0x22, 0xf0, 0x63, 0x16, 0x36, 0x82, 0xfa, 0x16,
-  0x48, 0x88, 0xca, 0x27, 0xe2, 0xab, 0xd7, 0xda, 0x4a, 0x18, 0x07, 0xbf,
-  0x19, 0x08, 0x12, 0x6e, 0x47, 0x2b, 0x35, 0x98, 0x26, 0xfa, 0x6d, 0x2a,
-  0x57, 0xe9, 0x36, 0xd2, 0x0d, 0x91, 0x96, 0x80, 0x42, 0x48, 0x92, 0x6e,
-  0x1e, 0xb1, 0xe9, 0xfb, 0x5a, 0x53, 0x03, 0xe9, 0x3b, 0x34, 0x1c, 0x58,
-  0x47, 0x69, 0xe1, 0xf7, 0x15, 0x0b, 0x60, 0xda, 0xc8, 0xcb, 0x29, 0x12,
-  0x7f, 0xb8, 0x36, 0x47, 0x58, 0x6e, 0x52, 0x2a, 0xab, 0x4b, 0x67, 0x36,
-  0x91, 0xf6, 0xf8, 0x29, 0x9f, 0x2f, 0xe7, 0xcc, 0x11, 0xd9, 0x67, 0x0d,
-  0x65, 0x30, 0xa7, 0x3b, 0x47, 0x17, 0x16, 0xf8, 0x38, 0xc6, 0x13, 0x75,
-  0xf7, 0xbe, 0x0d, 0x98, 0x62, 0xdb, 0x4a, 0xbd, 0x70, 0x7a, 0x87, 0x69,
-  0xfd, 0xb1, 0x50, 0xff, 0xed, 0x3b, 0x34, 0x79, 0x6e, 0x54, 0x90, 0x2f,
-  0xc3, 0x4e, 0xa4, 0x9e, 0xe4, 0x60, 0xc1, 0x81, 0x9d, 0x49, 0x38, 0xdd,
-  0x6c, 0xea, 0x59, 0x3f, 0xbc, 0xdd, 0xe0, 0x97, 0x92, 0x55, 0x5a, 0x2d,
-  0xa3, 0xfa, 0x9e, 0x5b, 0x5b, 0xf6, 0x3c, 0x0d, 0xd5, 0x79, 0x2e, 0xf9,
-  0x5a, 0x92, 0x8d, 0x7f, 0xcd, 0x24, 0x62, 0xcb, 0x45, 0x70, 0x5f, 0x5b,
-  0x49, 0x61, 0xf5, 0x27, 0xf3, 0xf9, 0x5d, 0x81, 0x73, 0x88, 0x4d, 0x46,
-  0xbe, 0x5e, 0x99, 0x63, 0x75, 0xbf, 0xc0, 0xb7, 0xb8, 0x52, 0xe4, 0x6d,
-  0x93, 0x27, 0x28, 0xb8, 0x46, 0x98, 0x8f, 0x80, 0x59, 0x68, 0x0e, 0x68,
-  0x52, 0x78, 0xf9, 0xfa, 0x9a, 0x6c, 0xf6, 0xf8, 0xd3, 0xa7, 0xf0, 0xb2,
-  0x74, 0x66, 0x1c, 0x33, 0xdc, 0xb1, 0x8d, 0xf7, 0x78, 0xf7, 0x73, 0xfa,
-  0xe7, 0x93, 0x4f, 0x1d, 0x53, 0x6f, 0x18, 0xa5, 0xa3, 0xd3, 0xe4, 0xd3,
-  0x74, 0x5c, 0x72, 0xfc, 0x88, 0x27, 0x2c, 0xf5, 0x26, 0x53, 0x3d, 0xe0,
-  0x22, 0x1b, 0x6e, 0x53, 0x2e, 0x56, 0x12, 0x06, 0xe6, 0x81, 0x25, 0x64,
-  0xa5, 0xb9, 0xe1, 0xda, 0x9d, 0x1c, 0xe3, 0x43, 0xd1, 0x31, 0xa3, 0xad,
-  0xd2, 0x64, 0xea, 0x5c, 0x69, 0xa3, 0xd3, 0x72, 0xc9, 0x41, 0xb8, 0x2c,
-  0x88, 0xea, 0xe4, 0x3c, 0xfb, 0x74, 0xa8, 0xcc, 0xa5, 0x95, 0xa3, 0x94,
-  0x3c, 0x9f, 0xec, 0x3a, 0xd9, 0x33, 0xcb, 0x90, 0x17, 0xcb, 0xc6, 0xb2,
-  0x83, 0xe1, 0x83, 0xba, 0x43, 0xa3, 0xb3, 0x4f, 0x92, 0xde, 0x5e, 0x2c,
-  0x22, 0x0d, 0x6a, 0x2f, 0xb6, 0xc5, 0xe7, 0x04, 0xe5, 0x90, 0xc4, 0x29,
-  0xe1, 0xdf, 0xb3, 0x31, 0x35, 0x57, 0x23, 0x88, 0x12, 0x09, 0xce, 0x3e,
-  0x99, 0xc9, 0xe6, 0x62, 0x1b, 0x89, 0xbd, 0x1e, 0xdc, 0xa5, 0x26, 0x08,
-  0x57, 0x66, 0xbe, 0x8f, 0xe0, 0x56, 0x5a, 0x62, 0xdc, 0x56, 0xf6, 0x81,
-  0xa4, 0x2b, 0x1b, 0x39, 0x92, 0x9c, 0xcb, 0x2c, 0xa1, 0xce, 0xff, 0x03,
-  0x8e, 0x76, 0x9d, 0xd6, 0xb3, 0x41, 0xde, 0x95, 0xe6, 0xc7, 0xc0, 0xc2,
-  0x59, 0x24, 0x8b, 0xdd, 0x85, 0xa6, 0x89, 0xd1, 0xe1, 0xe8, 0xb4, 0x43,
-  0xa1, 0xb4, 0x96, 0xda, 0x76, 0xaf, 0xad, 0xf8, 0x3c, 0x90, 0x7f, 0x4f,
-  0xe3, 0x17, 0xad, 0x0c, 0xe5, 0x75, 0xd4, 0x7b, 0xcc, 0x87, 0xba, 0xaa,
-  0x3c, 0x57, 0x7d, 0xc0, 0x5f, 0x77, 0x34, 0x9f, 0x61, 0x67, 0x98, 0x0e,
-  0x88, 0x20, 0x26, 0x5c, 0x48, 0x2d, 0x89, 0x70, 0xca, 0xe0, 0x89, 0x1d,
-  0x01, 0xb0, 0xdc, 0x17, 0x05, 0x66, 0x4a, 0x3f, 0x1d, 0xf9, 0x88, 0xee,
-  0x02, 0xaa, 0x33, 0x38, 0x88, 0x71, 0xdf, 0x58, 0x50, 0x9b, 0x68, 0x94,
-  0x35, 0x9e, 0x26, 0x30, 0x4b, 0x23, 0x17, 0x97, 0x95, 0x58, 0xd4, 0x86,
-  0xc3, 0x84, 0x10, 0xb9, 0x74, 0x48, 0x45, 0xcd, 0xa1, 0xc2, 0x2b, 0x2e,
-  0xe5, 0xa6, 0x3d, 0xf0, 0xda, 0xec, 0xca, 0x49, 0xfc, 0x90, 0xc1, 0x70,
-  0x7f, 0x5f, 0xe6, 0xa4, 0x53, 0x50, 0xe6, 0xd0, 0x30, 0x79, 0xc9, 0xb8,
-  0x26, 0x29, 0x89, 0xc6, 0xa5, 0x17, 0x51, 0x9f, 0x91, 0x1e, 0xb5, 0x1d,
-  0x08, 0x22, 0x38, 0xa6, 0x43, 0x74, 0x0e, 0xdf, 0xa0, 0xd3, 0x47, 0xd4,
-  0xe9, 0xb9, 0x39, 0xe8, 0xa0, 0x6d, 0x91, 0x94, 0x3e, 0x20, 0x59, 0x24,
-  0xe2, 0xad, 0x38, 0x74, 0xe1, 0x01, 0xaf, 0x3f, 0x84, 0xf6, 0x6d, 0xbf,
-  0x55, 0x05, 0x07, 0xf6, 0x9e, 0xd8, 0x02, 0x0d, 0x15, 0x51, 0x2a, 0xd2,
-  0xd9, 0x4e, 0xdd, 0x4c, 0x49, 0xfe, 0x2d, 0x8b, 0x19, 0x75, 0x92, 0x9a,
-  0xd2, 0x8a, 0x5f, 0xdd, 0xb9, 0x69, 0x62, 0x0c, 0x2b, 0xc1, 0x02, 0x71,
-  0xf0, 0x39, 0x0c, 0x51, 0x5a, 0x15, 0x96, 0x7e, 0x22, 0xf2, 0x23, 0x64,
-  0xd2, 0xf1, 0xa7, 0x8a, 0xec, 0x5e, 0x1e, 0x31, 0x26, 0xb2, 0xb5, 0x6e,
-  0xeb, 0x12, 0xfe, 0x3f, 0x52, 0x87, 0xcc, 0x46, 0x1b, 0x97, 0xb5, 0xd2,
-  0xd2, 0x9a, 0x41, 0x9a, 0xd7, 0x5b, 0xe7, 0x09, 0xbc, 0x55, 0xf7, 0x52,
-  0x83, 0x44, 0xca, 0x04, 0x3f, 0xbe, 0x97, 0x13, 0x84, 0xdf, 0x08, 0x8b,
-  0xe1, 0xfe, 0x62, 0x56, 0x10, 0x77, 0xa0, 0x1d, 0xe9, 0x11, 0x99, 0x92,
-  0x16, 0xb8, 0x27, 0x78, 0x9c, 0x16, 0x41, 0x06, 0xcc, 0x37, 0x0a, 0x8d,
-  0x46, 0x2a, 0x94, 0x99, 0xed, 0xb4, 0x94, 0x4c, 0xff, 0xc9, 0xcc, 0xc8,
-  0xfa, 0x88, 0xc9, 0xa9, 0x05, 0xea, 0x88, 0x3b, 0xab, 0xdf, 0x15, 0xa7,
-  0xf5, 0x92, 0x54, 0x90, 0xd9, 0x92, 0xbe, 0xcd, 0xb4, 0x53, 0x96, 0xf6,
-  0x48, 0x13, 0x94, 0xa3, 0x54, 0x61, 0x96, 0x5c, 0x84, 0xce, 0xa8, 0xc7,
-  0x9a, 0xb6, 0xd4, 0x5a, 0x96, 0x4a, 0x28, 0xd6, 0x65, 0xde, 0x1a, 0xae,
-  0xe8, 0x1d, 0xd9, 0x85, 0x7d, 0xbf, 0xf4, 0xb3, 0x1f, 0x31, 0xa7, 0x64,
-  0x0c, 0xed, 0x4e, 0xbb, 0x9c, 0x72, 0x8c, 0x0a, 0x8a, 0x3d, 0x2d, 0x7c,
-  0xc9, 0xf8, 0x7d, 0xd3, 0xdb, 0x43, 0xf3, 0x76, 0x01, 0x91, 0x6e, 0x55,
-  0x53, 0x3e, 0x29, 0x02, 0x46, 0xcb, 0x87, 0xd4, 0x7b, 0x5e, 0x59, 0xe1,
-  0x39, 0x64, 0x09, 0x89, 0x55, 0x7c, 0xf6, 0xbd, 0xda, 0x65, 0x8b, 0xde,
-  0xf3, 0x5f, 0x7a, 0x1f, 0x3e, 0x69, 0x17, 0x2b, 0x12, 0x1e, 0xb8, 0x5f,
-  0x75, 0xa0, 0xd2, 0x87, 0x9d, 0xa8, 0x15, 0xa8, 0xf8, 0xff, 0x3b, 0x4f,
-  0x54, 0xfa, 0xb0, 0x23, 0x95, 0xb6, 0xce, 0xd4, 0x8a, 0x1a, 0xdd, 0x2b,
-  0x7b, 0xfc, 0x1b, 0x9e, 0x32, 0x0b, 0x1d, 0x78, 0xe8, 0x19, 0x4b, 0x5c,
-  0x21, 0xf5, 0xff, 0x8b, 0x4f, 0xd9, 0xe7, 0x1d, 0x2d, 0x10, 0xa4, 0x8a,
-  0x0f, 0xac, 0x09, 0x46, 0x50, 0x66, 0xd2, 0xb5, 0x76, 0x2c, 0xff, 0x59,
-  0x9c, 0x52, 0x9e, 0x89, 0x74, 0x22, 0xd1, 0x7c, 0x06, 0xd5, 0x61, 0x42,
-  0x9e, 0xd8, 0xe5, 0xd0, 0x0c, 0xe1, 0xb5, 0x2d, 0x07, 0xa6, 0xba, 0x65,
-  0x21, 0x25, 0x1c, 0xa6, 0x2d, 0x23, 0x27, 0xf4, 0x5b, 0x76, 0x5c, 0xd7,
-  0xe6, 0x6e, 0x5f, 0xe4, 0xac, 0x22, 0x18, 0xed, 0x85, 0x92, 0x39, 0xbf,
-  0x19, 0x8d, 0x06, 0x87, 0xe7, 0x27, 0xdd, 0x93, 0xd7, 0xfe, 0x9c, 0x96,
-  0x5c, 0x7f, 0xb2, 0xb2, 0x44, 0xd8, 0x6a, 0xa8, 0x44, 0xfb, 0xdb, 0x46,
-  0xd3, 0xed, 0x4e, 0xec, 0x61, 0x9d, 0xb4, 0xb0, 0x80, 0xd2, 0x23, 0x9f,
-  0xa0, 0x5a, 0x68, 0x38, 0x85, 0x87, 0x19, 0xd9, 0xe5, 0x24, 0xb7, 0xf0,
-  0x40, 0x80, 0x9c, 0x04, 0x59, 0x06, 0x51, 0x5d, 0xec, 0x3d, 0x7b, 0xba,
-  0x67, 0xce, 0xc5, 0x1d, 0xb3, 0xc5, 0xc9, 0xcb, 0x8f, 0x87, 0x8f, 0x76,
-  0x1e, 0x0f, 0x1f, 0x93, 0x54, 0x93, 0x38, 0x06, 0xcc, 0x3a, 0x69, 0xde,
-  0xc8, 0xbb, 0x08, 0x72, 0x80, 0xaf, 0xb1, 0xb7, 0xc7, 0x47, 0x09, 0x03,
-  0xcc, 0xc0, 0x1f, 0x96, 0x20, 0xdf, 0x85, 0x72, 0x67, 0x24, 0x0d, 0x1a,
-  0x01, 0x6e, 0x12, 0xa6, 0xb2, 0x88, 0xbc, 0x5d, 0x03, 0x73, 0x2c, 0x98,
-  0x0e, 0x35, 0x26, 0x90, 0x43, 0x5e, 0xd8, 0x8e, 0x90, 0xc0, 0x63, 0xbb,
-  0x42, 0xe6, 0x85, 0xfa, 0x18, 0xe6, 0x8a, 0x78, 0x53, 0xf2, 0x40, 0x46,
-  0x6f, 0xaa, 0x8c, 0xbb, 0x7a, 0x7d, 0xd4, 0x80, 0x59, 0x61, 0x02, 0x39,
-  0x2f, 0x65, 0x60, 0xe9, 0x88, 0x48, 0x54, 0x70, 0x1c, 0x39, 0x5b, 0x26,
-  0x73, 0x6b, 0x94, 0x5c, 0xfd, 0x7d, 0x5a, 0x0c, 0x7f, 0xa9, 0x45, 0x15,
-  0x51, 0x89, 0x3d, 0xc3, 0x49, 0xbb, 0x2e, 0xa2, 0x4c, 0xac, 0xa5, 0x55,
-  0x03, 0x12, 0x23, 0xa9, 0xeb, 0x0b, 0xe0, 0x2d, 0x40, 0xc7, 0x99, 0x6d,
-  0x28, 0xaf, 0x29, 0xdb, 0x7e, 0xe4, 0x67, 0xda, 0x7a, 0x24, 0x85, 0x80,
-  0x3e, 0xc6, 0x6d, 0x55, 0x59, 0x3a, 0x93, 0x5e, 0x79, 0xdf, 0x09, 0x7f,
-  0x89, 0xb0, 0x24, 0x89, 0xdb, 0x3a, 0x84, 0x4e, 0x39, 0x4e, 0x51, 0xed,
-  0x82, 0x05, 0x52, 0x78, 0x24, 0xf9, 0x95, 0xb9, 0x50, 0xf2, 0x45, 0x3a,
-  0x4b, 0x1e, 0x80, 0x00, 0x5e, 0xbd, 0xf8, 0x0f, 0xa9, 0x9f, 0xa1, 0xa7,
-  0x73, 0x8d, 0xa8, 0x53, 0xfe, 0x96, 0xee, 0xa5, 0x17, 0xca, 0xb9, 0x15,
-  0x8d, 0x11, 0x22, 0x55, 0xe4, 0x99, 0x27, 0xce, 0xba, 0x01, 0x6e, 0x42,
-  0x83, 0xa8, 0x8f, 0x69, 0x52, 0xce, 0x17, 0x08, 0x1b, 0xe0, 0xa2, 0xd3,
-  0x66, 0x25, 0x41, 0x8d, 0xfc, 0x62, 0x5c, 0xa6, 0x63, 0x8d, 0x78, 0xe7,
-  0x22, 0xdb, 0x93, 0x07, 0xc8, 0xde, 0xdf, 0x42, 0x18, 0x92, 0x12, 0xc7,
-  0x9e, 0x86, 0x5f, 0xae, 0xce, 0xc9, 0x14, 0x26, 0x5b, 0x88, 0xd0, 0x4a,
-  0xaa, 0x91, 0x92, 0x16, 0x6a, 0xd4, 0x3c, 0xe2, 0xa7, 0x42, 0x7c, 0x0c,
-  0x1b, 0x64, 0x7b, 0xf8, 0x20, 0x96, 0xd9, 0x8e, 0xea, 0x17, 0x72, 0xdd,
-  0xfc, 0xdf, 0xa0, 0x08, 0x3e, 0x49, 0xec, 0x5a, 0x3d, 0x44, 0x21, 0x64,
-  0x42, 0x66, 0xae, 0xe6, 0x1a, 0x70, 0x0d, 0x39, 0xa3, 0xeb, 0xff, 0xd3,
-  0x07, 0xff, 0xff, 0x49, 0x1f, 0xfc, 0x67, 0x4e, 0x29, 0x95, 0xfe, 0x86,
-  0x0e, 0xe1, 0x9f, 0x4c, 0xff, 0x30, 0xc6, 0x60, 0xc1, 0xb3, 0xbb, 0xa1,
-  0x4b, 0x06, 0xfb, 0x05, 0x47, 0x34, 0xdc, 0x0a, 0xff, 0x77, 0x1c, 0xd1,
-  0x07, 0x9d, 0xcc, 0xff, 0xcf, 0xfb, 0xf1, 0x7f, 0xda, 0x39, 0x5c, 0x03,
-  0xf9, 0xd8, 0x32, 0xdb, 0xec, 0x96, 0x0a, 0x1e, 0x70, 0x19, 0x19, 0xd8,
-  0xda, 0xdb, 0x4e, 0xf5, 0xa1, 0xb4, 0x19, 0x9e, 0xba, 0x93, 0xf3, 0xef,
-  0x9e, 0xf6, 0x29, 0x90, 0x35, 0xea, 0x06, 0x2f, 0xab, 0xe4, 0xf4, 0xe5,
-  0xe1, 0xf9, 0x2f, 0x38, 0xed, 0x7f, 0x85, 0xa3, 0x75, 0x91, 0x65, 0xd3,
-  0x01, 0x47, 0x48, 0x9e, 0xe3, 0x1f, 0xd1, 0xd0, 0xa2, 0xe6, 0xc2, 0x63,
-  0xdb, 0x52, 0xe0, 0x24, 0x8c, 0xd9, 0xe2, 0x65, 0xa3, 0xa6, 0x14, 0xc2,
-  0x4e, 0xb1, 0x40, 0xb9, 0xa5, 0xc0, 0xcb, 0x52, 0x16, 0xd3, 0x6d, 0x51,
-  0x01, 0xf9, 0xdb, 0xd8, 0x2a, 0x12, 0x6b, 0xa7, 0xe3, 0x7d, 0x4d, 0x1c,
-  0x56, 0x96, 0x05, 0xd0, 0x7b, 0x86, 0xf1, 0x42, 0x51, 0xe0, 0xc7, 0x9d,
-  0x1b, 0x0a, 0x07, 0x77, 0x98, 0x69, 0xea, 0xd1, 0x2e, 0x79, 0xe0, 0x21,
-  0x41, 0xb2, 0xe6, 0x77, 0xcc, 0x8b, 0xef, 0x7e, 0x7e, 0x15, 0x74, 0x60,
-  0xed, 0x54, 0xfa, 0x2b, 0xd1, 0x9a, 0x41, 0x8a, 0x05, 0x4e, 0x97, 0x55,
-  0x58, 0xa1, 0x2d, 0xf5, 0x67, 0x87, 0xa3, 0xe5, 0xdc, 0x5f, 0xfb, 0x89,
-  0xf6, 0x5c, 0x9a, 0xcf, 0xb7, 0xa6, 0x33, 0x82, 0x90, 0xef, 0xb7, 0x90,
-  0x19, 0x7e, 0x97, 0x6c, 0x44, 0x70, 0x2f, 0x51, 0xe7, 0x3e, 0xe0, 0x5b,
-  0x02, 0x5c, 0x31, 0xbb, 0x29, 0x34, 0xfd, 0xdc, 0xeb, 0xf7, 0x01, 0x9e,
-  0xca, 0xa2, 0xa9, 0x98, 0x52, 0x59, 0x82, 0xa5, 0xb5, 0x72, 0x7d, 0x2f,
-  0xbd, 0x4a, 0x99, 0x29, 0x17, 0xad, 0xa7, 0x59, 0x0b, 0x89, 0x0d, 0xf9,
-  0x7c, 0x67, 0xcd, 0x64, 0x68, 0x57, 0x16, 0x64, 0x63, 0x54, 0xcc, 0xde,
-  0xa8, 0xb8, 0x5a, 0xef, 0xd3, 0x8c, 0xb0, 0xba, 0xd3, 0xb4, 0xf7, 0xc1,
-  0x0a, 0x6f, 0x85, 0xc6, 0xfc, 0x57, 0xc0, 0xa0, 0x7f, 0x43, 0xd8, 0xe7,
-  0xfa, 0xca, 0x52, 0x61, 0xaa, 0xb7, 0x3a, 0x64, 0xac, 0x54, 0x48, 0x51,
-  0x55, 0x9e, 0xf6, 0x02, 0x15, 0xa0, 0xcc, 0x9b, 0x3b, 0x62, 0x0b, 0xb8,
-  0x15, 0x90, 0x7a, 0x57, 0xde, 0x8f, 0x4e, 0x1f, 0x61, 0x5a, 0x2f, 0x4f,
-  0x47, 0x3e, 0xeb, 0x76, 0x8d, 0x92, 0xa4, 0x48, 0x53, 0xfa, 0xfa, 0xf8,
-  0x70, 0x74, 0x39, 0x0c, 0x86, 0x68, 0xc6, 0x18, 0x82, 0x43, 0x6c, 0xaa,
-  0x51, 0x06, 0x0e, 0xa2, 0x59, 0x7a, 0x47, 0x54, 0x77, 0x92, 0xfe, 0x44,
-  0x9d, 0xe3, 0xbe, 0x69, 0xeb, 0x64, 0xe7, 0xa6, 0x8c, 0xbe, 0x6d, 0xb2,
-  0x2a, 0x64, 0xa8, 0x32, 0x73, 0x37, 0xce, 0x67, 0x34, 0x02, 0xd3, 0x2f,
-  0x63, 0x0d, 0xcd, 0x05, 0xd4, 0x8c, 0x5c, 0xda, 0x72, 0x46, 0xb0, 0x32,
-  0xfa, 0x4c, 0xdb, 0x0f, 0x41, 0x4c, 0x9a, 0x92, 0x60, 0xbc, 0x3a, 0x5d,
-  0xd0, 0x68, 0x19, 0x65, 0x9d, 0x09, 0x5d, 0x19, 0xb5, 0xa1, 0x73, 0xc5,
-  0xb9, 0x4c, 0x36, 0x9b, 0x00, 0xaf, 0x80, 0x6c, 0x21, 0xcc, 0xc5, 0x4a,
-  0xeb, 0x0f, 0x8a, 0x48, 0x47, 0xc9, 0x36, 0x02, 0xd0, 0xac, 0xc5, 0xd7,
-  0x75, 0x2d, 0x21, 0xb3, 0xd0, 0xc8, 0x5c, 0xa5, 0x0c, 0x86, 0xae, 0x6d,
-  0xf7, 0x7d, 0x4e, 0xdc, 0xbf, 0xdb, 0x6b, 0xd6, 0xdb, 0x46, 0xc8, 0xfd,
-  0x8a, 0x72, 0x09, 0xb5, 0x16, 0xaf, 0xe8, 0x93, 0x4c, 0x6e, 0x32, 0x73,
-  0x89, 0x0c, 0xbd, 0xfc, 0xeb, 0x07, 0x4f, 0xc8, 0x46, 0x40, 0xd4, 0x15,
-  0x99, 0x9e, 0x5f, 0x3c, 0x21, 0x8f, 0x1f, 0x87, 0x13, 0x52, 0x65, 0x7f,
-  0x9f, 0xc6, 0xb8, 0x8d, 0x81, 0x10, 0x07, 0x3c, 0x9d, 0x61, 0xdd, 0x17,
-  0x4c, 0xd0, 0x4c, 0x5d, 0xdd, 0xa1, 0x4a, 0x28, 0x0a, 0xb5, 0x75, 0xb4,
-  0x57, 0x64, 0x61, 0x53, 0x08, 0x32, 0x2c, 0x75, 0xdb, 0x48, 0xda, 0xb4,
-  0x57, 0xd9, 0x2c, 0x8f, 0x27, 0xed, 0x0b, 0xd8, 0x53, 0x3e, 0xb2, 0x56,
-  0x83, 0x24, 0x88, 0x27, 0xea, 0x69, 0x50, 0x1e, 0x98, 0x3d, 0x3c, 0x83,
-  0xc1, 0x55, 0xb3, 0xb0, 0x03, 0x5b, 0xbb, 0x3b, 0x76, 0x83, 0xc9, 0x50,
-  0x5a, 0x67, 0x8c, 0x9d, 0x07, 0x2f, 0xa3, 0x4f, 0x2e, 0x21, 0xb1, 0xd8,
-  0x0b, 0xbb, 0x66, 0x0a, 0x02, 0x64, 0x19, 0x95, 0xeb, 0x60, 0xd0, 0x28,
-  0x28, 0x86, 0xa4, 0x44, 0xed, 0x43, 0x27, 0x22, 0x14, 0x1e, 0x98, 0x96,
-  0x56, 0x6c, 0xd4, 0x0e, 0x58, 0x24, 0xb8, 0xc6, 0x47, 0x65, 0x0a, 0x38,
-  0x01, 0x0a, 0x58, 0xe3, 0x41, 0xc8, 0x01, 0x6c, 0xac, 0xf9, 0x8f, 0xd9,
-  0x0c, 0x29, 0x41, 0x59, 0x31, 0xa9, 0xee, 0x16, 0x3e, 0x19, 0xf7, 0xf4,
-  0x9f, 0x99, 0x7f, 0x45, 0xee, 0x23, 0x78, 0x6c, 0x14, 0x1f, 0x23, 0xec,
-  0xb6, 0x43, 0xfd, 0x8b, 0xb2, 0x17, 0x55, 0xbe, 0xb1, 0x67, 0x0a, 0xc0,
-  0x5b, 0x8e, 0x11, 0x5b, 0xfd, 0x97, 0xac, 0x19, 0x95, 0xde, 0x4c, 0x77,
-  0xc7, 0x04, 0x63, 0xdd, 0xb8, 0xc7, 0x12, 0xf4, 0x45, 0x16, 0xb1, 0xfc,
-  0xe0, 0xb5, 0xdf, 0xef, 0xf3, 0x84, 0x7d, 0xdc, 0x0f, 0x52, 0x1a, 0x48,
-  0x24, 0xbc, 0x22, 0x2f, 0x4d, 0xdb, 0x11, 0x4f, 0x07, 0x56, 0xeb, 0x1a,
-  0xed, 0xb3, 0x2b, 0xaa, 0x55, 0x0a, 0x53, 0xa0, 0xa4, 0x01, 0xcc, 0x89,
-  0xb3, 0xa3, 0xe9, 0x6d, 0x97, 0x4a, 0x37, 0x32, 0xc2, 0x95, 0x41, 0x5c,
-  0xea, 0x5b, 0x1a, 0x2f, 0x73, 0x21, 0x0a, 0xa0, 0x1b, 0xd0, 0x3c, 0xfd,
-  0x71, 0x7f, 0x15, 0xb5, 0xf4, 0x50, 0x7e, 0x8d, 0x54, 0xd3, 0x29, 0x55,
-  0x31, 0x70, 0xbc, 0x77, 0x89, 0x2d, 0x89, 0x0c, 0x0c, 0x23, 0x39, 0xa8,
-  0x9f, 0xee, 0x7d, 0xf6, 0x74, 0x7b, 0x5d, 0x0d, 0x58, 0x2a, 0xfa, 0x41,
-  0x49, 0x74, 0xbc, 0x89, 0xe8, 0x5f, 0xfb, 0x43, 0x7f, 0x82, 0xbc, 0xca,
-  0x04, 0x92, 0x7c, 0x1a, 0xde, 0x71, 0xe6, 0xc2, 0xa1, 0x4d, 0x81, 0x89,
-  0x50, 0x02, 0x77, 0x6c, 0x17, 0x1e, 0x17, 0x59, 0x33, 0x72, 0xce, 0xb1,
-  0x99, 0xbb, 0x66, 0x61, 0x50, 0x85, 0x14, 0x66, 0xe2, 0xe0, 0x91, 0xf6,
-  0x81, 0xef, 0x4f, 0xbf, 0x0c, 0x1c, 0x77, 0x16, 0x7f, 0x1f, 0xb6, 0xff,
-  0xe5, 0x07, 0x34, 0x5d, 0x03, 0xbf, 0x66, 0x95, 0x1f, 0xfd, 0x0b, 0x56,
-  0xf9, 0xd1, 0xfa, 0x55, 0x7e, 0xf4, 0xd0, 0x55, 0xfe, 0xec, 0xc9, 0xd3,
-  0xcf, 0x7f, 0xc5, 0x2a, 0x7b, 0x33, 0xfc, 0xdf, 0xb6, 0xca, 0xde, 0x4e,
-  0xfb, 0x75, 0xab, 0x2c, 0xc0, 0x90, 0x40, 0x10, 0x4b, 0xc5, 0x0c, 0x82,
-  0xf0, 0x51, 0xca, 0x3b, 0x23, 0xf9, 0xf9, 0x59, 0x4b, 0x22, 0xdb, 0xe2,
-  0x15, 0xb6, 0xd5, 0xb2, 0x48, 0x13, 0x8b, 0x98, 0xd9, 0x2e, 0x01, 0x1f,
-  0x3a, 0xee, 0x62, 0x46, 0x55, 0x97, 0x36, 0x07, 0x9b, 0xea, 0x20, 0xd1,
-  0x04, 0x27, 0xe5, 0xaf, 0xe1, 0xcf, 0x99, 0xa5, 0xfe, 0x17, 0xf2, 0x1f,
-  0x85, 0xb8, 0x19, 0x0f, 0xf9, 0xd4, 0x9e, 0xb4, 0xbb, 0x99, 0x31, 0x14,
-  0x18, 0x87, 0x14, 0x45, 0xc0, 0x49, 0x36, 0xa6, 0xe5, 0x60, 0x51, 0x57,
-  0xcd, 0xd8, 0xa8, 0x85, 0xe6, 0x1e, 0x28, 0x1a, 0x2e, 0x66, 0x2f, 0x49,
-  0x7e, 0x34, 0x68, 0xda, 0x19, 0x91, 0x0c, 0x4d, 0xad, 0xfe, 0xd1, 0x41,
-  0x2d, 0xd9, 0xba, 0xd6, 0x65, 0xbb, 0x33, 0x08, 0x03, 0xd4, 0xe6, 0x94,
-  0x4c, 0xb8, 0x96, 0xcb, 0x3c, 0x42, 0xca, 0xb1, 0x46, 0xd2, 0x3f, 0xed,
-  0x82, 0xee, 0x56, 0x54, 0x1b, 0x89, 0x26, 0xf2, 0x53, 0x81, 0x9b, 0x76,
-  0x85, 0x1b, 0xc6, 0xc3, 0x32, 0xf7, 0x15, 0x54, 0xfe, 0x6e, 0x25, 0x97,
-  0xbc, 0x06, 0x0e, 0x3b, 0x48, 0x15, 0xa4, 0x4b, 0x5d, 0x06, 0xd4, 0x2e,
-  0xa3, 0xe2, 0x10, 0x85, 0x3a, 0x33, 0xc3, 0xae, 0x69, 0x16, 0x98, 0x89,
-  0x04, 0xb0, 0x95, 0x72, 0x37, 0x7a, 0x45, 0xb2, 0x11, 0xfe, 0x92, 0x56,
-  0x77, 0xba, 0x9c, 0x2f, 0x94, 0xb6, 0x8c, 0x72, 0x39, 0x72, 0xa4, 0xfb,
-  0x48, 0xd2, 0x72, 0xac, 0x08, 0x75, 0x5a, 0x79, 0x7e, 0x26, 0x01, 0xb8,
-  0xb1, 0xcf, 0x4a, 0xd7, 0xca, 0x71, 0x19, 0xf1, 0x18, 0x24, 0x67, 0x0a,
-  0xd9, 0x13, 0x45, 0x17, 0xff, 0xc9, 0xd9, 0x9e, 0x94, 0xda, 0x35, 0xcd,
-  0xc6, 0xcb, 0x6b, 0xcd, 0xfc, 0xb5, 0x95, 0xb1, 0xda, 0xbb, 0x12, 0xd9,
-  0x26, 0xc4, 0x05, 0x92, 0x69, 0x69, 0xeb, 0x90, 0x04, 0xa1, 0xa1, 0x9a,
-  0x70, 0x93, 0x75, 0x00, 0xb1, 0x60, 0xe0, 0xd8, 0xec, 0xad, 0x91, 0xe3,
-  0x27, 0xad, 0x8a, 0x45, 0x91, 0x12, 0x3e, 0xfe, 0x56, 0x69, 0x26, 0x8b,
-  0xc1, 0x55, 0x4a, 0x34, 0x82, 0x41, 0xea, 0xa7, 0x80, 0x42, 0xe5, 0x08,
-  0x5c, 0x1e, 0x9d, 0x27, 0xaf, 0x52, 0x29, 0x20, 0x92, 0x6c, 0x19, 0x09,
-  0xfc, 0xd9, 0xe3, 0xbd, 0x47, 0xdb, 0x6b, 0x35, 0xf1, 0x36, 0x2d, 0x0e,
-  0xbe, 0x55, 0x94, 0x31, 0x70, 0xee, 0xe5, 0xb2, 0x42, 0x5e, 0x34, 0xa6,
-  0xdf, 0x7c, 0xe9, 0xfd, 0xdb, 0xb3, 0x97, 0xc7, 0xa7, 0x87, 0x7f, 0xb5,
-  0x79, 0xdd, 0x34, 0x09, 0x9a, 0x1a, 0xf8, 0xde, 0x18, 0xb0, 0x77, 0xef,
-  0xeb, 0xcc, 0xf4, 0xb9, 0xd9, 0x7a, 0xb4, 0x4d, 0x59, 0x4a, 0x41, 0x35,
-  0xb9, 0xeb, 0xac, 0x95, 0x13, 0x2f, 0x58, 0xe9, 0x35, 0xc4, 0x2e, 0xd6,
-  0x45, 0xb9, 0x3b, 0xdc, 0x97, 0x22, 0x01, 0x42, 0x72, 0xee, 0x64, 0x96,
-  0x57, 0xae, 0x20, 0x15, 0xe6, 0x27, 0xcd, 0x41, 0x0f, 0xb6, 0xc7, 0xa7,
-  0xc5, 0x2c, 0x9f, 0xe4, 0x64, 0xaf, 0xc8, 0xb1, 0xce, 0x29, 0x10, 0x7f,
-  0xd5, 0x26, 0x90, 0x43, 0x66, 0x1d, 0xfd, 0x62, 0x7d, 0x60, 0xb9, 0x2d,
-  0xfb, 0x1b, 0x5c, 0x16, 0xd9, 0xac, 0xc8, 0x9a, 0x81, 0x74, 0xec, 0xb9,
-  0xf9, 0xf3, 0xc5, 0xc7, 0x74, 0x16, 0x24, 0x6d, 0x52, 0x31, 0x36, 0xdd,
-  0x99, 0x56, 0x14, 0xd1, 0x9b, 0x5e, 0x81, 0x84, 0x91, 0xad, 0x13, 0xa0,
-  0x4f, 0x9a, 0xa3, 0x12, 0xd4, 0x03, 0xb8, 0xbc, 0xfc, 0xeb, 0xf9, 0xf1,
-  0x8b, 0xe7, 0x24, 0xc8, 0xbe, 0x24, 0x9c, 0x7d, 0xdd, 0x92, 0x6b, 0x09,
-  0xd5, 0x0a, 0x0e, 0xc6, 0xf0, 0xc3, 0xcb, 0x93, 0xd1, 0xf9, 0xe9, 0xd9,
-  0xd1, 0x8b, 0xe7, 0x3f, 0x90, 0x5d, 0x69, 0x2e, 0x8f, 0x3b, 0xef, 0x5d,
-  0xfb, 0x33, 0x4b, 0x79, 0x1e, 0xa6, 0xfd, 0x1f, 0x7f, 0xff, 0xfe, 0xf8,
-  0xed, 0x77, 0x2f, 0x9e, 0x7f, 0x4c, 0xab, 0x3e, 0x8d, 0x8f, 0xdf, 0x5e,
-  0x51, 0xeb, 0xb0, 0xb5, 0xd5, 0x48, 0x41, 0x1f, 0xcf, 0x3e, 0xd4, 0xf9,
-  0x3f, 0xb2, 0xc4, 0xbc, 0x3e, 0x5b, 0x86, 0x94, 0xc3, 0x97, 0x9c, 0x29,
-  0x6d, 0x26, 0x83, 0xfe, 0x96, 0x7c, 0x7d, 0xfa, 0x2d, 0xd1, 0x5a, 0x5a,
-  0x4f, 0xe9, 0x9c, 0x2b, 0xa9, 0x24, 0x5f, 0x3e, 0xd9, 0xdb, 0xdf, 0x76,
-  0x65, 0x02, 0x41, 0x8b, 0x6b, 0x7a, 0xfc, 0x21, 0xc8, 0x11, 0xf9, 0x87,
-  0x52, 0x7b, 0xd9, 0x52, 0x16, 0x48, 0x64, 0xf0, 0x48, 0x28, 0xd4, 0xe9,
-  0x84, 0x8c, 0x76, 0xa6, 0xda, 0x28, 0x49, 0x1e, 0x10, 0x3b, 0x50, 0xe0,
-  0x73, 0xbb, 0x7c, 0xe5, 0x51, 0x51, 0x7c, 0xed, 0xb6, 0x9e, 0xe9, 0x8e,
-  0xf8, 0xed, 0xd6, 0xde, 0x8f, 0xbf, 0x63, 0x34, 0xa7, 0x6b, 0x54, 0x62,
-  0xb2, 0xcd, 0x95, 0x26, 0xfb, 0x27, 0x3e, 0xcf, 0x1e, 0xce, 0x07, 0xd9,
-  0x2e, 0x25, 0xd3, 0xa7, 0x61, 0x94, 0xba, 0xf1, 0x34, 0xe7, 0xf7, 0x1e,
-  0x2f, 0x5e, 0x3e, 0xa7, 0x1c, 0xc9, 0xac, 0x4e, 0xd4, 0xc3, 0xe3, 0xf9,
-  0x6f, 0x66, 0xd9, 0x75, 0x3a, 0xb9, 0xb3, 0x74, 0xb0, 0x42, 0x65, 0x12,
-  0x61, 0x28, 0x48, 0x27, 0x64, 0xce, 0x99, 0x2b, 0xf8, 0x1a, 0xe2, 0x99,
-  0xa9, 0x0e, 0xcc, 0x71, 0xb5, 0x6e, 0x1f, 0xee, 0x9a, 0xa5, 0x74, 0xd0,
-  0xeb, 0x72, 0x75, 0x3e, 0x8f, 0x2d, 0xfb, 0xd6, 0xde, 0x7d, 0xb4, 0x6d,
-  0x50, 0xc4, 0x74, 0xed, 0x9c, 0x3e, 0x6e, 0xfb, 0xcc, 0xff, 0x81, 0x43,
-  0x4e, 0x6c, 0x39, 0x70, 0xcb, 0x3e, 0xa7, 0xbf, 0xc6, 0x39, 0xb3, 0x51,
-  0x70, 0x07, 0x8e, 0x0b, 0xae, 0x53, 0xeb, 0x28, 0xe6, 0x2c, 0xcf, 0x99,
-  0xd4, 0xa1, 0x20, 0xea, 0xe5, 0xc6, 0x39, 0xd4, 0xe3, 0x5c, 0x54, 0xd6,
-  0xad, 0x6d, 0xb6, 0x27, 0x5f, 0x56, 0xb4, 0x33, 0x56, 0xb4, 0xe7, 0x65,
-  0xa2, 0x85, 0x41, 0x1a, 0x4e, 0x81, 0x22, 0x38, 0xc2, 0x73, 0x6a, 0x8b,
-  0x44, 0x22, 0xe9, 0x24, 0x66, 0xa6, 0xbe, 0xd4, 0xb8, 0x4f, 0xea, 0xb3,
-  0x75, 0xe0, 0x21, 0x66, 0x7b, 0xa8, 0xc3, 0x44, 0x79, 0x46, 0xb8, 0xab,
-  0xe7, 0x80, 0x21, 0x1a, 0x14, 0x54, 0xb3, 0x14, 0xb0, 0xa6, 0x9b, 0xb5,
-  0x6a, 0xa5, 0x94, 0xf2, 0x05, 0x43, 0xdd, 0x11, 0x44, 0x46, 0x98, 0x46,
-  0xfc, 0x0c, 0x25, 0xa2, 0x0a, 0x12, 0x9e, 0x16, 0x0c, 0x4e, 0x6b, 0x30,
-  0xa0, 0x53, 0x5b, 0x73, 0x1a, 0xcc, 0x36, 0x93, 0x78, 0x45, 0xc9, 0xdb,
-  0xad, 0x16, 0xdd, 0xba, 0xa7, 0x4c, 0xa3, 0xf4, 0xbe, 0xdc, 0x51, 0xb8,
-  0x95, 0x38, 0x6b, 0x9a, 0x9b, 0xf5, 0x66, 0x24, 0x48, 0x7d, 0x69, 0x18,
-  0xca, 0xdf, 0xbd, 0xa4, 0x88, 0x02, 0x58, 0x01, 0xf4, 0xfe, 0x8c, 0x2a,
-  0x23, 0x35, 0xaa, 0x4b, 0x6d, 0x0d, 0xb6, 0x6d, 0xb2, 0x73, 0xde, 0x58,
-  0xa5, 0x2d, 0x42, 0x8b, 0x61, 0x69, 0x8a, 0x6d, 0xcd, 0x30, 0x76, 0x7f,
-  0xea, 0x0e, 0x91, 0x3d, 0x41, 0x1f, 0xdb, 0xe1, 0x3c, 0x37, 0x15, 0x42,
-  0x79, 0x24, 0xd5, 0x36, 0x68, 0xac, 0xc8, 0x6e, 0xfd, 0xc6, 0x9c, 0xe5,
-  0x61, 0x1b, 0xfc, 0x3d, 0x3d, 0xde, 0xc6, 0x6a, 0xa2, 0xec, 0x9c, 0xe4,
-  0xf9, 0x77, 0xc7, 0x17, 0xa3, 0x93, 0xb3, 0xb7, 0x5f, 0x46, 0x0d, 0xe2,
-  0x44, 0x7e, 0x9b, 0xd8, 0xea, 0x4d, 0x9a, 0xd9, 0xe7, 0xea, 0xe7, 0x90,
-  0x1b, 0x4c, 0xfd, 0x2d, 0xc9, 0x21, 0xa5, 0x31, 0xd1, 0x03, 0xdd, 0x2d,
-  0x50, 0x4b, 0x0b, 0xf0, 0xf3, 0xa6, 0xd5, 0x35, 0xe6, 0xc2, 0xec, 0x45,
-  0x18, 0x6f, 0xa8, 0x8d, 0xaa, 0x56, 0x9d, 0xfd, 0xeb, 0x7e, 0x30, 0xfe,
-  0x38, 0x26, 0xc7, 0x0b, 0x89, 0x2f, 0x17, 0x9c, 0xf2, 0x45, 0x54, 0x02,
-  0x4c, 0x3e, 0xe2, 0xf7, 0x2e, 0x20, 0x51, 0xa7, 0x52, 0xa0, 0xfe, 0x8b,
-  0xe6, 0xe1, 0x8f, 0x7b, 0x5e, 0x9a, 0x8a, 0x7d, 0x6e, 0x2f, 0xf6, 0xdc,
-  0x5e, 0xf8, 0xdc, 0x7e, 0xec, 0xb9, 0xfd, 0xf0, 0xb9, 0x47, 0xb1, 0xe7,
-  0xbc, 0x4c, 0x24, 0xcf, 0x4e, 0xd7, 0x19, 0x5a, 0x67, 0xfa, 0x7a, 0xeb,
-  0xd9, 0x2a, 0x1a, 0xb9, 0xe1, 0xd9, 0xaa, 0x9e, 0xad, 0xae, 0xa6, 0xfa,
-  0x6a, 0x4b, 0xdd, 0xc7, 0x12, 0x75, 0x1c, 0xc6, 0xe6, 0x43, 0x7b, 0x8f,
-  0x06, 0x93, 0x7c, 0x71, 0x43, 0x37, 0xc8, 0x73, 0xad, 0xa9, 0x44, 0xf3,
-  0x4c, 0xe3, 0x92, 0x5f, 0x2c, 0xc9, 0xbc, 0x0e, 0x75, 0x8a, 0xd3, 0x51,
-  0x8b, 0x8c, 0x44, 0x68, 0xf1, 0xf0, 0x4a, 0xc2, 0xef, 0x38, 0x6e, 0x90,
-  0xd0, 0x5d, 0x1c, 0xa4, 0xae, 0x58, 0x57, 0x8c, 0x79, 0x4f, 0x3a, 0xc0,
-  0xc4, 0x11, 0xda, 0x2b, 0xed, 0xa6, 0xb4, 0xcd, 0x4c, 0x96, 0x1a, 0x48,
-  0xef, 0x34, 0xc7, 0xd4, 0xf2, 0xfa, 0xca, 0x30, 0x61, 0x5a, 0x29, 0xaa,
-  0x8a, 0x54, 0x74, 0x46, 0xc7, 0xcd, 0x59, 0xf5, 0xb9, 0x2c, 0x62, 0xd7,
-  0xde, 0xbb, 0x8b, 0xd3, 0x40, 0x4d, 0xb4, 0xa5, 0xc8, 0x51, 0x66, 0xf8,
-  0x26, 0xfd, 0xf4, 0x69, 0x58, 0x67, 0x3b, 0x46, 0x32, 0xd4, 0x3b, 0xf0,
-  0xde, 0xca, 0xa7, 0x6f, 0x9a, 0xf9, 0xec, 0xf7, 0x3d, 0xfa, 0x04, 0x2e,
-  0x23, 0xa5, 0xd4, 0x5c, 0x9d, 0xe6, 0xbf, 0x5f, 0x86, 0x89, 0xa2, 0x18,
-  0x71, 0x17, 0x83, 0xc6, 0x7a, 0x6c, 0x42, 0x39, 0x4c, 0x5c, 0x8f, 0xba,
-  0xaf, 0x16, 0xa1, 0xcf, 0xcc, 0x1e, 0x12, 0x7c, 0x58, 0x1b, 0x36, 0x49,
-  0x7a, 0xa3, 0x8b, 0xf3, 0x5e, 0x5f, 0x22, 0xcf, 0xe6, 0x1b, 0x03, 0xf3,
-  0xef, 0x04, 0xf6, 0x12, 0x15, 0x75, 0x78, 0xf2, 0x58, 0x40, 0x62, 0xe8,
-  0xe4, 0x52, 0x2a, 0x3d, 0x07, 0x11, 0x4d, 0xf3, 0x3b, 0x07, 0x93, 0xab,
-  0x5a, 0xc5, 0x57, 0x8c, 0x1d, 0xd3, 0x1e, 0x20, 0x63, 0x57, 0xfa, 0x8c,
-  0x47, 0x58, 0xa3, 0x9e, 0xf8, 0x24, 0x63, 0xdc, 0xcb, 0x61, 0xc7, 0xd7,
-  0x5d, 0x56, 0x1f, 0x84, 0x83, 0x5e, 0xfc, 0xf5, 0x38, 0x51, 0x41, 0x5d,
-  0xd0, 0xd6, 0x09, 0xb3, 0x2e, 0x3e, 0xf1, 0x13, 0xda, 0x11, 0xcb, 0x5c,
-  0x39, 0xb6, 0xa5, 0x15, 0xc5, 0x2f, 0xa5, 0x1e, 0x25, 0x09, 0x45, 0x29,
-  0x3f, 0x8f, 0x86, 0xb4, 0x1d, 0x69, 0xe6, 0x1e, 0x86, 0x89, 0xc7, 0x9d,
-  0xd5, 0xd7, 0xc9, 0x8b, 0x2c, 0xbb, 0xab, 0xaa, 0x8d, 0x25, 0x82, 0x6e,
-  0xae, 0xec, 0x6f, 0xf4, 0xf5, 0xce, 0x8e, 0x50, 0x16, 0xaa, 0x55, 0x99,
-  0x51, 0xca, 0x08, 0xe1, 0xad, 0xc8, 0x50, 0xc3, 0x48, 0xa2, 0x7e, 0x7a,
-  0x4b, 0xed, 0x18, 0xd8, 0xef, 0x1f, 0x90, 0x3f, 0x1e, 0xbc, 0x1d, 0x85,
-  0x0e, 0xd3, 0x90, 0x14, 0x5a, 0xf9, 0xa0, 0x01, 0xe9, 0x88, 0xd6, 0x0c,
-  0x49, 0x43, 0xed, 0xed, 0x41, 0xb9, 0x51, 0x79, 0xc3, 0x72, 0xbb, 0x94,
-  0x86, 0x16, 0x6c, 0xbd, 0x07, 0x0d, 0xb4, 0x35, 0x52, 0xba, 0x09, 0xa2,
-  0x42, 0x35, 0xe2, 0xb9, 0xf6, 0x6e, 0xbe, 0x44, 0xae, 0x58, 0xd6, 0x70,
-  0x99, 0x10, 0x63, 0x4d, 0x86, 0x00, 0x42, 0x55, 0xe2, 0xc2, 0xa6, 0x56,
-  0x94, 0x39, 0x7f, 0x4d, 0x5e, 0x6b, 0x78, 0x49, 0xd0, 0x35, 0x15, 0x97,
-  0xff, 0xf7, 0xf6, 0x75, 0xaf, 0xd3, 0xd7, 0x7f, 0x41, 0x57, 0xf7, 0x7f,
-  0xdd, 0xac, 0xee, 0xff, 0x37, 0xcc, 0xea, 0xa3, 0x5f, 0x39, 0xab, 0x8f,
-  0x7e, 0xf3, 0x59, 0x75, 0x55, 0x7d, 0xf5, 0x7e, 0xf4, 0x8a, 0xa0, 0x8a,
-  0x76, 0x48, 0xda, 0x9e, 0xf9, 0xe7, 0x98, 0x40, 0x2a, 0xa2, 0x26, 0x50,
-  0x2a, 0x79, 0x86, 0xfa, 0xa6, 0x9d, 0x91, 0x3b, 0x16, 0x54, 0x4b, 0x47,
-  0x2e, 0x4e, 0x64, 0x61, 0x85, 0x25, 0x61, 0xff, 0x75, 0x49, 0x36, 0x90,
-  0x91, 0x89, 0xfd, 0xe4, 0xed, 0x68, 0xc4, 0xd0, 0x81, 0x11, 0x82, 0x1f,
-  0x5d, 0xab, 0x98, 0xdc, 0x09, 0x50, 0x69, 0xb6, 0xe8, 0xc2, 0x3c, 0x33,
-  0x3d, 0x74, 0x1b, 0x8b, 0xdf, 0x9b, 0xa7, 0x13, 0xfa, 0xf1, 0xee, 0x70,
-  0xcf, 0x4d, 0xce, 0xf6, 0x2f, 0x20, 0xae, 0x71, 0x91, 0x89, 0xa8, 0xf6,
-  0x1c, 0x61, 0x46, 0x05, 0xd1, 0x68, 0xdd, 0x74, 0x96, 0xe6, 0x93, 0xec,
-  0x1e, 0x55, 0x67, 0xa2, 0x69, 0x3b, 0x96, 0x9a, 0x46, 0x83, 0x4b, 0xb8,
-  0xa2, 0xd5, 0x05, 0x82, 0x38, 0x2a, 0xb3, 0x2e, 0x84, 0x07, 0xbf, 0xeb,
-  0x7e, 0xe7, 0xba, 0xc8, 0xbf, 0x34, 0x36, 0xe4, 0xc5, 0x61, 0xfe, 0xdb,
-  0x62, 0x43, 0x71, 0x05, 0xb8, 0xf5, 0xaf, 0x56, 0x42, 0x7f, 0x53, 0x0d,
-  0xb4, 0x8a, 0x49, 0x9c, 0x27, 0xd5, 0xb9, 0x06, 0x08, 0xcd, 0x0f, 0x12,
-  0xa9, 0x29, 0x6f, 0x1d, 0x8a, 0x96, 0x1f, 0xcb, 0xbb, 0xce, 0x43, 0xcf,
-  0x18, 0x8c, 0x68, 0xb9, 0x5a, 0xa1, 0xaa, 0x54, 0x7e, 0x04, 0x4d, 0x50,
-  0xe7, 0x51, 0xd6, 0xbc, 0xe3, 0x96, 0x85, 0x7e, 0xc6, 0x65, 0x7a, 0x83,
-  0xab, 0x25, 0x08, 0x20, 0x4e, 0x32, 0xe6, 0xf1, 0xc8, 0xef, 0xbb, 0x23,
-  0x9e, 0xb6, 0xc7, 0x9b, 0x4e, 0xb2, 0x41, 0x5a, 0x4f, 0xf2, 0x3c, 0x6e,
-  0x8b, 0x6b, 0x24, 0xc7, 0xd8, 0xfe, 0x4b, 0xf8, 0xe0, 0xa8, 0x70, 0x33,
-  0x79, 0xcd, 0xb5, 0x30, 0x2a, 0x71, 0x9b, 0x32, 0xb5, 0x05, 0xbb, 0x01,
-  0xca, 0x65, 0x73, 0x0d, 0x96, 0x43, 0x74, 0xb6, 0x1f, 0xec, 0x4c, 0xf2,
-  0xac, 0x33, 0x07, 0x68, 0x3d, 0xa9, 0xf2, 0x05, 0xa8, 0xde, 0xbc, 0x12,
-  0x2c, 0x7d, 0x5b, 0xa3, 0x14, 0xc6, 0xb2, 0xc4, 0x3f, 0xb8, 0x68, 0xe7,
-  0xbb, 0x80, 0x51, 0xa0, 0x37, 0xe8, 0x91, 0x63, 0xc2, 0xd6, 0xad, 0x30,
-  0xef, 0x12, 0x47, 0x27, 0xf3, 0x5c, 0xf1, 0xab, 0xa8, 0x01, 0xbd, 0x3a,
-  0x90, 0xa6, 0x8e, 0x48, 0xb3, 0x85, 0xee, 0x94, 0x05, 0x12, 0xd4, 0xdc,
-  0x1a, 0x60, 0x18, 0x33, 0xd9, 0x2f, 0x39, 0xc8, 0x94, 0x77, 0xf9, 0x26,
-  0xfb, 0xc4, 0xb9, 0x60, 0xa1, 0xb2, 0x29, 0x9a, 0xed, 0x0d, 0x65, 0x09,
-  0xe1, 0xd9, 0xc3, 0xd1, 0xd1, 0xc9, 0x49, 0x2b, 0x73, 0x8c, 0x26, 0x0f,
-  0xc9, 0xfc, 0xcc, 0x4a, 0x50, 0x13, 0x8d, 0x1e, 0x85, 0x5d, 0x62, 0x71,
-  0x34, 0x2e, 0xcd, 0x64, 0x8e, 0x1f, 0x7c, 0xa7, 0x46, 0x12, 0xe4, 0x5a,
-  0x38, 0x2b, 0x65, 0x94, 0xc6, 0xb2, 0x30, 0xdd, 0x84, 0x99, 0x7c, 0xb3,
-  0x9c, 0xa7, 0xc5, 0xef, 0x4f, 0x86, 0x11, 0x07, 0x64, 0xcb, 0x6c, 0xf1,
-  0xb9, 0xf2, 0x63, 0x35, 0xe1, 0x5e, 0x8b, 0x50, 0x60, 0x9f, 0x57, 0x52,
-  0x24, 0x89, 0x79, 0x5f, 0x84, 0xc3, 0x9a, 0xea, 0xf8, 0x12, 0x2f, 0x17,
-  0xb7, 0x6c, 0xc6, 0xaa, 0xe1, 0x1f, 0x26, 0x87, 0x15, 0x41, 0x12, 0x29,
-  0x97, 0x2c, 0x8e, 0xf0, 0xb5, 0x19, 0x2f, 0x7b, 0xdd, 0xab, 0x12, 0x1f,
-  0x59, 0x7b, 0x02, 0x48, 0x94, 0xe2, 0x0c, 0x48, 0x8f, 0x5a, 0xa7, 0xc0,
-  0x1e, 0x02, 0x9a, 0x01, 0x7b, 0x04, 0xfe, 0x45, 0x27, 0x00, 0x68, 0x77,
-  0x57, 0xee, 0xe5, 0xfe, 0x43, 0x00, 0x57, 0x42, 0xef, 0x4f, 0xbd, 0x38,
-  0x49, 0xfa, 0x03, 0x4e, 0x52, 0x8b, 0x46, 0xe1, 0x5f, 0xbb, 0xd3, 0x22,
-  0xbc, 0x0e, 0x9e, 0x10, 0xf3, 0xd7, 0x74, 0x59, 0xe4, 0x9f, 0x00, 0xca,
-  0x36, 0xaa, 0xc4, 0x73, 0x62, 0x08, 0x5f, 0x41, 0x7d, 0x7d, 0xc4, 0x8a,
-  0x4d, 0xa2, 0x18, 0x73, 0x8c, 0xe2, 0x9d, 0x79, 0x39, 0x99, 0x96, 0x73,
-  0x8a, 0xd0, 0x73, 0x1b, 0x7d, 0x9f, 0x7f, 0x14, 0x62, 0x3d, 0x12, 0xe1,
-  0x2f, 0xb2, 0x86, 0x0c, 0xbf, 0xb5, 0xbe, 0xe9, 0xb6, 0xbf, 0xff, 0x12,
-  0xf5, 0x86, 0x16, 0x04, 0xfc, 0x5d, 0x53, 0xcf, 0x92, 0x5d, 0xf6, 0x1e,
-  0xcc, 0x96, 0x51, 0xfb, 0xd6, 0x90, 0xf5, 0x78, 0xda, 0x65, 0xf7, 0xc8,
-  0xad, 0x0f, 0x02, 0xf4, 0x18, 0x18, 0xc1, 0x32, 0xf5, 0xbb, 0x32, 0x17,
-  0x79, 0xd7, 0xb3, 0x88, 0x52, 0x0a, 0x2e, 0x00, 0x23, 0x95, 0xa8, 0xd6,
-  0xb2, 0xc4, 0x33, 0xb3, 0xbf, 0x2b, 0x00, 0xd8, 0xaa, 0x07, 0x02, 0x56,
-  0xa5, 0x7c, 0x46, 0x9b, 0x7f, 0x47, 0xe3, 0x93, 0xb3, 0x10, 0x3f, 0xeb,
-  0xca, 0x4c, 0xb0, 0xa8, 0xa3, 0x64, 0x0d, 0xc4, 0x28, 0xe8, 0xdf, 0x20,
-  0x44, 0x91, 0xda, 0x82, 0x9d, 0x41, 0xf0, 0xf6, 0x0f, 0xd4, 0x17, 0x2f,
-  0x82, 0x74, 0x43, 0xb5, 0x47, 0xb5, 0x5f, 0x15, 0x6f, 0xc4, 0x76, 0x75,
-  0x59, 0x0d, 0x4a, 0x79, 0xd4, 0xf9, 0x91, 0xfa, 0xe3, 0xa2, 0x9f, 0x89,
-  0x1a, 0xc5, 0x4c, 0x79, 0x94, 0x2b, 0x43, 0x44, 0xdd, 0x84, 0xb4, 0xb1,
-  0xb5, 0x0e, 0x79, 0x61, 0xb9, 0x48, 0xaa, 0xe4, 0xe5, 0x75, 0x4f, 0x9c,
-  0x99, 0x90, 0x16, 0xf6, 0x79, 0xc9, 0x05, 0xd2, 0x34, 0xdd, 0x62, 0xcb,
-  0x28, 0xeb, 0x5a, 0x4f, 0x9e, 0x5a, 0x24, 0x92, 0x6d, 0x57, 0x4c, 0x3e,
-  0xa0, 0x8b, 0x5e, 0x75, 0x9a, 0x34, 0x01, 0xc8, 0x4d, 0x14, 0x49, 0x8e,
-  0xad, 0x54, 0xd9, 0xd8, 0xc8, 0xd7, 0xbd, 0xad, 0x6a, 0xa7, 0x39, 0xe1,
-  0x79, 0xe1, 0x6f, 0xf7, 0xc0, 0x3b, 0xcd, 0xb2, 0x49, 0xa4, 0x92, 0xd9,
-  0xde, 0xc2, 0xdb, 0x9a, 0x59, 0x1f, 0x8f, 0xf7, 0x9d, 0xa1, 0xff, 0x1d,
-  0x06, 0xbc, 0x6f, 0x07, 0x9c, 0xdf, 0x77, 0xdd, 0x5a, 0xa0, 0xf6, 0xdb,
-  0xd4, 0x4f, 0xcd, 0xeb, 0x94, 0x9e, 0x01, 0x5b, 0x40, 0xd8, 0x48, 0x84,
-  0x0e, 0xc3, 0x93, 0xc8, 0x65, 0xc1, 0xe9, 0x25, 0x80, 0xb4, 0x41, 0x88,
-  0x07, 0x91, 0x6b, 0x6b, 0x0e, 0x89, 0x48, 0x13, 0xde, 0x3b, 0xdb, 0x2c,
-  0x85, 0x64, 0xc2, 0xe6, 0x78, 0x11, 0x23, 0x93, 0xfa, 0xd7, 0x4e, 0xe2,
-  0x0f, 0xc9, 0xb4, 0xf0, 0x40, 0xdb, 0xb2, 0x3c, 0xc4, 0xf3, 0xef, 0xb3,
-  0xd7, 0x46, 0x99, 0xcf, 0x85, 0xce, 0x36, 0x39, 0xa6, 0x37, 0xc2, 0xc6,
-  0xfe, 0x82, 0x56, 0x88, 0x04, 0xd8, 0x2b, 0xbb, 0x85, 0x22, 0xb6, 0xc1,
-  0xce, 0x92, 0xbd, 0x27, 0x04, 0xca, 0xc8, 0xd2, 0x1d, 0x4a, 0x49, 0x09,
-  0x52, 0xdb, 0x55, 0xd1, 0x4c, 0x7a, 0xd7, 0xb3, 0x72, 0x3c, 0x36, 0xc3,
-  0xee, 0x79, 0x6a, 0xa9, 0xf9, 0x72, 0xe0, 0x47, 0xf3, 0xfb, 0x61, 0x7d,
-  0xf2, 0x7d, 0xc6, 0x96, 0x30, 0x53, 0x00, 0xae, 0x64, 0x4d, 0x87, 0x92,
-  0xef, 0x2b, 0xef, 0x6a, 0xe4, 0xa6, 0x11, 0x94, 0xab, 0x6c, 0x0d, 0x1a,
-  0x98, 0x87, 0x5a, 0x96, 0xec, 0x40, 0xfa, 0xa9, 0x76, 0x90, 0xf1, 0x42,
-  0xc9, 0x2a, 0xc8, 0x9b, 0x63, 0x79, 0x87, 0xe0, 0x92, 0xb2, 0x3f, 0x79,
-  0x1d, 0xfa, 0x55, 0x31, 0x0b, 0xed, 0x01, 0xf5, 0xfe, 0x93, 0xfe, 0xd8,
-  0xeb, 0xd3, 0x7f, 0xf7, 0xff, 0xab, 0x07, 0xd7, 0xeb, 0xc1, 0xce, 0xce,
-  0xed, 0xed, 0xed, 0x50, 0xe8, 0xcc, 0x87, 0x66, 0xc9, 0x36, 0xc2, 0xfc,
-  0x1d, 0xe2, 0x53, 0x5a, 0xf1, 0x81, 0xcb, 0xa4, 0x97, 0xcf, 0xaf, 0x7f,
-  0xdc, 0x1b, 0xec, 0xed, 0xee, 0xee, 0xfe, 0x3c, 0x5c, 0xd0, 0x14, 0x5f,
-  0xa1, 0x59, 0xf3, 0x5f, 0xbf, 0xd9, 0x1d, 0xee, 0xc9, 0xce, 0x46, 0xbc,
-  0x38, 0x08, 0x7e, 0x69, 0xb9, 0x18, 0x0a, 0x26, 0xc7, 0xe6, 0xad, 0x7c,
-  0xe0, 0x89, 0x19, 0x8e, 0x05, 0xa5, 0xab, 0xb3, 0x61, 0xb9, 0x52, 0x0d,
-  0x39, 0x4f, 0x9f, 0x3c, 0xda, 0xdf, 0x4f, 0x58, 0xe5, 0xe0, 0x24, 0x13,
-  0x0e, 0x48, 0x52, 0x7e, 0xb1, 0x54, 0xf4, 0xe4, 0xdb, 0x6c, 0x42, 0x44,
-  0x4b, 0x15, 0x17, 0x0b, 0x0c, 0x6a, 0xc7, 0x59, 0xa8, 0x0f, 0xf6, 0xad,
-  0xb9, 0x2a, 0x09, 0x7f, 0x5b, 0x4e, 0xef, 0x5c, 0xc3, 0x66, 0x97, 0x57,
-  0x24, 0x5d, 0xa9, 0x26, 0x97, 0x57, 0x7f, 0x3e, 0xad, 0x63, 0x7a, 0x9b,
-  0x4d, 0x18, 0xc1, 0x35, 0x07, 0x5a, 0xbf, 0x82, 0xe6, 0x17, 0xa5, 0x5f,
-  0xc0, 0xc8, 0xb5, 0xac, 0xa4, 0x9e, 0x00, 0x82, 0x95, 0xb7, 0xe9, 0x5d,
-  0xeb, 0xba, 0x37, 0x33, 0xfe, 0xdc, 0xfc, 0x67, 0x55, 0x29, 0xe8, 0x14,
-  0x5b, 0x09, 0x23, 0x6c, 0x26, 0x37, 0x01, 0x4f, 0x2d, 0x04, 0x38, 0x29,
-  0xef, 0x37, 0x66, 0x34, 0x96, 0x06, 0x76, 0x45, 0xb5, 0x25, 0x2f, 0xbb,
-  0xce, 0x34, 0x4a, 0xa4, 0xda, 0x28, 0x5e, 0xcc, 0x05, 0x58, 0x59, 0x2a,
-  0xae, 0xaa, 0x9a, 0x67, 0x8b, 0x14, 0x01, 0xf7, 0x95, 0xd7, 0x9a, 0xfd,
-  0x37, 0xb9, 0xc9, 0xe6, 0x22, 0x31, 0xb7, 0x14, 0xf6, 0xd4, 0x93, 0x4d,
-  0xd8, 0x0b, 0x2f, 0xb5, 0xde, 0x95, 0xfc, 0xc6, 0x0c, 0x66, 0x5b, 0xb2,
-  0xe7, 0xec, 0x3d, 0x27, 0x05, 0x07, 0xae, 0x97, 0x64, 0x37, 0x8e, 0x53,
-  0xb9, 0x50, 0x94, 0xcf, 0x7a, 0x15, 0x3a, 0x91, 0x84, 0x62, 0x56, 0xe1,
-  0x1e, 0x23, 0x0f, 0xcc, 0x40, 0xb4, 0x1f, 0xb9, 0x56, 0x11, 0x24, 0x36,
-  0x27, 0xf6, 0xe5, 0xc9, 0xd1, 0x25, 0x52, 0xd9, 0xfa, 0xc0, 0xbc, 0xf7,
-  0x91, 0xbf, 0x16, 0x96, 0x84, 0x38, 0x87, 0x87, 0x04, 0x1b, 0x55, 0x4a,
-  0xe6, 0xa5, 0x0e, 0x26, 0xd3, 0x29, 0x32, 0xd0, 0x4f, 0x3c, 0x62, 0xf1,
-  0x18, 0xfe, 0xaf, 0xa5, 0x27, 0x5a, 0x70, 0xd1, 0xe3, 0x27, 0xc3, 0x5d,
-  0x1e, 0x23, 0x4d, 0xa1, 0x04, 0xc1, 0x25, 0xe3, 0x02, 0x8e, 0xa4, 0x5a,
-  0x08, 0x2c, 0xd3, 0x15, 0xe4, 0xbb, 0xda, 0x9d, 0x7e, 0xc2, 0x7c, 0xad,
-  0x9c, 0x10, 0xad, 0xbf, 0xf5, 0x10, 0x4f, 0x6b, 0x75, 0x53, 0xbf, 0x00,
-  0x38, 0x6d, 0xcb, 0x0e, 0xcd, 0x26, 0x85, 0x05, 0x4a, 0x9b, 0x2b, 0x25,
-  0x6c, 0x09, 0xd1, 0x5a, 0xba, 0x28, 0x03, 0x23, 0x3e, 0xac, 0x26, 0x2b,
-  0xfa, 0xae, 0xc2, 0x43, 0x49, 0xb7, 0x80, 0x5c, 0x59, 0x92, 0x40, 0xd0,
-  0x2a, 0x8b, 0x16, 0xd3, 0x50, 0x82, 0xe2, 0x19, 0x83, 0xaf, 0xa5, 0xb2,
-  0x25, 0x6b, 0xca, 0xb1, 0x04, 0x0e, 0x5a, 0xca, 0x6d, 0x45, 0xaa, 0xb1,
-  0xe5, 0xaa, 0x2a, 0xe7, 0x90, 0x1c, 0x86, 0x09, 0xaf, 0xbb, 0xf4, 0x97,
-  0xab, 0x93, 0xd2, 0x55, 0x12, 0xd6, 0x6d, 0xc9, 0x0a, 0xf0, 0x14, 0x08,
-  0xd5, 0x0b, 0x8b, 0x74, 0x3d, 0x81, 0xb4, 0x13, 0x60, 0xee, 0xc1, 0x43,
-  0xd5, 0xfb, 0x82, 0x1c, 0xe2, 0x2f, 0x0e, 0x7b, 0xad, 0x13, 0x19, 0xab,
-  0x11, 0x51, 0xb3, 0x74, 0x6b, 0xdb, 0x32, 0x22, 0xd3, 0x48, 0xee, 0x67,
-  0x9f, 0x1a, 0xbe, 0xf9, 0xaf, 0x50, 0xed, 0xb1, 0x78, 0xb4, 0x9f, 0xd4,
-  0x77, 0x46, 0x8d, 0x98, 0xfb, 0x93, 0xd0, 0x2d, 0xef, 0x19, 0x0d, 0x03,
-  0xb4, 0x6a, 0xe2, 0xb0, 0xdc, 0x7a, 0x47, 0xaf, 0x1c, 0xe2, 0x15, 0xa9,
-  0xa1, 0xa1, 0x98, 0x9b, 0x07, 0xd4, 0x8c, 0x2d, 0xb5, 0x80, 0x55, 0x32,
-  0x9e, 0xa5, 0xc5, 0x07, 0x5b, 0xe4, 0x92, 0x5b, 0xea, 0x53, 0x25, 0x36,
-  0xce, 0x07, 0x73, 0x3f, 0x14, 0x10, 0x0e, 0x6e, 0xc6, 0x4e, 0x73, 0x7f,
-  0x5f, 0x92, 0x66, 0x3a, 0x4f, 0x2b, 0x4a, 0x14, 0xc2, 0x9c, 0x09, 0x80,
-  0x71, 0x65, 0x59, 0x5a, 0x14, 0x30, 0xb5, 0x15, 0x4c, 0xc3, 0x2b, 0x8c,
-  0x0b, 0xce, 0x33, 0x7b, 0x87, 0xa2, 0x40, 0x57, 0xd4, 0x5e, 0xf9, 0xed,
-  0xe2, 0x8a, 0x4b, 0x5d, 0x09, 0x23, 0xb5, 0xcd, 0x7f, 0x0f, 0x34, 0xf8,
-  0xb1, 0x4a, 0x7e, 0xdb, 0xdb, 0xc3, 0x56, 0x17, 0xb5, 0xe1, 0x12, 0xbf,
-  0x5c, 0x1c, 0x2b, 0x78, 0x2e, 0x4c, 0x13, 0x4b, 0xb3, 0x1a, 0x26, 0x67,
-  0xce, 0xa0, 0x2c, 0xfa, 0xa0, 0xb6, 0x6c, 0xaa, 0x89, 0x98, 0x93, 0xf8,
-  0xfb, 0x40, 0x6b, 0x3f, 0xc7, 0x66, 0x00, 0xe5, 0x53, 0x08, 0xda, 0x74,
-  0x67, 0xaf, 0x81, 0x56, 0xef, 0xfa, 0xae, 0x1e, 0xde, 0x0c, 0x7c, 0x5b,
-  0x25, 0x15, 0xf0, 0x92, 0xc2, 0x0e, 0x01, 0xba, 0x92, 0x07, 0x11, 0x2f,
-  0x8e, 0x87, 0x26, 0x45, 0x02, 0x73, 0x35, 0x06, 0x79, 0xbc, 0x96, 0x48,
-  0xe6, 0xcc, 0xdc, 0x8b, 0x1c, 0x73, 0x76, 0x75, 0xe1, 0x8d, 0x48, 0x2b,
-  0x8b, 0x7e, 0xc0, 0xd2, 0x42, 0x71, 0x43, 0xf6, 0x39, 0x11, 0xae, 0x67,
-  0x2e, 0xd5, 0x32, 0x33, 0xeb, 0x6b, 0xe6, 0xf7, 0x74, 0x6f, 0xfa, 0x5f,
-  0xbe, 0xa7, 0xac, 0x1f, 0xd7, 0x1d, 0xd0, 0xc5, 0x30, 0xbb, 0xb0, 0xcf,
-  0xd9, 0x38, 0xc3, 0x15, 0xea, 0x0c, 0x4b, 0x83, 0x6f, 0x8d, 0x0d, 0x9f,
-  0x55, 0xa5, 0x11, 0x24, 0xdf, 0x3d, 0x51, 0xc4, 0x8d, 0x94, 0x09, 0x95,
-  0x3b, 0x4b, 0xd6, 0xf2, 0xce, 0x16, 0x2e, 0x8f, 0xba, 0x52, 0x58, 0x46,
-  0xea, 0x9b, 0x72, 0x69, 0xb1, 0x29, 0x57, 0x74, 0x97, 0x85, 0xae, 0x33,
-  0xd3, 0x47, 0x1a, 0x59, 0x08, 0xe0, 0x69, 0xd5, 0xb4, 0x05, 0x84, 0x7c,
-  0x39, 0x21, 0xfd, 0x87, 0x9c, 0x3e, 0x54, 0xd3, 0x74, 0xdc, 0xa4, 0x5c,
-  0x52, 0xd1, 0xf6, 0xfc, 0x32, 0x27, 0xc7, 0xc0, 0x50, 0xb6, 0x44, 0x14,
-  0xc0, 0x2d, 0x97, 0x9f, 0x63, 0x83, 0xed, 0x04, 0x10, 0x49, 0xdb, 0xa8,
-  0x6f, 0xe8, 0xbe, 0xa6, 0x7b, 0x04, 0xc6, 0xe0, 0x46, 0x9c, 0xdd, 0x94,
-  0x26, 0xed, 0xed, 0xe5, 0xe9, 0x9b, 0x7e, 0xe7, 0x24, 0xc8, 0xc5, 0xe7,
-  0x15, 0x04, 0x96, 0xad, 0xa9, 0x24, 0x08, 0x61, 0xfe, 0xa7, 0x2c, 0x6c,
-  0x3f, 0xb1, 0xa9, 0x24, 0x9c, 0x7f, 0x4c, 0x53, 0xd7, 0x97, 0x70, 0x75,
-  0x25, 0x49, 0x0a, 0x6a, 0x1f, 0xf2, 0xbc, 0x86, 0x1e, 0x4f, 0x82, 0xac,
-  0xd5, 0xf0, 0x1d, 0xc0, 0xa4, 0x36, 0x72, 0xc7, 0x6c, 0x47, 0xaf, 0x08,
-  0x50, 0xb8, 0xaf, 0xcb, 0xd6, 0xa1, 0xf1, 0x17, 0x8c, 0xb6, 0x21, 0x73,
-  0x40, 0x27, 0x2f, 0xcb, 0xdb, 0x62, 0x70, 0x4a, 0x99, 0x66, 0xc9, 0x69,
-  0x79, 0x4d, 0x56, 0xd3, 0xdb, 0xb8, 0x75, 0xff, 0xee, 0xfc, 0x6d, 0xb2,
-  0x45, 0xd2, 0x39, 0x39, 0xb7, 0xfc, 0x42, 0xf4, 0xe8, 0xb6, 0x68, 0xa1,
-  0x35, 0xdf, 0x5c, 0xd2, 0x9b, 0x7e, 0x72, 0xfc, 0xc3, 0xe1, 0x9b, 0xf3,
-  0xd3, 0xe3, 0x9f, 0x56, 0xa0, 0x05, 0xe8, 0xc7, 0x5f, 0x79, 0x9a, 0x39,
-  0x3c, 0xf9, 0x84, 0x28, 0x31, 0x3d, 0xb9, 0x5b, 0x25, 0x0b, 0xf8, 0xf8,
-  0xe8, 0x16, 0x1c, 0x8d, 0xce, 0x4f, 0x06, 0x4a, 0x0d, 0xc4, 0x95, 0xa3,
-  0xf2, 0x82, 0x94, 0x68, 0x3e, 0xc0, 0xca, 0xde, 0xfd, 0x6d, 0x18, 0xb4,
-  0xb0, 0xe7, 0xa1, 0x9f, 0xbc, 0x55, 0xa4, 0x4a, 0x1f, 0x8b, 0x4e, 0x52,
-  0xfa, 0x65, 0x7e, 0x8d, 0xc8, 0x43, 0x87, 0xe8, 0x87, 0x76, 0x87, 0x98,
-  0x5c, 0x01, 0xef, 0x96, 0x91, 0x3e, 0x1a, 0x4e, 0xaa, 0xb3, 0x19, 0x3b,
-  0xb9, 0x56, 0x4a, 0x51, 0x00, 0xf2, 0x78, 0x15, 0x81, 0x08, 0x0e, 0x42,
-  0x2a, 0x82, 0x10, 0x1e, 0x5b, 0xa9, 0x27, 0xaa, 0x2b, 0xef, 0x10, 0x96,
-  0x1e, 0x72, 0xe7, 0x58, 0xe1, 0x70, 0x60, 0xec, 0xf7, 0x65, 0x72, 0xd0,
-  0xfb, 0x1d, 0x2f, 0x12, 0xdf, 0x23, 0x18, 0x29, 0x02, 0x61, 0xc9, 0xa1,
-  0xac, 0xff, 0x98, 0xd3, 0xf2, 0xd9, 0xb5, 0xa9, 0x8e, 0x19, 0xf8, 0x44,
-  0xcd, 0x49, 0x17, 0xb5, 0x6f, 0xbc, 0xbc, 0xbe, 0x8e, 0xa4, 0xee, 0x53,
-  0xa5, 0xa8, 0x2c, 0xc3, 0xf5, 0x6c, 0xb4, 0x98, 0xcd, 0x3a, 0x61, 0x3f,
-  0xaf, 0xe9, 0x7f, 0x0f, 0xf1, 0x2b, 0xa5, 0x4d, 0x29, 0xa7, 0x3d, 0x2e,
-  0x75, 0xcc, 0xae, 0xea, 0x9a, 0x90, 0x86, 0x61, 0x73, 0x1c, 0xa1, 0xdb,
-  0xfc, 0x72, 0x53, 0xf9, 0xcf, 0x8d, 0xc2, 0xcf, 0xb7, 0x2f, 0x34, 0x9d,
-  0x1e, 0xab, 0x3a, 0x63, 0x2e, 0x3f, 0xd6, 0x4f, 0x36, 0x9f, 0x6f, 0xca,
-  0x73, 0xbd, 0xe8, 0x45, 0xce, 0xef, 0x70, 0x24, 0x88, 0x15, 0xe0, 0x89,
-  0xf5, 0x95, 0x91, 0x92, 0x90, 0x4f, 0xa7, 0x59, 0x21, 0xae, 0x13, 0x2a,
-  0xde, 0x23, 0x6c, 0x5e, 0x7d, 0xb9, 0x59, 0xba, 0x17, 0x13, 0xba, 0xae,
-  0x3d, 0xe7, 0xbe, 0x6e, 0xfe, 0x59, 0x7b, 0xe0, 0x55, 0xba, 0x23, 0xd7,
-  0xb5, 0xab, 0x3a, 0x23, 0x5f, 0x5d, 0x75, 0x52, 0x10, 0x1f, 0x81, 0x09,
-  0x05, 0x7d, 0x49, 0x2d, 0x48, 0x91, 0xd4, 0xac, 0xe2, 0xf6, 0x3b, 0x59,
-  0x18, 0x88, 0x7f, 0x84, 0x6e, 0xae, 0xc6, 0xb2, 0xd7, 0x51, 0xcb, 0x9b,
-  0x15, 0x95, 0x25, 0xe0, 0x62, 0xb4, 0x54, 0xa1, 0x67, 0xc5, 0xf7, 0xd5,
-  0x03, 0xe8, 0x36, 0x1e, 0xe7, 0x8d, 0x2a, 0x14, 0x96, 0xac, 0x33, 0x3c,
-  0x98, 0x15, 0xf0, 0x05, 0xab, 0x05, 0xd0, 0x0f, 0x99, 0x0b, 0xb8, 0x64,
-  0x8a, 0x52, 0xa5, 0xdb, 0x28, 0x45, 0x3b, 0xa6, 0xa6, 0x50, 0xd6, 0x28,
-  0x67, 0xb2, 0x97, 0x58, 0xd5, 0xae, 0xa7, 0x23, 0x3e, 0x4f, 0x90, 0x49,
-  0x47, 0x33, 0x58, 0x44, 0xed, 0xa6, 0x79, 0x72, 0x13, 0x15, 0x24, 0x01,
-  0x39, 0xaf, 0xb9, 0x1f, 0xa0, 0x09, 0xe1, 0x51, 0x51, 0xf7, 0xf9, 0x77,
-  0x72, 0xaa, 0x22, 0x80, 0xda, 0x97, 0x12, 0x60, 0xf1, 0xa3, 0x16, 0x92,
-  0x14, 0xc2, 0xee, 0x25, 0xd1, 0x64, 0x35, 0x8c, 0xab, 0xc1, 0xe5, 0x1c,
-  0x5e, 0xe0, 0x7a, 0x18, 0x2d, 0x87, 0x5c, 0xc1, 0x7d, 0x5a, 0x64, 0x7a,
-  0xab, 0xb3, 0x1b, 0x16, 0x01, 0x17, 0x7d, 0xbf, 0x14, 0x2e, 0xb5, 0xbe,
-  0x17, 0x21, 0x8e, 0x84, 0xe0, 0x70, 0x7f, 0x3c, 0xb2, 0x35, 0xbc, 0xcd,
-  0xa3, 0x55, 0x5a, 0x71, 0x19, 0xc5, 0xe2, 0x83, 0x62, 0x8c, 0xa8, 0xf1,
-  0xec, 0x53, 0x36, 0x59, 0x36, 0xed, 0x64, 0x07, 0x5f, 0xf9, 0x52, 0x46,
-  0x7f, 0x74, 0x6b, 0x0b, 0x47, 0x41, 0x8d, 0x96, 0x73, 0xe5, 0x60, 0x38,
-  0xe8, 0x6d, 0x4b, 0xb8, 0x8f, 0xc2, 0x40, 0x96, 0x9a, 0x21, 0x16, 0xc7,
-  0xd3, 0x3e, 0x57, 0x19, 0xfb, 0xdd, 0x5c, 0x48, 0x3b, 0xfa, 0x79, 0xae,
-  0x43, 0x1e, 0xf9, 0xf6, 0x2b, 0xf6, 0xd0, 0x78, 0x9f, 0xb6, 0xb5, 0xab,
-  0xc4, 0x79, 0x53, 0x07, 0x47, 0x39, 0xf8, 0x32, 0xca, 0x48, 0x0e, 0x93,
-  0x43, 0x5b, 0x02, 0x56, 0x5f, 0xd5, 0xf9, 0x0f, 0x9c, 0x66, 0x27, 0xe7,
-  0x1f, 0x9f, 0x7a, 0x3e, 0x4f, 0xba, 0xf3, 0xf0, 0x23, 0x2b, 0xf1, 0x83,
-  0x51, 0x7c, 0xa8, 0xc6, 0x8f, 0xcd, 0x1f, 0xdf, 0xd2, 0x1f, 0x24, 0x56,
-  0xc9, 0xc4, 0x64, 0x02, 0x25, 0xf6, 0xd6, 0x85, 0x5b, 0x9b, 0xd2, 0x5f,
-  0xe5, 0x0f, 0x59, 0x74, 0x80, 0xd9, 0x29, 0x27, 0x85, 0xe8, 0x96, 0x1c,
-  0xf3, 0x05, 0x94, 0x5f, 0x6d, 0xa7, 0xaf, 0x79, 0x62, 0x71, 0xa0, 0x2f,
-  0xd8, 0x81, 0x98, 0x7d, 0xa7, 0x0f, 0xcf, 0xc4, 0x88, 0x05, 0x79, 0x19,
-  0xcb, 0x14, 0x32, 0x53, 0xf5, 0x0f, 0x72, 0x68, 0xdb, 0x9c, 0x45, 0x2a,
-  0x62, 0x3c, 0xb7, 0xc8, 0x70, 0xc2, 0x88, 0xba, 0xb8, 0x3f, 0xfb, 0x30,
-  0xe9, 0x98, 0xb1, 0x38, 0x0b, 0x21, 0x5b, 0x96, 0x14, 0x69, 0xd5, 0x90,
-  0x71, 0xb9, 0xcb, 0x1f, 0x21, 0xc1, 0xe0, 0xea, 0xf7, 0x5e, 0x22, 0x4f,
-  0x4e, 0x0e, 0x3c, 0x1f, 0x85, 0x25, 0x57, 0x79, 0xd6, 0xc5, 0x76, 0xb9,
-  0xc2, 0xfc, 0xb0, 0xd8, 0x8a, 0xac, 0x98, 0xac, 0xe8, 0x27, 0x95, 0x0b,
-  0x65, 0x8a, 0x75, 0x48, 0x85, 0x0f, 0x1a, 0xd1, 0x9c, 0x67, 0x73, 0x0a,
-  0x90, 0xd8, 0x7b, 0x91, 0x09, 0x5b, 0xd8, 0x25, 0x40, 0x1f, 0x1b, 0xc4,
-  0x9b, 0x9b, 0x92, 0xfe, 0x46, 0x57, 0x2c, 0xc3, 0x7c, 0xfe, 0x10, 0x44,
-  0xc5, 0xea, 0xbb, 0x62, 0x72, 0xf3, 0xf2, 0xed, 0x28, 0xfe, 0x7a, 0x38,
-  0x38, 0x3c, 0x6f, 0xf4, 0x10, 0xda, 0x0c, 0x52, 0x4a, 0x1b, 0x7c, 0x65,
-  0x46, 0xc9, 0x3b, 0xf4, 0x7e, 0x17, 0x6f, 0xae, 0xf5, 0x82, 0xf5, 0x17,
-  0x91, 0x62, 0xc1, 0x42, 0x5c, 0x34, 0x4f, 0xc0, 0x88, 0x07, 0x29, 0x1d,
-  0x05, 0x14, 0xb8, 0x0a, 0x14, 0x68, 0x7b, 0xa6, 0x29, 0xaa, 0x80, 0x4a,
-  0xb6, 0x68, 0xb2, 0xf2, 0x80, 0x4a, 0xdd, 0x7d, 0x8d, 0xf2, 0x0a, 0xfa,
-  0xc7, 0x2f, 0x59, 0xe6, 0x53, 0x2a, 0x85, 0x1c, 0x09, 0x42, 0xf9, 0x33,
-  0xd4, 0x82, 0x8d, 0x78, 0x31, 0x42, 0xb3, 0x57, 0x67, 0xf4, 0x3a, 0x6f,
-  0xd3, 0xbe, 0xec, 0x56, 0xfc, 0xa8, 0x5a, 0x35, 0x24, 0x33, 0x29, 0xfb,
-  0xdf, 0x7c, 0x1d, 0xde, 0x9e, 0x2f, 0xdf, 0xae, 0xf8, 0x1c, 0xfd, 0x66,
-  0xa0, 0x79, 0x23, 0xa2, 0x11, 0x78, 0x2a, 0x7d, 0x38, 0x17, 0x71, 0x2a,
-  0xdf, 0xf6, 0x2f, 0xef, 0x93, 0x12, 0xe6, 0x09, 0xf9, 0x63, 0xed, 0x83,
-  0x82, 0x7a, 0x8d, 0x7f, 0x8a, 0xe0, 0xb0, 0x5b, 0x0c, 0x04, 0x4b, 0x2e,
-  0x38, 0xd8, 0x77, 0x2e, 0x9a, 0xf0, 0x76, 0x64, 0x89, 0x56, 0xa2, 0x95,
-  0x9d, 0x19, 0x94, 0xc4, 0xe8, 0x47, 0x48, 0x2e, 0xec, 0xf3, 0x1f, 0x3b,
-  0xfb, 0x16, 0xc2, 0x64, 0x93, 0x7f, 0x70, 0x48, 0xcd, 0x05, 0x1e, 0x2a,
-  0x08, 0x45, 0xfe, 0x69, 0x84, 0xb8, 0xf3, 0x8a, 0xdd, 0x8c, 0x00, 0x35,
-  0x47, 0xa6, 0xed, 0x1c, 0x50, 0x47, 0x55, 0x13, 0x8b, 0xf6, 0x64, 0xc4,
-  0x4e, 0x9e, 0xfb, 0x36, 0x53, 0x1e, 0x41, 0x5d, 0xad, 0xe3, 0x58, 0x7b,
-  0x63, 0x94, 0x24, 0xba, 0x5c, 0xef, 0x3f, 0xc6, 0x76, 0xdf, 0xd8, 0x77,
-  0x92, 0xad, 0xb1, 0xb9, 0xb1, 0x3d, 0xce, 0x04, 0x92, 0x37, 0x8f, 0x01,
-  0xf1, 0x8e, 0x37, 0xf7, 0xe4, 0xf3, 0x27, 0x8f, 0xb7, 0xb7, 0xfb, 0x89,
-  0xd6, 0x7a, 0x26, 0x10, 0xc5, 0x98, 0x32, 0x4d, 0x72, 0x92, 0x5b, 0x35,
-  0x2b, 0xb3, 0x66, 0x82, 0x6f, 0xe0, 0x7b, 0xf5, 0x1c, 0x31, 0xf1, 0xe6,
-  0xe8, 0x1e, 0xd3, 0x57, 0x69, 0x11, 0xc9, 0x04, 0x87, 0x44, 0xb7, 0x66,
-  0x70, 0xaa, 0x32, 0xb1, 0x76, 0x9e, 0xf9, 0x95, 0x52, 0x01, 0xb1, 0x24,
-  0xe7, 0x87, 0xa2, 0x70, 0x06, 0x42, 0x8a, 0xae, 0xd8, 0x7a, 0x08, 0x18,
-  0x3c, 0xe7, 0x6b, 0x8f, 0xfe, 0xa0, 0xfd, 0x7c, 0xa3, 0xb5, 0x0b, 0xcf,
-  0x97, 0xe3, 0x99, 0xb9, 0x81, 0x46, 0x54, 0xfd, 0xf7, 0x53, 0x72, 0x9a,
-  0x4b, 0x19, 0x50, 0xb1, 0x15, 0x14, 0x48, 0xb7, 0xea, 0xce, 0xe1, 0x81,
-  0x23, 0xdf, 0x1a, 0x5b, 0xad, 0x85, 0x2c, 0x77, 0xd9, 0x7a, 0xac, 0xb7,
-  0xf5, 0x16, 0xfc, 0xad, 0x7a, 0x79, 0x35, 0x58, 0x35, 0xb0, 0x4f, 0x59,
-  0xed, 0x99, 0x71, 0x83, 0x5b, 0x52, 0x10, 0xc1, 0x8b, 0x40, 0xae, 0xe9,
-  0xe4, 0x39, 0xab, 0x82, 0xab, 0xcb, 0xf0, 0x69, 0x7e, 0xaa, 0xaf, 0x34,
-  0x42, 0xff, 0x86, 0x1b, 0x37, 0xbd, 0x22, 0xa0, 0x29, 0xa3, 0xea, 0x66,
-  0x19, 0x2a, 0x60, 0x93, 0x20, 0x0b, 0x10, 0xd5, 0xb6, 0x92, 0xb8, 0x98,
-  0xf7, 0x89, 0x78, 0x29, 0xc4, 0x27, 0x0b, 0xbc, 0x54, 0x0a, 0xae, 0x0b,
-  0x78, 0x6b, 0x98, 0x62, 0x81, 0x5d, 0xc3, 0x66, 0x00, 0xd3, 0x98, 0x05,
-  0xd6, 0x76, 0xda, 0x6b, 0xfe, 0x6b, 0xcd, 0x6e, 0x2d, 0xf9, 0x4a, 0xe8,
-  0x64, 0x89, 0x95, 0x47, 0x9c, 0x99, 0xc9, 0x20, 0xe3, 0x35, 0xe9, 0x71,
-  0x7f, 0x28, 0x73, 0x81, 0xee, 0x10, 0x8d, 0x88, 0x02, 0x51, 0xa3, 0x1a,
-  0x3e, 0xeb, 0xc8, 0xd2, 0x3e, 0x6c, 0xef, 0x34, 0x12, 0x22, 0x15, 0x9d,
-  0xef, 0x2b, 0x05, 0xe6, 0xf4, 0x34, 0x9e, 0xdb, 0x32, 0xee, 0x6d, 0x73,
-  0x76, 0x56, 0x22, 0x49, 0xb0, 0x1c, 0xe4, 0x46, 0x0d, 0x52, 0x5a, 0x35,
-  0xd3, 0xe8, 0xa0, 0x17, 0x57, 0x7c, 0xed, 0x1c, 0xa0, 0x56, 0x00, 0xac,
-  0xd0, 0x96, 0x85, 0xa6, 0x5f, 0x51, 0x83, 0x9c, 0xf0, 0xba, 0x4d, 0xde,
-  0x2c, 0x43, 0xe9, 0x28, 0x51, 0x3f, 0xa4, 0x0c, 0xc3, 0xd3, 0x4c, 0x2b,
-  0xe1, 0xf2, 0x7a, 0x61, 0x8e, 0x11, 0x7e, 0x8f, 0x2a, 0x7d, 0xd5, 0x89,
-  0x3d, 0xcd, 0x48, 0x86, 0x9c, 0x95, 0xb7, 0x01, 0xe4, 0x97, 0xdc, 0xa9,
-  0xae, 0x77, 0xed, 0x64, 0x0e, 0xd3, 0xc0, 0x9f, 0xfe, 0x53, 0x7f, 0xf9,
-  0x9e, 0x26, 0xeb, 0xbf, 0x74, 0xb2, 0xa4, 0xdb, 0x69, 0x90, 0xb9, 0x0a,
-  0x3b, 0xf8, 0x4f, 0x98, 0x94, 0xbf, 0x11, 0x4a, 0x85, 0x67, 0x86, 0x38,
-  0x23, 0xd0, 0xdc, 0x9f, 0x86, 0x56, 0xdf, 0xd5, 0x26, 0x28, 0x0f, 0x8f,
-  0xad, 0xfa, 0xf1, 0x5d, 0xe0, 0x3b, 0xa2, 0x3d, 0xf8, 0x53, 0xd1, 0x07,
-  0xff, 0xa5, 0x31, 0xbd, 0x28, 0x71, 0x9e, 0x6b, 0xb9, 0xf1, 0x32, 0xfe,
-  0x54, 0x09, 0x05, 0x84, 0x31, 0x3a, 0x4c, 0xc7, 0xc9, 0x20, 0xe3, 0x9f,
-  0x87, 0x16, 0x00, 0x21, 0x68, 0x0e, 0xb0, 0x1a, 0x7f, 0x1a, 0xd4, 0x77,
-  0xf3, 0x71, 0x39, 0x93, 0x8d, 0x4e, 0xc3, 0x35, 0x7d, 0xd6, 0x9f, 0xf1,
-  0xb2, 0x20, 0xda, 0x31, 0xf0, 0xd2, 0xb8, 0xfb, 0x51, 0x8e, 0x6e, 0x32,
-  0x51, 0xca, 0xc9, 0x04, 0xe9, 0x38, 0x04, 0xfe, 0x36, 0xdb, 0xfd, 0x4f,
-  0x9a, 0xe4, 0x44, 0xc1, 0x38, 0x2e, 0x46, 0x36, 0xd5, 0xe0, 0xa7, 0x38,
-  0x6a, 0x57, 0x26, 0xc1, 0x44, 0x37, 0x8f, 0xb7, 0x3a, 0xd6, 0xb6, 0x88,
-  0xa5, 0xc0, 0xd3, 0x09, 0x35, 0x1d, 0x7d, 0x8f, 0xac, 0x1b, 0xd9, 0x77,
-  0x47, 0xfc, 0xb3, 0xc1, 0x25, 0x7e, 0xa6, 0x58, 0x04, 0x49, 0xb9, 0xa4,
-  0xe8, 0xb6, 0xe4, 0x44, 0xf6, 0xc3, 0xe4, 0xae, 0x24, 0x06, 0x70, 0x42,
-  0xe9, 0xd8, 0x22, 0xbc, 0xaf, 0xf4, 0x30, 0xbd, 0x67, 0xde, 0x09, 0x63,
-  0xf3, 0xaf, 0x6f, 0x0d, 0xd5, 0x0e, 0x66, 0x4d, 0x3e, 0x4f, 0x05, 0x12,
-  0xc4, 0x18, 0x20, 0xbb, 0x8d, 0x95, 0x1e, 0x06, 0x08, 0x51, 0xb3, 0xdf,
-  0x86, 0xf7, 0x35, 0x47, 0x17, 0xa2, 0x62, 0xdf, 0x05, 0x3d, 0x41, 0xbe,
-  0x27, 0x73, 0xe5, 0xe8, 0xfd, 0xdb, 0x10, 0x47, 0x0a, 0xc1, 0x36, 0xa8,
-  0xe5, 0x7b, 0xc6, 0x5a, 0x6a, 0xa2, 0xb2, 0x78, 0x94, 0x38, 0xe4, 0x73,
-  0xd6, 0x4f, 0x5c, 0x84, 0x50, 0xa1, 0x51, 0x09, 0x05, 0x13, 0xd7, 0x37,
-  0x67, 0x23, 0x8d, 0xd6, 0xbd, 0x7f, 0x42, 0x9e, 0x2e, 0xc4, 0x85, 0x97,
-  0xec, 0x23, 0xcb, 0x29, 0x1b, 0x60, 0x4e, 0x5e, 0xcd, 0x48, 0xac, 0x2e,
-  0x89, 0x88, 0x58, 0x04, 0x98, 0xfe, 0xc3, 0x8b, 0x58, 0xb2, 0xe3, 0x67,
-  0xe0, 0x45, 0x2a, 0x87, 0x5a, 0x2e, 0x7c, 0x7d, 0x73, 0xab, 0x6b, 0x97,
-  0x5f, 0x35, 0x8b, 0xf7, 0xa8, 0xe4, 0xfb, 0x9e, 0xb0, 0x7e, 0x58, 0x33,
-  0xf5, 0xb9, 0xe3, 0x07, 0x98, 0x59, 0x4e, 0xf2, 0x5c, 0x2e, 0xa8, 0x1d,
-  0x6c, 0xf2, 0x59, 0xc9, 0x06, 0xcd, 0x7d, 0xc3, 0x68, 0xa3, 0xea, 0x7c,
-  0x32, 0x81, 0xad, 0x76, 0x3d, 0x9c, 0xc7, 0x41, 0xc7, 0x28, 0x88, 0xff,
-  0x1e, 0xd1, 0x3f, 0xbb, 0x99, 0xcc, 0x75, 0x93, 0x55, 0xf9, 0xc4, 0x2f,
-  0x0e, 0x87, 0x07, 0xb0, 0xa5, 0x98, 0x25, 0x8d, 0xc2, 0x81, 0x51, 0x3a,
-  0xc8, 0xce, 0xff, 0xc1, 0x3b, 0x2a, 0xb5, 0xf0, 0xc8, 0xed, 0x67, 0x41,
-  0x63, 0x89, 0xc4, 0x6b, 0x09, 0x9d, 0xe0, 0xa2, 0xb8, 0x27, 0xf7, 0x8c,
-  0x13, 0x7c, 0xb3, 0xfb, 0xcc, 0xdb, 0x33, 0xcb, 0xd3, 0xda, 0x76, 0x90,
-  0x47, 0x60, 0x8b, 0x31, 0x73, 0x80, 0xe4, 0x26, 0xa0, 0xf4, 0x0c, 0xcf,
-  0x21, 0xc3, 0x78, 0xe8, 0xd6, 0x1f, 0xae, 0x98, 0x19, 0x86, 0x5f, 0x8a,
-  0x0c, 0x70, 0x53, 0xc3, 0x53, 0x22, 0x7a, 0x4e, 0x77, 0x52, 0x62, 0xb8,
-  0xc1, 0xa4, 0x8b, 0x89, 0x57, 0x96, 0x9c, 0x2d, 0x76, 0x6d, 0xa7, 0x42,
-  0x1f, 0xbe, 0x2d, 0xd8, 0x30, 0xd5, 0x91, 0x94, 0x58, 0xe7, 0xbe, 0xe6,
-  0x20, 0x86, 0x3a, 0x0b, 0xbe, 0xbf, 0x6a, 0xc1, 0x55, 0xa1, 0x95, 0x61,
-  0xd1, 0xcf, 0xac, 0x53, 0xc3, 0x1f, 0x54, 0x62, 0x65, 0xd0, 0xec, 0x2e,
-  0x89, 0x52, 0x0e, 0x77, 0xfe, 0xcf, 0xff, 0xfc, 0x93, 0xdd, 0xc8, 0x41,
-  0x00, 0x1a, 0xf3, 0x7d, 0xbe, 0xf0, 0x84, 0x97, 0x57, 0x60, 0xdb, 0x22,
-  0xbc, 0x18, 0xb4, 0x49, 0x27, 0xc2, 0x83, 0x7d, 0xd1, 0x29, 0xbf, 0x6f,
-  0x1a, 0x26, 0xc8, 0xe5, 0x4c, 0xd8, 0x74, 0xf6, 0x12, 0x6e, 0x07, 0xaa,
-  0x25, 0x89, 0x21, 0x7d, 0x72, 0x8e, 0xe2, 0xe1, 0xeb, 0x9b, 0x83, 0x0b,
-  0xc9, 0x1f, 0xd2, 0xfe, 0xb3, 0x95, 0x43, 0x82, 0x1d, 0xa2, 0x43, 0xe2,
-  0xee, 0xfb, 0xb4, 0xe3, 0x82, 0xaf, 0x67, 0x00, 0x4b, 0xbb, 0x9b, 0xeb,
-  0xfb, 0xe0, 0x8d, 0xe1, 0xde, 0x9e, 0x98, 0x6f, 0xbd, 0xb7, 0xb4, 0xb5,
-  0xe6, 0x9a, 0xe6, 0x4f, 0xd3, 0xb7, 0x8d, 0x5e, 0xe0, 0x08, 0x6d, 0x51,
-  0x58, 0x57, 0x76, 0x2a, 0x77, 0x25, 0xae, 0xcf, 0x26, 0x11, 0xf5, 0xb6,
-  0xb3, 0xbf, 0x1e, 0x45, 0xfb, 0xa0, 0xe5, 0xf9, 0x6a, 0xdb, 0x07, 0xd3,
-  0x05, 0xf7, 0x43, 0xd9, 0x5f, 0x74, 0x09, 0x9a, 0x63, 0x23, 0x45, 0x33,
-  0x95, 0x92, 0xe9, 0xd7, 0xed, 0xf3, 0xb0, 0x1f, 0x38, 0x4c, 0xef, 0xeb,
-  0x7a, 0x46, 0x9b, 0x3d, 0xbf, 0xba, 0x33, 0x9d, 0xaa, 0x57, 0xa6, 0xdb,
-  0xfb, 0x77, 0x29, 0x3f, 0xa7, 0x0b, 0xe6, 0x59, 0x96, 0x9b, 0x35, 0x9c,
-  0x7f, 0x8b, 0x8c, 0xd0, 0x0c, 0x4c, 0x99, 0x7a, 0xcf, 0x8c, 0x81, 0x51,
-  0x15, 0x9f, 0x77, 0x01, 0x31, 0x91, 0xa1, 0x56, 0x6f, 0x18, 0x52, 0xd1,
-  0x5a, 0x18, 0x4d, 0xf7, 0x0e, 0xbe, 0xd5, 0x12, 0x35, 0xe2, 0x62, 0xc0,
-  0xed, 0x09, 0xa1, 0xcc, 0xae, 0x60, 0x42, 0x74, 0xfe, 0xdf, 0xb3, 0x58,
-  0x41, 0xe0, 0x56, 0xcb, 0xd2, 0xda, 0xd2, 0xcb, 0xa9, 0xec, 0x0e, 0x0d,
-  0xbd, 0x0e, 0x4e, 0xe9, 0x5e, 0x9c, 0x45, 0x18, 0x61, 0x93, 0x10, 0xb9,
-  0xc0, 0x15, 0x40, 0x00, 0x6a, 0x75, 0x8b, 0xbd, 0x55, 0x4a, 0x8a, 0x1e,
-  0x97, 0x4b, 0xc6, 0x2f, 0x56, 0xfb, 0x22, 0xad, 0xaf, 0x2f, 0x6b, 0xb6,
-  0x2d, 0x96, 0x47, 0xb5, 0x36, 0x81, 0x2c, 0x80, 0xd2, 0x0b, 0x77, 0xc0,
-  0x84, 0xc8, 0xf2, 0x81, 0xdb, 0x49, 0xef, 0xdb, 0x36, 0x42, 0x97, 0xc7,
-  0x45, 0x64, 0x60, 0xea, 0x5c, 0x83, 0xed, 0xa4, 0xec, 0x6c, 0x25, 0x73,
-  0xbf, 0x44, 0x66, 0x8e, 0xee, 0x55, 0x2b, 0xb4, 0x2e, 0xdd, 0x55, 0xdb,
-  0x16, 0x5d, 0xff, 0xf4, 0x01, 0x5f, 0x21, 0xa4, 0x3a, 0x72, 0xe8, 0xbe,
-  0x3b, 0x32, 0x2a, 0x1a, 0x64, 0x0c, 0x2a, 0xa5, 0xbc, 0x31, 0xac, 0x92,
-  0x52, 0xbf, 0x97, 0x90, 0x12, 0x30, 0x61, 0xcb, 0xa6, 0x03, 0xba, 0x4c,
-  0x7e, 0xb1, 0x55, 0x3b, 0x66, 0x49, 0xca, 0x3e, 0x9a, 0x5a, 0xcf, 0xfa,
-  0x76, 0x8c, 0x7c, 0xa6, 0xab, 0xd1, 0x99, 0x1d, 0xec, 0x5f, 0x5a, 0x88,
-  0xdb, 0xde, 0x7b, 0x36, 0x88, 0xbd, 0xe7, 0xbd, 0xa5, 0x38, 0xe7, 0x08,
-  0x07, 0xea, 0xfa, 0xa6, 0x73, 0x73, 0xad, 0x43, 0x18, 0x30, 0x0f, 0x13,
-  0x9f, 0x5f, 0x92, 0x5c, 0xfa, 0x74, 0xc4, 0x99, 0x85, 0xd6, 0x34, 0x58,
-  0xba, 0xae, 0x35, 0x4d, 0xba, 0xb2, 0x4d, 0x21, 0xe6, 0x78, 0xcf, 0x49,
-  0x23, 0x52, 0x85, 0xe8, 0x17, 0xf5, 0x10, 0xcb, 0x9c, 0xf2, 0x27, 0xd7,
-  0x8c, 0xc0, 0x33, 0x9d, 0xd7, 0x7f, 0xd1, 0x17, 0x11, 0xf1, 0x4f, 0x0b,
-  0x9a, 0x3a, 0x79, 0xd8, 0xd4, 0xad, 0x84, 0xac, 0x83, 0xdd, 0xdd, 0xad,
-  0x03, 0xb5, 0x95, 0x52, 0xc4, 0xfd, 0xda, 0xe3, 0x9f, 0xe7, 0x9a, 0x00,
-  0xce, 0xbc, 0x31, 0xb2, 0xb3, 0x5e, 0x56, 0x5c, 0x75, 0xf9, 0x7e, 0x75,
-  0x4f, 0x3d, 0x38, 0xb6, 0x3d, 0xe2, 0xdb, 0x6a, 0x13, 0xe3, 0xaf, 0xe8,
-  0x95, 0x1d, 0x22, 0x26, 0x57, 0xbb, 0xa5, 0x38, 0xf2, 0xdf, 0xa8, 0x57,
-  0xdc, 0xda, 0x43, 0xfa, 0xf4, 0xcf, 0xde, 0x6b, 0xdd, 0x9b, 0x8c, 0xc9,
-  0xbf, 0xf5, 0x86, 0x79, 0x90, 0xb0, 0x5f, 0x7f, 0x95, 0xb5, 0x6e, 0xab,
-  0xfb, 0xcf, 0xec, 0xaa, 0xab, 0x6c, 0x2f, 0x26, 0x42, 0x48, 0x3a, 0xbc,
-  0x4f, 0x17, 0x0b, 0x11, 0x3b, 0xf7, 0x8f, 0x9d, 0x19, 0x8d, 0xb8, 0x86,
-  0x1d, 0x55, 0x51, 0x90, 0x22, 0xf4, 0x4d, 0x59, 0x7e, 0x48, 0x04, 0x5a,
-  0xc2, 0x00, 0x2b, 0x0a, 0x65, 0xae, 0x6f, 0x8e, 0xab, 0x9d, 0xf3, 0xe3,
-  0xc4, 0x5f, 0x3d, 0x1a, 0xbd, 0xde, 0xc9, 0x9a, 0x89, 0x95, 0x81, 0x3b,
-  0x0e, 0x34, 0xc5, 0x66, 0xd9, 0x7d, 0x37, 0x13, 0x84, 0x30, 0x8a, 0xd9,
-  0xd0, 0x3c, 0x58, 0x17, 0xe3, 0x43, 0xa7, 0xa1, 0x6d, 0xa1, 0xfc, 0x4e,
-  0x03, 0x25, 0x46, 0xc8, 0xc4, 0x7e, 0x89, 0x0b, 0x26, 0x67, 0xad, 0xbe,
-  0x6f, 0xdd, 0xb7, 0xcf, 0xc5, 0xb8, 0x69, 0x8f, 0x31, 0x3a, 0x22, 0xb2,
-  0xbb, 0x09, 0x2d, 0xb1, 0x5c, 0xfc, 0x37, 0x2c, 0x2c, 0x32, 0x0b, 0x5c,
-  0x2c, 0x0e, 0xe8, 0x92, 0xfb, 0xbb, 0xbc, 0x20, 0x13, 0x97, 0xad, 0xd8,
-  0xfb, 0xfb, 0x2c, 0x9d, 0x86, 0xc2, 0x1b, 0xe9, 0x36, 0x7a, 0xcd, 0x58,
-  0xdb, 0x5f, 0xd0, 0x67, 0xce, 0xae, 0x93, 0x3e, 0xa0, 0xcb, 0x70, 0x19,
-  0x0a, 0x1b, 0x26, 0x50, 0xd0, 0xd7, 0x79, 0xf1, 0x10, 0xdf, 0x8f, 0x85,
-  0x38, 0x30, 0x66, 0x20, 0x1b, 0xd8, 0x56, 0x25, 0xb3, 0x8b, 0xa3, 0x18,
-  0x94, 0xde, 0x7f, 0xaf, 0x98, 0x48, 0x85, 0x8f, 0x92, 0x44, 0x85, 0xe7,
-  0x0f, 0x9d, 0xa8, 0xc7, 0x82, 0x40, 0x10, 0xf9, 0x64, 0x49, 0x69, 0xcd,
-  0x91, 0xd2, 0x8c, 0x81, 0x97, 0xc3, 0xe8, 0x00, 0x9c, 0xce, 0xf0, 0x91,
-  0x62, 0x9a, 0x2b, 0xd6, 0xc2, 0xea, 0x7a, 0x2b, 0x36, 0x48, 0xde, 0xc8,
-  0x3c, 0x13, 0x3b, 0xeb, 0x6c, 0x66, 0x75, 0xc3, 0x7b, 0xc5, 0x94, 0x11,
-  0x71, 0x8b, 0xda, 0x4b, 0x91, 0xc5, 0x36, 0xe1, 0x8d, 0xda, 0xd7, 0xc3,
-  0xd1, 0x4f, 0x1e, 0xbc, 0x15, 0x84, 0x97, 0x4e, 0xe6, 0xd6, 0xe3, 0xd7,
-  0x23, 0xab, 0x88, 0x99, 0x36, 0xe9, 0x97, 0xe9, 0x44, 0xd5, 0xfd, 0xfb,
-  0x7a, 0x97, 0x72, 0x49, 0x96, 0xf6, 0x24, 0x30, 0x06, 0xa3, 0x75, 0xc9,
-  0x30, 0xb4, 0xe4, 0x21, 0x22, 0x9e, 0x33, 0x9e, 0x19, 0x1a, 0xac, 0x99,
-  0x52, 0xfe, 0x7c, 0xd5, 0xc3, 0x87, 0x6b, 0xa5, 0x51, 0x23, 0x0d, 0x7d,
-  0x45, 0xcf, 0x1f, 0x7e, 0x7c, 0x7e, 0x1f, 0x11, 0xc7, 0x18, 0x1f, 0xd2,
-  0x54, 0x22, 0x87, 0x67, 0x9c, 0x3d, 0xd4, 0x40, 0x26, 0xea, 0xc7, 0xce,
-  0x31, 0xea, 0x0a, 0x08, 0x45, 0xb4, 0xcd, 0xea, 0xf2, 0x7e, 0xcd, 0x40,
-  0x56, 0xa0, 0x85, 0xfe, 0x25, 0x1e, 0x5a, 0x66, 0xa2, 0x25, 0x0b, 0x73,
-  0x46, 0xc7, 0x87, 0xc3, 0x02, 0xf7, 0x7a, 0x9c, 0xa8, 0xa2, 0x6d, 0x74,
-  0x09, 0x44, 0x57, 0x6c, 0xe9, 0x6f, 0xe1, 0x3c, 0x6b, 0x62, 0xab, 0x64,
-  0x9a, 0x03, 0x9e, 0xf8, 0x90, 0x6d, 0x44, 0xde, 0xb0, 0xc8, 0x69, 0x05,
-  0xbf, 0xaf, 0xaa, 0xea, 0xfc, 0x65, 0x9b, 0x82, 0x01, 0x8f, 0x1a, 0xa5,
-  0x42, 0x81, 0xca, 0x92, 0x0c, 0x7e, 0xe5, 0x42, 0x80, 0x6d, 0x42, 0x5a,
-  0xc6, 0xe0, 0x3e, 0x5f, 0xac, 0x7a, 0xad, 0x09, 0x80, 0x87, 0xf4, 0xdc,
-  0xd9, 0xd4, 0xab, 0xc4, 0x29, 0x86, 0xaa, 0x65, 0xa4, 0x3d, 0x58, 0xdf,
-  0x9c, 0x72, 0x59, 0xff, 0x8e, 0x54, 0x66, 0x9f, 0x52, 0x73, 0x0a, 0xa2,
-  0xa0, 0xf4, 0x3a, 0xc5, 0x45, 0x64, 0x13, 0x43, 0xad, 0x53, 0xbd, 0x5d,
-  0xff, 0xad, 0x5d, 0xde, 0xa5, 0x6e, 0xca, 0x20, 0x97, 0x87, 0x94, 0x3d,
-  0x8a, 0x39, 0xe2, 0xb6, 0x30, 0x56, 0x56, 0xca, 0x29, 0x79, 0x85, 0x11,
-  0x09, 0x0d, 0x7b, 0x9f, 0xc5, 0x57, 0x4f, 0x5d, 0xc9, 0xc7, 0xcb, 0x06,
-  0x61, 0x6a, 0x47, 0x91, 0x16, 0x01, 0xa5, 0x4b, 0xb2, 0x18, 0xbe, 0x66,
-  0xfd, 0x9f, 0x9f, 0xa6, 0xd7, 0xc3, 0xb2, 0xca, 0xe9, 0xc6, 0x01, 0xe6,
-  0x4e, 0x5b, 0xa3, 0xad, 0xdf, 0x87, 0x3c, 0x21, 0x9b, 0x22, 0xd6, 0x9c,
-  0x44, 0x5e, 0x12, 0xe5, 0x3b, 0x6b, 0xb7, 0x3b, 0xc7, 0x66, 0x45, 0x00,
-  0xc6, 0xb6, 0xe9, 0xea, 0xfc, 0xc5, 0x22, 0x94, 0x92, 0x65, 0x93, 0xb8,
-  0xc2, 0x67, 0x8a, 0x19, 0xb0, 0x43, 0x76, 0x63, 0xa5, 0xd8, 0xd8, 0x6d,
-  0x5a, 0x21, 0x5f, 0x34, 0xf0, 0x50, 0xe4, 0x75, 0xbd, 0xc4, 0x82, 0xbd,
-  0x3a, 0x39, 0x3d, 0xb6, 0xa0, 0xa0, 0xff, 0xbd, 0x33, 0xa4, 0x09, 0xaf,
-  0x26, 0x01, 0x04, 0x8a, 0x13, 0xb5, 0xbc, 0xac, 0x3b, 0xc9, 0xe4, 0xfa,
-  0xb6, 0xcf, 0x45, 0xa2, 0xf0, 0xe3, 0x56, 0x1a, 0xd7, 0xf1, 0xdb, 0xef,
-  0x4e, 0x2e, 0xce, 0xde, 0xbe, 0x39, 0x7e, 0x6b, 0xbd, 0xbd, 0x74, 0x28,
-  0x62, 0x04, 0xc8, 0x75, 0x18, 0xf4, 0xcd, 0x29, 0x5e, 0x70, 0x8b, 0x4c,
-  0x1b, 0xa6, 0x21, 0x37, 0xe3, 0x94, 0x7f, 0x0d, 0xfd, 0xe6, 0xbc, 0x87,
-  0xd4, 0xe3, 0x4b, 0x71, 0xf8, 0x05, 0xd9, 0xfb, 0x53, 0x0a, 0xbd, 0x0d,
-  0xd9, 0x47, 0x6c, 0x8b, 0xec, 0x11, 0x07, 0xf3, 0xa7, 0x49, 0x26, 0x45,
-  0x86, 0x29, 0x41, 0x63, 0xc3, 0x4e, 0x09, 0x47, 0x89, 0x5c, 0x30, 0xad,
-  0xd5, 0x09, 0xb7, 0xb9, 0xdf, 0x71, 0x22, 0x61, 0x9c, 0xcc, 0x99, 0x01,
-  0xe0, 0x8d, 0x2b, 0xd2, 0xcb, 0xd9, 0x9e, 0xea, 0x9c, 0x57, 0xfe, 0x75,
-  0x0f, 0x42, 0xe7, 0xb2, 0x70, 0xfd, 0x7a, 0x80, 0xdd, 0xb8, 0x9f, 0x37,
-  0x8a, 0x1f, 0xd5, 0x85, 0x70, 0xb0, 0xb3, 0xf3, 0x33, 0x4a, 0x51, 0x7e,
-  0x29, 0xb5, 0x28, 0x43, 0x8e, 0xb5, 0xda, 0xeb, 0x88, 0x88, 0x5c, 0x2f,
-  0x85, 0x87, 0xf6, 0xad, 0x9d, 0x4e, 0x38, 0x07, 0xdf, 0x9f, 0x5f, 0x9c,
-  0xfd, 0xf0, 0xd7, 0xdf, 0xf8, 0x13, 0x1e, 0x56, 0xe7, 0x47, 0x82, 0xb0,
-  0x69, 0xe3, 0x3f, 0xff, 0xaa, 0xaf, 0xad, 0xfd, 0x5c, 0xbb, 0xfd, 0x7e,
-  0xbb, 0x62, 0x72, 0x90, 0xa0, 0x84, 0x0c, 0x49, 0x2e, 0x10, 0xa1, 0xf9,
-  0x92, 0xce, 0xea, 0xb5, 0x00, 0x1a, 0xbe, 0xe1, 0x6a, 0x9f, 0x04, 0x02,
-  0xea, 0x6e, 0x1a, 0xf2, 0x4a, 0x0e, 0x39, 0x6d, 0xcf, 0x01, 0x20, 0x35,
-  0x75, 0x93, 0xd2, 0x33, 0x39, 0x81, 0x13, 0x80, 0x3e, 0x3b, 0x1f, 0x87,
-  0xa7, 0xa7, 0xbf, 0x7e, 0x12, 0xb4, 0xa4, 0x68, 0x7b, 0x1a, 0x50, 0xd1,
-  0xcf, 0x0e, 0x68, 0x60, 0xb5, 0x54, 0x3d, 0x02, 0xeb, 0xa8, 0xee, 0xde,
-  0x9e, 0x49, 0x6f, 0x9e, 0x43, 0x3d, 0x1e, 0xd4, 0x99, 0x51, 0x6a, 0xa9,
-  0x82, 0xba, 0xe5, 0xed, 0xa4, 0x8e, 0xd5, 0x3b, 0x8c, 0x3b, 0x0b, 0x68,
-  0x44, 0xfd, 0x87, 0x18, 0x94, 0xc6, 0xf3, 0xc9, 0x39, 0x45, 0x40, 0x7d,
-  0x97, 0x96, 0xfc, 0x83, 0x4b, 0x8b, 0x4a, 0x8d, 0xd9, 0xab, 0x24, 0x52,
-  0xbb, 0x90, 0x53, 0xb0, 0xe9, 0xbe, 0xad, 0xf2, 0xfa, 0x03, 0x30, 0xf1,
-  0x74, 0x42, 0xa1, 0xf5, 0x6a, 0x92, 0x2c, 0x29, 0xbd, 0xe8, 0xd3, 0x90,
-  0xf3, 0xf8, 0x5d, 0x3a, 0x52, 0x5e, 0xc7, 0x7a, 0x87, 0x12, 0x10, 0x7c,
-  0x15, 0x93, 0x73, 0x8d, 0x5d, 0x93, 0x69, 0x2b, 0x37, 0x46, 0xb8, 0x4f,
-  0x19, 0xd7, 0x52, 0xdb, 0x64, 0xde, 0x58, 0xee, 0x67, 0x5f, 0x73, 0xfa,
-  0x6c, 0x51, 0xe0, 0xbc, 0xa9, 0xb3, 0xd9, 0xd5, 0x0a, 0x22, 0x70, 0x5f,
-  0x60, 0x78, 0x8e, 0x60, 0xc9, 0xa4, 0xb5, 0x05, 0x56, 0xdd, 0x06, 0xa7,
-  0x8c, 0x77, 0x38, 0x9c, 0x43, 0x2f, 0x8e, 0xee, 0x44, 0x89, 0x44, 0xf3,
-  0x86, 0x80, 0x08, 0x49, 0x6c, 0x59, 0x0c, 0x0f, 0x40, 0xc0, 0x9d, 0x48,
-  0x1b, 0x96, 0x74, 0x01, 0x04, 0x82, 0x97, 0xfd, 0x05, 0x2b, 0xc3, 0x7e,
-  0xbe, 0xbc, 0x85, 0x37, 0x0d, 0x3e, 0x25, 0x9a, 0xa9, 0xcf, 0xab, 0xe6,
-  0xe7, 0xea, 0x87, 0x51, 0x39, 0xf3, 0x58, 0xa4, 0xb1, 0x14, 0x7e, 0x11,
-  0x41, 0x9c, 0x37, 0x84, 0x8f, 0x6c, 0x70, 0xe7, 0xf2, 0xa3, 0xa0, 0xb4,
-  0x08, 0x61, 0xe6, 0xbf, 0x4f, 0xef, 0xc8, 0x31, 0xcb, 0x4c, 0x0d, 0x0f,
-  0xe9, 0xa0, 0x63, 0xac, 0xc9, 0x62, 0xa1, 0x99, 0x38, 0xb8, 0x07, 0x1b,
-  0x0e, 0x11, 0x3f, 0x57, 0xde, 0xb7, 0x9b, 0xcd, 0xeb, 0x72, 0xeb, 0xbc,
-  0x78, 0xec, 0x49, 0x17, 0x49, 0x29, 0x7e, 0xf9, 0x4c, 0xb8, 0xca, 0x04,
-  0x21, 0x6e, 0x81, 0xdb, 0x72, 0xc0, 0x12, 0xe1, 0x52, 0xa5, 0x56, 0x85,
-  0x36, 0x44, 0x42, 0x1f, 0x41, 0xce, 0xf0, 0x64, 0x56, 0xe2, 0xda, 0x19,
-  0x13, 0xf6, 0x38, 0x03, 0x73, 0x3d, 0x1f, 0x7c, 0xf3, 0xdf, 0xcb, 0xb3,
-  0xa3, 0xb3, 0x53, 0xf3, 0x97, 0xe3, 0x57, 0x27, 0x3f, 0x38, 0xdd, 0x80,
-  0x73, 0xc1, 0x5d, 0x82, 0x0f, 0x47, 0x57, 0xb5, 0x72, 0xaf, 0x2f, 0x94,
-  0x19, 0x20, 0x16, 0x10, 0x8d, 0x30, 0x02, 0x6c, 0xc3, 0x4d, 0x9b, 0x4a,
-  0x3b, 0x29, 0xbe, 0xdb, 0x2a, 0xa4, 0x2b, 0x2c, 0x27, 0xa4, 0x4b, 0x73,
-  0xab, 0x16, 0x90, 0xee, 0xa6, 0xfa, 0xa4, 0x25, 0xe8, 0xa0, 0x5f, 0xf9,
-  0xfa, 0x43, 0x5b, 0x44, 0x72, 0xa7, 0x10, 0xa9, 0xcf, 0xaf, 0xac, 0x51,
-  0xe5, 0x17, 0x0d, 0xd5, 0xc4, 0x14, 0x21, 0x69, 0xa7, 0xa0, 0xb5, 0x23,
-  0x4b, 0x24, 0x5d, 0xb7, 0xef, 0x0d, 0x52, 0xd5, 0xde, 0xa6, 0xca, 0x20,
-  0x1e, 0x01, 0x7f, 0x69, 0x25, 0xd4, 0x77, 0xf6, 0x05, 0x6d, 0x08, 0xd7,
-  0x5c, 0x7b, 0x4c, 0x32, 0x01, 0x02, 0xb3, 0x42, 0xf8, 0x9d, 0xd4, 0x79,
-  0x8f, 0x4d, 0x43, 0xf6, 0x6c, 0x34, 0xe7, 0x8a, 0x73, 0x3d, 0xe8, 0x0f,
-  0xd7, 0x09, 0x15, 0xac, 0x97, 0x5e, 0xb1, 0x52, 0xbe, 0x17, 0x34, 0x60,
-  0x41, 0xbe, 0x90, 0x40, 0xc5, 0xfc, 0xa4, 0x2a, 0x7f, 0x5b, 0xef, 0xa8,
-  0xd7, 0x7c, 0x3a, 0x9c, 0x80, 0x00, 0xba, 0xca, 0xd5, 0x7a, 0xd7, 0xb5,
-  0x41, 0x7a, 0xe1, 0xdf, 0x97, 0xf9, 0xc7, 0x14, 0x09, 0x3a, 0x54, 0x62,
-  0x5a, 0x4a, 0xfc, 0x76, 0xda, 0x48, 0x7f, 0x55, 0x23, 0x69, 0xbb, 0x95,
-  0x27, 0xbf, 0xa6, 0x91, 0x27, 0x9d, 0x36, 0x6e, 0x7e, 0x55, 0x23, 0x03,
-  0xbd, 0x26, 0x8c, 0x7a, 0xfc, 0xc3, 0xc9, 0x65, 0x72, 0x74, 0xf6, 0xd2,
-  0x1d, 0xb0, 0x4b, 0xa8, 0x2a, 0xd8, 0x02, 0xb4, 0xf7, 0xc6, 0xcb, 0x82,
-  0x76, 0x21, 0x49, 0x0f, 0x2e, 0x10, 0x48, 0x6d, 0x01, 0x1c, 0x0b, 0xb4,
-  0x46, 0xad, 0xb9, 0x3f, 0x79, 0xc5, 0xd4, 0x1f, 0x84, 0xc0, 0xf0, 0xc9,
-  0x14, 0xf9, 0xd1, 0x39, 0xb1, 0x8a, 0x5c, 0xeb, 0x3d, 0x4c, 0x67, 0x92,
-  0xa8, 0xa5, 0xd2, 0x4a, 0x33, 0xf3, 0xc6, 0x29, 0x31, 0x87, 0x14, 0x9c,
-  0x62, 0x46, 0xd8, 0xfe, 0xa6, 0x65, 0xaa, 0x3b, 0x22, 0x92, 0x80, 0xf3,
-  0xd3, 0xa8, 0xd1, 0x79, 0xa3, 0x5d, 0xf1, 0x51, 0x67, 0x7b, 0x8a, 0x9a,
-  0x6e, 0x6d, 0x77, 0x29, 0xda, 0x82, 0x7b, 0x90, 0xe0, 0xb1, 0x20, 0x1c,
-  0x82, 0x30, 0x21, 0xfd, 0xb8, 0x70, 0xe8, 0x67, 0xae, 0xdb, 0x18, 0x5c,
-  0x51, 0xb6, 0x09, 0xfb, 0x9d, 0x7d, 0xfe, 0xe3, 0x95, 0xd1, 0xd6, 0x19,
-  0x24, 0x23, 0x18, 0xa4, 0xfc, 0x1f, 0x9e, 0xae, 0xfe, 0xc8, 0xaa, 0x66,
-  0x66, 0xf0, 0x33, 0x54, 0x44, 0x9c, 0xf2, 0xb1, 0xa8, 0xef, 0xcc, 0xfd,
-  0xfe, 0x09, 0xb6, 0x39, 0x19, 0x52, 0x42, 0x9f, 0xe2, 0xde, 0x7c, 0x2c,
-  0x0a, 0x9a, 0xa5, 0x69, 0x29, 0x2b, 0x6b, 0x9a, 0x3a, 0x48, 0x89, 0xef,
-  0xbe, 0xb0, 0xf9, 0xa6, 0x98, 0x40, 0x33, 0x2f, 0x54, 0xa5, 0x71, 0x23,
-  0x1a, 0xf2, 0xd7, 0xb7, 0xcd, 0x87, 0x13, 0xcd, 0x5f, 0xa5, 0x0f, 0x20,
-  0xe0, 0xe7, 0x4a, 0xf0, 0x58, 0x8a, 0x0d, 0xf3, 0x3d, 0x4c, 0xda, 0x20,
-  0x5a, 0xac, 0xe2, 0xd2, 0xcf, 0x68, 0x53, 0x23, 0x64, 0x5a, 0x62, 0x1a,
-  0xfb, 0x5c, 0xee, 0x87, 0x2a, 0xc6, 0x9a, 0xdf, 0xdc, 0x69, 0xe1, 0x9f,
-  0xb4, 0x40, 0xf2, 0x56, 0x17, 0x43, 0xaa, 0x0b, 0x23, 0x99, 0x2d, 0x2e,
-  0x8d, 0xe4, 0x09, 0xff, 0x71, 0xa4, 0x7a, 0x9c, 0x2b, 0x5f, 0xaf, 0x2a,
-  0x1c, 0x6e, 0x3c, 0xb9, 0x75, 0x44, 0xe8, 0xf2, 0xad, 0x37, 0xc1, 0xd5,
-  0xc4, 0xf0, 0xec, 0x60, 0x36, 0xea, 0x8e, 0xef, 0xf3, 0x69, 0xe7, 0x3b,
-  0xfa, 0x19, 0x66, 0x53, 0xb9, 0xb4, 0xac, 0x2e, 0xdd, 0x48, 0x03, 0x35,
-  0x1f, 0xb6, 0xf6, 0x59, 0x77, 0x8b, 0xa8, 0xd7, 0x9f, 0x38, 0xf7, 0x4a,
-  0x3f, 0xfe, 0xf7, 0xb9, 0x78, 0x28, 0x32, 0xca, 0x04, 0x13, 0x7d, 0xba,
-  0xca, 0x16, 0x33, 0x91, 0xa1, 0xf2, 0x13, 0x04, 0x19, 0xe1, 0x65, 0xc0,
-  0x54, 0x4f, 0xb4, 0x97, 0x46, 0x49, 0xf6, 0x0d, 0xc4, 0x67, 0xf2, 0x59,
-  0x23, 0x87, 0x59, 0x9f, 0x30, 0x9b, 0xa1, 0xc8, 0xed, 0xc6, 0x93, 0x62,
-  0xa2, 0xf8, 0x11, 0xa1, 0xe2, 0xcc, 0x5d, 0x55, 0xda, 0x7f, 0xeb, 0x1b,
-  0x21, 0xc9, 0x14, 0x5f, 0x67, 0xce, 0xc7, 0x8c, 0xf1, 0x2e, 0x2b, 0xce,
-  0x85, 0x74, 0xd4, 0x6a, 0x40, 0x1d, 0xa7, 0x45, 0xc3, 0x03, 0xae, 0x88,
-  0x0e, 0x6b, 0x98, 0xbc, 0x09, 0xc1, 0x46, 0xe5, 0x55, 0x23, 0xe9, 0xcc,
-  0x84, 0x67, 0xe3, 0xd9, 0xb9, 0x49, 0x8b, 0xeb, 0x8c, 0x1d, 0x32, 0x1e,
-  0x33, 0x1c, 0x97, 0xa2, 0x91, 0xcb, 0xd1, 0x9c, 0x7a, 0x28, 0x35, 0x45,
-  0xa4, 0x77, 0x5d, 0x32, 0xe2, 0xbd, 0x5d, 0x3b, 0x0f, 0x18, 0xd6, 0xa2,
-  0x01, 0xe6, 0x9f, 0x26, 0xe2, 0x7b, 0xb0, 0x81, 0xdd, 0xa6, 0x5c, 0x88,
-  0x4e, 0x6b, 0xb5, 0x3a, 0x43, 0x46, 0x17, 0x8a, 0x12, 0x7d, 0x42, 0x80,
-  0x2d, 0xb0, 0x1e, 0x29, 0xbb, 0xda, 0x18, 0x20, 0xc8, 0x39, 0x63, 0x72,
-  0x7b, 0xf5, 0x61, 0x9c, 0x5b, 0x51, 0xc9, 0x21, 0x39, 0xe8, 0xdc, 0x94,
-  0x6e, 0xb0, 0xc2, 0x4f, 0x43, 0x94, 0x31, 0x5e, 0xe4, 0x9f, 0x12, 0x0b,
-  0x98, 0xa3, 0xd4, 0x1b, 0xcf, 0x9e, 0x1b, 0xcf, 0x2d, 0x76, 0xca, 0xf9,
-  0xe1, 0x68, 0xa4, 0xfb, 0xe4, 0x28, 0xdc, 0x12, 0x12, 0x58, 0x02, 0x7b,
-  0x85, 0xa4, 0x9e, 0x86, 0x0a, 0xa4, 0xb4, 0xd1, 0x09, 0x48, 0xef, 0xb1,
-  0x78, 0x7b, 0xc9, 0x62, 0x3a, 0x3e, 0xdc, 0xdb, 0xd6, 0x24, 0xb2, 0x67,
-  0xbb, 0x43, 0xad, 0x10, 0x2f, 0x03, 0x8e, 0x69, 0xc5, 0x34, 0x23, 0xc7,
-  0x53, 0xb9, 0x9d, 0xc9, 0x41, 0x6c, 0xa4, 0x4f, 0xbb, 0xb8, 0xec, 0xde,
-  0xa3, 0xc8, 0xa0, 0xbf, 0xe3, 0x51, 0xf5, 0xff, 0x99, 0x41, 0x7f, 0x17,
-  0x19, 0xf4, 0x63, 0xfb, 0x2d, 0xfe, 0xd4, 0xfe, 0xfe, 0x67, 0x82, 0x80,
-  0x67, 0xcf, 0xdd, 0x2c, 0x71, 0x1f, 0x93, 0xaf, 0xf1, 0x88, 0xcd, 0x83,
-  0x03, 0x25, 0x2b, 0xcd, 0x02, 0x0b, 0xd7, 0x1e, 0x5e, 0xef, 0x53, 0x4f,
-  0xdc, 0xb0, 0x8c, 0x42, 0x4e, 0xed, 0x91, 0xae, 0xcf, 0x72, 0x26, 0x10,
-  0x3f, 0x6a, 0xe2, 0x11, 0x46, 0xe6, 0x96, 0xd0, 0x36, 0x2b, 0xb0, 0x06,
-  0xda, 0x0d, 0xef, 0x3b, 0x4f, 0xad, 0x73, 0x65, 0x67, 0x9f, 0x37, 0x25,
-  0xd5, 0x62, 0x91, 0x0a, 0xde, 0xd8, 0x9a, 0xd3, 0xac, 0x31, 0x6b, 0xe2,
-  0xfc, 0x82, 0x9c, 0xc8, 0x74, 0x55, 0xa5, 0xa0, 0x39, 0x45, 0xd5, 0xf0,
-  0xe1, 0x0a, 0x2e, 0x5d, 0x36, 0x62, 0xcc, 0xf9, 0xbc, 0xce, 0x0a, 0xb2,
-  0x1d, 0xa0, 0x14, 0x88, 0x33, 0x8d, 0xbc, 0xb3, 0xa8, 0xd1, 0x7e, 0x65,
-  0x1d, 0xb8, 0x5a, 0x37, 0xbc, 0x1f, 0xcc, 0x10, 0x0f, 0xb1, 0xa5, 0x33,
-  0xc4, 0x69, 0x99, 0xf6, 0x3e, 0xb3, 0xf3, 0x66, 0x57, 0x82, 0xfc, 0x5d,
-  0x4c, 0xbc, 0x30, 0xf4, 0xaf, 0x08, 0x11, 0x27, 0x5e, 0x58, 0x48, 0x29,
-  0xfc, 0x83, 0x7d, 0x29, 0x6f, 0xbb, 0xaf, 0xb0, 0x3c, 0x3e, 0x27, 0x69,
-  0x27, 0x7c, 0x97, 0xc3, 0xe4, 0x0c, 0xde, 0xb9, 0x16, 0xc3, 0x2f, 0xe7,
-  0x6d, 0xa4, 0x2e, 0x17, 0xaf, 0xbd, 0x75, 0x9f, 0x79, 0x6b, 0xac, 0xdd,
-  0x52, 0xac, 0xc4, 0x8e, 0x08, 0x5a, 0xc7, 0x14, 0xa6, 0x3e, 0xe8, 0x2c,
-  0xb9, 0x38, 0xbe, 0xbc, 0x00, 0xd6, 0x8b, 0x44, 0x40, 0x50, 0x47, 0x22,
-  0xad, 0xb6, 0x2d, 0x2f, 0xa4, 0xc8, 0x33, 0xa7, 0x94, 0x38, 0x11, 0xc1,
-  0xe4, 0x41, 0x76, 0xc5, 0xf9, 0x9f, 0xfa, 0x1e, 0xe7, 0x2a, 0x98, 0x35,
-  0xe7, 0x29, 0x77, 0x61, 0xd2, 0x36, 0xad, 0xd1, 0xfe, 0xbe, 0xc3, 0xac,
-  0xa0, 0x38, 0x20, 0xdf, 0x73, 0x82, 0x40, 0x1e, 0x0a, 0x14, 0x42, 0x41,
-  0xfb, 0x89, 0x65, 0xf2, 0x66, 0xcd, 0x82, 0x51, 0xbc, 0x21, 0x30, 0xd4,
-  0x7e, 0x5c, 0xd5, 0x00, 0xd5, 0x16, 0x3d, 0x54, 0x3b, 0x3e, 0xe9, 0xc9,
-  0x50, 0x4e, 0xad, 0x7a, 0xbc, 0x1b, 0x21, 0x2d, 0x4f, 0xc7, 0x46, 0xac,
-  0x8a, 0x6a, 0x27, 0x39, 0x18, 0x78, 0x85, 0xbd, 0xa9, 0x50, 0x37, 0x6b,
-  0xb2, 0x3e, 0x06, 0x57, 0xe4, 0xde, 0xa4, 0x19, 0x0b, 0xcd, 0x8c, 0x7d,
-  0x96, 0x32, 0xdf, 0x23, 0x29, 0x44, 0xe6, 0xac, 0x2d, 0x5b, 0x38, 0x5f,
-  0x44, 0x8b, 0xcf, 0xa5, 0x0a, 0xaa, 0x45, 0xaa, 0xa5, 0x78, 0xc5, 0x83,
-  0x9e, 0x05, 0x12, 0x7c, 0xff, 0x49, 0x64, 0x47, 0x24, 0xa3, 0xcb, 0xb3,
-  0x0b, 0x65, 0xd8, 0x0c, 0x6f, 0x68, 0x00, 0x4c, 0xe8, 0x09, 0xcb, 0x60,
-  0xd1, 0x0f, 0x99, 0x4c, 0xa6, 0x36, 0xed, 0xda, 0x52, 0x08, 0x7a, 0x5f,
-  0x65, 0x19, 0x80, 0xaa, 0x35, 0x32, 0xb6, 0xef, 0x24, 0xcf, 0x5a, 0xe9,
-  0x32, 0xf5, 0x64, 0x7a, 0x2f, 0xf1, 0x41, 0x3b, 0xe3, 0x13, 0xcc, 0x69,
-  0xc1, 0xa8, 0xe2, 0xc4, 0x09, 0xc2, 0x44, 0xb7, 0x29, 0xe0, 0x49, 0x5b,
-  0x28, 0xab, 0xbb, 0x17, 0xf9, 0x10, 0x9d, 0x39, 0x46, 0x54, 0x96, 0xf1,
-  0x32, 0x48, 0xe7, 0x42, 0x42, 0xbd, 0x36, 0x24, 0x54, 0x30, 0x67, 0xa8,
-  0xec, 0x21, 0xe8, 0x0e, 0x81, 0x06, 0x6b, 0x8e, 0x4d, 0x59, 0x4d, 0x85,
-  0x96, 0x4b, 0x2e, 0x4f, 0x35, 0x1f, 0x9c, 0xda, 0xed, 0xdd, 0xfc, 0xe7,
-  0x67, 0x17, 0x97, 0x89, 0xbd, 0xf8, 0xf1, 0x6d, 0xfc, 0xa8, 0x73, 0x84,
-  0xa8, 0x66, 0x01, 0xbc, 0x79, 0x0e, 0xf1, 0x1f, 0xb8, 0x2a, 0xc5, 0x44,
-  0x68, 0xb4, 0x09, 0x6d, 0x83, 0xfc, 0x0f, 0x15, 0xb0, 0x7d, 0xc2, 0x7e,
-  0xe6, 0xc9, 0x1c, 0x49, 0xad, 0xa1, 0x0b, 0x27, 0x5e, 0xfc, 0xcc, 0x29,
-  0xb9, 0x8f, 0xf6, 0x22, 0xbb, 0x83, 0x6c, 0xeb, 0x8b, 0xe3, 0xd1, 0x25,
-  0xcf, 0x1a, 0xfd, 0x2d, 0xe8, 0x39, 0xa7, 0x73, 0xca, 0x0f, 0x03, 0xcb,
-  0xc5, 0xee, 0x0e, 0x8a, 0x59, 0x1a, 0xf3, 0x03, 0xed, 0xdb, 0xdc, 0x61,
-  0x6f, 0xce, 0x1e, 0x79, 0xf8, 0x34, 0x48, 0x4e, 0xd9, 0x2b, 0x38, 0xe4,
-  0xf8, 0x41, 0x4f, 0x3e, 0xd2, 0x33, 0xea, 0x19, 0x1f, 0x8a, 0x16, 0x03,
-  0xf2, 0xa3, 0xc7, 0x9e, 0xb4, 0xa0, 0xdb, 0x4a, 0x1a, 0x38, 0xd1, 0x5a,
-  0x73, 0xf4, 0xc3, 0x81, 0x6e, 0x17, 0x5c, 0x19, 0xbc, 0x31, 0xf8, 0x39,
-  0xd7, 0xce, 0x13, 0xcb, 0x11, 0xa0, 0x0a, 0x83, 0xd7, 0x15, 0xfa, 0xb1,
-  0xc2, 0x82, 0xa0, 0xbc, 0x75, 0xb6, 0xdd, 0x23, 0xde, 0xed, 0x5f, 0xa7,
-  0x53, 0x87, 0x73, 0xe3, 0xa1, 0x7b, 0x17, 0x2b, 0x69, 0x5c, 0x79, 0xb1,
-  0xcc, 0xa0, 0xa9, 0xa5, 0xd5, 0x8c, 0xd8, 0xd6, 0x8d, 0x1c, 0x61, 0x5f,
-  0x0b, 0xbd, 0x16, 0x48, 0xdd, 0xd2, 0xe7, 0xf6, 0x78, 0x24, 0xb7, 0xd0,
-  0xc9, 0xe9, 0xb1, 0x5b, 0x29, 0xa6, 0x6a, 0xc7, 0x29, 0x76, 0x1a, 0x3f,
-  0xd5, 0x87, 0xb5, 0x57, 0xc5, 0x30, 0x39, 0xa7, 0xc2, 0x9f, 0xd0, 0x9e,
-  0xea, 0x7f, 0x77, 0xad, 0xf1, 0x41, 0x81, 0x77, 0xde, 0x5c, 0x9e, 0x30,
-  0x55, 0xf2, 0xc2, 0x2c, 0x2c, 0x7e, 0x42, 0x7f, 0xf5, 0x68, 0x85, 0x83,
-  0xe1, 0x3e, 0x73, 0x2f, 0xd7, 0x66, 0x28, 0xc6, 0x68, 0xef, 0x3e, 0xf2,
-  0x58, 0xf6, 0x95, 0xb1, 0xe8, 0xd1, 0x04, 0x7d, 0x00, 0xb2, 0x99, 0xce,
-  0xb3, 0xd4, 0x6b, 0x98, 0x72, 0x0b, 0x57, 0xfa, 0x8c, 0x1a, 0x35, 0xfc,
-  0x9c, 0x6b, 0x8a, 0x2f, 0x84, 0xc3, 0xb1, 0xad, 0xe1, 0x41, 0xb0, 0x52,
-  0x52, 0xe7, 0x4c, 0x5b, 0x05, 0x49, 0xdb, 0x99, 0x45, 0x67, 0xdb, 0x10,
-  0x31, 0xc9, 0xcb, 0xb1, 0x1e, 0x1c, 0x1a, 0x49, 0x77, 0x72, 0x3b, 0x55,
-  0x4c, 0x1f, 0xf3, 0x4e, 0xb4, 0xdb, 0xc6, 0xde, 0x61, 0xad, 0xde, 0x09,
-  0x9e, 0x55, 0xf8, 0xc4, 0xc8, 0x91, 0x40, 0xb1, 0x02, 0x73, 0xc5, 0xfb,
-  0x26, 0xc0, 0xe3, 0x27, 0xae, 0xa9, 0x2b, 0xca, 0xc2, 0xb3, 0x6d, 0x39,
-  0xf9, 0xe3, 0xea, 0x18, 0xe4, 0xf6, 0x31, 0xb1, 0x1a, 0xf9, 0x1e, 0x1b,
-  0x47, 0x88, 0xb5, 0xfc, 0x39, 0xe1, 0xcd, 0x70, 0x59, 0x92, 0x19, 0x5c,
-  0xdc, 0x39, 0xb8, 0xf6, 0x90, 0x23, 0xce, 0xec, 0x4d, 0xe3, 0x5a, 0x11,
-  0xf2, 0x1b, 0xe1, 0xda, 0xbe, 0x11, 0x6f, 0x0d, 0x95, 0xce, 0x0b, 0x28,
-  0x82, 0x97, 0x73, 0x41, 0x7d, 0x7a, 0x5f, 0xfa, 0x5c, 0x5c, 0x1b, 0x94,
-  0xd4, 0x5b, 0x58, 0x5e, 0x1b, 0x3b, 0x12, 0x33, 0xd1, 0x62, 0x39, 0x5b,
-  0x86, 0x18, 0xb3, 0x79, 0x00, 0x47, 0xac, 0x3d, 0xce, 0xde, 0x08, 0x2f,
-  0x1d, 0x2e, 0x63, 0x51, 0x7a, 0xd5, 0xcb, 0x50, 0x7a, 0xac, 0x42, 0x34,
-  0xe1, 0xf2, 0x1c, 0xff, 0x4a, 0xb9, 0x27, 0x42, 0x77, 0x79, 0x95, 0xfd,
-  0x0d, 0xea, 0xe4, 0xd0, 0x96, 0x49, 0xd3, 0x78, 0x73, 0x5a, 0x2c, 0x53,
-  0xcf, 0xa6, 0x7f, 0xfc, 0x4c, 0xfc, 0x56, 0xe2, 0x17, 0xd1, 0x12, 0xbb,
-  0xdd, 0xd0, 0xe3, 0x93, 0x3d, 0xeb, 0xc1, 0x24, 0x90, 0xa5, 0x64, 0x0e,
-  0xf8, 0x50, 0x4b, 0xe2, 0x1f, 0x1d, 0xbd, 0x4e, 0xde, 0xbc, 0x7c, 0x42,
-  0x60, 0x9f, 0xeb, 0xac, 0x5a, 0x18, 0xab, 0xc5, 0x19, 0xe6, 0x67, 0xdf,
-  0x7a, 0x8d, 0xed, 0x3b, 0x77, 0xa8, 0x5c, 0xb3, 0xb9, 0x9c, 0x5e, 0xb2,
-  0x18, 0xcc, 0xfa, 0x51, 0xa6, 0xea, 0xb5, 0x26, 0x9d, 0xb3, 0x4f, 0x0c,
-  0x59, 0xed, 0xc2, 0x03, 0xc4, 0x6a, 0x4b, 0xd7, 0xa1, 0xdd, 0x16, 0x60,
-  0x4f, 0x1e, 0x39, 0x01, 0x56, 0xdd, 0x2d, 0xa8, 0xbe, 0x41, 0x71, 0x4d,
-  0xd6, 0x41, 0xe4, 0x44, 0x3d, 0x61, 0xa1, 0x79, 0xc4, 0xe7, 0x9e, 0x54,
-  0xd9, 0xf0, 0x35, 0x28, 0xe9, 0xf0, 0xa2, 0x7a, 0xef, 0x3d, 0xf1, 0x7d,
-  0x0b, 0xc4, 0x4f, 0x09, 0x18, 0x15, 0xb3, 0xd2, 0x43, 0x4f, 0xf1, 0x9e,
-  0x7d, 0x6a, 0x9f, 0x25, 0x4f, 0x52, 0x5e, 0x78, 0x55, 0x44, 0x56, 0xbc,
-  0x21, 0x0a, 0xb0, 0x9a, 0x09, 0x9a, 0xda, 0xc7, 0x5a, 0x8f, 0x37, 0xf7,
-  0xde, 0x2b, 0xcf, 0xda, 0xae, 0x13, 0xd0, 0x8b, 0xdb, 0xad, 0x89, 0x41,
-  0xa1, 0x8a, 0x9d, 0xe7, 0x6c, 0xe1, 0x5b, 0xfa, 0x9c, 0x90, 0xb3, 0xad,
-  0xf5, 0x54, 0x21, 0x98, 0xf9, 0xf4, 0x0c, 0x7a, 0xd6, 0x79, 0xef, 0x1f,
-  0x1d, 0xae, 0x4a, 0x1b, 0xc1, 0x6e, 0xf7, 0x3e, 0xb2, 0x27, 0x67, 0x86,
-  0x6a, 0x3f, 0x5e, 0x17, 0xf9, 0x3f, 0x34, 0xe1, 0x9c, 0x6e, 0x67, 0xad,
-  0x00, 0xe3, 0x3d, 0xbe, 0x2f, 0x02, 0x83, 0x8b, 0xfe, 0x41, 0x28, 0x52,
-  0x60, 0xd5, 0x3d, 0xf0, 0x48, 0x76, 0x2d, 0x57, 0xbb, 0x84, 0x05, 0x80,
-  0x7a, 0xb5, 0x14, 0xd6, 0xcf, 0x5a, 0x40, 0xec, 0xa7, 0x8f, 0x45, 0xef,
-  0x52, 0x05, 0x99, 0x6e, 0x5e, 0x9a, 0x88, 0x19, 0xd8, 0xee, 0xba, 0x62,
-  0xfa, 0xa9, 0x5c, 0x7b, 0xb2, 0x94, 0xb6, 0x0a, 0x8c, 0xad, 0xa8, 0x43,
-  0x7f, 0xbd, 0xcd, 0x0b, 0x81, 0x46, 0x07, 0xaf, 0x3f, 0x5d, 0xe1, 0x8f,
-  0xac, 0xf9, 0xce, 0x3c, 0xc6, 0x5e, 0xf2, 0x9e, 0xff, 0xcc, 0x65, 0xbc,
-  0x3a, 0xde, 0x44, 0xe5, 0x88, 0xeb, 0x7b, 0x1e, 0x08, 0x7b, 0x90, 0xc4,
-  0x8b, 0xc2, 0x47, 0x60, 0x1a, 0x2d, 0xc9, 0x71, 0x65, 0x3f, 0x3f, 0x2b,
-  0xaf, 0x13, 0x9f, 0xee, 0xe2, 0x29, 0x6f, 0xa9, 0x57, 0xa0, 0x8b, 0xd7,
-  0x73, 0x80, 0x12, 0x8a, 0x5e, 0x8e, 0xa5, 0x7b, 0xfa, 0x99, 0xec, 0x0d,
-  0xbd, 0x2f, 0xad, 0xc9, 0xba, 0xea, 0x8d, 0xcf, 0x76, 0x7d, 0x85, 0x75,
-  0x4a, 0x11, 0x5b, 0x4e, 0xbc, 0x5e, 0xf9, 0x02, 0xef, 0x8c, 0x93, 0x19,
-  0xd5, 0x3e, 0x9e, 0x69, 0x45, 0x65, 0x65, 0x89, 0x73, 0x8f, 0xed, 0xb7,
-  0x84, 0xee, 0xa5, 0xaf, 0x3e, 0x25, 0x27, 0x2f, 0xbd, 0x07, 0x1f, 0xb9,
-  0x01, 0xa6, 0x33, 0xd2, 0x06, 0xee, 0xd8, 0x5d, 0x55, 0x4b, 0x2d, 0x67,
-  0xef, 0x51, 0xde, 0x19, 0x6f, 0x4b, 0xe6, 0x33, 0xc2, 0xfc, 0x07, 0xcf,
-  0xf0, 0x76, 0x38, 0xba, 0x31, 0xb7, 0xda, 0xa4, 0x01, 0x62, 0xb4, 0xd0,
-  0xb8, 0x57, 0x77, 0xed, 0x3f, 0x7b, 0xba, 0xe6, 0x59, 0xb9, 0x34, 0x6b,
-  0x7b, 0xd5, 0x7b, 0xef, 0x7d, 0x16, 0x1e, 0x73, 0x35, 0x09, 0x14, 0xd8,
-  0x2e, 0x27, 0x2d, 0xd9, 0xa2, 0xdc, 0xda, 0x7f, 0x57, 0xff, 0x60, 0x45,
-  0x54, 0x6d, 0xf5, 0xbf, 0xfb, 0xfd, 0xfd, 0xdc, 0x47, 0xc7, 0xb3, 0x67,
-  0xb0, 0xca, 0x10, 0x38, 0x98, 0xb4, 0xf8, 0xda, 0x1d, 0x7a, 0x08, 0xb3,
-  0xe3, 0xb5, 0xc0, 0x6b, 0x6e, 0xf4, 0x88, 0x65, 0xe1, 0x24, 0x07, 0x1b,
-  0x81, 0x92, 0xcc, 0x3e, 0xf5, 0x29, 0xfd, 0x48, 0xe6, 0x8b, 0x2f, 0xca,
-  0xf3, 0xa4, 0xee, 0x76, 0x8e, 0x41, 0x7d, 0xb3, 0x64, 0xab, 0xdb, 0x8e,
-  0xc8, 0xb9, 0xd9, 0xbc, 0xd7, 0xf6, 0x9d, 0xf4, 0x92, 0x6b, 0x9f, 0x53,
-  0x14, 0x8e, 0x28, 0x9b, 0x86, 0x4d, 0x73, 0x4b, 0xe2, 0x0d, 0x57, 0x79,
-  0x55, 0xb2, 0xe7, 0x90, 0xe8, 0x11, 0xb6, 0xd2, 0x38, 0x70, 0x53, 0xb0,
-  0xe6, 0xde, 0x67, 0x44, 0xb5, 0x21, 0xf8, 0x93, 0x59, 0xa5, 0x9b, 0x6c,
-  0xf2, 0x41, 0x8f, 0x8c, 0x6d, 0x23, 0xf2, 0xd6, 0x63, 0x3b, 0xb5, 0xb4,
-  0xfb, 0xce, 0x2f, 0x8e, 0xbb, 0x46, 0x80, 0x7b, 0x94, 0x77, 0xcd, 0xc5,
-  0xe5, 0xe8, 0xfc, 0x80, 0xfa, 0xcb, 0xc1, 0x44, 0x73, 0x20, 0x8e, 0x46,
-  0xd9, 0xdf, 0x25, 0x33, 0xa9, 0x76, 0x4f, 0x3f, 0x5d, 0xf1, 0xf4, 0x48,
-  0x5c, 0x7c, 0x27, 0x53, 0x92, 0xbe, 0x66, 0x1d, 0xfc, 0x97, 0x3e, 0x13,
-  0xbc, 0xa7, 0xba, 0xfa, 0xd9, 0x11, 0x46, 0x3d, 0x83, 0x34, 0xa4, 0xb0,
-  0xb3, 0x7b, 0xf8, 0x73, 0xe7, 0xaf, 0xb9, 0x59, 0x16, 0x1f, 0xac, 0xbe,
-  0x28, 0x14, 0x65, 0xba, 0xc0, 0xee, 0x85, 0x67, 0x7a, 0x34, 0x3c, 0x6f,
-  0xa8, 0xc5, 0x44, 0xf5, 0xc5, 0x4b, 0xa1, 0xd5, 0x9b, 0x39, 0x0a, 0x6a,
-  0xe4, 0xeb, 0xd2, 0x9b, 0x83, 0x67, 0xbb, 0xf6, 0xfa, 0x15, 0xb2, 0x93,
-  0x0f, 0xd9, 0x9d, 0xdb, 0x75, 0x8a, 0xbf, 0x58, 0xe4, 0x05, 0x39, 0x21,
-  0xdc, 0x23, 0xae, 0x81, 0xbd, 0xd6, 0x25, 0xd0, 0x55, 0x37, 0xea, 0x26,
-  0x6d, 0x96, 0xde, 0x15, 0xf3, 0x8c, 0xf7, 0xce, 0x88, 0x62, 0x91, 0x73,
-  0xd9, 0xaf, 0x79, 0xa1, 0x3e, 0xb7, 0x8e, 0x23, 0x4d, 0x5f, 0xfa, 0xe1,
-  0x07, 0xbe, 0x47, 0x2c, 0x0f, 0x97, 0xc4, 0xb2, 0x6c, 0xfd, 0x15, 0x23,
-  0x77, 0x99, 0x9b, 0x95, 0x8e, 0x30, 0x22, 0x40, 0x55, 0x46, 0x25, 0xe2,
-  0x94, 0xaf, 0x04, 0x87, 0x27, 0x56, 0x0f, 0x8e, 0x2a, 0x7a, 0x23, 0x8c,
-  0x47, 0xc0, 0x4e, 0xf8, 0x3f, 0x0b, 0xf2, 0xbf, 0x89, 0x3f, 0xcc, 0xf4,
-  0xe0, 0xf0, 0xdd, 0xe5, 0xeb, 0xb3, 0x8b, 0x51, 0xb2, 0x43, 0xe9, 0xd0,
-  0x97, 0x17, 0x27, 0x5f, 0xbf, 0xbb, 0x34, 0xff, 0xd4, 0x96, 0x5e, 0xa6,
-  0x45, 0x6e, 0x6e, 0x27, 0x33, 0x9c, 0xac, 0x30, 0x9b, 0xe5, 0x5a, 0xeb,
-  0xa4, 0x30, 0x2b, 0xac, 0xb9, 0x8f, 0xcb, 0x8a, 0x6b, 0x65, 0x81, 0x8e,
-  0xe2, 0xa6, 0x9c, 0x79, 0x45, 0x75, 0xc9, 0x8f, 0x4d, 0xe8, 0xbf, 0xd2,
-  0xd9, 0xce, 0x79, 0x27, 0x9b, 0x5b, 0x21, 0x3d, 0xc9, 0xe5, 0xeb, 0xc3,
-  0xb7, 0xdf, 0x8e, 0x94, 0x42, 0xff, 0xfb, 0xef, 0xbf, 0xef, 0x86, 0x7c,
-  0xfd, 0x52, 0xb8, 0x1b, 0x1b, 0xa3, 0xe3, 0xe3, 0xe4, 0xf0, 0x74, 0x74,
-  0xb6, 0xe1, 0x48, 0x00, 0xb6, 0xf6, 0x88, 0x1c, 0xe8, 0x3a, 0x6b, 0xcc,
-  0x5f, 0x36, 0x36, 0x4e, 0x0f, 0x2f, 0xc9, 0x38, 0x96, 0xba, 0xd4, 0x34,
-  0xcf, 0x44, 0xe8, 0x91, 0xce, 0x6e, 0x89, 0xbf, 0xf0, 0x2a, 0x07, 0xca,
-  0x9e, 0xc8, 0xfb, 0x80, 0x43, 0xee, 0x92, 0x7a, 0x9a, 0x0b, 0xee, 0x96,
-  0x68, 0x56, 0x04, 0x2b, 0x47, 0x20, 0x60, 0x33, 0x24, 0x05, 0x38, 0x6c,
-  0x24, 0xce, 0x43, 0xc6, 0xdc, 0xfb, 0xd9, 0x98, 0xcb, 0x92, 0xf7, 0x19,
-  0xf2, 0x8a, 0x10, 0x99, 0x47, 0x7c, 0xb1, 0x62, 0x08, 0x27, 0xc4, 0x47,
-  0x9b, 0xbc, 0x1b, 0x1d, 0x7e, 0x73, 0x4c, 0xcf, 0x7e, 0x93, 0x35, 0x6e,
-  0x66, 0xe1, 0x5e, 0xc3, 0x57, 0xde, 0x66, 0x4d, 0x3d, 0x49, 0x17, 0xd9,
-  0x26, 0xf5, 0x69, 0x3c, 0x90, 0xea, 0x0f, 0xae, 0x71, 0x36, 0x1d, 0x5c,
-  0xd1, 0x8a, 0x42, 0x9e, 0x47, 0x79, 0x09, 0xbf, 0xdd, 0x8b, 0xe3, 0xc3,
-  0x97, 0x6f, 0x8e, 0xb5, 0xb2, 0x3d, 0x5f, 0xf3, 0xa6, 0xd1, 0x9b, 0x72,
-  0x9e, 0x79, 0xf1, 0x15, 0x52, 0x25, 0x96, 0xa6, 0x0d, 0xf3, 0x1b, 0x33,
-  0xa7, 0x2b, 0x3e, 0xe7, 0x6a, 0x59, 0xe0, 0xd9, 0xe1, 0x55, 0xbe, 0xc3,
-  0xad, 0xeb, 0xf7, 0x52, 0x3b, 0x27, 0xc2, 0x70, 0xa3, 0xea, 0x35, 0xfb,
-  0x3f, 0xe0, 0x37, 0xf9, 0x7c, 0x77, 0x77, 0x77, 0xcd, 0x38, 0x60, 0x7d,
-  0xc8, 0x25, 0x6d, 0x86, 0x72, 0x40, 0x8f, 0xef, 0xb8, 0xf6, 0x5d, 0x8f,
-  0x69, 0xbb, 0x61, 0xdd, 0xae, 0xc8, 0x7c, 0xc7, 0xd5, 0x9e, 0x37, 0x59,
-  0xbc, 0xcb, 0x93, 0xb2, 0x74, 0xf5, 0x94, 0xfd, 0xc9, 0x41, 0xd1, 0xf1,
-  0xbc, 0x51, 0xaa, 0x3f, 0xbc, 0xc1, 0x1d, 0x37, 0x06, 0x13, 0xe8, 0xcd,
-  0xaa, 0xbb, 0x6e, 0x93, 0xf4, 0x1b, 0x00, 0x8b, 0x26, 0xcd, 0xb0, 0xac,
-  0xae, 0x77, 0xe6, 0x07, 0xd0, 0x80, 0xcc, 0x43, 0xaf, 0x08, 0x5e, 0x9d,
-  0x18, 0x4d, 0xda, 0x32, 0x97, 0xd4, 0x34, 0xb1, 0xa5, 0xb9, 0xfa, 0x1e,
-  0xd0, 0xaf, 0x5f, 0x30, 0x0b, 0xcc, 0x3a, 0x75, 0xa5, 0x23, 0xd7, 0x0a,
-  0x9c, 0x91, 0x8f, 0xd0, 0xfe, 0x83, 0x77, 0x72, 0x68, 0x64, 0x81, 0xf9,
-  0x0a, 0xf1, 0x9f, 0x61, 0x8b, 0x98, 0xbf, 0x56, 0x04, 0xb9, 0x69, 0x3e,
-  0x41, 0x4c, 0x4b, 0xed, 0x5b, 0x4e, 0x55, 0x25, 0xfc, 0xc7, 0xc2, 0x68,
-  0x5a, 0xc6, 0x80, 0x4a, 0x99, 0xfd, 0x62, 0x44, 0xd5, 0x37, 0x48, 0x88,
-  0x5c, 0xcb, 0xc4, 0x01, 0x47, 0x4a, 0x0d, 0x77, 0xbf, 0x39, 0x18, 0x60,
-  0xff, 0xd4, 0x76, 0xb7, 0x3c, 0xe0, 0xe3, 0xde, 0xa0, 0x78, 0xf6, 0x0b,
-  0xb9, 0xd5, 0xbd, 0xbd, 0x33, 0x32, 0xbd, 0x08, 0xbe, 0xb5, 0x74, 0xd5,
-  0x7b, 0x6b, 0xfe, 0x9c, 0x5f, 0x64, 0xc5, 0xac, 0xc6, 0x0e, 0x20, 0xc6,
-  0x0f, 0xfe, 0xc6, 0xd1, 0xb9, 0xfc, 0x8d, 0xb0, 0x98, 0xf9, 0x47, 0x1a,
-  0x3c, 0xdd, 0x08, 0x49, 0xb2, 0x45, 0x57, 0x86, 0x6a, 0xc5, 0x80, 0x76,
-  0xc2, 0xba, 0x45, 0x05, 0x25, 0xdf, 0x3a, 0x59, 0xd3, 0xc3, 0x03, 0x33,
-  0x35, 0x74, 0x03, 0xfd, 0xef, 0x9d, 0x61, 0x5d, 0xdf, 0xec, 0xe4, 0xd3,
-  0xf7, 0x55, 0x9d, 0x26, 0x3f, 0x6d, 0x74, 0x32, 0x79, 0xbb, 0x83, 0xf8,
-  0xdf, 0x98, 0xc1, 0x5f, 0x34, 0x53, 0xab, 0x47, 0xf1, 0x7b, 0x8c, 0x60,
-  0x30, 0xa0, 0x56, 0xf5, 0x4b, 0xef, 0xcd, 0x03, 0xef, 0x2d, 0xc5, 0xf4,
-  0xaf, 0x18, 0x5d, 0x44, 0x14, 0x9a, 0x41, 0x32, 0xf3, 0xa8, 0x91, 0x2d,
-  0xf1, 0x8d, 0xae, 0x85, 0x53, 0x7e, 0xdc, 0xdf, 0xdd, 0xdd, 0x3b, 0xd8,
-  0xfb, 0xfc, 0xd9, 0xee, 0xc1, 0xde, 0xde, 0xde, 0xfe, 0xc1, 0xde, 0xc1,
-  0xc1, 0xfe, 0xee, 0xcf, 0x3b, 0xbd, 0x55, 0x53, 0xf7, 0xe6, 0xeb, 0x15,
-  0x0d, 0x9a, 0x51, 0xf7, 0x18, 0x8d, 0xf9, 0x93, 0x1d, 0x3d, 0x46, 0x35,
-  0xed, 0x25, 0xf5, 0x7c, 0x4c, 0xc8, 0x3d, 0x3e, 0x9c, 0xfe, 0x60, 0x6a,
-  0xa3, 0x78, 0x67, 0xde, 0x80, 0x5e, 0x9e, 0x7d, 0xff, 0xf6, 0xf4, 0xec,
-  0xf0, 0x65, 0x72, 0x79, 0x96, 0x1c, 0xc2, 0x4d, 0x18, 0x91, 0x93, 0xa0,
-  0x26, 0x25, 0x44, 0x3e, 0x97, 0x94, 0xf1, 0x4a, 0xab, 0x89, 0x4f, 0xcb,
-  0x42, 0x67, 0xd1, 0x89, 0x6e, 0x3f, 0x4b, 0x98, 0x81, 0xd4, 0x12, 0xca,
-  0xc2, 0xdf, 0x7b, 0x23, 0x3c, 0xe4, 0xcb, 0x7d, 0x06, 0x72, 0x38, 0x4b,
-  0x1f, 0xdd, 0xd1, 0x93, 0x0f, 0xe4, 0x50, 0xa2, 0xb1, 0x2f, 0x81, 0x40,
-  0xa8, 0xbc, 0x4b, 0xb6, 0x18, 0xe0, 0xe5, 0xca, 0x81, 0x71, 0xa5, 0xb9,
-  0x0e, 0x2a, 0xce, 0xd6, 0x6c, 0x12, 0x8c, 0x0d, 0xd4, 0x1d, 0xd2, 0x61,
-  0xb7, 0x83, 0x01, 0x9e, 0xad, 0x1c, 0x92, 0xb9, 0xcc, 0xb3, 0x4f, 0x18,
-  0x75, 0x5b, 0xf6, 0x32, 0xef, 0xa5, 0x1b, 0x1d, 0xd8, 0xbd, 0xd4, 0x77,
-  0x91, 0x57, 0xda, 0x65, 0xe0, 0x20, 0x23, 0x9f, 0xa3, 0xef, 0xa8, 0x48,
-  0x76, 0x9f, 0xa0, 0xdf, 0xf8, 0xf7, 0xf8, 0x8e, 0xcd, 0x76, 0xe6, 0x0e,
-  0xbc, 0x1b, 0x9d, 0xbc, 0xfd, 0x06, 0x51, 0xf4, 0xef, 0xcf, 0x2e, 0x5e,
-  0x8e, 0x4c, 0xb3, 0x46, 0x5e, 0xa1, 0xf1, 0xcb, 0x92, 0x24, 0xa1, 0xf4,
-  0x8a, 0xcf, 0x25, 0x7d, 0xfa, 0x2f, 0xbc, 0x9d, 0xfa, 0x7e, 0x55, 0x83,
-  0xb9, 0x6f, 0x1f, 0x51, 0x39, 0xab, 0xf8, 0xad, 0xe1, 0xed, 0xc6, 0xaf,
-  0xe6, 0xe9, 0xe4, 0x86, 0x0c, 0x7a, 0xde, 0xac, 0x80, 0x6a, 0xef, 0x50,
-  0x2e, 0xd1, 0x0e, 0xd9, 0x69, 0x3b, 0x4d, 0x89, 0xed, 0x88, 0x56, 0xca,
-  0xca, 0xe7, 0xe1, 0xf7, 0xbc, 0x39, 0x66, 0xaf, 0x5f, 0xcd, 0xd2, 0x6b,
-  0x7c, 0x30, 0x3c, 0x06, 0xde, 0xc7, 0xe4, 0xf3, 0x0f, 0xfd, 0x24, 0x5d,
-  0x1b, 0x68, 0xef, 0x04, 0x1b, 0x00, 0xf9, 0x5f, 0xa8, 0xd1, 0x25, 0x41,
-  0x2a, 0xd6, 0x1f, 0x51, 0x30, 0x90, 0x10, 0x61, 0x04, 0x45, 0xed, 0x16,
-  0x5b, 0x42, 0x49, 0x5c, 0x66, 0x79, 0x37, 0xea, 0xb7, 0x43, 0x91, 0x4b,
-  0xb5, 0x12, 0xb4, 0xe4, 0xe9, 0xe4, 0xb5, 0x83, 0xb5, 0xbb, 0xda, 0xd3,
-  0x3c, 0xe5, 0xd4, 0x19, 0x42, 0x79, 0x72, 0x5a, 0x86, 0x80, 0x0c, 0x69,
-  0xf4, 0x3d, 0x2a, 0x9e, 0x40, 0x48, 0xa7, 0x1e, 0xae, 0x38, 0x38, 0xd9,
-  0x94, 0x94, 0xce, 0x45, 0xd7, 0x8d, 0xb2, 0x5f, 0x4c, 0x53, 0x2a, 0xc3,
-  0xc1, 0x70, 0x07, 0xe1, 0x79, 0x31, 0xd6, 0x17, 0x27, 0xbc, 0xf4, 0x14,
-  0x2f, 0xc5, 0xad, 0xe4, 0x35, 0xb3, 0xe5, 0xd8, 0xf2, 0x66, 0x74, 0x79,
-  0xd1, 0xd7, 0xd9, 0x4f, 0xca, 0xf5, 0x57, 0xf4, 0x9e, 0x74, 0x9e, 0x4e,
-  0xba, 0xe3, 0x8c, 0x3e, 0x6e, 0x04, 0x38, 0xef, 0x1c, 0x8d, 0xaf, 0xbb,
-  0x32, 0xb5, 0xad, 0x69, 0x53, 0x5a, 0x66, 0x6e, 0x8e, 0x24, 0xb3, 0x73,
-  0xda, 0xda, 0x19, 0xdc, 0x00, 0x6c, 0xcd, 0xde, 0x02, 0x16, 0x9f, 0xef,
-  0x0a, 0xee, 0xa5, 0xae, 0x26, 0x89, 0x37, 0x6d, 0x8c, 0x32, 0x75, 0xef,
-  0x99, 0x35, 0xa2, 0xa6, 0x18, 0x59, 0x4e, 0xe6, 0x96, 0xbd, 0x42, 0xb8,
-  0x86, 0xb7, 0x2b, 0xce, 0x22, 0xfc, 0xf3, 0xcb, 0xc2, 0x58, 0x2a, 0xa9,
-  0x20, 0x80, 0x58, 0x96, 0x5c, 0x43, 0xac, 0xf3, 0x73, 0xd8, 0x92, 0x2d,
-  0x19, 0xc2, 0x01, 0xd4, 0x2f, 0x18, 0xe4, 0x67, 0x9b, 0x6b, 0x89, 0x0e,
-  0x2f, 0x4b, 0x85, 0x6f, 0x1d, 0x9d, 0x3b, 0x9a, 0xad, 0xbb, 0x05, 0xc1,
-  0x96, 0x09, 0x0f, 0xe2, 0x95, 0xb0, 0x54, 0x5e, 0x67, 0x10, 0xac, 0x67,
-  0x9f, 0x88, 0xe5, 0x58, 0xc6, 0xe6, 0x6c, 0x42, 0xab, 0xd5, 0xcb, 0x78,
-  0xa9, 0x35, 0xfc, 0x1c, 0xb2, 0x90, 0x66, 0x9b, 0x08, 0xd0, 0xc8, 0xe6,
-  0x92, 0x4c, 0x0e, 0x56, 0x03, 0xd5, 0x92, 0xb4, 0x75, 0x53, 0x49, 0x63,
-  0x32, 0xb7, 0x30, 0x13, 0x90, 0xdb, 0x22, 0xe7, 0x88, 0xd3, 0xa6, 0x6c,
-  0x6f, 0x42, 0x09, 0xf6, 0x3e, 0x8c, 0x9c, 0x31, 0x3a, 0x17, 0x2d, 0x8c,
-  0x72, 0x6b, 0x94, 0xcb, 0xb1, 0x5b, 0x58, 0xda, 0x23, 0x40, 0xf7, 0x52,
-  0x93, 0x47, 0x61, 0x65, 0x3f, 0xad, 0x71, 0xe1, 0xcd, 0x9e, 0x20, 0x71,
-  0x8d, 0x40, 0x41, 0xce, 0xdc, 0xb2, 0xb6, 0x3b, 0xc7, 0xcc, 0xd6, 0x07,
-  0xb9, 0x10, 0x37, 0x90, 0x97, 0x10, 0x8a, 0x1b, 0x91, 0xbc, 0xab, 0xe5,
-  0xcd, 0xfd, 0xa2, 0x26, 0xec, 0x92, 0x9a, 0x7e, 0xb3, 0x3b, 0x96, 0x06,
-  0x79, 0xb1, 0x5e, 0xe8, 0x48, 0x27, 0x1e, 0xf4, 0x61, 0x8c, 0x15, 0x54,
-  0xe7, 0x35, 0x47, 0x61, 0x1c, 0x68, 0x95, 0x51, 0x1f, 0x20, 0x08, 0xe9,
-  0xb0, 0xfd, 0x02, 0xad, 0xe2, 0xe7, 0xda, 0xe0, 0xc0, 0x33, 0x58, 0xe5,
-  0x20, 0xf9, 0x3a, 0xad, 0xf3, 0x49, 0x5f, 0x8a, 0x71, 0x48, 0x71, 0x0e,
-  0x7a, 0xc3, 0x16, 0xec, 0x48, 0xb6, 0x98, 0xe7, 0x79, 0x7b, 0x98, 0x7c,
-  0xaf, 0xd5, 0x55, 0x8c, 0x11, 0xc9, 0x45, 0x23, 0xf2, 0x09, 0x0a, 0xe9,
-  0x08, 0xe4, 0x84, 0xcf, 0x9e, 0xec, 0x4f, 0xf1, 0xe5, 0x83, 0x9d, 0x1d,
-  0x1f, 0x71, 0xdc, 0x93, 0x58, 0xd5, 0xb4, 0xfe, 0x60, 0x03, 0x67, 0x58,
-  0x2b, 0x11, 0x45, 0xc8, 0xd6, 0x64, 0x5d, 0x9a, 0x8d, 0x7c, 0x81, 0xd7,
-  0x20, 0xac, 0x56, 0x28, 0xc8, 0xd6, 0x03, 0xb2, 0xb1, 0xbb, 0xb6, 0xb6,
-  0xf8, 0x36, 0x5b, 0x91, 0x0e, 0x3b, 0xd3, 0x8a, 0xa8, 0xc1, 0xc0, 0x4c,
-  0x18, 0x4d, 0x8d, 0x08, 0xd0, 0xb3, 0xcb, 0xe3, 0x3f, 0x24, 0x87, 0xdd,
-  0x38, 0x3b, 0xdd, 0x4c, 0x2a, 0x86, 0xa5, 0x7c, 0xb1, 0xdd, 0x60, 0xe8,
-  0x3b, 0xc3, 0x58, 0x99, 0x8d, 0x35, 0xc5, 0xf2, 0x6f, 0x48, 0x66, 0xb6,
-  0x73, 0x2a, 0xd7, 0xa5, 0x64, 0xe4, 0xa0, 0xbc, 0xa3, 0xad, 0x03, 0x88,
-  0x08, 0xc4, 0xad, 0xab, 0x7e, 0xc3, 0xc5, 0x04, 0xf2, 0x94, 0x33, 0xa3,
-  0x3e, 0x99, 0x83, 0x8d, 0xda, 0x8b, 0x10, 0xa0, 0xc8, 0x83, 0x90, 0xe2,
-  0x96, 0x84, 0x52, 0x07, 0xf2, 0xbc, 0x91, 0x62, 0x00, 0x52, 0x88, 0xcd,
-  0x2b, 0xa4, 0x63, 0x5b, 0xa0, 0xdd, 0xff, 0x9e, 0x8e, 0xdc, 0x7b, 0xbd,
-  0x58, 0xe4, 0x0a, 0xe4, 0xbe, 0x5c, 0xb1, 0x1d, 0xd4, 0xde, 0xb2, 0x7a,
-  0xec, 0xf8, 0x36, 0x3b, 0x57, 0x10, 0x2b, 0x16, 0x82, 0xae, 0x00, 0x40,
-  0x4c, 0x10, 0x60, 0xc7, 0x9d, 0xaa, 0x52, 0xd3, 0xbf, 0x98, 0x40, 0x77,
-  0x4a, 0x77, 0x04, 0x17, 0xef, 0x16, 0xb2, 0x53, 0xce, 0x76, 0x30, 0xad,
-  0xb6, 0x53, 0xbd, 0x40, 0x90, 0x8c, 0x59, 0xa5, 0x5e, 0x8c, 0xce, 0x8e,
-  0xbe, 0x1d, 0xb5, 0x52, 0xcd, 0x4c, 0x6b, 0xf8, 0x90, 0x96, 0xac, 0xea,
-  0x6c, 0x68, 0x23, 0x0d, 0x4f, 0x9a, 0x8e, 0x78, 0xb2, 0x34, 0xa2, 0x1e,
-  0xbe, 0xf9, 0x95, 0x22, 0xf4, 0xb5, 0x59, 0xaa, 0xec, 0x32, 0xc9, 0x3c,
-  0x16, 0xe4, 0xa2, 0xdc, 0xf0, 0x6e, 0x3e, 0xde, 0x3f, 0x65, 0xad, 0x32,
-  0x91, 0x59, 0x72, 0xb9, 0x9e, 0xc6, 0x38, 0x63, 0x92, 0x2b, 0x62, 0xb0,
-  0xc4, 0x2a, 0x52, 0xff, 0x70, 0x02, 0x79, 0x67, 0xce, 0xb1, 0xb9, 0x37,
-  0xdc, 0xee, 0xa6, 0x3b, 0x68, 0xd5, 0x38, 0x73, 0x2e, 0x14, 0x6a, 0xdd,
-  0xeb, 0xae, 0x74, 0x68, 0x21, 0x55, 0x6b, 0x48, 0xb7, 0xd2, 0x5e, 0xd3,
-  0xea, 0x40, 0xb3, 0x2d, 0xac, 0x9e, 0xa5, 0x8b, 0xee, 0xa7, 0x21, 0x40,
-  0xa6, 0x4c, 0x93, 0xf9, 0x9d, 0x24, 0x25, 0x89, 0x6e, 0x40, 0x9c, 0x30,
-  0xf0, 0x4a, 0x7c, 0xfe, 0x79, 0xa0, 0x0b, 0x7e, 0xb2, 0x4f, 0x1f, 0x98,
-  0x5f, 0x7b, 0xde, 0x8f, 0x19, 0x61, 0x52, 0xc8, 0xdb, 0x00, 0x3d, 0xd4,
-  0xba, 0x40, 0x22, 0x16, 0x86, 0x57, 0x25, 0x8e, 0xbf, 0x68, 0xc3, 0x38,
-  0xc1, 0x2e, 0xeb, 0x3b, 0xb9, 0xbf, 0xc1, 0xe6, 0x35, 0x77, 0x34, 0xad,
-  0x19, 0xdb, 0xb4, 0xc2, 0x30, 0x53, 0x31, 0xd9, 0xed, 0xad, 0xa7, 0x35,
-  0x1b, 0xcd, 0x7d, 0x48, 0x97, 0x2a, 0x19, 0x01, 0xa3, 0x52, 0x1a, 0xa6,
-  0x49, 0x96, 0xce, 0xd8, 0xdd, 0xd1, 0xd9, 0x47, 0xb6, 0x14, 0x9b, 0x93,
-  0x11, 0xef, 0x56, 0x77, 0xe7, 0xdd, 0xaf, 0xe9, 0xce, 0x61, 0xb2, 0x36,
-  0xc5, 0x0f, 0x13, 0x24, 0x69, 0x7e, 0x4a, 0x00, 0x5e, 0x62, 0x57, 0xab,
-  0xde, 0xc3, 0x73, 0x84, 0x5a, 0x48, 0xe3, 0x36, 0x39, 0x70, 0xe8, 0x98,
-  0x28, 0x4a, 0x7e, 0x1a, 0x46, 0x0d, 0xb5, 0xdf, 0xd7, 0xae, 0x3c, 0xb4,
-  0xbb, 0x27, 0x7e, 0x5a, 0x5c, 0x4b, 0x33, 0xc1, 0x86, 0x97, 0x84, 0xb7,
-  0xbd, 0xe1, 0xae, 0xaf, 0x5f, 0xd9, 0x64, 0xda, 0x0a, 0x89, 0x71, 0x0d,
-  0x12, 0xe9, 0x9c, 0x8a, 0x42, 0x23, 0x81, 0x93, 0xb8, 0xf3, 0x9a, 0xfc,
-  0x6c, 0x8f, 0x59, 0x35, 0xcc, 0x49, 0x12, 0xd6, 0x4a, 0x4a, 0xae, 0xce,
-  0xe6, 0x0b, 0x64, 0x4b, 0xc5, 0xca, 0xfb, 0xe2, 0x1c, 0x3d, 0x76, 0x47,
-  0xea, 0x89, 0x5d, 0x6e, 0xe9, 0x23, 0xe7, 0xa3, 0x48, 0xf1, 0x3b, 0x4e,
-  0x09, 0x81, 0xf2, 0x99, 0x65, 0xdc, 0x52, 0xb3, 0x32, 0x41, 0xfa, 0xa8,
-  0x5d, 0x79, 0x80, 0xf6, 0x33, 0x2e, 0x5b, 0x5b, 0xa9, 0x55, 0xd8, 0xe6,
-  0x05, 0xc9, 0x4c, 0xad, 0x12, 0xe6, 0x3b, 0x22, 0x69, 0xc0, 0x5c, 0x92,
-  0xa1, 0x94, 0x1d, 0x9d, 0x6b, 0x76, 0x74, 0xd3, 0xd6, 0x52, 0x8e, 0x66,
-  0x17, 0xaa, 0xb3, 0xea, 0x99, 0x69, 0x77, 0x96, 0x9b, 0x0e, 0x6d, 0x82,
-  0xc6, 0x49, 0xab, 0x74, 0x89, 0x2c, 0xd4, 0x2d, 0x6c, 0x09, 0x55, 0xda,
-  0x25, 0xb0, 0x42, 0x1e, 0xd7, 0xae, 0xd0, 0xe5, 0x6b, 0xa0, 0x9f, 0x0c,
-  0xfe, 0x87, 0xcc, 0x0c, 0xa9, 0xe7, 0x04, 0x33, 0x03, 0xe3, 0xd6, 0xc2,
-  0x63, 0x5d, 0x11, 0x64, 0x2b, 0x04, 0x3e, 0x61, 0x48, 0x75, 0x1c, 0xb6,
-  0x10, 0x83, 0xa6, 0xe9, 0x41, 0xfe, 0xe9, 0xd8, 0xf3, 0xac, 0x5b, 0x99,
-  0x4c, 0x44, 0x05, 0x37, 0xb7, 0xe1, 0x6a, 0xfa, 0x02, 0x58, 0x18, 0x74,
-  0xd8, 0x5e, 0x64, 0x5f, 0x13, 0xb5, 0xf6, 0x51, 0x99, 0xfa, 0xd3, 0xaa,
-  0xb6, 0xdc, 0x86, 0xf6, 0x94, 0x37, 0xbf, 0x75, 0x65, 0x70, 0xc1, 0x83,
-  0x81, 0x79, 0x61, 0xf0, 0x4e, 0xdc, 0x19, 0x5f, 0xf1, 0x17, 0x86, 0x24,
-  0xcf, 0xe4, 0x0b, 0xe7, 0x28, 0x08, 0xa9, 0x0f, 0x1c, 0xc8, 0x4b, 0x54,
-  0x25, 0xa1, 0xe7, 0x79, 0x72, 0xda, 0x33, 0xc3, 0xef, 0x68, 0x25, 0x85,
-  0x4e, 0x8d, 0x65, 0x1c, 0x34, 0xfe, 0xab, 0x7b, 0x5f, 0x8c, 0xc8, 0x3b,
-  0x6a, 0x66, 0xc8, 0x79, 0x1b, 0xe2, 0x83, 0xd9, 0xdf, 0xdb, 0xe1, 0x4e,
-  0x69, 0x79, 0x64, 0xe8, 0x77, 0xb2, 0x35, 0x1d, 0x76, 0x04, 0x07, 0x02,
-  0x65, 0xcb, 0xdc, 0x04, 0x50, 0xaa, 0x09, 0x61, 0x7e, 0xe6, 0x04, 0x94,
-  0x50, 0x9e, 0x75, 0xba, 0xa2, 0xcc, 0x9d, 0xcb, 0x04, 0x99, 0xa5, 0xac,
-  0xd3, 0x86, 0x5b, 0xa8, 0xbe, 0x55, 0xfd, 0xcc, 0x96, 0x1a, 0x7c, 0xf4,
-  0xad, 0xa7, 0x8c, 0x22, 0x2b, 0x29, 0x0a, 0x19, 0xdf, 0xda, 0x5c, 0xec,
-  0xbc, 0x56, 0x84, 0x85, 0xd9, 0xd9, 0x17, 0x87, 0x6f, 0xbf, 0x39, 0x86,
-  0x46, 0x00, 0x19, 0x4f, 0x07, 0x35, 0xa7, 0x5d, 0x3f, 0x5d, 0x4e, 0x60,
-  0x12, 0x99, 0x99, 0x03, 0x5c, 0xae, 0x1e, 0x4a, 0xaa, 0x3e, 0xe7, 0xc1,
-  0xa4, 0xb2, 0x89, 0xb1, 0xec, 0x02, 0x82, 0xdb, 0x48, 0xd4, 0xb3, 0x0a,
-  0x4d, 0x02, 0x90, 0xe9, 0x8a, 0xdd, 0xb0, 0xf5, 0x72, 0xbc, 0x40, 0x29,
-  0x20, 0xd8, 0x69, 0x4e, 0xdc, 0xa8, 0xbf, 0x65, 0xd8, 0x3e, 0x93, 0x1b,
-  0x9a, 0x22, 0x65, 0x6d, 0xfb, 0x0a, 0xb6, 0xfd, 0xd0, 0xf7, 0xae, 0x31,
-  0x2f, 0xcb, 0xde, 0xee, 0xae, 0xa3, 0xcc, 0x4b, 0x6d, 0x83, 0x81, 0xd4,
-  0xac, 0x92, 0xdd, 0xc1, 0xb3, 0x67, 0xab, 0x04, 0xa2, 0x6d, 0x14, 0x54,
-  0x1c, 0x4f, 0x1e, 0xdc, 0xe6, 0x80, 0x1e, 0x5d, 0xd5, 0x66, 0xc4, 0xb2,
-  0x41, 0x89, 0x43, 0x01, 0x20, 0xd6, 0x56, 0x7b, 0x11, 0x4f, 0x0f, 0x47,
-  0x6d, 0x10, 0x0f, 0xb3, 0xa5, 0xf1, 0x30, 0x95, 0x1b, 0x89, 0xb5, 0x43,
-  0x40, 0x5d, 0xa3, 0x4e, 0xa1, 0x05, 0x61, 0x10, 0x73, 0x1b, 0xfa, 0x7d,
-  0xd0, 0xc4, 0x78, 0x86, 0xfc, 0x8a, 0x29, 0xba, 0x0a, 0x47, 0xa3, 0xaa,
-  0xc1, 0xbb, 0x73, 0xf2, 0x03, 0x9e, 0xbc, 0xfd, 0x86, 0xdd, 0x22, 0xc6,
-  0xc6, 0x87, 0x4f, 0x7d, 0xa7, 0x63, 0xf1, 0xbf, 0x93, 0x0a, 0xee, 0x54,
-  0xa0, 0x8c, 0x30, 0x1f, 0x5c, 0x2e, 0x21, 0x2f, 0xa4, 0x6c, 0xba, 0x5d,
-  0xfd, 0x15, 0x3e, 0xcb, 0xcb, 0x64, 0xe0, 0x29, 0x29, 0x42, 0x7c, 0x47,
-  0x1a, 0xca, 0xfc, 0x4e, 0x2d, 0x24, 0xf9, 0x02, 0x5a, 0xd7, 0x08, 0x8d,
-  0x6d, 0x96, 0xed, 0x5d, 0x36, 0xd3, 0xb1, 0x83, 0x02, 0x1d, 0x25, 0xf2,
-  0x49, 0xfe, 0x0c, 0xce, 0x78, 0x47, 0x23, 0x79, 0x58, 0x57, 0x5a, 0x2e,
-  0xcf, 0x36, 0xeb, 0x36, 0x69, 0x58, 0x7d, 0xf5, 0x01, 0x75, 0xdd, 0x91,
-  0x5c, 0xcf, 0xd0, 0x97, 0xee, 0xb4, 0xda, 0x60, 0xf3, 0x2f, 0xcb, 0x7f,
-  0xbe, 0x9f, 0x6b, 0x7a, 0x48, 0x07, 0x95, 0x6e, 0xac, 0x62, 0xea, 0x7c,
-  0x1b, 0xd2, 0xe3, 0x68, 0x40, 0xe4, 0x92, 0xdf, 0xe7, 0x4f, 0xa7, 0xf1,
-  0xcf, 0xf1, 0xfb, 0x3a, 0x35, 0x91, 0x03, 0x40, 0xaa, 0xad, 0x10, 0x23,
-  0x5a, 0xea, 0x02, 0xb5, 0x69, 0x48, 0x1b, 0x87, 0xe4, 0xc8, 0xdb, 0xea,
-  0xc9, 0x46, 0x22, 0x5c, 0x29, 0xa0, 0x4d, 0xa4, 0x3d, 0x04, 0x7e, 0x1e,
-  0x5c, 0x62, 0x1f, 0x80, 0x27, 0x35, 0xcf, 0x2f, 0x8b, 0x22, 0x23, 0x63,
-  0x15, 0x55, 0x4d, 0x73, 0xb6, 0x1b, 0xfa, 0xf6, 0x14, 0x55, 0x4b, 0xa9,
-  0x33, 0x0e, 0x50, 0x83, 0xe9, 0x7c, 0x5a, 0xdf, 0x00, 0x6d, 0x68, 0x5d,
-  0x52, 0xa1, 0x9a, 0x85, 0xcf, 0x73, 0xbb, 0xa4, 0x57, 0xb1, 0x52, 0x05,
-  0x25, 0xbb, 0x35, 0x15, 0xed, 0x19, 0xd8, 0xd8, 0x20, 0x67, 0xfc, 0x0e,
-  0xb9, 0xe4, 0x47, 0xe1, 0x04, 0xaa, 0x4f, 0x7d, 0xad, 0x5f, 0xbe, 0x1b,
-  0x6c, 0x58, 0xef, 0xa6, 0xf7, 0x5c, 0x29, 0x0f, 0x3d, 0x76, 0xac, 0xcc,
-  0x47, 0x82, 0x8c, 0x38, 0x79, 0x9e, 0x34, 0x8b, 0xee, 0xf7, 0xb6, 0x6b,
-  0xcd, 0x37, 0x0c, 0xe0, 0x01, 0x82, 0x99, 0x86, 0xc2, 0x2d, 0x9d, 0x35,
-  0xe3, 0x94, 0xb5, 0xf3, 0x77, 0x97, 0xc2, 0x67, 0xa6, 0x32, 0xde, 0x2f,
-  0x68, 0xe5, 0x57, 0xae, 0x85, 0x48, 0x23, 0x45, 0x83, 0x6d, 0x61, 0x04,
-  0xbe, 0x39, 0x13, 0x13, 0xdf, 0xc4, 0x08, 0xb9, 0x83, 0x7d, 0x9b, 0x72,
-  0x73, 0x7e, 0x36, 0xba, 0x24, 0x9f, 0x02, 0xee, 0x3f, 0x35, 0x4e, 0xbf,
-  0x3b, 0xbe, 0xf8, 0xfa, 0x6c, 0x74, 0x6c, 0x16, 0xe5, 0xe5, 0xf1, 0xd7,
-  0xef, 0x48, 0x74, 0xd1, 0x16, 0x61, 0x3f, 0x34, 0xa5, 0xe3, 0x88, 0x33,
-  0x8c, 0x8a, 0x0b, 0x23, 0x2b, 0x0f, 0x7b, 0x95, 0x95, 0x22, 0x2d, 0x2a,
-  0x6b, 0xf5, 0x3d, 0x2e, 0x8e, 0x3b, 0xcb, 0xd8, 0x71, 0x99, 0x23, 0x79,
-  0x81, 0x79, 0xa4, 0x24, 0xef, 0x09, 0xe5, 0x34, 0x61, 0x6b, 0xca, 0x79,
-  0x62, 0x2e, 0xf7, 0xfa, 0xc0, 0x79, 0x38, 0x3f, 0xb2, 0x9b, 0x5a, 0x4e,
-  0xa0, 0x2b, 0x00, 0x0a, 0x52, 0x2b, 0xec, 0xe0, 0x23, 0xab, 0x54, 0x0b,
-  0xad, 0xd3, 0xac, 0xe4, 0xab, 0x13, 0x35, 0x2b, 0xa9, 0x6d, 0x5c, 0xe6,
-  0x79, 0x83, 0x7b, 0x9c, 0xad, 0x0b, 0xa9, 0x9f, 0x59, 0xf3, 0x0e, 0xe7,
-  0x62, 0xc1, 0x84, 0x5b, 0xcb, 0xbc, 0xda, 0xa9, 0x75, 0xc6, 0xb5, 0x34,
-  0xf8, 0xea, 0x96, 0xe0, 0x38, 0xe3, 0x84, 0x85, 0x4b, 0x6e, 0x4b, 0x2c,
-  0xe2, 0x5b, 0x8c, 0x53, 0x78, 0xf2, 0xb9, 0x00, 0xa5, 0x25, 0x55, 0xa6,
-  0x99, 0xf7, 0x8b, 0x01, 0xf1, 0xd6, 0xf9, 0xb8, 0x5a, 0xfe, 0x5c, 0xf2,
-  0x48, 0x41, 0xbf, 0x01, 0x6d, 0x40, 0xf2, 0xa0, 0xd0, 0xef, 0x4e, 0x59,
-  0x1d, 0xa7, 0xa5, 0xf0, 0x01, 0xa6, 0x4c, 0x04, 0xcf, 0x9e, 0x5c, 0x5d,
-  0xb1, 0x52, 0x55, 0x5b, 0x89, 0x36, 0xb9, 0x24, 0x24, 0x96, 0xb0, 0x02,
-  0xe1, 0xa3, 0x25, 0x45, 0x7c, 0x80, 0x37, 0x5f, 0x78, 0xe8, 0xb9, 0x75,
-  0xfc, 0x17, 0x07, 0xd5, 0x8b, 0xa2, 0x6c, 0x6c, 0x6c, 0xbc, 0x3c, 0xbe,
-  0x3c, 0x3c, 0x39, 0x3d, 0x7e, 0x99, 0x9c, 0xbc, 0x7d, 0x75, 0x76, 0xf1,
-  0xe6, 0xf0, 0x52, 0xb0, 0x19, 0x2f, 0xad, 0x7b, 0xce, 0x95, 0xfa, 0x93,
-  0x82, 0x56, 0x9e, 0xeb, 0x0e, 0x5b, 0xd8, 0xac, 0xa2, 0x99, 0x0c, 0x44,
-  0xfc, 0x79, 0x1a, 0xb2, 0xd6, 0x1c, 0x6c, 0x24, 0x82, 0xe9, 0x70, 0xb5,
-  0x11, 0x49, 0x39, 0xd8, 0xb1, 0x81, 0xf8, 0xa1, 0x4e, 0xa7, 0x25, 0xf3,
-  0x22, 0xce, 0xeb, 0xb5, 0x4d, 0xd9, 0x52, 0xb7, 0x7c, 0x31, 0xba, 0xba,
-  0xd4, 0xd8, 0x93, 0x83, 0x93, 0x1d, 0xae, 0xb0, 0xee, 0xd5, 0xcd, 0xd0,
-  0xa2, 0x47, 0x60, 0x84, 0xa1, 0x76, 0x3c, 0x16, 0xa7, 0xab, 0x12, 0x10,
-  0x13, 0xbf, 0x4d, 0xcb, 0x4d, 0x84, 0x15, 0x35, 0xaa, 0x00, 0x63, 0x7a,
-  0xf0, 0x13, 0x7f, 0x7d, 0x89, 0x1c, 0x68, 0x83, 0xa0, 0x68, 0x8d, 0x54,
-  0xec, 0x23, 0x9e, 0xad, 0xda, 0xac, 0x94, 0x3d, 0xeb, 0xe0, 0xfe, 0xb2,
-  0x52, 0x5b, 0x43, 0x75, 0x42, 0x98, 0xec, 0x37, 0xb5, 0x65, 0x83, 0xf7,
-  0x46, 0x6d, 0x1a, 0x9c, 0x08, 0x7b, 0x37, 0xcd, 0xc5, 0xf6, 0x06, 0x17,
-  0x78, 0x28, 0x94, 0x37, 0xd1, 0x42, 0x4f, 0x9d, 0xf9, 0x9f, 0xef, 0x78,
-  0xd5, 0x47, 0x71, 0xda, 0xdc, 0xb9, 0x55, 0xb6, 0xf5, 0xc1, 0x4b, 0xf3,
-  0xd0, 0x74, 0x39, 0x5f, 0xb4, 0x4b, 0xcb, 0xb3, 0x63, 0x4f, 0x97, 0x90,
-  0x35, 0x37, 0x68, 0x20, 0xf0, 0x02, 0xbd, 0x92, 0x39, 0xe0, 0x71, 0x60,
-  0x7f, 0x37, 0x1a, 0x17, 0x04, 0x9d, 0x88, 0x0d, 0xe5, 0x75, 0x6b, 0xc8,
-  0xb6, 0xd5, 0x17, 0x4c, 0xc8, 0xc8, 0x3e, 0xdb, 0x2d, 0x3a, 0x9b, 0x3a,
-  0xe0, 0x11, 0xe6, 0x7f, 0x4b, 0x39, 0xe8, 0x68, 0xcb, 0x4a, 0x83, 0x72,
-  0x55, 0x84, 0x91, 0xc8, 0xd6, 0xa0, 0xfc, 0x17, 0xdb, 0xf8, 0x1e, 0x5f,
-  0xd2, 0xeb, 0xa7, 0x1d, 0xe5, 0x5a, 0xb7, 0x07, 0x22, 0xc5, 0x8d, 0x3c,
-  0xb9, 0xd3, 0x6a, 0x2b, 0x44, 0xec, 0x09, 0xec, 0x11, 0x79, 0x4e, 0xc1,
-  0x80, 0x20, 0x92, 0x12, 0xd1, 0x31, 0xdd, 0xbe, 0x4b, 0xd4, 0x10, 0x29,
-  0x3f, 0x90, 0x61, 0xaf, 0x75, 0x83, 0xbd, 0xdc, 0x3d, 0x86, 0x94, 0x09,
-  0xdd, 0x22, 0x84, 0x5e, 0xb1, 0xa1, 0x69, 0xc6, 0xfa, 0x92, 0x82, 0x1f,
-  0x21, 0xfd, 0xb7, 0x68, 0xae, 0xc0, 0x26, 0x89, 0xf2, 0x2f, 0x59, 0x5a,
-  0xc3, 0xaa, 0x42, 0x06, 0x0f, 0xdf, 0x19, 0xd6, 0x27, 0xeb, 0x98, 0x03,
-  0xbd, 0x6a, 0x8a, 0x10, 0xd1, 0xd3, 0xe4, 0x39, 0x3d, 0x4b, 0x8c, 0x4c,
-  0x96, 0xf1, 0x07, 0x88, 0x7d, 0xdb, 0x8a, 0x46, 0x3b, 0x4c, 0x33, 0x80,
-  0x5d, 0x0b, 0x0e, 0xf5, 0x9c, 0x1e, 0x48, 0x55, 0xcd, 0xef, 0xb9, 0xca,
-  0x57, 0xbd, 0xc5, 0x8d, 0xf9, 0x46, 0x2f, 0xb9, 0x26, 0x43, 0x69, 0x6c,
-  0xba, 0x1e, 0x08, 0xd0, 0x29, 0x3f, 0xfe, 0xe2, 0x22, 0xbd, 0x4a, 0xb3,
-  0xd9, 0x9f, 0xf6, 0x77, 0x47, 0xe9, 0xf5, 0x72, 0x96, 0xfe, 0x1b, 0x5e,
-  0x7c, 0xf1, 0xe8, 0xd1, 0xfe, 0xee, 0x67, 0x9f, 0xef, 0x06, 0xda, 0x81,
-  0x8f, 0xb5, 0x01, 0xff, 0x0e, 0x09, 0x5d, 0x7c, 0x64, 0x38, 0xb9, 0xce,
-  0x61, 0xd6, 0x91, 0xaa, 0x24, 0x13, 0x90, 0xb2, 0x3d, 0x09, 0x19, 0xc9,
-  0xd9, 0xca, 0x66, 0xfb, 0xd6, 0x66, 0x53, 0xff, 0x71, 0xef, 0x80, 0xe5,
-  0xd8, 0x35, 0xdc, 0xf0, 0x29, 0x6f, 0xd7, 0xe4, 0x79, 0x5e, 0x98, 0xeb,
-  0xe7, 0xcb, 0xa4, 0x49, 0xaf, 0xed, 0x46, 0x45, 0x0b, 0x58, 0x0a, 0xbb,
-  0x96, 0x0d, 0x82, 0xd5, 0x33, 0x05, 0x48, 0x9f, 0x48, 0x05, 0xba, 0x4d,
-  0xf2, 0x83, 0xf4, 0xd8, 0x11, 0xd2, 0x43, 0x07, 0xfa, 0xb6, 0xec, 0xf8,
-  0x60, 0xaa, 0x9d, 0x1a, 0xe2, 0xef, 0xa0, 0xfb, 0x48, 0x99, 0x3e, 0xb2,
-  0xb7, 0xe0, 0x04, 0x7b, 0x5b, 0x8c, 0x8c, 0x3d, 0x66, 0x79, 0xab, 0x0b,
-  0xa9, 0x43, 0x65, 0x26, 0xcf, 0xd5, 0xb5, 0xb3, 0xf7, 0xe5, 0x0b, 0x2c,
-  0xdc, 0xde, 0x97, 0xff, 0x66, 0x7f, 0xb6, 0x2f, 0x3f, 0xdb, 0xff, 0xf2,
-  0xdf, 0x86, 0x43, 0xf4, 0x8f, 0x56, 0x72, 0x53, 0x7f, 0xbd, 0x29, 0x44,
-  0x42, 0xa9, 0x1c, 0x35, 0xfe, 0x17, 0xd9, 0xd8, 0x5c, 0xc1, 0x0c, 0x6b,
-  0xd2, 0xd3, 0x2f, 0xfb, 0x13, 0xd2, 0x97, 0x30, 0xa8, 0x95, 0x2f, 0x79,
-  0xed, 0xf3, 0x14, 0xd6, 0xb1, 0xf9, 0xb1, 0xc1, 0x0b, 0xb4, 0x23, 0xd8,
-  0x47, 0xbc, 0xfc, 0x67, 0xda, 0x51, 0x7f, 0xde, 0x48, 0x24, 0x24, 0xb9,
-  0xc8, 0x2a, 0xa3, 0x08, 0x53, 0x94, 0x42, 0xb7, 0x17, 0x13, 0x4e, 0x31,
-  0x89, 0x36, 0xb5, 0x4c, 0x29, 0x1e, 0x74, 0x57, 0x79, 0xf5, 0xb8, 0xfe,
-  0x22, 0x34, 0x26, 0xbc, 0x36, 0x1b, 0x89, 0x7d, 0x86, 0x53, 0x61, 0x8c,
-  0x2e, 0xd0, 0xd0, 0x29, 0xc6, 0xb3, 0x7f, 0xfa, 0xe1, 0x07, 0x51, 0x7c,
-  0xcc, 0x5f, 0xa4, 0xe7, 0x37, 0x46, 0x66, 0x4c, 0x8d, 0x18, 0x9a, 0xa3,
-  0xc0, 0x8f, 0x94, 0x50, 0x93, 0xab, 0xf9, 0x4a, 0x46, 0xca, 0x8d, 0x98,
-  0xa5, 0x3d, 0x1c, 0x1d, 0x9d, 0x9c, 0x00, 0xe6, 0x89, 0x49, 0x3d, 0x66,
-  0x71, 0x83, 0x6d, 0xb4, 0x05, 0x5c, 0x86, 0xc3, 0x12, 0xfa, 0xbb, 0x94,
-  0xd6, 0x0e, 0xcb, 0x8e, 0x8d, 0x6a, 0x1a, 0x53, 0x6b, 0x59, 0x96, 0x12,
-  0xdb, 0x8b, 0xb5, 0x91, 0x17, 0x3d, 0x7e, 0xf0, 0x3a, 0xef, 0x49, 0xe4,
-  0x89, 0x7f, 0xd2, 0x73, 0x4c, 0x69, 0xbc, 0x1e, 0x58, 0xb4, 0x17, 0xac,
-  0xe2, 0xe4, 0xff, 0xc8, 0x5e, 0xec, 0xed, 0xc6, 0x9f, 0x40, 0xa8, 0x95,
-  0x38, 0x22, 0x5f, 0xb8, 0x28, 0xde, 0xba, 0xe7, 0xf3, 0x29, 0x3f, 0x2d,
-  0x25, 0xc8, 0x51, 0x0d, 0xee, 0x45, 0x6f, 0x4c, 0x37, 0x21, 0xfd, 0xff,
-  0x15, 0xfd, 0x40, 0x98, 0x49, 0x9e, 0xad, 0x97, 0xe3, 0x79, 0xde, 0xea,
-  0xf0, 0x0e, 0x0d, 0xf0, 0x4b, 0x1a, 0xf0, 0xf7, 0x99, 0xdd, 0x1d, 0x19,
-  0xa9, 0x60, 0xac, 0xa3, 0x6d, 0x5e, 0x95, 0xe5, 0x38, 0xad, 0x36, 0x25,
-  0x06, 0xa3, 0xfd, 0xdc, 0xdc, 0xdb, 0x7f, 0xf4, 0xf8, 0xc9, 0xe6, 0x50,
-  0xf4, 0x29, 0x9c, 0xe6, 0xc6, 0x27, 0x25, 0xe1, 0x26, 0x2c, 0x97, 0x06,
-  0xc3, 0xa9, 0x91, 0xc4, 0x1f, 0x8b, 0x88, 0x92, 0xb4, 0xa1, 0xcf, 0xbd,
-  0xe0, 0xaf, 0xfd, 0x1b, 0x7d, 0xe7, 0x05, 0x3e, 0xf1, 0x6f, 0xf9, 0xf4,
-  0x85, 0x1d, 0xe1, 0xbf, 0xd1, 0x58, 0x5e, 0xc8, 0x20, 0xd6, 0x88, 0x9e,
-  0xe8, 0xa2, 0xea, 0xe2, 0x6d, 0x60, 0xb0, 0x80, 0x1b, 0x0c, 0xa6, 0x1c,
-  0xaa, 0x80, 0x36, 0xe9, 0xb2, 0xeb, 0x76, 0x3e, 0x0d, 0x4c, 0x2b, 0x03,
-  0x6a, 0x65, 0xe0, 0x04, 0x2a, 0x28, 0x3d, 0x07, 0xb4, 0x00, 0x7d, 0x49,
-  0xaf, 0x9c, 0xc1, 0x15, 0x22, 0x57, 0x75, 0x59, 0x22, 0x62, 0x7f, 0xf4,
-  0xcd, 0xc9, 0xa6, 0xa0, 0x64, 0xd8, 0x96, 0xeb, 0xc7, 0x9c, 0xc9, 0x16,
-  0x0f, 0x38, 0x49, 0x17, 0x74, 0xea, 0x37, 0x94, 0xb5, 0x38, 0x25, 0xd0,
-  0x07, 0x7d, 0x97, 0x73, 0xa1, 0xcd, 0xc7, 0xe4, 0x56, 0x98, 0x91, 0x7b,
-  0xba, 0x62, 0xb2, 0x51, 0xaf, 0x19, 0x33, 0x1f, 0xb5, 0xa0, 0x3f, 0x10,
-  0xa0, 0x59, 0xd8, 0x54, 0xca, 0xc1, 0x2b, 0x1b, 0xa1, 0xb4, 0xa9, 0x7b,
-  0xf2, 0xa8, 0xf9, 0x15, 0xcb, 0x11, 0x15, 0x0d, 0xbd, 0xa1, 0x16, 0x76,
-  0xe7, 0x1d, 0xe0, 0x4b, 0x0d, 0xa4, 0xf3, 0x8f, 0x33, 0x49, 0xc0, 0x64,
-  0xdf, 0x06, 0x2b, 0x6e, 0x24, 0x37, 0x9f, 0xdb, 0x8a, 0x8a, 0x5f, 0x26,
-  0x20, 0x1f, 0xe7, 0xb7, 0x24, 0x48, 0x28, 0x5e, 0x22, 0x76, 0xb0, 0xe2,
-  0xa5, 0x0d, 0x57, 0xc5, 0x91, 0x67, 0xc4, 0x41, 0x67, 0xe4, 0xe2, 0xf6,
-  0x59, 0x55, 0xc7, 0x77, 0xe2, 0x11, 0xa0, 0x16, 0x36, 0xbf, 0xc0, 0xe6,
-  0x7f, 0x4e, 0xcb, 0x80, 0x5f, 0x7f, 0xb9, 0xb9, 0x61, 0x0b, 0x8a, 0x59,
-  0xcd, 0xba, 0x13, 0xed, 0xe5, 0x8d, 0xe9, 0x8f, 0xc7, 0x63, 0x4c, 0x60,
-  0x6d, 0x89, 0x18, 0x5a, 0x50, 0x35, 0xc4, 0x68, 0x3b, 0xb3, 0xa9, 0x94,
-  0x63, 0xb6, 0xde, 0x64, 0x6e, 0x3c, 0x23, 0x92, 0x1b, 0xd2, 0xee, 0x36,
-  0x09, 0x5a, 0x8a, 0xf7, 0x36, 0x2d, 0x83, 0x2e, 0x1c, 0x9b, 0x10, 0x74,
-  0x55, 0xa6, 0x55, 0x82, 0x37, 0x24, 0xdd, 0xde, 0x69, 0xdb, 0xfe, 0xc0,
-  0x6a, 0xef, 0x72, 0x77, 0x09, 0x8c, 0x4c, 0x5a, 0x14, 0x1c, 0x8d, 0x57,
-  0x94, 0x19, 0x2c, 0x1f, 0x7d, 0x41, 0xd3, 0xbd, 0x37, 0xbc, 0xce, 0xaf,
-  0x78, 0x32, 0x8c, 0x68, 0xbc, 0xce, 0x76, 0xcc, 0x3f, 0xfb, 0xe6, 0xe7,
-  0xfb, 0xa4, 0x35, 0xd1, 0x5f, 0x1e, 0x01, 0x3c, 0xb5, 0xee, 0x80, 0xd8,
-  0xc3, 0x41, 0x7f, 0xc9, 0xed, 0xdd, 0x2c, 0x71, 0x18, 0xe9, 0xea, 0x40,
-  0x99, 0x6d, 0x91, 0x3b, 0xa7, 0xfa, 0xa0, 0x0f, 0x03, 0x21, 0x6b, 0x88,
-  0xec, 0xc6, 0x25, 0x25, 0xad, 0x58, 0xb8, 0x87, 0x40, 0x1f, 0x44, 0x9b,
-  0x26, 0xe5, 0x38, 0x17, 0x47, 0x0a, 0x25, 0xf9, 0xe0, 0x5a, 0xcd, 0x6e,
-  0xb7, 0xfb, 0x3e, 0x36, 0xd6, 0xc8, 0xf6, 0x8f, 0x94, 0x32, 0x4f, 0xb4,
-  0x22, 0x2e, 0xe1, 0x92, 0x3e, 0xbf, 0x25, 0x15, 0x38, 0xbd, 0x54, 0x62,
-  0xac, 0x75, 0xde, 0x5d, 0xc6, 0x76, 0x11, 0x4b, 0x86, 0xde, 0xe5, 0x75,
-  0xb3, 0x4d, 0x9f, 0xc9, 0x66, 0xcc, 0xa1, 0x26, 0xe5, 0x6b, 0xf5, 0xab,
-  0x4a, 0x9e, 0x86, 0x0f, 0x6d, 0xfa, 0x02, 0xa0, 0x9c, 0x34, 0x99, 0x31,
-  0x48, 0x91, 0x73, 0xc0, 0x42, 0xee, 0x78, 0xce, 0xe4, 0xd5, 0xd8, 0xc7,
-  0xb3, 0x01, 0x5f, 0x9d, 0xa2, 0xba, 0x0c, 0x5e, 0x0d, 0x93, 0x53, 0x60,
-  0xbc, 0xeb, 0x94, 0x39, 0x7a, 0xf4, 0x7a, 0xd5, 0x2d, 0x61, 0xf6, 0x0f,
-  0x2b, 0xca, 0x1b, 0x5c, 0x5a, 0x94, 0xf8, 0x2e, 0x74, 0x5f, 0x81, 0xa2,
-  0xd4, 0x59, 0x86, 0xac, 0x5c, 0x88, 0x32, 0xd2, 0x87, 0xd7, 0xda, 0x3e,
-  0x07, 0xef, 0x3c, 0x7b, 0xe8, 0x90, 0xdd, 0x65, 0x77, 0xad, 0xd7, 0x08,
-  0xc3, 0xac, 0x44, 0x4b, 0xf4, 0x64, 0xba, 0x3d, 0x09, 0x0c, 0x82, 0xcc,
-  0xd8, 0x33, 0x42, 0xc4, 0x0b, 0x44, 0x15, 0x84, 0x28, 0xae, 0x69, 0x0d,
-  0x5b, 0x8d, 0xaa, 0x8b, 0xd2, 0x5e, 0xea, 0xc1, 0xb8, 0x9b, 0x65, 0xd6,
-  0x02, 0xe6, 0xb5, 0x2a, 0x2d, 0x40, 0x1c, 0x0e, 0x13, 0x21, 0x66, 0xb6,
-  0x01, 0x36, 0xea, 0x24, 0xf5, 0x2b, 0xfd, 0x68, 0xfe, 0x42, 0x8e, 0xc3,
-  0x71, 0x65, 0x56, 0x3d, 0xab, 0xf8, 0x5e, 0x60, 0x54, 0x8f, 0x57, 0x6a,
-  0xf5, 0xf5, 0xe5, 0x9b, 0xd3, 0x44, 0xb9, 0x8e, 0xae, 0x9c, 0x4a, 0xa7,
-  0x58, 0x4a, 0x0c, 0x51, 0xdc, 0x17, 0xac, 0x0c, 0xc9, 0x53, 0x7c, 0xc5,
-  0xf1, 0xdc, 0x52, 0x1a, 0x7c, 0x42, 0x93, 0xd3, 0x3a, 0xb7, 0xde, 0x13,
-  0xfc, 0xea, 0x06, 0x33, 0xb0, 0x6d, 0xd2, 0x14, 0x6c, 0xf6, 0x93, 0x4d,
-  0xea, 0x2a, 0xfd, 0x62, 0x13, 0xf3, 0x89, 0x1f, 0x7b, 0xd3, 0xb7, 0x39,
-  0x8c, 0x1c, 0x45, 0x7a, 0xe6, 0xc5, 0x57, 0xad, 0x59, 0xc2, 0xcf, 0xb5,
-  0xa9, 0x17, 0x9c, 0xe1, 0x11, 0x1c, 0x3e, 0x7d, 0xd7, 0x6b, 0xff, 0xc5,
-  0x51, 0x49, 0x9c, 0xb4, 0x54, 0xca, 0xd5, 0x01, 0x53, 0x27, 0xf6, 0x67,
-  0x39, 0x52, 0x62, 0x7f, 0xc5, 0x29, 0xbe, 0x54, 0x79, 0x64, 0x41, 0x9b,
-  0x2c, 0xe2, 0x78, 0x0b, 0xa8, 0xf8, 0x35, 0xab, 0x99, 0xb3, 0x71, 0x76,
-  0x5b, 0xc2, 0x15, 0x00, 0xc1, 0xb3, 0x37, 0x44, 0x8a, 0xa4, 0xe3, 0xd0,
-  0xb7, 0x0d, 0x58, 0x0b, 0xbb, 0x87, 0x09, 0xed, 0x59, 0x1c, 0xad, 0xda,
-  0xdd, 0x3a, 0xcb, 0x31, 0x01, 0xb6, 0xc8, 0x27, 0x94, 0x64, 0x63, 0xe4,
-  0xd7, 0xb4, 0xbc, 0x26, 0xf1, 0xd5, 0x37, 0x07, 0x8d, 0xfe, 0x04, 0x84,
-  0x78, 0x5f, 0x3e, 0xca, 0x1d, 0xc6, 0x59, 0xe1, 0x48, 0x8b, 0xfe, 0x7b,
-  0x05, 0xa8, 0xf4, 0x15, 0x39, 0x2d, 0x27, 0xd2, 0xb6, 0x6d, 0x9a, 0xd7,
-  0xc3, 0xb4, 0x6f, 0x7f, 0xe1, 0x7f, 0x4b, 0x27, 0x27, 0x95, 0x96, 0xb9,
-  0xa4, 0xae, 0x54, 0x1c, 0x9e, 0xdd, 0xd9, 0x72, 0x62, 0xf0, 0x42, 0x11,
-  0x17, 0x3e, 0x5f, 0x5e, 0x33, 0xc9, 0xdb, 0xdb, 0xfc, 0x6a, 0x93, 0x51,
-  0xfd, 0x9b, 0xcf, 0x37, 0x21, 0xc1, 0x48, 0x2e, 0xcd, 0xc7, 0x19, 0xb2,
-  0xcb, 0xe4, 0x86, 0xda, 0xe4, 0xab, 0x71, 0xc0, 0x0a, 0x84, 0x90, 0x53,
-  0xba, 0x03, 0x82, 0xbb, 0xd9, 0xd9, 0x7a, 0x3e, 0xdc, 0x11, 0xb6, 0xbc,
-  0x2b, 0xf4, 0x4b, 0xa4, 0xd5, 0xe3, 0x86, 0xa1, 0x2d, 0x72, 0xf3, 0x42,
-  0x27, 0x03, 0x15, 0x0a, 0xb1, 0x03, 0x89, 0x2f, 0x72, 0x59, 0x2c, 0x28,
-  0xf9, 0x7d, 0xd2, 0xc0, 0x25, 0xc2, 0x67, 0x69, 0x98, 0xbc, 0x2b, 0xe0,
-  0x73, 0xbb, 0xc9, 0xc8, 0xa2, 0xcd, 0xab, 0xc9, 0x72, 0x4e, 0xfe, 0x84,
-  0x09, 0x79, 0xb1, 0x70, 0xfb, 0xb0, 0x8e, 0xd0, 0x0a, 0xa8, 0xfb, 0x1d,
-  0x66, 0x0f, 0x06, 0xbb, 0xb6, 0xe5, 0xbb, 0x00, 0x8f, 0x10, 0x64, 0x4a,
-  0x5c, 0xd7, 0x50, 0x0d, 0x2c, 0x25, 0x8a, 0x08, 0x20, 0x8a, 0xe1, 0x1d,
-  0xbf, 0x3a, 0xbe, 0xb8, 0x38, 0xbe, 0xa0, 0xf9, 0x3e, 0xec, 0xd4, 0x6d,
-  0x53, 0xc2, 0x6c, 0x17, 0x14, 0x54, 0xa0, 0xae, 0xef, 0x4e, 0xd1, 0x3c,
-  0x22, 0x12, 0x85, 0x42, 0x8f, 0x0a, 0xf3, 0x81, 0x49, 0x80, 0xb8, 0x30,
-  0x86, 0xef, 0x03, 0x04, 0x50, 0xdb, 0x3a, 0xf8, 0x01, 0x5c, 0x82, 0x97,
-  0xb0, 0xa5, 0x60, 0xb8, 0x16, 0x2a, 0x29, 0x95, 0xb0, 0xd4, 0x94, 0xfb,
-  0x9b, 0xac, 0xa5, 0xa3, 0x0e, 0x05, 0x5b, 0x9b, 0x49, 0xf8, 0x7b, 0x66,
-  0x9d, 0x08, 0x18, 0xf2, 0x15, 0x9d, 0x51, 0x32, 0x9c, 0x30, 0x19, 0x75,
-  0xb3, 0x5c, 0xe4, 0x53, 0xeb, 0x92, 0x35, 0x3f, 0x37, 0x3a, 0x60, 0xc2,
-  0xa7, 0xbc, 0x56, 0x74, 0x0a, 0xe2, 0x8f, 0xea, 0x31, 0xf0, 0x5d, 0x62,
-  0x9d, 0xaa, 0xe6, 0x09, 0x52, 0xd5, 0x18, 0xe6, 0xa5, 0x14, 0xf8, 0xed,
-  0xe4, 0x71, 0xd9, 0xfb, 0x19, 0x5c, 0x81, 0x24, 0x2d, 0x14, 0x30, 0xe3,
-  0x4b, 0x06, 0x72, 0x38, 0xcd, 0x1d, 0x42, 0xdd, 0x55, 0x41, 0xbe, 0x40,
-  0xce, 0x68, 0x75, 0x90, 0xfc, 0x58, 0xe7, 0x93, 0x9f, 0xdd, 0xe5, 0x81,
-  0x84, 0x9d, 0x36, 0x4b, 0x15, 0xa6, 0x4e, 0x26, 0x4a, 0x2c, 0x61, 0xce,
-  0xd5, 0x7e, 0x37, 0x3a, 0xbe, 0x48, 0x0e, 0xbf, 0x21, 0xee, 0xf7, 0x7f,
-  0x72, 0x81, 0xe9, 0x39, 0xb9, 0x1d, 0x36, 0x84, 0x42, 0x41, 0x88, 0x4b,
-  0xb2, 0xa9, 0x5f, 0xb3, 0x78, 0xd8, 0x5a, 0xd9, 0x5c, 0x2b, 0x5d, 0x78,
-  0x2c, 0x13, 0xad, 0x35, 0x24, 0x9f, 0xde, 0x3d, 0xab, 0xf8, 0x90, 0x35,
-  0xa4, 0x43, 0xe6, 0xaf, 0x22, 0x53, 0x1e, 0x71, 0xdc, 0x40, 0xd7, 0x46,
-  0x7a, 0x5f, 0x07, 0x36, 0x27, 0xaf, 0xd2, 0x61, 0xb2, 0xf9, 0xa6, 0xfc,
-  0x87, 0x51, 0x06, 0xd2, 0x9d, 0x47, 0xc3, 0xdd, 0x64, 0xeb, 0xfb, 0xbc,
-  0x78, 0xf6, 0xe4, 0x8b, 0xe4, 0x64, 0x7b, 0xb3, 0x05, 0xbf, 0xe7, 0xe2,
-  0x33, 0xe3, 0xb4, 0xf8, 0x60, 0x97, 0xec, 0x0c, 0x27, 0x9b, 0x61, 0x70,
-  0xe2, 0x79, 0xa8, 0xb9, 0xf0, 0xc3, 0xca, 0x16, 0x91, 0xd9, 0x29, 0x48,
-  0xfe, 0xe4, 0x3b, 0x49, 0x50, 0x7e, 0x04, 0x13, 0xdf, 0x3c, 0x35, 0xa5,
-  0xa9, 0x7b, 0xf6, 0x24, 0x68, 0xe2, 0xb1, 0x6d, 0xe3, 0x1d, 0xb7, 0xf1,
-  0x0b, 0x9b, 0xd8, 0x1f, 0xee, 0xee, 0x27, 0x5b, 0x67, 0xa3, 0x9d, 0x7d,
-  0xdb, 0x42, 0xd8, 0xc4, 0x3e, 0x9a, 0xa0, 0x87, 0xda, 0x2f, 0x3f, 0xa6,
-  0xef, 0xff, 0x98, 0x15, 0x3f, 0x27, 0x5b, 0x3f, 0xec, 0xed, 0x99, 0x06,
-  0xbe, 0x48, 0x0e, 0x4f, 0x7e, 0x48, 0x1e, 0x0f, 0x4d, 0x63, 0x6f, 0xd3,
-  0x8f, 0xd2, 0x9c, 0x30, 0x45, 0x8f, 0xd0, 0x88, 0xf9, 0x7d, 0xd0, 0xc6,
-  0x93, 0x4e, 0x1b, 0xa7, 0x79, 0xb1, 0xfc, 0x64, 0xae, 0x95, 0xdd, 0xe1,
-  0xa3, 0xfd, 0x24, 0x7f, 0xf2, 0xf9, 0x53, 0x6d, 0x48, 0xda, 0xc0, 0xef,
-  0xdb, 0x2e, 0x45, 0xe6, 0x43, 0x31, 0xaa, 0xce, 0xf1, 0x27, 0x23, 0xd0,
-  0x20, 0x22, 0x2a, 0x72, 0xe7, 0xdd, 0xa4, 0xd5, 0x54, 0xb6, 0x1b, 0x95,
-  0xa5, 0x31, 0x2b, 0x25, 0xc5, 0x03, 0x32, 0xf8, 0x16, 0xcd, 0xc5, 0x79,
-  0x10, 0x74, 0x27, 0xd9, 0x72, 0x8f, 0x7e, 0x91, 0xbc, 0x19, 0x9d, 0x1c,
-  0x9b, 0x11, 0xed, 0x9a, 0xae, 0xb9, 0x39, 0xe4, 0x0e, 0xe1, 0x57, 0x98,
-  0xdc, 0x67, 0xe0, 0xa0, 0x95, 0x36, 0x54, 0xe7, 0x66, 0xe8, 0xa9, 0xd9,
-  0x74, 0xe6, 0xe2, 0xae, 0xf1, 0x5d, 0x02, 0x91, 0x0c, 0x0e, 0xaf, 0xc9,
-  0x8e, 0xe0, 0xab, 0x16, 0x9f, 0xfe, 0xb6, 0x2c, 0xcc, 0x31, 0xa9, 0xca,
-  0x8a, 0xb0, 0x4e, 0x9b, 0x2d, 0x6d, 0xe1, 0xdb, 0x97, 0xc7, 0x9c, 0x33,
-  0xff, 0x26, 0x2d, 0x8c, 0x8c, 0x24, 0xde, 0xab, 0xfa, 0x03, 0x45, 0xea,
-  0x39, 0xe6, 0xc2, 0xef, 0x9f, 0xde, 0x15, 0x9f, 0xcc, 0x3a, 0x7e, 0x36,
-  0xdc, 0x23, 0x90, 0x35, 0x99, 0xbe, 0xaf, 0xde, 0x98, 0x7f, 0xef, 0x3d,
-  0xde, 0x4c, 0xe8, 0x57, 0x6d, 0xf3, 0x5d, 0xcf, 0xeb, 0xc6, 0xd1, 0xd9,
-  0xd9, 0xb7, 0x27, 0x0c, 0xd5, 0x38, 0x12, 0xdf, 0x27, 0x29, 0x57, 0xd6,
-  0x34, 0x66, 0xe9, 0x6a, 0x4c, 0x38, 0x97, 0x5f, 0x84, 0x88, 0xd9, 0x87,
-  0x2c, 0x5b, 0x20, 0xcb, 0xb7, 0x23, 0x11, 0x1a, 0x91, 0xd1, 0x16, 0x8d,
-  0x44, 0xea, 0x4f, 0x87, 0xa1, 0xb3, 0xa9, 0xad, 0x9f, 0x75, 0x7c, 0x67,
-  0x79, 0x39, 0x52, 0x57, 0xa3, 0x18, 0x5d, 0xb4, 0xf9, 0x05, 0xea, 0x27,
-  0xc6, 0x0a, 0x53, 0xfd, 0x23, 0x31, 0x80, 0x37, 0x47, 0x46, 0xbb, 0xe7,
-  0x4e, 0x1f, 0x88, 0x6b, 0x75, 0xd3, 0xab, 0x26, 0x00, 0x8d, 0x16, 0x09,
-  0x36, 0x0c, 0x2a, 0x23, 0x03, 0x41, 0xa0, 0xee, 0x96, 0x38, 0x3e, 0x85,
-  0x4f, 0xce, 0xdc, 0x9a, 0x6f, 0x0f, 0xdf, 0x1c, 0xbf, 0xf8, 0xee, 0xf0,
-  0xf4, 0xdd, 0xb1, 0x79, 0x25, 0x37, 0x1f, 0xdb, 0x72, 0xa0, 0x3b, 0xf4,
-  0x71, 0x9e, 0x4f, 0xca, 0x19, 0x85, 0x82, 0x36, 0xbf, 0xd8, 0xdc, 0x60,
-  0x40, 0x78, 0xd2, 0xa3, 0xb7, 0xf6, 0xf8, 0x35, 0xb3, 0x2f, 0xe8, 0x5f,
-  0xfb, 0xfc, 0xaf, 0xfd, 0x2f, 0x7a, 0xdb, 0xad, 0x41, 0x07, 0xa6, 0xf2,
-  0x15, 0xca, 0x94, 0xa2, 0xba, 0x24, 0x0a, 0x72, 0x23, 0xdb, 0x82, 0x67,
-  0xa5, 0xa7, 0x81, 0x14, 0xbd, 0xdb, 0xe8, 0xd9, 0xad, 0xf1, 0x9d, 0x6f,
-  0x88, 0xf7, 0xe8, 0xa5, 0x17, 0x50, 0x30, 0x7a, 0xdb, 0x7d, 0xab, 0x72,
-  0x20, 0xa8, 0x4d, 0x6d, 0x68, 0x13, 0xcc, 0x15, 0x99, 0x6c, 0xf5, 0xf8,
-  0x2f, 0x2f, 0x5e, 0x1e, 0x5e, 0x1e, 0xd3, 0x0b, 0xfa, 0x79, 0x65, 0xd5,
-  0xd7, 0xc4, 0x07, 0xea, 0xcf, 0x96, 0x04, 0x91, 0x5f, 0xd0, 0x80, 0x7a,
-  0xdb, 0x1c, 0x70, 0x40, 0xf8, 0xbb, 0xd3, 0xaf, 0xb2, 0x50, 0xa8, 0xb5,
-  0xcb, 0x43, 0xaf, 0x15, 0x5b, 0xb2, 0xd5, 0xe3, 0xdf, 0xf5, 0xb6, 0xd5,
-  0x7d, 0x2b, 0x75, 0x71, 0x24, 0xa6, 0x38, 0x45, 0x5a, 0x44, 0x90, 0x0b,
-  0xcb, 0x20, 0x32, 0xb7, 0x3e, 0x12, 0x51, 0x60, 0x77, 0x93, 0x57, 0x5f,
-  0xc1, 0x2e, 0xbc, 0x24, 0xba, 0x93, 0x83, 0xa9, 0x2c, 0xf7, 0xf6, 0x1f,
-  0x7d, 0x81, 0xf9, 0x7c, 0xd1, 0xdb, 0x31, 0x77, 0x43, 0xef, 0x0b, 0xfa,
-  0x74, 0xde, 0x78, 0x55, 0x02, 0xe5, 0x33, 0x64, 0x4f, 0xc9, 0x8e, 0x62,
-  0x60, 0x0b, 0xad, 0xba, 0x47, 0xdf, 0x83, 0x09, 0xbd, 0xe5, 0xbc, 0x2e,
-  0x25, 0xbc, 0xd1, 0x30, 0x3f, 0xd6, 0x0b, 0xe5, 0xcd, 0x50, 0xb8, 0x85,
-  0x3d, 0xba, 0xf8, 0x9c, 0x7f, 0x7f, 0xf4, 0xf9, 0x5d, 0x1e, 0xa3, 0x10,
-  0x04, 0xd1, 0x37, 0xe7, 0x77, 0x9a, 0xfa, 0x85, 0x6f, 0x41, 0x27, 0xe7,
-  0x35, 0x0b, 0x34, 0xe3, 0xb1, 0x38, 0x78, 0xd4, 0x18, 0x81, 0x4e, 0x60,
-  0x44, 0xcb, 0x1d, 0x14, 0x25, 0xe0, 0x02, 0x7c, 0x38, 0x84, 0xde, 0xd9,
-  0xe9, 0x38, 0x37, 0x9a, 0xb0, 0x4d, 0x66, 0xf1, 0xac, 0x72, 0x3b, 0xf5,
-  0x7a, 0xfc, 0x72, 0x8f, 0x7a, 0x89, 0x2e, 0x4a, 0x9e, 0xcb, 0xda, 0x3a,
-  0x92, 0x10, 0x12, 0x94, 0x67, 0xdb, 0xeb, 0xd4, 0xc9, 0x20, 0xc3, 0x30,
-  0xd8, 0xa4, 0x67, 0xfb, 0xd8, 0x88, 0x9a, 0x22, 0xab, 0xd6, 0x42, 0x21,
-  0x22, 0x11, 0x23, 0x0c, 0xd1, 0xaf, 0x0b, 0x60, 0xde, 0x19, 0x0e, 0x87,
-  0xd6, 0xdc, 0x41, 0xb4, 0x4b, 0x02, 0x45, 0x44, 0x6a, 0xe7, 0xb3, 0x05,
-  0x63, 0x8e, 0xb7, 0xa0, 0xcc, 0x43, 0xa1, 0xde, 0x16, 0x88, 0x8c, 0xf8,
-  0x09, 0xec, 0xd1, 0xf0, 0x7c, 0x1c, 0x9b, 0xf2, 0xd9, 0x4d, 0x65, 0x65,
-  0xf8, 0x10, 0x5b, 0x84, 0x35, 0x7d, 0x63, 0x07, 0xa4, 0x94, 0x4b, 0xb2,
-  0x72, 0xaa, 0xb4, 0x73, 0x41, 0x3b, 0x98, 0x20, 0xdf, 0x5c, 0xd6, 0xef,
-  0xce, 0x96, 0x49, 0xd2, 0xae, 0xf4, 0x19, 0x20, 0x40, 0x42, 0xae, 0xbc,
-  0x05, 0x03, 0x01, 0x78, 0x0e, 0x08, 0x25, 0x52, 0xb0, 0x7b, 0x40, 0x6f,
-  0x90, 0x85, 0x55, 0x9b, 0xa5, 0x1d, 0x21, 0x8f, 0x26, 0x9b, 0x19, 0xba,
-  0x7f, 0xdf, 0x11, 0x4c, 0x6f, 0xa0, 0x82, 0x53, 0x26, 0xd6, 0xb3, 0xe9,
-  0x2a, 0x62, 0x53, 0x32, 0x78, 0xe7, 0xb3, 0x22, 0x5c, 0xd8, 0x80, 0x19,
-  0x5b, 0x34, 0x75, 0x50, 0xa5, 0x87, 0x70, 0x76, 0xac, 0x0b, 0x6a, 0x4f,
-  0xb4, 0x45, 0x1b, 0xd1, 0xee, 0xcc, 0x8d, 0xbb, 0x95, 0xdb, 0xa2, 0xcb,
-  0xcc, 0x28, 0xbb, 0x96, 0x99, 0x1b, 0xc3, 0xc9, 0xbd, 0x24, 0xbd, 0x35,
-  0x57, 0x4f, 0x91, 0x11, 0xa2, 0x12, 0x70, 0x04, 0x78, 0x65, 0x4e, 0x3d,
-  0x67, 0xa3, 0xa3, 0xd0, 0x96, 0x6a, 0x5a, 0xa9, 0x2b, 0xa7, 0x95, 0x6c,
-  0xb1, 0xa1, 0xc1, 0xa4, 0xc9, 0xea, 0xd5, 0x23, 0x05, 0xbc, 0x9c, 0x13,
-  0x77, 0xa9, 0x68, 0xea, 0x6a, 0x9e, 0x53, 0xcf, 0x8d, 0x88, 0x1e, 0xc9,
-  0xbe, 0xc9, 0x81, 0x20, 0x24, 0x3f, 0x07, 0x83, 0x1f, 0x74, 0xb6, 0xd2,
-  0x62, 0xea, 0x7d, 0xc4, 0x06, 0x91, 0xc5, 0xfd, 0x44, 0x80, 0xdc, 0x62,
-  0x00, 0x96, 0x09, 0x8d, 0xdb, 0x8a, 0x79, 0x75, 0x7d, 0xcd, 0x56, 0x5b,
-  0xd2, 0x1d, 0x5a, 0x7c, 0x93, 0x9d, 0xd2, 0xac, 0x10, 0x6e, 0xf9, 0x6e,
-  0xd5, 0x6c, 0x5e, 0xda, 0x9a, 0x8b, 0xe2, 0x75, 0x69, 0x6d, 0x66, 0x0d,
-  0x1c, 0xf2, 0xba, 0x35, 0x36, 0x4d, 0x0a, 0x29, 0x15, 0xed, 0x40, 0xef,
-  0xd9, 0xc5, 0x06, 0x4a, 0xe5, 0x14, 0x8e, 0x42, 0x41, 0x17, 0x1d, 0xf4,
-  0x7b, 0x0e, 0x26, 0xe2, 0x30, 0xa3, 0xb7, 0x16, 0x14, 0x85, 0xed, 0x9a,
-  0x8c, 0x53, 0x67, 0x72, 0x6d, 0x24, 0x2d, 0x97, 0x2f, 0xd5, 0xef, 0x3a,
-  0x29, 0x44, 0x0e, 0x95, 0x1f, 0x33, 0xc7, 0xff, 0xe8, 0x1c, 0x8e, 0x8e,
-  0x83, 0x58, 0x4e, 0xbf, 0x15, 0x26, 0x9d, 0x28, 0xac, 0x95, 0x57, 0x18,
-  0x64, 0x67, 0x56, 0x86, 0x89, 0xd7, 0x24, 0xbb, 0x4a, 0xca, 0x16, 0x45,
-  0x35, 0xfa, 0x26, 0xc1, 0x65, 0x6d, 0x91, 0xf7, 0x08, 0x73, 0xb8, 0x78,
-  0xa6, 0x09, 0x97, 0x99, 0xd2, 0xa2, 0x0e, 0x16, 0x4d, 0xe7, 0x82, 0xb4,
-  0x3a, 0xca, 0x9e, 0x5d, 0xa4, 0x9e, 0x96, 0xcf, 0xc0, 0x26, 0xc0, 0x1e,
-  0x20, 0x85, 0xce, 0xc6, 0xd9, 0x2f, 0x65, 0x9d, 0xb0, 0x93, 0xe1, 0x41,
-  0xeb, 0x08, 0xd2, 0xe0, 0xcc, 0x59, 0x1c, 0x05, 0x32, 0x47, 0x88, 0xb0,
-  0x97, 0x82, 0xff, 0x83, 0xf1, 0x06, 0x67, 0x08, 0x0d, 0x26, 0x2a, 0xd1,
-  0xd7, 0x53, 0x0c, 0x8c, 0x5b, 0x07, 0xf3, 0xbe, 0x73, 0x7a, 0x7e, 0x71,
-  0xf6, 0xcd, 0xc5, 0xf1, 0x68, 0x94, 0xbc, 0x39, 0xbe, 0x64, 0x5b, 0xff,
-  0x92, 0x41, 0x72, 0xd7, 0xa8, 0x32, 0x8e, 0x80, 0x83, 0x52, 0x34, 0x29,
-  0x2e, 0x44, 0x1d, 0x09, 0xc8, 0x52, 0xa2, 0xe2, 0xd9, 0xb8, 0x1d, 0xd9,
-  0x88, 0x9f, 0x09, 0xb6, 0xee, 0x06, 0x2e, 0x7f, 0x00, 0x8f, 0x10, 0x8d,
-  0xb4, 0x1e, 0x74, 0xe7, 0x46, 0x85, 0x62, 0xcc, 0x50, 0x24, 0x9b, 0x25,
-  0xe8, 0xfc, 0xe8, 0x74, 0x65, 0x9b, 0x3f, 0x31, 0xbc, 0x3f, 0x99, 0xd9,
-  0x94, 0x82, 0x81, 0x7f, 0x32, 0xc6, 0xaf, 0x6c, 0x8a, 0x3f, 0x25, 0x3f,
-  0x98, 0x36, 0xa7, 0xc6, 0x78, 0x95, 0xe2, 0xc8, 0x23, 0x14, 0x45, 0x76,
-  0x0c, 0xcc, 0xb9, 0x57, 0xf6, 0x3b, 0xe1, 0xa4, 0xc0, 0xea, 0x9e, 0x8a,
-  0xa4, 0x60, 0x77, 0x61, 0x56, 0x23, 0x01, 0xbe, 0xd9, 0x2f, 0x4b, 0x55,
-  0xba, 0x24, 0x39, 0xcd, 0xae, 0x50, 0xa3, 0x07, 0x9f, 0x33, 0xcd, 0xed,
-  0x12, 0x55, 0xf5, 0xde, 0x1b, 0xfa, 0xd1, 0x6e, 0xf2, 0xe8, 0xf3, 0xa7,
-  0xbb, 0x9f, 0xf3, 0x5f, 0xf5, 0xbf, 0xcf, 0x1e, 0xef, 0x0a, 0x67, 0xbe,
-  0xf9, 0xd7, 0xe3, 0x83, 0xc7, 0x7b, 0x07, 0xc4, 0xde, 0xb8, 0x7b, 0xb0,
-  0x6b, 0xfe, 0xff, 0x63, 0xf9, 0x09, 0x51, 0x54, 0x3e, 0xdb, 0xff, 0xfc,
-  0x33, 0x40, 0x56, 0x68, 0x7f, 0xcc, 0xcc, 0x47, 0x06, 0x4d, 0x39, 0x00,
-  0x89, 0x14, 0x34, 0x9f, 0x3f, 0xb5, 0x3d, 0x91, 0x04, 0xf3, 0xa7, 0x82,
-  0xe9, 0x34, 0x70, 0x5b, 0x2d, 0x56, 0xbd, 0xaa, 0xcc, 0x39, 0xe3, 0xd7,
-  0xb8, 0xb4, 0xc3, 0x90, 0xb7, 0xb9, 0xe6, 0x22, 0x58, 0xd9, 0x5a, 0xef,
-  0x30, 0x24, 0xdc, 0x23, 0x80, 0xfb, 0xa5, 0x9f, 0xd6, 0xd4, 0xef, 0x0d,
-  0xd0, 0xba, 0xc9, 0x52, 0xc9, 0x7b, 0x13, 0x2d, 0xec, 0xe7, 0x97, 0x20,
-  0xef, 0xd4, 0xed, 0xfe, 0xa5, 0xdf, 0x63, 0xcf, 0x15, 0xbd, 0x25, 0xbb,
-  0x21, 0x09, 0xbf, 0x66, 0xb3, 0x07, 0x22, 0xdf, 0x6a, 0x6d, 0x9e, 0x0d,
-  0xb7, 0xfc, 0x6e, 0xa6, 0xbc, 0xaa, 0xe0, 0x36, 0xeb, 0x8a, 0xeb, 0x6f,
-  0x47, 0x86, 0x1c, 0x34, 0xf7, 0x6e, 0xe1, 0xb7, 0xf7, 0x90, 0xe6, 0xdc,
-  0x88, 0xb0, 0x83, 0xed, 0xca, 0x0d, 0xbc, 0xc5, 0xc9, 0x19, 0x7d, 0x66,
-  0x6b, 0xac, 0x2a, 0x6d, 0xa8, 0xad, 0x7e, 0x8d, 0x57, 0xed, 0x96, 0x1d,
-  0xf0, 0x1b, 0xa2, 0x73, 0xda, 0x4c, 0x36, 0x54, 0xb6, 0xc5, 0x15, 0xcf,
-  0xcf, 0xeb, 0xce, 0x0e, 0x3e, 0x45, 0xbb, 0xd1, 0xfb, 0x9e, 0x7c, 0x03,
-  0xe7, 0xc9, 0x1e, 0xba, 0xb5, 0x43, 0x73, 0x28, 0x78, 0x2d, 0xef, 0xc9,
-  0x60, 0x2b, 0x28, 0xdf, 0xb1, 0x23, 0xe9, 0x9e, 0x03, 0xd0, 0xdc, 0x36,
-  0xe7, 0xdf, 0x3e, 0x33, 0x90, 0x83, 0x53, 0xff, 0x40, 0xac, 0xb4, 0xa4,
-  0x0a, 0x0f, 0xdb, 0x2a, 0xc2, 0x06, 0x7f, 0xb4, 0xd8, 0x2a, 0x5c, 0x66,
-  0x8c, 0x3d, 0xa3, 0xa6, 0x68, 0x3e, 0x67, 0x7e, 0xf6, 0xab, 0x95, 0x76,
-  0xe3, 0xb4, 0x6a, 0xd5, 0x52, 0xd8, 0x90, 0x5a, 0x1c, 0x73, 0x62, 0xa0,
-  0x43, 0x82, 0x22, 0xeb, 0x11, 0x7f, 0xd8, 0xd8, 0x18, 0x9d, 0x1f, 0x1f,
-  0xbf, 0x4c, 0x4e, 0x4f, 0xde, 0x9c, 0x5c, 0x7a, 0x5a, 0xb8, 0xbd, 0x3d,
-  0xd4, 0xd3, 0xaa, 0x75, 0x06, 0x3b, 0xd3, 0xe1, 0x08, 0x99, 0xa5, 0xea,
-  0x8b, 0xdc, 0xdf, 0xf3, 0x4c, 0xf2, 0x1d, 0x66, 0xdd, 0xf7, 0x60, 0x6f,
-  0x83, 0x8b, 0x89, 0xaa, 0xb5, 0x7b, 0x5a, 0x5c, 0x6d, 0x34, 0x1a, 0xd3,
-  0xbb, 0x01, 0xf3, 0x01, 0x0c, 0xfe, 0x2a, 0x20, 0x8d, 0xb6, 0xba, 0x24,
-  0xdc, 0xb2, 0x36, 0x09, 0x47, 0x00, 0xa8, 0x9d, 0x5e, 0xd1, 0xdc, 0x66,
-  0x0c, 0x82, 0xf6, 0xdc, 0x72, 0xc0, 0xd6, 0xdd, 0x66, 0xe0, 0x27, 0x98,
-  0xe7, 0x9c, 0x1d, 0xe9, 0x03, 0x7f, 0x51, 0xe0, 0x44, 0x6e, 0x3c, 0xc8,
-  0x71, 0xff, 0x8b, 0xde, 0xe9, 0xb0, 0xa8, 0x57, 0xfd, 0x56, 0xcd, 0x95,
-  0x1b, 0xcd, 0x04, 0x14, 0xc9, 0xa3, 0x5d, 0x9b, 0x58, 0xb0, 0x80, 0xcc,
-  0x11, 0xfd, 0x9e, 0x3e, 0xb6, 0x97, 0x18, 0x25, 0x64, 0x49, 0xaa, 0x7c,
-  0xb5, 0x2c, 0x82, 0xeb, 0xee, 0xaf, 0xfc, 0xae, 0x19, 0xff, 0xd3, 0x5d,
-  0x5c, 0x6f, 0x57, 0x69, 0x35, 0x30, 0xea, 0xd6, 0xdd, 0x40, 0x5d, 0xaa,
-  0xbc, 0x23, 0x04, 0x14, 0xcc, 0xfe, 0x9e, 0xcc, 0x55, 0x44, 0xed, 0xa8,
-  0x88, 0x2e, 0x3b, 0xa4, 0x44, 0x5c, 0x72, 0x26, 0x07, 0x80, 0x86, 0x4e,
-  0xb9, 0xb9, 0xea, 0xe1, 0x74, 0x0a, 0x8e, 0xe3, 0x1d, 0xd6, 0x55, 0x74,
-  0x32, 0x8a, 0x72, 0x05, 0x20, 0x56, 0xa9, 0xd5, 0x9c, 0x86, 0x29, 0x63,
-  0x09, 0xf5, 0xe9, 0x79, 0xb2, 0xf7, 0x39, 0x8d, 0xe3, 0x61, 0xe3, 0x79,
-  0x55, 0x56, 0x13, 0x9b, 0x05, 0x0c, 0x1b, 0xc1, 0x4b, 0x09, 0xe5, 0x04,
-  0x06, 0x14, 0xe5, 0xe3, 0xd9, 0x55, 0xe4, 0x2a, 0x90, 0x75, 0x64, 0x94,
-  0x48, 0x50, 0x1d, 0xee, 0x28, 0x44, 0xb9, 0x59, 0x2d, 0xa2, 0xbb, 0x46,
-  0xe6, 0xc5, 0xab, 0x65, 0x5b, 0xd9, 0x94, 0x51, 0x9e, 0x06, 0x72, 0x89,
-  0x98, 0xbd, 0x76, 0x9b, 0x4f, 0xa1, 0x4a, 0x3b, 0x06, 0x3a, 0xb3, 0x5e,
-  0xbc, 0xf9, 0x18, 0xd0, 0x8c, 0x98, 0x25, 0x82, 0x9d, 0xb6, 0x67, 0xa2,
-  0xc0, 0xd0, 0xb4, 0x96, 0xf0, 0x28, 0x6c, 0x41, 0x7f, 0xa0, 0x8c, 0x64,
-  0x17, 0x17, 0x20, 0xfb, 0x89, 0x44, 0x73, 0xcf, 0x7d, 0x85, 0x50, 0xfd,
-  0x4d, 0x33, 0x53, 0x67, 0xc2, 0x1b, 0xbb, 0xb1, 0xdb, 0x63, 0x26, 0x6e,
-  0x15, 0x6f, 0xd8, 0x7b, 0xbb, 0x46, 0x69, 0x9d, 0x95, 0x76, 0x5b, 0xc9,
-  0xa6, 0x0a, 0x2d, 0x51, 0x0c, 0x6b, 0x80, 0xd9, 0xd9, 0xdb, 0xfd, 0x76,
-  0xf5, 0xac, 0x83, 0xbf, 0x7e, 0xed, 0xcb, 0xfb, 0x8f, 0xd7, 0x2c, 0xda,
-  0x59, 0x05, 0x63, 0x3c, 0x53, 0xa0, 0x22, 0x14, 0x41, 0x17, 0x79, 0x09,
-  0x96, 0xcd, 0x6c, 0xfc, 0xec, 0x3a, 0x45, 0x8d, 0xe8, 0x35, 0xbd, 0xd7,
-  0xec, 0x8d, 0x4e, 0x57, 0xde, 0x08, 0x74, 0x9a, 0x7f, 0x59, 0x93, 0x5b,
-  0x6c, 0x01, 0x6e, 0x3c, 0x67, 0xbb, 0xda, 0x04, 0x70, 0x66, 0x53, 0xf0,
-  0xde, 0x66, 0xc9, 0xd9, 0x6f, 0x0b, 0x09, 0xdd, 0x3d, 0x55, 0x76, 0xbd,
-  0x64, 0xee, 0x8a, 0x92, 0x6d, 0x7d, 0xa2, 0xab, 0x96, 0xf3, 0x6a, 0x64,
-  0x33, 0x61, 0x87, 0x78, 0x3f, 0x41, 0xf0, 0x4e, 0x52, 0x55, 0x59, 0xa5,
-  0xcc, 0x73, 0xe7, 0x62, 0x20, 0xa7, 0xec, 0xa4, 0x9c, 0x4b, 0x9d, 0x58,
-  0x3e, 0x5e, 0x85, 0x97, 0x8a, 0xcf, 0x7c, 0x8c, 0x43, 0xe4, 0xe6, 0xf2,
-  0x46, 0xb1, 0xc2, 0x9e, 0x12, 0xc0, 0x28, 0x1a, 0xd6, 0x70, 0x58, 0x00,
-  0x0d, 0xf4, 0x65, 0xd7, 0xa2, 0x25, 0xfb, 0x29, 0x92, 0xf8, 0xb5, 0xf2,
-  0x62, 0x32, 0x83, 0x3e, 0x39, 0xfb, 0x8f, 0xce, 0xde, 0xbe, 0x3a, 0xf9,
-  0xc6, 0x92, 0x0f, 0xb1, 0x10, 0x6f, 0x91, 0x62, 0xb0, 0xfb, 0xd8, 0x8f,
-  0x74, 0x4b, 0xf9, 0x5d, 0x81, 0xc8, 0x1a, 0xf1, 0xf4, 0xde, 0xff, 0x01,
-  0x04, 0x48, 0xf1, 0x88, 0x1c, 0xe4, 0xcc, 0xd8, 0x51, 0x6f, 0x3b, 0x77,
-  0x43, 0x87, 0x5c, 0x8e, 0x53, 0x29, 0xd2, 0xaa, 0x59, 0x2e, 0x2c, 0x82,
-  0xd0, 0x2b, 0xdf, 0x2b, 0xfc, 0xda, 0x9a, 0x3c, 0xbe, 0x5c, 0xb0, 0x68,
-  0x92, 0x14, 0xd0, 0x96, 0x37, 0x97, 0xef, 0x00, 0x72, 0x27, 0x08, 0xfb,
-  0x89, 0x5c, 0x00, 0x01, 0x38, 0x67, 0x46, 0x84, 0x9c, 0x3e, 0xa8, 0x5d,
-  0xe3, 0x37, 0xd3, 0xb4, 0xbe, 0xe1, 0x81, 0xe2, 0xd2, 0xc8, 0x19, 0x4b,
-  0x8d, 0x58, 0x5b, 0x3a, 0x25, 0x43, 0xdd, 0x21, 0x72, 0x2c, 0x44, 0xd7,
-  0xc5, 0x87, 0x6c, 0xa5, 0x33, 0x07, 0x52, 0xd2, 0xc4, 0xd3, 0x14, 0xa1,
-  0x4a, 0xc4, 0x3a, 0xf1, 0x93, 0x17, 0x14, 0x96, 0x39, 0x20, 0x9a, 0xf9,
-  0x39, 0x53, 0xc0, 0xf9, 0x09, 0xa3, 0x22, 0x25, 0x1d, 0x17, 0xfc, 0xc9,
-  0x95, 0x97, 0x7b, 0xc6, 0x20, 0x41, 0xdd, 0x74, 0xec, 0x23, 0x26, 0x07,
-  0xcb, 0xe6, 0x1f, 0x37, 0x07, 0xf5, 0xdd, 0x7c, 0x5c, 0xce, 0x34, 0x3b,
-  0xc2, 0x52, 0x3e, 0xe8, 0x43, 0x7e, 0x09, 0xbc, 0x84, 0x23, 0xb5, 0x8d,
-  0xe7, 0x96, 0x74, 0x80, 0x29, 0xd7, 0x7f, 0xae, 0x70, 0x84, 0xf0, 0x90,
-  0x8e, 0x02, 0x6c, 0x3c, 0x24, 0xe3, 0xb9, 0x38, 0xa3, 0x14, 0x64, 0x31,
-  0xdb, 0x0f, 0x33, 0xd5, 0x1e, 0x3a, 0x45, 0xfc, 0xca, 0x25, 0x79, 0x38,
-  0x50, 0x55, 0xc4, 0xa8, 0x3b, 0x3d, 0xe1, 0xc0, 0xc0, 0x00, 0xe9, 0x6d,
-  0xfe, 0x85, 0x40, 0xe7, 0x3d, 0x46, 0x1a, 0x2e, 0x43, 0x62, 0xba, 0xfa,
-  0x13, 0x3b, 0x14, 0x39, 0xee, 0xf7, 0x57, 0xfd, 0xb8, 0x3e, 0xda, 0x99,
-  0x7a, 0xb3, 0x9f, 0xd2, 0xea, 0x5a, 0x78, 0xf5, 0x24, 0x92, 0x06, 0x23,
-  0xd1, 0x16, 0xbb, 0xb1, 0x8e, 0x49, 0x52, 0x4a, 0x2c, 0x6a, 0x06, 0xea,
-  0xd3, 0x92, 0xb3, 0xff, 0x24, 0x37, 0x8a, 0x5d, 0x92, 0x76, 0x23, 0x7a,
-  0x12, 0xe7, 0x8f, 0x16, 0x8b, 0x92, 0xba, 0xbb, 0x4c, 0x8b, 0x56, 0x38,
-  0xff, 0xac, 0x5c, 0x66, 0xde, 0x6b, 0xe4, 0xc4, 0x83, 0x25, 0x9c, 0x89,
-  0xe3, 0x84, 0x3f, 0x05, 0x5d, 0x82, 0x98, 0x68, 0xa4, 0xa6, 0xa7, 0x6b,
-  0x82, 0x7f, 0xff, 0x42, 0x6a, 0x97, 0x99, 0xf3, 0x2c, 0xdc, 0x26, 0x42,
-  0xf8, 0xf7, 0xf9, 0xae, 0xb8, 0xdf, 0x1a, 0xc1, 0xaa, 0xd6, 0xc9, 0xe1,
-  0xc5, 0xb1, 0xd1, 0x6c, 0xaf, 0x0b, 0xb0, 0x4a, 0x14, 0x8d, 0xa6, 0xbf,
-  0x65, 0x85, 0x94, 0x4b, 0x2b, 0xf4, 0x7c, 0xd0, 0x07, 0x6f, 0xbd, 0x37,
-  0x69, 0x33, 0x09, 0x30, 0x80, 0x33, 0xae, 0xdd, 0x96, 0x9b, 0x28, 0x5b,
-  0x30, 0xa4, 0x0e, 0x11, 0x1b, 0xf0, 0x96, 0xa2, 0x10, 0x89, 0xf9, 0x54,
-  0xa9, 0x4c, 0xc1, 0xe7, 0x81, 0x58, 0xf7, 0x29, 0x82, 0x75, 0xae, 0x71,
-  0xaa, 0x5d, 0xbe, 0xc0, 0xdf, 0x95, 0x4a, 0x53, 0xbe, 0xd5, 0x0a, 0x7b,
-  0xba, 0xed, 0xd4, 0x8f, 0xbb, 0x8c, 0xfe, 0x8e, 0x7b, 0x86, 0x74, 0x91,
-  0xae, 0x5e, 0x90, 0x59, 0x18, 0x3c, 0x7b, 0xaf, 0xa7, 0x9e, 0xf2, 0xcb,
-  0xc9, 0x7a, 0x37, 0xd9, 0x6c, 0xc1, 0x8e, 0x69, 0xe1, 0xee, 0x11, 0xbf,
-  0x0e, 0x9b, 0x03, 0xd3, 0x0d, 0x5b, 0x94, 0x14, 0x58, 0xe1, 0x31, 0xf1,
-  0x1b, 0x7d, 0x60, 0x05, 0xc0, 0x97, 0x4f, 0x51, 0xdf, 0xee, 0x1f, 0xed,
-  0x68, 0x5d, 0x1f, 0xec, 0x2f, 0xe9, 0x47, 0x2f, 0x2c, 0x1f, 0x1d, 0xf5,
-  0x62, 0x48, 0x1f, 0x82, 0x48, 0x45, 0xcc, 0x94, 0xfe, 0x82, 0x1f, 0x03,
-  0xfa, 0xa6, 0x04, 0xa5, 0x90, 0x3a, 0x96, 0xf4, 0xaa, 0x94, 0x98, 0xaa,
-  0xeb, 0x08, 0x07, 0xf6, 0x20, 0xa1, 0xc7, 0xbe, 0x6a, 0x3c, 0xf8, 0x76,
-  0x47, 0x2b, 0x9f, 0x93, 0xff, 0x86, 0x52, 0x7d, 0xf5, 0xc0, 0xd7, 0x59,
-  0xab, 0x54, 0xba, 0x4d, 0xe7, 0xe9, 0x0d, 0x7a, 0x66, 0x2e, 0x36, 0x67,
-  0x33, 0x27, 0xf0, 0xf5, 0x31, 0x5a, 0x55, 0x64, 0xbe, 0x39, 0x85, 0x49,
-  0x64, 0x17, 0x95, 0xda, 0xb8, 0x6b, 0xe5, 0x21, 0x50, 0xf1, 0x3a, 0x4a,
-  0xd3, 0xb1, 0x54, 0x5c, 0xc8, 0xe5, 0x00, 0x48, 0xe0, 0x63, 0x5e, 0x6b,
-  0xf0, 0xd1, 0xec, 0xed, 0x09, 0x63, 0x22, 0x1a, 0xa6, 0x10, 0xc8, 0x9a,
-  0x89, 0x37, 0x95, 0xd9, 0xe4, 0xa6, 0x64, 0x40, 0xad, 0x99, 0x34, 0x2f,
-  0x27, 0xb3, 0x97, 0xfc, 0x2f, 0xd9, 0x03, 0xdf, 0xba, 0xcc, 0x3a, 0xda,
-  0x08, 0x43, 0x66, 0x8e, 0x1c, 0xba, 0x0d, 0x71, 0xfc, 0xc3, 0xe5, 0xc5,
-  0x61, 0xf2, 0xfa, 0xf8, 0xf0, 0xe5, 0xf1, 0xc5, 0xa8, 0x73, 0xe9, 0x0b,
-  0xfc, 0x83, 0x35, 0x34, 0x72, 0x02, 0x43, 0x35, 0x56, 0xaa, 0x00, 0xd8,
-  0x44, 0xe9, 0x5c, 0xa5, 0x9e, 0xd9, 0x3c, 0x74, 0x90, 0xcc, 0xf9, 0x20,
-  0x83, 0x88, 0xa3, 0x05, 0xa0, 0x35, 0xae, 0x21, 0x6c, 0x6c, 0x1b, 0x13,
-  0x23, 0xa1, 0x08, 0xc4, 0xa0, 0x2e, 0x73, 0x3f, 0xad, 0xc5, 0xb1, 0xeb,
-  0xb9, 0xcb, 0x64, 0x5a, 0x6a, 0xc6, 0x5e, 0x7b, 0xe5, 0x5e, 0xbb, 0xcc,
-  0x6c, 0x4f, 0x6c, 0xc9, 0x25, 0x23, 0x5e, 0xc3, 0xde, 0x0f, 0x03, 0xf3,
-  0xdd, 0x81, 0x99, 0xfc, 0x01, 0xd1, 0x2f, 0xde, 0x65, 0x75, 0xaf, 0xe3,
-  0x02, 0x6c, 0x7f, 0x1e, 0x32, 0xfa, 0x3a, 0x3c, 0x49, 0xaf, 0xa3, 0x2d,
-  0xd1, 0xe9, 0x9a, 0x51, 0xd5, 0xa4, 0xae, 0x05, 0x81, 0x4b, 0xd5, 0x53,
-  0x92, 0xe5, 0x04, 0x05, 0x39, 0x28, 0x02, 0x50, 0x72, 0x66, 0xa6, 0xe0,
-  0xc1, 0xd0, 0x11, 0x19, 0x02, 0x74, 0x1d, 0x73, 0xf6, 0xf8, 0x52, 0x9f,
-  0x31, 0x03, 0x33, 0x7b, 0xcc, 0x4c, 0xb7, 0xe4, 0x21, 0xff, 0x7e, 0x40,
-  0x00, 0x44, 0x00, 0xf8, 0x75, 0x2b, 0x3e, 0x2a, 0xce, 0x50, 0xa9, 0xe4,
-  0x28, 0xcd, 0x51, 0x1f, 0xec, 0x9e, 0x57, 0xdc, 0x3e, 0x7d, 0x52, 0xeb,
-  0x86, 0xc8, 0xbb, 0x8c, 0x02, 0x23, 0xa3, 0x1e, 0xfe, 0x4d, 0x2e, 0xa5,
-  0x4b, 0xef, 0xa8, 0xbe, 0xea, 0x25, 0xec, 0xf8, 0x9b, 0x19, 0x05, 0xdb,
-  0x00, 0x1d, 0xb7, 0xcf, 0x65, 0xc9, 0xeb, 0xb2, 0xc6, 0x5d, 0x10, 0x3e,
-  0x4e, 0x97, 0x7c, 0x6c, 0xfa, 0xf1, 0x86, 0xc4, 0xb7, 0x2c, 0xad, 0xeb,
-  0xc6, 0x86, 0xe6, 0x3d, 0x9d, 0x1f, 0x5e, 0xbe, 0x46, 0x74, 0x15, 0x5b,
-  0xf8, 0x25, 0x38, 0x4e, 0x34, 0xa6, 0x16, 0xe6, 0x4d, 0x59, 0x03, 0x8e,
-  0xf5, 0x5f, 0xa5, 0x52, 0x54, 0x7d, 0x12, 0xd1, 0xbb, 0x9c, 0x81, 0x48,
-  0x33, 0x2e, 0x5f, 0x0c, 0x19, 0xdd, 0xaa, 0xce, 0x08, 0xdc, 0xbb, 0x4d,
-  0x8a, 0xb3, 0x78, 0xcb, 0x4d, 0x4e, 0x59, 0xdf, 0xe4, 0x31, 0x61, 0xd3,
-  0x93, 0x32, 0x47, 0x16, 0x8f, 0xcf, 0x15, 0x8c, 0x5f, 0x50, 0x4e, 0x32,
-  0x07, 0xa0, 0xa6, 0x65, 0x9c, 0xa9, 0xd0, 0x3b, 0xd2, 0x5f, 0xcd, 0xef,
-  0x86, 0x21, 0x65, 0x4e, 0xf2, 0xf5, 0xb2, 0x69, 0x8b, 0x95, 0x0e, 0x63,
-  0xb1, 0xd5, 0x2c, 0xab, 0xb2, 0x6c, 0xbc, 0x3e, 0x40, 0xfb, 0x49, 0x1b,
-  0x39, 0xd1, 0x4c, 0x49, 0xc9, 0x7d, 0xa1, 0xa6, 0x0a, 0xd1, 0xbb, 0x7d,
-  0xc5, 0x30, 0x1d, 0xd7, 0xe5, 0x6c, 0xd9, 0x78, 0x10, 0xec, 0x5f, 0xd6,
-  0x67, 0xaf, 0xd3, 0x5b, 0x27, 0x43, 0xa5, 0xe7, 0x2c, 0x98, 0x54, 0xce,
-  0x58, 0xfa, 0x46, 0xbd, 0x44, 0xb0, 0xb1, 0x2a, 0x8b, 0x76, 0x65, 0x38,
-  0xa0, 0xbd, 0xb7, 0x37, 0x36, 0x46, 0xba, 0xd8, 0x44, 0xd0, 0x1a, 0x2e,
-  0xfa, 0xf7, 0xd0, 0x26, 0xa9, 0x0f, 0x1c, 0x2c, 0x98, 0x98, 0xbf, 0x28,
-  0x6d, 0x5b, 0xc6, 0x6b, 0x0a, 0x11, 0xce, 0x6b, 0x9c, 0xd7, 0xed, 0x41,
-  0xe1, 0x57, 0x36, 0x5c, 0xa1, 0x49, 0x60, 0x97, 0xa5, 0x32, 0xf5, 0x4b,
-  0xb8, 0xce, 0x6d, 0x88, 0x56, 0xde, 0x7a, 0x94, 0x13, 0x9a, 0x2e, 0x01,
-  0x2d, 0x8a, 0x6d, 0xe1, 0xb8, 0xd4, 0xc9, 0x9d, 0xff, 0xbd, 0x93, 0xf4,
-  0xb9, 0x66, 0x41, 0x84, 0x66, 0x67, 0x99, 0xfc, 0xff, 0x00, 0xbc, 0x12,
-  0x42, 0x5e, 0x6a, 0x73, 0xd8, 0xa6, 0x7c, 0x1d, 0x1a, 0x13, 0xea, 0xa6,
-  0x9a, 0xb8, 0xdd, 0x6f, 0xb4, 0x83, 0xec, 0x96, 0xec, 0x17, 0xb5, 0x11,
-  0x84, 0xd8, 0x83, 0xeb, 0x52, 0x5b, 0xca, 0x24, 0x10, 0x63, 0x5c, 0x59,
-  0xaf, 0x1e, 0x55, 0x59, 0xe5, 0x52, 0xa4, 0xac, 0xd6, 0xa3, 0xc8, 0x92,
-  0x86, 0x4d, 0x37, 0x92, 0x96, 0xdd, 0x4e, 0x45, 0x0a, 0xf9, 0x4f, 0xcd,
-  0x38, 0x12, 0x60, 0x97, 0x6c, 0x7f, 0xaf, 0x70, 0x9f, 0x94, 0x40, 0x46,
-  0x5e, 0x93, 0x20, 0x4e, 0x19, 0x4d, 0xa7, 0xe1, 0x48, 0xed, 0xa4, 0x6a,
-  0x01, 0x14, 0xad, 0x04, 0x11, 0xa5, 0x70, 0x84, 0x10, 0x92, 0x8c, 0x58,
-  0x87, 0x39, 0xb3, 0x9a, 0x4a, 0x4c, 0xaa, 0x25, 0xa3, 0x57, 0xaa, 0xe6,
-  0x72, 0xd8, 0x95, 0x72, 0xdd, 0x97, 0xbb, 0x1f, 0xe9, 0xf2, 0x88, 0xcc,
-  0x51, 0x61, 0x4d, 0x5f, 0x25, 0xd0, 0x21, 0x49, 0x9d, 0x5f, 0x06, 0x6f,
-  0xf8, 0x80, 0x14, 0x87, 0xd8, 0xbc, 0xa6, 0x54, 0x0f, 0x71, 0x49, 0x09,
-  0xeb, 0x08, 0xfc, 0x5f, 0x37, 0xb9, 0xe0, 0x4a, 0x79, 0xd6, 0xdb, 0xb5,
-  0x55, 0xe1, 0xe1, 0xdb, 0x48, 0xfc, 0xa8, 0xaa, 0x05, 0x3e, 0x0c, 0xc3,
-  0x03, 0x33, 0xb4, 0x3c, 0xa8, 0x72, 0x89, 0x9c, 0xf8, 0x89, 0xdf, 0x8c,
-  0xc2, 0xb0, 0x58, 0xe7, 0x07, 0x7e, 0xdd, 0xff, 0x24, 0x81, 0x58, 0x8b,
-  0x84, 0xb3, 0x48, 0x84, 0xdc, 0x8d, 0x2e, 0x94, 0xfd, 0x3d, 0x18, 0xa6,
-  0x8c, 0xd9, 0x00, 0xb3, 0xa8, 0xb6, 0xd0, 0x2a, 0xcf, 0xe6, 0x4d, 0xfe,
-  0x76, 0x5f, 0x66, 0xc9, 0xa6, 0xc5, 0x4b, 0x88, 0x99, 0xf5, 0x42, 0x2f,
-  0xee, 0xd4, 0xaa, 0x0b, 0xc7, 0xa9, 0xd6, 0x75, 0x53, 0x2d, 0x27, 0x4d,
-  0xbb, 0x3a, 0xac, 0xdb, 0x61, 0xb6, 0x06, 0x1d, 0xcf, 0x71, 0xe9, 0xdb,
-  0xf6, 0x27, 0xe7, 0x62, 0xde, 0xb3, 0xf5, 0x41, 0x3d, 0xdb, 0x4a, 0x5b,
-  0x99, 0x2e, 0xb6, 0x32, 0xa9, 0xff, 0xdd, 0x6d, 0xbb, 0xcb, 0x06, 0xe7,
-  0x36, 0xed, 0xbd, 0x4d, 0x58, 0x84, 0xec, 0x04, 0xef, 0xee, 0x15, 0x45,
-  0x0c, 0x8a, 0x47, 0x95, 0x08, 0x5d, 0x22, 0xd4, 0x1a, 0x72, 0x59, 0x6e,
-  0x58, 0x4a, 0x43, 0xd3, 0xa5, 0x81, 0x40, 0x55, 0x39, 0xfa, 0xbb, 0x63,
-  0x26, 0x52, 0xeb, 0xff, 0xd8, 0xda, 0x57, 0xb5, 0xa3, 0x45, 0xec, 0xe0,
-  0x54, 0x41, 0xaa, 0x64, 0xf5, 0x43, 0xa1, 0x77, 0x93, 0xf9, 0x1b, 0x26,
-  0x2f, 0xe5, 0x50, 0xc8, 0x17, 0xba, 0xea, 0x44, 0x78, 0x37, 0x9e, 0x33,
-  0x69, 0x49, 0xb0, 0x8f, 0x5e, 0xaa, 0x4f, 0x15, 0x22, 0x07, 0x73, 0x43,
-  0x96, 0x8d, 0x2e, 0x92, 0x99, 0x57, 0xfd, 0x84, 0xe9, 0x02, 0x8d, 0x78,
-  0x73, 0x96, 0xed, 0x6e, 0x7a, 0xc5, 0xbb, 0xb6, 0x18, 0xf4, 0x5f, 0xc2,
-  0xfa, 0xb1, 0xf4, 0x82, 0xec, 0xbd, 0x20, 0x70, 0xdb, 0x76, 0xa4, 0x2b,
-  0xa6, 0x89, 0x5f, 0xda, 0x99, 0xbd, 0x67, 0xfb, 0xc3, 0xbd, 0xa7, 0x9f,
-  0x0f, 0x77, 0x87, 0x7b, 0xbb, 0x24, 0x5f, 0xa8, 0x2b, 0x5e, 0xe7, 0x78,
-  0x5e, 0x22, 0x9f, 0x6a, 0xbd, 0x17, 0x7e, 0xf3, 0xed, 0xf1, 0xe5, 0xf7,
-  0x67, 0x17, 0xdf, 0x26, 0x27, 0x6f, 0x2f, 0x8f, 0x2f, 0x5e, 0x1d, 0x1e,
-  0x3d, 0x94, 0x62, 0xdf, 0x77, 0x5b, 0x7b, 0x95, 0xcc, 0x33, 0x37, 0x31,
-  0xa1, 0x6f, 0xd0, 0xcd, 0x59, 0xd6, 0xdc, 0xec, 0x1e, 0xec, 0xad, 0x25,
-  0x91, 0x8e, 0xb8, 0x07, 0xdd, 0xfb, 0x3a, 0xa8, 0x3d, 0x1a, 0xd4, 0xea,
-  0x56, 0x2c, 0x99, 0xe2, 0x88, 0xb1, 0x55, 0x16, 0x97, 0x0b, 0x31, 0x8f,
-  0xda, 0x48, 0xe0, 0x50, 0x15, 0xc1, 0x3e, 0x66, 0xba, 0x5a, 0xae, 0xf4,
-  0x26, 0x74, 0x30, 0x82, 0x41, 0x17, 0x99, 0xbb, 0xc1, 0x55, 0xc3, 0x1b,
-  0x71, 0xa7, 0x30, 0x01, 0xed, 0x14, 0x2a, 0x9e, 0x4a, 0x65, 0x49, 0x60,
-  0xa3, 0xdd, 0x22, 0xa5, 0x4b, 0x99, 0x22, 0x70, 0x6a, 0xf3, 0x44, 0x2c,
-  0x55, 0xc0, 0x46, 0xe2, 0xe9, 0xe9, 0xe8, 0x6b, 0xbb, 0xf0, 0xbb, 0x0f,
-  0x9f, 0xed, 0xb0, 0xa5, 0xd6, 0x8a, 0x6b, 0xc6, 0xc0, 0x5a, 0xae, 0xd1,
-  0x23, 0xe9, 0x08, 0x4e, 0x83, 0xd7, 0x1b, 0xfe, 0x14, 0x14, 0x2a, 0xa2,
-  0x35, 0x03, 0xa1, 0x63, 0x8b, 0xd3, 0x98, 0xef, 0x28, 0xe4, 0x4e, 0xb0,
-  0xfe, 0xa7, 0x85, 0x28, 0xa8, 0xf5, 0xba, 0x45, 0x2b, 0x98, 0x70, 0xa9,
-  0x12, 0xff, 0x75, 0x56, 0xb5, 0x81, 0xce, 0x9c, 0x56, 0xe9, 0x2d, 0x8a,
-  0xae, 0xe4, 0x8e, 0x24, 0x74, 0xa3, 0x5d, 0x73, 0x8b, 0x14, 0x27, 0x37,
-  0xe7, 0xc9, 0xf9, 0xf1, 0x9b, 0x81, 0x56, 0x3e, 0x36, 0x7f, 0x67, 0x67,
-  0x94, 0x32, 0x42, 0x72, 0x6e, 0xcf, 0x22, 0x2b, 0x14, 0x4b, 0x03, 0x99,
-  0x28, 0xe0, 0x1f, 0x7f, 0x00, 0x74, 0x68, 0x2c, 0x67, 0xa4, 0x40, 0x46,
-  0x15, 0x73, 0xc9, 0x09, 0x86, 0x5d, 0x22, 0x4d, 0x5a, 0x4f, 0x01, 0x2c,
-  0x27, 0x5b, 0x16, 0xa4, 0x4b, 0xdf, 0x03, 0x12, 0x15, 0xa8, 0x01, 0x0b,
-  0x13, 0x28, 0xb5, 0x08, 0xe0, 0xf9, 0xb7, 0x47, 0xa3, 0x3f, 0xee, 0xed,
-  0x4b, 0x77, 0xb6, 0xd5, 0x2a, 0x20, 0x59, 0xd5, 0xcd, 0x9c, 0x87, 0xb8,
-  0xf6, 0xfb, 0xa8, 0xf9, 0xd5, 0x38, 0xe0, 0x58, 0x8c, 0x2d, 0x9b, 0x18,
-  0xb4, 0xdd, 0xca, 0x0c, 0x02, 0xf2, 0xeb, 0xce, 0xaa, 0x98, 0xb6, 0x92,
-  0x2f, 0x85, 0x44, 0x50, 0xf4, 0x49, 0xca, 0x2e, 0x35, 0x16, 0xea, 0x97,
-  0x16, 0xfa, 0x23, 0x6e, 0x59, 0x5a, 0xdb, 0xac, 0x25, 0xc9, 0x8a, 0xe1,
-  0x2c, 0xdd, 0x35, 0xa7, 0xf9, 0x76, 0xbf, 0x25, 0x66, 0x57, 0xb9, 0xd9,
-  0x95, 0xba, 0xc7, 0x7d, 0x06, 0x07, 0x40, 0xd0, 0xeb, 0x53, 0x2d, 0xec,
-  0x56, 0xb8, 0xca, 0x25, 0xf4, 0xf4, 0x99, 0x59, 0x28, 0x73, 0xb2, 0x98,
-  0x5c, 0x81, 0x84, 0x42, 0x39, 0x23, 0xd3, 0xc5, 0x3e, 0xf2, 0xb2, 0xa2,
-  0x5a, 0x2f, 0x0b, 0xc6, 0x91, 0xbe, 0x1d, 0x26, 0xaf, 0xb3, 0x82, 0x12,
-  0xdc, 0x09, 0x71, 0xa7, 0xb9, 0x57, 0xc0, 0x05, 0x52, 0x65, 0x49, 0x54,
-  0xda, 0x3b, 0xcd, 0x52, 0x61, 0xd1, 0x34, 0xb2, 0xae, 0x66, 0x0b, 0x57,
-  0xab, 0x4c, 0xa5, 0x84, 0xce, 0x13, 0xca, 0x4f, 0xcb, 0x48, 0xc1, 0xb4,
-  0xce, 0xd4, 0xc0, 0x56, 0x9b, 0x0a, 0x13, 0x45, 0x0c, 0xd0, 0x9c, 0x1c,
-  0x73, 0xc4, 0x9a, 0xc4, 0xab, 0x7c, 0x03, 0x02, 0x6c, 0xf2, 0x16, 0xb2,
-  0xc5, 0xa5, 0x87, 0x2c, 0x1b, 0x0f, 0xa9, 0xcc, 0x25, 0x91, 0x60, 0x50,
-  0x11, 0x0e, 0xf3, 0xef, 0x9d, 0xfd, 0xdd, 0xbd, 0xcf, 0x76, 0x3f, 0xdb,
-  0x7b, 0xb2, 0xf7, 0xe4, 0xc9, 0x93, 0xbd, 0x7d, 0x9c, 0xc3, 0x69, 0x75,
-  0x43, 0xee, 0x91, 0xda, 0x5c, 0x49, 0x69, 0x31, 0xb9, 0x1b, 0x4e, 0x8d,
-  0xbe, 0x4b, 0x0e, 0xb6, 0xe1, 0xf2, 0xc3, 0x8e, 0x77, 0x94, 0xe9, 0x5a,
-  0xb8, 0xe1, 0x7c, 0xff, 0xb6, 0x73, 0x5c, 0xab, 0x1c, 0x87, 0x44, 0x60,
-  0x69, 0xeb, 0xdc, 0xd0, 0xb6, 0x61, 0xe4, 0xa4, 0x1e, 0xe1, 0x95, 0x94,
-  0x59, 0xc7, 0x89, 0xe5, 0x2d, 0xa6, 0x16, 0x86, 0x8b, 0x6c, 0x7e, 0x60,
-  0xd3, 0x95, 0x75, 0x78, 0x52, 0x2b, 0xc3, 0x1a, 0x1f, 0x9e, 0x23, 0xb7,
-  0xc8, 0xae, 0x67, 0xa2, 0x74, 0xf8, 0xe6, 0x8d, 0x6d, 0x22, 0x92, 0x26,
-  0xc2, 0x46, 0x91, 0xd4, 0x49, 0x82, 0x56, 0x6f, 0xf6, 0x6a, 0x23, 0xb0,
-  0x5b, 0x7e, 0xb8, 0x22, 0xa5, 0xdf, 0x35, 0x22, 0x14, 0x20, 0xa0, 0x50,
-  0x26, 0x85, 0x59, 0xdc, 0x40, 0x8a, 0x56, 0x92, 0x10, 0x15, 0xd1, 0xbb,
-  0x62, 0x17, 0x81, 0x9c, 0x5d, 0x90, 0xd3, 0x08, 0x90, 0x6a, 0x25, 0x61,
-  0x3e, 0x4f, 0xe6, 0xd7, 0x1f, 0x1f, 0x91, 0x57, 0xfc, 0xf2, 0x74, 0xa4,
-  0x91, 0x93, 0x22, 0xbb, 0xf5, 0xb6, 0x1f, 0x17, 0x14, 0x90, 0x3d, 0x4a,
-  0x4e, 0x22, 0x26, 0x4a, 0x06, 0x1d, 0x02, 0x7a, 0xc2, 0x92, 0xc3, 0x85,
-  0xd2, 0x5c, 0x82, 0x84, 0x4e, 0x82, 0x40, 0x8d, 0xa9, 0x2b, 0x5a, 0xf4,
-  0x8c, 0x15, 0x26, 0x4b, 0xd9, 0x42, 0x4c, 0x7c, 0x46, 0xa1, 0x7a, 0xd4,
-  0x4f, 0x06, 0xfb, 0x20, 0xc2, 0xd9, 0x6b, 0x4f, 0x62, 0xda, 0x30, 0xe9,
-  0x1f, 0xb5, 0x61, 0x5a, 0xd2, 0x56, 0x44, 0x64, 0x6c, 0xc9, 0xb6, 0xff,
-  0x68, 0xde, 0xa7, 0x3f, 0xf6, 0x65, 0x40, 0x1f, 0xf7, 0x80, 0xea, 0x66,
-  0x36, 0xca, 0xd9, 0x5d, 0xa8, 0x56, 0xec, 0xaf, 0x5d, 0x55, 0xe4, 0x4f,
-  0xdc, 0xe6, 0x96, 0x16, 0x9a, 0x4b, 0x21, 0xc0, 0x5d, 0x2a, 0x44, 0x9f,
-  0xda, 0x01, 0x33, 0x85, 0xe2, 0x08, 0x2f, 0x92, 0x8f, 0xfb, 0x1a, 0x8f,
-  0xa6, 0xdf, 0xe8, 0xbc, 0xb1, 0x43, 0xdf, 0x09, 0x9a, 0x20, 0xb5, 0x91,
-  0x90, 0x70, 0xde, 0xae, 0xa5, 0xcc, 0x28, 0xb3, 0x67, 0x8d, 0xa4, 0x69,
-  0x49, 0xa2, 0xb2, 0x10, 0xd7, 0x03, 0xe7, 0xc4, 0x33, 0xcb, 0x3c, 0x19,
-  0xf9, 0x1e, 0x14, 0x0a, 0xe8, 0x70, 0x0f, 0x35, 0x79, 0x52, 0xd8, 0x64,
-  0x0a, 0x71, 0xf7, 0x83, 0x70, 0x0f, 0xcb, 0x7f, 0x93, 0xb3, 0xf3, 0x02,
-  0x78, 0x54, 0x5c, 0xf9, 0x46, 0x3a, 0x6c, 0x26, 0xe6, 0x30, 0x2d, 0xe9,
-  0x56, 0x68, 0x6c, 0x05, 0xb6, 0x11, 0x13, 0x76, 0x6e, 0xfa, 0xa2, 0x70,
-  0xf0, 0x25, 0x0d, 0xa5, 0xde, 0x74, 0x63, 0x17, 0xe2, 0xf2, 0xf6, 0x40,
-  0x24, 0x16, 0xa2, 0x35, 0xc7, 0xce, 0x2b, 0xad, 0xaa, 0xbe, 0x79, 0xfc,
-  0x89, 0xf4, 0xa0, 0x4d, 0xf9, 0x12, 0xff, 0x9a, 0x93, 0xfe, 0x31, 0x47,
-  0xe7, 0x27, 0x6f, 0xb9, 0x50, 0xb8, 0x3d, 0x0b, 0x19, 0x11, 0x29, 0x6e,
-  0x70, 0x45, 0x7a, 0xf4, 0x27, 0x55, 0x66, 0x77, 0x76, 0x2e, 0xd1, 0x9e,
-  0xa1, 0x3d, 0x9e, 0xcb, 0xb7, 0x2e, 0x96, 0xfc, 0xf5, 0x4d, 0xba, 0x0b,
-  0xeb, 0x7a, 0xb6, 0xd9, 0x29, 0x80, 0x6b, 0xd7, 0xa4, 0x73, 0xe9, 0x58,
-  0xaf, 0xd5, 0x64, 0xea, 0x8c, 0x80, 0x24, 0x91, 0x56, 0x5a, 0xb2, 0xb0,
-  0xdf, 0xc9, 0x86, 0xf4, 0xdd, 0xe5, 0x7f, 0x4c, 0x86, 0x3b, 0xe6, 0x83,
-  0xf5, 0x8e, 0xbe, 0xb8, 0xf8, 0x30, 0xa9, 0xcd, 0x2d, 0x48, 0xa9, 0xbf,
-  0x3f, 0xc2, 0x68, 0xc7, 0x72, 0x98, 0x1e, 0x4f, 0x7f, 0x4e, 0x06, 0x93,
-  0x19, 0xc6, 0x97, 0xa0, 0xd2, 0xf6, 0x8f, 0x66, 0xe5, 0xe9, 0x89, 0x9f,
-  0xed, 0x1a, 0xbe, 0xca, 0xe9, 0xbc, 0x7d, 0xea, 0xeb, 0xd0, 0xcf, 0xd8,
-  0xa8, 0x60, 0xd6, 0xda, 0xe4, 0x70, 0xfa, 0x91, 0x12, 0xf3, 0xa6, 0xf2,
-  0x4f, 0x1a, 0xcf, 0x71, 0x81, 0x22, 0xa5, 0x18, 0x69, 0x3a, 0xe6, 0x9a,
-  0xe4, 0xdf, 0xe5, 0xc6, 0x30, 0x39, 0xea, 0xe8, 0x20, 0x94, 0x23, 0x48,
-  0x1d, 0xc4, 0x5b, 0xde, 0x2f, 0x35, 0xe1, 0xa3, 0x2f, 0x79, 0x0d, 0x0e,
-  0x7e, 0x4a, 0xd2, 0x99, 0x96, 0x6e, 0x98, 0x7c, 0x4d, 0x71, 0xd0, 0x2a,
-  0xf3, 0x38, 0x5d, 0xe5, 0x72, 0xe4, 0x62, 0x7e, 0xb4, 0x18, 0x29, 0x13,
-  0x54, 0x0c, 0xed, 0x48, 0x82, 0x3c, 0x19, 0x3b, 0x26, 0xfb, 0x9b, 0xf6,
-  0xe0, 0xd0, 0x2f, 0xcd, 0x7d, 0x37, 0x43, 0xd1, 0x9c, 0x8a, 0x24, 0x18,
-  0x8a, 0xc7, 0x32, 0xc9, 0x3d, 0xe4, 0x4b, 0x75, 0x9a, 0x29, 0x03, 0x40,
-  0xe9, 0xd3, 0xad, 0xa8, 0x77, 0x19, 0x4d, 0xa9, 0xd6, 0x60, 0xb7, 0x04,
-  0xee, 0x79, 0xd7, 0xeb, 0xa3, 0x1b, 0x23, 0x9a, 0x33, 0xdb, 0xd5, 0x11,
-  0xbb, 0xfd, 0xb4, 0x8b, 0x23, 0xba, 0xa3, 0x74, 0x11, 0xec, 0x2f, 0x35,
-  0x83, 0x12, 0x9a, 0xea, 0x0e, 0xcb, 0x2e, 0xbb, 0x77, 0x79, 0x76, 0xdb,
-  0x43, 0xa0, 0xc4, 0xc7, 0xd1, 0xbb, 0x37, 0x54, 0xb0, 0x04, 0xb5, 0xab,
-  0x2f, 0x2f, 0x0e, 0xdf, 0x8e, 0x5e, 0xb1, 0xfb, 0xfc, 0xb2, 0xf4, 0xaa,
-  0x62, 0x4b, 0xec, 0x41, 0x63, 0xcc, 0x96, 0xef, 0xed, 0x96, 0xab, 0x68,
-  0x28, 0xe6, 0x5e, 0x4a, 0x66, 0xf7, 0xbb, 0x2c, 0xfa, 0x5c, 0x6f, 0x9b,
-  0x66, 0x83, 0xba, 0xb6, 0x35, 0xda, 0xb6, 0xca, 0x52, 0xed, 0x97, 0x5a,
-  0x73, 0xf5, 0xea, 0x95, 0xef, 0x59, 0x1e, 0xa2, 0x69, 0x39, 0xd2, 0xce,
-  0xe8, 0x4f, 0xf9, 0xee, 0x5d, 0x49, 0x2d, 0x7a, 0x64, 0xcc, 0xc9, 0x81,
-  0xd4, 0x9f, 0x71, 0xc4, 0x6a, 0xce, 0xe5, 0xca, 0x77, 0xaf, 0x70, 0xf2,
-  0xd9, 0xc6, 0xfd, 0xdc, 0x50, 0x6d, 0x7a, 0xeb, 0xcf, 0x7b, 0xdb, 0xf1,
-  0xe6, 0x2f, 0x7f, 0x69, 0xf3, 0xf1, 0xbe, 0xab, 0xfd, 0xe6, 0xd2, 0x8e,
-  0xb6, 0xfe, 0xbc, 0xbf, 0xbd, 0x76, 0x44, 0x7e, 0xe6, 0xa4, 0xfb, 0xa6,
-  0x79, 0x83, 0x3a, 0x9b, 0xbc, 0xe0, 0x63, 0x66, 0xf5, 0x2a, 0x8b, 0xe2,
-  0xf1, 0x58, 0x84, 0x5b, 0xcc, 0x1e, 0x04, 0xed, 0xb6, 0xda, 0xbc, 0x0b,
-  0xce, 0x49, 0x06, 0xca, 0xc9, 0xff, 0x3c, 0xf6, 0x49, 0x21, 0x8b, 0xcd,
-  0xc6, 0xbf, 0xa2, 0x88, 0x41, 0xa0, 0x2e, 0x87, 0xf8, 0xf6, 0xfe, 0x9a,
-  0x6f, 0xbb, 0xd1, 0x79, 0xae, 0x0b, 0x8a, 0x74, 0x13, 0x54, 0x4e, 0x39,
-  0xae, 0xe5, 0x3b, 0xf6, 0xdb, 0xeb, 0xbe, 0x77, 0x79, 0xf2, 0xe6, 0x98,
-  0xb8, 0xb0, 0x5f, 0x9e, 0x10, 0x8b, 0xdc, 0x48, 0x78, 0x1c, 0xd5, 0x4b,
-  0x61, 0xf9, 0x75, 0xfd, 0x1a, 0x28, 0x1c, 0x02, 0xb6, 0x88, 0x34, 0x2b,
-  0x39, 0xec, 0x4a, 0xd0, 0xa7, 0x05, 0x27, 0x5d, 0x6b, 0x36, 0xe6, 0xc9,
-  0xd5, 0xe0, 0x4d, 0x39, 0x85, 0x25, 0x3d, 0x18, 0x01, 0x4e, 0x68, 0xde,
-  0x32, 0x3f, 0x7c, 0x57, 0xcc, 0x5b, 0x3f, 0x1e, 0x46, 0xb2, 0x79, 0x37,
-  0x56, 0x95, 0xda, 0xf9, 0xc7, 0xce, 0x60, 0x40, 0x9d, 0x19, 0x30, 0xf4,
-  0x4b, 0x02, 0x40, 0x2d, 0x22, 0x0f, 0x15, 0x2d, 0x66, 0x82, 0xf2, 0xd9,
-  0x1d, 0x83, 0x15, 0x52, 0x07, 0x31, 0x73, 0x19, 0x9e, 0xd7, 0x94, 0x65,
-  0xe6, 0xdc, 0x80, 0xec, 0xe8, 0xdb, 0xf0, 0xa9, 0x48, 0x61, 0x6c, 0x65,
-  0xb7, 0x0e, 0x23, 0x25, 0x85, 0x9b, 0xcb, 0xc5, 0x1d, 0x46, 0x79, 0xdb,
-  0x82, 0x5f, 0x44, 0x63, 0xb0, 0xff, 0xe0, 0x77, 0x5a, 0xc5, 0xa5, 0x84,
-  0x39, 0xda, 0xdb, 0x81, 0xf2, 0x13, 0xa9, 0xc5, 0x74, 0x56, 0x79, 0xd7,
-  0x95, 0x74, 0x5b, 0x6b, 0xd6, 0x79, 0x34, 0xa5, 0x1e, 0xab, 0x6a, 0xbb,
-  0x9f, 0x3e, 0xa5, 0x6b, 0x49, 0xe9, 0xb1, 0x2f, 0x4b, 0x1b, 0x40, 0x33,
-  0x62, 0x67, 0xd1, 0x2e, 0x8d, 0x9c, 0x25, 0x9a, 0x08, 0xce, 0x79, 0xfe,
-  0x9b, 0x83, 0x4d, 0x54, 0x5b, 0xc8, 0x8b, 0xc8, 0x60, 0x06, 0xbf, 0x7c,
-  0x34, 0x41, 0x78, 0x36, 0xe9, 0x5d, 0x11, 0x59, 0x06, 0xc5, 0xba, 0x7a,
-  0xdc, 0x01, 0x26, 0x94, 0xe1, 0xcd, 0x65, 0x2e, 0x08, 0x92, 0x6b, 0x6a,
-  0x6c, 0xb2, 0xe1, 0x6d, 0xd1, 0xb3, 0xd6, 0x91, 0xce, 0x9e, 0x4b, 0x12,
-  0xa4, 0xcb, 0xc5, 0x14, 0xc0, 0x0d, 0x86, 0xac, 0xfe, 0x07, 0x51, 0x5c,
-  0x57, 0x77, 0xc9, 0xde, 0x7e, 0x3f, 0x31, 0xf6, 0xcc, 0x7e, 0x64, 0x0c,
-  0xbd, 0xff, 0x20, 0xe0, 0xd4, 0x3e, 0x7e, 0xdd, 0x7b, 0xe8, 0x28, 0x5c,
-  0xce, 0x03, 0x6e, 0x12, 0xc9, 0x0e, 0x36, 0xc2, 0x87, 0x62, 0xb8, 0xa0,
-  0x55, 0x46, 0xbd, 0x64, 0xf0, 0xd2, 0xe1, 0xda, 0x62, 0x47, 0xa2, 0x56,
-  0xce, 0xb4, 0x05, 0xc1, 0xa6, 0xa8, 0x8f, 0xc3, 0x25, 0x6b, 0x81, 0x8e,
-  0xb1, 0xde, 0xd4, 0xb4, 0x42, 0x81, 0xcf, 0xf6, 0x1a, 0xe5, 0x8d, 0x2e,
-  0x0b, 0xc1, 0x6f, 0x68, 0x6d, 0xcc, 0x7e, 0x7f, 0x79, 0x72, 0x74, 0xa9,
-  0xc4, 0x85, 0x57, 0xa4, 0x3c, 0x55, 0x77, 0x0f, 0x2b, 0xb1, 0xb8, 0xf6,
-  0x99, 0xe9, 0xc1, 0x4d, 0x66, 0xd4, 0xe8, 0x62, 0xbc, 0xbc, 0x3e, 0xf8,
-  0x5b, 0x5a, 0x5d, 0x97, 0xc5, 0x7d, 0xcf, 0x4f, 0x91, 0x74, 0x76, 0x60,
-  0x24, 0xd4, 0xde, 0xb3, 0xbd, 0x47, 0xc8, 0x11, 0x9f, 0xe5, 0x28, 0xf3,
-  0x43, 0x02, 0x62, 0x73, 0xbe, 0xc9, 0x24, 0x1c, 0x48, 0xa5, 0xb0, 0xcc,
-  0x1b, 0xc5, 0x74, 0x93, 0xaf, 0xfb, 0xd4, 0x7f, 0x76, 0x2a, 0xcf, 0x72,
-  0x7a, 0xfa, 0xa6, 0xe4, 0x33, 0x6c, 0x52, 0x2a, 0xe7, 0x72, 0xb1, 0xd9,
-  0x26, 0x7e, 0xbf, 0x67, 0xac, 0xf4, 0x09, 0x5b, 0x51, 0xf2, 0xc8, 0xd2,
-  0xd9, 0x23, 0xcb, 0xa8, 0xca, 0xd2, 0x0f, 0xae, 0x80, 0xb2, 0x63, 0xe8,
-  0xd0, 0xb0, 0xc8, 0xc5, 0xab, 0x23, 0xa6, 0x22, 0xd5, 0x9c, 0x2a, 0x4c,
-  0x75, 0x62, 0xdd, 0x57, 0xdb, 0xd4, 0xcb, 0x7b, 0xbe, 0x4f, 0xf9, 0x0f,
-  0x07, 0xd3, 0xf1, 0x03, 0x1e, 0x32, 0xe7, 0x8e, 0xd9, 0xe4, 0x0e, 0xdb,
-  0x05, 0x75, 0xc8, 0x50, 0x43, 0x55, 0x10, 0xad, 0x94, 0xbc, 0xc5, 0x85,
-  0x62, 0x39, 0x2a, 0x41, 0x5d, 0xd3, 0x1a, 0xd4, 0xea, 0x01, 0x32, 0xfd,
-  0xa6, 0xda, 0xad, 0x2f, 0x0f, 0xcf, 0x3d, 0x43, 0x17, 0x86, 0xa4, 0x73,
-  0xfc, 0xd1, 0x73, 0x64, 0xe8, 0xa0, 0x18, 0xbb, 0xd4, 0x58, 0xea, 0x3b,
-  0x13, 0xa5, 0x81, 0x9c, 0x24, 0xdd, 0x08, 0x20, 0xfa, 0x52, 0xee, 0x13,
-  0xf8, 0xa8, 0x50, 0xa3, 0x60, 0x36, 0x4d, 0x11, 0x2c, 0x95, 0x5b, 0x88,
-  0xb2, 0x24, 0xce, 0x0a, 0xcd, 0x74, 0xee, 0x77, 0x0a, 0x32, 0x98, 0x1f,
-  0xe3, 0x3b, 0xb8, 0xa2, 0xcf, 0x8d, 0x12, 0x0e, 0xaa, 0x97, 0xd1, 0xcb,
-  0x6f, 0xa9, 0xc7, 0x12, 0xf8, 0x81, 0xd6, 0xa6, 0xfe, 0x6e, 0x1b, 0xad,
-  0x52, 0xab, 0x51, 0x1d, 0x5c, 0xea, 0x7f, 0xa4, 0xe6, 0x3e, 0x3e, 0x1a,
-  0xf2, 0x9f, 0xfb, 0xb6, 0x68, 0x31, 0x1e, 0x03, 0x16, 0xf4, 0x4a, 0x4b,
-  0x22, 0xcf, 0x33, 0xaa, 0xd1, 0x9b, 0xd7, 0x73, 0x07, 0x5d, 0xb9, 0x92,
-  0xd7, 0x5d, 0xa1, 0x3c, 0x51, 0x22, 0x29, 0xfc, 0x80, 0x7e, 0xa0, 0xb7,
-  0xb9, 0x60, 0xbf, 0xcc, 0x2e, 0xfb, 0x94, 0x48, 0xca, 0x8a, 0xe4, 0xe6,
-  0x48, 0x3d, 0x14, 0x3c, 0x46, 0x39, 0xd8, 0x77, 0xba, 0x14, 0x7c, 0xd3,
-  0x98, 0x65, 0x48, 0xeb, 0x0f, 0xe6, 0x52, 0x60, 0xb8, 0x82, 0x99, 0xc7,
-  0x5c, 0x02, 0xfe, 0xe4, 0xe2, 0xca, 0x19, 0x36, 0x44, 0xce, 0x36, 0x50,
-  0x3f, 0xb5, 0xb6, 0x1e, 0x5f, 0xa6, 0x64, 0x3b, 0xcf, 0xea, 0x8c, 0xb9,
-  0x14, 0x41, 0x1a, 0x44, 0xf1, 0x41, 0xda, 0x7a, 0xb0, 0x99, 0x14, 0x77,
-  0x0b, 0x71, 0x46, 0xbb, 0x74, 0x7f, 0xff, 0xc9, 0x93, 0x7e, 0xd2, 0x23,
-  0xdf, 0x24, 0xfa, 0x44, 0x1b, 0xfa, 0x15, 0x04, 0x4f, 0x2f, 0x5a, 0x37,
-  0x77, 0xa7, 0xba, 0x9a, 0xd0, 0xff, 0xe8, 0x3d, 0x2d, 0x17, 0x79, 0x29,
-  0xc9, 0x3a, 0xd4, 0x4d, 0x04, 0x62, 0x2d, 0xa5, 0x0e, 0xef, 0x34, 0xfa,
-  0xdd, 0x89, 0x75, 0x3f, 0x51, 0xac, 0x69, 0x91, 0x95, 0x0b, 0x0d, 0x2a,
-  0xcf, 0xa5, 0x10, 0x08, 0xbe, 0xef, 0x45, 0xe2, 0x00, 0x03, 0x60, 0x14,
-  0x9d, 0x70, 0x27, 0xd4, 0xcb, 0xf1, 0x40, 0x92, 0x88, 0xd9, 0xd0, 0xcc,
-  0xcd, 0x61, 0x9e, 0xd3, 0x22, 0x88, 0x97, 0x3f, 0x10, 0xd2, 0x5f, 0x27,
-  0x3d, 0xd9, 0x6e, 0xf4, 0xc7, 0x10, 0x31, 0xe1, 0x6c, 0x42, 0xc3, 0x28,
-  0x5f, 0xc8, 0x3f, 0xfe, 0xfd, 0xdf, 0x4d, 0xb3, 0xff, 0x4e, 0xad, 0xbc,
-  0xf8, 0x73, 0xdd, 0xdc, 0x78, 0xcf, 0xf4, 0xe4, 0x0c, 0x9c, 0xb8, 0x88,
-  0x38, 0x50, 0x6e, 0xa0, 0x90, 0x45, 0xae, 0xdb, 0x9b, 0x53, 0x11, 0xd2,
-  0x7d, 0x6f, 0x7c, 0x39, 0xb2, 0x10, 0xd9, 0xb7, 0x6a, 0x41, 0x26, 0x5f,
-  0x53, 0xb4, 0x3a, 0xa3, 0xec, 0x75, 0xb3, 0x08, 0x60, 0x1e, 0xdc, 0x76,
-  0xb0, 0x13, 0x96, 0xef, 0xf0, 0x9f, 0x72, 0x21, 0xb9, 0x4e, 0x61, 0xac,
-  0x5b, 0xbd, 0x29, 0xf8, 0x14, 0x63, 0x9d, 0xcc, 0xaf, 0xd2, 0x59, 0x79,
-  0x6d, 0x47, 0x1c, 0x2b, 0x45, 0xf3, 0x8b, 0xc6, 0xde, 0xf3, 0x1b, 0xd2,
-  0x37, 0xfd, 0x18, 0xfc, 0x03, 0x5b, 0x21, 0x2c, 0x81, 0x3d, 0x9a, 0x80,
-  0xc8, 0x86, 0xa5, 0xc7, 0x84, 0x5a, 0xd8, 0x58, 0x2a, 0x2a, 0x48, 0x76,
-  0xf4, 0xa0, 0xdb, 0x93, 0x4f, 0xf0, 0xde, 0x09, 0x1d, 0x81, 0x4e, 0x2d,
-  0x1c, 0x27, 0x2b, 0xac, 0x72, 0x23, 0x65, 0x4e, 0x44, 0x37, 0xc9, 0x8c,
-  0xbc, 0xca, 0xcd, 0x59, 0xc0, 0x05, 0x48, 0xdf, 0x61, 0x08, 0x91, 0x04,
-  0xad, 0x07, 0x83, 0x31, 0x17, 0x12, 0x1b, 0x0c, 0x8a, 0x66, 0x36, 0x67,
-  0x1e, 0xe6, 0x29, 0x8a, 0x8a, 0x69, 0x12, 0x47, 0x5e, 0x84, 0x24, 0x84,
-  0xed, 0x69, 0xe6, 0x57, 0xff, 0xb9, 0x49, 0xf2, 0x65, 0x1e, 0xd7, 0xea,
-  0xa4, 0x76, 0x76, 0x1c, 0xb1, 0xa3, 0xe3, 0x4f, 0x23, 0x57, 0xe8, 0xa0,
-  0x90, 0x3a, 0x67, 0x40, 0xff, 0x5b, 0xc9, 0x24, 0x04, 0x65, 0x3e, 0xaa,
-  0x55, 0x93, 0x91, 0x88, 0x2f, 0x9a, 0x7c, 0x6f, 0x46, 0xbc, 0x67, 0xc0,
-  0x2d, 0xd7, 0xc9, 0xd6, 0x68, 0x74, 0x7e, 0xb2, 0xa3, 0x65, 0xd2, 0x36,
-  0x36, 0x8e, 0xdf, 0x7e, 0x77, 0x72, 0x71, 0xf6, 0xf6, 0xcd, 0xf1, 0xdb,
-  0xcb, 0xe4, 0xbb, 0xc3, 0x8b, 0x93, 0xc3, 0xaf, 0x4f, 0x85, 0x9f, 0x81,
-  0x86, 0x49, 0xb0, 0x34, 0xb6, 0x04, 0x3b, 0xe4, 0xc2, 0x5e, 0xea, 0x5c,
-  0xb4, 0x3e, 0x4d, 0xa7, 0xf4, 0xf6, 0x7b, 0xa1, 0xc7, 0x87, 0x5d, 0xfc,
-  0x1e, 0xa5, 0xb6, 0xfa, 0x64, 0x0a, 0xbd, 0xd7, 0xaa, 0x5b, 0x64, 0xca,
-  0xdf, 0x79, 0x19, 0xff, 0x84, 0x98, 0x23, 0x69, 0xa6, 0xb2, 0xdc, 0xd5,
-  0x9b, 0xb4, 0x05, 0x5c, 0xbe, 0x61, 0xd2, 0x08, 0xad, 0x66, 0xa3, 0xaf,
-  0x42, 0x7c, 0xb0, 0xaa, 0xe3, 0xfa, 0x70, 0x78, 0x7a, 0xea, 0x3e, 0xb5,
-  0xbe, 0xd0, 0x91, 0x10, 0x86, 0x71, 0xba, 0x21, 0x1a, 0xa5, 0x50, 0xf6,
-  0x75, 0xe9, 0xb8, 0xfe, 0x8b, 0x3b, 0x9f, 0xd6, 0x9f, 0x3e, 0x66, 0xb6,
-  0xcb, 0x16, 0x33, 0xbd, 0x10, 0xae, 0xa1, 0xc9, 0xaa, 0xbc, 0xfe, 0xd0,
-  0x4f, 0x36, 0xff, 0xbc, 0x29, 0xa5, 0xed, 0xc1, 0x41, 0xcd, 0x65, 0x94,
-  0xb6, 0x5d, 0xa7, 0xde, 0x9e, 0xb9, 0x3e, 0x49, 0xa8, 0xde, 0x76, 0xc0,
-  0xbe, 0xe8, 0x80, 0x16, 0xb5, 0x6a, 0xd7, 0x40, 0x38, 0xbb, 0xc7, 0xa5,
-  0xc6, 0x88, 0x25, 0xb0, 0x10, 0xf1, 0x48, 0xa1, 0xd8, 0xe8, 0xbb, 0xf0,
-  0x21, 0xa4, 0x13, 0x8f, 0x6a, 0x1c, 0x63, 0x2d, 0xc8, 0xf1, 0x66, 0xeb,
-  0xbf, 0xa9, 0x6f, 0xda, 0x4c, 0xf5, 0x54, 0x88, 0x19, 0x53, 0x6d, 0x59,
-  0xb2, 0x9d, 0x91, 0x4d, 0x6e, 0x83, 0x54, 0x9e, 0x8f, 0x31, 0x15, 0xcc,
-  0xfb, 0xd0, 0xcc, 0x34, 0x0e, 0x3e, 0xfb, 0x90, 0x5a, 0xce, 0x5d, 0x84,
-  0x8d, 0x3a, 0xe9, 0xa1, 0x12, 0x0e, 0x29, 0x5b, 0x3f, 0x93, 0x75, 0xd5,
-  0x3a, 0x53, 0xe9, 0x86, 0x82, 0x75, 0xc1, 0x93, 0xc1, 0xce, 0x4c, 0x9d,
-  0x48, 0x40, 0x2a, 0xfd, 0xb7, 0x7b, 0xc8, 0x5e, 0xe2, 0x68, 0x8c, 0xe5,
-  0x4e, 0x24, 0x52, 0x22, 0x4c, 0xb1, 0x43, 0xae, 0x67, 0x9f, 0x98, 0x6d,
-  0xc8, 0x6e, 0x32, 0xb7, 0x11, 0xb8, 0x42, 0x9e, 0x00, 0xd5, 0xbb, 0x1d,
-  0xb6, 0xbd, 0xd2, 0x6a, 0x4b, 0x88, 0xac, 0xb1, 0xc2, 0x05, 0x95, 0xa9,
-  0x3b, 0x1a, 0xb8, 0x0c, 0x19, 0x12, 0xdd, 0xea, 0x74, 0xa7, 0xe1, 0x9e,
-  0x22, 0x0e, 0x96, 0xb5, 0x28, 0x50, 0xb8, 0x41, 0x3e, 0xed, 0x68, 0xfd,
-  0x2a, 0xc0, 0x10, 0x28, 0x65, 0xa8, 0x32, 0x32, 0xb4, 0x5e, 0x5d, 0x26,
-  0x6a, 0x88, 0xe8, 0xf5, 0xc5, 0x11, 0x4a, 0x2b, 0x14, 0x54, 0x69, 0xd5,
-  0xd5, 0xc5, 0x41, 0x7a, 0x41, 0x91, 0x35, 0x15, 0xe5, 0xec, 0x16, 0x62,
-  0x83, 0x00, 0xb2, 0x0f, 0x13, 0x3d, 0xbd, 0x2e, 0xd5, 0xfc, 0x4e, 0x2d,
-  0xae, 0xc6, 0x56, 0x11, 0xf4, 0x4c, 0x7a, 0xcb, 0x2d, 0x68, 0xe5, 0x16,
-  0x10, 0x38, 0x1a, 0x43, 0x24, 0x04, 0x2a, 0x9d, 0x31, 0xad, 0x0a, 0x5f,
-  0x7b, 0xec, 0x0d, 0x2e, 0xc1, 0x89, 0xe4, 0x38, 0xe7, 0xf1, 0x28, 0xd9,
-  0x1f, 0x08, 0x16, 0x95, 0xed, 0x01, 0x58, 0x68, 0x74, 0x8b, 0x1e, 0x44,
-  0x93, 0x02, 0x6b, 0x47, 0x93, 0x1a, 0xde, 0x32, 0xe2, 0x6a, 0x46, 0x39,
-  0xa6, 0xaa, 0x75, 0xa4, 0xc9, 0x38, 0xbf, 0x66, 0xd6, 0x10, 0xa2, 0xa8,
-  0xa0, 0x63, 0x09, 0x12, 0xc8, 0x72, 0x9e, 0xd1, 0xd9, 0x00, 0xc5, 0x23,
-  0x4c, 0xf7, 0x9b, 0x72, 0xe6, 0xf3, 0x10, 0xea, 0x48, 0x64, 0xf5, 0x6d,
-  0xe4, 0x03, 0xd1, 0xd1, 0x25, 0xcd, 0xa3, 0x02, 0x56, 0xa5, 0xca, 0x80,
-  0xc0, 0x77, 0x29, 0xec, 0x06, 0x4a, 0xd5, 0x02, 0xc9, 0x82, 0xca, 0xb6,
-  0x80, 0x79, 0xd0, 0xd4, 0x06, 0xda, 0xb8, 0x70, 0xa3, 0x53, 0xed, 0xd6,
-  0x2d, 0x5b, 0x26, 0x80, 0x5a, 0x99, 0x30, 0x81, 0x33, 0x49, 0x19, 0x06,
-  0x9d, 0xb4, 0x8b, 0x7c, 0xc9, 0x62, 0x09, 0xbb, 0x9e, 0xd9, 0x13, 0xd4,
-  0x69, 0x33, 0x53, 0x5b, 0x9e, 0x92, 0x51, 0x98, 0x2d, 0xc2, 0x8f, 0xb1,
-  0xff, 0x48, 0xfe, 0x35, 0xb0, 0xf5, 0x09, 0x05, 0x9a, 0xb2, 0xed, 0xa0,
-  0x49, 0x6c, 0x04, 0x90, 0x78, 0x98, 0x48, 0x85, 0x58, 0x80, 0x78, 0xa8,
-  0xbc, 0x2d, 0x28, 0xe3, 0x5a, 0xa1, 0x87, 0x44, 0x53, 0xf2, 0x66, 0x33,
-  0xaf, 0x4e, 0x00, 0x7b, 0x23, 0xd3, 0xc0, 0xf4, 0x20, 0x31, 0x31, 0x64,
-  0x91, 0xcb, 0xe0, 0x40, 0xe6, 0x14, 0xf7, 0x06, 0x22, 0x69, 0x27, 0x64,
-  0x9c, 0x75, 0x22, 0x1a, 0xde, 0x0d, 0xa2, 0x00, 0x1a, 0x5f, 0x09, 0x95,
-  0xda, 0x38, 0x79, 0x3a, 0x67, 0xd3, 0xd1, 0xed, 0xbe, 0xf9, 0x1d, 0x03,
-  0x93, 0x37, 0x36, 0x8e, 0xde, 0x8d, 0x2e, 0xcf, 0xde, 0x24, 0x67, 0xef,
-  0x2e, 0xcf, 0xdf, 0x5d, 0x8a, 0x96, 0x3a, 0xe6, 0xb4, 0x0e, 0x06, 0x37,
-  0xb1, 0xe6, 0xac, 0x8b, 0x39, 0x17, 0x08, 0x10, 0x50, 0x68, 0x25, 0x88,
-  0x47, 0x3d, 0xce, 0x31, 0x9b, 0xb6, 0x09, 0x36, 0x3e, 0x66, 0x1e, 0xc7,
-  0x94, 0xdf, 0x9a, 0x29, 0x47, 0xca, 0x3d, 0xfc, 0xf8, 0x9a, 0x05, 0x0a,
-  0xaf, 0x87, 0x9e, 0xb5, 0x76, 0xdd, 0xa9, 0xbb, 0xb6, 0x17, 0x03, 0xf8,
-  0x9d, 0x36, 0xc7, 0x9b, 0x5f, 0x06, 0x97, 0x5d, 0xbb, 0xce, 0xf3, 0xeb,
-  0xa3, 0xbe, 0xa5, 0x88, 0xae, 0xc6, 0x9f, 0x14, 0x78, 0x0f, 0x34, 0x62,
-  0x3b, 0xf7, 0xd8, 0x4f, 0x81, 0x6e, 0x4a, 0x33, 0xc2, 0x1b, 0x9b, 0x34,
-  0x43, 0x40, 0x43, 0x80, 0x85, 0x19, 0x63, 0x45, 0xa8, 0x5c, 0x76, 0x18,
-  0x14, 0xd9, 0x2d, 0xe9, 0x3d, 0x81, 0x46, 0x7d, 0x9b, 0x6c, 0x7e, 0x9f,
-  0xf9, 0x0d, 0xfe, 0xe9, 0x3f, 0x29, 0xb3, 0xfb, 0xbd, 0xfe, 0xe4, 0xbf,
-  0xf8, 0x93, 0x3f, 0x15, 0x9b, 0x10, 0x98, 0x6d, 0x30, 0xcd, 0xb7, 0xc7,
-  0x17, 0x5f, 0x1f, 0x5f, 0x9c, 0x8d, 0x20, 0x0f, 0xd4, 0xdb, 0x1d, 0xee,
-  0xf5, 0x0f, 0x59, 0x35, 0xce, 0xaa, 0x52, 0x6a, 0xe3, 0xe9, 0xbf, 0x9e,
-  0xec, 0x7c, 0x33, 0x1a, 0x1d, 0x9e, 0x9f, 0xd8, 0xaa, 0x53, 0x36, 0xc7,
-  0x94, 0x3d, 0x24, 0x05, 0x67, 0x41, 0xd3, 0xf8, 0xf5, 0x15, 0xb3, 0x2f,
-  0x26, 0x1f, 0x38, 0xf7, 0x20, 0x80, 0xad, 0x68, 0x58, 0x8d, 0xf0, 0x2a,
-  0x92, 0x7a, 0x4c, 0x0d, 0x2b, 0x57, 0x9c, 0x5f, 0x34, 0x82, 0xab, 0x3b,
-  0x50, 0x28, 0xb0, 0x6f, 0x41, 0xba, 0x1f, 0xaa, 0xf1, 0xc0, 0xec, 0xf6,
-  0x0f, 0x5a, 0x8c, 0x9d, 0x53, 0xa5, 0x8c, 0xa8, 0xe4, 0x1c, 0x0a, 0xe7,
-  0x6a, 0xfc, 0x90, 0x17, 0x79, 0xb3, 0xf3, 0x81, 0xce, 0x07, 0x55, 0x44,
-  0x9a, 0x0d, 0x59, 0xba, 0xf3, 0x81, 0x52, 0x60, 0x3c, 0x89, 0xd8, 0x75,
-  0xfc, 0x35, 0xe6, 0x6b, 0xb6, 0x9c, 0x29, 0xbb, 0xbb, 0xcd, 0x4f, 0x1e,
-  0x5b, 0x22, 0x3f, 0xd1, 0xfb, 0x81, 0xa5, 0xbd, 0x32, 0x77, 0xd5, 0xe2,
-  0x76, 0x2a, 0x97, 0x08, 0x48, 0xec, 0x59, 0xb7, 0x14, 0x19, 0xde, 0x8d,
-  0x4f, 0x53, 0xc9, 0x55, 0xe4, 0x74, 0x49, 0xc6, 0x4a, 0x32, 0x9e, 0xa5,
-  0xc5, 0x07, 0xa8, 0x0f, 0x50, 0x08, 0xe8, 0xee, 0x53, 0x7a, 0x3a, 0x2a,
-  0x85, 0x0b, 0xc8, 0x82, 0x30, 0xc6, 0xc0, 0xe0, 0x9b, 0x91, 0x70, 0xbb,
-  0xe3, 0x50, 0x9e, 0x65, 0xe1, 0xf3, 0x02, 0xef, 0x38, 0x4e, 0x6e, 0x12,
-  0xc8, 0x73, 0x7c, 0x7c, 0x6a, 0x2e, 0x26, 0x9b, 0x87, 0x06, 0x0f, 0x5d,
-  0x36, 0xa3, 0x48, 0x90, 0x82, 0x06, 0x39, 0xf5, 0x3a, 0x87, 0x20, 0x63,
-  0xe9, 0xa1, 0x75, 0x10, 0x10, 0x3e, 0xc6, 0x76, 0x41, 0x86, 0x79, 0x6d,
-  0xab, 0x05, 0x89, 0xe4, 0x66, 0x21, 0x06, 0xfe, 0x60, 0x57, 0x3c, 0xc8,
-  0xaf, 0x65, 0x25, 0x88, 0xdc, 0x23, 0x07, 0x19, 0xb4, 0x45, 0xfe, 0xb8,
-  0x13, 0xce, 0x04, 0xb5, 0x00, 0x83, 0x56, 0x02, 0xdc, 0xca, 0x65, 0xe2,
-  0xd7, 0x63, 0x3e, 0x40, 0xa6, 0x3d, 0x9c, 0x4a, 0xb8, 0xd3, 0x32, 0x86,
-  0x69, 0x56, 0x43, 0x3b, 0x93, 0x40, 0x3b, 0xce, 0x80, 0x21, 0x8a, 0xdd,
-  0xcc, 0x1a, 0xeb, 0xa6, 0xa8, 0x99, 0x83, 0x0d, 0x3a, 0xd7, 0x14, 0x22,
-  0xa7, 0x6a, 0x31, 0x5a, 0xfb, 0x00, 0x7e, 0x26, 0xb5, 0x29, 0xad, 0x89,
-  0xc9, 0xb6, 0xbf, 0xb5, 0x65, 0x07, 0x6f, 0xe9, 0xba, 0x28, 0x07, 0xe3,
-  0x25, 0xdc, 0x32, 0x5e, 0xd1, 0x3d, 0x4e, 0xf3, 0x2e, 0xaf, 0x58, 0xf3,
-  0xe0, 0xdf, 0x53, 0x38, 0x1a, 0x04, 0x1a, 0x1c, 0xa1, 0x46, 0x46, 0x75,
-  0x9b, 0x8b, 0xcb, 0x32, 0x30, 0x71, 0x9a, 0x92, 0xab, 0x0a, 0x6e, 0x07,
-  0x28, 0x8b, 0x6c, 0x5d, 0x34, 0x9e, 0x49, 0xd3, 0xef, 0x24, 0x65, 0x34,
-  0xb6, 0x6e, 0xc5, 0x25, 0xd4, 0x84, 0x4c, 0x0a, 0x3a, 0x68, 0xb6, 0x85,
-  0xe6, 0x76, 0x7d, 0x6c, 0xa8, 0x4c, 0x1c, 0x93, 0xc7, 0xa4, 0x33, 0x2e,
-  0xb7, 0xb3, 0xf2, 0x2a, 0xe1, 0xc3, 0xd4, 0x5c, 0x5e, 0xfe, 0xf5, 0xfc,
-  0xf8, 0x85, 0xbe, 0xb9, 0x6e, 0xcd, 0x98, 0x53, 0x11, 0xb0, 0xba, 0x4c,
-  0x38, 0x8c, 0xbd, 0x82, 0xf7, 0x66, 0x93, 0x0d, 0x1a, 0x85, 0xfb, 0xf0,
-  0x67, 0x06, 0xc9, 0x0f, 0x2f, 0x4f, 0x46, 0xe7, 0xa7, 0x67, 0x47, 0x2f,
-  0x9e, 0xff, 0xa0, 0x22, 0xf9, 0x4b, 0x8a, 0x10, 0xb2, 0x9e, 0x66, 0x7f,
-  0xe6, 0x38, 0x5f, 0xe4, 0xbd, 0xb7, 0xc7, 0xdf, 0xbf, 0x37, 0xe6, 0xd8,
-  0x0b, 0x2a, 0xfb, 0xd0, 0xff, 0x98, 0xce, 0xe4, 0x25, 0xd2, 0x4f, 0x23,
-  0xba, 0xdd, 0xb0, 0x4d, 0xd2, 0xd9, 0x9d, 0x58, 0x5b, 0x73, 0xd8, 0xa5,
-  0x32, 0xdd, 0x29, 0xd2, 0xd6, 0x2b, 0x2b, 0x97, 0xb6, 0x32, 0xef, 0x23,
-  0x15, 0xc2, 0xdd, 0xf5, 0xbf, 0xd9, 0x30, 0xec, 0x9a, 0x50, 0x46, 0x3e,
-  0x30, 0x07, 0xd0, 0x76, 0xf9, 0x8d, 0x83, 0xfc, 0x0b, 0xcd, 0x7a, 0x45,
-  0x5e, 0x34, 0x4b, 0x51, 0x2b, 0x65, 0xe7, 0x01, 0x79, 0x11, 0x1e, 0x5b,
-  0x21, 0x67, 0x23, 0x94, 0xbd, 0x26, 0xdc, 0xa8, 0x1c, 0x13, 0x15, 0xc6,
-  0xf6, 0x25, 0xd5, 0x02, 0xd8, 0x28, 0xac, 0x75, 0x7e, 0x7c, 0x31, 0x3a,
-  0x19, 0x5d, 0x92, 0xdd, 0x2a, 0xd5, 0x58, 0x25, 0x04, 0xa5, 0xa5, 0x72,
-  0x41, 0xeb, 0xd2, 0xa6, 0x24, 0xf6, 0x8b, 0xfe, 0xb4, 0x4e, 0xb4, 0x15,
-  0x73, 0xed, 0x3c, 0x6f, 0xba, 0x01, 0x38, 0x79, 0x9c, 0x14, 0x51, 0x26,
-  0xd6, 0x4e, 0xaf, 0xf4, 0x00, 0x97, 0xb2, 0x35, 0x3a, 0xb5, 0x6f, 0x50,
-  0xb7, 0x0a, 0xab, 0x33, 0xcb, 0xc7, 0xce, 0x95, 0xd9, 0x41, 0x90, 0x10,
-  0x38, 0x49, 0x48, 0x7c, 0xfc, 0x23, 0xa4, 0xe1, 0x30, 0x47, 0x9e, 0x20,
-  0x05, 0xba, 0xe5, 0x5a, 0x93, 0xc4, 0x67, 0x3f, 0xc5, 0xdd, 0x3a, 0xa5,
-  0x60, 0xb4, 0xa8, 0x9e, 0x66, 0x7f, 0xea, 0xe1, 0xd4, 0x85, 0x17, 0x0e,
-  0x94, 0xd6, 0x22, 0xb2, 0x49, 0x28, 0xe7, 0x9c, 0xac, 0x4a, 0xde, 0x49,
-  0xa3, 0xb5, 0x80, 0x7c, 0x03, 0x50, 0x42, 0x19, 0x59, 0xa0, 0x82, 0x88,
-  0xea, 0x78, 0x4d, 0x59, 0xae, 0x20, 0xdf, 0x9b, 0x92, 0xbe, 0x05, 0x07,
-  0xbc, 0xff, 0x31, 0xbd, 0x4e, 0x69, 0x06, 0xc7, 0x4b, 0xbf, 0xac, 0xa3,
-  0xed, 0x3d, 0x17, 0x17, 0xc2, 0xc4, 0x03, 0x44, 0x9d, 0x56, 0x70, 0x64,
-  0x34, 0x52, 0x49, 0x42, 0x0d, 0x1f, 0x41, 0x44, 0x0f, 0xdb, 0x3c, 0x5f,
-  0xba, 0x2f, 0xd5, 0x08, 0x5b, 0x37, 0xa3, 0x5e, 0x3d, 0x58, 0xda, 0xbe,
-  0x55, 0xa6, 0xd0, 0x46, 0x76, 0x29, 0xd6, 0x14, 0x6f, 0x2c, 0x26, 0xf6,
-  0x32, 0xa6, 0xbc, 0x44, 0x82, 0x17, 0x54, 0xc2, 0xa1, 0x66, 0xc4, 0x1f,
-  0x05, 0x96, 0x50, 0x44, 0x16, 0xd5, 0xd5, 0x29, 0xe8, 0xae, 0xfc, 0x9a,
-  0x2e, 0xd3, 0x83, 0xa7, 0xdb, 0xdb, 0x56, 0x1c, 0x5d, 0xbb, 0x93, 0x0f,
-  0x5a, 0x0e, 0x0d, 0x5d, 0xac, 0x3e, 0xa7, 0x64, 0xa6, 0xc8, 0x00, 0xd4,
-  0xb0, 0x8e, 0x97, 0x49, 0x5e, 0x4b, 0x7e, 0xbe, 0x45, 0xa7, 0x40, 0xe0,
-  0xb5, 0x2a, 0x69, 0xd3, 0xe8, 0x5a, 0xc8, 0x00, 0xa3, 0x5f, 0x2e, 0x50,
-  0x09, 0x6d, 0x22, 0xa5, 0x26, 0x80, 0xeb, 0xb7, 0x0d, 0xea, 0x25, 0xe2,
-  0x26, 0xcb, 0xcc, 0xea, 0x9b, 0x77, 0xa7, 0x97, 0x27, 0xe7, 0x3e, 0xfa,
-  0x20, 0xf9, 0xfe, 0xe4, 0xf2, 0xb5, 0xd1, 0xda, 0x47, 0x27, 0x6f, 0xbf,
-  0x39, 0xa5, 0x10, 0xef, 0x9b, 0x37, 0x87, 0x6f, 0x89, 0x80, 0xe4, 0x2d,
-  0xc0, 0xcf, 0x87, 0x30, 0x1c, 0x48, 0x1c, 0x99, 0x29, 0xa6, 0xbd, 0x43,
-  0xd4, 0x14, 0xfd, 0x30, 0xd2, 0xd8, 0x39, 0x7e, 0x5c, 0x29, 0xbd, 0x68,
-  0x4f, 0xd2, 0x06, 0xea, 0xde, 0xc3, 0x32, 0xb8, 0x23, 0x27, 0x2e, 0x8e,
-  0x2d, 0x19, 0x5b, 0x34, 0xd1, 0xdd, 0x1a, 0x13, 0x48, 0x83, 0x66, 0x0d,
-  0x1d, 0x28, 0x1a, 0xbe, 0xbb, 0x5d, 0xf4, 0x12, 0x2b, 0x6a, 0xc9, 0xa9,
-  0x61, 0xc7, 0x18, 0x9d, 0xa9, 0x10, 0xbb, 0x86, 0xef, 0xcb, 0x76, 0x5a,
-  0x92, 0xf9, 0x22, 0xba, 0x04, 0x18, 0x51, 0xe9, 0xdc, 0xe8, 0x64, 0x71,
-  0x92, 0xd1, 0x7c, 0x71, 0xea, 0x5f, 0xa8, 0xc3, 0x56, 0xe9, 0x40, 0x45,
-  0x10, 0x5f, 0x97, 0x99, 0x3b, 0xb9, 0x83, 0x33, 0x6d, 0x46, 0xa3, 0x3f,
-  0x30, 0xc3, 0xf8, 0x72, 0x19, 0x90, 0x5c, 0x1b, 0x98, 0x25, 0xd9, 0xb6,
-  0xe5, 0xc2, 0xc4, 0xec, 0x3f, 0x60, 0xb5, 0xd2, 0xd2, 0xaf, 0x6b, 0xa9,
-  0x4d, 0xd3, 0x9c, 0xb6, 0x2c, 0x48, 0x34, 0xa4, 0x6c, 0x48, 0xe6, 0xa3,
-  0x8c, 0x19, 0xd2, 0x52, 0x1f, 0x6b, 0x11, 0x37, 0xf0, 0x7d, 0x77, 0xa6,
-  0xa1, 0x49, 0xcd, 0x7c, 0xb5, 0x45, 0x1c, 0x1d, 0x70, 0x02, 0x15, 0x12,
-  0xe1, 0xae, 0xc8, 0x08, 0xe3, 0x40, 0x7f, 0xfd, 0xdb, 0xe2, 0xda, 0x4f,
-  0x8a, 0xe5, 0x62, 0xf1, 0x8b, 0xd8, 0xca, 0x0a, 0xd7, 0x3b, 0xab, 0x45,
-  0x52, 0x98, 0xb2, 0xd5, 0x03, 0xa9, 0x36, 0xb9, 0xb7, 0xea, 0x83, 0xf2,
-  0xfb, 0xfd, 0xf0, 0xf7, 0xfb, 0x1c, 0x62, 0x38, 0x39, 0xff, 0xf8, 0xd4,
-  0x72, 0x24, 0x33, 0xd5, 0x83, 0xaf, 0xbe, 0xa9, 0x52, 0x40, 0x3b, 0x8c,
-  0x1e, 0x15, 0x87, 0x39, 0xcb, 0x44, 0x0e, 0xfd, 0x11, 0x80, 0x74, 0x59,
-  0x21, 0x85, 0x1d, 0x8f, 0x20, 0xb6, 0xc2, 0x99, 0x01, 0x70, 0x3c, 0x41,
-  0x4e, 0xd1, 0x75, 0x65, 0x1a, 0x34, 0xbf, 0x7f, 0x6c, 0xd3, 0x75, 0x9c,
-  0x4c, 0x43, 0xad, 0x45, 0x49, 0x98, 0x1c, 0xe4, 0x8b, 0x8f, 0x5a, 0xb9,
-  0xdb, 0xfc, 0xf5, 0xa9, 0xad, 0xb3, 0x55, 0xb7, 0x42, 0xd4, 0x2d, 0x3e,
-  0x72, 0x15, 0xfe, 0xe8, 0x1c, 0x5c, 0x60, 0x24, 0x19, 0x9c, 0x91, 0xd1,
-  0xe9, 0x57, 0xd6, 0xce, 0xd9, 0xf0, 0x4a, 0x0e, 0x23, 0x2f, 0x6c, 0x86,
-  0xe4, 0x79, 0xc8, 0x23, 0x4f, 0xb8, 0xf8, 0x05, 0x41, 0x64, 0xd5, 0x7f,
-  0xdc, 0xdf, 0xdd, 0xdd, 0x3b, 0xd8, 0xfb, 0xfc, 0xd9, 0xee, 0xc1, 0xde,
-  0xde, 0xde, 0xfe, 0xc1, 0xde, 0xc1, 0xc1, 0xfe, 0xee, 0xcf, 0x3b, 0xe4,
-  0x3f, 0xfa, 0x98, 0x67, 0xb7, 0x1a, 0x97, 0x66, 0x37, 0x1f, 0xb6, 0x75,
-  0xdd, 0xdc, 0x31, 0x14, 0x80, 0x1d, 0x7d, 0xd8, 0xd7, 0xaa, 0xf9, 0x58,
-  0xe2, 0x19, 0xce, 0xaa, 0x61, 0x92, 0xc9, 0x85, 0x4b, 0x46, 0xc7, 0x19,
-  0xf4, 0x88, 0xf0, 0xd1, 0xab, 0xbf, 0x2f, 0x69, 0xa4, 0x63, 0x52, 0x07,
-  0xa0, 0xd3, 0xd4, 0x36, 0xf5, 0xf7, 0x7a, 0x56, 0x8e, 0xc7, 0x48, 0x6e,
-  0xb2, 0xd9, 0xef, 0xc3, 0x84, 0xd8, 0x96, 0x3f, 0xf0, 0x96, 0x90, 0xc0,
-  0x21, 0x70, 0xc7, 0x7c, 0xd0, 0xdd, 0xec, 0x38, 0xcf, 0x9e, 0xd9, 0x01,
-  0x93, 0x92, 0x2a, 0x8f, 0xc0, 0xd1, 0x6d, 0x26, 0xa9, 0xb2, 0x59, 0x71,
-  0xc9, 0x55, 0xf6, 0xf9, 0xee, 0xc1, 0x01, 0x55, 0x06, 0xfa, 0xd3, 0x5e,
-  0x5f, 0x20, 0xe3, 0x7e, 0x1e, 0x4c, 0xdf, 0x5e, 0x4f, 0xdc, 0x06, 0x99,
-  0x1f, 0xfe, 0x38, 0x8b, 0xe5, 0x3c, 0xab, 0x8c, 0x21, 0x42, 0x85, 0xa0,
-  0x81, 0x99, 0x86, 0xc7, 0x90, 0x59, 0x18, 0xc1, 0xd9, 0xd4, 0xc9, 0xd7,
-  0xa1, 0x1b, 0x81, 0xd9, 0xa4, 0x2d, 0x4f, 0x05, 0x33, 0x8a, 0xb9, 0x21,
-  0xda, 0xb6, 0x51, 0x1d, 0x0b, 0x50, 0x4d, 0xce, 0x76, 0xe3, 0x3c, 0x3f,
-  0xbe, 0x6f, 0x45, 0x32, 0xe0, 0x70, 0x15, 0x5c, 0x9e, 0x98, 0x1e, 0x67,
-  0x1d, 0x1e, 0x1e, 0x13, 0x4f, 0xb9, 0x95, 0x14, 0xbf, 0x1f, 0xbd, 0xc1,
-  0xee, 0x3f, 0xd9, 0xfb, 0x99, 0xd1, 0xca, 0x74, 0x20, 0xdc, 0xac, 0x69,
-  0xe8, 0xc5, 0x4f, 0xe2, 0xd2, 0x8d, 0xb4, 0x95, 0x0d, 0xaf, 0x87, 0xaa,
-  0x55, 0x88, 0xb7, 0xb1, 0xef, 0xe7, 0x95, 0x70, 0x25, 0x03, 0x2e, 0x3c,
-  0x0e, 0x3b, 0x4d, 0x1d, 0x4a, 0xbe, 0xa7, 0x56, 0x07, 0x66, 0xab, 0xca,
-  0xbd, 0x39, 0xbe, 0x3c, 0x34, 0x97, 0xc7, 0xb7, 0xa1, 0xa1, 0xff, 0x26,
-  0x33, 0x56, 0x39, 0x2d, 0xf6, 0x16, 0xce, 0xc3, 0x47, 0xcb, 0x1f, 0x4e,
-  0x73, 0xf7, 0x38, 0xd9, 0xa2, 0x00, 0xe5, 0x93, 0xcf, 0x9f, 0x3c, 0xde,
-  0xe6, 0x62, 0x2d, 0xfc, 0x5a, 0x46, 0x29, 0x64, 0xf0, 0x4a, 0x0a, 0x7f,
-  0x15, 0xf9, 0xef, 0xad, 0x48, 0x7a, 0x77, 0x71, 0xc2, 0x47, 0xfa, 0x86,
-  0x69, 0x46, 0xd8, 0xe8, 0xed, 0xf2, 0x4d, 0xe2, 0xbe, 0xf5, 0x94, 0x8c,
-  0x79, 0x4e, 0x5c, 0xa8, 0xa0, 0x67, 0xa0, 0x8b, 0xd1, 0xd2, 0x83, 0xe0,
-  0x86, 0x35, 0x07, 0xb4, 0x44, 0x9d, 0x51, 0x29, 0x0b, 0x87, 0xce, 0x80,
-  0x3c, 0x95, 0xb8, 0x9b, 0x65, 0x9f, 0x59, 0x0b, 0x8c, 0xec, 0x20, 0x96,
-  0x47, 0x2c, 0xfd, 0x3b, 0x7c, 0xfd, 0xdb, 0x0c, 0xf8, 0x81, 0x52, 0x48,
-  0xdb, 0xd0, 0x3c, 0xa8, 0xc8, 0x71, 0xea, 0x71, 0x2b, 0x61, 0xd5, 0x69,
-  0x9b, 0x1e, 0xed, 0x9b, 0x32, 0x3e, 0x89, 0x28, 0xb2, 0x53, 0xc8, 0x68,
-  0x96, 0x06, 0x9e, 0xc5, 0xbc, 0xe5, 0xf2, 0x11, 0xba, 0x0d, 0xd0, 0x5e,
-  0x20, 0x2b, 0x61, 0x6e, 0xae, 0xa3, 0xea, 0x4e, 0x34, 0x6c, 0x98, 0x09,
-  0xb6, 0x2c, 0x62, 0x07, 0x0f, 0xc4, 0xc4, 0x32, 0x7e, 0xb2, 0x8d, 0xe5,
-  0x55, 0x52, 0xa3, 0xb9, 0xd5, 0x81, 0x96, 0xd8, 0x1f, 0xcc, 0xf5, 0x57,
-  0x1e, 0x5c, 0xce, 0xcf, 0x40, 0xd5, 0xbf, 0xeb, 0x73, 0x1e, 0x92, 0x3a,
-  0xed, 0x0e, 0x6c, 0x45, 0xd7, 0x98, 0x73, 0x17, 0xe8, 0x49, 0x6b, 0xfd,
-  0x6c, 0xa1, 0x27, 0x3b, 0x3b, 0xdb, 0x2b, 0x7a, 0x23, 0xbf, 0x8e, 0x7d,
-  0xfd, 0x1c, 0xb4, 0x45, 0x5e, 0xd2, 0xb7, 0x59, 0xf3, 0x76, 0xe3, 0x34,
-  0xb5, 0x79, 0x4d, 0x2b, 0x39, 0x15, 0x58, 0x3c, 0xbb, 0x51, 0xd5, 0xbc,
-  0xe2, 0xce, 0xab, 0xf0, 0x6a, 0x0f, 0x42, 0x90, 0x78, 0x4a, 0x23, 0xc7,
-  0x15, 0xe2, 0x19, 0x13, 0x30, 0x4c, 0x0e, 0x69, 0x37, 0xb4, 0x3e, 0xec,
-  0x75, 0x59, 0xfd, 0xb9, 0x5a, 0x19, 0x41, 0x95, 0x58, 0xeb, 0xce, 0xeb,
-  0x7b, 0xbf, 0x54, 0x35, 0x4f, 0x59, 0x43, 0xac, 0xb3, 0x77, 0x9c, 0x31,
-  0x43, 0x92, 0x95, 0x9c, 0x1e, 0xe3, 0x79, 0x5e, 0xb4, 0xea, 0xfd, 0x4a,
-  0x23, 0xc0, 0xb9, 0xd8, 0x41, 0x80, 0x4c, 0xb5, 0x52, 0x92, 0x6e, 0xbf,
-  0x06, 0x28, 0x48, 0x4a, 0x24, 0xef, 0x85, 0x15, 0x6b, 0xbb, 0x89, 0x19,
-  0xa2, 0x30, 0xe6, 0xed, 0xd5, 0x9a, 0x8f, 0x3e, 0xef, 0x78, 0xc6, 0x30,
-  0x59, 0x40, 0x05, 0x09, 0x8c, 0xc3, 0x93, 0x53, 0x02, 0xc5, 0x9e, 0x1a,
-  0x13, 0x6f, 0xa4, 0xaa, 0x12, 0x40, 0xe2, 0x80, 0xeb, 0x16, 0x39, 0xa9,
-  0xeb, 0x7d, 0x5b, 0x92, 0x48, 0xf3, 0x29, 0x61, 0xb7, 0x50, 0x84, 0x95,
-  0x4d, 0x7f, 0xa1, 0x11, 0x35, 0xab, 0x65, 0xf4, 0xa5, 0x9a, 0x9d, 0xb6,
-  0xa0, 0xe8, 0xa6, 0xe2, 0x15, 0x1f, 0xb3, 0x59, 0xb9, 0x80, 0x49, 0xcd,
-  0x62, 0x1a, 0x65, 0xd1, 0xaa, 0x6c, 0x96, 0x7d, 0x14, 0xef, 0x2a, 0x13,
-  0x1e, 0x7f, 0x23, 0x78, 0x05, 0xae, 0x5b, 0xdc, 0x78, 0x79, 0x2f, 0x2d,
-  0x4c, 0x04, 0x7d, 0x74, 0x87, 0x79, 0xa3, 0x1c, 0x1d, 0x10, 0x7d, 0xdf,
-  0x95, 0xe9, 0x30, 0x33, 0x64, 0xcb, 0x3c, 0x0c, 0xc8, 0xc8, 0x15, 0x68,
-  0xfb, 0xbb, 0x5a, 0x18, 0x5f, 0xba, 0xb9, 0x22, 0xec, 0x2c, 0xd4, 0xea,
-  0x97, 0xec, 0x7d, 0xef, 0x2b, 0x91, 0x3a, 0x87, 0x0c, 0xe8, 0xe6, 0xe9,
-  0x93, 0xa7, 0x16, 0x2d, 0x5d, 0x19, 0x8b, 0x8c, 0x4a, 0xe6, 0xf4, 0x39,
-  0xb9, 0x1c, 0x9b, 0xa3, 0x9c, 0x99, 0x7f, 0x02, 0x4e, 0xc9, 0x00, 0x6b,
-  0xf3, 0x2c, 0x85, 0x9b, 0x3d, 0x44, 0x3b, 0x21, 0x6e, 0x90, 0x30, 0x25,
-  0xff, 0x42, 0x53, 0xd5, 0x12, 0x7c, 0xe3, 0x7d, 0xbe, 0x0d, 0x29, 0xcc,
-  0xdb, 0x4c, 0x86, 0xb6, 0xf7, 0x82, 0xf9, 0xe1, 0xfe, 0xbf, 0xe4, 0xa9,
-  0xa4, 0x41, 0xb0, 0x1e, 0x52, 0x56, 0x3a, 0xbd, 0xbc, 0x0c, 0x63, 0xae,
-  0x54, 0xfa, 0xf5, 0x92, 0xc2, 0x8f, 0xb6, 0xc4, 0x17, 0xf5, 0x62, 0x4e,
-  0x77, 0x51, 0xc6, 0x45, 0x81, 0x6d, 0xe3, 0x64, 0xd2, 0x2d, 0xcd, 0xf2,
-  0x72, 0xeb, 0xa7, 0xe5, 0x2d, 0x55, 0x34, 0xbe, 0xba, 0xca, 0x27, 0x14,
-  0xf9, 0x77, 0xbc, 0xe2, 0x24, 0xe3, 0xf9, 0xc1, 0xb9, 0x16, 0x69, 0x33,
-  0x63, 0x4b, 0x16, 0xcb, 0xf1, 0xcc, 0x5c, 0xd6, 0x9a, 0xcd, 0x62, 0x4e,
-  0x15, 0x66, 0xc9, 0x58, 0x5b, 0x68, 0x8e, 0x09, 0x10, 0x61, 0x70, 0x76,
-  0x32, 0x28, 0x10, 0x2d, 0xad, 0xa0, 0x82, 0xcf, 0x51, 0xda, 0x99, 0xd2,
-  0x0c, 0xe6, 0x65, 0xa1, 0x09, 0x73, 0xcb, 0x9a, 0x09, 0x67, 0x11, 0xcd,
-  0xe1, 0x3a, 0x5a, 0x09, 0x9e, 0x94, 0xb2, 0x0e, 0x62, 0x9a, 0xe3, 0x0d,
-  0x7f, 0x30, 0xd3, 0xc1, 0xe2, 0x66, 0xa1, 0x2b, 0xad, 0x0a, 0x11, 0x6b,
-  0x4b, 0x92, 0xa2, 0x85, 0xa3, 0x77, 0xfe, 0xfa, 0x7c, 0x98, 0x1c, 0x53,
-  0x4b, 0xdc, 0x27, 0x51, 0x74, 0xe1, 0xa3, 0x31, 0xbf, 0x33, 0x83, 0xbd,
-  0xa6, 0x0b, 0xec, 0xac, 0xa2, 0x7f, 0xa1, 0x35, 0xf9, 0x25, 0xbb, 0x65,
-  0xf1, 0xdb, 0xf6, 0x57, 0x4d, 0x43, 0x9a, 0x64, 0x71, 0x8e, 0xbf, 0x9b,
-  0xb3, 0x62, 0xd4, 0x2f, 0xbb, 0x4c, 0xee, 0x0b, 0x65, 0xd5, 0xa2, 0xe7,
-  0xe2, 0x37, 0x13, 0xa3, 0x95, 0x41, 0xb7, 0x5a, 0xdc, 0x61, 0xfd, 0x3c,
-  0xe1, 0xc8, 0xfa, 0x27, 0x37, 0xe0, 0x6d, 0x2d, 0xd9, 0x7e, 0x16, 0xbe,
-  0xcb, 0x07, 0xab, 0x62, 0x62, 0xaa, 0xff, 0x67, 0x45, 0xa9, 0xd0, 0xc5,
-  0xce, 0xf9, 0xd0, 0x79, 0x69, 0xc8, 0x88, 0x46, 0x71, 0x2a, 0x5a, 0x7e,
-  0x45, 0xea, 0xbf, 0xc1, 0x24, 0x40, 0xdd, 0x6e, 0x90, 0x5b, 0x80, 0xad,
-  0x16, 0x60, 0x14, 0xe8, 0x71, 0x01, 0x00, 0xa7, 0xea, 0xf9, 0x0c, 0xc5,
-  0x18, 0x03, 0x00,
+  0x1f, 0x8b, 0x08, 0x01, 0x00, 0x00, 0x00, 0x00, 0x02, 0x03, 0xed, 0xbd,
+  0x6b, 0x77, 0xdb, 0x46, 0x96, 0x2e, 0xfc, 0x3d, 0xbf, 0x02, 0xcd, 0x5e,
+  0x7d, 0x24, 0x4d, 0x93, 0xd4, 0xdd, 0x8e, 0x15, 0x39, 0x13, 0x45, 0x96,
+  0x63, 0x4d, 0x64, 0x49, 0x23, 0xca, 0x49, 0xfa, 0x74, 0xb2, 0xbc, 0x40,
+  0x12, 0xa4, 0xd0, 0x22, 0x01, 0x36, 0x00, 0xea, 0x92, 0x9e, 0x3e, 0xbf,
+  0xfd, 0xdd, 0xd7, 0xaa, 0x02, 0xaa, 0x40, 0x29, 0xe9, 0x38, 0x73, 0x2e,
+  0x6f, 0xcf, 0x9a, 0xd8, 0x96, 0x80, 0x42, 0x5d, 0x76, 0xed, 0xfb, 0x7e,
+  0x76, 0x14, 0x3d, 0xf5, 0xbf, 0x8f, 0xf4, 0xff, 0x1f, 0xe1, 0x7f, 0xf0,
+  0xe7, 0x67, 0x51, 0x74, 0x59, 0xe4, 0x7f, 0x4b, 0x46, 0x55, 0xf8, 0xd9,
+  0x8f, 0x1f, 0xff, 0x2b, 0xe2, 0xff, 0x83, 0x77, 0x7e, 0x84, 0x3f, 0x3f,
+  0x5b, 0x39, 0xf6, 0x66, 0x64, 0x5f, 0xf8, 0xaf, 0x8f, 0x1b, 0xd1, 0x53,
+  0x2f, 0xfc, 0x57, 0xb4, 0x4e, 0x2f, 0x7c, 0x94, 0x2f, 0x1c, 0xe2, 0xdf,
+  0x3f, 0x7e, 0x5c, 0xfd, 0x91, 0x1f, 0x71, 0x56, 0xf8, 0x9f, 0x4d, 0x7c,
+  0xef, 0xc7, 0x8f, 0xf8, 0x57, 0xf8, 0xc9, 0x67, 0x9f, 0x9d, 0x1f, 0xbd,
+  0x3f, 0xd1, 0x57, 0x47, 0xcb, 0x62, 0x16, 0xf5, 0xa2, 0xaa, 0x88, 0xb3,
+  0x72, 0x92, 0x14, 0x51, 0x1c, 0x7d, 0xb8, 0x3a, 0xfb, 0xec, 0xb3, 0xc1,
+  0x5f, 0xce, 0x2f, 0x2e, 0x07, 0xa7, 0x83, 0xda, 0x63, 0x7f, 0xcd, 0x17,
+  0x55, 0x9a, 0x67, 0x25, 0x4c, 0x1f, 0x1e, 0x2a, 0x7f, 0xfa, 0xec, 0xb3,
+  0x37, 0x27, 0x83, 0xe3, 0xab, 0xd3, 0xcb, 0xeb, 0xd3, 0x8b, 0xf3, 0xda,
+  0x93, 0x51, 0x5a, 0x46, 0x30, 0x54, 0x95, 0xe7, 0x33, 0xf8, 0x8f, 0x1d,
+  0x7d, 0x1c, 0x57, 0x71, 0x34, 0x29, 0xf2, 0x79, 0x94, 0x17, 0xf8, 0x8b,
+  0x38, 0x2a, 0x93, 0xe2, 0x2e, 0x29, 0xba, 0xd1, 0xb2, 0x4c, 0xb3, 0x69,
+  0x94, 0x67, 0x49, 0x94, 0x4f, 0xa2, 0xea, 0x26, 0xd1, 0xe1, 0xca, 0xe5,
+  0x62, 0x91, 0x17, 0x55, 0x32, 0x8e, 0x16, 0x45, 0x5e, 0xe5, 0xa3, 0x7c,
+  0x56, 0x46, 0xeb, 0x6f, 0x4e, 0x8f, 0xaf, 0xbb, 0xd1, 0xdb, 0xd3, 0xb3,
+  0x13, 0xf8, 0xef, 0xf5, 0x25, 0xfd, 0x67, 0xd0, 0x8d, 0xbe, 0xb9, 0xb8,
+  0x7c, 0x77, 0x72, 0xd5, 0x8d, 0xde, 0x5d, 0xe3, 0xcf, 0xf0, 0xbf, 0xf0,
+  0xc3, 0xe8, 0xf4, 0xfd, 0xd1, 0x65, 0x57, 0x87, 0xc3, 0x7f, 0xe0, 0x0f,
+  0xcf, 0xde, 0xc0, 0x0f, 0xf9, 0x0f, 0xfc, 0xe7, 0xe5, 0xc5, 0xe5, 0xae,
+  0xfc, 0x81, 0xff, 0xbc, 0xba, 0x7e, 0x0f, 0xbf, 0xbd, 0xba, 0x1e, 0xc0,
+  0x7f, 0x07, 0xc7, 0xf8, 0x1f, 0xfa, 0xca, 0xe0, 0xfd, 0xd7, 0xf4, 0x9f,
+  0x81, 0x19, 0x6e, 0xf0, 0x9e, 0x7f, 0x4e, 0x5f, 0xba, 0x3e, 0x39, 0x3b,
+  0x3f, 0xb9, 0x8e, 0xe2, 0x6c, 0x1c, 0x5d, 0xc3, 0xf3, 0x1b, 0xfd, 0xe8,
+  0xfa, 0x26, 0x89, 0x46, 0xf9, 0x7c, 0x8e, 0x3f, 0x82, 0x1d, 0x19, 0x27,
+  0x65, 0x3a, 0xcd, 0x60, 0x29, 0xb0, 0xf2, 0xfb, 0xbc, 0xb8, 0x8d, 0xa2,
+  0xfb, 0xb4, 0xba, 0xc9, 0x97, 0x95, 0x0e, 0xb7, 0x84, 0xdd, 0x88, 0xd2,
+  0xac, 0x4a, 0x8a, 0x78, 0x84, 0x3b, 0xdd, 0xff, 0xac, 0xb6, 0xab, 0xf9,
+  0x04, 0xf6, 0xb0, 0x84, 0x4d, 0x1b, 0x2e, 0xcb, 0x59, 0x1e, 0x8f, 0x71,
+  0xab, 0xe0, 0x95, 0xc9, 0x12, 0x36, 0xb9, 0x48, 0x47, 0xb7, 0x65, 0x34,
+  0x4b, 0x6f, 0x13, 0xdc, 0xa8, 0x87, 0x47, 0xdd, 0xb8, 0x2e, 0x0f, 0x1a,
+  0x2f, 0x61, 0x4f, 0xb3, 0x9e, 0x0e, 0x57, 0xa5, 0xa3, 0x18, 0x3f, 0x40,
+  0x3b, 0x17, 0x2d, 0x17, 0x38, 0x1a, 0xef, 0x58, 0xb4, 0xc8, 0x4b, 0x78,
+  0x69, 0x30, 0x38, 0x83, 0x99, 0x67, 0x59, 0x42, 0xf3, 0x28, 0xbb, 0xf0,
+  0x8f, 0xfc, 0x36, 0x4d, 0xe0, 0x2f, 0x93, 0x74, 0x96, 0x44, 0x7c, 0xa2,
+  0x66, 0x38, 0x3c, 0xda, 0xa8, 0x48, 0xca, 0xe5, 0x3c, 0x81, 0xdd, 0x7b,
+  0x9f, 0x54, 0xf1, 0x2c, 0xcd, 0x6e, 0xe1, 0xaf, 0xb8, 0xf0, 0x79, 0x5e,
+  0x24, 0xfd, 0xe8, 0xa8, 0x8c, 0x1e, 0xf3, 0x25, 0x2c, 0x78, 0x36, 0x83,
+  0x33, 0x4f, 0xa2, 0x61, 0x32, 0xcb, 0xef, 0xbb, 0x78, 0xd2, 0x51, 0xb6,
+  0x9c, 0x0f, 0x61, 0x80, 0x7c, 0x62, 0x87, 0x8b, 0xab, 0x25, 0x0c, 0xc7,
+  0x4f, 0xcf, 0x63, 0x58, 0x13, 0xbc, 0x5b, 0x44, 0x37, 0x09, 0xac, 0xb9,
+  0x5c, 0xa4, 0xd9, 0x1f, 0xea, 0xfb, 0x02, 0x5b, 0xbb, 0xc8, 0xef, 0x93,
+  0x02, 0x76, 0x76, 0xf8, 0x18, 0xc1, 0x26, 0x0c, 0x99, 0x08, 0x27, 0x40,
+  0x64, 0x51, 0x0c, 0x43, 0x18, 0x02, 0xec, 0x15, 0xc9, 0x2c, 0x46, 0x62,
+  0x32, 0xdf, 0xe8, 0xc3, 0x21, 0x26, 0x86, 0xda, 0xe4, 0xd5, 0xf5, 0xdd,
+  0x0d, 0x7a, 0x79, 0x0c, 0x2b, 0x49, 0x67, 0x25, 0x1c, 0x03, 0x5e, 0x0a,
+  0x79, 0x06, 0x0f, 0x15, 0xe9, 0x1f, 0x68, 0xf3, 0x31, 0xab, 0xe2, 0x07,
+  0xfa, 0xbc, 0xd0, 0x66, 0x6f, 0x9c, 0x2c, 0x92, 0x6c, 0x9c, 0x64, 0x55,
+  0x3f, 0xfa, 0x4b, 0xbe, 0x5c, 0x83, 0x6f, 0x4f, 0x52, 0xd8, 0x83, 0x58,
+  0x86, 0x82, 0x2f, 0x03, 0x11, 0x8c, 0x8a, 0x74, 0xe1, 0x1c, 0x45, 0x9e,
+  0xc1, 0x99, 0x47, 0x57, 0x6f, 0x8f, 0xa3, 0xdd, 0x57, 0x9f, 0xbf, 0xb0,
+  0x67, 0x0e, 0x03, 0x44, 0xa3, 0x38, 0x83, 0x15, 0x27, 0xa3, 0x74, 0xf2,
+  0x18, 0xcd, 0x97, 0xb3, 0x2a, 0x5d, 0xc0, 0xee, 0xe3, 0xe5, 0xc3, 0x0b,
+  0xb4, 0x88, 0x8b, 0xaa, 0x44, 0x22, 0xa0, 0x1f, 0xd0, 0xda, 0xef, 0x8b,
+  0xb4, 0xc2, 0x8b, 0x44, 0xbf, 0x83, 0x19, 0x26, 0x55, 0xa9, 0xc3, 0x21,
+  0xad, 0xc1, 0x77, 0x86, 0x40, 0x5b, 0xb0, 0xb5, 0x71, 0x09, 0x1f, 0x3d,
+  0xf8, 0xcc, 0x72, 0x90, 0x9b, 0xaa, 0x5a, 0x1c, 0x6c, 0x6e, 0x96, 0x69,
+  0x95, 0xf4, 0xff, 0x01, 0xf7, 0xb0, 0x5b, 0xdd, 0xe7, 0xdd, 0xea, 0xa6,
+  0x48, 0x92, 0x7f, 0xf6, 0x81, 0x86, 0xcd, 0x93, 0xf0, 0xdd, 0x47, 0x99,
+  0xd8, 0x34, 0xa9, 0xe0, 0x0b, 0x7f, 0x5f, 0x26, 0x19, 0x8e, 0x08, 0xf3,
+  0x88, 0x67, 0x8b, 0x9b, 0x18, 0x8e, 0x33, 0x01, 0x6a, 0xc4, 0x9b, 0x0d,
+  0x04, 0x83, 0xb3, 0xe2, 0xbb, 0xfd, 0xd7, 0x9f, 0xfc, 0x8f, 0x4e, 0xe8,
+  0x9b, 0xf0, 0xdf, 0x7e, 0xf2, 0x10, 0xcf, 0x61, 0x6d, 0xf8, 0xa9, 0x4d,
+  0x24, 0xb1, 0xbf, 0x6e, 0xf7, 0xb6, 0xb7, 0xb6, 0x7e, 0xea, 0x57, 0x0f,
+  0xd5, 0xf3, 0x9e, 0xdf, 0xda, 0xb2, 0x6f, 0xe0, 0xa3, 0xeb, 0xb8, 0xde,
+  0x68, 0x06, 0x24, 0x83, 0x1f, 0xff, 0x39, 0x29, 0xf2, 0x72, 0xe3, 0x79,
+  0x23, 0xc5, 0xbd, 0x9f, 0xeb, 0xdf, 0x3d, 0x4f, 0x4a, 0xa2, 0x19, 0xbb,
+  0xd6, 0x28, 0x2e, 0x80, 0x6e, 0xf3, 0xca, 0xb2, 0xa7, 0x2e, 0x5c, 0xca,
+  0xca, 0xec, 0x0c, 0xdc, 0x39, 0x78, 0x1a, 0x18, 0x5b, 0x3c, 0x43, 0x9e,
+  0x56, 0x46, 0x59, 0xf2, 0x60, 0x6e, 0x39, 0xdc, 0xfe, 0x24, 0x1e, 0xdd,
+  0x44, 0x39, 0x10, 0x7f, 0x11, 0x38, 0x02, 0x77, 0x42, 0x71, 0x31, 0xba,
+  0x49, 0xef, 0x60, 0x37, 0x5e, 0xbd, 0x7a, 0xd1, 0x83, 0xff, 0xbc, 0xfa,
+  0x69, 0xf3, 0x2e, 0x9f, 0xc1, 0xe6, 0xec, 0xfd, 0xb4, 0x89, 0x47, 0xfc,
+  0x8f, 0xb8, 0x3b, 0xec, 0x8e, 0xfe, 0xd9, 0xbf, 0xa9, 0xe6, 0xb3, 0x56,
+  0xc2, 0x89, 0x33, 0xf8, 0xff, 0x79, 0xbe, 0xcc, 0x2a, 0x43, 0x2c, 0x40,
+  0x73, 0x95, 0xc3, 0x9c, 0xe0, 0xba, 0xc2, 0x1d, 0x45, 0xd2, 0x46, 0x1a,
+  0xc2, 0x5b, 0x07, 0x17, 0xd4, 0x5e, 0xc7, 0x6a, 0x74, 0x83, 0xeb, 0x07,
+  0xea, 0x89, 0x65, 0x13, 0xaa, 0x34, 0xc6, 0x9b, 0x09, 0x0c, 0x02, 0x19,
+  0x16, 0x8d, 0xc5, 0x5f, 0x4b, 0xe1, 0xc1, 0xbc, 0x18, 0x27, 0x45, 0xbf,
+  0x39, 0x0d, 0x73, 0x65, 0x9d, 0x6f, 0x46, 0x2a, 0x51, 0xf0, 0x07, 0x34,
+  0xb1, 0x79, 0xfa, 0x00, 0x23, 0x10, 0xc3, 0xcc, 0x68, 0xe2, 0x3c, 0x5a,
+  0x84, 0x33, 0xa6, 0xcf, 0xe8, 0xfb, 0xf6, 0xca, 0xc2, 0xd4, 0x6b, 0x4b,
+  0xa7, 0x8f, 0xda, 0xc5, 0x47, 0x70, 0x78, 0x0b, 0x78, 0x6b, 0x89, 0x7c,
+  0x95, 0xae, 0x35, 0x0e, 0x03, 0x0c, 0x61, 0x0a, 0xe7, 0x02, 0x67, 0x81,
+  0x54, 0x8c, 0x47, 0xf5, 0x18, 0x9d, 0x03, 0xc1, 0x30, 0x33, 0x72, 0x88,
+  0x7d, 0x96, 0x54, 0xd5, 0x93, 0xc7, 0x64, 0x29, 0xf6, 0x60, 0xdb, 0x23,
+  0xda, 0xb6, 0xe7, 0x81, 0xce, 0x0e, 0x76, 0xea, 0x0f, 0x7f, 0x0f, 0x4c,
+  0xda, 0x5e, 0x17, 0xf8, 0xfa, 0x3f, 0xfe, 0xe9, 0x50, 0xdd, 0x3d, 0xfe,
+  0x36, 0xcd, 0xee, 0xf2, 0x5b, 0xd8, 0x22, 0x92, 0xa2, 0x71, 0x7d, 0x37,
+  0x91, 0x0f, 0xcd, 0x17, 0x95, 0x11, 0x4f, 0x48, 0x8e, 0xf0, 0xa3, 0x61,
+  0x3c, 0x9c, 0x3d, 0x46, 0x37, 0xf1, 0x5d, 0x82, 0xeb, 0x5d, 0x00, 0x9d,
+  0xe2, 0x0e, 0x80, 0xd8, 0x98, 0x11, 0x1f, 0x13, 0xc6, 0x30, 0xce, 0x97,
+  0x43, 0x60, 0x2e, 0x7f, 0x5f, 0xe6, 0x15, 0x6f, 0x4c, 0x7c, 0x97, 0xa7,
+  0xe3, 0x9a, 0x2c, 0xbe, 0x49, 0x90, 0xa1, 0xe1, 0x87, 0x49, 0x48, 0x01,
+  0x43, 0xc5, 0x99, 0xd2, 0x45, 0x4b, 0x2b, 0x14, 0x77, 0xc0, 0x0a, 0xe3,
+  0x59, 0x99, 0x47, 0xd1, 0x34, 0xc7, 0x5b, 0x42, 0x0c, 0x98, 0xc8, 0x1c,
+  0x0e, 0xe5, 0x26, 0x46, 0xa9, 0x06, 0x02, 0xcc, 0xdc, 0x83, 0x22, 0x21,
+  0x5e, 0x4c, 0x27, 0x15, 0xcf, 0xba, 0x2c, 0xbd, 0xf0, 0x1d, 0xd9, 0xaa,
+  0x68, 0xed, 0x7f, 0xac, 0x75, 0xa3, 0xb5, 0x7f, 0x5f, 0x23, 0x7a, 0x58,
+  0xfb, 0xb7, 0x35, 0x7b, 0xce, 0xa0, 0x8c, 0xdd, 0xa5, 0xe3, 0x84, 0x49,
+  0xe2, 0xf4, 0xf2, 0xee, 0x45, 0xf4, 0x33, 0xea, 0x0e, 0xc0, 0x6b, 0x93,
+  0x07, 0x25, 0x48, 0x5d, 0x1b, 0xbc, 0x1d, 0x01, 0xd3, 0x8d, 0x17, 0xa8,
+  0x44, 0x24, 0xc5, 0x08, 0xa8, 0x37, 0x9e, 0x02, 0xbd, 0x82, 0x2c, 0xd6,
+  0xe1, 0x70, 0x7c, 0x7c, 0x85, 0x97, 0x05, 0x0c, 0x32, 0xca, 0xe2, 0x39,
+  0xdc, 0x88, 0x33, 0x9c, 0x51, 0x9a, 0xf9, 0x87, 0xf9, 0xd7, 0x49, 0xf2,
+  0xf9, 0xd6, 0xc1, 0xc1, 0xee, 0x9f, 0x76, 0xf6, 0x93, 0xea, 0x66, 0xeb,
+  0xa7, 0x4d, 0xf3, 0xc8, 0xe9, 0x84, 0xb6, 0x5d, 0xc9, 0x4f, 0x27, 0x01,
+  0x52, 0xde, 0x48, 0x09, 0x78, 0x1f, 0xfe, 0x9e, 0x4c, 0xd2, 0x87, 0xae,
+  0xea, 0x4b, 0x7c, 0xe7, 0x62, 0x20, 0x35, 0x38, 0x3f, 0x64, 0x11, 0x3a,
+  0xdc, 0x74, 0x99, 0x94, 0xb0, 0x93, 0xf7, 0x37, 0x71, 0x15, 0x99, 0x01,
+  0xf8, 0x64, 0xe7, 0xe9, 0xf4, 0xa6, 0x8a, 0xee, 0x63, 0x14, 0x36, 0xa7,
+  0x15, 0x0f, 0x81, 0x52, 0x1e, 0x44, 0xcc, 0x24, 0x06, 0x59, 0x81, 0x67,
+  0x48, 0x22, 0x7d, 0x68, 0x35, 0x8c, 0x0a, 0xc8, 0x9c, 0x0f, 0xc4, 0xaa,
+  0x53, 0xc3, 0xb8, 0xc4, 0x4b, 0x9b, 0x01, 0x73, 0xa8, 0x40, 0x47, 0x58,
+  0xe2, 0xbf, 0x6e, 0x40, 0x0b, 0xa0, 0x3d, 0x90, 0x89, 0x92, 0xa0, 0x7c,
+  0x8b, 0xc7, 0x89, 0x67, 0x63, 0x84, 0x17, 0x1c, 0x52, 0x57, 0x8e, 0xd9,
+  0xbc, 0x51, 0xc2, 0x85, 0x03, 0xce, 0x64, 0x28, 0xa3, 0x83, 0x4c, 0xb6,
+  0xc3, 0xeb, 0xa4, 0x39, 0xc6, 0x25, 0x2a, 0x0a, 0xac, 0x0e, 0xc0, 0xe4,
+  0x9d, 0xc5, 0xc2, 0xa6, 0xc5, 0xb7, 0xa8, 0x92, 0x34, 0x14, 0x1f, 0x7a,
+  0x6d, 0x9c, 0x03, 0x91, 0xc1, 0x6c, 0x81, 0x19, 0xe3, 0xca, 0x90, 0xc5,
+  0xd2, 0xae, 0x10, 0x91, 0xc3, 0x98, 0xf8, 0xc3, 0xb4, 0x42, 0x19, 0x43,
+  0x3a, 0x2c, 0xcc, 0x17, 0x36, 0x85, 0x14, 0x51, 0x60, 0xd4, 0xce, 0xfa,
+  0x49, 0x3c, 0xc2, 0xb3, 0xd1, 0x1d, 0x68, 0x29, 0xa0, 0x90, 0x26, 0xe6,
+  0x2d, 0x92, 0xe7, 0x23, 0xd4, 0x8d, 0x66, 0x70, 0x5f, 0x46, 0x79, 0x51,
+  0xa0, 0xbe, 0x8f, 0x27, 0x38, 0x64, 0x26, 0x3a, 0x4f, 0x40, 0x8d, 0x70,
+  0xb7, 0x33, 0x45, 0x81, 0x06, 0xfc, 0x05, 0xf4, 0x12, 0xe2, 0x20, 0xa0,
+  0x3f, 0x10, 0xcf, 0xa7, 0x85, 0xd3, 0xec, 0x70, 0xec, 0xd1, 0x28, 0x59,
+  0x54, 0x65, 0x68, 0x4d, 0x7a, 0xe0, 0x30, 0x9d, 0x22, 0xc1, 0x9d, 0x77,
+  0x95, 0x2e, 0xda, 0x57, 0x23, 0xf4, 0x49, 0xef, 0x52, 0x3d, 0x06, 0xf4,
+  0xb0, 0xd2, 0xec, 0x5a, 0x45, 0xb4, 0x01, 0x6c, 0x8c, 0xf6, 0x7c, 0x8e,
+  0x13, 0xc5, 0x87, 0x4b, 0xbe, 0xa9, 0xc4, 0x9a, 0xf1, 0x20, 0x59, 0xd3,
+  0xe6, 0xef, 0xa2, 0xe8, 0x82, 0xfd, 0x34, 0x83, 0xc3, 0x57, 0xcd, 0x99,
+  0xe2, 0xe7, 0x51, 0xc5, 0x07, 0x49, 0x3e, 0x2e, 0x6f, 0x40, 0xf9, 0x2a,
+  0xe5, 0x66, 0xa7, 0x73, 0xa0, 0x99, 0x3b, 0x3c, 0xdf, 0x45, 0x92, 0x8c,
+  0xfb, 0xd1, 0xc5, 0x04, 0xb9, 0x6a, 0x01, 0x93, 0xae, 0xe8, 0xd7, 0x28,
+  0x55, 0x60, 0xdf, 0xc6, 0xa4, 0xc4, 0x9b, 0xab, 0xc5, 0x53, 0x71, 0xa4,
+  0x03, 0x71, 0xf2, 0x18, 0x7e, 0x02, 0xb3, 0x9d, 0xd5, 0x45, 0x10, 0xdd,
+  0x43, 0xe0, 0xde, 0x38, 0xbd, 0x61, 0x12, 0x11, 0x25, 0x0e, 0x93, 0xea,
+  0x3e, 0x49, 0xcc, 0x70, 0x65, 0x02, 0x62, 0x0f, 0x0f, 0x8d, 0x35, 0x3f,
+  0x62, 0x86, 0xb8, 0xb5, 0x97, 0x57, 0x17, 0xdf, 0x5c, 0x9d, 0x0c, 0x06,
+  0xd1, 0xfb, 0x93, 0xeb, 0x93, 0xab, 0xda, 0x4e, 0x67, 0x79, 0x31, 0xa7,
+  0x13, 0x1d, 0xa7, 0xe5, 0x62, 0x16, 0x3f, 0xe2, 0x51, 0xc3, 0x4a, 0xa6,
+  0x05, 0xde, 0xac, 0x79, 0x82, 0x52, 0x61, 0xbc, 0x24, 0x4e, 0x06, 0xe2,
+  0x08, 0x8e, 0x4f, 0x34, 0x5e, 0x64, 0x26, 0xa4, 0x26, 0x67, 0x53, 0xbb,
+  0xd3, 0xc0, 0x71, 0x44, 0x92, 0xa2, 0x28, 0x35, 0xe7, 0x81, 0xaa, 0x27,
+  0x19, 0x37, 0x5d, 0xfb, 0x33, 0xde, 0x26, 0x16, 0x6d, 0x40, 0xb3, 0xe9,
+  0x9c, 0x98, 0x1d, 0xfc, 0x69, 0xb5, 0xcd, 0x64, 0x02, 0xaa, 0x36, 0x48,
+  0x57, 0xb6, 0x14, 0x9a, 0x73, 0xd2, 0xd9, 0x1a, 0xfd, 0x18, 0xc8, 0x10,
+  0x59, 0x33, 0x0e, 0xc8, 0x53, 0xe1, 0x2f, 0x18, 0x26, 0x06, 0x3a, 0x09,
+  0xf2, 0x3e, 0x79, 0x6c, 0x81, 0x53, 0x48, 0xe0, 0x64, 0xc7, 0x3c, 0x7c,
+  0xb9, 0x9c, 0xd0, 0x45, 0x8e, 0xd6, 0x41, 0x33, 0x7f, 0x0f, 0xd6, 0x12,
+  0x58, 0x2c, 0xdd, 0xe8, 0x72, 0x83, 0xde, 0xdb, 0xde, 0xda, 0xd9, 0x63,
+  0x46, 0xd0, 0xd7, 0xe1, 0xde, 0x3a, 0x8c, 0x78, 0xfb, 0x16, 0x8f, 0x97,
+  0x1f, 0xc2, 0xc1, 0xfb, 0xd1, 0xf6, 0x7b, 0xfe, 0xc9, 0xde, 0xe7, 0xfb,
+  0x2f, 0x5f, 0xc8, 0x0f, 0xeb, 0x04, 0x6e, 0xe6, 0x4f, 0xd4, 0x41, 0x96,
+  0x1f, 0x9a, 0x82, 0x30, 0x13, 0x58, 0xdd, 0x3c, 0xcd, 0xe0, 0x9a, 0xc0,
+  0xb5, 0x12, 0x5e, 0x85, 0xf4, 0x0c, 0x93, 0x9f, 0x30, 0x67, 0x93, 0x73,
+  0xad, 0x9b, 0x94, 0xf0, 0x32, 0x90, 0x2c, 0xf0, 0x72, 0x73, 0x48, 0xac,
+  0x26, 0x54, 0x38, 0x91, 0x78, 0x88, 0x0c, 0x16, 0xed, 0x2a, 0x50, 0x80,
+  0x93, 0xe0, 0xd7, 0x8c, 0x54, 0x84, 0x37, 0x60, 0x6e, 0x20, 0x13, 0x51,
+  0xcc, 0xf9, 0xfb, 0x0e, 0xac, 0x80, 0x38, 0xe4, 0x7d, 0x5a, 0x12, 0x6b,
+  0xb8, 0xcf, 0x97, 0x33, 0xb0, 0x62, 0xf0, 0x81, 0xe5, 0x82, 0x5e, 0x80,
+  0x4f, 0x2d, 0x2c, 0x0f, 0x00, 0x8d, 0x05, 0x69, 0xa7, 0x39, 0x0a, 0x4c,
+  0x0d, 0xfe, 0xb9, 0x00, 0x52, 0xe2, 0xe9, 0xf4, 0x9b, 0x12, 0x82, 0x78,
+  0x9f, 0x47, 0x89, 0x78, 0xe7, 0x89, 0x69, 0x5f, 0x5e, 0x0c, 0xae, 0x51,
+  0x03, 0xb8, 0xfc, 0x70, 0x0d, 0x03, 0x81, 0x0a, 0x50, 0x56, 0x40, 0x94,
+  0xf8, 0x62, 0x96, 0x90, 0x09, 0xa9, 0xc3, 0x01, 0xed, 0xa5, 0xc4, 0xa8,
+  0x48, 0xad, 0xd1, 0x4f, 0xf2, 0x1c, 0xd9, 0xc6, 0xc6, 0x2b, 0xa8, 0x16,
+  0x36, 0xcb, 0x70, 0xf3, 0x4e, 0xb4, 0xfe, 0xe5, 0x06, 0xd0, 0x6c, 0x2f,
+  0x37, 0xbb, 0xd3, 0xeb, 0xc9, 0xab, 0xf0, 0xed, 0x32, 0x9d, 0xa7, 0xb3,
+  0xb8, 0x70, 0xa6, 0xce, 0x1c, 0x15, 0xef, 0xa7, 0xe1, 0x2b, 0x23, 0xa0,
+  0x1a, 0x9a, 0xb6, 0x35, 0x25, 0x71, 0x0f, 0x89, 0x2b, 0xd9, 0xa3, 0x1a,
+  0xa3, 0x42, 0x40, 0x1a, 0xf3, 0x22, 0x35, 0x5b, 0x87, 0x67, 0x86, 0xec,
+  0xaa, 0xb6, 0x51, 0xcd, 0x73, 0xf3, 0x36, 0x0e, 0x25, 0x12, 0x79, 0x2a,
+  0xcc, 0xd6, 0x45, 0x9d, 0x61, 0x5c, 0x74, 0x22, 0xc3, 0x8b, 0xf9, 0x6e,
+  0xe2, 0x0d, 0x29, 0x92, 0xe9, 0x12, 0x56, 0x10, 0xf1, 0xee, 0xe2, 0x4a,
+  0xff, 0xe8, 0xac, 0x54, 0x07, 0xe8, 0x0d, 0xf1, 0x91, 0xb4, 0x64, 0x33,
+  0x73, 0x02, 0x76, 0x0b, 0x5e, 0x1a, 0xd5, 0x5f, 0x49, 0xa3, 0x11, 0x8a,
+  0x09, 0x10, 0x8c, 0xa3, 0xd7, 0xc2, 0x55, 0xa9, 0x12, 0x60, 0x34, 0xc4,
+  0xfe, 0xf1, 0xc9, 0x1e, 0x1c, 0x59, 0xaf, 0x57, 0xc2, 0xfe, 0xa3, 0xee,
+  0xbd, 0x10, 0x9b, 0xfe, 0x82, 0x1c, 0x26, 0xc6, 0xb7, 0x72, 0x21, 0x3a,
+  0x30, 0x89, 0x4d, 0x7e, 0x97, 0x58, 0x28, 0x28, 0xaa, 0xf7, 0xf0, 0xe1,
+  0x18, 0x8e, 0x0c, 0x2e, 0xdc, 0x7b, 0xdc, 0x28, 0xf6, 0x8d, 0x44, 0x46,
+  0x6d, 0x26, 0xca, 0x48, 0xf1, 0xde, 0xc7, 0x56, 0x97, 0x19, 0x8f, 0x53,
+  0xfc, 0x2d, 0xdc, 0x2f, 0x90, 0x70, 0xcb, 0x84, 0x6c, 0x0f, 0xd9, 0xd4,
+  0xb9, 0xdd, 0x4c, 0x32, 0x63, 0xcb, 0x9b, 0x1c, 0xcd, 0xc4, 0x0e, 0xf3,
+  0xe2, 0x1e, 0x7e, 0xab, 0x43, 0xf2, 0x7c, 0x1e, 0xe9, 0xb7, 0xe4, 0x53,
+  0xb0, 0x8e, 0xb1, 0xab, 0x9b, 0x75, 0x41, 0xd0, 0x3c, 0x3a, 0x46, 0x02,
+  0xf1, 0x6a, 0x9e, 0x7b, 0x61, 0x14, 0x1e, 0x10, 0xa9, 0x0b, 0x54, 0xa6,
+  0x84, 0x87, 0x93, 0x30, 0xa4, 0x2b, 0x5b, 0xf2, 0xd4, 0xba, 0xb0, 0xb7,
+  0xf8, 0xe4, 0xf4, 0x46, 0x1f, 0x75, 0x04, 0x6b, 0x0c, 0x8b, 0x43, 0xe1,
+  0x80, 0xf6, 0xf4, 0x58, 0xf9, 0x7e, 0x5e, 0x30, 0x33, 0x9b, 0xe5, 0x40,
+  0xcb, 0x1d, 0x56, 0x59, 0x65, 0xda, 0x38, 0x6b, 0x9c, 0x25, 0xee, 0x38,
+  0xfb, 0x99, 0x72, 0x73, 0x36, 0x66, 0xd2, 0xb2, 0x5f, 0xe5, 0x93, 0x53,
+  0xb3, 0x1b, 0x35, 0xa0, 0x3d, 0x02, 0xd1, 0x59, 0x22, 0x1d, 0xeb, 0xce,
+  0x13, 0x79, 0x83, 0xa8, 0x5b, 0xab, 0xf8, 0x3e, 0x92, 0x8d, 0xd5, 0xd8,
+  0xf9, 0x92, 0xc8, 0x47, 0x04, 0x99, 0x59, 0x19, 0xac, 0x68, 0x9c, 0xc6,
+  0x44, 0x27, 0x7c, 0x34, 0xa4, 0x8c, 0x58, 0x8b, 0x30, 0xa0, 0x07, 0x3f,
+  0x36, 0x0d, 0xba, 0xd9, 0xcc, 0x15, 0x49, 0x3a, 0xa7, 0xde, 0x05, 0xac,
+  0xfd, 0x8c, 0xd6, 0xd1, 0xbb, 0x8b, 0xf0, 0xfa, 0x81, 0xd9, 0x80, 0x77,
+  0xb1, 0x77, 0x71, 0x76, 0xe7, 0x5c, 0x23, 0xb4, 0xdc, 0x33, 0xd4, 0x53,
+  0xba, 0xe4, 0x1d, 0x19, 0xe6, 0x39, 0x98, 0xc9, 0x76, 0x69, 0x28, 0x0f,
+  0x92, 0x0c, 0xa9, 0x5d, 0x4e, 0x14, 0x58, 0xc2, 0xc2, 0xf0, 0xdb, 0x47,
+  0x30, 0x97, 0xe2, 0x69, 0x9c, 0x1a, 0x7a, 0x93, 0x9b, 0x31, 0x8e, 0xf4,
+  0xe1, 0x2c, 0x97, 0xe7, 0xf1, 0xa8, 0x50, 0x05, 0x12, 0xbe, 0xb5, 0x2c,
+  0xf9, 0xfa, 0xc0, 0xaa, 0x80, 0xf3, 0x10, 0xef, 0x90, 0x71, 0x51, 0x6d,
+  0xd4, 0xe1, 0x86, 0xa4, 0x28, 0xa3, 0xce, 0x49, 0xcc, 0x97, 0x34, 0x48,
+  0x18, 0xb1, 0xd3, 0x8f, 0xde, 0xe5, 0xf7, 0x09, 0xf9, 0x0a, 0x49, 0xbf,
+  0x4f, 0xd1, 0xdb, 0x05, 0xaa, 0xe0, 0x7d, 0x12, 0xcd, 0x41, 0xf5, 0x84,
+  0xdd, 0x24, 0xed, 0x83, 0x7e, 0xe6, 0x98, 0x87, 0x40, 0xe1, 0xf7, 0xbc,
+  0x4b, 0x66, 0x15, 0xe6, 0x28, 0x27, 0x7c, 0x25, 0xa2, 0x75, 0x52, 0x6f,
+  0x46, 0xb8, 0x5b, 0x8b, 0xca, 0xae, 0xc2, 0x6c, 0xc8, 0x7d, 0x5c, 0x3a,
+  0x97, 0x2b, 0x21, 0xd3, 0xf4, 0x65, 0x7f, 0xfb, 0x55, 0x7f, 0xab, 0x0f,
+  0x86, 0x48, 0x72, 0x97, 0xe6, 0xcb, 0x12, 0x3e, 0x8d, 0xd3, 0xb0, 0xef,
+  0x24, 0x78, 0x2b, 0xab, 0x7c, 0x3a, 0x9d, 0xb1, 0xce, 0xb3, 0x99, 0x4f,
+  0x26, 0xac, 0xfb, 0x80, 0xa6, 0x67, 0xf4, 0x67, 0xb6, 0x80, 0x70, 0x67,
+  0xe4, 0xba, 0x31, 0x4b, 0xf5, 0x4d, 0xe4, 0xbe, 0x75, 0x5e, 0xf4, 0x7a,
+  0xf1, 0xb0, 0xac, 0xd0, 0x98, 0xea, 0x2d, 0xb3, 0xf4, 0xa1, 0x57, 0xe6,
+  0xa3, 0x5b, 0x38, 0x94, 0xc3, 0x45, 0x5c, 0xdd, 0x7c, 0xd9, 0x70, 0x09,
+  0xaf, 0xa3, 0x2c, 0xd9, 0x88, 0xa2, 0x63, 0x56, 0x2b, 0x71, 0x27, 0x0a,
+  0xbe, 0x6f, 0x70, 0x9a, 0x32, 0x4a, 0xf4, 0x01, 0x46, 0x01, 0x5a, 0x9e,
+  0xc3, 0xa1, 0x46, 0x3c, 0x58, 0x57, 0x59, 0x69, 0x63, 0x38, 0x72, 0x38,
+  0xa2, 0x18, 0x21, 0xbf, 0x1d, 0x5c, 0x9d, 0xbc, 0xb8, 0x05, 0x45, 0xfb,
+  0x1c, 0x4c, 0xc6, 0x03, 0xfc, 0x37, 0xb0, 0xb0, 0x8a, 0xb6, 0x5c, 0x24,
+  0x2b, 0xcc, 0x88, 0x99, 0x31, 0x5a, 0xe4, 0xf1, 0xb0, 0xd7, 0x18, 0x4e,
+  0xbe, 0x2f, 0x1f, 0x8d, 0xd4, 0xd6, 0x50, 0x52, 0x8a, 0xd6, 0xbe, 0x02,
+  0xfb, 0xef, 0x86, 0x8f, 0x9d, 0x06, 0xe4, 0x35, 0x02, 0x85, 0x4e, 0xc1,
+  0x82, 0xc8, 0xaa, 0xe6, 0x70, 0x37, 0x24, 0xaa, 0x51, 0xca, 0xb0, 0xb1,
+  0x4b, 0x44, 0x22, 0x1e, 0x20, 0x63, 0x7f, 0xf6, 0x3f, 0x6b, 0xbc, 0x76,
+  0x64, 0xcf, 0x74, 0x7f, 0x17, 0xce, 0xd4, 0xdd, 0xe8, 0x59, 0xd5, 0x2b,
+  0xef, 0x46, 0xd1, 0x21, 0x69, 0xdf, 0x48, 0xa6, 0xc1, 0x0d, 0x1e, 0x6c,
+  0x44, 0xdf, 0x1f, 0x5d, 0x9d, 0x9f, 0x9e, 0x7f, 0x73, 0xc0, 0x1f, 0x15,
+  0x4a, 0x83, 0xbf, 0x25, 0x0f, 0x20, 0x02, 0x53, 0x9c, 0x2c, 0x48, 0xb2,
+  0xe8, 0x4d, 0x4e, 0xb3, 0xc3, 0xf3, 0x86, 0xef, 0x81, 0x1c, 0x69, 0xee,
+  0xc8, 0x78, 0xd9, 0x70, 0xfc, 0x1a, 0x6e, 0x6d, 0x47, 0xe5, 0xbb, 0xc9,
+  0x3b, 0xac, 0x13, 0x04, 0xe6, 0xc8, 0xbe, 0x63, 0x52, 0x96, 0xfa, 0x28,
+  0x2a, 0xc9, 0xc6, 0xd7, 0x69, 0x37, 0x86, 0x5b, 0xe4, 0x60, 0xe9, 0xb2,
+  0x91, 0x0f, 0xe3, 0x3d, 0xc0, 0x9d, 0xc1, 0x2d, 0xd2, 0xc1, 0x46, 0xc0,
+  0x8b, 0x12, 0xd1, 0x1a, 0x88, 0xcf, 0x91, 0xcd, 0x20, 0x7c, 0xac, 0x1f,
+  0x1d, 0x4d, 0x9a, 0xb3, 0x46, 0xc5, 0x05, 0x55, 0x7a, 0x15, 0x81, 0x63,
+  0xab, 0x05, 0xb3, 0x8b, 0x97, 0x47, 0xd4, 0x61, 0x4a, 0x38, 0x9c, 0xb1,
+  0x8a, 0x79, 0xfc, 0x4c, 0x63, 0x38, 0xb2, 0x3b, 0x89, 0xc7, 0xa0, 0x46,
+  0x98, 0xe2, 0x69, 0xa2, 0xdd, 0x07, 0x5c, 0x7a, 0x9e, 0x8f, 0xc9, 0x88,
+  0xf0, 0xf6, 0x67, 0x60, 0xbc, 0x3d, 0x9d, 0x8e, 0x5d, 0x75, 0xb4, 0x8e,
+  0x7e, 0x3f, 0x20, 0x81, 0x6c, 0x5a, 0xdd, 0x6c, 0x58, 0x9f, 0x06, 0xea,
+  0x28, 0xb0, 0xe0, 0x4d, 0x98, 0x08, 0xad, 0x3b, 0x6b, 0xd2, 0x39, 0xf9,
+  0x9c, 0x49, 0xed, 0xfc, 0xdb, 0xb2, 0xac, 0xc8, 0x14, 0x12, 0xd9, 0xcf,
+  0x2b, 0x81, 0x99, 0xcd, 0x93, 0x79, 0x5e, 0x3c, 0x7a, 0x13, 0x39, 0x25,
+  0xcd, 0x03, 0xad, 0x4e, 0x39, 0x2d, 0x24, 0x02, 0x12, 0x8e, 0xea, 0x0f,
+  0x44, 0x0b, 0x00, 0x1d, 0xea, 0xc6, 0x08, 0x24, 0x8d, 0x09, 0xb8, 0x0f,
+  0x18, 0xdf, 0xd6, 0x5b, 0xab, 0xd6, 0x13, 0x79, 0x79, 0xd8, 0xb0, 0x17,
+  0x53, 0x6a, 0x28, 0xfe, 0x1b, 0xfc, 0xff, 0x59, 0x8c, 0x2c, 0x27, 0x4b,
+  0x6a, 0x27, 0x44, 0xa2, 0x83, 0x97, 0xb6, 0x8a, 0xd6, 0x5f, 0xec, 0xf5,
+  0xb7, 0x6b, 0xb4, 0x9e, 0x3d, 0x62, 0x94, 0x20, 0xcc, 0x40, 0xae, 0x41,
+  0x6b, 0x2c, 0x79, 0xce, 0xb0, 0x8b, 0x93, 0x74, 0xba, 0x2c, 0x12, 0x56,
+  0xdf, 0x28, 0xb0, 0xa0, 0xf1, 0x04, 0xd4, 0x88, 0x6e, 0x72, 0x72, 0xc3,
+  0x83, 0x24, 0x4d, 0x66, 0x93, 0x6e, 0x63, 0x38, 0xb2, 0x5d, 0x90, 0xfc,
+  0x69, 0xfa, 0xc4, 0x31, 0xc1, 0x46, 0xa1, 0xc1, 0xb2, 0x44, 0x34, 0xd8,
+  0x39, 0x70, 0x93, 0x08, 0xfd, 0xd0, 0xd1, 0x68, 0x16, 0xa7, 0x73, 0x22,
+  0x53, 0xf1, 0xb3, 0xf6, 0x43, 0xd7, 0x02, 0xad, 0x0b, 0x7c, 0x7b, 0x88,
+  0x76, 0x6f, 0x51, 0xa2, 0x58, 0xa6, 0x53, 0x55, 0xb5, 0x99, 0xad, 0xca,
+  0x9b, 0x64, 0x74, 0xab, 0x9c, 0x4b, 0xf5, 0xcd, 0x26, 0x1d, 0x63, 0x80,
+  0x81, 0x8c, 0x6b, 0x78, 0x6a, 0x59, 0xe2, 0x35, 0x29, 0xcb, 0x14, 0x7d,
+  0x67, 0x68, 0x0b, 0x2e, 0x47, 0x64, 0x22, 0xd2, 0x85, 0x01, 0xea, 0x56,
+  0xf6, 0x17, 0x01, 0x3f, 0xcd, 0xc6, 0xbd, 0xaa, 0x48, 0x17, 0x6d, 0xb3,
+  0xe3, 0x53, 0xa9, 0x6b, 0xa7, 0xa5, 0x98, 0xeb, 0x64, 0x09, 0xb3, 0x6d,
+  0x3c, 0x8a, 0x1a, 0xbb, 0xd9, 0x24, 0x4a, 0xda, 0xdb, 0x2e, 0x3a, 0x83,
+  0x52, 0x50, 0x16, 0xd8, 0x52, 0x22, 0x5f, 0x27, 0xd8, 0x45, 0x22, 0xb5,
+  0xc0, 0x84, 0x4b, 0x47, 0xa4, 0x01, 0xa5, 0xd3, 0x04, 0x03, 0x39, 0x20,
+  0xc8, 0xaa, 0x19, 0xe8, 0x45, 0x3e, 0x8d, 0xc3, 0x6f, 0x92, 0x69, 0x5e,
+  0xa1, 0x2a, 0xe2, 0x91, 0xc9, 0x07, 0x62, 0xf2, 0x86, 0x26, 0x54, 0xe7,
+  0x77, 0x15, 0xb2, 0x94, 0x95, 0x71, 0xf8, 0x34, 0xeb, 0xfc, 0xe2, 0x6e,
+  0x28, 0x2b, 0xb8, 0x59, 0xcd, 0x53, 0x87, 0xd1, 0x46, 0x09, 0x19, 0x5e,
+  0xa4, 0x35, 0xaa, 0xd2, 0xaa, 0xda, 0x3e, 0xb2, 0x04, 0x54, 0x90, 0xab,
+  0xfb, 0x74, 0x94, 0xa8, 0x2f, 0x4e, 0x1c, 0xd4, 0xb3, 0xd4, 0xe7, 0xf3,
+  0x73, 0xbc, 0x93, 0xf0, 0x12, 0x2b, 0xe4, 0xe8, 0x3a, 0xb9, 0x4f, 0x51,
+  0x61, 0x17, 0xa6, 0x47, 0xfa, 0x98, 0xc8, 0x82, 0xb8, 0x48, 0xc9, 0x4f,
+  0x04, 0xc3, 0xc9, 0x3c, 0x1d, 0x73, 0xde, 0xbd, 0x63, 0x3c, 0x6f, 0x7a,
+  0x5f, 0x6c, 0x18, 0x6b, 0xbb, 0xd0, 0xe5, 0x9a, 0xc4, 0xe9, 0x2c, 0xb0,
+  0x4f, 0xc4, 0xc8, 0xa6, 0x09, 0xb9, 0xd4, 0xf8, 0x0c, 0x96, 0xb8, 0xe9,
+  0x18, 0x74, 0xf3, 0x99, 0x54, 0x92, 0xb0, 0x31, 0x41, 0x96, 0xc7, 0xc3,
+  0xa3, 0xd9, 0x5e, 0xd2, 0xd8, 0xf8, 0xec, 0xe4, 0xef, 0x7c, 0x7c, 0xce,
+  0xf5, 0x8c, 0x71, 0xd4, 0x78, 0x81, 0xd1, 0xa5, 0xe6, 0x0d, 0x45, 0xbb,
+  0x0b, 0x03, 0x94, 0x1b, 0xea, 0x3e, 0x4e, 0xc4, 0x79, 0x6e, 0x02, 0x7b,
+  0xc4, 0x90, 0x90, 0xa7, 0xc9, 0x15, 0xe6, 0x71, 0x84, 0x03, 0x37, 0x79,
+  0x39, 0x08, 0x57, 0x90, 0xc5, 0xc4, 0x43, 0x6b, 0x14, 0x9b, 0x03, 0xfb,
+  0x32, 0xe1, 0x25, 0x74, 0xf7, 0x0a, 0xaf, 0x23, 0x2b, 0x8b, 0xee, 0x6c,
+  0x88, 0x97, 0xa3, 0xdd, 0x87, 0x4a, 0x32, 0x4b, 0x99, 0x6e, 0xc4, 0x4a,
+  0x1d, 0x33, 0xab, 0x11, 0x3b, 0x80, 0x45, 0x81, 0x60, 0x51, 0x43, 0x53,
+  0x9d, 0xcc, 0xe2, 0x29, 0xf9, 0xd6, 0xa6, 0xcd, 0x1b, 0x9a, 0xe5, 0x12,
+  0xe5, 0x2b, 0x73, 0x60, 0xef, 0xb8, 0x6a, 0xf1, 0x6b, 0x95, 0xd1, 0x3a,
+  0x10, 0xd9, 0x6c, 0x49, 0xb2, 0xfe, 0x02, 0x96, 0x37, 0x18, 0xbc, 0xdb,
+  0x70, 0xd9, 0x1b, 0xed, 0xee, 0x73, 0x98, 0x1b, 0x72, 0x27, 0xb2, 0xc0,
+  0xbf, 0xe6, 0xf3, 0xa8, 0x33, 0x38, 0x63, 0xda, 0xb9, 0x6a, 0x9c, 0xd2,
+  0x25, 0xae, 0x02, 0xfd, 0xa0, 0x7d, 0x73, 0xf5, 0xf1, 0x49, 0x75, 0xc7,
+  0x32, 0x61, 0xd7, 0xb4, 0x83, 0x65, 0xb9, 0x24, 0xcf, 0x14, 0xc9, 0xe3,
+  0xe6, 0x70, 0xc0, 0xec, 0x81, 0x15, 0x2d, 0x33, 0xfc, 0xd3, 0x28, 0xd0,
+  0x29, 0x99, 0x72, 0x78, 0x16, 0x05, 0xfa, 0xbf, 0xd1, 0x08, 0x36, 0x0a,
+  0x28, 0xf0, 0x14, 0x1d, 0x1b, 0xf7, 0xb2, 0x79, 0x09, 0x41, 0x3d, 0x23,
+  0x76, 0x03, 0x22, 0x14, 0x04, 0x33, 0x5e, 0xb8, 0x16, 0xee, 0xbd, 0x5e,
+  0x2e, 0x81, 0xbf, 0xa0, 0xdd, 0x20, 0xcc, 0x03, 0xe9, 0xb1, 0x39, 0x3b,
+  0x66, 0x2f, 0x20, 0x69, 0x1c, 0x3e, 0xb2, 0xf1, 0x5b, 0x5f, 0x10, 0x3a,
+  0x34, 0xf7, 0x14, 0x41, 0xfc, 0x26, 0x60, 0x8d, 0x91, 0x3e, 0xe6, 0xa9,
+  0x62, 0xd7, 0x67, 0x83, 0xd0, 0x61, 0xd6, 0x83, 0x53, 0xf8, 0x3e, 0x32,
+  0x5b, 0xf4, 0x21, 0xb2, 0x4f, 0x35, 0x47, 0x8b, 0xc0, 0x09, 0x50, 0xb9,
+  0xce, 0xbe, 0x45, 0x82, 0x91, 0x2c, 0x36, 0x96, 0x39, 0xf2, 0x8d, 0x0c,
+  0x0c, 0x85, 0x35, 0x6a, 0x27, 0xc6, 0x7f, 0x7a, 0x7c, 0xe4, 0x8e, 0x4b,
+  0x0e, 0xd3, 0xe6, 0x45, 0x70, 0x7e, 0xbf, 0x5e, 0x6e, 0x18, 0x1e, 0x06,
+  0xa3, 0x5c, 0x9e, 0xbc, 0x27, 0xe3, 0x35, 0x06, 0xba, 0x39, 0x57, 0x5f,
+  0xa5, 0x06, 0xb6, 0x87, 0xcb, 0x74, 0x56, 0x0b, 0x08, 0x58, 0x7b, 0x9b,
+  0xa2, 0xca, 0x4c, 0x5a, 0x34, 0x35, 0x0e, 0x6d, 0xa5, 0xe4, 0x1b, 0x6e,
+  0x12, 0x5a, 0xf5, 0xb8, 0x10, 0xb7, 0xf6, 0xb2, 0xac, 0x79, 0x8f, 0x54,
+  0x2e, 0xcf, 0x2a, 0x52, 0xb1, 0xd1, 0xa8, 0x75, 0xc6, 0xf4, 0x4e, 0x88,
+  0xa6, 0x85, 0x62, 0x60, 0x9a, 0xa5, 0x3f, 0x8b, 0x0e, 0x9a, 0x64, 0x77,
+  0x69, 0x91, 0x67, 0xa8, 0xe3, 0x82, 0xdd, 0x5b, 0xa4, 0xc4, 0x96, 0x51,
+  0xfd, 0x02, 0xc6, 0xb1, 0x76, 0xfc, 0xe1, 0xea, 0xec, 0xe3, 0xf1, 0xd1,
+  0xc7, 0xaf, 0x3f, 0x9c, 0xbf, 0x39, 0x3b, 0x59, 0x6b, 0x0c, 0x87, 0x0e,
+  0xbf, 0x54, 0xbc, 0xf4, 0x25, 0x9a, 0x1d, 0x74, 0x49, 0x60, 0x8a, 0x3c,
+  0xf2, 0x34, 0xbd, 0x03, 0x86, 0x46, 0x56, 0x04, 0x39, 0xe8, 0xe9, 0x6f,
+  0xe4, 0xd2, 0x92, 0x0d, 0x6f, 0x0c, 0x37, 0x5c, 0xa2, 0x9e, 0xd6, 0xaf,
+  0x69, 0xcb, 0x7a, 0x55, 0xc4, 0x64, 0xd7, 0x09, 0x06, 0x34, 0x6c, 0xd4,
+  0xa2, 0xb2, 0x31, 0xda, 0x2e, 0x8e, 0x85, 0xe8, 0xf8, 0xea, 0x97, 0x15,
+  0x98, 0x48, 0x1a, 0x1d, 0x00, 0xad, 0x2d, 0xbf, 0xd5, 0x14, 0x03, 0xb0,
+  0xaf, 0x8e, 0x02, 0xc7, 0x5d, 0x5a, 0x4d, 0x74, 0x1c, 0xad, 0xe1, 0x48,
+  0x40, 0xbf, 0x3d, 0x99, 0xe4, 0xa8, 0xa8, 0xc0, 0xb8, 0x49, 0x52, 0xba,
+  0x18, 0x1a, 0x42, 0x45, 0x9d, 0x95, 0x3c, 0x73, 0x9e, 0x86, 0x0d, 0xba,
+  0x26, 0xee, 0x01, 0x69, 0xf7, 0xc9, 0x43, 0x42, 0x37, 0x4f, 0xde, 0x3a,
+  0x5e, 0x16, 0x74, 0x9b, 0xbf, 0x07, 0x6d, 0x04, 0xb9, 0xdf, 0x1b, 0x72,
+  0xed, 0xc1, 0x0b, 0xfa, 0x10, 0x88, 0x99, 0xa6, 0xc8, 0xcb, 0x67, 0x18,
+  0x54, 0x8d, 0xc9, 0x8d, 0x42, 0x4e, 0xaf, 0xcb, 0xa3, 0xeb, 0x77, 0x41,
+  0x65, 0xd6, 0xe6, 0xf3, 0x08, 0x29, 0x92, 0x62, 0x5e, 0x56, 0x72, 0x41,
+  0xce, 0x07, 0x83, 0x88, 0xb2, 0x45, 0x66, 0xe9, 0xb0, 0x88, 0xf1, 0x9b,
+  0xf8, 0x63, 0xfc, 0x29, 0x90, 0x75, 0x63, 0xb8, 0xcb, 0x6f, 0x8f, 0x07,
+  0x7f, 0xdc, 0xde, 0x46, 0x2d, 0x7e, 0x09, 0xfb, 0xb2, 0x0e, 0xaf, 0x64,
+  0x25, 0xdc, 0xcc, 0x79, 0xbf, 0xcc, 0x37, 0x48, 0x6c, 0x97, 0xa2, 0x0e,
+  0xc4, 0x77, 0x20, 0x6d, 0x89, 0x8e, 0x94, 0xa8, 0xe1, 0x38, 0xbd, 0x3d,
+  0x21, 0x46, 0x27, 0xa9, 0x34, 0xc0, 0x2f, 0x40, 0x5e, 0xcf, 0x7c, 0x85,
+  0x7c, 0x3d, 0xbd, 0x18, 0x48, 0x22, 0x4a, 0x3c, 0x82, 0xbf, 0xa2, 0x97,
+  0x60, 0x03, 0x57, 0x56, 0xbf, 0x61, 0xba, 0xaa, 0x01, 0x6b, 0xa3, 0xd7,
+  0x68, 0xbe, 0x50, 0xfe, 0x8c, 0xcf, 0x15, 0xb2, 0xe6, 0xe5, 0xb2, 0x39,
+  0x4a, 0x44, 0x0e, 0xc3, 0x78, 0x74, 0x7b, 0x1f, 0x17, 0x63, 0xb6, 0x87,
+  0x80, 0x62, 0x86, 0xe9, 0x2c, 0xad, 0x1e, 0xd9, 0xa8, 0x6d, 0x1a, 0xd4,
+  0x1c, 0x1c, 0xc5, 0x0d, 0x84, 0x7b, 0x34, 0x05, 0x7b, 0x1f, 0xb5, 0x4f,
+  0x54, 0xf1, 0xd3, 0xca, 0xb5, 0x67, 0x49, 0x45, 0xaa, 0x8c, 0x8a, 0x63,
+  0xbe, 0xed, 0x89, 0xc7, 0x8a, 0xef, 0x11, 0x4d, 0xd3, 0xd2, 0xae, 0xb2,
+  0x41, 0x97, 0x49, 0x29, 0xf9, 0x44, 0xe5, 0x23, 0x48, 0xf9, 0x79, 0x14,
+  0x50, 0x11, 0x29, 0x75, 0x28, 0xfa, 0x36, 0x79, 0x04, 0xe3, 0x39, 0xcd,
+  0x2c, 0xa7, 0x64, 0xe3, 0x3e, 0x41, 0xeb, 0x8e, 0x75, 0xd1, 0x54, 0x3d,
+  0xe9, 0x89, 0x04, 0x43, 0x58, 0x92, 0xf8, 0xde, 0x03, 0x7e, 0x5f, 0xf5,
+  0x70, 0x1c, 0x62, 0xad, 0xac, 0xb1, 0x64, 0xfa, 0x92, 0x7f, 0x88, 0x03,
+  0xf8, 0x79, 0x96, 0x25, 0x33, 0x39, 0xbe, 0xeb, 0x55, 0x07, 0x60, 0x9e,
+  0x85, 0x29, 0x7f, 0xcf, 0x37, 0xba, 0x31, 0xdc, 0x4b, 0x8e, 0xec, 0xc7,
+  0x95, 0xca, 0x24, 0x4d, 0x19, 0x02, 0xab, 0x68, 0xcb, 0xfc, 0xaa, 0xdf,
+  0xfa, 0x19, 0xef, 0x36, 0x15, 0xf6, 0xd0, 0xeb, 0x67, 0xce, 0x1e, 0x51,
+  0x3a, 0x64, 0x3c, 0x63, 0x39, 0xe2, 0x2f, 0x8c, 0x66, 0x45, 0xd1, 0x8b,
+  0xc6, 0x70, 0xae, 0x96, 0xad, 0x32, 0x4c, 0xd6, 0xb1, 0x06, 0x7a, 0x6a,
+  0x5e, 0x90, 0xb3, 0xa8, 0xc8, 0xe1, 0xac, 0x6b, 0xe7, 0xb9, 0xce, 0xca,
+  0x46, 0xf3, 0x9a, 0x08, 0x37, 0x77, 0x36, 0x66, 0x23, 0x74, 0xd1, 0x3d,
+  0xcd, 0xc4, 0x37, 0x59, 0x5b, 0x2d, 0xce, 0xba, 0x84, 0x26, 0x2e, 0x7d,
+  0x08, 0x6c, 0xec, 0x5f, 0x17, 0xd0, 0xcc, 0x0c, 0x89, 0xf9, 0xf9, 0x32,
+  0x4b, 0x68, 0xb1, 0x26, 0xa8, 0xdf, 0xab, 0x44, 0xc6, 0x49, 0x18, 0xff,
+  0xeb, 0x82, 0xb3, 0x05, 0x58, 0x71, 0x64, 0x47, 0xb2, 0x6f, 0x06, 0xa0,
+  0x2f, 0x50, 0xfc, 0x8d, 0x07, 0x9d, 0x68, 0x3d, 0xe9, 0x4f, 0x61, 0xbc,
+  0x0e, 0x8e, 0xb3, 0x7d, 0x80, 0xff, 0xdd, 0xa1, 0xff, 0xee, 0x76, 0x34,
+  0xaf, 0xcf, 0xdd, 0x7a, 0x94, 0xe6, 0x4d, 0x59, 0xc4, 0xc1, 0x38, 0x2b,
+  0xdc, 0xbb, 0xec, 0x60, 0x6e, 0x63, 0x3c, 0xac, 0xb3, 0x9e, 0xf1, 0x2e,
+  0xfb, 0xea, 0x96, 0x6e, 0xc3, 0x9c, 0xfd, 0x11, 0x77, 0x09, 0x3b, 0x44,
+  0x60, 0x65, 0x23, 0x50, 0x0f, 0xc9, 0x87, 0xa8, 0xb7, 0x6a, 0xf4, 0xb1,
+  0x48, 0x6e, 0xe2, 0xf2, 0x26, 0x5a, 0x56, 0x4c, 0x84, 0x40, 0xb7, 0xcd,
+  0xe1, 0x16, 0xb3, 0xd4, 0xba, 0xd9, 0xe4, 0xd3, 0x7d, 0xb5, 0xfb, 0xec,
+  0x29, 0x72, 0xf8, 0x63, 0x96, 0xdf, 0xeb, 0x33, 0x3d, 0x49, 0xb4, 0x0b,
+  0xa9, 0x05, 0x70, 0x9a, 0xe4, 0x37, 0xc1, 0xc7, 0xdc, 0x30, 0xf6, 0x1c,
+  0xb5, 0x49, 0xcc, 0x02, 0x04, 0x16, 0x37, 0x81, 0x1d, 0x43, 0x8b, 0x6e,
+  0x46, 0xe7, 0x86, 0xb6, 0x2b, 0xcd, 0xdb, 0x33, 0x4d, 0x45, 0xcf, 0x4b,
+  0x27, 0xe2, 0xba, 0x95, 0x7f, 0x93, 0x3c, 0x15, 0xed, 0xab, 0xe4, 0x50,
+  0x77, 0x53, 0xf5, 0x7a, 0x9a, 0xb4, 0x95, 0x41, 0x1a, 0x4d, 0x47, 0x16,
+  0xcb, 0xd1, 0x12, 0xa5, 0xeb, 0x74, 0x4a, 0xb6, 0x46, 0xc8, 0x81, 0xc1,
+  0x4e, 0xa9, 0x7f, 0xe9, 0x92, 0xc0, 0x8c, 0x7b, 0xe8, 0x2c, 0x5d, 0x96,
+  0xcf, 0xb8, 0x23, 0x0e, 0xd3, 0xe5, 0x77, 0x8c, 0xb3, 0x98, 0x43, 0xfa,
+  0xee, 0x06, 0x34, 0xa9, 0xf0, 0xd1, 0x21, 0x8c, 0x63, 0xe7, 0x66, 0x0d,
+  0x78, 0xa0, 0x2b, 0x71, 0x91, 0xac, 0xc7, 0xb7, 0x71, 0x3f, 0xba, 0x38,
+  0x1e, 0x5c, 0xe2, 0x27, 0x80, 0x3a, 0xb2, 0x29, 0xcc, 0xe2, 0x6c, 0xd0,
+  0x18, 0x2e, 0x79, 0xa8, 0x92, 0xac, 0x0c, 0x39, 0x28, 0xfd, 0x6d, 0xd6,
+  0x10, 0x82, 0xe6, 0xd6, 0xc8, 0x64, 0xc1, 0xd2, 0xa7, 0xa0, 0x38, 0xc6,
+  0x78, 0x31, 0x01, 0x23, 0xe2, 0xab, 0xe6, 0x7d, 0x68, 0x01, 0x37, 0x7f,
+  0xbc, 0x61, 0x5c, 0x35, 0x5d, 0xa5, 0x05, 0x13, 0x2b, 0x2c, 0x97, 0x53,
+  0xb4, 0x41, 0x4a, 0xb5, 0x1b, 0xcd, 0x17, 0x60, 0x37, 0x7c, 0x55, 0x41,
+  0x96, 0x6d, 0x3c, 0x89, 0x60, 0x35, 0x61, 0x1a, 0x15, 0xa9, 0x48, 0x59,
+  0x6e, 0x47, 0xc5, 0x54, 0x0a, 0x4a, 0x19, 0x4d, 0x29, 0xba, 0x36, 0x4a,
+  0x40, 0x05, 0x1d, 0x07, 0x94, 0x00, 0x3e, 0x14, 0x35, 0x9c, 0x26, 0x92,
+  0x26, 0x1a, 0xf0, 0xff, 0xd0, 0x40, 0x23, 0x56, 0xd1, 0x90, 0xea, 0x29,
+  0x4a, 0x91, 0xa2, 0x9f, 0x14, 0x15, 0x66, 0x36, 0xd5, 0x71, 0x3c, 0x73,
+  0xff, 0xbf, 0xc9, 0x96, 0xb0, 0xf1, 0x01, 0x69, 0x8c, 0x4a, 0x15, 0x8a,
+  0x19, 0xdc, 0xc0, 0x55, 0x8e, 0xbd, 0xbd, 0xed, 0xba, 0x13, 0x9b, 0x88,
+  0x0d, 0x0c, 0x80, 0x24, 0x3a, 0xc4, 0xff, 0x3e, 0xc9, 0x95, 0x29, 0x6f,
+  0x85, 0x9e, 0x97, 0x60, 0x27, 0xf3, 0x4e, 0xf1, 0xc5, 0x44, 0x75, 0x06,
+  0xed, 0x49, 0x2f, 0x22, 0xb7, 0x3e, 0xf2, 0xbd, 0x6e, 0xf4, 0x06, 0xb3,
+  0xb1, 0x4f, 0xce, 0xbf, 0x21, 0x1a, 0xb8, 0xdc, 0xde, 0xa1, 0xd0, 0x92,
+  0xb1, 0x1e, 0xc6, 0xf4, 0x91, 0x92, 0x1d, 0x09, 0x1c, 0x1a, 0xf6, 0x15,
+  0x5f, 0x92, 0x09, 0x5d, 0x62, 0xa3, 0x18, 0x13, 0xa4, 0xd4, 0xa1, 0xf1,
+  0xa7, 0x93, 0x5f, 0x9e, 0x21, 0x7a, 0xd2, 0x95, 0x1d, 0x14, 0xc7, 0xcc,
+  0x6d, 0xf2, 0x68, 0xff, 0x46, 0xbb, 0xea, 0x6c, 0xb5, 0x7d, 0xf8, 0xd0,
+  0xd9, 0xa4, 0xbf, 0x1e, 0x60, 0x7a, 0x12, 0x68, 0xa9, 0xe3, 0x9f, 0x7e,
+  0x9d, 0x44, 0x0c, 0xef, 0x7c, 0xc0, 0xd9, 0x42, 0x7e, 0x2e, 0x4d, 0x04,
+  0xe2, 0xb8, 0x3f, 0xb3, 0x78, 0xc9, 0x85, 0xc7, 0x34, 0x79, 0x24, 0xf8,
+  0x38, 0x33, 0x2a, 0x49, 0x8f, 0xb3, 0xbf, 0x28, 0x1b, 0xac, 0xb9, 0xf7,
+  0xa3, 0x7c, 0xe6, 0xc9, 0xba, 0x9a, 0xe1, 0x4a, 0xfa, 0xfc, 0x8e, 0xc8,
+  0x37, 0x32, 0xe6, 0x98, 0xd9, 0x88, 0x16, 0xdd, 0xbc, 0x0e, 0x46, 0xa7,
+  0x26, 0xf5, 0xcb, 0x4a, 0x46, 0x7c, 0x93, 0x5f, 0xa4, 0x18, 0x37, 0x4d,
+  0x8d, 0x35, 0xa5, 0x7e, 0x64, 0x35, 0xde, 0x90, 0xfa, 0x0f, 0x67, 0xab,
+  0x7b, 0x0b, 0x87, 0x8e, 0x7e, 0x26, 0xb3, 0x6b, 0x5d, 0xd7, 0xd3, 0x04,
+  0x4c, 0xae, 0x48, 0x55, 0x3f, 0x97, 0x4c, 0x52, 0x3f, 0x86, 0xc1, 0xe9,
+  0x06, 0xe2, 0x8d, 0x92, 0xb4, 0xaa, 0x9a, 0x2f, 0x9f, 0xc9, 0x0f, 0x2d,
+  0xd1, 0x8e, 0xb3, 0x25, 0x9d, 0xd0, 0x51, 0x54, 0x1c, 0xf9, 0x94, 0x2b,
+  0x94, 0xde, 0xe1, 0xd6, 0x29, 0xed, 0x58, 0xc7, 0x66, 0x5d, 0xf5, 0xcd,
+  0x33, 0xfc, 0x33, 0x43, 0x9f, 0xd8, 0x1f, 0x02, 0x04, 0x19, 0xa4, 0x45,
+  0xf4, 0x8d, 0x4b, 0xec, 0x83, 0x14, 0x18, 0xcc, 0x80, 0x94, 0x14, 0xf4,
+  0xd9, 0xe3, 0xb3, 0x0c, 0x3a, 0x55, 0x40, 0xd4, 0x6e, 0x73, 0x8c, 0x39,
+  0xcf, 0xda, 0x69, 0x12, 0x08, 0xb0, 0xf1, 0x0a, 0xf3, 0x49, 0x98, 0x76,
+  0xd1, 0xf7, 0x9a, 0x8e, 0x6e, 0x29, 0xf2, 0x22, 0x12, 0xca, 0x5d, 0x9f,
+  0x26, 0xed, 0x71, 0xba, 0x69, 0xe0, 0x08, 0xc8, 0x96, 0x44, 0xa7, 0x30,
+  0xd2, 0x24, 0x4a, 0xe7, 0x34, 0x63, 0x9d, 0xad, 0xd5, 0xcb, 0x00, 0x73,
+  0xfd, 0xf8, 0xe6, 0xf4, 0x2a, 0x5a, 0x47, 0x0d, 0xbc, 0x69, 0xe4, 0xaa,
+  0x78, 0xdf, 0x4c, 0xaa, 0xd1, 0xe6, 0xe2, 0x36, 0xdd, 0x04, 0x63, 0x73,
+  0x3c, 0xdc, 0x30, 0x46, 0x14, 0x7d, 0x0e, 0xa9, 0xd0, 0x18, 0xa6, 0x6a,
+  0x99, 0x92, 0x69, 0xea, 0xb9, 0x1e, 0xad, 0xa9, 0xca, 0xe5, 0x2d, 0xc6,
+  0x46, 0xe5, 0x6d, 0x62, 0x82, 0xa6, 0x10, 0x0d, 0xa7, 0x46, 0x50, 0x60,
+  0x27, 0x61, 0xbf, 0x34, 0xd8, 0xd8, 0xcd, 0xbb, 0xca, 0xa9, 0x8f, 0xe2,
+  0xc8, 0x61, 0x07, 0x8e, 0xe6, 0xeb, 0x89, 0xb8, 0xb0, 0xda, 0x6f, 0x17,
+  0x33, 0x2d, 0x71, 0x53, 0x16, 0x28, 0x92, 0xc6, 0xe8, 0x06, 0x6c, 0x0e,
+  0x47, 0x9a, 0x5c, 0xa7, 0xbf, 0xd9, 0x89, 0x4c, 0x6e, 0x29, 0xec, 0x32,
+  0x27, 0x4f, 0x9b, 0xc0, 0x17, 0x90, 0xd8, 0x64, 0x59, 0x1a, 0x3f, 0x66,
+  0x6c, 0xce, 0xab, 0x1f, 0x62, 0xa8, 0xce, 0x71, 0x1a, 0x9d, 0x0b, 0x74,
+  0x63, 0xba, 0x59, 0xae, 0xb5, 0x2e, 0x93, 0xa2, 0xa3, 0xea, 0xfc, 0xd8,
+  0x89, 0x9c, 0xdc, 0xc4, 0x5a, 0x8a, 0x62, 0x6a, 0xb3, 0x87, 0x1c, 0x21,
+  0x00, 0x12, 0xd9, 0xdc, 0xe1, 0x71, 0x32, 0x4b, 0xe7, 0x29, 0xd9, 0x5e,
+  0xee, 0x14, 0x7a, 0xa1, 0x00, 0xa1, 0x9d, 0xd2, 0x8f, 0xfe, 0x94, 0x34,
+  0xdf, 0x37, 0xc6, 0x5f, 0xc3, 0x94, 0xc8, 0x23, 0xc6, 0xe9, 0x98, 0x61,
+  0xab, 0xb9, 0x3e, 0x21, 0x93, 0x31, 0xbc, 0x22, 0x6c, 0x6c, 0xee, 0x52,
+  0x9b, 0x2a, 0x6f, 0x5d, 0x22, 0x7a, 0xe9, 0x99, 0xa9, 0x45, 0x8b, 0xdb,
+  0x51, 0xb9, 0xbd, 0xdd, 0x14, 0x74, 0xa5, 0xa5, 0x28, 0xb1, 0xdf, 0x63,
+  0x43, 0x98, 0x1f, 0xae, 0x4e, 0xa3, 0x75, 0xac, 0x10, 0x79, 0xb9, 0xbf,
+  0xbd, 0xb3, 0xe1, 0xa6, 0x95, 0x28, 0x03, 0xf0, 0xe5, 0xe6, 0x23, 0x87,
+  0x64, 0x9d, 0x0b, 0x38, 0xcb, 0x47, 0xb1, 0x68, 0x1c, 0x76, 0xe8, 0x71,
+  0x72, 0x97, 0x8e, 0xb0, 0x40, 0x07, 0xa3, 0xf1, 0xc8, 0x83, 0x87, 0x09,
+  0x4c, 0xd2, 0xdb, 0x71, 0x9b, 0xce, 0xcb, 0xb3, 0x07, 0x13, 0xc9, 0x68,
+  0xca, 0x98, 0x34, 0x0d, 0x34, 0x50, 0xc9, 0xde, 0xb9, 0xb3, 0x96, 0x28,
+  0x41, 0xdc, 0xe2, 0x09, 0xc2, 0x75, 0x71, 0xf9, 0x0c, 0xe9, 0x18, 0x5d,
+  0x1b, 0xf8, 0xe9, 0xf5, 0x64, 0xb3, 0x84, 0xf5, 0x9a, 0xd8, 0x31, 0xa6,
+  0x9f, 0x34, 0x0f, 0x50, 0xe6, 0xd4, 0x41, 0x41, 0x92, 0x91, 0x70, 0x8f,
+  0xed, 0xa0, 0x66, 0xf7, 0x5d, 0x4d, 0xa8, 0x3e, 0xaa, 0xef, 0x29, 0x27,
+  0xc2, 0x01, 0xcd, 0x25, 0x3c, 0xe4, 0xef, 0xe4, 0x64, 0xaa, 0xb3, 0x4f,
+  0x39, 0x1e, 0x3c, 0x7b, 0xf1, 0x1a, 0x0e, 0x59, 0x51, 0x50, 0x7e, 0x1b,
+  0xeb, 0xe3, 0x9e, 0x1c, 0x87, 0xd7, 0x37, 0x55, 0x08, 0x91, 0x14, 0x52,
+  0x7f, 0x23, 0x7b, 0x7e, 0x80, 0x79, 0x92, 0xa7, 0xe7, 0x56, 0x1c, 0x3d,
+  0xa4, 0x14, 0x9b, 0xfc, 0x0d, 0xdf, 0x57, 0xac, 0x82, 0x1f, 0x8e, 0x68,
+  0x94, 0x8f, 0x1b, 0x26, 0x3b, 0x6e, 0x82, 0x23, 0xf0, 0x88, 0xfb, 0x71,
+  0xa8, 0x92, 0x38, 0x5e, 0xd8, 0x93, 0x8d, 0x94, 0xca, 0xee, 0xf5, 0x5f,
+  0xc4, 0x03, 0x43, 0x1e, 0x35, 0x62, 0x81, 0xbf, 0x8a, 0x03, 0x3e, 0xe1,
+  0x73, 0x3a, 0xf6, 0x24, 0x76, 0x69, 0x94, 0x21, 0xab, 0xab, 0x61, 0xa6,
+  0x78, 0x44, 0x1b, 0xe7, 0x5b, 0x34, 0x98, 0x33, 0x48, 0x29, 0x01, 0x98,
+  0xf0, 0xd5, 0xb8, 0x9b, 0xec, 0xd8, 0x81, 0xeb, 0xb2, 0x7e, 0xc6, 0x41,
+  0xca, 0xe8, 0xf2, 0xed, 0x0f, 0xca, 0x2d, 0x43, 0x06, 0x3c, 0x39, 0xa2,
+  0xbe, 0x30, 0xa9, 0x61, 0x60, 0x51, 0x60, 0x9a, 0x5a, 0x2a, 0x29, 0x9f,
+  0xec, 0x26, 0xa2, 0x70, 0xf8, 0x86, 0xcd, 0x64, 0xc4, 0xad, 0xee, 0x1c,
+  0xd2, 0xef, 0x9a, 0xb1, 0xa6, 0x9c, 0x2d, 0x99, 0x2f, 0x7f, 0xe4, 0x5f,
+  0x33, 0x8f, 0x85, 0x7f, 0x55, 0x37, 0xcb, 0xf9, 0x10, 0xce, 0x33, 0xab,
+  0xbe, 0xec, 0x44, 0x1c, 0x6c, 0x9d, 0xc8, 0x7e, 0xae, 0x30, 0x3b, 0x53,
+  0x2d, 0xd6, 0x51, 0xdf, 0x62, 0x6d, 0xd7, 0x78, 0x76, 0x5a, 0x38, 0x60,
+  0x93, 0xf3, 0xe0, 0xf0, 0xd8, 0x97, 0xed, 0xa9, 0x7a, 0x1f, 0x80, 0x3c,
+  0x7f, 0x7c, 0xff, 0x97, 0x1f, 0x5f, 0xed, 0xee, 0xc5, 0x2f, 0xe3, 0xd1,
+  0x8b, 0xc9, 0xe7, 0xf1, 0xfe, 0x78, 0xff, 0xe5, 0xab, 0x9d, 0xcf, 0xf7,
+  0xe3, 0x97, 0x7b, 0x93, 0xf8, 0xc5, 0x76, 0xb2, 0xfd, 0x6a, 0xb2, 0xb3,
+  0x3b, 0x1e, 0x4f, 0x92, 0xcf, 0xc7, 0x2f, 0xe3, 0x4e, 0x9f, 0xcc, 0x2f,
+  0x9d, 0xba, 0xcf, 0x6a, 0x35, 0xf0, 0x16, 0x47, 0x83, 0x77, 0x47, 0xbd,
+  0xed, 0xe8, 0x26, 0x79, 0xd0, 0x0b, 0xc6, 0x1e, 0x4d, 0x93, 0x72, 0x97,
+  0x48, 0x52, 0x75, 0xfb, 0x62, 0xb5, 0x4a, 0x10, 0x53, 0xa6, 0xd1, 0x57,
+  0x42, 0x1a, 0x30, 0xef, 0xa2, 0x6e, 0x2b, 0x27, 0xd5, 0x19, 0xff, 0xe1,
+  0x81, 0xfa, 0xec, 0x71, 0x5d, 0xcd, 0xcb, 0x7f, 0x06, 0xef, 0xcc, 0xde,
+  0xc7, 0x23, 0x50, 0x92, 0x60, 0x4f, 0xe4, 0xc1, 0x01, 0x98, 0xb6, 0xc0,
+  0xa6, 0xbb, 0x91, 0xfc, 0x05, 0xbd, 0xc4, 0xce, 0x18, 0xdf, 0x14, 0xf9,
+  0x72, 0x71, 0x99, 0xcf, 0xd2, 0xd1, 0xe3, 0xaa, 0xe1, 0xdc, 0xc7, 0x6a,
+  0xbf, 0x38, 0x61, 0x16, 0x9e, 0x96, 0xc9, 0xef, 0x68, 0x5a, 0x39, 0xec,
+  0xf8, 0x19, 0xb6, 0x55, 0x6f, 0x94, 0x2e, 0x6e, 0x30, 0xce, 0x7b, 0x48,
+  0x29, 0x7e, 0x18, 0x9a, 0xe1, 0x1f, 0x84, 0x6d, 0xaa, 0x81, 0xdc, 0xc8,
+  0x52, 0xce, 0x53, 0xdf, 0x16, 0x8d, 0x2b, 0xd5, 0xfa, 0x37, 0x75, 0x53,
+  0x49, 0x5a, 0x69, 0xea, 0xf9, 0xf1, 0xec, 0x87, 0xf8, 0xb6, 0xab, 0xb6,
+  0xcd, 0xce, 0x0b, 0xf9, 0x55, 0x3f, 0xba, 0xa2, 0x38, 0xf9, 0x72, 0xc1,
+  0xe6, 0x05, 0xf9, 0xf3, 0xf9, 0x77, 0xcd, 0x8b, 0x86, 0x93, 0x17, 0x8a,
+  0xe1, 0x2a, 0x3c, 0xd8, 0xd1, 0x0f, 0x57, 0x67, 0x07, 0xcd, 0x7d, 0xa2,
+  0x4a, 0xa3, 0xf2, 0x60, 0x73, 0x93, 0x42, 0x3e, 0x37, 0xf1, 0xc3, 0x43,
+  0xbf, 0x4c, 0x36, 0xc7, 0xf9, 0xa8, 0xdc, 0x2c, 0xcb, 0x99, 0xee, 0x46,
+  0xbd, 0xf0, 0xef, 0x13, 0x78, 0x73, 0xf3, 0x39, 0xb1, 0xad, 0x64, 0xdc,
+  0x2b, 0x4b, 0x2f, 0x37, 0x68, 0x70, 0xac, 0x99, 0x07, 0x27, 0x92, 0x93,
+  0x46, 0x72, 0xae, 0x07, 0xbb, 0x3b, 0x18, 0xbc, 0x8b, 0xf4, 0x65, 0xda,
+  0x5e, 0x13, 0x12, 0x37, 0x79, 0x39, 0xdd, 0x80, 0x1a, 0x16, 0x0b, 0xc3,
+  0xfe, 0xc2, 0x75, 0xe8, 0xa0, 0x3a, 0x9d, 0xf3, 0x1f, 0x52, 0xb8, 0x92,
+  0x56, 0x2b, 0xb3, 0xf8, 0x5e, 0x34, 0x1c, 0x20, 0x66, 0x11, 0xe1, 0xf8,
+  0xbf, 0x3a, 0xc1, 0xe2, 0xc8, 0x3e, 0x69, 0x3d, 0x42, 0xcd, 0xca, 0x74,
+  0xa0, 0xde, 0x69, 0x5e, 0x80, 0xf0, 0x98, 0x97, 0x21, 0x2f, 0xa8, 0xde,
+  0xf2, 0x92, 0xd5, 0xbe, 0x92, 0x13, 0x11, 0x61, 0x98, 0xcc, 0x19, 0x1c,
+  0x8e, 0x91, 0x12, 0x18, 0xfb, 0xee, 0x61, 0x05, 0xe3, 0x5b, 0x7a, 0x78,
+  0x6d, 0x5e, 0xb4, 0x65, 0x66, 0x83, 0x1f, 0x24, 0x8e, 0x61, 0xb2, 0x52,
+  0x55, 0xe6, 0x59, 0x08, 0x94, 0xf8, 0x4f, 0x62, 0x02, 0x75, 0x88, 0xa2,
+  0xc8, 0x1d, 0xa5, 0xb6, 0xf7, 0x2d, 0x19, 0x97, 0x20, 0x1d, 0xd3, 0xa9,
+  0x86, 0xd7, 0x5b, 0x72, 0xec, 0x50, 0x74, 0x55, 0x94, 0xb8, 0x2c, 0xb5,
+  0xe0, 0x28, 0x14, 0x30, 0x85, 0x8d, 0x52, 0x4b, 0x24, 0x35, 0x93, 0xd3,
+  0x81, 0x6a, 0x25, 0xf0, 0xde, 0x4d, 0xc0, 0x82, 0x1f, 0xfb, 0x38, 0xa6,
+  0x51, 0xe9, 0xbd, 0xa4, 0xe1, 0xc5, 0x7d, 0xe1, 0x24, 0xb6, 0xa1, 0x56,
+  0x46, 0x6e, 0x06, 0x78, 0xa6, 0x69, 0xed, 0x51, 0xc2, 0xad, 0xd1, 0xf9,
+  0x42, 0xf5, 0xad, 0xcd, 0xf5, 0x68, 0xde, 0xbd, 0xee, 0x6d, 0x4a, 0x15,
+  0xd5, 0x31, 0x25, 0xf5, 0x87, 0x44, 0x7b, 0xee, 0x04, 0x69, 0x71, 0x40,
+  0x5f, 0xe6, 0x55, 0x26, 0x6d, 0x52, 0xcb, 0x94, 0x48, 0x21, 0x00, 0x0e,
+  0x04, 0x62, 0x0f, 0xd3, 0xcd, 0xb1, 0x8e, 0x7e, 0x96, 0x5b, 0x05, 0x0b,
+  0x08, 0x0f, 0x78, 0x21, 0x95, 0x22, 0xf6, 0x3d, 0xbe, 0xcd, 0x05, 0x49,
+  0x9c, 0x44, 0xc8, 0x85, 0x75, 0x9c, 0xed, 0xc5, 0x3f, 0x23, 0xf1, 0x35,
+  0xd4, 0x18, 0xb9, 0xe5, 0x67, 0x78, 0x7e, 0x21, 0xd7, 0x90, 0xa4, 0xe4,
+  0x73, 0x95, 0x63, 0x4a, 0xf5, 0xbb, 0x52, 0xf1, 0xc9, 0x15, 0x06, 0xea,
+  0xd9, 0x2e, 0x73, 0x49, 0xd9, 0xc4, 0x89, 0xe2, 0x3c, 0x79, 0x8e, 0x4d,
+  0x52, 0x37, 0xd5, 0x9c, 0x35, 0x63, 0x24, 0x2e, 0x6d, 0xa2, 0x7e, 0xe9,
+  0x47, 0x2b, 0xed, 0x66, 0x86, 0xac, 0x57, 0xaf, 0xe8, 0x81, 0x26, 0x52,
+  0x24, 0xfa, 0x85, 0x2c, 0x6f, 0x4e, 0x4a, 0xe7, 0x11, 0xca, 0x47, 0xd5,
+  0xc4, 0x7e, 0x67, 0x02, 0x9a, 0xe0, 0x6f, 0x4e, 0xb9, 0x25, 0x7b, 0x33,
+  0x89, 0xec, 0x23, 0x91, 0xb5, 0x33, 0xed, 0x31, 0x92, 0xbf, 0x81, 0xca,
+  0x35, 0x4a, 0x9e, 0xfa, 0x01, 0xce, 0xe9, 0xf5, 0x46, 0xc8, 0x4f, 0x6c,
+  0x47, 0x52, 0x8a, 0xc2, 0x7b, 0x3a, 0xcb, 0x4b, 0x8d, 0xbf, 0xa0, 0x72,
+  0xc1, 0x45, 0xb7, 0xc0, 0x0d, 0xbe, 0x97, 0x1f, 0xf0, 0xd1, 0x34, 0x86,
+  0xe3, 0xa7, 0xba, 0x32, 0xc5, 0x89, 0x55, 0x36, 0xc4, 0x56, 0xb5, 0x95,
+  0xc2, 0xa8, 0x6d, 0x18, 0x6b, 0xf2, 0x20, 0xfa, 0xf1, 0xc7, 0x6e, 0x04,
+  0x46, 0x72, 0x63, 0xb8, 0x1f, 0x2b, 0xf8, 0x29, 0xd0, 0xe2, 0x8f, 0x5c,
+  0xad, 0xf4, 0xe3, 0x1d, 0x1a, 0x81, 0xe8, 0x60, 0x2e, 0x67, 0x18, 0x3d,
+  0x62, 0x35, 0xbb, 0xee, 0x95, 0xe3, 0x62, 0xe8, 0x15, 0xa9, 0x59, 0xd6,
+  0x6e, 0xe7, 0x54, 0x4c, 0x38, 0xb0, 0xe5, 0x3c, 0x13, 0xeb, 0x84, 0x89,
+  0x93, 0xee, 0x3d, 0xc9, 0x81, 0xb5, 0x3f, 0xae, 0x59, 0x42, 0x0a, 0xed,
+  0x5d, 0x91, 0xb0, 0xa4, 0x27, 0x51, 0x95, 0x3a, 0x62, 0x4a, 0x4b, 0x87,
+  0xc9, 0xdc, 0x8c, 0x38, 0x5c, 0x8a, 0xcc, 0xf4, 0x02, 0x9d, 0xeb, 0x5c,
+  0x03, 0xd6, 0x14, 0xe3, 0xd6, 0x94, 0xc4, 0xc2, 0xb8, 0xc5, 0xcd, 0x63,
+  0x89, 0x99, 0x1c, 0x32, 0x1b, 0xef, 0xf6, 0xb4, 0x26, 0x18, 0xcb, 0xde,
+  0x63, 0x45, 0x0f, 0xf2, 0x01, 0x64, 0x7e, 0x35, 0xd6, 0x09, 0x33, 0x5a,
+  0xeb, 0xad, 0x99, 0x58, 0x98, 0xe4, 0xcb, 0x78, 0x89, 0xf4, 0x26, 0x39,
+  0xdb, 0x26, 0x1f, 0x7a, 0x9f, 0x74, 0x92, 0xe2, 0x72, 0x37, 0xdd, 0xd1,
+  0x56, 0xb6, 0x63, 0x69, 0xaa, 0x46, 0xf1, 0xe5, 0xfb, 0xc2, 0x7f, 0x02,
+  0x0e, 0x27, 0x4a, 0x8b, 0x24, 0xd3, 0x43, 0x07, 0x20, 0x6f, 0x88, 0x0d,
+  0x0f, 0xf5, 0x7a, 0x04, 0x32, 0xb2, 0x60, 0x60, 0x10, 0x24, 0x09, 0xca,
+  0x3c, 0x78, 0xc4, 0x32, 0xb0, 0xc5, 0xcc, 0xe3, 0xb7, 0x92, 0x0a, 0xa8,
+  0x95, 0xd6, 0x78, 0xc1, 0x11, 0x8d, 0xe2, 0x3e, 0x13, 0x34, 0x81, 0x41,
+  0x4e, 0x5e, 0x99, 0x11, 0xe5, 0x30, 0x48, 0xba, 0x8c, 0x14, 0x94, 0x05,
+  0xac, 0x40, 0x94, 0x81, 0x9e, 0x0e, 0x84, 0xf3, 0x79, 0x1d, 0x75, 0xda,
+  0x35, 0xa1, 0x4e, 0xf3, 0x0d, 0xca, 0x80, 0xb4, 0x2e, 0x4e, 0x29, 0x96,
+  0xa7, 0x89, 0xac, 0x4b, 0x26, 0x5d, 0xef, 0xef, 0x9c, 0xd0, 0xc6, 0xf5,
+  0x5c, 0x22, 0x5f, 0x37, 0x38, 0x41, 0xb8, 0x0c, 0x44, 0xf6, 0x6d, 0x96,
+  0x95, 0x43, 0x1f, 0x36, 0x4f, 0x29, 0x25, 0xf7, 0x35, 0x49, 0x2f, 0x96,
+  0x76, 0xce, 0xd3, 0x5e, 0x28, 0x5e, 0xdf, 0xc6, 0x72, 0x13, 0xfc, 0x9e,
+  0xb8, 0xa4, 0x55, 0x74, 0x98, 0x1b, 0xbd, 0x98, 0x11, 0x48, 0x87, 0x16,
+  0xba, 0x90, 0x4a, 0xe4, 0xed, 0xce, 0xf6, 0x86, 0x29, 0x8d, 0x24, 0xa4,
+  0x0d, 0xce, 0xcc, 0x16, 0x3d, 0xa1, 0x73, 0x93, 0x73, 0x2e, 0x51, 0xe7,
+  0x00, 0xab, 0xf6, 0xe4, 0x36, 0xd2, 0x1a, 0x15, 0x03, 0xa1, 0x31, 0x1c,
+  0x65, 0x6a, 0xbd, 0xbb, 0x78, 0x7f, 0x52, 0xcf, 0xc0, 0xa5, 0x9f, 0x84,
+  0x9c, 0xaf, 0xc0, 0xae, 0xde, 0x02, 0x87, 0x61, 0x1a, 0x88, 0x3d, 0x6d,
+  0x8e, 0x69, 0x0b, 0xa6, 0x35, 0x4d, 0xaa, 0xc5, 0xfd, 0x32, 0x1d, 0xaf,
+  0x6f, 0x20, 0x8d, 0x60, 0xad, 0x49, 0x8f, 0x0a, 0x9c, 0xd8, 0x34, 0x2c,
+  0xa3, 0x75, 0x56, 0xd0, 0x8b, 0xa4, 0x5a, 0x16, 0x19, 0x3b, 0xcc, 0x71,
+  0xee, 0x4d, 0x23, 0x0b, 0xa4, 0x33, 0x8b, 0x3a, 0xd7, 0x39, 0x20, 0x80,
+  0x39, 0x9c, 0xc2, 0xc4, 0x03, 0x82, 0xb9, 0x7b, 0x61, 0xf2, 0x3e, 0xe8,
+  0xe0, 0x69, 0x2d, 0x9e, 0xfc, 0x72, 0x77, 0x22, 0x3a, 0xba, 0xbc, 0x7c,
+  0x73, 0x74, 0x7d, 0x64, 0xd6, 0x46, 0x02, 0x9a, 0x98, 0x0b, 0x69, 0xc8,
+  0xc0, 0x87, 0x50, 0x6b, 0xc2, 0x27, 0xd7, 0xfe, 0xf4, 0x61, 0x70, 0x72,
+  0xd5, 0x3c, 0xd8, 0xcb, 0xab, 0x0b, 0x44, 0x23, 0xfa, 0xd3, 0x8f, 0x47,
+  0x8b, 0xc5, 0x4c, 0x83, 0x82, 0x6f, 0xe2, 0x2a, 0x5e, 0xf3, 0x6e, 0xf5,
+  0xce, 0x06, 0xce, 0xef, 0xde, 0xcc, 0x6f, 0x22, 0x42, 0x8e, 0x4c, 0xfd,
+  0xa8, 0x8f, 0x07, 0x5a, 0x8c, 0x34, 0xfd, 0xd6, 0xec, 0x06, 0x6d, 0x00,
+  0x65, 0xcf, 0xb6, 0x2f, 0x24, 0xb7, 0x9c, 0x4c, 0x13, 0xc9, 0x74, 0xb3,
+  0x66, 0x60, 0x64, 0x27, 0xa3, 0x65, 0xa5, 0x24, 0x4f, 0xf4, 0x85, 0x25,
+  0xdc, 0xcd, 0x7d, 0xf1, 0x8e, 0xc7, 0x86, 0x51, 0x98, 0x0b, 0x10, 0x82,
+  0x00, 0x10, 0x1a, 0xa5, 0x48, 0xeb, 0x6c, 0x99, 0x8b, 0x05, 0x68, 0x6a,
+  0x9c, 0x70, 0x58, 0x85, 0x10, 0x05, 0x78, 0x4a, 0xde, 0x86, 0xfc, 0x11,
+  0x6e, 0x63, 0x2f, 0x3a, 0x91, 0x52, 0x37, 0x5a, 0x38, 0xfc, 0xc0, 0x7b,
+  0xa8, 0x32, 0xe6, 0x83, 0xb0, 0xfb, 0x30, 0xaf, 0x70, 0x50, 0x36, 0x3a,
+  0x4d, 0x11, 0xc0, 0x75, 0xad, 0xf0, 0x10, 0x4e, 0x1b, 0x37, 0x9d, 0xac,
+  0xa7, 0x4e, 0x20, 0xe9, 0xa9, 0x17, 0x4f, 0x91, 0xbc, 0xe0, 0x51, 0xd0,
+  0xae, 0xc1, 0x68, 0xc2, 0x7f, 0x6d, 0x6e, 0xf7, 0xb7, 0x3a, 0xfe, 0xe4,
+  0xf1, 0xb2, 0x10, 0x42, 0x8a, 0x89, 0xaa, 0x21, 0x37, 0xac, 0xf2, 0xfc,
+  0xc9, 0xf9, 0x31, 0x0b, 0x03, 0xfd, 0x74, 0x01, 0xe3, 0x07, 0xa7, 0xd2,
+  0xbb, 0xf0, 0xb2, 0x40, 0x30, 0x73, 0xb7, 0x50, 0xa6, 0x08, 0x3c, 0x31,
+  0xcb, 0xef, 0x71, 0x25, 0x40, 0x6a, 0xb3, 0x59, 0x0d, 0xca, 0xa6, 0x13,
+  0xde, 0xe6, 0x8c, 0x50, 0xa3, 0x92, 0xe6, 0x6e, 0x07, 0x23, 0xd7, 0xaa,
+  0x7c, 0xba, 0x1a, 0x9e, 0x49, 0x79, 0x25, 0x2b, 0xd2, 0x50, 0x82, 0x8b,
+  0x24, 0x00, 0x5c, 0xce, 0xe3, 0x7b, 0x33, 0x37, 0x33, 0xa3, 0xa7, 0xe9,
+  0x21, 0x3d, 0x1c, 0x04, 0xb5, 0xd2, 0x43, 0x2e, 0x54, 0xf7, 0x6c, 0xf9,
+  0xf7, 0xf1, 0x43, 0x3a, 0x5f, 0xce, 0xe9, 0x63, 0x48, 0xdb, 0xf2, 0x98,
+  0xc4, 0x13, 0xc8, 0xab, 0xc8, 0xe9, 0x29, 0x44, 0xe4, 0x6b, 0x65, 0xe4,
+  0x58, 0xf4, 0x21, 0x21, 0x03, 0x22, 0xb9, 0x6f, 0x97, 0x47, 0xca, 0x02,
+  0x05, 0x1c, 0xca, 0x86, 0x37, 0x00, 0xf4, 0x83, 0x18, 0x73, 0x0e, 0xca,
+  0xdc, 0x24, 0xec, 0x04, 0xd8, 0x39, 0x23, 0x25, 0x88, 0x0e, 0xe7, 0xe4,
+  0xab, 0x26, 0x45, 0x9a, 0x8f, 0xcd, 0xbd, 0x41, 0xfd, 0x31, 0xcd, 0x96,
+  0xb0, 0xcf, 0xec, 0x4b, 0xe6, 0x20, 0x04, 0xfe, 0xca, 0xf3, 0x10, 0x52,
+  0x56, 0xfd, 0x80, 0x8a, 0x25, 0x34, 0x05, 0xf5, 0x65, 0x7f, 0x77, 0xa7,
+  0xbf, 0xd5, 0xad, 0x19, 0xf4, 0x02, 0x28, 0x01, 0xb7, 0x6b, 0x94, 0xce,
+  0x4d, 0xb1, 0x69, 0xff, 0x77, 0x73, 0xdc, 0x50, 0x46, 0xf8, 0x3c, 0x7e,
+  0xa0, 0xe3, 0x0b, 0x1e, 0x6b, 0x1e, 0x1d, 0xbe, 0xbb, 0x18, 0x5c, 0x6f,
+  0x1f, 0x5c, 0x5e, 0x5c, 0xc1, 0x7f, 0xf1, 0xef, 0x3b, 0xf4, 0xf7, 0x1d,
+  0xcf, 0xaa, 0x7c, 0x2b, 0x19, 0xb4, 0x5a, 0xac, 0x43, 0x1a, 0x0a, 0x69,
+  0x34, 0xbc, 0x9b, 0x91, 0x33, 0x10, 0xea, 0xe5, 0xc4, 0x06, 0x47, 0xa6,
+  0x9c, 0xb1, 0x79, 0xc4, 0xce, 0xa7, 0x34, 0xc9, 0xae, 0x1f, 0xf9, 0x89,
+  0x7c, 0x69, 0xa5, 0xda, 0x94, 0x14, 0xc2, 0x6b, 0x89, 0x7d, 0xd3, 0xd7,
+  0xcd, 0x45, 0xcc, 0x52, 0x9f, 0xa3, 0x60, 0x75, 0x94, 0x1b, 0x56, 0xff,
+  0xd5, 0x68, 0x06, 0xda, 0x7d, 0x82, 0xb9, 0x24, 0xe3, 0x84, 0x03, 0x2c,
+  0xf8, 0x93, 0x90, 0x61, 0x02, 0xd7, 0x4f, 0x4a, 0x16, 0xbc, 0x04, 0x43,
+  0xa2, 0x48, 0x8d, 0xea, 0xc0, 0x6c, 0x60, 0x8e, 0x29, 0x68, 0xe2, 0xbc,
+  0x1d, 0x59, 0xe2, 0x55, 0x08, 0x30, 0x88, 0x9c, 0xeb, 0xc4, 0xa2, 0x0a,
+  0x7d, 0xaa, 0xb5, 0x3f, 0xbf, 0xb8, 0x8e, 0xe2, 0xc9, 0x44, 0x81, 0x01,
+  0xb0, 0x2c, 0x01, 0x35, 0xd6, 0xcd, 0x05, 0x4b, 0xb2, 0xb8, 0x0a, 0xa5,
+  0x6e, 0x88, 0x3e, 0x72, 0x7d, 0x36, 0xd8, 0x44, 0x17, 0x16, 0x27, 0xc1,
+  0x0d, 0xce, 0x4f, 0xbb, 0x35, 0x5f, 0xb5, 0x9b, 0xfa, 0xb2, 0x81, 0x92,
+  0x32, 0xac, 0x50, 0xc4, 0x8e, 0x2c, 0xb4, 0x70, 0x33, 0x98, 0x54, 0x47,
+  0x47, 0xda, 0x91, 0x6a, 0xb0, 0x0e, 0x1d, 0x6d, 0x27, 0xd2, 0xa8, 0x29,
+  0xd9, 0xc5, 0xf3, 0x45, 0xf5, 0xe8, 0x17, 0x8b, 0x92, 0x6f, 0x03, 0x41,
+  0x58, 0x50, 0xe9, 0xe8, 0xa0, 0x59, 0x82, 0xcb, 0xa2, 0x25, 0x75, 0xfa,
+  0x3c, 0xec, 0x4e, 0x87, 0x46, 0xa5, 0x41, 0xe1, 0xef, 0x38, 0x26, 0x11,
+  0xed, 0x30, 0x09, 0xa5, 0xf7, 0xf3, 0x87, 0x9c, 0xc1, 0x23, 0x33, 0x3c,
+  0x4c, 0xcc, 0xd4, 0xa9, 0x29, 0x75, 0x20, 0x83, 0xc9, 0x8b, 0x74, 0x8a,
+  0x79, 0x02, 0xcd, 0xd2, 0x31, 0x3b, 0x11, 0xcf, 0x33, 0x85, 0xca, 0x58,
+  0x59, 0x75, 0x1c, 0x57, 0x42, 0xe5, 0x25, 0xe8, 0x53, 0xda, 0x68, 0xa1,
+  0x26, 0x8d, 0x4e, 0x07, 0xf9, 0x4f, 0x15, 0xd0, 0xe3, 0x59, 0xd9, 0x83,
+  0xd5, 0xa1, 0xdc, 0xb1, 0x41, 0x20, 0x2d, 0xfd, 0xd1, 0xbb, 0x44, 0x30,
+  0x38, 0xa7, 0x95, 0x32, 0x70, 0x0e, 0x1b, 0x35, 0x87, 0x63, 0xb8, 0x36,
+  0xe0, 0x08, 0x5a, 0xf5, 0xd1, 0xd9, 0xde, 0x79, 0xd9, 0xdf, 0x82, 0xff,
+  0x83, 0x43, 0x11, 0xfd, 0x88, 0xb0, 0xa2, 0x2c, 0x26, 0x90, 0x79, 0x32,
+  0x79, 0x68, 0x92, 0x24, 0x0b, 0xa0, 0xbc, 0x98, 0x76, 0x56, 0xd6, 0xb0,
+  0xd6, 0x44, 0x0a, 0x1e, 0xa4, 0x11, 0x27, 0xf1, 0x58, 0x7e, 0xa2, 0x77,
+  0xbc, 0x58, 0xce, 0x02, 0x69, 0x7d, 0x8e, 0x1b, 0x19, 0xb5, 0xb3, 0xd9,
+  0x9d, 0x38, 0x91, 0xdf, 0x21, 0x6f, 0xe2, 0x3a, 0xbe, 0x7e, 0x2d, 0x29,
+  0xea, 0x55, 0xcd, 0x27, 0x78, 0x2c, 0x26, 0x1b, 0x71, 0xe6, 0x1e, 0x5c,
+  0x86, 0xc3, 0x7c, 0x32, 0x29, 0x93, 0xaa, 0x29, 0x80, 0x8e, 0xe5, 0x91,
+  0xcd, 0x2b, 0x42, 0x37, 0x24, 0x4e, 0xa5, 0x15, 0x37, 0x51, 0x1d, 0x93,
+  0x27, 0x92, 0x2c, 0x34, 0x66, 0x5b, 0x3c, 0x5c, 0x3f, 0x50, 0x64, 0xe0,
+  0xfe, 0x5e, 0x33, 0x44, 0xb8, 0x24, 0x5e, 0x91, 0x5e, 0xa8, 0xdc, 0x8a,
+  0x41, 0x5c, 0x44, 0xd2, 0x35, 0x21, 0xd9, 0xf4, 0x4a, 0xdc, 0xa6, 0x8b,
+  0x05, 0x9a, 0x37, 0x0c, 0x6f, 0x46, 0x64, 0x6b, 0x02, 0x68, 0x14, 0xc7,
+  0x25, 0x52, 0xd6, 0x6c, 0x41, 0x50, 0x92, 0x47, 0x22, 0xf3, 0x87, 0xc9,
+  0xc4, 0x0f, 0x02, 0x71, 0x52, 0xa3, 0x8b, 0x69, 0x23, 0x35, 0xba, 0x63,
+  0xc4, 0xaf, 0xc9, 0x62, 0x65, 0x31, 0x13, 0x07, 0xed, 0x41, 0x8a, 0xff,
+  0xba, 0x81, 0xfb, 0x6f, 0x8b, 0xb3, 0x8c, 0x1f, 0x6e, 0x70, 0xfa, 0x3f,
+  0x4f, 0x2c, 0x02, 0x91, 0x81, 0xf8, 0xe1, 0x72, 0x97, 0x50, 0xf1, 0x10,
+  0xdc, 0xc2, 0xde, 0x31, 0x9c, 0x57, 0x87, 0xa6, 0x62, 0x53, 0x4d, 0xf2,
+  0x46, 0x39, 0x06, 0xd9, 0x3d, 0xa8, 0x49, 0x90, 0x36, 0xb4, 0x89, 0x45,
+  0xff, 0x9e, 0x68, 0x60, 0x80, 0x4a, 0xf6, 0x2f, 0xca, 0x1a, 0xe9, 0x76,
+  0x54, 0x52, 0x35, 0xe7, 0xd6, 0x9c, 0x88, 0xb2, 0xb8, 0x99, 0x66, 0xa8,
+  0x32, 0xb2, 0x02, 0xe3, 0x95, 0x64, 0x68, 0x1d, 0x2c, 0x43, 0x9d, 0x2c,
+  0xab, 0xdf, 0x31, 0x76, 0x52, 0x20, 0xfd, 0x12, 0x86, 0x9d, 0x43, 0xd4,
+  0x23, 0x26, 0x6a, 0x04, 0xea, 0xec, 0xfd, 0x0d, 0xac, 0xec, 0x43, 0x75,
+  0x53, 0xb4, 0xa1, 0x02, 0xa8, 0x53, 0x03, 0x8b, 0x28, 0xc8, 0x08, 0x23,
+  0xda, 0x30, 0xe0, 0x34, 0xba, 0xd5, 0x8c, 0xa9, 0x13, 0x93, 0x2e, 0x43,
+  0x28, 0xa0, 0xcd, 0x3b, 0x3f, 0x21, 0xc4, 0x1b, 0xa7, 0xfc, 0xdb, 0xd4,
+  0x4e, 0xf6, 0x31, 0x4a, 0x35, 0xe3, 0x11, 0x4a, 0x4e, 0xac, 0x94, 0x31,
+  0xd4, 0x68, 0x48, 0x3d, 0x99, 0x9b, 0x66, 0x3d, 0x2e, 0xae, 0xd6, 0x67,
+  0x29, 0x98, 0x86, 0x90, 0x6d, 0x42, 0x8e, 0x7c, 0x44, 0x6c, 0x86, 0x57,
+  0x92, 0x58, 0x41, 0x6a, 0x2d, 0x7d, 0x36, 0xe4, 0x46, 0x67, 0x5f, 0x24,
+  0x39, 0x10, 0xf9, 0xe3, 0xe8, 0x20, 0xbb, 0x05, 0xdd, 0x39, 0xeb, 0xe2,
+  0x4f, 0xa9, 0x10, 0xd5, 0x5c, 0x32, 0xf6, 0x6d, 0x54, 0x09, 0x07, 0x2d,
+  0x92, 0x80, 0x2e, 0xeb, 0x3c, 0x2b, 0x8f, 0x3a, 0x6e, 0x94, 0xf3, 0xa4,
+  0x92, 0xd4, 0x11, 0x9e, 0xbc, 0xd6, 0x66, 0x51, 0x7d, 0xd7, 0xe9, 0xa4,
+  0x31, 0x1c, 0x61, 0xc5, 0x25, 0x55, 0xbd, 0x5a, 0x5f, 0x62, 0xb8, 0x0c,
+  0x90, 0x85, 0xbe, 0xd0, 0x2e, 0x5c, 0x83, 0x8e, 0xfa, 0x65, 0x79, 0x05,
+  0xe1, 0xd4, 0x05, 0x9d, 0x0e, 0xba, 0x89, 0xaa, 0x71, 0x88, 0x26, 0x59,
+  0xf7, 0xd5, 0x0b, 0x29, 0xb8, 0x81, 0x6e, 0x3a, 0x04, 0x22, 0xa0, 0x51,
+  0xf4, 0xde, 0x7e, 0x4d, 0x13, 0x57, 0x02, 0x55, 0x85, 0x4e, 0x55, 0x29,
+  0xa6, 0xd0, 0x14, 0x63, 0xf5, 0x8c, 0xe8, 0x44, 0x81, 0x0b, 0x8b, 0x5d,
+  0x74, 0x1f, 0x13, 0xa5, 0x99, 0xf1, 0x43, 0xb5, 0x0f, 0x4e, 0xfe, 0x63,
+  0x6f, 0x68, 0xc9, 0xd9, 0x62, 0xe7, 0x04, 0xd3, 0x94, 0xe4, 0x21, 0xa4,
+  0x79, 0x10, 0x2c, 0x6b, 0x95, 0x53, 0x5c, 0x4a, 0x70, 0x34, 0x66, 0x53,
+  0x78, 0x0b, 0xef, 0x6f, 0xf2, 0x59, 0x12, 0x0a, 0x91, 0x38, 0x25, 0xbf,
+  0x84, 0xec, 0x82, 0x69, 0xbd, 0xe4, 0x6d, 0xbe, 0xa3, 0x8c, 0xe1, 0x5a,
+  0xe8, 0x04, 0xf4, 0xbb, 0x24, 0xc6, 0x82, 0x23, 0x93, 0x34, 0x7f, 0xd7,
+  0xf5, 0xd2, 0xd8, 0xe1, 0x9e, 0x0f, 0xf3, 0xd2, 0xd0, 0x0b, 0x16, 0xd6,
+  0xa2, 0x04, 0xb9, 0x8f, 0x0b, 0x62, 0xcc, 0x02, 0x91, 0xa5, 0xe8, 0xa1,
+  0x6e, 0xce, 0x20, 0xaa, 0x82, 0xcd, 0x7a, 0x87, 0x14, 0x8b, 0xd1, 0x81,
+  0x4c, 0x40, 0x01, 0x40, 0x37, 0x2d, 0xd1, 0x0e, 0x0e, 0x29, 0xe0, 0x57,
+  0x37, 0x84, 0x83, 0x2b, 0x15, 0xeb, 0x70, 0x0f, 0x6f, 0x50, 0xa6, 0xa7,
+  0xd5, 0x32, 0xae, 0x9e, 0x97, 0xb0, 0xdd, 0xc6, 0x9b, 0x98, 0x39, 0xb9,
+  0xf9, 0xa8, 0x6d, 0x98, 0x0d, 0x2d, 0x51, 0x44, 0xf7, 0x20, 0x0f, 0xf1,
+  0xae, 0xfd, 0xd7, 0x13, 0x8c, 0xe9, 0x92, 0xe0, 0xfc, 0x6e, 0xea, 0x78,
+  0x50, 0x54, 0x93, 0x2b, 0xf2, 0x44, 0x2b, 0xdf, 0x78, 0x4c, 0x15, 0xf7,
+  0xa7, 0x81, 0x40, 0x3f, 0x45, 0xc7, 0x60, 0x3a, 0xb3, 0x47, 0x3b, 0xa0,
+  0x53, 0x32, 0xab, 0x19, 0xde, 0x0e, 0x56, 0x9e, 0xf9, 0x82, 0x97, 0xb5,
+  0xd4, 0x19, 0x80, 0x0a, 0xce, 0xdf, 0x3c, 0xe8, 0x28, 0xf4, 0xa8, 0xc1,
+  0x52, 0x12, 0x2e, 0x22, 0x45, 0x5b, 0x5a, 0xff, 0xa1, 0xbe, 0x7a, 0xbc,
+  0xfe, 0xcd, 0xe1, 0x10, 0x87, 0x7b, 0xfb, 0xf5, 0x77, 0x47, 0x67, 0x1f,
+  0x4e, 0xb6, 0xbf, 0x88, 0xf0, 0x5f, 0x3b, 0xfc, 0xaf, 0x9d, 0x4e, 0xe8,
+  0xb8, 0x80, 0x51, 0xad, 0xbd, 0x5e, 0x8b, 0xca, 0xc7, 0xf9, 0x30, 0x9f,
+  0x99, 0x03, 0x93, 0xad, 0xd0, 0x40, 0x5a, 0x57, 0xa4, 0xb8, 0x29, 0xdd,
+  0x16, 0x57, 0x79, 0x93, 0x65, 0x97, 0x92, 0x74, 0xa8, 0xec, 0x86, 0x22,
+  0x78, 0x6e, 0x2d, 0x71, 0x45, 0x95, 0xd6, 0xca, 0xc3, 0x24, 0x96, 0xd7,
+  0x96, 0x08, 0x4a, 0x42, 0x49, 0x2f, 0x76, 0x19, 0xe0, 0x1c, 0x2c, 0x5e,
+  0x2c, 0x9e, 0xb3, 0xcb, 0x30, 0xfc, 0x6c, 0x33, 0xe0, 0x4e, 0x74, 0xa5,
+  0x0c, 0xe8, 0x34, 0xbf, 0x2e, 0x06, 0x02, 0xa2, 0x71, 0x3c, 0x0a, 0xfe,
+  0xc0, 0x5a, 0x91, 0x18, 0xd6, 0x4b, 0xab, 0xc6, 0x77, 0x9b, 0xc3, 0x0d,
+  0x45, 0x77, 0x71, 0x70, 0xb9, 0xce, 0x10, 0x0a, 0xac, 0xa7, 0xe9, 0x19,
+  0xd6, 0xd5, 0x81, 0xc6, 0xe8, 0x18, 0x35, 0x6b, 0xf5, 0x67, 0x44, 0x0e,
+  0xf2, 0xb3, 0xc1, 0x90, 0x14, 0x10, 0xc6, 0xa8, 0x16, 0x12, 0x64, 0x5f,
+  0xb3, 0x0f, 0xbd, 0xc2, 0x28, 0x30, 0xb0, 0x39, 0x94, 0x6e, 0x32, 0xf7,
+  0xb2, 0xb3, 0x32, 0xd0, 0x24, 0xd7, 0x81, 0xbd, 0x6f, 0xb8, 0x98, 0x20,
+  0x7a, 0x7c, 0xe2, 0x96, 0xa8, 0x4c, 0x44, 0xb5, 0x25, 0x56, 0x70, 0x7d,
+  0x53, 0x13, 0x34, 0xaa, 0xf2, 0x69, 0x81, 0x33, 0xc7, 0x67, 0x45, 0x72,
+  0xf0, 0x30, 0x4c, 0xa6, 0x98, 0xbd, 0x39, 0x73, 0xc0, 0x9c, 0xd4, 0x8a,
+  0xc6, 0xbb, 0xa6, 0x70, 0x18, 0x18, 0xe8, 0x37, 0x84, 0x0f, 0xdf, 0x7f,
+  0x9c, 0x25, 0x1b, 0x6a, 0x18, 0xa8, 0xb0, 0xdb, 0x7c, 0x9f, 0xff, 0x0c,
+  0xf3, 0x8e, 0xe5, 0x23, 0x21, 0x99, 0x29, 0x22, 0xb0, 0x75, 0xe6, 0x96,
+  0xbf, 0x70, 0x99, 0xb8, 0xcb, 0x35, 0x6a, 0xb6, 0x31, 0x05, 0x81, 0x51,
+  0x2f, 0xa3, 0x54, 0x6d, 0x8f, 0x74, 0x44, 0xbb, 0xf0, 0x24, 0xb4, 0x83,
+  0x37, 0x03, 0xa4, 0x9c, 0x4b, 0x86, 0x8e, 0x21, 0x31, 0x11, 0x3b, 0x4d,
+  0x16, 0xde, 0xd4, 0xa9, 0x5a, 0x04, 0xd1, 0xc9, 0x43, 0x52, 0x8c, 0x10,
+  0x6a, 0x62, 0x04, 0x7a, 0x29, 0xf1, 0xd3, 0x89, 0xb8, 0xa7, 0x30, 0x97,
+  0x4a, 0xb2, 0xe2, 0xeb, 0xb8, 0x30, 0x24, 0x7e, 0x95, 0xce, 0x5a, 0x49,
+  0x8c, 0x72, 0x1f, 0x46, 0x40, 0x18, 0x7d, 0x83, 0x7f, 0xa7, 0x02, 0xb2,
+  0xce, 0x3e, 0xb4, 0xc8, 0x8c, 0xc2, 0x09, 0x5e, 0xc6, 0x1e, 0xed, 0xb0,
+  0xbe, 0xe8, 0x9c, 0xa6, 0x90, 0x0b, 0xcd, 0x85, 0xd1, 0xcc, 0x6c, 0x74,
+  0x08, 0xa1, 0x02, 0x08, 0x14, 0xaa, 0x3d, 0x3d, 0xd1, 0x9c, 0x0e, 0xe1,
+  0x77, 0x50, 0xb4, 0x24, 0x7b, 0x54, 0x28, 0xa9, 0x75, 0x12, 0x9b, 0xac,
+  0x1c, 0x2a, 0xe0, 0x20, 0x69, 0x5e, 0x7e, 0x31, 0xf2, 0x2c, 0xbf, 0xc7,
+  0x18, 0x4c, 0x1d, 0xfe, 0x53, 0xc1, 0x7e, 0x38, 0xa7, 0x8e, 0xf9, 0x72,
+  0x0f, 0x75, 0x25, 0xfe, 0x6c, 0x5f, 0xa3, 0xb5, 0x41, 0x0a, 0xd0, 0x72,
+  0xda, 0x66, 0x25, 0x52, 0x6c, 0x33, 0x28, 0x2a, 0x76, 0x26, 0xb3, 0x7e,
+  0x61, 0xd1, 0xb7, 0x42, 0x82, 0x8d, 0x56, 0x3c, 0xcc, 0xab, 0x1b, 0x27,
+  0x0f, 0x15, 0x11, 0xfd, 0xd0, 0xcf, 0x33, 0x59, 0x56, 0x64, 0x04, 0xa8,
+  0x19, 0x58, 0x49, 0xaa, 0xb1, 0x38, 0x8b, 0xbc, 0xac, 0x87, 0x5b, 0x44,
+  0x7e, 0xc3, 0x25, 0x1a, 0xf4, 0x5a, 0x4c, 0xa0, 0xcd, 0x28, 0x53, 0x1c,
+  0xe9, 0x12, 0x0c, 0x60, 0x02, 0x17, 0x84, 0x6f, 0x62, 0xa2, 0x52, 0x59,
+  0x22, 0x90, 0x1c, 0xa5, 0xa4, 0xc2, 0xc6, 0x7a, 0x90, 0x13, 0x04, 0x92,
+  0x94, 0xb9, 0x47, 0xba, 0xce, 0xf0, 0x37, 0x16, 0xb8, 0x89, 0x71, 0x31,
+  0xd0, 0x6a, 0x1f, 0xca, 0xd1, 0x94, 0x74, 0x7f, 0x91, 0x1e, 0x02, 0x4e,
+  0x11, 0xa3, 0xbf, 0xb6, 0x5c, 0xd8, 0x7f, 0xd9, 0xa8, 0xf1, 0x8c, 0xbc,
+  0xa2, 0x64, 0xf4, 0x5c, 0xc2, 0x1f, 0x36, 0x89, 0xf1, 0xb4, 0xdd, 0x3e,
+  0xe3, 0x8a, 0x6d, 0xfc, 0x2d, 0x14, 0xe7, 0x5d, 0x2e, 0xc6, 0xa4, 0xf6,
+  0xe9, 0x3b, 0xa4, 0x28, 0x39, 0x28, 0x98, 0x65, 0x2e, 0xb7, 0x91, 0x86,
+  0x47, 0x26, 0x63, 0xb9, 0x4c, 0x08, 0x24, 0xa7, 0x79, 0xff, 0xdd, 0x00,
+  0x4b, 0x0d, 0xa6, 0x8d, 0x7d, 0x38, 0x73, 0x97, 0x37, 0xc0, 0x8b, 0x24,
+  0x7c, 0x7b, 0x40, 0xfb, 0x65, 0x28, 0x50, 0xa9, 0x02, 0x1c, 0x38, 0xfc,
+  0xdf, 0x96, 0xd9, 0xa8, 0x21, 0xa3, 0xf2, 0xae, 0x03, 0xc6, 0x29, 0x51,
+  0x59, 0x23, 0x21, 0x9a, 0x44, 0x4f, 0x1f, 0x12, 0xf8, 0x1b, 0xac, 0x08,
+  0xc5, 0xea, 0x0d, 0x14, 0x6f, 0x33, 0xa7, 0x84, 0xf6, 0x26, 0x85, 0x13,
+  0x2a, 0x46, 0x37, 0x84, 0x24, 0x40, 0x7e, 0xa4, 0x44, 0x9d, 0xa3, 0x9e,
+  0x22, 0x2c, 0x9e, 0x7f, 0x1a, 0x56, 0x74, 0xb1, 0x14, 0xd9, 0x11, 0xa2,
+  0x85, 0xe4, 0x99, 0x32, 0xe9, 0xb6, 0x79, 0xfa, 0x99, 0x5d, 0x37, 0xb8,
+  0xe7, 0xc9, 0xac, 0xb4, 0x02, 0xd2, 0xbc, 0x63, 0x25, 0x25, 0x19, 0xe1,
+  0x19, 0xf9, 0x64, 0x59, 0x14, 0xa7, 0xc1, 0x1b, 0x4e, 0x33, 0x01, 0x35,
+  0x47, 0x26, 0x83, 0x76, 0x25, 0xd2, 0xc9, 0xa3, 0x62, 0xcc, 0xc8, 0x08,
+  0x4d, 0x98, 0x19, 0x4f, 0xf2, 0xe4, 0x66, 0xdf, 0x04, 0xc0, 0x46, 0xb7,
+  0x2a, 0x55, 0xb0, 0x75, 0x26, 0x15, 0x74, 0x64, 0x60, 0xf9, 0x34, 0x35,
+  0x01, 0xc1, 0xf8, 0x57, 0xaf, 0x37, 0xa9, 0xbc, 0x74, 0x2d, 0xe7, 0xac,
+  0xeb, 0x24, 0x30, 0x9b, 0x08, 0x46, 0xcf, 0x7b, 0x85, 0xe2, 0xbb, 0xc3,
+  0x1a, 0x9e, 0xe8, 0xec, 0x2d, 0x7b, 0xf1, 0x8e, 0xaf, 0xf0, 0x6f, 0xa9,
+  0x41, 0x28, 0xa2, 0x3a, 0x5c, 0xea, 0xea, 0xc1, 0x09, 0xb2, 0xef, 0xbf,
+  0x6b, 0x96, 0x61, 0xae, 0x5f, 0x0c, 0x36, 0x77, 0x5f, 0x6d, 0x6d, 0x04,
+  0x72, 0x96, 0xe1, 0x1b, 0x2e, 0x48, 0xe1, 0xde, 0x56, 0x7f, 0x6b, 0xa3,
+  0x31, 0x1b, 0xdc, 0xee, 0x15, 0x00, 0x2a, 0x0a, 0xad, 0x6e, 0x84, 0x06,
+  0x25, 0x23, 0xdb, 0x62, 0x2d, 0xc9, 0x9b, 0x76, 0x8b, 0x49, 0xaf, 0x92,
+  0x3b, 0x20, 0xb5, 0x60, 0xfe, 0xda, 0x59, 0x5a, 0x8a, 0x61, 0x83, 0x92,
+  0x4c, 0x65, 0x0b, 0x56, 0x6b, 0xd7, 0x73, 0x82, 0xe9, 0x11, 0x14, 0x96,
+  0x9c, 0xeb, 0x10, 0x88, 0xb6, 0x94, 0x30, 0xa9, 0x82, 0x12, 0xf3, 0x28,
+  0xa6, 0xff, 0xc9, 0x9d, 0x2d, 0x47, 0x35, 0xa8, 0xc7, 0x97, 0xee, 0x99,
+  0xa2, 0xa6, 0xdf, 0x8b, 0xcb, 0x51, 0x9a, 0xb2, 0x3d, 0xd3, 0x62, 0xc6,
+  0x68, 0xc6, 0x23, 0x61, 0xc8, 0x51, 0x25, 0x75, 0x1a, 0x73, 0xa8, 0xd6,
+  0xa2, 0x94, 0x7a, 0xc3, 0xa2, 0xb2, 0x0a, 0x24, 0xb6, 0x6a, 0x5c, 0xb1,
+  0xe1, 0xb1, 0x53, 0x8b, 0x00, 0x2b, 0x1b, 0xfd, 0xb2, 0x6c, 0xaa, 0x51,
+  0x70, 0x17, 0x18, 0xae, 0x2c, 0x00, 0x36, 0x88, 0x7c, 0x82, 0x33, 0x9e,
+  0xe3, 0xaa, 0xcc, 0x71, 0x9f, 0x42, 0x9b, 0x4a, 0x1e, 0x0a, 0x82, 0xa6,
+  0x35, 0x06, 0x94, 0xb9, 0xfb, 0x92, 0x0f, 0xf4, 0x55, 0xd7, 0xa6, 0xeb,
+  0xd4, 0x0c, 0xa0, 0x38, 0xa0, 0x08, 0x32, 0xb2, 0x7e, 0x44, 0xe1, 0x71,
+  0xae, 0xa4, 0xc2, 0x85, 0x48, 0x7f, 0x09, 0x72, 0x7b, 0x70, 0x8e, 0x88,
+  0x74, 0x97, 0x40, 0x18, 0x22, 0xb3, 0x5b, 0x01, 0x70, 0xa9, 0x2e, 0xac,
+  0x8f, 0x70, 0x3b, 0x89, 0x82, 0xb2, 0xe4, 0x1e, 0xb9, 0x71, 0x29, 0xaa,
+  0x44, 0x51, 0xa4, 0xe8, 0x37, 0x32, 0xc9, 0x05, 0xac, 0x8e, 0x61, 0x16,
+  0x26, 0x0a, 0xe7, 0x71, 0xa0, 0xb6, 0x7b, 0x44, 0xb7, 0xb3, 0x34, 0x39,
+  0xdb, 0x19, 0x61, 0x4f, 0x22, 0xbe, 0x9c, 0xb7, 0x37, 0xd4, 0x1c, 0x80,
+  0x26, 0xa7, 0x88, 0xb3, 0x55, 0x3d, 0xfd, 0x03, 0xb5, 0x76, 0xce, 0x6f,
+  0x66, 0x78, 0xb3, 0xbc, 0x66, 0x60, 0x96, 0xed, 0xe1, 0x92, 0xcd, 0x87,
+  0xde, 0xfd, 0xfd, 0x7d, 0x0f, 0x2f, 0x1c, 0xe6, 0xe4, 0x48, 0x99, 0x45,
+  0xbf, 0x86, 0x1c, 0x4d, 0x76, 0x25, 0x9b, 0x9c, 0xc8, 0x44, 0xfc, 0xf8,
+  0x86, 0x93, 0x22, 0x55, 0x0c, 0xd3, 0x8a, 0xea, 0xf9, 0x84, 0xb8, 0xe8,
+  0x35, 0xa9, 0xab, 0x93, 0xe9, 0x90, 0x86, 0xa3, 0x8e, 0xa8, 0xc0, 0xed,
+  0xb3, 0x6b, 0x41, 0xf8, 0xa9, 0x51, 0x95, 0x60, 0xfd, 0x3a, 0x7c, 0x62,
+  0x7e, 0x10, 0xf5, 0xde, 0x45, 0x9d, 0x63, 0x59, 0xed, 0x35, 0x3c, 0x71,
+  0x50, 0x5f, 0x0b, 0x3f, 0xec, 0x07, 0x73, 0xe0, 0xdd, 0xce, 0xf3, 0xe0,
+  0x13, 0x5b, 0x2f, 0x32, 0xb5, 0x56, 0xb1, 0x59, 0x33, 0x55, 0xc0, 0x59,
+  0x87, 0x69, 0x2f, 0xec, 0xd6, 0x62, 0xcc, 0x33, 0x5a, 0x7a, 0x5c, 0x4a,
+  0x1b, 0x9e, 0x21, 0xdf, 0xf0, 0x15, 0xd7, 0xb1, 0x88, 0xef, 0x9f, 0xbe,
+  0xe3, 0xce, 0x4d, 0x14, 0xea, 0x9d, 0x91, 0xab, 0xcb, 0x01, 0x23, 0x46,
+  0xff, 0x8e, 0x49, 0xc2, 0x0c, 0xcc, 0x54, 0x9a, 0x60, 0xd8, 0x62, 0x2a,
+  0x36, 0x4c, 0x45, 0x2f, 0xfd, 0x6a, 0x45, 0x1d, 0x9a, 0x75, 0x0a, 0xdb,
+  0x55, 0xd4, 0x22, 0x1f, 0x0d, 0x4c, 0x53, 0x5a, 0x96, 0xa1, 0xaa, 0x67,
+  0x30, 0x1a, 0xbb, 0xba, 0xae, 0xb9, 0x9c, 0x42, 0xcb, 0xec, 0xd8, 0x73,
+  0x96, 0x29, 0xf0, 0xb7, 0xa1, 0xf4, 0x4e, 0x8e, 0x73, 0xe0, 0x55, 0x55,
+  0x80, 0x32, 0x71, 0x59, 0x25, 0x05, 0x12, 0x3a, 0x65, 0xc1, 0xf7, 0x34,
+  0x85, 0x39, 0x24, 0xac, 0x81, 0xa1, 0x1c, 0x7f, 0x73, 0x4a, 0xd9, 0xdc,
+  0xc0, 0x48, 0x33, 0x01, 0x71, 0xe0, 0xf9, 0x73, 0xbf, 0x23, 0x63, 0xd4,
+  0x4e, 0x91, 0x95, 0x70, 0x49, 0x64, 0x1c, 0x85, 0x00, 0x50, 0xd5, 0xe6,
+  0x88, 0xd4, 0xb8, 0x90, 0xa4, 0x55, 0xb1, 0x11, 0xe4, 0xf2, 0x9a, 0xf0,
+  0x6e, 0x6c, 0x4b, 0x04, 0x82, 0xfb, 0x45, 0x5f, 0x57, 0xb0, 0x91, 0xb8,
+  0x94, 0x08, 0x2e, 0x29, 0x6b, 0x5e, 0xfa, 0xb8, 0xa5, 0x57, 0xee, 0x1f,
+  0x95, 0xf8, 0x79, 0x6f, 0xf2, 0xf9, 0x70, 0x7b, 0x37, 0x3a, 0x93, 0x86,
+  0x27, 0xc5, 0x6c, 0x5d, 0xe2, 0x7a, 0x0c, 0xb8, 0x16, 0x0b, 0x7d, 0x69,
+  0x21, 0xcf, 0xad, 0x49, 0x8c, 0x04, 0x66, 0xfc, 0x1f, 0x28, 0xa1, 0x48,
+  0xee, 0x02, 0xcf, 0x43, 0xcd, 0x43, 0xeb, 0x25, 0xdd, 0xd1, 0x14, 0xca,
+  0x4f, 0x12, 0x62, 0xc3, 0xc3, 0xa1, 0xfd, 0xf7, 0x1a, 0xb5, 0xa5, 0xaf,
+  0xc4, 0x51, 0x85, 0x79, 0xf0, 0xa5, 0x63, 0x8d, 0x48, 0xb1, 0x2c, 0xcd,
+  0x5d, 0x6b, 0x84, 0x70, 0x1b, 0xc2, 0xc3, 0x71, 0x84, 0xd3, 0xd9, 0x3d,
+  0xa6, 0x38, 0xc4, 0x9c, 0x2f, 0xb9, 0x87, 0xd8, 0x1f, 0x9a, 0x9b, 0xf7,
+  0xfa, 0xe9, 0xdd, 0xfb, 0xa5, 0xdb, 0xb7, 0x7a, 0xf7, 0xb8, 0x77, 0x83,
+  0x26, 0xcb, 0xbe, 0x76, 0x1c, 0x74, 0x94, 0xec, 0xc1, 0xd6, 0x97, 0x71,
+  0xd4, 0xd5, 0xb9, 0x8c, 0x63, 0x64, 0xbe, 0xfe, 0xad, 0x4e, 0x9d, 0x88,
+  0x91, 0x2c, 0x7a, 0x9c, 0x7c, 0x78, 0x38, 0x0e, 0x2b, 0xd2, 0xd9, 0xbb,
+  0xd8, 0x8b, 0xa2, 0x87, 0xd3, 0x08, 0x02, 0x5e, 0x3c, 0xaa, 0x98, 0x98,
+  0x87, 0x94, 0xe6, 0xd9, 0x0b, 0x0f, 0xa7, 0x85, 0x80, 0xa2, 0x88, 0x7b,
+  0xeb, 0xfb, 0x4a, 0x05, 0xff, 0xf3, 0x17, 0x47, 0x69, 0x45, 0xb6, 0x5f,
+  0xa0, 0x9b, 0x11, 0xc2, 0x21, 0x98, 0x75, 0xdf, 0x6f, 0xa8, 0xd7, 0x47,
+  0x60, 0x20, 0xb9, 0x7f, 0x94, 0xaa, 0x04, 0x1b, 0xdd, 0xfa, 0x86, 0x21,
+  0xd4, 0x1d, 0x09, 0x03, 0x3d, 0xe5, 0xb4, 0xf5, 0x8c, 0xf5, 0xec, 0xb0,
+  0x27, 0x43, 0xf0, 0xec, 0xfe, 0x6f, 0x5a, 0x1f, 0xd1, 0xb3, 0x25, 0x03,
+  0x8c, 0x30, 0x94, 0x0c, 0xe0, 0x4d, 0x49, 0xf7, 0x11, 0x55, 0x2b, 0xa0,
+  0x88, 0x6f, 0x99, 0x1d, 0xa1, 0x0f, 0xa0, 0x52, 0x84, 0xf1, 0xd6, 0x99,
+  0xc0, 0x85, 0x32, 0xc6, 0xfb, 0x6b, 0xab, 0xcc, 0xf4, 0x70, 0x91, 0x3d,
+  0x21, 0xd9, 0x3e, 0x11, 0xe1, 0x0a, 0x4a, 0x35, 0x94, 0x19, 0x26, 0x4a,
+  0x8f, 0xfc, 0xda, 0x45, 0xa3, 0xe2, 0xab, 0x8a, 0x6c, 0xaf, 0x49, 0xca,
+  0xed, 0xcf, 0x6b, 0x92, 0xd2, 0xbe, 0xb3, 0x4a, 0x46, 0x0e, 0x12, 0x4e,
+  0x48, 0x73, 0x1d, 0x98, 0xf4, 0x12, 0x57, 0x59, 0x63, 0x17, 0x0f, 0x3f,
+  0xb5, 0x09, 0x5f, 0xf5, 0x8a, 0x8e, 0x39, 0xb7, 0xc8, 0xa9, 0x9d, 0xa4,
+  0x04, 0x73, 0x8c, 0x9a, 0x89, 0x75, 0x14, 0x0d, 0x8b, 0xfc, 0xbe, 0x24,
+  0x75, 0x54, 0x0d, 0xd4, 0x98, 0x53, 0x60, 0x6f, 0xbc, 0x92, 0x68, 0xd8,
+  0xde, 0x99, 0xc1, 0x81, 0x7d, 0x77, 0xfd, 0xfe, 0x8c, 0xbb, 0x3a, 0x70,
+  0x75, 0x2e, 0x16, 0x21, 0xc9, 0x9c, 0x97, 0xc3, 0x39, 0x58, 0xd2, 0xa0,
+  0x9d, 0x54, 0xcc, 0xca, 0x94, 0x3b, 0x7a, 0x25, 0xc4, 0x14, 0xd2, 0x93,
+  0x80, 0xf0, 0x22, 0x14, 0x9f, 0x11, 0x45, 0xd2, 0xc1, 0xa1, 0x72, 0x34,
+  0xe0, 0x5f, 0xae, 0xeb, 0x82, 0x9d, 0x4c, 0x19, 0x31, 0xa4, 0x47, 0xbd,
+  0xc5, 0xa3, 0xc0, 0x47, 0xbc, 0xdb, 0xe7, 0xa8, 0x69, 0xd4, 0x7c, 0x8c,
+  0x20, 0xa5, 0x8d, 0x87, 0x06, 0xb5, 0x2e, 0xd3, 0x79, 0x84, 0x50, 0xb3,
+  0xe2, 0xba, 0xa6, 0xe5, 0x95, 0xd5, 0x1a, 0xcd, 0xcb, 0xf6, 0x10, 0x71,
+  0x95, 0x2f, 0xd4, 0x43, 0x50, 0x1f, 0x92, 0x40, 0xd2, 0xb2, 0x40, 0x67,
+  0x1e, 0x6b, 0xd5, 0xdd, 0x40, 0xce, 0xbd, 0x28, 0x24, 0xea, 0xcd, 0x37,
+  0xa1, 0xcd, 0x9a, 0xa9, 0xa7, 0xcd, 0x12, 0x70, 0x6c, 0xe7, 0x06, 0x07,
+  0x94, 0x44, 0x46, 0xa8, 0xa2, 0x62, 0x0a, 0x3a, 0x4d, 0x20, 0x36, 0x18,
+  0x9d, 0x7a, 0x81, 0xc5, 0xe4, 0x1c, 0xf7, 0xd4, 0xbb, 0xa0, 0x82, 0x6d,
+  0x3b, 0x89, 0x94, 0xb6, 0x79, 0x84, 0xda, 0xcb, 0x04, 0xd4, 0x45, 0xd0,
+  0x5c, 0xd4, 0x3d, 0x22, 0xaf, 0xfb, 0xbb, 0x7c, 0xff, 0xa3, 0xf8, 0xbf,
+  0xba, 0x4e, 0x78, 0x2d, 0x45, 0x0f, 0x94, 0x1b, 0x2f, 0xb4, 0x91, 0xf5,
+  0x79, 0x52, 0x4c, 0xb9, 0x0c, 0x81, 0x21, 0x61, 0x83, 0x28, 0x16, 0x71,
+  0xe4, 0xa0, 0xb4, 0x45, 0xd1, 0xff, 0xe8, 0xb1, 0x44, 0x25, 0x57, 0xd5,
+  0x12, 0xeb, 0x5f, 0xc4, 0x9f, 0xbe, 0xd6, 0x1b, 0x33, 0x5b, 0x19, 0xc7,
+  0x19, 0xec, 0x04, 0xdc, 0x58, 0x3f, 0x3f, 0x66, 0x36, 0x7b, 0x3d, 0xcb,
+  0x97, 0xe5, 0xe3, 0x5a, 0x24, 0x8d, 0x7c, 0xa4, 0xf7, 0x45, 0x25, 0xb9,
+  0x3c, 0x78, 0x96, 0x70, 0xbe, 0xcb, 0xec, 0x56, 0x85, 0x22, 0x56, 0x2a,
+  0x94, 0xec, 0xa8, 0x6d, 0x0c, 0xb7, 0xe6, 0x7c, 0xec, 0x7f, 0xb8, 0x63,
+  0x07, 0x77, 0x99, 0xdc, 0xff, 0x6c, 0x38, 0x3f, 0xcf, 0x72, 0xb6, 0x21,
+  0x99, 0x90, 0xd9, 0x1c, 0xd5, 0x22, 0x75, 0x66, 0x40, 0x14, 0x1e, 0x0c,
+  0xc3, 0xab, 0x21, 0x07, 0x9b, 0xba, 0x41, 0xfc, 0xa6, 0xa5, 0xf8, 0xc4,
+  0x4a, 0x1e, 0x0e, 0x28, 0x59, 0xe4, 0x3c, 0x86, 0x30, 0x31, 0x8d, 0x6f,
+  0xdc, 0x12, 0xb8, 0x7e, 0x74, 0x09, 0xfb, 0xe5, 0x41, 0x4d, 0x60, 0x24,
+  0xdb, 0x0c, 0x17, 0xd7, 0x40, 0x4f, 0x27, 0x79, 0x3e, 0x8c, 0x8b, 0x35,
+  0xd9, 0x7b, 0x42, 0x55, 0x87, 0x01, 0xc7, 0xec, 0x7c, 0xc1, 0xb3, 0xee,
+  0x8d, 0xbb, 0xc1, 0x1b, 0x8d, 0x3a, 0x03, 0xbd, 0xdb, 0xd7, 0xa2, 0x0e,
+  0xfd, 0x39, 0x06, 0xc8, 0xf3, 0xd9, 0xd8, 0x6c, 0x85, 0xfb, 0xd5, 0xc0,
+  0xa1, 0x51, 0x6d, 0x82, 0x75, 0x05, 0xa8, 0x27, 0x80, 0xca, 0x5b, 0xd4,
+  0x59, 0x60, 0x9c, 0xfa, 0x88, 0xe2, 0x8e, 0xb0, 0x21, 0x98, 0x38, 0x11,
+  0x86, 0x6d, 0x91, 0x20, 0x89, 0x31, 0xc1, 0x1d, 0xe6, 0x80, 0x33, 0x0a,
+  0xf1, 0x18, 0xcb, 0x53, 0x7c, 0x87, 0xbb, 0xcb, 0xbe, 0x24, 0x5b, 0x75,
+  0x45, 0xa6, 0x9b, 0xcb, 0x35, 0x1c, 0x39, 0x66, 0x8d, 0xb9, 0xa6, 0x70,
+  0x5b, 0xe1, 0xda, 0xb5, 0xb8, 0xb8, 0xc4, 0x5e, 0x85, 0xbf, 0xb2, 0x13,
+  0xa4, 0x77, 0xaa, 0x59, 0x74, 0xfc, 0xcf, 0x6b, 0x42, 0x6c, 0x26, 0xe7,
+  0x64, 0x2f, 0x40, 0x9a, 0x35, 0xeb, 0x32, 0x99, 0x25, 0x53, 0x5e, 0xed,
+  0xe1, 0xd9, 0xc9, 0x77, 0x27, 0x67, 0x9e, 0xd8, 0xfc, 0x66, 0x30, 0xd8,
+  0xbc, 0x4d, 0x8a, 0x21, 0x75, 0x64, 0xc5, 0xc0, 0x45, 0x44, 0xcf, 0x99,
+  0x04, 0x2f, 0x47, 0x96, 0xdc, 0x5b, 0xc8, 0x16, 0x49, 0xf4, 0xf6, 0x7c,
+  0x36, 0x98, 0xc1, 0xcb, 0x9f, 0x14, 0x98, 0x77, 0x2a, 0x39, 0x92, 0x5c,
+  0x42, 0x92, 0x8d, 0xa3, 0x22, 0x19, 0x73, 0xc3, 0x52, 0x3f, 0x8b, 0x90,
+  0x90, 0x3d, 0xa2, 0xe8, 0x0d, 0x1d, 0x2a, 0x67, 0x92, 0x53, 0x00, 0xcb,
+  0x2c, 0xc2, 0x7b, 0x63, 0x41, 0xd5, 0xf3, 0xd1, 0x1b, 0xf9, 0xa6, 0xd4,
+  0xa3, 0xe2, 0x2e, 0x31, 0xb0, 0x1b, 0x5b, 0x29, 0x17, 0xdf, 0xf6, 0x8e,
+  0x06, 0xbd, 0x37, 0x27, 0x67, 0x27, 0xdf, 0x1c, 0x5d, 0x9f, 0x18, 0x3c,
+  0xf3, 0x32, 0x69, 0x51, 0xc1, 0x44, 0xff, 0xfa, 0x56, 0xb6, 0x85, 0xd6,
+  0x8f, 0x58, 0xf8, 0x55, 0xca, 0xdd, 0x58, 0x14, 0xf2, 0x9f, 0xdb, 0x6a,
+  0xa3, 0x55, 0x54, 0x71, 0x9e, 0x60, 0x78, 0x38, 0xb8, 0x17, 0xb3, 0xb9,
+  0x4c, 0xd5, 0x5b, 0x41, 0x3c, 0xbb, 0xc7, 0xae, 0x6c, 0x1f, 0x32, 0x4c,
+  0xa5, 0x4f, 0x4d, 0x29, 0x29, 0xaf, 0xde, 0xf5, 0x08, 0xd9, 0x9d, 0xad,
+  0x1d, 0x30, 0x21, 0xd3, 0xb7, 0xf8, 0x0b, 0xb4, 0x0c, 0x9c, 0xe2, 0xc7,
+  0x6f, 0xe8, 0xc9, 0x06, 0xc6, 0xb8, 0x85, 0x46, 0x47, 0x06, 0x23, 0xbf,
+  0x0a, 0x00, 0x96, 0x20, 0x01, 0x95, 0xa3, 0x9b, 0x64, 0x2e, 0xaa, 0x2c,
+  0xa6, 0x26, 0x50, 0x10, 0x9c, 0x6b, 0x2a, 0x05, 0x2f, 0x88, 0x53, 0xc8,
+  0x86, 0x09, 0x43, 0x2e, 0x10, 0x46, 0x1a, 0xd2, 0x75, 0x28, 0xd5, 0xf7,
+  0x1e, 0x3b, 0x0e, 0x60, 0xac, 0x05, 0xd3, 0x76, 0xa8, 0xc0, 0xb8, 0x4f,
+  0x09, 0x86, 0x4e, 0xde, 0x80, 0x9f, 0x27, 0xc0, 0xad, 0x03, 0x9b, 0x77,
+  0xd6, 0x00, 0x98, 0x1b, 0xb4, 0xf5, 0x9c, 0x5c, 0x67, 0xf4, 0x23, 0x6e,
+  0x5e, 0x22, 0x3a, 0x37, 0x4e, 0xf2, 0x57, 0x3a, 0xaa, 0xa5, 0x3c, 0x41,
+  0xca, 0x0d, 0xd1, 0x8d, 0x45, 0x66, 0x70, 0x38, 0x6b, 0x3b, 0xc8, 0x34,
+  0xa4, 0x15, 0xab, 0x33, 0x5d, 0x66, 0x0f, 0x0c, 0xad, 0x3e, 0x96, 0xd3,
+  0xa1, 0x1f, 0x49, 0x23, 0x02, 0x93, 0xe2, 0x11, 0x74, 0xe5, 0x5b, 0x8e,
+  0x51, 0xef, 0x55, 0x80, 0x18, 0xf1, 0xfa, 0x57, 0xbf, 0xa3, 0x84, 0x29,
+  0xb5, 0xeb, 0x25, 0x0b, 0x0f, 0xb0, 0x7b, 0xfd, 0xad, 0xe2, 0xef, 0x1b,
+  0xdd, 0xd2, 0x6d, 0xb4, 0xe6, 0xf4, 0x45, 0x3a, 0xb9, 0xbc, 0xe2, 0xd6,
+  0xea, 0x67, 0xf8, 0x17, 0x89, 0xbc, 0x95, 0x21, 0xfc, 0x3b, 0xe9, 0xfe,
+  0x81, 0xc9, 0x28, 0x09, 0x85, 0x6e, 0x4c, 0x30, 0x5d, 0x93, 0x11, 0x39,
+  0xff, 0x54, 0x80, 0xd6, 0xe5, 0x3a, 0xd0, 0x16, 0x7b, 0xc9, 0xff, 0xa6,
+  0x3b, 0x27, 0xce, 0x04, 0xa7, 0x20, 0x08, 0x45, 0x34, 0x09, 0xce, 0xa1,
+  0xd5, 0x00, 0xc9, 0x05, 0xfe, 0x12, 0xf5, 0x4d, 0x96, 0x6b, 0x55, 0x1b,
+  0xe7, 0xe5, 0x16, 0x08, 0xa2, 0x12, 0xe1, 0xb0, 0xf8, 0x66, 0x54, 0x50,
+  0x2f, 0xd7, 0x18, 0xa6, 0xd2, 0x6f, 0x2c, 0x95, 0xba, 0x71, 0x21, 0xec,
+  0xa6, 0x1f, 0x0f, 0xa1, 0x3e, 0x64, 0xe2, 0x88, 0x93, 0xac, 0x74, 0x5a,
+  0xb0, 0xe6, 0xda, 0x77, 0x25, 0xc7, 0x00, 0x2d, 0x08, 0x54, 0x80, 0xa5,
+  0x5e, 0x80, 0x92, 0x0f, 0x3c, 0x0d, 0x5f, 0x6a, 0x12, 0x34, 0x13, 0x2d,
+  0x79, 0x94, 0xb0, 0x39, 0x2b, 0x84, 0x13, 0x09, 0x4f, 0xc6, 0x04, 0x28,
+  0x4b, 0xa6, 0xcd, 0x90, 0x35, 0x18, 0xca, 0xea, 0xbb, 0x89, 0xb3, 0xc0,
+  0x9d, 0x83, 0x8d, 0x37, 0x0d, 0xd1, 0x68, 0x95, 0x72, 0x6c, 0x01, 0x25,
+  0x1e, 0x69, 0xa3, 0x09, 0x6b, 0x05, 0x86, 0x1e, 0x30, 0xb0, 0x14, 0xe3,
+  0x1a, 0x32, 0x15, 0xde, 0x19, 0x6a, 0x0c, 0x24, 0xf4, 0x96, 0x87, 0xa8,
+  0x4a, 0x98, 0x8b, 0x8d, 0xb6, 0xd4, 0x48, 0xb0, 0xbd, 0xe8, 0xdb, 0x78,
+  0xe6, 0xa9, 0xc2, 0xc6, 0x41, 0xd5, 0xc5, 0x06, 0xc3, 0xf5, 0x12, 0x1c,
+  0x3a, 0x3e, 0x12, 0xf6, 0x59, 0x33, 0x03, 0x25, 0xe1, 0xa2, 0x0b, 0xf8,
+  0x36, 0x4d, 0x17, 0xdd, 0x40, 0x26, 0x22, 0x8b, 0xc4, 0xe3, 0x7d, 0xff,
+  0x0d, 0x4d, 0x0e, 0xbf, 0x43, 0x2f, 0xd0, 0xbd, 0x47, 0xe8, 0xa1, 0xa9,
+  0xf6, 0x78, 0x62, 0x52, 0x1e, 0x26, 0xf0, 0xbd, 0x14, 0x1b, 0xe0, 0xb9,
+  0x61, 0x00, 0x3f, 0xcd, 0xb9, 0x04, 0x02, 0xa4, 0xaa, 0x80, 0x9c, 0x1d,
+  0x40, 0xf8, 0x2e, 0xe6, 0x52, 0x24, 0x91, 0xdb, 0x3d, 0xd2, 0xf4, 0xa1,
+  0xea, 0x5d, 0x76, 0x25, 0x9e, 0x49, 0xe9, 0x8d, 0x79, 0xe1, 0x97, 0xc0,
+  0x8e, 0x0c, 0xd6, 0x92, 0x3e, 0x19, 0x97, 0x77, 0xe1, 0x1b, 0x5e, 0xde,
+  0x05, 0x6f, 0xf8, 0x33, 0xee, 0xb9, 0xb5, 0xb7, 0x4e, 0x2e, 0x07, 0xdf,
+  0x45, 0x2d, 0xa0, 0x11, 0xdc, 0xc9, 0x85, 0xaf, 0xb8, 0x5d, 0x1d, 0x12,
+  0xbd, 0x7b, 0xcd, 0xdb, 0xef, 0x79, 0x30, 0x3e, 0xe0, 0xdd, 0x73, 0xf8,
+  0xbe, 0x5c, 0xee, 0xcb, 0xa3, 0xc1, 0x77, 0xce, 0xb5, 0x76, 0x48, 0x20,
+  0x54, 0x8c, 0x69, 0x32, 0xdb, 0x31, 0x48, 0xcc, 0xa4, 0x83, 0x83, 0x05,
+  0xe9, 0xbd, 0xbc, 0x7b, 0x0e, 0xbd, 0xc3, 0x4c, 0x3c, 0x7a, 0xf7, 0xf6,
+  0x78, 0x15, 0xbd, 0xbb, 0x07, 0x55, 0x4f, 0x9a, 0x75, 0xa8, 0x3d, 0xe3,
+  0x16, 0xda, 0x58, 0xe0, 0xd1, 0x46, 0xe6, 0x18, 0x48, 0x14, 0xd2, 0xf6,
+  0x53, 0x09, 0x69, 0x9e, 0xbf, 0x8c, 0xd0, 0xe1, 0x05, 0x8f, 0xd0, 0xf5,
+  0x3c, 0xc3, 0x94, 0xde, 0x46, 0xe8, 0x9a, 0x52, 0x9c, 0x30, 0x91, 0xbb,
+  0x34, 0xee, 0xd3, 0xb7, 0x43, 0xb5, 0x6e, 0x19, 0xb8, 0xbf, 0x43, 0x9a,
+  0x69, 0x66, 0xa1, 0x0c, 0x2c, 0x90, 0x43, 0x00, 0x5c, 0x44, 0x41, 0x19,
+  0xb8, 0x20, 0xd6, 0x77, 0xe7, 0x9b, 0xd2, 0xfc, 0x5a, 0xf5, 0x43, 0xa1,
+  0x1a, 0x36, 0x37, 0x56, 0x43, 0xa1, 0x4d, 0xee, 0x01, 0x17, 0x50, 0x60,
+  0xe2, 0xdd, 0xc8, 0x1a, 0x7a, 0x50, 0x12, 0xac, 0x4e, 0x2f, 0x13, 0xcc,
+  0xf3, 0x20, 0x18, 0xb2, 0xe6, 0x3d, 0x45, 0x35, 0x8f, 0xb4, 0x01, 0x54,
+  0x54, 0x7a, 0x69, 0xd6, 0xf3, 0xd3, 0xa0, 0xdd, 0xd0, 0x56, 0x55, 0xc3,
+  0xa6, 0xc5, 0x12, 0x45, 0x52, 0x78, 0x25, 0xc8, 0x81, 0xca, 0x28, 0x59,
+  0x9a, 0x12, 0x13, 0x60, 0xaf, 0x64, 0xa0, 0xa0, 0x36, 0x88, 0xb0, 0x56,
+  0x6f, 0xf7, 0x52, 0xe5, 0x35, 0x67, 0xdc, 0x8b, 0x06, 0x8a, 0xf1, 0x38,
+  0x2b, 0x7b, 0xb6, 0x3d, 0xfb, 0xa1, 0xf9, 0xab, 0x67, 0x5f, 0xbc, 0x39,
+  0x1f, 0x60, 0xe4, 0x2a, 0xa1, 0x5a, 0x03, 0x35, 0x83, 0xcb, 0x84, 0xeb,
+  0x43, 0xa6, 0xc4, 0x39, 0xe0, 0x11, 0x53, 0xf0, 0x67, 0x3a, 0x22, 0x1e,
+  0x06, 0x1d, 0x42, 0xf4, 0x09, 0xaf, 0x50, 0x2f, 0xe6, 0x82, 0x1b, 0xb0,
+  0xed, 0x28, 0x2e, 0x8e, 0x2b, 0xb0, 0x73, 0xd3, 0x8a, 0x76, 0xf2, 0x3c,
+  0x05, 0x30, 0x8e, 0xb4, 0x2c, 0x0f, 0xa7, 0xb1, 0xa1, 0xbd, 0x99, 0x17,
+  0x8c, 0xc8, 0x2e, 0x18, 0x64, 0xa6, 0xc3, 0x55, 0xd6, 0x68, 0x49, 0xdf,
+  0x5c, 0xac, 0x60, 0x26, 0x49, 0xce, 0xd8, 0xc6, 0x4a, 0xe3, 0x11, 0x37,
+  0x70, 0x71, 0xb7, 0xd7, 0xc3, 0x87, 0x25, 0xfd, 0xd0, 0xfc, 0xf4, 0x05,
+  0xfd, 0xb4, 0xef, 0x6d, 0xb4, 0x57, 0x42, 0x23, 0xed, 0x53, 0x0d, 0x3a,
+  0x2e, 0x66, 0x37, 0x66, 0x63, 0xec, 0xbc, 0x41, 0x67, 0xaf, 0x8d, 0x14,
+  0x10, 0x2d, 0x91, 0x31, 0x0f, 0x6d, 0xf3, 0xb6, 0xc8, 0xc3, 0x69, 0x01,
+  0xdd, 0xa6, 0xac, 0x1d, 0xfa, 0xee, 0x6e, 0xe0, 0xd0, 0xcd, 0x9c, 0x0f,
+  0x65, 0x99, 0xe1, 0x23, 0xaf, 0x49, 0x97, 0x61, 0xca, 0xfd, 0xad, 0x0e,
+  0xd3, 0x45, 0x4f, 0xdf, 0x62, 0xe1, 0x31, 0x8f, 0x6f, 0x45, 0xa4, 0xef,
+  0x09, 0x1d, 0xf4, 0x3c, 0x98, 0x15, 0xee, 0xb5, 0x4c, 0x2d, 0xa9, 0xed,
+  0x3a, 0x6b, 0x44, 0x23, 0xfa, 0x56, 0x65, 0x40, 0x5b, 0x91, 0x28, 0xf8,
+  0x3b, 0xa1, 0x9a, 0x2f, 0xcd, 0xce, 0x76, 0x7d, 0x3c, 0x5a, 0xdf, 0x41,
+  0x33, 0x31, 0xef, 0x3e, 0x71, 0x7e, 0x96, 0xc8, 0x56, 0x9f, 0x9f, 0xee,
+  0xd9, 0xff, 0x1e, 0xe7, 0xf7, 0xe2, 0x93, 0x9c, 0xdf, 0x8b, 0xff, 0x6d,
+  0xce, 0xef, 0xc5, 0xbf, 0x7c, 0x7e, 0x7b, 0xde, 0xf9, 0xbd, 0xf8, 0xdf,
+  0xe5, 0xfc, 0xb4, 0xbf, 0x9a, 0x9e, 0x5e, 0xe2, 0x9d, 0xdf, 0x40, 0xd2,
+  0x46, 0x14, 0x98, 0x0f, 0x77, 0x5a, 0xdf, 0xe2, 0x20, 0x8d, 0x24, 0x3a,
+  0xb2, 0x17, 0x5c, 0x73, 0x6d, 0x19, 0x1a, 0xb2, 0xa5, 0x61, 0x49, 0x5f,
+  0xcb, 0x2a, 0x74, 0xd0, 0xd3, 0xcb, 0xc8, 0x4c, 0xc0, 0x39, 0x06, 0x0b,
+  0xb4, 0x45, 0x0a, 0x5a, 0xd0, 0x45, 0x5d, 0xa2, 0xdf, 0x12, 0xd6, 0xcf,
+  0xe5, 0x95, 0xa5, 0x2d, 0x0a, 0x0e, 0x21, 0x69, 0xc1, 0xc6, 0x1d, 0x1c,
+  0xe2, 0x76, 0xf5, 0xf8, 0xf1, 0x2f, 0x83, 0xc5, 0x6e, 0xd4, 0xae, 0xd9,
+  0x4e, 0x29, 0x14, 0x96, 0x70, 0xb6, 0xce, 0x9e, 0x9b, 0x89, 0x66, 0x39,
+  0x87, 0x16, 0x3a, 0xb3, 0xa6, 0xaa, 0x63, 0x4e, 0xf0, 0xe9, 0x23, 0xcb,
+  0x6f, 0x08, 0xc7, 0xe7, 0xf0, 0xc3, 0x95, 0xef, 0x7b, 0x83, 0xa5, 0xfa,
+  0xd0, 0x88, 0x70, 0x5c, 0x3d, 0xb4, 0xed, 0x7b, 0x84, 0x12, 0x0f, 0xb7,
+  0xf1, 0xe2, 0xdd, 0x86, 0xe3, 0x04, 0xa2, 0xa0, 0x45, 0x1e, 0xea, 0x77,
+  0xc7, 0x65, 0xb7, 0xa6, 0xb4, 0xbc, 0xec, 0x36, 0x7a, 0x5c, 0x9a, 0xb4,
+  0x77, 0xab, 0xa4, 0x90, 0x77, 0x44, 0x0a, 0x76, 0x0b, 0xaf, 0xbf, 0x25,
+  0x2a, 0x83, 0x69, 0x29, 0xa8, 0x71, 0x08, 0xa3, 0xa1, 0x72, 0x90, 0x66,
+  0xf6, 0x7b, 0x66, 0xfc, 0xbd, 0xd8, 0xa9, 0xed, 0xea, 0x1b, 0xd2, 0x15,
+  0x97, 0xf3, 0x85, 0x94, 0x16, 0x3f, 0x51, 0x5a, 0x19, 0x71, 0x37, 0x46,
+  0x2a, 0x9b, 0x64, 0xf7, 0xbe, 0x54, 0x19, 0xa9, 0x65, 0x6e, 0x4a, 0x2b,
+  0xc4, 0x7c, 0x6f, 0x05, 0x46, 0x0b, 0x62, 0x51, 0x5d, 0x37, 0x13, 0xa4,
+  0xb8, 0x22, 0x46, 0xf1, 0xd5, 0x91, 0x4b, 0x3a, 0x5a, 0xb3, 0x14, 0x3a,
+  0x10, 0x08, 0x00, 0x7f, 0x35, 0x04, 0xce, 0x4d, 0x51, 0x42, 0x2c, 0xb0,
+  0xc2, 0x39, 0x33, 0xba, 0x20, 0xbc, 0x0a, 0xc3, 0xf4, 0xa5, 0xca, 0xaa,
+  0x74, 0xe2, 0xd4, 0xa6, 0x30, 0x84, 0xc0, 0x9d, 0x42, 0xd5, 0x01, 0x14,
+  0xec, 0x21, 0xf5, 0x56, 0xb2, 0xfa, 0x04, 0xba, 0xc3, 0x60, 0x33, 0x65,
+  0x77, 0x5a, 0x7b, 0x53, 0x6b, 0x51, 0xd2, 0x1b, 0xfa, 0xe1, 0x80, 0x5a,
+  0x09, 0xe0, 0x1f, 0x88, 0x36, 0x5a, 0xca, 0x32, 0x58, 0x35, 0x73, 0x1c,
+  0x13, 0x81, 0x9b, 0xe4, 0x56, 0x7d, 0x04, 0x5d, 0x01, 0x68, 0xe8, 0xe8,
+  0x02, 0xa5, 0x5f, 0x05, 0x37, 0x01, 0xa9, 0xbb, 0xa4, 0x1a, 0x46, 0x12,
+  0x67, 0xff, 0x7a, 0x09, 0x85, 0x02, 0x30, 0x10, 0x3c, 0xc6, 0x5a, 0x0a,
+  0x38, 0xe7, 0x16, 0xdf, 0x24, 0x6e, 0xd5, 0xb4, 0x81, 0xa0, 0xe4, 0x28,
+  0x05, 0x27, 0x2f, 0xc2, 0x2e, 0x4a, 0x26, 0xac, 0xd7, 0x70, 0x88, 0x50,
+  0x11, 0x64, 0xea, 0x1d, 0x41, 0x71, 0x5a, 0x0a, 0xf4, 0x2c, 0xb7, 0x5c,
+  0x26, 0xd0, 0x9b, 0xdf, 0xaf, 0x4a, 0xd9, 0xc9, 0x0c, 0x77, 0x59, 0x54,
+  0x32, 0xe5, 0xf0, 0xff, 0xaa, 0x2c, 0xe4, 0x06, 0xe0, 0x1a, 0x77, 0x12,
+  0x37, 0x90, 0x6b, 0xe4, 0x11, 0xcc, 0xaa, 0x22, 0x5f, 0x3c, 0x46, 0xdf,
+  0xc4, 0xb8, 0x2c, 0x52, 0xeb, 0xe3, 0x64, 0xee, 0x95, 0xa6, 0x71, 0x6f,
+  0x71, 0x51, 0xb3, 0xb9, 0xcf, 0xb8, 0xae, 0x90, 0xec, 0x02, 0xde, 0x16,
+  0x20, 0x56, 0xd8, 0x2f, 0x74, 0x26, 0x4b, 0xd9, 0x08, 0xa7, 0x5e, 0x0f,
+  0x06, 0x67, 0xbe, 0x2d, 0xa7, 0x8d, 0x8d, 0x56, 0x62, 0x12, 0xd0, 0x68,
+  0xbd, 0x66, 0x74, 0x44, 0x06, 0x3f, 0x0c, 0x72, 0x0e, 0x59, 0x77, 0x32,
+  0x53, 0xcc, 0x0e, 0xc5, 0x91, 0x1f, 0x15, 0x8f, 0x0b, 0x34, 0xbe, 0xa4,
+  0x08, 0x97, 0xaf, 0x39, 0xce, 0x8f, 0x41, 0x60, 0x57, 0x96, 0x3d, 0x7f,
+  0x28, 0x1d, 0x2c, 0x75, 0x92, 0xa5, 0x18, 0xbf, 0x47, 0x50, 0x64, 0x04,
+  0xb7, 0x12, 0xd9, 0x8a, 0x52, 0x67, 0x4c, 0x68, 0x2e, 0xad, 0x3d, 0xce,
+  0xa4, 0x73, 0x59, 0xa3, 0x3b, 0x06, 0x9b, 0x33, 0x68, 0x69, 0x21, 0x22,
+  0x22, 0x85, 0x53, 0x36, 0x54, 0xbe, 0xcb, 0x1b, 0x52, 0xb5, 0xd7, 0xbc,
+  0x19, 0xa6, 0x79, 0x42, 0x8c, 0x08, 0x0f, 0x99, 0x07, 0x25, 0x03, 0x36,
+  0xee, 0xb4, 0x27, 0xa0, 0x18, 0x2d, 0x74, 0xe2, 0x58, 0xa9, 0x42, 0xba,
+  0x5c, 0x8c, 0x4c, 0xe9, 0x7b, 0xc6, 0xf1, 0x48, 0x5c, 0x4d, 0x33, 0x30,
+  0x14, 0xef, 0x0b, 0xd8, 0xad, 0x17, 0x73, 0x20, 0x18, 0x97, 0x93, 0xeb,
+  0x78, 0xea, 0x84, 0x15, 0x1b, 0xd5, 0xe6, 0xd4, 0x3e, 0x2c, 0x63, 0x4c,
+  0x44, 0x60, 0x64, 0xc0, 0x4b, 0xe6, 0x70, 0x7b, 0x7a, 0xe7, 0xb0, 0xec,
+  0x9e, 0x87, 0x5c, 0x84, 0xbe, 0x09, 0x91, 0x16, 0x96, 0xbf, 0x51, 0x2e,
+  0x36, 0x65, 0xaf, 0xe0, 0x97, 0xfa, 0x21, 0x30, 0x9c, 0x51, 0x5e, 0x08,
+  0x22, 0x0d, 0xa6, 0xcf, 0xc0, 0xcd, 0xa3, 0x9c, 0xa1, 0xd2, 0x00, 0x0d,
+  0xd8, 0xb8, 0x7a, 0xbd, 0x1b, 0x56, 0xa0, 0x62, 0xd8, 0xe8, 0xa8, 0x02,
+  0x9e, 0x48, 0x89, 0xfb, 0xe3, 0xa4, 0xc4, 0xd6, 0x4a, 0x3c, 0x81, 0xe8,
+  0xc8, 0x65, 0x51, 0x04, 0x0d, 0x86, 0x9d, 0xe4, 0xa5, 0x09, 0x42, 0x93,
+  0x06, 0xe8, 0xc1, 0xe0, 0xc4, 0x3f, 0x48, 0x66, 0x83, 0x1c, 0x84, 0x9c,
+  0x1f, 0x83, 0xdf, 0xe6, 0xe2, 0x40, 0x31, 0x50, 0xb8, 0xbc, 0xcb, 0x12,
+  0xbc, 0x89, 0x83, 0x9a, 0x85, 0xf4, 0x7c, 0x32, 0x48, 0x74, 0x4b, 0x8d,
+  0xd4, 0xd8, 0x88, 0x8b, 0x12, 0x87, 0xdd, 0x5c, 0x66, 0x72, 0x38, 0xb8,
+  0x0f, 0xcd, 0x1a, 0x63, 0xaa, 0x0b, 0x03, 0x64, 0x1a, 0xb0, 0x1f, 0x1f,
+  0x11, 0xf6, 0xfd, 0xe5, 0xd1, 0xd5, 0xe9, 0xe0, 0xe2, 0xfc, 0x00, 0xd9,
+  0x05, 0x62, 0x68, 0xc2, 0xff, 0xef, 0x70, 0x9b, 0x22, 0x02, 0x82, 0xa6,
+  0x4f, 0xa6, 0x25, 0x63, 0x90, 0xd2, 0x97, 0x50, 0xe9, 0xf9, 0x3e, 0x89,
+  0x6f, 0x43, 0xc5, 0x43, 0x03, 0x60, 0x50, 0xd8, 0x0b, 0xa9, 0x46, 0xa3,
+  0x9c, 0xbe, 0x24, 0xe8, 0xc0, 0x54, 0xf0, 0x42, 0x70, 0x2f, 0x88, 0xf6,
+  0x6a, 0x87, 0x5f, 0xa9, 0x9a, 0xd4, 0xb3, 0x94, 0x9c, 0x9d, 0x5e, 0x75,
+  0x4d, 0x1a, 0x4a, 0x03, 0x3e, 0xcf, 0x59, 0x5d, 0x74, 0x3f, 0xe8, 0x40,
+  0x34, 0x8f, 0xa7, 0x46, 0x5f, 0x4d, 0x6b, 0xe8, 0xa4, 0xe2, 0x50, 0xa6,
+  0xe9, 0x5c, 0x8c, 0x0e, 0x10, 0xd8, 0x1a, 0xa3, 0x12, 0x70, 0x80, 0x5d,
+  0x32, 0x6b, 0x1d, 0x60, 0x27, 0x89, 0xe3, 0x07, 0xa3, 0x0e, 0x91, 0x68,
+  0x1c, 0x94, 0x65, 0x86, 0x73, 0xa1, 0x2a, 0x66, 0x55, 0xfe, 0x92, 0xec,
+  0x2e, 0x99, 0xe5, 0x0b, 0x2d, 0x04, 0x14, 0xd4, 0x5a, 0x02, 0x43, 0xed,
+  0xaf, 0x80, 0x98, 0x91, 0xab, 0xc6, 0x2e, 0x3c, 0xa6, 0x38, 0x37, 0xff,
+  0x5a, 0x31, 0x56, 0x15, 0x56, 0x35, 0x74, 0x80, 0xbc, 0x4b, 0xe8, 0xf2,
+  0xca, 0x64, 0x73, 0x78, 0x8b, 0x03, 0x10, 0x3f, 0xb6, 0x17, 0x1b, 0xae,
+  0x81, 0xdc, 0x4d, 0x71, 0x74, 0x9f, 0x24, 0xb7, 0xfc, 0x69, 0xd3, 0x26,
+  0x93, 0x3b, 0x13, 0x48, 0xaf, 0x94, 0xef, 0x37, 0x3b, 0xc1, 0x18, 0x7d,
+  0x4a, 0x01, 0x6b, 0x38, 0x83, 0x42, 0xb3, 0x48, 0xad, 0xd4, 0x97, 0xa0,
+  0x0e, 0x47, 0x07, 0x0b, 0x10, 0x16, 0x77, 0x14, 0x06, 0xe0, 0x05, 0x0a,
+  0xe8, 0x6d, 0x00, 0x37, 0x56, 0x1a, 0x3c, 0xc7, 0xc5, 0x6d, 0x69, 0x6f,
+  0xb9, 0xaf, 0x0a, 0x90, 0x22, 0xc8, 0x33, 0x8e, 0xb9, 0x9f, 0x12, 0xae,
+  0xa4, 0x5e, 0x2a, 0x80, 0x15, 0xa6, 0x95, 0x53, 0xa7, 0xc9, 0x63, 0x85,
+  0x5a, 0xcc, 0xd7, 0x39, 0x4b, 0x5b, 0x1d, 0xd6, 0x2a, 0xda, 0xa6, 0xcb,
+  0xb2, 0xbd, 0xb5, 0xf5, 0x24, 0x52, 0x9c, 0x90, 0xf9, 0x4a, 0xc0, 0x38,
+  0x54, 0x8a, 0x39, 0xcc, 0x6d, 0x90, 0x4d, 0xe2, 0x54, 0xca, 0x56, 0x9b,
+  0xd8, 0x9a, 0xf0, 0x49, 0x03, 0xdc, 0x66, 0x15, 0x31, 0x56, 0xae, 0x19,
+  0x50, 0x91, 0x60, 0xe3, 0x70, 0xb7, 0xf8, 0x42, 0x1f, 0xd4, 0xde, 0x69,
+  0xa2, 0x43, 0xb1, 0x1c, 0x48, 0x19, 0x23, 0xd5, 0xdc, 0x88, 0xaf, 0x1f,
+  0xad, 0xf7, 0x96, 0xd4, 0x62, 0x8e, 0x0a, 0xd2, 0xac, 0x38, 0xda, 0xcb,
+  0xf3, 0xef, 0xaf, 0x32, 0x00, 0xc2, 0x68, 0x70, 0x7f, 0x60, 0xf5, 0x92,
+  0x86, 0x05, 0x39, 0xb5, 0x28, 0x69, 0x54, 0x02, 0x95, 0x0a, 0x87, 0x2d,
+  0xcc, 0x6a, 0x81, 0xf3, 0x37, 0x5b, 0xed, 0x39, 0x5d, 0xf3, 0x58, 0x17,
+  0x5e, 0x89, 0xea, 0x5f, 0xc7, 0xf6, 0xab, 0xd7, 0x22, 0xbc, 0xac, 0x9f,
+  0x2f, 0x02, 0x6c, 0xf4, 0x08, 0x46, 0xa3, 0x29, 0x08, 0x11, 0x79, 0x03,
+  0x09, 0x9d, 0x3c, 0xce, 0x79, 0xe6, 0xf8, 0xe1, 0x11, 0x53, 0x92, 0xf3,
+  0x3f, 0xb5, 0xe2, 0xb6, 0x01, 0x65, 0xee, 0xaa, 0xd7, 0xda, 0x7f, 0x45,
+  0xf5, 0xbd, 0x71, 0xee, 0x20, 0x18, 0x9a, 0x22, 0xeb, 0x86, 0x43, 0x9f,
+  0x3d, 0xfa, 0x3e, 0x38, 0x12, 0xd7, 0x91, 0xd8, 0x60, 0x11, 0xc3, 0x85,
+  0x50, 0x8e, 0x1c, 0xf9, 0x03, 0x58, 0x53, 0x00, 0xbb, 0xb5, 0x4b, 0x87,
+  0x07, 0xb7, 0x06, 0xcb, 0x86, 0xf8, 0x94, 0x83, 0x4e, 0x0e, 0x0b, 0xae,
+  0xc9, 0xdd, 0x26, 0x79, 0x25, 0xa5, 0x05, 0x05, 0x45, 0xf9, 0xc3, 0x9d,
+  0x33, 0x61, 0xd4, 0xd2, 0x24, 0x08, 0xfb, 0x37, 0xcd, 0xc1, 0xe9, 0x80,
+  0x27, 0x11, 0xa7, 0xac, 0x5c, 0x52, 0x0c, 0x93, 0x87, 0x37, 0x38, 0x9c,
+  0xac, 0x84, 0x30, 0x7e, 0x09, 0x46, 0x4b, 0x04, 0x87, 0xc1, 0x53, 0x1e,
+  0x31, 0x47, 0x0a, 0x21, 0x7c, 0x23, 0x3a, 0x1c, 0x02, 0x42, 0x59, 0x16,
+  0x4e, 0xa6, 0x54, 0xe7, 0x26, 0x85, 0x53, 0xcd, 0x3a, 0xa4, 0x12, 0x59,
+  0xc1, 0x2a, 0x1f, 0xf5, 0x16, 0xbb, 0x9c, 0x39, 0xe1, 0x39, 0x5f, 0x77,
+  0xf0, 0xaa, 0xe3, 0xbb, 0x51, 0xed, 0x42, 0xa8, 0x57, 0x81, 0x65, 0x8b,
+  0x85, 0x60, 0xe1, 0x73, 0x0b, 0xc6, 0xf4, 0x6c, 0x39, 0x36, 0xde, 0x7c,
+  0xea, 0xcf, 0xd8, 0x75, 0x9b, 0xa3, 0xd9, 0x70, 0x63, 0x3c, 0x47, 0x57,
+  0x3e, 0x7b, 0x2c, 0x70, 0x97, 0x83, 0xad, 0xab, 0xf0, 0x20, 0x04, 0xb8,
+  0x2b, 0x80, 0x2c, 0x2f, 0x09, 0xde, 0xf1, 0x23, 0xd5, 0x9e, 0x9a, 0x4f,
+  0x13, 0x75, 0x7b, 0x30, 0xa0, 0x08, 0x89, 0x9b, 0x93, 0xff, 0x47, 0xe8,
+  0x18, 0xb7, 0x70, 0x54, 0xa4, 0x8b, 0x8a, 0xb3, 0xd2, 0xa4, 0xc4, 0x66,
+  0x25, 0x7c, 0x1a, 0xfc, 0x6d, 0x3a, 0xcb, 0x87, 0x31, 0xdf, 0x11, 0x93,
+  0xe1, 0xaa, 0x71, 0xaf, 0x1a, 0x6c, 0x3d, 0xb2, 0x37, 0x24, 0xcf, 0x40,
+  0xdb, 0x1d, 0x58, 0x72, 0xef, 0xa0, 0x4b, 0x79, 0x1b, 0x0f, 0xd5, 0xca,
+  0x0f, 0x9a, 0x4f, 0x30, 0x08, 0x6c, 0x6f, 0xd2, 0x95, 0xdb, 0xab, 0xd8,
+  0x1c, 0x94, 0x20, 0x5c, 0x3a, 0x77, 0xca, 0xb3, 0xbc, 0x09, 0x4c, 0x67,
+  0xbc, 0x4c, 0xea, 0xf9, 0xc2, 0x6b, 0x92, 0x2c, 0x24, 0x8d, 0x4d, 0x29,
+  0x67, 0xd5, 0xf4, 0xab, 0x91, 0xa4, 0x9c, 0x60, 0x2e, 0x2c, 0xc2, 0xc4,
+  0x4b, 0xee, 0x6a, 0x37, 0xba, 0xc9, 0xef, 0xa9, 0x4e, 0x2f, 0x43, 0xdb,
+  0xc4, 0x4e, 0x4e, 0xa5, 0xa7, 0xb3, 0x57, 0x0c, 0xaf, 0xe3, 0x53, 0xfc,
+  0x84, 0xdd, 0x02, 0xa4, 0x4b, 0xf3, 0x99, 0xac, 0xd8, 0x19, 0xb7, 0xd7,
+  0x44, 0xdd, 0x51, 0x64, 0x3e, 0x1d, 0x16, 0x4f, 0xc4, 0xd6, 0x4a, 0x74,
+  0x1d, 0x61, 0x94, 0x77, 0x1d, 0x88, 0x45, 0x6a, 0xa0, 0x63, 0x4a, 0x3f,
+  0x23, 0x84, 0x64, 0x55, 0x24, 0x98, 0x17, 0x84, 0xeb, 0xb3, 0xf1, 0xa6,
+  0x60, 0xa6, 0xf3, 0xec, 0x91, 0x73, 0x29, 0xe9, 0xcc, 0xc9, 0xeb, 0x21,
+  0x91, 0x63, 0x25, 0xa8, 0xa4, 0x1a, 0x39, 0xbf, 0x1c, 0x27, 0xf1, 0x2c,
+  0xd4, 0x33, 0x09, 0x27, 0x8c, 0x3a, 0x3f, 0xb3, 0x36, 0x04, 0xcb, 0xca,
+  0x24, 0x70, 0x2e, 0x95, 0x36, 0x9c, 0x6b, 0x2e, 0xca, 0xa2, 0x99, 0x21,
+  0xdd, 0xaa, 0x80, 0x8f, 0x05, 0xbb, 0xb8, 0xd1, 0x03, 0x84, 0x20, 0x31,
+  0x12, 0x5c, 0x1a, 0x4a, 0x7b, 0xb1, 0x85, 0x98, 0x88, 0xec, 0x89, 0x69,
+  0xe9, 0xfa, 0x00, 0x51, 0x00, 0x55, 0x45, 0x35, 0x87, 0x93, 0x70, 0x1a,
+  0xa3, 0x03, 0x90, 0x90, 0xd1, 0xe2, 0x3d, 0x9c, 0x18, 0x67, 0x42, 0x22,
+  0x93, 0xdc, 0x90, 0x7b, 0x48, 0xd9, 0x76, 0xc2, 0x39, 0x16, 0xfe, 0x49,
+  0xdf, 0x25, 0x9a, 0x1f, 0x4b, 0x06, 0x08, 0x1f, 0x40, 0x65, 0x20, 0x13,
+  0x70, 0x34, 0xe1, 0x33, 0xcc, 0x64, 0x76, 0x76, 0x5a, 0x1c, 0x70, 0xdc,
+  0xe3, 0x5c, 0x69, 0x8c, 0x2e, 0x7b, 0x19, 0x4f, 0x12, 0x35, 0x5a, 0x84,
+  0x7d, 0xe7, 0x23, 0xd8, 0x42, 0x4a, 0xd5, 0x21, 0x68, 0x3a, 0xb4, 0x91,
+  0x3d, 0x6b, 0x87, 0xb9, 0x26, 0x72, 0x49, 0x23, 0x72, 0xf1, 0x22, 0x08,
+  0xbb, 0x2d, 0x67, 0xe9, 0x42, 0xa3, 0x94, 0xdd, 0x28, 0x91, 0xdc, 0xd2,
+  0xd9, 0xa3, 0x9c, 0xca, 0xb2, 0x17, 0x70, 0xc0, 0x69, 0xba, 0x9d, 0x82,
+  0xa0, 0xcf, 0xd0, 0x32, 0x5a, 0x6f, 0x8c, 0xbe, 0xb7, 0xb5, 0x4d, 0x93,
+  0xdd, 0xdb, 0x7a, 0xb9, 0x51, 0x97, 0xca, 0xb3, 0x32, 0xe9, 0x51, 0xea,
+  0x72, 0xd8, 0x47, 0xc1, 0x0d, 0x4b, 0x6d, 0x74, 0x95, 0xfc, 0x11, 0xf8,
+  0x92, 0xe4, 0x3b, 0x8f, 0x97, 0x85, 0xda, 0x64, 0xd8, 0xca, 0x16, 0xdd,
+  0x93, 0xe5, 0x0d, 0x62, 0xef, 0x7a, 0x52, 0xde, 0xbe, 0x43, 0xae, 0x3b,
+  0x8a, 0xe0, 0xf3, 0x3e, 0xc5, 0xf4, 0xaa, 0xb4, 0xc9, 0xe4, 0x7d, 0xa0,
+  0xe7, 0xd4, 0x00, 0x0f, 0x14, 0xa0, 0x38, 0x70, 0xa3, 0x9c, 0x2a, 0x2c,
+  0x49, 0x1c, 0xf5, 0xa6, 0xf3, 0x86, 0xef, 0xbc, 0x4d, 0xb3, 0xb4, 0xbc,
+  0xa1, 0x66, 0xf5, 0x65, 0x19, 0x4f, 0x13, 0x1f, 0xe6, 0x04, 0x18, 0x12,
+  0x98, 0x00, 0x6c, 0xee, 0x17, 0xd4, 0x9f, 0x04, 0x13, 0x84, 0x79, 0xdf,
+  0xa5, 0x6c, 0x51, 0x3a, 0xad, 0x12, 0x3e, 0xa6, 0x5d, 0x66, 0x88, 0x5e,
+  0xd2, 0xd2, 0x69, 0x03, 0xdc, 0xd6, 0x05, 0x18, 0x7b, 0x52, 0x12, 0x50,
+  0x22, 0x77, 0x88, 0xe3, 0x16, 0x71, 0xa1, 0xde, 0x5f, 0xd1, 0x3a, 0x1e,
+  0xee, 0xc5, 0x00, 0x58, 0x90, 0xed, 0x58, 0x4f, 0x89, 0xe0, 0xf0, 0xb3,
+  0x1f, 0x40, 0x17, 0xed, 0xbf, 0x32, 0x3f, 0xde, 0x78, 0x5e, 0xdb, 0xe0,
+  0x9d, 0x86, 0x6e, 0x86, 0x15, 0x19, 0x12, 0x8f, 0x26, 0x87, 0xd5, 0x6b,
+  0xfe, 0x47, 0xd8, 0xe3, 0x4d, 0xe8, 0x06, 0x60, 0x40, 0xbc, 0x3f, 0x22,
+  0x60, 0x41, 0x8b, 0xf3, 0xef, 0x14, 0x6f, 0xd4, 0x2a, 0xb5, 0xa9, 0x87,
+  0x32, 0xaa, 0xaa, 0x41, 0x98, 0x57, 0xe3, 0xa9, 0xe1, 0x3c, 0x72, 0x9b,
+  0x7b, 0xa1, 0xba, 0x1c, 0x08, 0xde, 0x0a, 0xdd, 0x93, 0x08, 0xc0, 0x16,
+  0x9d, 0x25, 0xdc, 0x32, 0x2d, 0x5a, 0xfb, 0x6a, 0x2d, 0x50, 0xd3, 0xbd,
+  0x76, 0xe8, 0xf4, 0x99, 0x28, 0x6d, 0x3b, 0xc6, 0xb5, 0x2f, 0xd0, 0xb2,
+  0x47, 0x48, 0x2d, 0xfe, 0xa6, 0x9c, 0x01, 0x57, 0x59, 0x84, 0x93, 0xbb,
+  0x34, 0xb1, 0x5b, 0x50, 0x62, 0xeb, 0x29, 0xa4, 0x0b, 0x86, 0xe7, 0xc6,
+  0xb2, 0x89, 0xfa, 0xba, 0x55, 0x9f, 0x5b, 0xf3, 0x6a, 0xbe, 0xb1, 0x80,
+  0x8b, 0x31, 0xdb, 0xb8, 0x55, 0xbb, 0xd3, 0xcc, 0x9a, 0xe7, 0xc4, 0x93,
+  0xa1, 0x88, 0xd5, 0x68, 0x44, 0x76, 0x21, 0x5d, 0x7d, 0xf8, 0xe5, 0x74,
+  0x1a, 0x4c, 0x74, 0x85, 0x2d, 0xc0, 0x83, 0xc7, 0x35, 0x4f, 0xc0, 0xde,
+  0x22, 0x7d, 0x03, 0xe5, 0x7c, 0x7b, 0x09, 0x8d, 0xd5, 0xdd, 0x03, 0xcf,
+  0x38, 0xab, 0x38, 0x74, 0xab, 0x14, 0xc3, 0x54, 0x40, 0x44, 0xc0, 0x34,
+  0x80, 0xae, 0x2c, 0xfa, 0x99, 0x89, 0x79, 0x4c, 0x62, 0x20, 0x8a, 0x47,
+  0x49, 0x30, 0x9a, 0x51, 0x55, 0x19, 0x73, 0x90, 0x64, 0xee, 0xf1, 0xb0,
+  0x99, 0x16, 0x68, 0x70, 0x1d, 0x13, 0x76, 0x94, 0xe2, 0x92, 0x17, 0xdc,
+  0x67, 0x96, 0x07, 0xb6, 0xf4, 0x29, 0xd2, 0xb6, 0x4a, 0xb6, 0xa2, 0xa9,
+  0xe9, 0x1b, 0x77, 0xeb, 0x9b, 0x44, 0x55, 0x51, 0x1b, 0x90, 0x4a, 0xb4,
+  0x84, 0x61, 0x38, 0x11, 0xab, 0xc8, 0x2d, 0x69, 0x6f, 0x46, 0xaa, 0xc8,
+  0x84, 0x00, 0x6e, 0xb4, 0x49, 0x97, 0x84, 0xeb, 0xca, 0x46, 0x08, 0x66,
+  0x46, 0x4c, 0x26, 0x8f, 0xb0, 0x55, 0xe7, 0xce, 0xee, 0xe7, 0x9f, 0x07,
+  0x1d, 0x7c, 0xbc, 0x4b, 0x48, 0x84, 0xb8, 0x53, 0x16, 0x19, 0xb9, 0x6b,
+  0x30, 0xee, 0xf1, 0xfb, 0x48, 0x61, 0xea, 0xe6, 0xca, 0xa9, 0x47, 0x2c,
+  0x7c, 0xd5, 0x77, 0xf2, 0x92, 0xff, 0x65, 0x8e, 0x6a, 0x85, 0x70, 0x31,
+  0x52, 0xaf, 0x90, 0x6b, 0xcc, 0xd3, 0x16, 0x95, 0x2e, 0x91, 0x24, 0x6d,
+  0x4e, 0xe8, 0x17, 0x80, 0x58, 0xa9, 0x2a, 0xe0, 0xe2, 0x0f, 0xd0, 0x1a,
+  0xa8, 0xd2, 0x89, 0x73, 0xff, 0x78, 0x3b, 0xd6, 0x5a, 0x40, 0x01, 0xd6,
+  0x22, 0xcd, 0x81, 0x19, 0x26, 0x06, 0x65, 0x87, 0xbd, 0x1c, 0x0d, 0x1c,
+  0x34, 0xf6, 0x3f, 0x66, 0x58, 0x19, 0x8c, 0xfd, 0x8e, 0xe0, 0x03, 0x8d,
+  0xe1, 0x08, 0x27, 0x63, 0x9a, 0x54, 0x7e, 0x35, 0xab, 0x53, 0xe3, 0xb1,
+  0x62, 0xf0, 0x90, 0x4d, 0x24, 0xc5, 0xb8, 0xd1, 0x61, 0x5f, 0xe2, 0xc9,
+  0xe3, 0x74, 0xa2, 0x97, 0xd4, 0xf4, 0x08, 0xfa, 0x8a, 0x4e, 0xe3, 0x50,
+  0xb6, 0x5e, 0x8a, 0xd3, 0xbf, 0x0a, 0x22, 0x5d, 0x4a, 0xa1, 0x09, 0xc1,
+  0x2e, 0x56, 0x15, 0xa8, 0xd5, 0x96, 0x77, 0x53, 0x2d, 0x11, 0x77, 0xa4,
+  0xe1, 0x0a, 0x4e, 0xde, 0x60, 0xce, 0xde, 0x9f, 0x85, 0xa0, 0x96, 0x0e,
+  0xcd, 0xa0, 0xd2, 0xf0, 0x0a, 0xcb, 0xb9, 0x70, 0x2a, 0xa1, 0x9d, 0xd0,
+  0x6e, 0x15, 0xc8, 0x1f, 0xe0, 0x69, 0xcf, 0xea, 0xc1, 0x77, 0x9d, 0x7d,
+  0xf2, 0xcf, 0xde, 0xcd, 0xaf, 0x10, 0x5c, 0x25, 0xde, 0x62, 0x5b, 0x06,
+  0xe4, 0xc6, 0xe8, 0x63, 0xe3, 0xf3, 0xe6, 0x6b, 0xd1, 0x8c, 0xcb, 0xe1,
+  0x52, 0x2d, 0x9e, 0x07, 0x51, 0xd6, 0x34, 0x4f, 0x78, 0x96, 0x04, 0xae,
+  0xa4, 0xbb, 0x8a, 0xbe, 0xab, 0xaa, 0x58, 0x8e, 0x50, 0xb1, 0x24, 0xa3,
+  0x9c, 0x3e, 0x15, 0xea, 0xc9, 0xa8, 0x41, 0x36, 0xb3, 0x62, 0xea, 0x9c,
+  0x4a, 0xe7, 0x45, 0xbb, 0x2c, 0xb0, 0xb0, 0x6c, 0xe1, 0x09, 0x6a, 0x30,
+  0xd7, 0x29, 0xf4, 0x82, 0xdd, 0xbc, 0x13, 0x72, 0xb7, 0x94, 0xe9, 0xcf,
+  0xac, 0x94, 0x49, 0x81, 0x87, 0x82, 0x64, 0x92, 0x83, 0x23, 0xc1, 0xb6,
+  0x2d, 0xd1, 0x1b, 0xec, 0x35, 0xcd, 0xa2, 0x1c, 0xe9, 0xcd, 0xe3, 0xd3,
+  0x6e, 0x79, 0x13, 0x4b, 0x24, 0x54, 0xe3, 0x8a, 0x64, 0xba, 0x44, 0x29,
+  0x47, 0xfb, 0xb4, 0xae, 0xa0, 0xd8, 0xfa, 0xc4, 0x22, 0x5d, 0x50, 0x3f,
+  0x2b, 0xb0, 0xe7, 0xbc, 0x8a, 0x29, 0x78, 0x8b, 0xbb, 0x48, 0x2f, 0x33,
+  0xd8, 0xae, 0x6a, 0x89, 0x99, 0x28, 0x82, 0x0a, 0x06, 0xfc, 0xeb, 0x6f,
+  0x14, 0x00, 0xca, 0x65, 0xe9, 0xdc, 0x81, 0x69, 0x6c, 0x4c, 0xef, 0x64,
+  0xe2, 0xd9, 0x2e, 0x09, 0xe5, 0x3f, 0x12, 0x9c, 0x25, 0x26, 0x14, 0x56,
+  0xca, 0x00, 0xb8, 0xdd, 0x28, 0x3a, 0x62, 0xbe, 0xc0, 0x48, 0xc0, 0x28,
+  0xb1, 0x60, 0xde, 0xb4, 0x29, 0x84, 0xad, 0xe1, 0xdd, 0x6a, 0xc2, 0xc5,
+  0x55, 0xdd, 0xc9, 0x45, 0x4b, 0x96, 0x96, 0x57, 0x5d, 0xc6, 0xff, 0xe6,
+  0x22, 0x57, 0x81, 0x7e, 0x8b, 0x4b, 0x2e, 0xa2, 0x2b, 0xfd, 0x36, 0xdc,
+  0x24, 0x04, 0x58, 0xab, 0xfe, 0x9b, 0x31, 0x78, 0x91, 0xf3, 0x05, 0x40,
+  0xf4, 0x08, 0x3d, 0xfc, 0x40, 0xdc, 0xa7, 0xd8, 0xd4, 0x54, 0x18, 0x9a,
+  0x89, 0x4e, 0x4b, 0x91, 0x2c, 0xab, 0x88, 0x6b, 0xc0, 0x3a, 0x71, 0xef,
+  0xd7, 0xe4, 0xe2, 0x86, 0x90, 0xdb, 0xac, 0x9d, 0x4f, 0xac, 0x9a, 0xaf,
+  0x89, 0xc1, 0x3b, 0x36, 0x3c, 0x04, 0x55, 0xaa, 0x22, 0x06, 0x8e, 0xf9,
+  0xb7, 0xc5, 0xb4, 0x05, 0x5a, 0x97, 0x3b, 0xa7, 0x81, 0xad, 0xe0, 0xb7,
+  0x6a, 0x24, 0x3a, 0xec, 0xbd, 0x8d, 0x64, 0x3e, 0xaf, 0xbf, 0xaa, 0x0d,
+  0xa7, 0xed, 0x8b, 0xdc, 0xee, 0x1c, 0x82, 0xf4, 0x34, 0x9a, 0xa6, 0x4f,
+  0x6c, 0x02, 0xb7, 0xb6, 0x31, 0x45, 0x25, 0xe5, 0x4d, 0x9e, 0xc8, 0xd9,
+  0x65, 0x64, 0x02, 0x9b, 0x4e, 0x7c, 0xb0, 0xae, 0x32, 0xd8, 0x57, 0x49,
+  0x35, 0xde, 0xf6, 0x69, 0x93, 0x5c, 0xff, 0x8f, 0xfc, 0x26, 0xc3, 0x7f,
+  0xe0, 0x17, 0xf0, 0x03, 0xaf, 0xb7, 0xb7, 0x83, 0x33, 0x6f, 0x9d, 0x2f,
+  0x4f, 0x58, 0x67, 0x8c, 0xc2, 0x48, 0x0a, 0x05, 0x1c, 0xde, 0x56, 0x33,
+  0xfd, 0xfb, 0x54, 0x3b, 0xed, 0xbb, 0xd9, 0xe8, 0x0e, 0x11, 0x2a, 0xa5,
+  0xf3, 0x2a, 0x27, 0x61, 0x07, 0x59, 0x62, 0x6a, 0xe4, 0xc3, 0xcc, 0x87,
+  0x38, 0x02, 0x5d, 0x0d, 0x8f, 0xa4, 0x7d, 0xf1, 0x1d, 0xcc, 0x08, 0x78,
+  0x7c, 0x7d, 0x78, 0xb3, 0x9c, 0x26, 0xc4, 0x37, 0xab, 0x87, 0xaa, 0xf3,
+  0xac, 0x95, 0xa3, 0x97, 0x82, 0xdd, 0x14, 0x5c, 0x68, 0x53, 0x39, 0x29,
+  0xa7, 0x54, 0xb9, 0x56, 0x53, 0x21, 0x38, 0x21, 0x1f, 0x2d, 0x25, 0x4d,
+  0x78, 0x68, 0x56, 0x97, 0xb2, 0x32, 0xda, 0xe5, 0x4d, 0x13, 0xf4, 0x23,
+  0x8b, 0xb7, 0xb2, 0x62, 0x05, 0xf7, 0xc9, 0xf0, 0xf5, 0x57, 0xe8, 0xdb,
+  0x7a, 0xa0, 0x2e, 0x32, 0xac, 0xd5, 0xe2, 0xd6, 0x6d, 0x52, 0x53, 0x99,
+  0xc8, 0x59, 0x44, 0x73, 0x90, 0xbc, 0x68, 0x1f, 0xd6, 0xa9, 0x76, 0x75,
+  0x86, 0x9c, 0xe4, 0xf9, 0xca, 0x11, 0xd5, 0x77, 0x43, 0x7b, 0xe2, 0xa4,
+  0xb4, 0x73, 0xa2, 0xb7, 0xad, 0xe4, 0x67, 0x82, 0x20, 0x39, 0x53, 0x13,
+  0x97, 0x21, 0x64, 0x15, 0x8a, 0xbb, 0xb2, 0x8d, 0xae, 0x12, 0xe7, 0x75,
+  0x97, 0x8a, 0x3d, 0xc3, 0x7d, 0xc3, 0xec, 0x1a, 0xf8, 0x3a, 0x12, 0x10,
+  0x1e, 0xfe, 0xf5, 0x0b, 0xf3, 0x3a, 0xfe, 0x07, 0x6e, 0x33, 0xf5, 0x65,
+  0x58, 0xb1, 0x1a, 0x4c, 0x08, 0xd1, 0x77, 0x36, 0x29, 0x09, 0xc1, 0xc4,
+  0x5b, 0xd7, 0xba, 0xac, 0x68, 0x7f, 0xb1, 0x56, 0x8b, 0x56, 0x51, 0x34,
+  0x89, 0x78, 0xdc, 0x38, 0xf7, 0xd4, 0x5a, 0xcc, 0xc9, 0x97, 0x70, 0x13,
+  0xce, 0xbe, 0x65, 0xe2, 0x38, 0x73, 0x9d, 0xfa, 0x8f, 0x1d, 0x33, 0xf9,
+  0x1f, 0x3b, 0x76, 0xfa, 0x3f, 0x76, 0xec, 0x02, 0x7e, 0xec, 0x20, 0x18,
+  0x31, 0x2e, 0xc2, 0x37, 0x88, 0x7f, 0xe9, 0xa1, 0xaf, 0xf1, 0x57, 0xed,
+  0x47, 0x9d, 0x6f, 0x3a, 0x9f, 0xec, 0xac, 0xad, 0xda, 0x34, 0x37, 0x43,
+  0x80, 0xaa, 0x23, 0x9b, 0x7b, 0x08, 0xec, 0xba, 0xb6, 0x4d, 0x76, 0x5b,
+  0xd0, 0x38, 0x7b, 0xf4, 0x4a, 0x6e, 0xed, 0x03, 0xb8, 0xe3, 0xb6, 0x45,
+  0xa1, 0xd3, 0x7a, 0xc7, 0x60, 0x19, 0x9b, 0xa8, 0x21, 0x81, 0x58, 0x8e,
+  0x7d, 0x79, 0x64, 0x5e, 0xf7, 0xe4, 0xcf, 0x7f, 0xc2, 0x17, 0x48, 0xff,
+  0xa7, 0x31, 0xe4, 0x56, 0x13, 0x8c, 0x99, 0x64, 0x67, 0x53, 0xd9, 0x4c,
+  0xc6, 0xb9, 0x2b, 0x2c, 0xfe, 0x26, 0x5c, 0x6f, 0xca, 0x24, 0xe1, 0xc5,
+  0x36, 0xe7, 0x29, 0x35, 0xac, 0x84, 0x55, 0xcd, 0xd8, 0x42, 0xdd, 0x44,
+  0xa9, 0x40, 0x15, 0x10, 0xd4, 0x47, 0xb2, 0x24, 0x13, 0x5d, 0x8c, 0x57,
+  0x37, 0xae, 0xb9, 0x82, 0xa4, 0x51, 0x11, 0x9f, 0xe5, 0x45, 0xf9, 0xba,
+  0x53, 0x60, 0xff, 0xef, 0x68, 0x5a, 0x80, 0x06, 0xfb, 0x05, 0x92, 0xd6,
+  0x12, 0x0e, 0xcb, 0xde, 0xd3, 0x87, 0xde, 0xfc, 0x11, 0xe6, 0xbd, 0xf6,
+  0x8b, 0x28, 0xc3, 0x61, 0x69, 0x63, 0xca, 0xd5, 0xa2, 0x14, 0x87, 0x66,
+  0xb6, 0x1a, 0x5f, 0x5d, 0xe7, 0x52, 0xca, 0xef, 0x5f, 0x87, 0xc0, 0x4e,
+  0xbd, 0x85, 0x38, 0x9c, 0x97, 0x4c, 0xb5, 0xd7, 0x17, 0xdf, 0x7e, 0xa1,
+  0x03, 0xfc, 0xd8, 0xf9, 0xa1, 0xc7, 0x3f, 0x25, 0xd4, 0x88, 0x83, 0xe8,
+  0xe2, 0x5b, 0xa4, 0xee, 0x5f, 0xc6, 0xc0, 0x56, 0x7d, 0xe0, 0x2b, 0xfe,
+  0x0b, 0x51, 0xf6, 0xaa, 0x61, 0xaf, 0x6d, 0xb6, 0xdc, 0x6b, 0x6c, 0x63,
+  0x4f, 0xd5, 0xa6, 0x64, 0x85, 0x2f, 0x16, 0x58, 0x3f, 0xaa, 0x28, 0x09,
+  0x15, 0xa3, 0x24, 0x50, 0xd4, 0x28, 0x1e, 0xe6, 0x5c, 0x28, 0x53, 0xf9,
+  0x1d, 0x12, 0x08, 0xa1, 0x9d, 0xce, 0x56, 0x7c, 0x57, 0x0b, 0x72, 0x5c,
+  0x90, 0x3a, 0x5c, 0x4f, 0x36, 0xab, 0x57, 0xb4, 0x77, 0xa3, 0x93, 0x40,
+  0x2b, 0x1c, 0x0b, 0x71, 0xc7, 0x7f, 0x23, 0xbd, 0x8c, 0x90, 0xfc, 0xd0,
+  0xc4, 0xc2, 0xb6, 0x9a, 0x71, 0x91, 0x68, 0x9f, 0x34, 0xe9, 0xec, 0x4a,
+  0x01, 0x26, 0x20, 0x98, 0x40, 0x28, 0x40, 0xa2, 0x93, 0x52, 0x8e, 0x34,
+  0xc9, 0x67, 0x63, 0x89, 0x4a, 0x00, 0xd5, 0xf3, 0x01, 0x9b, 0x66, 0xaa,
+  0xa0, 0x71, 0xe0, 0x56, 0x48, 0xa4, 0x42, 0x3e, 0x1b, 0x50, 0x39, 0x24,
+  0x9a, 0xc8, 0xde, 0x38, 0x37, 0xfb, 0x84, 0x09, 0xff, 0x0b, 0x34, 0xfa,
+  0x87, 0x09, 0x39, 0x9f, 0x4c, 0x6d, 0x7e, 0x4f, 0x9c, 0xc3, 0x01, 0x0f,
+  0x4e, 0x64, 0xee, 0x8d, 0x5e, 0x1c, 0x4e, 0x86, 0xd3, 0x82, 0x7d, 0xcc,
+  0x16, 0x7e, 0x87, 0x2a, 0xa1, 0x94, 0x33, 0x69, 0x7f, 0x33, 0x14, 0x2f,
+  0xe1, 0xc5, 0x9a, 0xdc, 0x19, 0xdc, 0x21, 0xff, 0xb6, 0x45, 0x7f, 0x14,
+  0x5f, 0xb2, 0x93, 0x62, 0x43, 0xab, 0x97, 0xc3, 0xea, 0x7b, 0x2f, 0xfc,
+  0x20, 0xa9, 0xa1, 0xbd, 0xed, 0x03, 0xa7, 0x57, 0x1d, 0xff, 0x2c, 0x3c,
+  0xbc, 0x0b, 0x05, 0xa6, 0x01, 0xe2, 0x52, 0xb6, 0x7f, 0xc5, 0xf8, 0x3b,
+  0x66, 0xfc, 0xcf, 0x02, 0xe8, 0x5b, 0x8c, 0x8f, 0x15, 0xfe, 0xec, 0xb5,
+  0x4d, 0x05, 0x57, 0x2f, 0xaa, 0xf1, 0x64, 0xd4, 0x7c, 0x08, 0x0a, 0xfc,
+  0xcf, 0xc8, 0x5c, 0x1c, 0x6e, 0xf0, 0x5b, 0xfd, 0x30, 0x68, 0x31, 0x99,
+  0x81, 0xb4, 0x0e, 0xd8, 0xc6, 0xa6, 0x89, 0xc8, 0xa2, 0x5e, 0x08, 0x2b,
+  0x9f, 0x23, 0x10, 0xf7, 0xf8, 0xc0, 0x76, 0x3e, 0x66, 0x28, 0xa1, 0xd4,
+  0xad, 0xb2, 0xb2, 0x68, 0x0a, 0x5e, 0x71, 0x7b, 0x0d, 0xe6, 0xde, 0xfb,
+  0x14, 0xb0, 0x62, 0x06, 0xe0, 0x73, 0xda, 0xf2, 0xae, 0xad, 0xaf, 0x89,
+  0x53, 0x05, 0x3f, 0x84, 0x0d, 0x83, 0x29, 0x1d, 0x96, 0x20, 0x39, 0x62,
+  0x42, 0x4e, 0x12, 0x5f, 0x4e, 0x2f, 0xa0, 0x75, 0x1c, 0x48, 0x96, 0x83,
+  0xdc, 0x09, 0x86, 0x8b, 0xa3, 0x0c, 0x14, 0xb5, 0x9b, 0x19, 0xda, 0xb1,
+  0x06, 0x11, 0xe7, 0x1b, 0xc9, 0xce, 0x16, 0xcb, 0x60, 0x6c, 0x9b, 0xda,
+  0x9c, 0xf5, 0x38, 0x5a, 0x7b, 0xbd, 0xb1, 0x66, 0x96, 0xd6, 0x6e, 0x16,
+  0x79, 0x7d, 0x7f, 0x35, 0x08, 0x69, 0xba, 0x81, 0x93, 0x67, 0x69, 0x8e,
+  0xb9, 0x0f, 0x49, 0x8f, 0x0e, 0x34, 0x88, 0xa3, 0x5a, 0x56, 0xe2, 0xed,
+  0xa4, 0xf2, 0x22, 0xba, 0x9d, 0x8c, 0xf8, 0xc5, 0x24, 0x1e, 0xcf, 0x2a,
+  0x2c, 0xd8, 0xa2, 0x92, 0x3a, 0xc6, 0x7c, 0x2d, 0x0f, 0x1c, 0x7d, 0x3c,
+  0x70, 0x3d, 0x31, 0x90, 0x43, 0xad, 0x74, 0xc4, 0x25, 0xe2, 0x78, 0x34,
+  0x56, 0xa9, 0xde, 0x6b, 0xaf, 0xd7, 0x59, 0x60, 0x59, 0x7f, 0x9a, 0xf3,
+  0xed, 0xb5, 0xe8, 0xc7, 0x30, 0xba, 0x41, 0xc4, 0xef, 0x3a, 0x16, 0x82,
+  0x90, 0xed, 0x53, 0x6f, 0x44, 0x87, 0xc3, 0x7c, 0xfc, 0xf8, 0x25, 0x85,
+  0x9d, 0xe4, 0x95, 0xc3, 0x4d, 0xfa, 0x51, 0x43, 0x65, 0x6e, 0x1b, 0x88,
+  0x46, 0x81, 0xa3, 0xa2, 0x3f, 0xbf, 0xc2, 0xc7, 0xd5, 0x62, 0x58, 0x8b,
+  0xfa, 0x7d, 0x60, 0x42, 0xe5, 0x9c, 0x9a, 0x32, 0xae, 0x10, 0x2c, 0x8c,
+  0x7a, 0x4a, 0x22, 0x96, 0x52, 0x9b, 0x18, 0xb8, 0x8a, 0x3c, 0x3b, 0x6a,
+  0x65, 0xb3, 0x13, 0x92, 0x7f, 0x55, 0xbc, 0xee, 0x47, 0x47, 0x26, 0x57,
+  0x32, 0x09, 0x74, 0x4a, 0xc0, 0x6b, 0xcc, 0xb2, 0xc3, 0x01, 0x06, 0xf9,
+  0x7c, 0x98, 0x8a, 0x9b, 0x7d, 0x9c, 0xd7, 0xd0, 0x97, 0x19, 0xd9, 0x07,
+  0x84, 0x7b, 0x18, 0x2f, 0x93, 0x72, 0x0f, 0x31, 0x46, 0xc4, 0xee, 0x74,
+  0x63, 0xbf, 0xc8, 0xd4, 0x7a, 0x27, 0x02, 0xcf, 0xa8, 0x6c, 0xb4, 0x1b,
+  0xbd, 0x34, 0x5f, 0x0a, 0xe4, 0x1f, 0xb2, 0xc5, 0x5f, 0x46, 0x9f, 0xf7,
+  0xf0, 0x29, 0xa7, 0x67, 0xb8, 0xd0, 0x7d, 0x3d, 0x83, 0xa3, 0x2b, 0x4a,
+  0x61, 0x8f, 0xd2, 0x53, 0x03, 0x65, 0x99, 0x24, 0x09, 0x86, 0x71, 0x99,
+  0xbc, 0xd8, 0x53, 0xf5, 0x92, 0x77, 0xa9, 0x54, 0xff, 0x6d, 0xcd, 0x09,
+  0xcb, 0x72, 0xc8, 0x59, 0x50, 0xf3, 0x22, 0x10, 0xbc, 0x04, 0x2a, 0x67,
+  0xd8, 0x02, 0x92, 0x2b, 0x31, 0x50, 0x9a, 0x82, 0x22, 0x39, 0xad, 0xa8,
+  0xae, 0xf4, 0xe5, 0x0b, 0x67, 0xd2, 0x4f, 0xb8, 0x2b, 0x1a, 0x9c, 0x54,
+  0x56, 0xd8, 0x5c, 0x91, 0xda, 0xeb, 0xf0, 0x5d, 0xef, 0x5e, 0xa2, 0xaf,
+  0x83, 0xe1, 0x27, 0x65, 0x8d, 0xc6, 0xc1, 0xf8, 0xd4, 0x35, 0x72, 0x2f,
+  0xc1, 0x17, 0x4a, 0x38, 0xcd, 0x4f, 0xaf, 0x24, 0x6a, 0xc7, 0x44, 0xd2,
+  0xf7, 0x79, 0x12, 0x4c, 0xd8, 0x4f, 0xd3, 0x35, 0x06, 0x11, 0x26, 0xcb,
+  0x82, 0xa4, 0x8f, 0x3c, 0xc6, 0x4a, 0x82, 0x56, 0xab, 0x8a, 0x9e, 0xfe,
+  0xfe, 0xe8, 0xfc, 0xc3, 0xd1, 0xd9, 0xf3, 0x7b, 0xc3, 0xd5, 0xda, 0x8d,
+  0x3e, 0x51, 0x09, 0xe1, 0x42, 0xda, 0x34, 0x00, 0xdf, 0xc2, 0x80, 0x36,
+  0x5e, 0xd4, 0x01, 0x01, 0x6e, 0x9a, 0x39, 0xdb, 0x58, 0x3a, 0x8c, 0x74,
+  0x85, 0x49, 0x22, 0x61, 0x20, 0x38, 0xae, 0xf6, 0x90, 0x10, 0xb9, 0x93,
+  0xbf, 0x1f, 0x97, 0xd2, 0x99, 0xb7, 0xa3, 0xef, 0xe3, 0xeb, 0x1d, 0x29,
+  0x21, 0x32, 0x68, 0x21, 0x21, 0x2a, 0x37, 0x08, 0x27, 0x26, 0xf5, 0x6a,
+  0xc1, 0xb0, 0xdc, 0x63, 0x11, 0x68, 0x35, 0xef, 0x5b, 0x3e, 0x99, 0xd8,
+  0x34, 0xd8, 0x66, 0x84, 0xef, 0xf8, 0xb8, 0x1d, 0x78, 0xe1, 0x53, 0x62,
+  0x66, 0x37, 0xea, 0x92, 0x68, 0x1b, 0x2d, 0x77, 0xef, 0x55, 0x39, 0x63,
+  0x92, 0x1c, 0xca, 0xdc, 0xc2, 0xbb, 0x0a, 0x13, 0x74, 0xf1, 0x63, 0x54,
+  0xc5, 0xa5, 0xa6, 0xe3, 0x83, 0x93, 0x2b, 0xda, 0xac, 0xcb, 0xa3, 0xc1,
+  0xc0, 0xc8, 0xc2, 0x52, 0xd2, 0x12, 0xba, 0x9e, 0x31, 0x46, 0x6a, 0xa4,
+  0xdb, 0xfc, 0xaa, 0x1f, 0x99, 0x7e, 0xe1, 0x92, 0xd4, 0x4f, 0xb1, 0x1f,
+  0xb0, 0xf9, 0xae, 0x97, 0x73, 0xb8, 0x30, 0xa0, 0xf1, 0x8e, 0xd7, 0x4a,
+  0x09, 0xc5, 0x36, 0x09, 0x0f, 0x39, 0x97, 0x68, 0x52, 0x9c, 0x14, 0x89,
+  0xff, 0x79, 0x8b, 0xf5, 0x53, 0x12, 0x43, 0x42, 0x2e, 0xcf, 0xc1, 0x6b,
+  0x17, 0xe8, 0xbc, 0x1b, 0x76, 0xa6, 0x77, 0x06, 0xa7, 0xd7, 0x27, 0xb0,
+  0x7d, 0x1f, 0xae, 0xdf, 0x75, 0x24, 0x75, 0xa1, 0x89, 0x85, 0x44, 0x4e,
+  0x7b, 0x6c, 0xf4, 0x7d, 0x67, 0x30, 0x13, 0x0a, 0x76, 0xa4, 0x80, 0xb5,
+  0x10, 0xd2, 0xc0, 0xed, 0x47, 0xfb, 0x2b, 0x4e, 0x69, 0xbf, 0xbf, 0xdf,
+  0x3c, 0xa5, 0xf6, 0xa6, 0x05, 0x0c, 0x63, 0xef, 0x91, 0xbb, 0x60, 0xe3,
+  0x63, 0xf6, 0xd4, 0xa6, 0x6d, 0xa1, 0x45, 0x41, 0x36, 0xc2, 0x58, 0x8b,
+  0x19, 0x10, 0xc5, 0xc3, 0x50, 0x55, 0x40, 0x59, 0x27, 0x2e, 0x4e, 0x08,
+  0xfe, 0x06, 0x74, 0x4e, 0xbc, 0xbd, 0x1c, 0x0e, 0x85, 0x13, 0x8b, 0x8b,
+  0xb1, 0x01, 0x07, 0xf0, 0xf5, 0x43, 0xcd, 0xf5, 0xc3, 0x84, 0x73, 0x20,
+  0x01, 0x6d, 0xcc, 0x55, 0xc3, 0x6c, 0xf0, 0x3b, 0xec, 0xd8, 0x7c, 0xbe,
+  0x70, 0x4b, 0x05, 0xf2, 0xa2, 0x53, 0xaf, 0x2e, 0xd3, 0x1b, 0x60, 0x65,
+  0xf6, 0x63, 0xb8, 0x0b, 0x00, 0xee, 0xab, 0xe4, 0x8b, 0x1c, 0xf2, 0x9f,
+  0x61, 0x7a, 0x27, 0x91, 0x5b, 0xe4, 0x33, 0x76, 0x20, 0xca, 0x1b, 0x9c,
+  0xc4, 0xc9, 0x25, 0x8f, 0x52, 0x8d, 0x57, 0x50, 0xc2, 0xa1, 0x84, 0x68,
+  0x30, 0x09, 0x34, 0xf3, 0x9b, 0x2f, 0xae, 0x0f, 0x36, 0x8c, 0xa7, 0xf5,
+  0x9a, 0x22, 0x8a, 0x34, 0x5a, 0xa0, 0x96, 0xd5, 0xc1, 0xd7, 0x15, 0xf5,
+  0x32, 0x84, 0xf1, 0xe6, 0xdc, 0x5e, 0xdf, 0x62, 0x22, 0x46, 0x3d, 0xba,
+  0x1f, 0xb7, 0x20, 0x96, 0x92, 0x5b, 0x8b, 0x92, 0xc8, 0xc8, 0x06, 0xe4,
+  0xaa, 0x84, 0xe3, 0xef, 0xdf, 0x38, 0x2d, 0xd7, 0x34, 0x4f, 0x8d, 0xe9,
+  0x45, 0x14, 0xd2, 0x36, 0x4c, 0xd0, 0xc4, 0x26, 0x5b, 0xf6, 0x29, 0xa8,
+  0x3a, 0x4e, 0x92, 0x85, 0x69, 0x70, 0x91, 0x52, 0xa5, 0x65, 0x5a, 0x52,
+  0x10, 0x55, 0x9a, 0x8b, 0x50, 0x53, 0xd1, 0x96, 0xd9, 0x09, 0xeb, 0xd0,
+  0x4c, 0x7d, 0xb2, 0x77, 0xb0, 0x85, 0x24, 0x86, 0x71, 0xb7, 0x5f, 0xee,
+  0x7e, 0x0e, 0xb2, 0xf9, 0x91, 0xf2, 0xc0, 0xed, 0x96, 0x31, 0x22, 0x7c,
+  0x3b, 0xda, 0xab, 0x18, 0x35, 0x9a, 0xde, 0x2b, 0xa0, 0x3a, 0x51, 0x89,
+  0x66, 0x04, 0x39, 0xa8, 0x04, 0xe2, 0xc2, 0x47, 0x24, 0x83, 0x4d, 0x94,
+  0x0d, 0x93, 0xa4, 0x3b, 0xda, 0x27, 0x4e, 0x10, 0xeb, 0x3b, 0x04, 0x8c,
+  0x6d, 0xaa, 0xb0, 0x9f, 0x26, 0xb0, 0x94, 0xab, 0x93, 0xeb, 0x2b, 0xf8,
+  0x63, 0x70, 0x7d, 0x71, 0xd5, 0x82, 0xcf, 0x5b, 0x31, 0x58, 0x13, 0x6e,
+  0x9a, 0xa6, 0xab, 0xd0, 0x36, 0xd7, 0xb1, 0x3b, 0x29, 0x13, 0x9a, 0xd9,
+  0x4e, 0x19, 0x84, 0x7b, 0x74, 0x50, 0x1f, 0xcb, 0x7e, 0x6d, 0xa1, 0x13,
+  0x90, 0x0f, 0x2b, 0x17, 0xc6, 0x67, 0xbe, 0x9a, 0x42, 0x68, 0xc1, 0x48,
+  0x8c, 0xb8, 0x62, 0xc3, 0xe8, 0x69, 0xb6, 0x60, 0xb4, 0xa1, 0xf3, 0xdf,
+  0x36, 0x33, 0xd1, 0xd2, 0x90, 0x16, 0x4c, 0x5b, 0x4e, 0xcd, 0xe5, 0x16,
+  0x5d, 0x0a, 0xa2, 0x85, 0xea, 0x57, 0x47, 0x01, 0x61, 0x3a, 0xd1, 0x3a,
+  0x39, 0x90, 0x45, 0x2f, 0x79, 0x82, 0x7e, 0x41, 0x17, 0xda, 0xb0, 0x0b,
+  0x2e, 0xf3, 0x79, 0xc2, 0x1e, 0x7e, 0x4e, 0xce, 0x55, 0xe6, 0xc4, 0xb2,
+  0x85, 0xd1, 0xc9, 0xa3, 0x10, 0x2a, 0x92, 0x01, 0x92, 0xc4, 0x53, 0x5e,
+  0x33, 0xb8, 0x32, 0xb9, 0x50, 0x07, 0x9f, 0x4b, 0x02, 0x96, 0x6a, 0x45,
+  0x08, 0x9d, 0x6b, 0x3a, 0x2b, 0x07, 0x61, 0xb2, 0xce, 0xbc, 0xb7, 0x9b,
+  0x4c, 0x06, 0xa1, 0x79, 0xc2, 0x9c, 0x85, 0xba, 0xa9, 0x2a, 0xc4, 0x0a,
+  0x25, 0x5a, 0x69, 0x8e, 0x0d, 0xe9, 0x12, 0x6e, 0x17, 0xe9, 0x4b, 0x79,
+  0x2a, 0x18, 0x56, 0xa3, 0x1a, 0x76, 0xac, 0xac, 0x32, 0xb4, 0x2d, 0x47,
+  0xce, 0x21, 0x9a, 0x65, 0x93, 0xe9, 0xd6, 0xf4, 0x39, 0x9f, 0xcd, 0xaa,
+  0xd2, 0x16, 0xd9, 0xbe, 0x7c, 0x1e, 0x26, 0x51, 0x6b, 0xf3, 0xc7, 0xb6,
+  0x5e, 0x01, 0x4d, 0x0d, 0x86, 0xd2, 0xad, 0xac, 0x93, 0x21, 0xa7, 0x7e,
+  0x3d, 0x21, 0x1c, 0xb5, 0xe8, 0x43, 0x26, 0xf8, 0x61, 0x19, 0xd8, 0x16,
+  0x94, 0xff, 0x30, 0x36, 0x9b, 0x86, 0xb0, 0x7a, 0x98, 0xb6, 0xc5, 0x42,
+  0x6b, 0x9c, 0xb3, 0x42, 0x4f, 0xc8, 0xfe, 0x3e, 0x50, 0x24, 0xf9, 0x90,
+  0x29, 0x9b, 0x40, 0x25, 0x8d, 0x8c, 0x67, 0xed, 0x92, 0x51, 0xd5, 0x5c,
+  0x29, 0x61, 0xfd, 0x78, 0x0b, 0xbd, 0x74, 0x0f, 0x8d, 0x59, 0x1a, 0x59,
+  0x3f, 0x96, 0x17, 0x54, 0x0c, 0xb9, 0xc3, 0xb8, 0x3a, 0xea, 0x15, 0x10,
+  0x70, 0xa3, 0x2c, 0x58, 0xa0, 0xcb, 0xc0, 0x46, 0xcb, 0x6c, 0x86, 0x39,
+  0xe2, 0x75, 0xc0, 0x20, 0x55, 0x03, 0xfb, 0x2b, 0xb0, 0x0c, 0x5c, 0x7c,
+  0xa1, 0x1a, 0x49, 0xd6, 0x51, 0x5b, 0xea, 0xab, 0x6b, 0xc5, 0x7f, 0x20,
+  0x02, 0xbd, 0xc2, 0x23, 0x53, 0x5c, 0x62, 0xa5, 0xad, 0x34, 0x4b, 0x11,
+  0x4f, 0x2e, 0x2f, 0x36, 0xb1, 0x56, 0x11, 0x91, 0x5b, 0xc1, 0xaa, 0xcc,
+  0x67, 0xd4, 0xe0, 0x4d, 0x55, 0x37, 0xaf, 0xa1, 0x9e, 0xaa, 0x72, 0x8c,
+  0xc4, 0x06, 0x83, 0xf7, 0x03, 0x55, 0x82, 0x02, 0xce, 0x9f, 0xb8, 0xe0,
+  0x41, 0xfd, 0x50, 0x53, 0x50, 0xce, 0x08, 0xa1, 0x8c, 0xc7, 0xba, 0x3a,
+  0xa6, 0x0d, 0xaa, 0xb5, 0xc5, 0x14, 0x9d, 0x2b, 0xa9, 0x7c, 0x94, 0x7f,
+  0xdf, 0x52, 0xd1, 0xad, 0xed, 0xbd, 0x08, 0x22, 0x10, 0x76, 0xa5, 0xcb,
+  0xd9, 0x21, 0xf5, 0x9b, 0x49, 0x96, 0x43, 0xfd, 0x6b, 0x65, 0x52, 0x2d,
+  0x17, 0xbe, 0x9c, 0xb7, 0x18, 0x04, 0x66, 0x44, 0x0d, 0x8a, 0x3a, 0x53,
+  0x44, 0x6c, 0x1d, 0xbb, 0xfd, 0x6e, 0x8f, 0x96, 0xe6, 0x6d, 0x24, 0x4d,
+  0xc0, 0x93, 0xee, 0x6d, 0x78, 0x30, 0x2a, 0x5e, 0xb0, 0x4d, 0x7c, 0xd4,
+  0x01, 0xfd, 0x62, 0xab, 0xc3, 0x70, 0x3b, 0x52, 0xbc, 0x2b, 0x65, 0x4f,
+  0xfa, 0x36, 0xec, 0x8b, 0x33, 0x5f, 0xff, 0xce, 0x68, 0x3d, 0x8a, 0x14,
+  0xae, 0xe3, 0xe9, 0xac, 0x7f, 0xc8, 0xd2, 0x07, 0xba, 0xbf, 0x1b, 0x9f,
+  0xb5, 0x2e, 0x7d, 0xc5, 0xac, 0x3a, 0xdb, 0xaf, 0x76, 0xfa, 0xdb, 0x2f,
+  0x3e, 0xef, 0x6f, 0x53, 0x3f, 0x73, 0x67, 0x6e, 0xb6, 0xef, 0xb6, 0x33,
+  0x50, 0xa0, 0xab, 0x7b, 0xd4, 0x8e, 0xeb, 0xce, 0x5f, 0x98, 0x3f, 0xf6,
+  0xf1, 0xb9, 0x3e, 0xf7, 0x56, 0xf3, 0xbe, 0x31, 0x07, 0x9d, 0x26, 0xcd,
+  0xbc, 0x38, 0x48, 0xcf, 0x66, 0x15, 0x31, 0x2d, 0x2e, 0x52, 0x24, 0x23,
+  0xc5, 0x5a, 0x76, 0xf6, 0x49, 0xdb, 0xc2, 0x9a, 0x36, 0x57, 0x74, 0x3b,
+  0xc3, 0x33, 0x52, 0x96, 0x3e, 0x12, 0x35, 0xd2, 0x72, 0x75, 0xf3, 0x7d,
+  0x8f, 0x6d, 0xfe, 0x62, 0xab, 0x0f, 0x81, 0xbc, 0xcc, 0xa5, 0x6b, 0x82,
+  0x35, 0x12, 0xd0, 0x5f, 0x13, 0x2b, 0x4e, 0xa0, 0xbf, 0xf8, 0x41, 0xd5,
+  0xb8, 0x4d, 0x40, 0xdc, 0x15, 0x32, 0x04, 0x81, 0x67, 0x2b, 0x71, 0x5c,
+  0x3c, 0x09, 0x1a, 0xd9, 0xa0, 0x05, 0x34, 0x40, 0xfd, 0x0c, 0xd8, 0x1e,
+  0x33, 0x69, 0x1d, 0x0e, 0xdf, 0xf9, 0xf3, 0x9f, 0x2d, 0x47, 0x1a, 0x50,
+  0x16, 0x0c, 0x75, 0x74, 0xda, 0x27, 0xc0, 0x6e, 0x8e, 0x55, 0x73, 0x6f,
+  0x98, 0xce, 0xc1, 0x5f, 0xc9, 0x39, 0xfc, 0x53, 0xef, 0xaf, 0xf0, 0xcf,
+  0x9f, 0x3a, 0x7a, 0xa9, 0x19, 0x9c, 0xd1, 0x16, 0x8c, 0x58, 0x10, 0x5c,
+  0x3a, 0xa0, 0x6e, 0x54, 0x6f, 0x4e, 0x4e, 0x9a, 0xc1, 0xf5, 0xf1, 0x25,
+  0x5f, 0xc6, 0x82, 0xc3, 0xde, 0x44, 0xcd, 0xc8, 0x87, 0x48, 0xad, 0x47,
+  0x16, 0x4e, 0x7d, 0x95, 0x98, 0x4e, 0xcc, 0x5e, 0x3a, 0xaf, 0x74, 0x6d,
+  0x52, 0xc3, 0x3d, 0x73, 0x80, 0x18, 0xf4, 0xdb, 0x29, 0xfa, 0x57, 0x18,
+  0x98, 0x04, 0xf8, 0xae, 0x2a, 0xd2, 0xd2, 0x37, 0x1e, 0xe1, 0x1d, 0x81,
+  0x0d, 0x98, 0xeb, 0x70, 0x0f, 0x53, 0xea, 0x46, 0x02, 0x82, 0xce, 0xb5,
+  0x11, 0x95, 0x20, 0xea, 0xc2, 0x36, 0xc0, 0x46, 0x29, 0xb7, 0x2d, 0xd2,
+  0xf2, 0x16, 0xd7, 0x27, 0x65, 0x3e, 0x4e, 0xae, 0x10, 0xce, 0xe7, 0x33,
+  0xa3, 0xf5, 0x3d, 0x2a, 0x70, 0x99, 0x29, 0xdf, 0x76, 0x76, 0xd6, 0x4a,
+  0x07, 0x3d, 0x76, 0x85, 0x23, 0x0e, 0x82, 0x2f, 0xca, 0x63, 0x45, 0xf2,
+  0x0c, 0x4c, 0x50, 0x49, 0x85, 0xb9, 0x04, 0x3d, 0xd7, 0x90, 0x86, 0x03,
+  0xd0, 0x87, 0xc0, 0x26, 0x48, 0x2c, 0x28, 0xfd, 0x36, 0x9a, 0x52, 0x0b,
+  0xfb, 0x94, 0xa1, 0xa3, 0x98, 0x41, 0x02, 0x0d, 0xca, 0x25, 0x75, 0x4e,
+  0xc4, 0xf2, 0x89, 0x02, 0xa6, 0x31, 0xee, 0x2a, 0x42, 0x0b, 0xdf, 0x0c,
+  0x0c, 0xf2, 0xaa, 0x4e, 0xf7, 0x59, 0xd0, 0x56, 0xa0, 0x8b, 0x66, 0x95,
+  0xd1, 0x19, 0xfb, 0xd4, 0x71, 0xf3, 0x69, 0xd7, 0xf1, 0x4f, 0xe0, 0xd6,
+  0xda, 0x57, 0xf3, 0x3e, 0x43, 0xcf, 0x12, 0xb5, 0x2d, 0x6d, 0x8a, 0x76,
+  0x9c, 0xfe, 0x3c, 0x04, 0xd4, 0xee, 0x08, 0xd5, 0x9d, 0x2d, 0xdf, 0x95,
+  0x52, 0xde, 0xa6, 0xbc, 0xc9, 0xbd, 0x74, 0xf1, 0xf4, 0x06, 0x2a, 0xd8,
+  0x23, 0x1e, 0x69, 0x8d, 0xb3, 0x18, 0x09, 0x53, 0x2e, 0xa7, 0x53, 0x42,
+  0x46, 0xf2, 0x33, 0xf3, 0xa8, 0x62, 0x51, 0x0a, 0x07, 0xa4, 0xab, 0x0d,
+  0x30, 0x72, 0x9a, 0xb9, 0xee, 0x86, 0x2d, 0x8b, 0x14, 0x86, 0x53, 0xda,
+  0xfe, 0x54, 0xad, 0x00, 0x0a, 0xd8, 0xd1, 0x54, 0xae, 0xb7, 0xd5, 0x64,
+  0x8a, 0xa4, 0xa7, 0x13, 0x6d, 0xf2, 0x41, 0x4c, 0x0d, 0xf2, 0x32, 0x60,
+  0x99, 0x23, 0x92, 0xaf, 0xa1, 0x9d, 0xf7, 0xad, 0x74, 0x37, 0xa2, 0x87,
+  0x0d, 0xbb, 0xa4, 0x31, 0x28, 0x5b, 0x3a, 0x11, 0x28, 0x57, 0xc6, 0xe2,
+  0x2c, 0x0c, 0xb6, 0x21, 0xeb, 0x95, 0xc2, 0x8f, 0x9a, 0x52, 0x73, 0x42,
+  0xdb, 0xb1, 0xca, 0x2f, 0x60, 0x59, 0xa1, 0xab, 0x2d, 0xed, 0xf5, 0x77,
+  0xbc, 0x83, 0x2d, 0x67, 0xbd, 0xd1, 0x68, 0xd4, 0x23, 0x3d, 0xe0, 0x90,
+  0x95, 0x93, 0x4d, 0x51, 0x0e, 0x5a, 0x7c, 0x06, 0x83, 0x44, 0xf6, 0xfb,
+  0xf8, 0xf8, 0x58, 0xf4, 0x98, 0xeb, 0x9b, 0x86, 0x46, 0x61, 0x60, 0x07,
+  0x45, 0xa3, 0x0a, 0x35, 0xbb, 0x2d, 0x6f, 0x96, 0x15, 0x12, 0x2b, 0x2b,
+  0xf2, 0xca, 0x7a, 0x4d, 0x8d, 0x6c, 0x03, 0x1b, 0x3a, 0x87, 0x03, 0xe9,
+  0xda, 0xcc, 0x44, 0x18, 0xdb, 0x3b, 0x9a, 0x05, 0xb7, 0xc1, 0xa2, 0x17,
+  0x65, 0xec, 0x66, 0xa3, 0x6d, 0x9e, 0xaa, 0x0b, 0xe0, 0xa8, 0x13, 0x2c,
+  0x43, 0x99, 0x6c, 0x3a, 0x0a, 0x7d, 0x36, 0x4e, 0x25, 0x03, 0x2c, 0x96,
+  0x6f, 0x35, 0xc7, 0x7e, 0xe2, 0x3c, 0x64, 0xab, 0xeb, 0x47, 0xf2, 0xa2,
+  0xf5, 0x48, 0x82, 0x9b, 0x8f, 0x56, 0x15, 0x6e, 0xfb, 0xfa, 0x31, 0xe1,
+  0x4a, 0x1f, 0xcb, 0x85, 0x38, 0xbe, 0xc1, 0xfc, 0xad, 0x19, 0x1e, 0x0e,
+  0x4c, 0xb9, 0x64, 0x26, 0x20, 0xf2, 0x63, 0x30, 0x38, 0xdb, 0xbc, 0x3e,
+  0x1b, 0x78, 0x19, 0xef, 0x8f, 0xe8, 0x32, 0x26, 0xd7, 0x70, 0xdd, 0xe5,
+  0xc9, 0x5b, 0x44, 0x2d, 0x02, 0xf2, 0x49, 0x9d, 0xc2, 0xf9, 0x2b, 0x41,
+  0xd4, 0xab, 0x65, 0xa6, 0xc5, 0x30, 0x46, 0x76, 0x67, 0x49, 0x46, 0x50,
+  0x22, 0x28, 0xc2, 0xe9, 0x06, 0x50, 0x42, 0x6c, 0x19, 0x9d, 0x1f, 0x5d,
+  0x63, 0x79, 0x4b, 0x25, 0x29, 0x1e, 0xe8, 0x02, 0xf2, 0x3d, 0xe3, 0xf7,
+  0x06, 0x9d, 0x86, 0xa2, 0x36, 0xf1, 0xc8, 0xb6, 0xc4, 0x52, 0x65, 0x9d,
+  0x8f, 0xaf, 0x54, 0xc2, 0x5b, 0xb5, 0xfd, 0xb0, 0xa5, 0x22, 0x1d, 0x9a,
+  0x34, 0xdf, 0x3c, 0x8d, 0xed, 0xe0, 0x69, 0xf0, 0x06, 0x84, 0xaf, 0xc3,
+  0x95, 0xb0, 0x72, 0xdd, 0x68, 0xc1, 0x72, 0xd1, 0xe9, 0xcf, 0xf2, 0x69,
+  0x8a, 0x9e, 0x40, 0x3a, 0x2f, 0x37, 0xf0, 0xe6, 0xb9, 0x49, 0x79, 0x77,
+  0x4a, 0x2e, 0xc5, 0xa9, 0xc3, 0x98, 0xf3, 0x15, 0x41, 0x39, 0x61, 0xf6,
+  0xd4, 0x74, 0xe3, 0xd3, 0x12, 0x48, 0xbf, 0xc2, 0x90, 0x10, 0x54, 0xd3,
+  0x11, 0x98, 0x08, 0x23, 0xcc, 0xfe, 0xa0, 0x72, 0xc0, 0xb2, 0x9e, 0x62,
+  0x9b, 0xd6, 0xc0, 0x59, 0xd5, 0x43, 0x5a, 0xfa, 0xb1, 0x0a, 0xd2, 0x14,
+  0x64, 0x85, 0x2b, 0xfd, 0xf0, 0x2f, 0x6a, 0xc2, 0xe3, 0x1b, 0xb4, 0xc8,
+  0xa6, 0x9e, 0xd0, 0x35, 0x58, 0x44, 0x01, 0xfc, 0x57, 0x52, 0x51, 0x09,
+  0xe4, 0x45, 0x3a, 0xdc, 0xbb, 0x8d, 0x3d, 0x56, 0xf5, 0x70, 0xe8, 0x36,
+  0x9b, 0x5a, 0x32, 0x36, 0x6d, 0xbd, 0x65, 0x41, 0x0d, 0x20, 0x4e, 0x13,
+  0x7d, 0x1b, 0xc3, 0x7d, 0x73, 0x62, 0x9b, 0xe8, 0x34, 0x50, 0xe4, 0x6a,
+  0x0d, 0x76, 0x38, 0x0e, 0x89, 0x31, 0xa8, 0x7b, 0xec, 0xc5, 0x7d, 0xdf,
+  0x62, 0xe4, 0xb0, 0x12, 0x7b, 0x6d, 0x7b, 0x72, 0xf0, 0xfd, 0x60, 0x2d,
+  0x30, 0x31, 0x59, 0xaa, 0x08, 0x40, 0xa6, 0x01, 0xfa, 0x7f, 0x5f, 0xb3,
+  0x3d, 0xe2, 0xfa, 0x01, 0x3f, 0x84, 0x4a, 0x07, 0x1f, 0x46, 0xde, 0x86,
+  0x9e, 0xba, 0x76, 0xc2, 0xf6, 0xbb, 0x7e, 0x93, 0x27, 0x5e, 0xde, 0xea,
+  0xf9, 0xbc, 0x3b, 0x39, 0x7a, 0xd3, 0x8a, 0x62, 0xf2, 0x29, 0xf0, 0xe5,
+  0xad, 0x57, 0x73, 0x98, 0x70, 0x2f, 0xa0, 0xa5, 0x3a, 0x4a, 0xe8, 0x74,
+  0x94, 0x50, 0x19, 0xab, 0x26, 0x21, 0xf0, 0x16, 0xbc, 0x21, 0xad, 0x2d,
+  0x71, 0x5a, 0x3d, 0x23, 0x6e, 0xf6, 0x81, 0x78, 0xac, 0x51, 0x53, 0xe6,
+  0xda, 0x2a, 0x87, 0x90, 0xa7, 0x44, 0xc8, 0xb3, 0x7c, 0x98, 0x4f, 0x26,
+  0x2b, 0xa4, 0x3b, 0x83, 0x04, 0x53, 0x0d, 0x14, 0x13, 0x4c, 0x07, 0xb7,
+  0x11, 0xdf, 0x1b, 0xe2, 0xec, 0x09, 0xbb, 0xa2, 0xe8, 0x48, 0x61, 0x02,
+  0xa9, 0xe4, 0xde, 0xdd, 0xa8, 0x17, 0xa6, 0xab, 0xcd, 0xa0, 0x26, 0x1e,
+  0x15, 0xe6, 0xb3, 0x3b, 0x46, 0xd3, 0x84, 0x4c, 0x7b, 0x97, 0x32, 0xfa,
+  0xc7, 0x3f, 0xff, 0xfa, 0x53, 0xa0, 0xc7, 0x0d, 0x3a, 0xfc, 0x6e, 0xb8,
+  0xb2, 0x10, 0x9e, 0x9e, 0x0b, 0x76, 0x97, 0xe9, 0x16, 0xc2, 0x89, 0x26,
+  0x1c, 0xcf, 0xa8, 0xca, 0x64, 0x36, 0xe9, 0x3b, 0x39, 0x95, 0xbe, 0x58,
+  0x44, 0x13, 0x4a, 0x3f, 0x48, 0x3d, 0x4b, 0xb1, 0x14, 0x9c, 0xcb, 0x77,
+  0xb1, 0x7f, 0x03, 0x35, 0x8a, 0xb3, 0x29, 0xd3, 0x06, 0xdf, 0x9d, 0x4f,
+  0xc2, 0x43, 0x11, 0xb3, 0xcd, 0xdc, 0x9a, 0xc1, 0xf4, 0x0f, 0x57, 0xa7,
+  0xc6, 0xd5, 0xe9, 0x72, 0xe5, 0x1b, 0xa0, 0xd4, 0xc7, 0x5e, 0xf2, 0x98,
+  0x0c, 0x81, 0x4b, 0x94, 0x0a, 0xfc, 0xd0, 0x9b, 0x97, 0xd1, 0xe1, 0x1c,
+  0x68, 0x3c, 0x6d, 0x81, 0xec, 0x78, 0x87, 0xaf, 0x45, 0xfa, 0x9a, 0x41,
+  0xb1, 0x9e, 0xe6, 0x05, 0xec, 0xd0, 0x5c, 0xaa, 0x71, 0xa5, 0x24, 0xb9,
+  0xee, 0xcc, 0x88, 0xa8, 0xc0, 0xc4, 0x73, 0x07, 0xdc, 0xed, 0x89, 0xc6,
+  0x4d, 0x90, 0x9c, 0x0e, 0x5c, 0x24, 0x29, 0xeb, 0x4b, 0x50, 0x1e, 0x61,
+  0xf6, 0x60, 0x64, 0xa3, 0xb5, 0x5e, 0x76, 0x85, 0xa4, 0x0a, 0x45, 0x13,
+  0x0d, 0xc2, 0x08, 0x98, 0x32, 0x44, 0xb6, 0xb0, 0x80, 0xe9, 0xb8, 0x2b,
+  0x32, 0xbd, 0xac, 0x5d, 0x0c, 0x50, 0x41, 0x46, 0xf1, 0xf7, 0x55, 0x17,
+  0xc0, 0x6e, 0xd0, 0xc8, 0x66, 0xaf, 0x62, 0xc1, 0x46, 0xaa, 0x5d, 0xe6,
+  0x5d, 0x4f, 0xac, 0x31, 0x95, 0xbd, 0x4b, 0x39, 0x8f, 0xc7, 0xa6, 0x90,
+  0xde, 0x05, 0x90, 0xa5, 0x32, 0xc4, 0x18, 0xeb, 0x22, 0x93, 0x19, 0xb3,
+  0x38, 0x49, 0xab, 0xb2, 0x63, 0x12, 0xc3, 0x6d, 0x02, 0xb5, 0x94, 0x98,
+  0x22, 0xc0, 0xd5, 0xb0, 0xe2, 0xd0, 0xa7, 0xb2, 0x72, 0xf1, 0x3c, 0x04,
+  0x63, 0xbd, 0xd7, 0x82, 0x9a, 0x36, 0x25, 0xb3, 0x5f, 0xec, 0x07, 0x82,
+  0xcc, 0xa7, 0x0e, 0x92, 0x0c, 0x43, 0x82, 0x6f, 0x53, 0x7a, 0x05, 0xf2,
+  0x10, 0x3e, 0xf0, 0x13, 0x39, 0xf0, 0xc6, 0x70, 0x18, 0x6b, 0x79, 0xb1,
+  0xbf, 0xbf, 0xcf, 0xb1, 0x96, 0xce, 0x29, 0x7d, 0xf8, 0xea, 0xe4, 0xf8,
+  0xe2, 0xfd, 0xfb, 0x93, 0xf3, 0x37, 0x27, 0x6f, 0x34, 0xe3, 0xc3, 0x59,
+  0x89, 0xa5, 0x0e, 0x7f, 0x45, 0x98, 0x25, 0x08, 0xfb, 0xbc, 0xbd, 0xbf,
+  0xd5, 0xdb, 0xd9, 0xdf, 0x8a, 0x80, 0x16, 0x63, 0x53, 0xa7, 0x16, 0xcf,
+  0x62, 0xb4, 0x6f, 0x6f, 0x96, 0xa0, 0xaa, 0x21, 0xc0, 0x73, 0x85, 0x98,
+  0x1b, 0xe4, 0x7a, 0x45, 0x6f, 0x4f, 0x52, 0xa1, 0x1d, 0x1d, 0xc8, 0x0c,
+  0xe8, 0x77, 0x0c, 0x54, 0xa7, 0x0d, 0x58, 0x8a, 0xee, 0x43, 0x04, 0xba,
+  0xb3, 0x85, 0x1f, 0xea, 0x47, 0x6f, 0x41, 0xfb, 0x98, 0xe4, 0x0f, 0x4c,
+  0x8b, 0xc7, 0x37, 0xa0, 0x94, 0x26, 0x7e, 0xa8, 0xb2, 0xfe, 0x3e, 0xbe,
+  0xbe, 0xcb, 0xaf, 0xff, 0x8e, 0x31, 0xfa, 0xfd, 0x57, 0x75, 0xc3, 0x12,
+  0x2e, 0x32, 0xf5, 0x06, 0xd1, 0x92, 0xc4, 0x16, 0x28, 0xa9, 0x01, 0x9b,
+  0xe3, 0xef, 0x8e, 0x2e, 0xf1, 0x69, 0x30, 0xcb, 0x2f, 0x7e, 0xf8, 0x8b,
+  0x2d, 0xf3, 0xbc, 0xdb, 0xd6, 0x6c, 0x46, 0xa9, 0x64, 0xa5, 0x76, 0xac,
+  0x99, 0x1f, 0xf4, 0xb6, 0xca, 0xac, 0x31, 0x08, 0x55, 0xc8, 0xd0, 0x0a,
+  0x31, 0x03, 0x15, 0xb6, 0x8e, 0x3b, 0x25, 0xca, 0xa1, 0x15, 0xa5, 0x5c,
+  0xf1, 0x50, 0x5d, 0x3f, 0xb0, 0x72, 0x9c, 0xc6, 0x43, 0xca, 0xdd, 0x7f,
+  0xd2, 0x6c, 0xcc, 0xed, 0xc9, 0x6b, 0x8e, 0xd9, 0xaa, 0x58, 0x26, 0x21,
+  0xaf, 0xe9, 0x4a, 0x8c, 0x1d, 0x02, 0x6e, 0x4a, 0xe7, 0x71, 0x91, 0xce,
+  0x1e, 0x95, 0xc0, 0xef, 0xb9, 0x63, 0x32, 0xa7, 0x4a, 0x51, 0xec, 0xcb,
+  0x42, 0x8a, 0xe7, 0x5e, 0xda, 0xa9, 0xe9, 0xe8, 0x83, 0x44, 0x2c, 0x18,
+  0x60, 0x7c, 0xae, 0xbc, 0x59, 0x2b, 0x51, 0x91, 0xea, 0xf6, 0xbf, 0x51,
+  0x28, 0xda, 0xa0, 0x47, 0xa3, 0xb7, 0xa7, 0x67, 0x27, 0x1b, 0xd1, 0xdb,
+  0xa4, 0x92, 0x12, 0x27, 0xcd, 0x30, 0x46, 0x91, 0xff, 0x07, 0x52, 0xb0,
+  0x0c, 0x34, 0xad, 0xd4, 0x08, 0x07, 0x73, 0xc1, 0xc4, 0x07, 0x47, 0xca,
+  0x86, 0xd6, 0x4b, 0xf1, 0xe1, 0xd0, 0x12, 0x31, 0x1e, 0xa7, 0xb9, 0x65,
+  0x1a, 0xdf, 0x94, 0x93, 0x0f, 0xe4, 0xdd, 0x2a, 0xce, 0x43, 0xdf, 0xc1,
+  0xbd, 0xcc, 0xdd, 0x14, 0x02, 0x9c, 0xb4, 0xe4, 0x3c, 0x6b, 0xbc, 0x38,
+  0x2d, 0x17, 0x33, 0xe4, 0x06, 0x41, 0x94, 0x97, 0x59, 0x62, 0x2b, 0xfb,
+  0x88, 0xf2, 0xc1, 0x7a, 0x30, 0x89, 0x98, 0xcc, 0x50, 0x71, 0xbd, 0xce,
+  0xc6, 0xbd, 0xd3, 0x8d, 0xc3, 0xb4, 0x13, 0xfe, 0x73, 0xf3, 0xab, 0x55,
+  0x98, 0x69, 0x27, 0xd4, 0x39, 0x5d, 0xde, 0x20, 0x8a, 0xa2, 0x5e, 0xae,
+  0x1a, 0x33, 0x54, 0xb5, 0xb3, 0x46, 0x09, 0x01, 0xf5, 0x95, 0x7c, 0x77,
+  0x6a, 0xee, 0xfe, 0x45, 0xba, 0xf5, 0xa9, 0xfe, 0x80, 0x25, 0xe0, 0x56,
+  0xba, 0x70, 0xaf, 0x76, 0x93, 0x65, 0x1c, 0x85, 0x1a, 0x63, 0x32, 0x57,
+  0x96, 0xc6, 0xec, 0xac, 0x4d, 0x61, 0xb6, 0xbe, 0x41, 0x24, 0xd4, 0xf9,
+  0xe2, 0x63, 0x37, 0xd2, 0xc2, 0x80, 0x7c, 0x29, 0x5c, 0x45, 0x56, 0x06,
+  0x5d, 0xfe, 0x52, 0xde, 0x26, 0xa1, 0x3d, 0x6a, 0xac, 0xcd, 0x4e, 0x19,
+  0xd6, 0xa1, 0x97, 0xa8, 0xd0, 0x71, 0x65, 0x17, 0x75, 0xa3, 0x29, 0x18,
+  0x35, 0x39, 0xa0, 0x2d, 0xc9, 0xd7, 0x5d, 0x16, 0xd4, 0xd4, 0xd9, 0xdd,
+  0xcf, 0xd4, 0x2d, 0x51, 0x5f, 0x5d, 0x84, 0xbd, 0x23, 0x9d, 0x12, 0xbb,
+  0x3f, 0x61, 0xd5, 0xfb, 0xe8, 0x36, 0xa5, 0x42, 0xc4, 0x25, 0xa9, 0x73,
+  0x71, 0xa6, 0xf5, 0x56, 0x3c, 0x4d, 0xd3, 0xed, 0x03, 0xc8, 0xad, 0x4f,
+  0xe5, 0x0c, 0x61, 0xed, 0x93, 0x81, 0x2b, 0xd1, 0x69, 0x80, 0x58, 0xdc,
+  0x3a, 0x9f, 0x19, 0x55, 0x34, 0x98, 0xdb, 0xa2, 0x8a, 0x1a, 0xd6, 0x43,
+  0x92, 0xae, 0x18, 0xe8, 0x0e, 0x00, 0xd7, 0x18, 0x81, 0x38, 0xd0, 0xd7,
+  0x76, 0x2f, 0x10, 0x63, 0x6b, 0x45, 0xc2, 0x0d, 0x4a, 0xfa, 0x60, 0x89,
+  0xce, 0xb1, 0x24, 0x40, 0x51, 0xfc, 0x71, 0xc9, 0xb2, 0x3d, 0xc0, 0xdb,
+  0xa6, 0xe9, 0x5d, 0x28, 0xcb, 0x82, 0x21, 0xf3, 0x68, 0x62, 0x94, 0xa5,
+  0x61, 0x41, 0xeb, 0x34, 0xed, 0xd8, 0x84, 0xb4, 0xd9, 0x2f, 0x8d, 0xb8,
+  0x70, 0xb2, 0xb3, 0xde, 0x0d, 0x9e, 0xa1, 0xc6, 0x8a, 0x80, 0x5e, 0x19,
+  0xb7, 0x69, 0x7f, 0x07, 0x9a, 0xcf, 0x41, 0xc7, 0xf4, 0xd5, 0x20, 0xbf,
+  0x2a, 0x71, 0xc7, 0x1a, 0xe5, 0x90, 0x91, 0x91, 0x79, 0xb5, 0x74, 0x0c,
+  0x45, 0x20, 0x9a, 0x7b, 0xa5, 0x8c, 0xcb, 0x14, 0xdc, 0xf8, 0x69, 0xcd,
+  0xa6, 0x00, 0x86, 0x2b, 0x46, 0xfd, 0xbe, 0x21, 0x38, 0xa5, 0x1f, 0x7a,
+  0xc7, 0xf4, 0xf1, 0xde, 0x3b, 0x1a, 0xee, 0x8b, 0x8e, 0x71, 0xf8, 0x36,
+  0x7f, 0x75, 0xe0, 0xb7, 0x8b, 0xb7, 0x7e, 0xc3, 0x06, 0x48, 0x26, 0x25,
+  0x92, 0xc8, 0x04, 0xb9, 0x13, 0x23, 0x5c, 0x91, 0x4d, 0x3d, 0x70, 0x8a,
+  0xa6, 0x94, 0x7e, 0xaf, 0x65, 0x93, 0x72, 0x00, 0x52, 0x64, 0x41, 0x60,
+  0x3a, 0xe3, 0x5e, 0x3e, 0xe9, 0x51, 0x86, 0x34, 0x42, 0xe7, 0x61, 0x32,
+  0x92, 0x73, 0xeb, 0x08, 0x20, 0x84, 0x3a, 0x30, 0x8c, 0xc7, 0x21, 0xd5,
+  0x9c, 0x0b, 0x19, 0x05, 0x20, 0xd1, 0xe1, 0x8e, 0x72, 0x90, 0x07, 0xe2,
+  0x95, 0xa7, 0xd7, 0x4d, 0x2f, 0x42, 0x44, 0xe6, 0x92, 0x82, 0x08, 0xcf,
+  0x9f, 0x46, 0xe5, 0x11, 0x5d, 0xd6, 0xde, 0x69, 0xd5, 0x64, 0xc3, 0xcd,
+  0xd9, 0x95, 0x4b, 0xfe, 0xe7, 0xe5, 0x82, 0x54, 0x56, 0xc4, 0x6d, 0xf6,
+  0xbc, 0x2f, 0x5a, 0x24, 0x42, 0x88, 0xcc, 0x20, 0xfc, 0xf7, 0xfb, 0x5b,
+  0x5d, 0x2f, 0x50, 0x5f, 0x91, 0xb1, 0x9f, 0xd9, 0x2c, 0x21, 0x78, 0x98,
+  0x78, 0x64, 0x2f, 0x54, 0x5d, 0x5b, 0x56, 0x8f, 0xc8, 0xaf, 0x4d, 0x31,
+  0x2d, 0xa5, 0x16, 0xdb, 0xba, 0x07, 0x9b, 0xd3, 0x43, 0x5b, 0x28, 0x6c,
+  0x93, 0xab, 0x68, 0x43, 0x40, 0xd7, 0x92, 0xb1, 0xf5, 0x55, 0xaf, 0xd9,
+  0x2c, 0xd9, 0xf4, 0xbc, 0x74, 0xab, 0x37, 0x9c, 0xee, 0x95, 0xad, 0x9e,
+  0x26, 0xc2, 0x94, 0x3e, 0xd2, 0x06, 0x68, 0x3d, 0xd8, 0x54, 0xe9, 0xeb,
+  0xdd, 0x4b, 0xf0, 0x87, 0x0c, 0xd8, 0xa1, 0xf0, 0xd1, 0x65, 0xfb, 0x9e,
+  0x31, 0xd4, 0xfa, 0x4b, 0xdc, 0x31, 0xd3, 0x60, 0x46, 0x3b, 0xa9, 0x59,
+  0xf9, 0x40, 0x64, 0xeb, 0xdc, 0xa5, 0xe6, 0x9e, 0x21, 0x57, 0x41, 0x4e,
+  0x90, 0x69, 0xce, 0x77, 0x4c, 0xfa, 0xca, 0x63, 0x6b, 0x6a, 0x71, 0x4b,
+  0xce, 0x2f, 0x5d, 0x9b, 0xb7, 0xa8, 0xd8, 0xf7, 0xce, 0xe1, 0x18, 0x0e,
+  0xa2, 0xff, 0xc8, 0x13, 0xae, 0x59, 0x7d, 0xa2, 0x64, 0xf5, 0xfb, 0xa3,
+  0xab, 0xf3, 0xd3, 0xf3, 0x6f, 0x0e, 0x0c, 0x8f, 0x43, 0x7e, 0xd7, 0xec,
+  0x6c, 0x64, 0x78, 0x37, 0xfd, 0x96, 0xf1, 0xbb, 0xd1, 0xfb, 0xd3, 0xd6,
+  0x69, 0x01, 0x63, 0x99, 0xc4, 0x9e, 0xd9, 0x79, 0x59, 0x24, 0x1c, 0x17,
+  0x61, 0x5b, 0x54, 0x2b, 0x27, 0xa4, 0x5c, 0x93, 0x44, 0x25, 0xb5, 0xef,
+  0x0c, 0x00, 0x36, 0xf4, 0xce, 0xf0, 0x4c, 0x66, 0x79, 0xad, 0x53, 0x20,
+  0x12, 0xe5, 0x8c, 0x8e, 0x3f, 0x77, 0x29, 0x80, 0x2d, 0x66, 0xca, 0x7e,
+  0x45, 0x5b, 0x2a, 0x0f, 0x34, 0x93, 0x25, 0x33, 0x8f, 0xd3, 0x70, 0xc4,
+  0xcf, 0x61, 0xba, 0xa4, 0x49, 0xab, 0xa3, 0x92, 0x8e, 0xac, 0x4c, 0xc9,
+  0xd9, 0x60, 0xb6, 0x44, 0x73, 0xbc, 0x02, 0x7e, 0x10, 0x69, 0x32, 0x10,
+  0x2f, 0xf9, 0xbe, 0x30, 0x3a, 0x99, 0xfc, 0xd4, 0xd6, 0x65, 0x98, 0x1d,
+  0x78, 0x76, 0x9a, 0xb3, 0xcd, 0x73, 0x66, 0x7d, 0x9e, 0x0d, 0x44, 0x87,
+  0x65, 0xc1, 0x9f, 0x28, 0x4a, 0x82, 0x38, 0x24, 0xb3, 0xc4, 0x56, 0x25,
+  0x19, 0x5d, 0xe7, 0x86, 0x75, 0x9d, 0xd9, 0xc2, 0x03, 0xdb, 0xc3, 0x34,
+  0xf3, 0x08, 0x7f, 0xa3, 0x4e, 0x1d, 0x0c, 0x5e, 0x91, 0x04, 0x56, 0xb3,
+  0xa4, 0x06, 0x6e, 0x67, 0x1a, 0x04, 0x33, 0x53, 0xf7, 0xe5, 0x29, 0xe2,
+  0x3d, 0x25, 0x8c, 0x37, 0xe6, 0x56, 0xc0, 0xc0, 0xd7, 0x61, 0x8f, 0x17,
+  0xcb, 0xe1, 0x7c, 0xbc, 0x1f, 0x1d, 0xc2, 0x7f, 0x3c, 0x25, 0x8b, 0x72,
+  0x46, 0x07, 0xc7, 0xa0, 0x68, 0x61, 0x82, 0x0b, 0xc3, 0xe0, 0xa6, 0x04,
+  0x83, 0x6b, 0x7a, 0x09, 0xed, 0xee, 0xc0, 0x4c, 0x1f, 0x62, 0x85, 0xb6,
+  0x04, 0x8d, 0x70, 0x9a, 0x56, 0x9c, 0xa7, 0xd7, 0x82, 0x1b, 0xe4, 0xa4,
+  0x36, 0xd0, 0x99, 0x6f, 0xef, 0x7c, 0x1e, 0x61, 0xf1, 0xc1, 0xfb, 0x37,
+  0xfb, 0xd1, 0xe8, 0x26, 0x19, 0xdd, 0x96, 0xcb, 0xb9, 0xb2, 0x63, 0xdc,
+  0x53, 0x30, 0x0f, 0x70, 0x9e, 0x1e, 0xe2, 0x03, 0x4c, 0x7c, 0x96, 0x8e,
+  0xb0, 0xf4, 0xaf, 0x5b, 0x8b, 0x4e, 0x4d, 0x34, 0x3a, 0xe5, 0xd8, 0xa1,
+  0x46, 0x6c, 0x50, 0xba, 0x00, 0xe7, 0xd4, 0x04, 0x82, 0x17, 0xb0, 0x07,
+  0xf0, 0x71, 0x04, 0xc4, 0x06, 0xbd, 0x7c, 0xa5, 0xcb, 0xf6, 0x65, 0xdd,
+  0xeb, 0x8d, 0x17, 0x7b, 0xab, 0xff, 0xaa, 0x05, 0xff, 0xba, 0xd6, 0xa0,
+  0x09, 0x6b, 0x95, 0x4c, 0xb5, 0x1d, 0xd9, 0x03, 0xa8, 0xe5, 0xe3, 0x24,
+  0x11, 0x10, 0x4a, 0xc3, 0x78, 0xde, 0xc7, 0xf1, 0xc9, 0x4d, 0x7c, 0x42,
+  0x3a, 0x8c, 0x52, 0x16, 0x5b, 0x42, 0x98, 0x14, 0x4c, 0x5a, 0x94, 0x26,
+  0x64, 0xa2, 0x80, 0x06, 0xe1, 0x8c, 0x42, 0xb0, 0xbe, 0xd2, 0x66, 0xea,
+  0xbf, 0xd5, 0x65, 0x63, 0x59, 0x8c, 0x94, 0xd0, 0x3a, 0x68, 0x0e, 0x5a,
+  0x4b, 0x48, 0x78, 0x6d, 0x68, 0x53, 0x78, 0x44, 0x66, 0xbe, 0xcb, 0x71,
+  0x69, 0x7b, 0x1c, 0x25, 0xa3, 0x11, 0x92, 0xf3, 0x1c, 0xb1, 0xa0, 0xd9,
+  0xa2, 0xce, 0xef, 0xb3, 0x69, 0x81, 0xfe, 0x11, 0x2a, 0x0a, 0x8b, 0x43,
+  0xb1, 0x8c, 0x10, 0x82, 0xa9, 0x1d, 0x1b, 0x2c, 0xae, 0x17, 0xc8, 0xe9,
+  0xcd, 0xae, 0x60, 0xbe, 0x3d, 0x07, 0xb1, 0xb9, 0x62, 0x99, 0x6d, 0x76,
+  0xe7, 0x88, 0xb6, 0xba, 0x72, 0x4c, 0xdb, 0xfd, 0xad, 0xe7, 0x1c, 0x13,
+  0x12, 0x51, 0xed, 0x74, 0xe0, 0x3d, 0x57, 0x4b, 0xd6, 0x24, 0x72, 0x20,
+  0xf6, 0x96, 0xec, 0x3b, 0x84, 0x5e, 0x66, 0xff, 0x55, 0x32, 0xae, 0x0d,
+  0xb5, 0x92, 0xe7, 0xb8, 0x2d, 0x3c, 0x79, 0xba, 0xdb, 0x12, 0x86, 0xc1,
+  0x7f, 0xed, 0x34, 0x89, 0x0e, 0x7e, 0xfd, 0x2b, 0x57, 0xb3, 0xfd, 0x0b,
+  0x4a, 0x35, 0xb6, 0xba, 0xf6, 0x7b, 0x5b, 0xa6, 0x31, 0x0e, 0x4f, 0xc8,
+  0xde, 0x8b, 0xc6, 0x70, 0x7e, 0xe3, 0x13, 0x7a, 0x01, 0xcb, 0x5d, 0xf2,
+  0xa2, 0x87, 0x2a, 0x3b, 0x1c, 0x96, 0xa7, 0x42, 0x05, 0xa7, 0x0f, 0xc7,
+  0x5b, 0xa2, 0x62, 0x8b, 0x3a, 0x2d, 0x11, 0x27, 0xc5, 0x8c, 0x18, 0xd5,
+  0xcc, 0x98, 0xf4, 0xc1, 0xb4, 0x7d, 0x22, 0x90, 0x1d, 0x47, 0x45, 0xa7,
+  0x1f, 0xe0, 0xa6, 0x46, 0x1f, 0x16, 0x44, 0x83, 0x7d, 0xc2, 0x54, 0x36,
+  0xed, 0x5f, 0x68, 0x76, 0x51, 0xdb, 0xec, 0x2c, 0xf6, 0x97, 0xc6, 0xe4,
+  0xa9, 0x58, 0xb3, 0xd4, 0xef, 0x94, 0x58, 0x05, 0x8b, 0x2a, 0xbf, 0x34,
+  0x0a, 0xe5, 0xb6, 0x28, 0x76, 0x92, 0x21, 0x58, 0x5f, 0xbd, 0x58, 0xa0,
+  0x6a, 0xca, 0x28, 0xb5, 0x6c, 0x7a, 0x6c, 0x92, 0xc1, 0xea, 0xbe, 0x76,
+  0x6e, 0xb5, 0x4d, 0x4a, 0x02, 0xfe, 0x15, 0xf2, 0x85, 0x64, 0x21, 0x60,
+  0x3f, 0x2f, 0x00, 0x14, 0x3c, 0x8e, 0x67, 0x37, 0xc2, 0xf1, 0xf0, 0xbb,
+  0x1a, 0xad, 0x8c, 0x78, 0x2d, 0xfd, 0xe7, 0x11, 0xf7, 0x56, 0x37, 0x38,
+  0x3b, 0xa4, 0x36, 0x97, 0xf8, 0x6b, 0x60, 0x78, 0xaf, 0x02, 0xc4, 0xf5,
+  0xab, 0xee, 0xc2, 0xce, 0xaa, 0x30, 0xa8, 0x7f, 0x07, 0x77, 0xfb, 0xfa,
+  0xb5, 0xb6, 0xbd, 0xf2, 0xd8, 0x59, 0x6b, 0x13, 0xa1, 0xe7, 0xed, 0x56,
+  0xcb, 0xde, 0x98, 0xbd, 0x6b, 0xec, 0x56, 0xdb, 0xd1, 0xea, 0x55, 0xf5,
+  0xa1, 0xf7, 0xc3, 0x57, 0x75, 0xb7, 0xc5, 0xe7, 0x62, 0x54, 0xd4, 0x86,
+  0xd3, 0x13, 0x7d, 0x66, 0x45, 0x3a, 0x27, 0x00, 0xbc, 0x7e, 0xf4, 0xc6,
+  0xe6, 0xb4, 0x10, 0xf0, 0x9e, 0x67, 0xac, 0x8e, 0x97, 0x2d, 0x99, 0x1f,
+  0xab, 0x4f, 0x6b, 0x57, 0x92, 0x7a, 0x6c, 0xe2, 0x02, 0xc9, 0x74, 0x29,
+  0xca, 0xca, 0x3d, 0x40, 0x4c, 0xf1, 0xdc, 0x68, 0xf8, 0x52, 0xc2, 0x74,
+  0x98, 0x9a, 0x25, 0x01, 0x18, 0xda, 0xfa, 0x5d, 0x37, 0x66, 0x6e, 0xd4,
+  0x6b, 0x2c, 0x21, 0x08, 0x79, 0x8a, 0xe8, 0x8b, 0xa6, 0xf3, 0x01, 0x4a,
+  0x44, 0x55, 0x28, 0xe1, 0x23, 0x77, 0x69, 0x1c, 0x1d, 0xcd, 0xaa, 0xde,
+  0xe0, 0xbb, 0x11, 0x47, 0xd8, 0x6a, 0xe1, 0x29, 0xaf, 0xd5, 0x37, 0x79,
+  0x55, 0xa8, 0x4b, 0x63, 0x29, 0x49, 0xab, 0x69, 0x31, 0x5a, 0xce, 0x09,
+  0x03, 0x95, 0xc8, 0xca, 0x74, 0x0b, 0xc2, 0x83, 0xb4, 0x94, 0xc6, 0xe9,
+  0xf6, 0x3e, 0xf8, 0x61, 0x7c, 0x5b, 0xea, 0x92, 0xa4, 0x48, 0x87, 0xeb,
+  0x30, 0xcc, 0x9c, 0xeb, 0x4d, 0x36, 0x03, 0x22, 0xa8, 0x61, 0xd9, 0x31,
+  0x4c, 0x2f, 0xa2, 0xc0, 0xfc, 0xe7, 0x87, 0xd3, 0xe3, 0x9a, 0x77, 0x5f,
+  0x10, 0xe6, 0x57, 0x46, 0x2b, 0x18, 0x56, 0x56, 0x9e, 0x9c, 0xa0, 0x0e,
+  0xab, 0xd9, 0xb8, 0x9a, 0x38, 0x57, 0x3b, 0xde, 0x3c, 0x0b, 0x88, 0x54,
+  0xd0, 0x17, 0x7e, 0xd9, 0x1d, 0xdd, 0xd1, 0x3b, 0xba, 0xfb, 0x5b, 0xdf,
+  0xd1, 0xdd, 0xdf, 0xe6, 0x8e, 0x2a, 0x07, 0x71, 0xfe, 0xee, 0x5e, 0x57,
+  0xcf, 0x2c, 0xa5, 0xeb, 0xeb, 0x3a, 0x9c, 0xeb, 0x39, 0x03, 0x3d, 0x06,
+  0x8f, 0xe8, 0x89, 0xdf, 0xa2, 0xc7, 0x05, 0xb2, 0xa1, 0xda, 0xb0, 0x48,
+  0x2e, 0xb1, 0x82, 0x3f, 0x76, 0xa3, 0x53, 0x06, 0x36, 0xa7, 0xec, 0x24,
+  0x79, 0xfd, 0x8c, 0xeb, 0x6b, 0xc5, 0xef, 0xad, 0x3e, 0xff, 0x40, 0x05,
+  0x7e, 0x3a, 0x42, 0x78, 0x35, 0xeb, 0x71, 0x47, 0x8b, 0x59, 0x75, 0xc6,
+  0x62, 0x49, 0x21, 0x85, 0xe8, 0x68, 0x81, 0x25, 0xb2, 0xa0, 0x71, 0x3c,
+  0x30, 0xce, 0x1e, 0xf6, 0xdd, 0x44, 0x12, 0xf3, 0x73, 0x91, 0x70, 0x93,
+  0xd1, 0x83, 0x2b, 0x99, 0xf7, 0xcd, 0xe9, 0xd0, 0xe8, 0x0c, 0x7f, 0x38,
+  0x43, 0xe2, 0x2f, 0xd8, 0x70, 0xdc, 0x01, 0x02, 0x9f, 0x7a, 0xcd, 0x75,
+  0x86, 0x8f, 0x55, 0xa0, 0x0c, 0x0c, 0x57, 0x8d, 0xbb, 0xb0, 0x5e, 0x4a,
+  0x96, 0xe9, 0x1e, 0xec, 0xe3, 0x06, 0x98, 0x99, 0xb7, 0x04, 0xe0, 0x9b,
+  0x50, 0x9d, 0x8e, 0x31, 0xae, 0xa8, 0x2f, 0xca, 0x14, 0x3d, 0x56, 0xda,
+  0x92, 0xc2, 0xab, 0x98, 0xf9, 0x39, 0xd1, 0x34, 0x47, 0xcd, 0x21, 0x14,
+  0xb8, 0xd9, 0x7a, 0x89, 0x6a, 0xda, 0xa5, 0xfe, 0xa3, 0xe4, 0x9b, 0x6e,
+  0x06, 0x8f, 0xc4, 0x63, 0xcd, 0xf6, 0xaf, 0xea, 0x34, 0x0a, 0xeb, 0x2f,
+  0x16, 0xaf, 0x30, 0x2e, 0x69, 0xd4, 0x44, 0x81, 0x3d, 0xe9, 0x9a, 0x13,
+  0xee, 0xcb, 0x62, 0x5e, 0x1c, 0x91, 0x67, 0x93, 0xbf, 0x20, 0x0e, 0x28,
+  0x36, 0xf3, 0x0d, 0x44, 0x34, 0x7a, 0x89, 0xd0, 0x9f, 0xcf, 0xfd, 0xb6,
+  0xba, 0x3e, 0xac, 0x9e, 0xf1, 0x3d, 0x5b, 0xa0, 0xe8, 0xda, 0x8d, 0x55,
+  0x70, 0xe7, 0x7e, 0xbf, 0x1f, 0x80, 0xb3, 0xb8, 0x4b, 0x93, 0xfb, 0x9a,
+  0x2b, 0x5e, 0x66, 0xd6, 0x35, 0x0d, 0x33, 0xd8, 0x03, 0x74, 0x87, 0x3b,
+  0x04, 0x43, 0x0e, 0x11, 0x49, 0xb3, 0xa5, 0x9c, 0xc4, 0x5e, 0x79, 0xf7,
+  0x69, 0x67, 0x9b, 0x6f, 0x79, 0x9b, 0xcb, 0x50, 0x3d, 0x28, 0x03, 0x23,
+  0xdb, 0x7e, 0x0e, 0x5d, 0xf4, 0x88, 0x14, 0x8f, 0x11, 0xb5, 0x6f, 0xb2,
+  0x3c, 0x8d, 0xae, 0x3f, 0xd7, 0x1f, 0xa4, 0x25, 0xe3, 0x12, 0x33, 0xae,
+  0x90, 0x1f, 0x2d, 0xe6, 0xcf, 0xd4, 0xf9, 0x81, 0xf0, 0x73, 0x95, 0x5e,
+  0x20, 0xf6, 0x46, 0xe8, 0x88, 0xe2, 0x86, 0x20, 0xd2, 0x8c, 0x80, 0x5c,
+  0x31, 0x81, 0xd4, 0x23, 0x39, 0x11, 0xa7, 0x7f, 0x95, 0x93, 0x29, 0x63,
+  0xdb, 0x8b, 0x44, 0xba, 0xc0, 0x70, 0xbc, 0xd7, 0x74, 0x39, 0x71, 0xf8,
+  0xb4, 0xbb, 0x12, 0xb0, 0x8e, 0xa4, 0x41, 0xa7, 0xf8, 0x62, 0x2d, 0xde,
+  0x72, 0xd3, 0x46, 0xb4, 0xf5, 0xa9, 0x16, 0x53, 0xcb, 0x7a, 0xb5, 0x19,
+  0xbc, 0x8f, 0x56, 0x26, 0x83, 0x97, 0x2e, 0x50, 0xb6, 0x07, 0x35, 0x60,
+  0xbb, 0x00, 0xe1, 0xc0, 0xdc, 0xe6, 0x2d, 0x78, 0xc4, 0xac, 0x56, 0x30,
+  0xea, 0x05, 0x36, 0x22, 0x5c, 0x62, 0xe2, 0x09, 0xdd, 0x7d, 0xa9, 0x5e,
+  0x97, 0x82, 0xf5, 0x26, 0x98, 0x89, 0x81, 0x84, 0xc3, 0xdd, 0xef, 0xdf,
+  0xc4, 0x0f, 0x0f, 0xfd, 0x32, 0xd9, 0x04, 0xaa, 0x2d, 0x37, 0xcb, 0x72,
+  0x86, 0x1f, 0x2d, 0x09, 0x7d, 0x6d, 0x65, 0x8f, 0xe3, 0x87, 0x47, 0x43,
+  0x40, 0xc2, 0x9c, 0x47, 0x31, 0xbe, 0x5a, 0x63, 0xb6, 0xb6, 0xc9, 0x31,
+  0xb7, 0x09, 0x6b, 0xa6, 0x0c, 0x33, 0xf0, 0x34, 0x41, 0xa8, 0xbb, 0xd5,
+  0xb6, 0xcc, 0x1a, 0x6c, 0x72, 0x96, 0x19, 0xc7, 0xe2, 0xe9, 0x23, 0xd4,
+  0x74, 0xd1, 0x56, 0xda, 0x21, 0x77, 0xd5, 0x09, 0x8d, 0xc2, 0xa6, 0x98,
+  0x02, 0x08, 0xee, 0x14, 0x25, 0xb0, 0x3a, 0xdc, 0xf7, 0x0f, 0x2d, 0xe9,
+  0xfc, 0x36, 0x00, 0xf9, 0xd4, 0xe6, 0xb6, 0x74, 0x96, 0x86, 0xa5, 0x22,
+  0x07, 0x16, 0x60, 0xf0, 0xfe, 0xfe, 0xbe, 0xbf, 0xca, 0x6f, 0xf9, 0x2f,
+  0xc7, 0xc0, 0xeb, 0xc3, 0x5d, 0x00, 0xd5, 0x9e, 0xa5, 0xd9, 0xf2, 0x21,
+  0x72, 0x30, 0x5e, 0x4c, 0x4b, 0x38, 0x0d, 0xcc, 0x45, 0xdf, 0x5d, 0xbd,
+  0xed, 0x9a, 0xc8, 0xa6, 0xa4, 0xb0, 0xa1, 0xe7, 0xb7, 0xf4, 0xb5, 0xb6,
+  0x24, 0x65, 0xdc, 0x1d, 0x04, 0x8d, 0x3e, 0x3e, 0xba, 0xfc, 0x78, 0x7e,
+  0x72, 0xfd, 0xf1, 0xea, 0xe8, 0x7b, 0xdc, 0x42, 0xf6, 0xca, 0x80, 0xbc,
+  0xc2, 0x78, 0x40, 0x91, 0xe7, 0xd8, 0x09, 0xe9, 0x3d, 0x95, 0x0d, 0xa6,
+  0x19, 0xc1, 0xab, 0x84, 0x3a, 0xb7, 0x59, 0xcc, 0x28, 0x99, 0x27, 0xcc,
+  0xe5, 0x20, 0xaa, 0xed, 0xd7, 0x6d, 0x52, 0x64, 0xc9, 0xac, 0x9f, 0x17,
+  0x53, 0xa4, 0xc2, 0xcd, 0x37, 0xc2, 0x3f, 0x83, 0xc3, 0x6d, 0x4a, 0x56,
+  0x03, 0x42, 0x90, 0xdd, 0x15, 0x13, 0x44, 0x2c, 0x79, 0x6e, 0xa7, 0x5a,
+  0x87, 0x34, 0xf7, 0x88, 0x01, 0x2e, 0xee, 0xf6, 0x56, 0xa8, 0x77, 0xf5,
+  0x7e, 0xe1, 0xd2, 0xe9, 0x93, 0x28, 0x88, 0x7c, 0x3f, 0x6e, 0xae, 0x0a,
+  0x57, 0x67, 0xce, 0x1e, 0xbb, 0x01, 0x00, 0x04, 0x52, 0xe7, 0x72, 0x03,
+  0x25, 0x41, 0x05, 0x6e, 0x98, 0x64, 0x13, 0xbc, 0xd2, 0x82, 0xd4, 0x66,
+  0xb5, 0xa2, 0xa6, 0x0f, 0xa1, 0xcd, 0xf7, 0xd0, 0x7b, 0xe1, 0x5b, 0x86,
+  0xd8, 0x7a, 0xd7, 0x59, 0xf3, 0x0b, 0x59, 0xf3, 0x8b, 0x7f, 0x69, 0xcd,
+  0x2f, 0xfe, 0x85, 0x35, 0xef, 0xfd, 0xc6, 0x6b, 0xde, 0x0b, 0xae, 0xd9,
+  0xf9, 0x4a, 0xef, 0x6f, 0xb8, 0xe6, 0xbf, 0x2d, 0xb3, 0xdb, 0x1e, 0xcc,
+  0x17, 0xa5, 0xb0, 0x74, 0xda, 0x2c, 0xc3, 0x26, 0x5b, 0xad, 0xd1, 0x0e,
+  0xf9, 0xf6, 0x2d, 0xc0, 0xb0, 0xd3, 0x39, 0x34, 0x76, 0x3a, 0xe9, 0x71,
+  0xdc, 0xa9, 0xa9, 0x87, 0x37, 0x0d, 0x84, 0x14, 0xeb, 0x7d, 0xcb, 0x11,
+  0xfa, 0x29, 0x50, 0xb3, 0xef, 0xc8, 0x6c, 0x74, 0xd8, 0x8e, 0xf6, 0x5d,
+  0xa1, 0x9b, 0x1e, 0xfb, 0x38, 0x47, 0x23, 0x72, 0x93, 0xdd, 0x68, 0xdb,
+  0x39, 0x8a, 0x81, 0x4b, 0x9a, 0x3f, 0x37, 0x39, 0x52, 0x0c, 0x28, 0x1d,
+  0x98, 0xe3, 0x82, 0x18, 0xf3, 0xf1, 0x79, 0xc6, 0xf5, 0xe3, 0x02, 0x07,
+  0x04, 0xd9, 0x5c, 0x80, 0x0c, 0xe6, 0x44, 0x94, 0xd9, 0x3d, 0x65, 0x27,
+  0xe8, 0x24, 0xa3, 0xc6, 0x04, 0x25, 0xda, 0x71, 0x93, 0x3c, 0xae, 0x79,
+  0x0a, 0xc3, 0x68, 0x96, 0x23, 0xbf, 0x19, 0xaf, 0x36, 0x3e, 0x86, 0xb6,
+  0xcd, 0x29, 0xcb, 0x8b, 0x46, 0xdf, 0x53, 0x57, 0x6e, 0xdc, 0x26, 0xc9,
+  0x22, 0x9e, 0x11, 0xb4, 0x06, 0xe6, 0x3e, 0xb4, 0x35, 0xca, 0xaa, 0x25,
+  0x47, 0x6a, 0xe1, 0x00, 0xbd, 0x51, 0xcb, 0x3c, 0x23, 0x3e, 0xc7, 0x07,
+  0x89, 0x95, 0x32, 0x51, 0x3a, 0xa6, 0x5a, 0xd7, 0x70, 0xdf, 0x14, 0xdb,
+  0x94, 0xc1, 0x4c, 0x02, 0x5b, 0x6f, 0xe4, 0x43, 0xc1, 0x80, 0x31, 0x9f,
+  0x50, 0x1c, 0x39, 0x4c, 0xcd, 0xb9, 0x4b, 0x31, 0x25, 0xaf, 0x89, 0x3d,
+  0x6c, 0xde, 0xe7, 0xd7, 0x09, 0x55, 0xaa, 0xd6, 0x39, 0x81, 0x0f, 0x10,
+  0x9f, 0xc8, 0x8d, 0xfc, 0x43, 0x75, 0x83, 0xba, 0x49, 0x7b, 0x24, 0xa5,
+  0x00, 0xca, 0xac, 0xff, 0x5e, 0x1f, 0x5f, 0x7e, 0xfc, 0xf6, 0xe4, 0xe4,
+  0xf2, 0xf4, 0xcd, 0xd9, 0x89, 0x5c, 0x18, 0xf3, 0xa3, 0xf3, 0xeb, 0xef,
+  0xce, 0xb4, 0x5b, 0xa8, 0xd2, 0xa2, 0x47, 0xf0, 0x02, 0xfb, 0xcf, 0x4c,
+  0xb9, 0x4b, 0xed, 0xb0, 0xc0, 0x90, 0x3e, 0x3a, 0xfd, 0x01, 0xb4, 0xd6,
+  0xcb, 0xde, 0x87, 0x1f, 0xbc, 0x5e, 0x24, 0x4e, 0x8d, 0x89, 0xdf, 0x4c,
+  0xc0, 0x96, 0x9c, 0xf4, 0x7a, 0x59, 0x6e, 0x0f, 0xb0, 0x35, 0xe5, 0xee,
+  0x37, 0x16, 0x83, 0x30, 0xdc, 0x32, 0x33, 0x0a, 0x43, 0xd7, 0x6d, 0xe0,
+  0xe8, 0xa6, 0xb5, 0xbd, 0xd8, 0xd2, 0x36, 0x6a, 0x2b, 0x83, 0x16, 0x8d,
+  0xd6, 0x6d, 0xb7, 0xc9, 0x23, 0x61, 0x38, 0x46, 0x87, 0xf8, 0xdf, 0x70,
+  0xb3, 0xd3, 0xcb, 0x22, 0xbd, 0x43, 0xfd, 0x0f, 0x9e, 0xe5, 0x90, 0x2e,
+  0x3e, 0xda, 0x37, 0xad, 0x5f, 0x25, 0xac, 0x8c, 0x83, 0x50, 0xe6, 0x09,
+  0x0d, 0x1a, 0x85, 0xbc, 0x3d, 0x84, 0x8c, 0x83, 0xbf, 0xe1, 0xf1, 0x68,
+  0x40, 0xd8, 0x9e, 0x7e, 0xf4, 0xe6, 0xe4, 0xaa, 0x1b, 0x5d, 0x9e, 0xbc,
+  0xe7, 0x42, 0x95, 0x93, 0xf3, 0x6f, 0xb8, 0x1b, 0xae, 0x36, 0x39, 0xa5,
+  0x4c, 0x08, 0x3f, 0x59, 0xd3, 0xd9, 0x13, 0x78, 0x97, 0x32, 0x53, 0xcb,
+  0x12, 0xa4, 0xeb, 0x27, 0x04, 0xd0, 0xe1, 0xb5, 0x1d, 0xc2, 0x7f, 0x42,
+  0x5b, 0x05, 0x76, 0xc4, 0xbb, 0xc0, 0x76, 0x89, 0x62, 0x66, 0x72, 0x67,
+  0xc4, 0x28, 0xc0, 0xdd, 0xe0, 0x1d, 0x83, 0x0d, 0xf1, 0xb3, 0x38, 0x74,
+  0x83, 0xc8, 0xec, 0x23, 0x08, 0x21, 0x6e, 0xa1, 0x2e, 0x31, 0x78, 0xb4,
+  0x62, 0xe1, 0x73, 0x5d, 0xa4, 0x4b, 0x02, 0x24, 0xb7, 0x9b, 0x11, 0xaa,
+  0x8e, 0x2e, 0x52, 0x6e, 0x47, 0xdf, 0x40, 0xa6, 0x83, 0xed, 0x4e, 0xc7,
+  0x8c, 0xc0, 0x80, 0x01, 0xe4, 0xbc, 0xc0, 0x04, 0x0e, 0x84, 0x3e, 0xf8,
+  0x5f, 0x9b, 0xfd, 0xb2, 0xbc, 0xd9, 0x4c, 0xc7, 0x1f, 0x8b, 0x32, 0x5e,
+  0x6b, 0xca, 0x22, 0xe7, 0xd7, 0x63, 0xfc, 0x75, 0xb4, 0xd6, 0x37, 0x8f,
+  0xca, 0xdf, 0xf1, 0xe7, 0x41, 0x2c, 0x00, 0x15, 0x41, 0xec, 0x5a, 0xd1,
+  0x7c, 0x4e, 0x6d, 0xa2, 0x3b, 0x4b, 0x87, 0x05, 0x28, 0x70, 0xb6, 0xfb,
+  0x87, 0xf4, 0xc4, 0x5d, 0xdc, 0x8e, 0xca, 0xed, 0x6d, 0x1f, 0x8d, 0xde,
+  0x94, 0x38, 0x76, 0x35, 0x2f, 0xf7, 0xf2, 0xdb, 0xe3, 0xc1, 0x1f, 0xb7,
+  0xb7, 0x29, 0x0d, 0x7a, 0x1d, 0xd3, 0x55, 0x5f, 0xee, 0x6f, 0xef, 0x6c,
+  0x84, 0xd4, 0x47, 0x2f, 0xaf, 0x67, 0xc2, 0xad, 0x30, 0x17, 0xce, 0x01,
+  0x52, 0x98, 0x5b, 0x8a, 0x1e, 0xcc, 0xd0, 0xe3, 0x04, 0x93, 0x04, 0xa9,
+  0xb2, 0x93, 0xc3, 0x99, 0x94, 0x3b, 0xe9, 0xa5, 0x5e, 0x18, 0x1c, 0xa4,
+  0x0e, 0xcf, 0xfe, 0xa0, 0x63, 0xa8, 0xca, 0xcd, 0x21, 0xa7, 0xfc, 0x13,
+  0x67, 0xd6, 0x7d, 0xde, 0xa7, 0x66, 0x78, 0xcd, 0x5d, 0x17, 0x25, 0x3a,
+  0x5a, 0xa0, 0x29, 0x16, 0x5f, 0xb6, 0x81, 0x70, 0x23, 0x41, 0x00, 0xf3,
+  0x03, 0x3c, 0x5f, 0xbd, 0xcc, 0xa9, 0xc3, 0xf4, 0x83, 0x04, 0x1f, 0xdb,
+  0x41, 0xcd, 0xee, 0x3b, 0x0c, 0xc2, 0x1d, 0xd4, 0x77, 0xf6, 0xf1, 0x37,
+  0xa2, 0x0e, 0xdc, 0xdd, 0xf0, 0x90, 0x9f, 0xf4, 0x4e, 0x16, 0xc3, 0xe8,
+  0x70, 0x06, 0x2f, 0xce, 0x5a, 0x4a, 0xef, 0x4e, 0xb8, 0xdd, 0xd6, 0xb7,
+  0x49, 0x31, 0x4c, 0x8a, 0xbc, 0x6c, 0x54, 0x09, 0x69, 0x8f, 0x57, 0xf6,
+  0xa9, 0xd0, 0x38, 0x9a, 0x2e, 0xe5, 0xb5, 0x57, 0xae, 0xc8, 0xfa, 0x16,
+  0x8c, 0xf7, 0x3a, 0x2e, 0xcf, 0x1a, 0xd5, 0x2a, 0xe1, 0x05, 0xc0, 0xfe,
+  0x52, 0xf8, 0x27, 0x70, 0xe3, 0x09, 0x37, 0x09, 0x8d, 0x67, 0x6b, 0xd8,
+  0xf5, 0xa7, 0x79, 0x8d, 0x84, 0xd2, 0xd6, 0xfa, 0x58, 0x80, 0xc6, 0xc6,
+  0x1a, 0x65, 0x41, 0x51, 0xb9, 0x75, 0x1c, 0xc9, 0x5c, 0x34, 0xbf, 0x1b,
+  0xaf, 0xb9, 0x4d, 0x03, 0x2c, 0xbd, 0x4e, 0x48, 0x66, 0xb8, 0x3a, 0x74,
+  0x52, 0x5b, 0x86, 0xf1, 0x6f, 0x2c, 0xa6, 0xf8, 0x18, 0x9e, 0x1b, 0x39,
+  0xb2, 0x9e, 0x55, 0x65, 0xf3, 0x8d, 0xe1, 0xf4, 0xac, 0xdc, 0x73, 0xd6,
+  0xf7, 0x83, 0x1d, 0x74, 0x8f, 0xb8, 0x3a, 0xbc, 0x81, 0x35, 0x42, 0x5d,
+  0x09, 0xb0, 0xa4, 0x69, 0xcc, 0x86, 0xa1, 0x54, 0xbf, 0xda, 0xc4, 0x09,
+  0xe6, 0x34, 0x7e, 0x70, 0x9c, 0x96, 0x4a, 0xfd, 0x43, 0x74, 0xda, 0x3d,
+  0x36, 0xde, 0x8f, 0x23, 0xf1, 0x46, 0x50, 0x5d, 0xd4, 0x7d, 0x81, 0x68,
+  0xa9, 0x99, 0xc5, 0x5c, 0x9e, 0x25, 0xad, 0x20, 0x5a, 0x8a, 0xa8, 0x0a,
+  0x87, 0x34, 0x93, 0xde, 0x86, 0x9a, 0x8d, 0x58, 0xe8, 0x9c, 0x7a, 0x92,
+  0xcc, 0xa1, 0x0e, 0x03, 0x7c, 0xef, 0x0f, 0x4f, 0x42, 0xaa, 0x3c, 0x75,
+  0x76, 0x4e, 0x73, 0xec, 0x00, 0x4c, 0xc2, 0xb3, 0xb1, 0xe2, 0x1a, 0x65,
+  0x7e, 0x54, 0x31, 0xd0, 0x23, 0x99, 0x74, 0x08, 0xfc, 0x34, 0xf1, 0xc0,
+  0xb2, 0x06, 0x35, 0x7c, 0x05, 0x69, 0xf9, 0xaa, 0x25, 0x74, 0xf4, 0x1e,
+  0x52, 0x3b, 0xe1, 0x48, 0x98, 0x26, 0x65, 0x4c, 0xfb, 0x3d, 0x52, 0x59,
+  0x9b, 0xee, 0x36, 0x6c, 0x57, 0x62, 0xcb, 0xb4, 0xe9, 0xd6, 0x12, 0x18,
+  0xbd, 0x82, 0x1c, 0x69, 0x96, 0x34, 0x6f, 0x07, 0xfa, 0xa2, 0x25, 0xff,
+  0x96, 0x8c, 0x8b, 0xd8, 0xf3, 0x81, 0x50, 0xc1, 0x03, 0x77, 0x00, 0x11,
+  0x22, 0x58, 0x1b, 0xb3, 0x67, 0x94, 0x8e, 0xc4, 0x4c, 0x15, 0x2f, 0x9e,
+  0x84, 0xa1, 0xb8, 0x6b, 0x02, 0xdc, 0x68, 0xcf, 0x54, 0x18, 0xc2, 0x10,
+  0xf7, 0xe9, 0xb8, 0xba, 0xa1, 0x9e, 0x3c, 0x6a, 0x19, 0x95, 0x82, 0x0b,
+  0x80, 0x4e, 0xea, 0xd4, 0xaf, 0x7a, 0x1b, 0xb6, 0x38, 0xf0, 0xf8, 0xc0,
+  0x68, 0x53, 0x23, 0x06, 0xc8, 0x42, 0x47, 0x1d, 0x9d, 0x03, 0x39, 0xb5,
+  0x37, 0x59, 0xd5, 0x33, 0xd0, 0x30, 0xd8, 0x37, 0x7b, 0x82, 0xed, 0x76,
+  0x3c, 0x73, 0x4d, 0xcb, 0xd3, 0xfa, 0x7a, 0x43, 0x90, 0x86, 0xd7, 0x6e,
+  0x19, 0x14, 0xff, 0xdb, 0x35, 0xed, 0x2a, 0xbb, 0xcc, 0x2a, 0xb7, 0x82,
+  0x06, 0x79, 0x79, 0x74, 0x9b, 0xfa, 0x9d, 0x1a, 0xe8, 0xeb, 0x5d, 0xe0,
+  0x35, 0x73, 0x1e, 0xe1, 0xfd, 0x9a, 0x3a, 0x4a, 0x11, 0x30, 0x61, 0x1a,
+  0xcb, 0xef, 0x19, 0x2c, 0x65, 0x6d, 0xca, 0x0f, 0x7d, 0x63, 0x1f, 0x6a,
+  0x0c, 0x87, 0x5e, 0x7b, 0xf6, 0xd2, 0x6b, 0x32, 0x5d, 0x79, 0x80, 0x05,
+  0x1a, 0xdf, 0x76, 0xa3, 0xdd, 0x39, 0x1d, 0xca, 0xf6, 0x37, 0x21, 0xc6,
+  0xc5, 0x3d, 0x82, 0xcb, 0xdc, 0x94, 0xcb, 0xf7, 0xfe, 0x82, 0x26, 0x17,
+  0x6d, 0x18, 0xd3, 0xa5, 0xa9, 0x04, 0xe3, 0x7a, 0x14, 0xe5, 0x07, 0x81,
+  0xa0, 0x03, 0xe5, 0x52, 0x2e, 0xd0, 0x48, 0x18, 0x27, 0x8a, 0x12, 0x3e,
+  0x27, 0xef, 0x26, 0x66, 0x4b, 0x2d, 0x04, 0x0e, 0x03, 0xc9, 0xb5, 0x67,
+  0x20, 0x48, 0xcb, 0x19, 0x3e, 0x40, 0x6d, 0xb2, 0x72, 0x2f, 0xb3, 0x7a,
+  0xb6, 0x20, 0x03, 0xc9, 0x74, 0xb2, 0x73, 0x26, 0x85, 0x55, 0xad, 0xa3,
+  0x48, 0x7c, 0x3c, 0x9f, 0x50, 0x24, 0xce, 0x28, 0x45, 0x2f, 0x2d, 0xab,
+  0x5e, 0x00, 0xef, 0x95, 0x62, 0x40, 0x97, 0x17, 0x97, 0xbb, 0x1b, 0x2e,
+  0x28, 0xa6, 0x80, 0x23, 0x70, 0xcf, 0x47, 0x8a, 0x12, 0x19, 0xe0, 0x84,
+  0xae, 0xb2, 0x1b, 0x2e, 0xd3, 0xf3, 0x6d, 0xcb, 0x91, 0x20, 0xc6, 0x21,
+  0x73, 0xa1, 0x2f, 0x92, 0xcb, 0xdf, 0x16, 0x8a, 0x38, 0xdd, 0x10, 0xed,
+  0xc5, 0x54, 0x78, 0xc4, 0xcf, 0x7c, 0x58, 0x99, 0x92, 0x13, 0xca, 0x09,
+  0x91, 0xa5, 0x47, 0xc5, 0x7f, 0xf5, 0x7e, 0x22, 0x58, 0xb8, 0xe0, 0xcd,
+  0x32, 0xe2, 0xc4, 0xa3, 0x40, 0x4a, 0x97, 0x04, 0x79, 0xed, 0x93, 0x14,
+  0x90, 0xd0, 0x62, 0x48, 0x42, 0x17, 0xb2, 0xb9, 0x16, 0xe8, 0x2d, 0x45,
+  0xaa, 0x65, 0x4c, 0xe5, 0x7e, 0x5b, 0x05, 0xae, 0xed, 0x6b, 0x51, 0xb3,
+  0xc8, 0xa4, 0x6b, 0x59, 0x1c, 0x9d, 0x9f, 0x0d, 0xae, 0xdd, 0x20, 0x12,
+  0xe9, 0x61, 0x5e, 0x2a, 0x73, 0x1d, 0xd8, 0xcd, 0x49, 0x2d, 0x3a, 0x3b,
+  0x1d, 0x5c, 0xf7, 0x43, 0x1d, 0x1b, 0x40, 0x3b, 0x1f, 0x60, 0xb9, 0x4d,
+  0x0d, 0x28, 0x23, 0xa2, 0xd3, 0x93, 0x62, 0x51, 0x8e, 0x8e, 0x71, 0xb4,
+  0x28, 0x2d, 0x5c, 0x50, 0x88, 0xe6, 0x70, 0x30, 0xc5, 0x2f, 0x38, 0x4d,
+  0x59, 0x52, 0x9c, 0x35, 0x4a, 0x54, 0x2e, 0x87, 0x3d, 0x07, 0x49, 0x91,
+  0xf5, 0x1d, 0x6a, 0xd1, 0x05, 0xd4, 0x0b, 0x12, 0xea, 0xd6, 0xb7, 0x31,
+  0xd7, 0x99, 0xa0, 0x68, 0x7f, 0x04, 0x01, 0xb3, 0xe6, 0xea, 0x1e, 0x45,
+  0x09, 0x21, 0xee, 0x92, 0x93, 0x09, 0x9f, 0x7d, 0x36, 0x51, 0xe1, 0x56,
+  0x34, 0x76, 0x52, 0xba, 0x3a, 0xd6, 0x6b, 0x16, 0x30, 0x6c, 0xf7, 0x4b,
+  0xe2, 0x94, 0x0e, 0x09, 0x5a, 0xa2, 0x2b, 0x93, 0x84, 0x5d, 0x4e, 0x66,
+  0xda, 0xad, 0x20, 0xc0, 0xe9, 0x98, 0x71, 0x30, 0xcb, 0x3a, 0x10, 0x26,
+  0x83, 0x1e, 0x20, 0xd3, 0xe1, 0x06, 0x40, 0xa8, 0xba, 0xb5, 0x9d, 0x24,
+  0xfb, 0xe4, 0x6a, 0xf9, 0xa9, 0xbd, 0x1f, 0x38, 0xe3, 0x99, 0x02, 0x65,
+  0xdd, 0x36, 0x84, 0x36, 0x9f, 0x8c, 0xb4, 0x19, 0xd3, 0x87, 0xd3, 0x37,
+  0x67, 0x66, 0xb7, 0x64, 0x77, 0x28, 0x85, 0xd6, 0xac, 0x15, 0xcb, 0x5a,
+  0x94, 0x6d, 0xd2, 0x99, 0x78, 0x41, 0x9f, 0x65, 0x96, 0xfe, 0x9d, 0x52,
+  0xad, 0x6c, 0x83, 0x7b, 0xe4, 0x7f, 0xe8, 0x3a, 0x57, 0x49, 0xb6, 0x56,
+  0x9a, 0x4e, 0x76, 0xe9, 0xd8, 0x94, 0x7f, 0x70, 0x8c, 0x2f, 0x98, 0x7f,
+  0xbc, 0x12, 0x39, 0x65, 0xbb, 0x0e, 0x6f, 0x4a, 0x28, 0xc7, 0x02, 0x46,
+  0x06, 0x02, 0x69, 0x93, 0xca, 0x17, 0x3d, 0xe5, 0x82, 0x74, 0x33, 0x9b,
+  0x5d, 0x57, 0x07, 0xd9, 0xc9, 0x0b, 0x29, 0x7a, 0x5c, 0x7f, 0x7b, 0x75,
+  0xf1, 0xbe, 0x77, 0x7d, 0xb1, 0x41, 0x09, 0x7b, 0x34, 0xf2, 0x8a, 0x14,
+  0x91, 0xd2, 0xf4, 0x49, 0xb5, 0x28, 0x25, 0xe2, 0x6b, 0x5b, 0x2f, 0x37,
+  0xa4, 0xd0, 0x87, 0x45, 0x0a, 0x4d, 0x4f, 0xdf, 0xf2, 0xda, 0x97, 0x64,
+  0xac, 0x89, 0xc4, 0xd4, 0x22, 0x15, 0xfd, 0x8e, 0x23, 0x27, 0x8e, 0xc5,
+  0x29, 0x1d, 0xc2, 0xb9, 0x87, 0xcb, 0xf2, 0x31, 0x92, 0xda, 0x52, 0xc4,
+  0x2c, 0x24, 0x5b, 0xca, 0x8f, 0x0e, 0x98, 0xde, 0xdb, 0x06, 0xa9, 0x08,
+  0xab, 0xee, 0xb8, 0xac, 0xab, 0xca, 0xe1, 0xfa, 0xc6, 0x45, 0x91, 0xdf,
+  0xab, 0xe0, 0x92, 0xda, 0x6f, 0x98, 0x3a, 0x1e, 0x52, 0xf1, 0xd8, 0x8a,
+  0xee, 0x22, 0x80, 0x65, 0xda, 0x39, 0x7c, 0xa5, 0xfa, 0xb7, 0x5f, 0xc7,
+  0xdc, 0xd0, 0x0c, 0xf0, 0x5e, 0x55, 0x2c, 0xb1, 0xa4, 0x34, 0xec, 0x76,
+  0x3e, 0x43, 0x36, 0x59, 0x4f, 0x19, 0xef, 0x0a, 0xa2, 0x22, 0x02, 0xf0,
+  0x50, 0xaf, 0x37, 0xe3, 0x97, 0x24, 0xff, 0x04, 0xc7, 0x14, 0xff, 0xec,
+  0xdd, 0x60, 0x81, 0x5a, 0x46, 0x8d, 0x1e, 0xdb, 0xb8, 0x52, 0xda, 0xb8,
+  0xcd, 0xc5, 0x4b, 0x2b, 0xee, 0xbf, 0xa9, 0x49, 0x38, 0x04, 0xa6, 0x46,
+  0xcc, 0x00, 0x7f, 0xea, 0xe9, 0x92, 0x8a, 0x92, 0x94, 0x22, 0x42, 0xc5,
+  0x78, 0x39, 0xa2, 0x63, 0xc2, 0x88, 0x1f, 0xb6, 0xf7, 0x1c, 0x32, 0x6e,
+  0xab, 0x82, 0x3c, 0xe0, 0xd0, 0x36, 0x5d, 0x9e, 0x1d, 0x38, 0x4d, 0x2d,
+  0x2b, 0xe2, 0xc7, 0x6c, 0xcf, 0x32, 0x54, 0x26, 0x31, 0xf7, 0x35, 0x61,
+  0xc5, 0xb2, 0x68, 0xda, 0x9c, 0x18, 0x55, 0xd2, 0x9e, 0xc9, 0x3e, 0xbb,
+  0x42, 0xd0, 0x7c, 0x82, 0x0b, 0x97, 0xa0, 0x3f, 0x22, 0x5b, 0x22, 0x01,
+  0x53, 0xd0, 0xfd, 0xeb, 0xb8, 0x04, 0xbe, 0x54, 0x1f, 0x6f, 0x63, 0x85,
+  0x7b, 0x7a, 0xa9, 0x85, 0x15, 0xce, 0xe9, 0xd5, 0x0e, 0x24, 0x7c, 0x72,
+  0xa7, 0x35, 0x8c, 0x0b, 0x4e, 0xcd, 0x70, 0x76, 0x5c, 0x58, 0x14, 0x01,
+  0x2f, 0x52, 0xae, 0x7a, 0x4c, 0xdd, 0xae, 0xef, 0x42, 0xcc, 0x29, 0x36,
+  0xfd, 0x1c, 0xab, 0x48, 0x3f, 0x1a, 0xad, 0x6b, 0xe5, 0xa7, 0xa9, 0x44,
+  0x3a, 0x93, 0x5f, 0x1d, 0x98, 0xd2, 0x54, 0xe4, 0x69, 0x8d, 0xe1, 0x76,
+  0x7f, 0xf8, 0xa1, 0xde, 0x7f, 0x79, 0xa3, 0x0d, 0x0c, 0x43, 0x6a, 0x52,
+  0xc6, 0xcc, 0xfb, 0x74, 0xc2, 0x5e, 0x5d, 0x9d, 0x92, 0x1d, 0x86, 0x18,
+  0x28, 0x8b, 0x9f, 0x1d, 0x30, 0xe2, 0x29, 0x02, 0x13, 0xf0, 0x46, 0x8b,
+  0xad, 0x6a, 0x29, 0x1c, 0x04, 0x93, 0x71, 0x1a, 0xc8, 0x59, 0x24, 0x86,
+  0xab, 0xb9, 0x17, 0x1c, 0x53, 0xa1, 0x9c, 0x74, 0x77, 0xbb, 0x4a, 0xeb,
+  0x9c, 0xb9, 0xc1, 0xd8, 0x82, 0x00, 0x35, 0xaf, 0x6e, 0x12, 0x6d, 0x80,
+  0x33, 0x4d, 0xe9, 0x25, 0xc9, 0x7b, 0x6e, 0x2b, 0x81, 0x69, 0xb1, 0xa3,
+  0x22, 0x11, 0x6f, 0x83, 0x36, 0x01, 0xf2, 0xa2, 0xc8, 0x08, 0xda, 0xc3,
+  0x97, 0x87, 0x9c, 0xaa, 0xb1, 0x73, 0x5f, 0x2c, 0xde, 0x62, 0xe3, 0xc4,
+  0xa4, 0x0c, 0xc3, 0xd7, 0xde, 0xef, 0x73, 0x82, 0xd8, 0xa4, 0xde, 0x4b,
+  0x04, 0x1b, 0x97, 0xb3, 0x63, 0x4b, 0xda, 0x07, 0xb3, 0xbc, 0xf9, 0xb3,
+  0xde, 0xdc, 0xbe, 0x1b, 0xbc, 0x44, 0x2a, 0x08, 0x85, 0x40, 0x95, 0x99,
+  0xe0, 0xb9, 0x20, 0xb6, 0x2f, 0xe6, 0xc2, 0x69, 0x4b, 0x32, 0xf4, 0x14,
+  0x6b, 0x8c, 0x9c, 0xd5, 0x69, 0x42, 0xa2, 0x98, 0x93, 0xf1, 0xe2, 0x03,
+  0x4d, 0xdb, 0x2b, 0x8b, 0x39, 0x3c, 0xe4, 0xf4, 0xb4, 0xb8, 0x74, 0xec,
+  0xdc, 0x02, 0xa3, 0xb4, 0x47, 0x8f, 0x95, 0x6d, 0xe9, 0x26, 0x82, 0x3c,
+  0x4e, 0x39, 0x70, 0xdc, 0x3e, 0xc5, 0xdd, 0x33, 0x75, 0x93, 0x19, 0xd4,
+  0x13, 0x29, 0x34, 0x93, 0x3e, 0x1c, 0xdf, 0x9c, 0x5c, 0x37, 0xaf, 0x96,
+  0x1b, 0x39, 0x24, 0x8c, 0x11, 0xf8, 0xf7, 0xe5, 0x87, 0xeb, 0x0d, 0x6a,
+  0x4e, 0xa6, 0x80, 0xc1, 0x55, 0xad, 0xe9, 0x8c, 0xa9, 0x5f, 0xf5, 0x4b,
+  0x71, 0x18, 0xd5, 0x43, 0xf8, 0x94, 0x24, 0x03, 0xc9, 0xcd, 0x40, 0x1f,
+  0xcb, 0xee, 0xd6, 0x36, 0xd8, 0x51, 0x5b, 0x3b, 0xd4, 0x70, 0x7a, 0x77,
+  0x6b, 0xd7, 0x00, 0x21, 0xe8, 0x53, 0x7e, 0x9b, 0x0a, 0x7e, 0x91, 0x5c,
+  0x26, 0x44, 0xf7, 0xbb, 0x0f, 0x0f, 0xf4, 0xe3, 0x7a, 0x79, 0x45, 0xcf,
+  0x94, 0x24, 0xba, 0xd3, 0x0c, 0xca, 0x7d, 0x67, 0xbf, 0x29, 0xb2, 0xb7,
+  0xcc, 0xb8, 0x00, 0x98, 0x1a, 0x7a, 0x23, 0x6e, 0x48, 0xbf, 0xbd, 0xbb,
+  0x95, 0xd3, 0xaa, 0x4f, 0xd0, 0xd1, 0xdc, 0xf6, 0x74, 0x40, 0x2c, 0x2e,
+  0xe2, 0x8c, 0xa0, 0x90, 0x78, 0xac, 0x19, 0x9f, 0x11, 0xbc, 0x26, 0xd8,
+  0x83, 0x07, 0xbb, 0x43, 0xa6, 0x65, 0xaa, 0x30, 0x00, 0x10, 0x74, 0xc2,
+  0x8e, 0x4c, 0x31, 0x4d, 0xc0, 0x09, 0x81, 0xfc, 0xef, 0x00, 0xd3, 0x44,
+  0xe0, 0x4e, 0xd0, 0xfe, 0xea, 0x5f, 0x35, 0x8f, 0x8f, 0xff, 0xb5, 0x5b,
+  0x97, 0x94, 0xe8, 0x1e, 0xd6, 0x41, 0x0f, 0xe5, 0x2f, 0x9e, 0xaf, 0x92,
+  0xfa, 0x0c, 0x93, 0x6e, 0x4c, 0x1d, 0x62, 0x36, 0x6a, 0xfe, 0x13, 0x1a,
+  0xc3, 0x4c, 0x4c, 0xb4, 0x14, 0xe9, 0xe0, 0xce, 0x2c, 0xba, 0x49, 0x1b,
+  0x35, 0xf9, 0xd0, 0x6f, 0x6b, 0x00, 0xa8, 0x9a, 0xa0, 0x37, 0xbe, 0x26,
+  0x58, 0x18, 0xc4, 0x00, 0x47, 0x25, 0xce, 0x17, 0xa1, 0xbb, 0x5b, 0x2a,
+  0xf8, 0x03, 0x0a, 0x57, 0xe3, 0x6c, 0x97, 0x39, 0x36, 0xa6, 0x13, 0x1d,
+  0x55, 0xd4, 0x0f, 0x9a, 0xfc, 0x60, 0xbe, 0x89, 0x8a, 0x5b, 0xd1, 0xe5,
+  0xad, 0xa0, 0x3e, 0xeb, 0xd8, 0x30, 0x47, 0x53, 0x30, 0x6b, 0x33, 0xe5,
+  0x40, 0xc8, 0xdc, 0x4d, 0xd4, 0x08, 0x65, 0xd8, 0x0e, 0x35, 0x79, 0x2f,
+  0x6a, 0x2c, 0x14, 0xee, 0x21, 0x8a, 0x56, 0x54, 0xfb, 0xa5, 0x1b, 0xf4,
+  0x5e, 0x97, 0xfe, 0xb6, 0xbf, 0xf5, 0x8a, 0x4f, 0xf4, 0xf4, 0xe4, 0xfa,
+  0x6d, 0xd3, 0x99, 0x57, 0x00, 0x41, 0xf1, 0x7f, 0x7b, 0x49, 0x5c, 0xdc,
+  0x80, 0x71, 0x81, 0x50, 0x49, 0x3d, 0xec, 0xbf, 0xd1, 0xdb, 0xda, 0x0a,
+  0xe5, 0x6d, 0x7c, 0x42, 0x78, 0x88, 0xdd, 0xbd, 0x7a, 0x48, 0x0f, 0x55,
+  0xfa, 0x1e, 0x6e, 0x77, 0x3b, 0x92, 0x6f, 0x9d, 0xbc, 0x62, 0xd5, 0x9d,
+  0xe5, 0xf1, 0x5a, 0xc0, 0x3e, 0x89, 0x0c, 0x24, 0x74, 0xd4, 0x04, 0xc2,
+  0x74, 0x4c, 0xec, 0xa6, 0x7a, 0x63, 0xb2, 0x93, 0x40, 0xcc, 0x93, 0x4c,
+  0xaa, 0x1e, 0x37, 0x22, 0xee, 0x23, 0xc9, 0xed, 0xde, 0x2a, 0x62, 0x00,
+  0x64, 0x41, 0x04, 0x0b, 0xe7, 0x4b, 0xa9, 0x1d, 0x2c, 0x12, 0x84, 0x5c,
+  0x63, 0xb5, 0x4f, 0xda, 0x66, 0x3d, 0x0d, 0x1b, 0x47, 0x5b, 0x50, 0x8c,
+  0x16, 0x52, 0x44, 0xca, 0xff, 0x46, 0x51, 0x5c, 0xcb, 0x9f, 0xdd, 0xd9,
+  0x0f, 0x6c, 0x1c, 0x09, 0xec, 0x5f, 0xb9, 0x71, 0x56, 0x39, 0x62, 0xff,
+  0x1d, 0x19, 0xbc, 0xa6, 0xd4, 0x2d, 0x90, 0xa9, 0xad, 0x6d, 0x9d, 0x7f,
+  0xf1, 0x5a, 0x70, 0xb7, 0xfb, 0xab, 0xc0, 0x27, 0xed, 0x5b, 0xbf, 0x72,
+  0x2d, 0x5d, 0xdb, 0xf9, 0x04, 0xa5, 0xc7, 0x5c, 0x1a, 0xbb, 0x91, 0x9f,
+  0x81, 0x02, 0x9a, 0x4d, 0x60, 0x98, 0x64, 0x91, 0xd0, 0xe2, 0xdd, 0xbc,
+  0x05, 0x87, 0xb8, 0x8d, 0x8d, 0x8a, 0xb6, 0xa2, 0x16, 0x44, 0x82, 0x10,
+  0x4d, 0x17, 0x88, 0xf8, 0x51, 0x06, 0xfd, 0x2c, 0x62, 0xe6, 0xb3, 0x1f,
+  0x81, 0x36, 0x53, 0x5d, 0xb2, 0x5d, 0x11, 0x63, 0xf2, 0xba, 0xee, 0xb1,
+  0xf2, 0x2c, 0x4f, 0x69, 0xbc, 0x8b, 0x67, 0x68, 0xae, 0xd3, 0x18, 0xe6,
+  0xb0, 0x72, 0x5b, 0x59, 0xcf, 0x83, 0xe7, 0x2d, 0xe2, 0xdf, 0x9d, 0x47,
+  0x66, 0xde, 0xe7, 0x84, 0x47, 0x55, 0x66, 0xbf, 0xbb, 0x7a, 0xfb, 0x17,
+  0xb5, 0xbb, 0x37, 0xba, 0x2d, 0x96, 0x70, 0x63, 0xba, 0xc3, 0xc4, 0x49,
+  0x04, 0x14, 0x08, 0x88, 0xda, 0xae, 0xf3, 0xbf, 0x6c, 0x96, 0xa5, 0x17,
+  0x54, 0xa0, 0xa4, 0x8f, 0x75, 0x0c, 0xb3, 0xc1, 0x73, 0x03, 0x31, 0xe9,
+  0x76, 0xfb, 0xfb, 0xe4, 0x0f, 0x79, 0x7b, 0xbc, 0xbf, 0xbb, 0xb3, 0x0d,
+  0x56, 0xeb, 0x7a, 0x83, 0x5b, 0x6c, 0x7c, 0xf6, 0xac, 0xdd, 0x36, 0xe7,
+  0x9d, 0x3c, 0x2c, 0x90, 0xf6, 0xd6, 0x4f, 0x7e, 0xb8, 0x3c, 0xf7, 0xd6,
+  0x08, 0x6b, 0xf2, 0x02, 0xa9, 0x6d, 0x6b, 0xb4, 0xba, 0x40, 0x6d, 0x7c,
+  0xcd, 0x3f, 0xa6, 0x86, 0xd5, 0x81, 0x50, 0xe5, 0xdb, 0x22, 0x45, 0x1d,
+  0xb7, 0x83, 0x5b, 0xd2, 0x39, 0xcb, 0xb3, 0x31, 0x88, 0xfe, 0x0b, 0x84,
+  0xe8, 0x4b, 0x3a, 0xa0, 0xab, 0x3f, 0xb9, 0xba, 0xf6, 0x6b, 0xf2, 0xbe,
+  0x4b, 0x57, 0x25, 0xf3, 0x33, 0x5c, 0xde, 0xd3, 0x0f, 0x09, 0x11, 0x19,
+  0xc1, 0x4d, 0xb8, 0xc6, 0x64, 0x39, 0x4d, 0xd8, 0xbd, 0x8b, 0xa6, 0x59,
+  0xfd, 0xb6, 0x3d, 0x50, 0x43, 0x22, 0xf2, 0xf8, 0x1c, 0x92, 0x43, 0xbb,
+  0x2d, 0x16, 0xc2, 0xdc, 0x52, 0xa3, 0x21, 0xec, 0x23, 0x5a, 0x57, 0xb7,
+  0xfe, 0x86, 0xd3, 0xd1, 0x9d, 0xc0, 0x3b, 0x39, 0xd6, 0x81, 0x7a, 0x5b,
+  0x80, 0xe7, 0xd2, 0x63, 0xd6, 0xae, 0x48, 0xeb, 0x29, 0xf1, 0x74, 0x13,
+  0x09, 0x0c, 0xa2, 0x5b, 0xc7, 0x2e, 0x0c, 0xf9, 0xc0, 0x29, 0x83, 0x80,
+  0x3a, 0xee, 0xc5, 0x59, 0x1d, 0xe7, 0x15, 0xc1, 0x0c, 0xd8, 0xfa, 0x49,
+  0x1e, 0xa8, 0x89, 0x2a, 0xa8, 0x88, 0x2f, 0x76, 0x7d, 0x79, 0x24, 0x4b,
+  0x11, 0x78, 0x17, 0x71, 0x33, 0x19, 0x28, 0xea, 0xb7, 0x56, 0xed, 0xed,
+  0x06, 0xe3, 0x10, 0xa1, 0x90, 0x14, 0x47, 0x25, 0xc4, 0x3a, 0x6b, 0xc4,
+  0x25, 0xdc, 0x38, 0x04, 0xdd, 0x14, 0x8c, 0x44, 0x48, 0x94, 0xc1, 0x37,
+  0x54, 0x9c, 0xc8, 0x44, 0x7b, 0x68, 0x62, 0x45, 0x30, 0xa2, 0x69, 0x82,
+  0x9a, 0xd0, 0x44, 0x8d, 0xf8, 0xf6, 0x3f, 0x0f, 0x10, 0xdf, 0xf9, 0xc5,
+  0xf5, 0xc9, 0x81, 0x40, 0x7c, 0x29, 0x16, 0x8e, 0x9a, 0x09, 0x9c, 0x98,
+  0xc6, 0x8d, 0xdc, 0xb9, 0xe6, 0x10, 0x85, 0xac, 0x9e, 0x7a, 0x37, 0x74,
+  0xe5, 0x29, 0x47, 0x1c, 0xaf, 0x09, 0x7b, 0x79, 0xab, 0x56, 0x84, 0x5c,
+  0x2a, 0xf5, 0x17, 0xcb, 0x80, 0xe9, 0x09, 0xcf, 0xdf, 0x47, 0x46, 0x21,
+  0xf8, 0x0c, 0x42, 0xa4, 0x60, 0x79, 0xeb, 0x91, 0x10, 0x8b, 0x32, 0x36,
+  0xb8, 0x4c, 0xc2, 0xe2, 0x08, 0xfb, 0xa9, 0xfa, 0x4d, 0x40, 0x29, 0x42,
+  0xf7, 0x56, 0x1a, 0xc9, 0x93, 0x3d, 0x62, 0x60, 0x36, 0x57, 0x89, 0x38,
+  0x1b, 0x48, 0x6c, 0x5e, 0x2a, 0x31, 0xce, 0xd0, 0x0b, 0xf8, 0x65, 0x2b,
+  0xcc, 0x55, 0xe5, 0xdc, 0x27, 0xa5, 0x13, 0xb8, 0x47, 0x6a, 0xa5, 0xa1,
+  0x55, 0x69, 0xcc, 0x14, 0xc1, 0xb0, 0xf1, 0xc3, 0xd7, 0xc4, 0x02, 0xeb,
+  0x6e, 0x11, 0xd5, 0xd2, 0xba, 0x46, 0x5d, 0xa3, 0xc4, 0x9d, 0x84, 0xca,
+  0xb2, 0xd8, 0x00, 0x27, 0x6d, 0xa1, 0x05, 0x89, 0xd5, 0xc5, 0x18, 0x10,
+  0xa5, 0x1a, 0x45, 0xdf, 0x08, 0x04, 0xb7, 0x5b, 0x81, 0x40, 0x3a, 0x1f,
+  0x59, 0xb3, 0x29, 0x03, 0x3d, 0xc0, 0x47, 0xf6, 0xb7, 0x5a, 0x6c, 0x59,
+  0x56, 0x79, 0x07, 0x49, 0x5d, 0xd0, 0xc2, 0x1b, 0xbd, 0x6d, 0xe3, 0x84,
+  0x4d, 0xa9, 0xb8, 0x5d, 0xd0, 0xdc, 0x3e, 0x5d, 0x88, 0x69, 0xde, 0x95,
+  0x33, 0x5a, 0x99, 0xc7, 0xf8, 0x5e, 0xc3, 0xbe, 0xf8, 0x50, 0x9a, 0x69,
+  0x8a, 0x1a, 0x6b, 0x4a, 0x1c, 0xc5, 0x53, 0xd0, 0x5a, 0xb8, 0x99, 0x39,
+  0x46, 0xcf, 0x6d, 0xf0, 0xdb, 0x37, 0xe6, 0xd0, 0x49, 0xd1, 0x8f, 0x22,
+  0x17, 0x81, 0x4c, 0x4b, 0x8e, 0xe4, 0x60, 0x70, 0xd7, 0xc9, 0xdf, 0x36,
+  0xc4, 0xfa, 0xfd, 0xe8, 0x6f, 0xf9, 0x50, 0x9c, 0x30, 0x68, 0x39, 0x86,
+  0x90, 0x7c, 0x26, 0x94, 0x3f, 0xbf, 0x04, 0x2a, 0x1b, 0x2f, 0xd9, 0xaf,
+  0x8a, 0x13, 0x92, 0x4c, 0x6c, 0x6e, 0xfd, 0x8c, 0x01, 0x8f, 0x68, 0x4a,
+  0x38, 0x9a, 0x9c, 0x0a, 0xaa, 0x85, 0xe8, 0x7e, 0xb5, 0xf3, 0x4e, 0x13,
+  0xad, 0x25, 0x1e, 0xa1, 0x37, 0x04, 0x06, 0x17, 0x70, 0x04, 0x06, 0xdc,
+  0xb3, 0x09, 0xeb, 0xf1, 0xa8, 0x5a, 0xca, 0xc6, 0x37, 0x67, 0x97, 0xab,
+  0x97, 0x14, 0xde, 0x25, 0x18, 0x78, 0xca, 0x42, 0x1a, 0x01, 0xe5, 0xc5,
+  0xa3, 0x47, 0xd5, 0x17, 0xac, 0x70, 0x15, 0x40, 0x47, 0x0b, 0x1a, 0xef,
+  0xd7, 0x78, 0xea, 0x24, 0x30, 0xda, 0x99, 0x96, 0x2d, 0xdd, 0x5a, 0x7e,
+  0x53, 0x3b, 0xc5, 0xed, 0xb9, 0xc5, 0x4e, 0x67, 0x05, 0x9e, 0xac, 0x5d,
+  0xf5, 0xa4, 0x8a, 0x71, 0x97, 0x57, 0x16, 0xa3, 0x5b, 0x97, 0x80, 0xa9,
+  0xac, 0xa1, 0xc8, 0x20, 0xd5, 0x33, 0x62, 0x8d, 0x0d, 0xc5, 0xc1, 0xb5,
+  0xe1, 0xd4, 0xa9, 0xaf, 0x47, 0xbc, 0x97, 0xaf, 0x30, 0x3f, 0x5c, 0x27,
+  0x66, 0x65, 0x2b, 0x4a, 0x71, 0x98, 0x3d, 0xce, 0x18, 0x8b, 0xf6, 0x3f,
+  0xdf, 0xdf, 0xdb, 0xd0, 0xe6, 0xc5, 0x9a, 0x85, 0xb8, 0x11, 0xea, 0x00,
+  0x48, 0x37, 0x4e, 0x7a, 0x2a, 0x90, 0x5e, 0x93, 0x62, 0x8f, 0x4c, 0x46,
+  0xeb, 0x10, 0xc7, 0x66, 0xca, 0x4d, 0xb3, 0xd0, 0xc5, 0x4e, 0xed, 0xe7,
+  0x98, 0x29, 0x7b, 0xf9, 0x03, 0xf8, 0xb1, 0x84, 0x5f, 0x5e, 0x27, 0x0e,
+  0x1f, 0x97, 0x96, 0x79, 0xdb, 0xca, 0x20, 0x86, 0xf6, 0x27, 0x25, 0x4d,
+  0x53, 0xdf, 0x36, 0xa8, 0x7c, 0x3d, 0x58, 0x56, 0xce, 0xe9, 0xe7, 0xa4,
+  0xa9, 0x8a, 0xea, 0x71, 0x83, 0x1d, 0xd9, 0x73, 0x47, 0x2e, 0xb0, 0x6f,
+  0x84, 0x6b, 0xbb, 0x58, 0xf0, 0x84, 0x80, 0xaa, 0x09, 0x67, 0xa2, 0xe4,
+  0x0c, 0xa9, 0xfa, 0x3e, 0x32, 0xf4, 0x29, 0x81, 0x2f, 0xc8, 0xfb, 0x92,
+  0x20, 0x25, 0x67, 0xc2, 0x88, 0xbb, 0x9e, 0x40, 0x9e, 0x6b, 0x77, 0x28,
+  0x56, 0x3d, 0xf2, 0xc2, 0x96, 0xe6, 0x72, 0x90, 0x86, 0xc5, 0x25, 0xe5,
+  0x0b, 0xb7, 0x01, 0xef, 0xa8, 0x1b, 0x24, 0x56, 0x8c, 0x90, 0xda, 0xcc,
+  0x5a, 0xeb, 0x5b, 0x94, 0xda, 0x14, 0x8a, 0xa7, 0x59, 0xd6, 0xa2, 0x7f,
+  0x37, 0x54, 0xe9, 0x57, 0xb4, 0xf1, 0x57, 0x1b, 0x1b, 0xd1, 0x32, 0x7b,
+  0xb2, 0xa4, 0x18, 0x37, 0x8f, 0x7c, 0x29, 0x7e, 0x73, 0xd8, 0x59, 0xb4,
+  0x4e, 0x13, 0xde, 0xdc, 0xdc, 0x78, 0x7a, 0xd2, 0xf2, 0xe4, 0x53, 0x93,
+  0xbc, 0x64, 0xc7, 0x86, 0xd3, 0x4e, 0x62, 0xe2, 0xcc, 0x01, 0xbf, 0xe9,
+  0xc0, 0x65, 0x74, 0x99, 0x22, 0xc9, 0xc1, 0x9c, 0x21, 0xe6, 0x69, 0xfc,
+  0xe8, 0x3b, 0xf1, 0x35, 0x2b, 0x8d, 0x17, 0x58, 0x5f, 0xbb, 0xd6, 0x23,
+  0x13, 0x9c, 0x9f, 0xb0, 0x10, 0x4c, 0x8d, 0x22, 0x7c, 0xb5, 0x23, 0x20,
+  0x42, 0x5f, 0xdf, 0xb4, 0xd3, 0x72, 0x16, 0x47, 0x26, 0x6e, 0xda, 0x8d,
+  0x1c, 0x37, 0x3b, 0xdf, 0x42, 0xf5, 0x41, 0xb0, 0x3b, 0x3e, 0x50, 0x1b,
+  0xa1, 0x4f, 0x9b, 0x0c, 0x4b, 0xee, 0xa4, 0xde, 0xf7, 0x10, 0x91, 0xf9,
+  0x49, 0xdb, 0xcd, 0x3b, 0xd0, 0x4b, 0xc1, 0x75, 0x91, 0xca, 0x80, 0xc0,
+  0x51, 0x6f, 0xed, 0x9a, 0x19, 0x8f, 0x98, 0x3b, 0xb6, 0x4b, 0x43, 0x3e,
+  0x1d, 0x0c, 0xa7, 0xeb, 0x31, 0x5e, 0x9a, 0x9b, 0xa1, 0x6f, 0xda, 0x31,
+  0x06, 0xe3, 0x19, 0xf2, 0x4f, 0x6b, 0x9b, 0xd9, 0xe5, 0x3b, 0x4a, 0x30,
+  0x38, 0x21, 0x5d, 0x9d, 0xba, 0x26, 0xfa, 0x48, 0x0e, 0x66, 0x0f, 0x57,
+  0xa6, 0xe0, 0x99, 0x1c, 0x3c, 0xf2, 0xf3, 0x4a, 0x16, 0x9e, 0x2f, 0x67,
+  0xd5, 0xd7, 0xa6, 0x83, 0xd6, 0x7d, 0x0d, 0x2f, 0xeb, 0xbe, 0x06, 0x03,
+  0x4a, 0x11, 0xd6, 0xd0, 0x38, 0xf9, 0xb2, 0x8c, 0xce, 0xf5, 0xb1, 0x68,
+  0x7d, 0x70, 0x79, 0x7e, 0xf2, 0xcd, 0xc5, 0xc6, 0x53, 0x3e, 0xca, 0x3a,
+  0xff, 0x37, 0xeb, 0x8a, 0x35, 0x4b, 0x58, 0xa6, 0x4f, 0xd6, 0xc9, 0x37,
+  0x83, 0x41, 0xef, 0xe8, 0xf2, 0x94, 0xba, 0x5c, 0x0e, 0xe0, 0xcf, 0x16,
+  0x2c, 0xf6, 0x3e, 0xb5, 0x02, 0xe8, 0x7d, 0x27, 0xb5, 0xa3, 0xa5, 0x26,
+  0x09, 0x92, 0x07, 0x10, 0x0f, 0x53, 0xd0, 0x13, 0x79, 0x8f, 0x0c, 0xb4,
+  0x07, 0x0d, 0xdf, 0x34, 0x79, 0x2e, 0x4f, 0x37, 0xe9, 0x53, 0xf8, 0x49,
+  0x5a, 0x50, 0x8b, 0xfb, 0x60, 0xe9, 0x37, 0xb8, 0x44, 0xcd, 0x87, 0x52,
+  0x4c, 0x89, 0x41, 0x6b, 0x32, 0x38, 0x58, 0x7e, 0x28, 0x4e, 0x6c, 0xc0,
+  0x2e, 0x5c, 0x7a, 0x83, 0xae, 0x30, 0xac, 0xad, 0x50, 0xd0, 0xd4, 0x86,
+  0xeb, 0x8d, 0x4c, 0x34, 0x86, 0xc6, 0x9b, 0x21, 0xfc, 0xc8, 0x40, 0xa3,
+  0xab, 0x4d, 0xa7, 0xc8, 0x5a, 0x6f, 0x19, 0x45, 0x07, 0x6b, 0xd2, 0x38,
+  0x3e, 0xcb, 0x97, 0xd3, 0x1b, 0x36, 0xb0, 0xea, 0x7e, 0x08, 0xe2, 0xe5,
+  0x1a, 0x7d, 0x35, 0xbd, 0x1b, 0x60, 0x92, 0x1e, 0x09, 0xd2, 0x3b, 0xaa,
+  0xf7, 0x14, 0x09, 0x06, 0x87, 0x58, 0xbd, 0xe1, 0xa4, 0x8b, 0xf1, 0xef,
+  0x82, 0x81, 0xbe, 0x42, 0x03, 0x19, 0x72, 0xe0, 0x94, 0xdc, 0x68, 0x59,
+  0x35, 0x9b, 0xcb, 0x5f, 0xe3, 0xec, 0x91, 0xdc, 0xa5, 0xe2, 0xbf, 0xa7,
+  0xfa, 0x4f, 0x43, 0xd3, 0x75, 0x42, 0xaf, 0x8a, 0x11, 0x19, 0xfa, 0x9c,
+  0x82, 0xca, 0x85, 0x9f, 0xab, 0x68, 0x96, 0x7a, 0xda, 0xcf, 0x41, 0x4c,
+  0x93, 0x69, 0xd7, 0xcb, 0xba, 0x3a, 0x4a, 0x17, 0xcc, 0x61, 0x09, 0x93,
+  0x89, 0x22, 0x2c, 0x44, 0x10, 0x60, 0x45, 0xd4, 0x02, 0x72, 0x3d, 0x1e,
+  0x96, 0xf9, 0x6c, 0x59, 0x91, 0x2e, 0x80, 0x4e, 0x51, 0x2c, 0xae, 0xd9,
+  0x20, 0xd2, 0x95, 0xf0, 0x25, 0x8c, 0x1a, 0x39, 0x09, 0xa8, 0x51, 0xa8,
+  0x0e, 0xc0, 0xb6, 0x27, 0xed, 0xdb, 0x10, 0x00, 0x47, 0x11, 0xc5, 0x3f,
+  0x81, 0x3b, 0xcb, 0x63, 0xd1, 0x50, 0x0b, 0x4a, 0x4b, 0xba, 0x53, 0xb0,
+  0x37, 0xff, 0xfc, 0xf4, 0xac, 0x6a, 0xbb, 0xa3, 0xde, 0x75, 0x64, 0xdd,
+  0xb5, 0x44, 0x75, 0xab, 0x35, 0x86, 0x38, 0x5b, 0x6b, 0xa6, 0xb2, 0x66,
+  0x0b, 0x0c, 0xf1, 0x96, 0x0c, 0x1f, 0xcd, 0xc7, 0xf8, 0x3b, 0x31, 0xe5,
+  0xf2, 0x18, 0x45, 0xf8, 0xb9, 0xd0, 0x4a, 0xf6, 0x30, 0xfa, 0xab, 0x92,
+  0x51, 0xea, 0x5f, 0x6a, 0x0c, 0xfd, 0x5d, 0xc2, 0x79, 0x67, 0x7c, 0xc4,
+  0x74, 0x1a, 0xb5, 0x43, 0x66, 0x2d, 0xbf, 0xd9, 0xd4, 0x0e, 0x37, 0xa2,
+  0x4f, 0x4f, 0x78, 0x04, 0x8c, 0xa1, 0x74, 0xb3, 0x2a, 0x55, 0x8f, 0xd0,
+  0xdf, 0x16, 0x73, 0x3b, 0x4d, 0x7e, 0xd9, 0xf9, 0x86, 0x29, 0x05, 0xca,
+  0x57, 0x77, 0xbc, 0xb5, 0xa7, 0xd3, 0x7f, 0xc6, 0x86, 0xd8, 0xf5, 0xdb,
+  0x1f, 0x7a, 0x96, 0x9d, 0x89, 0x17, 0x97, 0x04, 0x49, 0x69, 0x16, 0x05,
+  0x9c, 0xff, 0xa3, 0xfc, 0x05, 0xef, 0xc0, 0xf7, 0x69, 0x06, 0x9a, 0x61,
+  0xb9, 0xa1, 0xc4, 0x99, 0x66, 0x21, 0x18, 0x05, 0xe4, 0x1d, 0x6b, 0x25,
+  0x58, 0x62, 0xc0, 0x71, 0x6c, 0xa2, 0x1e, 0x2a, 0xce, 0x1c, 0xb0, 0xf1,
+  0x58, 0x91, 0xd3, 0xd8, 0xf4, 0x71, 0xe1, 0xd5, 0xcf, 0x8c, 0x0c, 0xd3,
+  0xa1, 0x31, 0x08, 0xbc, 0x18, 0xcc, 0x82, 0x2c, 0x7d, 0xe8, 0x9b, 0xe0,
+  0xbe, 0x41, 0x5f, 0x73, 0x83, 0x9b, 0xc0, 0x08, 0x03, 0x3d, 0xed, 0x89,
+  0xb3, 0x35, 0x43, 0x58, 0xb8, 0xbb, 0xb4, 0xce, 0xf5, 0xfd, 0x8d, 0x68,
+  0x52, 0x2d, 0xd6, 0xb7, 0x37, 0x18, 0xc3, 0x5e, 0x7a, 0xa9, 0xe7, 0x56,
+  0xdc, 0xfb, 0x5e, 0x1c, 0xcc, 0x2d, 0x8c, 0x8e, 0xcd, 0x67, 0x29, 0xb8,
+  0x89, 0x70, 0x6e, 0x54, 0xc5, 0x37, 0x91, 0x1b, 0xcc, 0x1b, 0x66, 0x1a,
+  0x30, 0x53, 0x1a, 0x73, 0x60, 0xef, 0xb8, 0x16, 0x7f, 0x81, 0xc8, 0xae,
+  0x54, 0xd9, 0x08, 0x16, 0x84, 0xed, 0x82, 0x2b, 0xbd, 0xc0, 0xa4, 0xf4,
+  0x19, 0x76, 0x6e, 0x36, 0xee, 0x21, 0x0f, 0x99, 0x16, 0x39, 0x88, 0xc8,
+  0x22, 0x80, 0x7f, 0x29, 0x36, 0xc5, 0x35, 0x55, 0xdf, 0xdc, 0xa5, 0x45,
+  0x9e, 0x11, 0xc4, 0xe8, 0x5d, 0x5c, 0xa4, 0x14, 0xe6, 0xef, 0xbc, 0xbb,
+  0x78, 0x7f, 0xd2, 0x71, 0x9d, 0x22, 0x93, 0x54, 0xfc, 0xe8, 0x74, 0x7e,
+  0x4d, 0x2f, 0xb5, 0x9e, 0x66, 0xc8, 0x69, 0x08, 0x22, 0x7d, 0xc4, 0x6a,
+  0x1f, 0x01, 0x31, 0x10, 0x54, 0x5c, 0x62, 0x22, 0xe4, 0xa0, 0x4a, 0x4a,
+  0x12, 0x80, 0xf4, 0x55, 0x54, 0x0a, 0xa3, 0x24, 0xa0, 0x50, 0xf7, 0x1b,
+  0x35, 0x0d, 0xa9, 0x03, 0x4e, 0xee, 0x76, 0xf6, 0x8b, 0x9c, 0xee, 0x7f,
+  0xa8, 0xe6, 0x6b, 0x5b, 0x14, 0xeb, 0x62, 0x6f, 0x8a, 0xc7, 0xf9, 0x23,
+  0x5a, 0x36, 0x6b, 0x75, 0x01, 0xb8, 0x56, 0xa2, 0x31, 0x5e, 0xad, 0xe9,
+  0xf6, 0x52, 0xba, 0xa8, 0xe5, 0xf1, 0x7e, 0xc7, 0xe5, 0x96, 0xaf, 0x33,
+  0x55, 0xf3, 0x27, 0xec, 0xe8, 0x3c, 0xb8, 0xbd, 0x7d, 0x07, 0x7c, 0xfb,
+  0x1e, 0xaa, 0x27, 0xf1, 0x91, 0x62, 0x5b, 0x20, 0x56, 0x6f, 0xd6, 0x5c,
+  0x8f, 0xd2, 0x63, 0x8f, 0x09, 0xdf, 0xab, 0x08, 0x9f, 0xcf, 0x47, 0x0c,
+  0x2b, 0x66, 0xe2, 0xaa, 0x0d, 0xc0, 0x67, 0xd5, 0x92, 0x32, 0xa7, 0x6d,
+  0x2b, 0x8d, 0xd6, 0x0a, 0x38, 0x0a, 0x82, 0x9b, 0xd2, 0xa8, 0x14, 0x77,
+  0x31, 0x2d, 0x10, 0xc3, 0xc7, 0x46, 0x91, 0xe5, 0x4b, 0x5d, 0xb7, 0x9a,
+  0xba, 0x0d, 0x82, 0xd8, 0x26, 0xa3, 0x18, 0xbd, 0x84, 0x31, 0x78, 0x19,
+  0xc5, 0xd5, 0xe0, 0xbf, 0x29, 0x92, 0xad, 0xaf, 0x1f, 0x9b, 0x9d, 0x54,
+  0xc7, 0x36, 0x55, 0x2c, 0xc1, 0xdf, 0xd8, 0x9c, 0x31, 0x11, 0x7f, 0x46,
+  0xe9, 0x20, 0x85, 0x03, 0xdb, 0x8f, 0xc4, 0x94, 0x65, 0x93, 0x84, 0x41,
+  0xdb, 0xcc, 0x7d, 0x84, 0xa5, 0x49, 0x23, 0x85, 0x72, 0x59, 0xdc, 0x51,
+  0xd5, 0xab, 0xf4, 0xdf, 0xe2, 0xd4, 0x60, 0x7b, 0x1e, 0x72, 0x0e, 0x01,
+  0x29, 0xef, 0xcc, 0x10, 0xd3, 0x36, 0x0b, 0x41, 0xc6, 0x8a, 0xbe, 0xe1,
+  0x59, 0x98, 0x09, 0x1a, 0x4b, 0x07, 0x01, 0x50, 0x58, 0x8b, 0xf5, 0x92,
+  0xf4, 0xf3, 0x92, 0x70, 0x73, 0xab, 0x22, 0x1e, 0xd9, 0xbf, 0xf4, 0xe2,
+  0x72, 0x94, 0xa6, 0xda, 0xcf, 0x09, 0xe3, 0x83, 0x09, 0xa6, 0xc3, 0x06,
+  0xf1, 0x71, 0xec, 0x79, 0x98, 0x4e, 0x2a, 0xe3, 0x9c, 0xdd, 0xbb, 0x9c,
+  0x73, 0x12, 0x73, 0xab, 0x3f, 0xcc, 0x60, 0xa1, 0xd2, 0x38, 0x09, 0x1e,
+  0x86, 0x5a, 0x5c, 0x69, 0xa5, 0x4d, 0x8b, 0x69, 0x0b, 0xd6, 0xf7, 0xb6,
+  0x6b, 0x7e, 0xeb, 0x26, 0xf4, 0x10, 0xa5, 0xaa, 0xac, 0xd8, 0x94, 0xbc,
+  0xbf, 0xdf, 0x71, 0x9f, 0x59, 0x15, 0x0d, 0x6f, 0x80, 0x22, 0x65, 0x79,
+  0x2f, 0x9e, 0x2d, 0x82, 0x29, 0x6e, 0x83, 0x8d, 0x5a, 0xc3, 0xcb, 0xa3,
+  0xb3, 0xcb, 0x73, 0xc2, 0xcb, 0x43, 0xe4, 0xf4, 0xac, 0xe4, 0x2c, 0x05,
+  0xfc, 0x19, 0x26, 0xb0, 0x67, 0x0c, 0x2b, 0x49, 0x49, 0x23, 0x63, 0xbf,
+  0xbc, 0x9a, 0x9a, 0x43, 0x90, 0xf9, 0x10, 0xb2, 0xaf, 0x38, 0xbd, 0x2d,
+  0x8b, 0x9c, 0x02, 0x47, 0x66, 0xf0, 0x6a, 0x5f, 0x34, 0x97, 0x03, 0x5f,
+  0xb5, 0xdf, 0xd6, 0x2e, 0x0b, 0xa6, 0x10, 0xa9, 0xfe, 0xae, 0x01, 0x0c,
+  0xcc, 0x23, 0x81, 0x07, 0xf4, 0xf8, 0x79, 0x95, 0x18, 0x6c, 0x42, 0xb1,
+  0xeb, 0x0c, 0x16, 0xaa, 0x76, 0xb0, 0xe2, 0x24, 0x0d, 0x02, 0xae, 0xd0,
+  0xfa, 0xf8, 0x72, 0x35, 0xa2, 0x01, 0x6c, 0x6c, 0xb6, 0xc8, 0x9a, 0x78,
+  0x5b, 0xb2, 0xdd, 0x41, 0x23, 0xd4, 0x03, 0x7f, 0x5b, 0x59, 0x17, 0xa6,
+  0x53, 0xc5, 0xc6, 0x59, 0x2b, 0x0e, 0xf8, 0xbc, 0xcb, 0x5f, 0x1d, 0x2e,
+  0x91, 0x43, 0x34, 0xbe, 0x20, 0xc7, 0xcb, 0x4a, 0x13, 0x3f, 0x81, 0xdf,
+  0x13, 0xf7, 0x17, 0x23, 0x29, 0x61, 0x0d, 0x67, 0x12, 0xcf, 0x41, 0x2d,
+  0xc8, 0xb4, 0x50, 0x00, 0x3d, 0xbf, 0x98, 0xcf, 0xd9, 0x9c, 0xf0, 0x32,
+  0x16, 0x8e, 0xa5, 0x70, 0xf6, 0xc4, 0x05, 0x1a, 0xf5, 0x03, 0xfc, 0x19,
+  0xe4, 0xa4, 0xee, 0xf0, 0xa1, 0x9a, 0x30, 0x7a, 0xdd, 0xe0, 0x1e, 0x48,
+  0xdc, 0x46, 0x5b, 0x7f, 0x32, 0x70, 0x38, 0x0f, 0x61, 0xba, 0x7f, 0x63,
+  0xe7, 0xaa, 0x9b, 0x65, 0x76, 0x0b, 0x53, 0xf0, 0xcb, 0xa1, 0x35, 0xd9,
+  0x17, 0x9b, 0x5f, 0x70, 0xcb, 0x5c, 0xfc, 0x0b, 0xf7, 0x5f, 0x36, 0x23,
+  0x20, 0x66, 0xf9, 0x1d, 0x3a, 0xf2, 0x04, 0xc4, 0xdb, 0x51, 0x4e, 0x43,
+  0xb3, 0x1b, 0x9b, 0xfb, 0x01, 0xb3, 0x32, 0x1b, 0x18, 0x4c, 0x67, 0xd7,
+  0x93, 0xb6, 0xcd, 0xe6, 0x81, 0x1a, 0x1d, 0x91, 0x22, 0x51, 0x6c, 0x05,
+  0x90, 0xa2, 0x8a, 0x24, 0x4d, 0xf5, 0xf2, 0xd8, 0xe1, 0x92, 0xc8, 0x1e,
+  0x4d, 0x36, 0xfa, 0x26, 0x61, 0xb7, 0x38, 0xdd, 0xa7, 0x02, 0x33, 0xa9,
+  0xd7, 0xe6, 0xb7, 0xd1, 0x01, 0x2b, 0x29, 0xe4, 0xc8, 0x02, 0x22, 0xb0,
+  0xa5, 0xfc, 0x92, 0x89, 0x62, 0x74, 0x36, 0xec, 0x0b, 0xeb, 0x36, 0xa6,
+  0x0c, 0xf0, 0x2d, 0x5b, 0xca, 0x95, 0x64, 0x86, 0xc8, 0xe6, 0x41, 0xe0,
+  0xd9, 0x4f, 0xbe, 0x4b, 0x76, 0x21, 0xce, 0x46, 0x99, 0x1f, 0x36, 0x36,
+  0x29, 0x7b, 0x16, 0x37, 0x3c, 0xf7, 0x99, 0xe1, 0x79, 0x9d, 0x17, 0xda,
+  0x95, 0x7a, 0x75, 0xd4, 0x81, 0x1b, 0xfd, 0x24, 0x0f, 0xc4, 0xe1, 0x31,
+  0xc1, 0xfe, 0xf2, 0xdc, 0xaf, 0xf2, 0x16, 0xf7, 0xdf, 0x90, 0xea, 0xb3,
+  0x9f, 0xe2, 0x82, 0xc6, 0x74, 0x97, 0x9f, 0xb5, 0xb8, 0xb6, 0x7e, 0x3d,
+  0x0b, 0x54, 0x8b, 0x4a, 0x58, 0x9d, 0xcf, 0x01, 0x33, 0x8f, 0x01, 0x0a,
+  0xdd, 0x7d, 0x1a, 0x16, 0x88, 0x9f, 0x04, 0x2b, 0x7b, 0x8a, 0x59, 0x29,
+  0xe8, 0x06, 0xf4, 0xd8, 0xe0, 0x85, 0xf1, 0x1b, 0x71, 0xad, 0x8d, 0xe9,
+  0xb2, 0xa6, 0x6f, 0x45, 0xf4, 0x96, 0xb2, 0x1b, 0xc5, 0xc9, 0x9d, 0x2f,
+  0x29, 0x9a, 0xe6, 0xa5, 0x40, 0x5a, 0xca, 0x8f, 0x19, 0xe5, 0x03, 0xeb,
+  0xdc, 0xe3, 0x22, 0xe3, 0xfc, 0x98, 0xb1, 0x9b, 0x87, 0x07, 0xcc, 0xd4,
+  0x5c, 0x2d, 0x86, 0x9c, 0xeb, 0x95, 0xbe, 0xdf, 0xa8, 0x4c, 0xa9, 0x1e,
+  0x36, 0x68, 0xc2, 0xda, 0x8e, 0x6a, 0x5a, 0x2f, 0xb4, 0xe2, 0xde, 0xb8,
+  0xd7, 0x46, 0xbc, 0x1b, 0xed, 0x97, 0xa6, 0xbe, 0x65, 0x7c, 0x73, 0x0c,
+  0xf9, 0x37, 0x76, 0x86, 0x60, 0x0a, 0x9e, 0x89, 0x45, 0xc7, 0x04, 0x51,
+  0x76, 0xcd, 0xc2, 0xea, 0xa0, 0x8d, 0x2f, 0xbd, 0xb3, 0x13, 0x62, 0x4b,
+  0xc7, 0x41, 0xf4, 0x0d, 0xbd, 0x94, 0xd2, 0xd0, 0x57, 0x62, 0x4d, 0x78,
+  0x8d, 0x14, 0xf6, 0xe7, 0xf4, 0x0d, 0x2c, 0x14, 0xad, 0x0c, 0x6c, 0xef,
+  0xfe, 0x35, 0x29, 0x28, 0xa1, 0x6b, 0x49, 0xdd, 0x01, 0x4c, 0x3c, 0x9e,
+  0x7c, 0x33, 0x88, 0x6d, 0xea, 0x62, 0xb2, 0x21, 0x48, 0x63, 0xdf, 0xe1,
+  0x53, 0x9c, 0x2b, 0x21, 0xdd, 0x83, 0xc2, 0xae, 0x24, 0x34, 0x05, 0xa8,
+  0x4e, 0xfa, 0x66, 0x09, 0x94, 0x8a, 0x6a, 0x0a, 0x77, 0xfb, 0xe2, 0xbc,
+  0xda, 0x1c, 0xcd, 0x03, 0x62, 0xb7, 0x38, 0x61, 0x67, 0xc6, 0x1e, 0x15,
+  0x70, 0x00, 0xa2, 0x4c, 0x80, 0x85, 0x72, 0x8d, 0xd7, 0xb0, 0xc8, 0x6f,
+  0x13, 0xe6, 0x17, 0x64, 0x14, 0x12, 0x6a, 0x16, 0xeb, 0xc0, 0xe2, 0x47,
+  0x07, 0x09, 0xc5, 0x0d, 0x3d, 0x30, 0xd7, 0xc4, 0x0b, 0x98, 0x73, 0x77,
+  0x51, 0x81, 0xdb, 0xb0, 0x72, 0x2c, 0xa5, 0xd7, 0x09, 0xe8, 0x42, 0x7b,
+  0x70, 0xf0, 0x55, 0x1b, 0x21, 0x48, 0xdf, 0xef, 0xc8, 0xb3, 0xcd, 0xa9,
+  0xbb, 0x3c, 0x3b, 0x70, 0xa4, 0xcf, 0x6f, 0x1a, 0x0a, 0xb4, 0x44, 0xce,
+  0xcb, 0xe8, 0x90, 0x19, 0xc2, 0xc3, 0x23, 0x95, 0x80, 0x36, 0x3d, 0x94,
+  0xd4, 0xfc, 0xb6, 0xa7, 0xd6, 0xe2, 0xd8, 0xd4, 0x0e, 0x4e, 0xa4, 0xa6,
+  0x86, 0x6b, 0x52, 0xc6, 0x16, 0xba, 0x57, 0xda, 0x5f, 0x10, 0xd4, 0x88,
+  0x0f, 0x86, 0x8b, 0x2e, 0x4e, 0xe3, 0x7a, 0xe3, 0xf2, 0x65, 0x32, 0x9f,
+  0xf0, 0x74, 0x08, 0x6f, 0x29, 0x2d, 0xad, 0x7d, 0xf0, 0x6f, 0x98, 0xc1,
+  0x0d, 0xc6, 0x48, 0x85, 0x29, 0x7c, 0xfc, 0x25, 0xcf, 0x5c, 0xe0, 0x46,
+  0x90, 0xa6, 0xc6, 0x87, 0x0b, 0xf4, 0x0d, 0x9e, 0x10, 0x42, 0xc7, 0xbb,
+  0x5a, 0x1d, 0x77, 0xe6, 0x88, 0x4e, 0xd0, 0xd2, 0x0c, 0x18, 0xf1, 0x8a,
+  0x9e, 0x42, 0x6b, 0x4c, 0x05, 0xd5, 0x9f, 0xb3, 0xed, 0xc4, 0x23, 0x12,
+  0x6b, 0x1a, 0x9d, 0xe2, 0x92, 0x1a, 0x98, 0xc3, 0x80, 0xa7, 0x05, 0x67,
+  0x24, 0xc9, 0x6a, 0xda, 0xac, 0x56, 0x7f, 0x64, 0x7a, 0x40, 0xd6, 0x72,
+  0x9d, 0xc8, 0xba, 0x24, 0xb3, 0xe6, 0x3e, 0xd0, 0xc6, 0x91, 0x66, 0x13,
+  0xd9, 0x87, 0xba, 0xce, 0xdf, 0x0f, 0x3e, 0xdf, 0xea, 0x8a, 0x39, 0x8a,
+  0x01, 0x4a, 0xf7, 0x19, 0x02, 0x14, 0x0e, 0x68, 0x80, 0xf8, 0x1c, 0xfc,
+  0xd4, 0x3c, 0xda, 0x82, 0x9e, 0x8f, 0xa9, 0x4a, 0xbb, 0x98, 0xa7, 0x50,
+  0x77, 0x56, 0x5b, 0x4f, 0x60, 0xd5, 0xe2, 0xf9, 0x29, 0x43, 0x99, 0xba,
+  0x63, 0x47, 0x69, 0x90, 0xc3, 0x38, 0x95, 0x08, 0xf7, 0x1a, 0xf5, 0x8a,
+  0x0c, 0xfa, 0x90, 0xf0, 0xb5, 0x80, 0xdf, 0x89, 0x93, 0x0f, 0x85, 0xdc,
+  0x4c, 0x0f, 0x4f, 0xea, 0x60, 0xc6, 0xa4, 0x4d, 0xe7, 0x08, 0x17, 0xa6,
+  0x43, 0x0d, 0x88, 0x74, 0xca, 0xb0, 0xf7, 0x2b, 0xef, 0xc9, 0xab, 0xfe,
+  0x5e, 0xed, 0x9e, 0x54, 0xb3, 0x79, 0xef, 0x7e, 0xf8, 0x44, 0xb8, 0xea,
+  0xfa, 0xec, 0x3d, 0xa5, 0xeb, 0x28, 0xbb, 0xa1, 0x2e, 0x3a, 0x1a, 0x39,
+  0x40, 0x59, 0xc5, 0xee, 0x5d, 0x44, 0x57, 0xa7, 0x89, 0x04, 0x6c, 0xfa,
+  0x46, 0x64, 0xc6, 0x54, 0xfb, 0x8a, 0xa3, 0x46, 0xc0, 0x0a, 0x23, 0x1c,
+  0x91, 0x22, 0x10, 0x58, 0xad, 0x3f, 0x4b, 0x83, 0x45, 0x59, 0x9a, 0x15,
+  0x9d, 0x3c, 0x24, 0xa3, 0x25, 0xa5, 0x16, 0xa0, 0x62, 0x8f, 0xf8, 0x5f,
+  0xab, 0x63, 0x1e, 0x4e, 0x9c, 0x43, 0x22, 0x1b, 0xf0, 0x83, 0xe6, 0x66,
+  0xd8, 0x56, 0x6a, 0xb2, 0x78, 0x5e, 0xbd, 0xe7, 0xf1, 0x64, 0x70, 0x02,
+  0xfa, 0x5d, 0xfd, 0x57, 0x5e, 0x78, 0x9f, 0x6a, 0x31, 0x50, 0x99, 0x01,
+  0x7a, 0x4a, 0xa7, 0x19, 0xab, 0x8b, 0xef, 0xd3, 0x51, 0x91, 0x97, 0xf9,
+  0x84, 0xb3, 0x0c, 0x1d, 0xd3, 0xf6, 0xf4, 0x74, 0x10, 0xdd, 0x27, 0x43,
+  0x2d, 0x67, 0xee, 0xfb, 0xfe, 0x7f, 0xe6, 0x22, 0x18, 0xd5, 0x2a, 0xd2,
+  0xa4, 0xc2, 0x5d, 0xd3, 0x38, 0x36, 0xe2, 0x7b, 0x51, 0x53, 0x41, 0x41,
+  0xbf, 0x21, 0xdb, 0x0b, 0xfb, 0xb2, 0xce, 0x48, 0x34, 0x2d, 0x92, 0x3c,
+  0x90, 0xcb, 0xc0, 0x13, 0x50, 0xb1, 0xc2, 0x74, 0x42, 0xfa, 0xd7, 0x30,
+  0x96, 0x8e, 0x77, 0xec, 0xd5, 0x01, 0xb6, 0x83, 0xda, 0xa5, 0x78, 0xc3,
+  0x6e, 0xd1, 0xcd, 0xe9, 0xd5, 0x19, 0x0d, 0x13, 0xec, 0x11, 0x8b, 0xec,
+  0xc0, 0x6d, 0x5b, 0x46, 0x1d, 0x5a, 0xc7, 0x79, 0x41, 0xf9, 0x63, 0x4e,
+  0x37, 0x2a, 0x6c, 0xdb, 0xba, 0x2c, 0xd0, 0xcd, 0x4f, 0xd0, 0xb3, 0x3e,
+  0x3f, 0xbd, 0xbf, 0xc9, 0xb9, 0x77, 0x1f, 0x6d, 0xb3, 0xd5, 0xd9, 0xa8,
+  0x28, 0x4b, 0xfa, 0x9d, 0x10, 0x57, 0xb0, 0xf2, 0xc6, 0x3d, 0xa8, 0x20,
+  0x4c, 0xa5, 0x9c, 0x87, 0x2d, 0x07, 0x96, 0xfc, 0x92, 0x37, 0xe9, 0xb4,
+  0xa5, 0x35, 0x31, 0xbb, 0xfc, 0x08, 0x9a, 0xc3, 0x2a, 0x46, 0x34, 0x23,
+  0x11, 0x9a, 0x05, 0xdf, 0x52, 0xaf, 0xe1, 0x36, 0xfe, 0xcb, 0x77, 0x9e,
+  0xb7, 0x50, 0xdf, 0xef, 0x1c, 0x06, 0x34, 0xbe, 0x0b, 0x67, 0x2e, 0xe6,
+  0x0a, 0x58, 0x8d, 0xdd, 0x51, 0xd9, 0x6d, 0xe4, 0xdc, 0x03, 0x0f, 0x79,
+  0x4a, 0x5f, 0x0f, 0x07, 0x59, 0x34, 0x0a, 0x19, 0xc8, 0x25, 0x72, 0x02,
+  0xe9, 0xf2, 0xef, 0x31, 0x1d, 0x4f, 0x3d, 0x4a, 0xe9, 0x5e, 0xdd, 0x1c,
+  0x7f, 0xb0, 0xd3, 0x1b, 0x26, 0x31, 0x76, 0xc7, 0x3a, 0xac, 0x50, 0x61,
+  0x5a, 0x55, 0x55, 0x14, 0x28, 0x2b, 0xfa, 0x9a, 0xdf, 0xbd, 0x26, 0x5d,
+  0x0b, 0x8f, 0xf6, 0xe2, 0xe8, 0xc3, 0xf5, 0xbb, 0x68, 0xa7, 0xbf, 0xf5,
+  0xac, 0xaa, 0x22, 0x62, 0x08, 0xb5, 0x31, 0xf4, 0xf0, 0xa8, 0xc9, 0x76,
+  0xf6, 0xb7, 0x65, 0x56, 0x6f, 0xbe, 0x13, 0x8a, 0xab, 0x88, 0xfe, 0xa4,
+  0xe2, 0x17, 0xd3, 0xbc, 0x9a, 0x99, 0xf1, 0x6e, 0x7b, 0xb6, 0x5e, 0x8f,
+  0xcc, 0xef, 0xe2, 0xa9, 0x10, 0x74, 0x19, 0x84, 0x56, 0xa9, 0x4d, 0x56,
+  0x80, 0x9f, 0x34, 0xd0, 0x4d, 0x8d, 0xb0, 0xd0, 0x72, 0xe1, 0x3b, 0x65,
+  0x1a, 0x2b, 0x93, 0x1e, 0x7b, 0xf5, 0xf6, 0xb8, 0x31, 0xdc, 0x8b, 0x97,
+  0xfb, 0x5b, 0x9f, 0x30, 0xc1, 0x32, 0x47, 0x0b, 0x42, 0x4c, 0xb2, 0x20,
+  0xe2, 0xd1, 0xf7, 0x05, 0x96, 0x1c, 0xab, 0x8f, 0x28, 0x97, 0x87, 0x5c,
+  0x48, 0x84, 0xb2, 0x1a, 0x63, 0xa6, 0x9d, 0x41, 0x4c, 0x29, 0x54, 0xdb,
+  0xff, 0xc7, 0x3f, 0x7d, 0xb3, 0xee, 0xaf, 0x3f, 0x51, 0x28, 0x87, 0xda,
+  0x91, 0x9a, 0x0a, 0x0d, 0x65, 0x32, 0xa5, 0x15, 0xc7, 0x78, 0x9d, 0xd7,
+  0xfe, 0xb8, 0x16, 0x99, 0xa6, 0x61, 0x62, 0x98, 0x87, 0x7b, 0x2e, 0x68,
+  0xb8, 0x4f, 0x67, 0xa7, 0xc7, 0x4a, 0x90, 0xf2, 0xb1, 0xa3, 0x11, 0xe8,
+  0x2e, 0x48, 0x2b, 0xad, 0x71, 0x5b, 0xd3, 0x3f, 0xed, 0x7e, 0x25, 0xd0,
+  0x6b, 0x1a, 0xe2, 0xc0, 0x50, 0x04, 0xe7, 0xc5, 0xd1, 0x0a, 0x50, 0x17,
+  0xa5, 0xd2, 0xf3, 0x34, 0x6b, 0xf1, 0x3b, 0x4b, 0xf2, 0xd7, 0x3f, 0xe0,
+  0x04, 0xba, 0xd5, 0x7d, 0xfe, 0xcf, 0xba, 0x0f, 0x1a, 0x34, 0x0c, 0x9c,
+  0xef, 0xc7, 0x3f, 0x6e, 0x63, 0x35, 0x57, 0xa7, 0x39, 0x44, 0x4e, 0xcd,
+  0x24, 0xcc, 0xa9, 0x1a, 0x05, 0x69, 0x15, 0xb0, 0xb2, 0x7e, 0x10, 0x0b,
+  0xc5, 0xbb, 0xa8, 0x35, 0xfe, 0xb3, 0x8f, 0xff, 0xfd, 0xeb, 0x76, 0x6f,
+  0xff, 0x27, 0xf3, 0xd1, 0x3f, 0x6e, 0x7f, 0xfc, 0xe3, 0x4e, 0x27, 0x54,
+  0xac, 0x67, 0x61, 0x1b, 0x9c, 0xe4, 0x52, 0x54, 0x68, 0xb3, 0x47, 0xa9,
+  0xb0, 0x91, 0xe0, 0xb0, 0x6d, 0x53, 0x4a, 0x4d, 0xcf, 0x03, 0xd8, 0x56,
+  0xe8, 0x73, 0xec, 0x37, 0x1d, 0xfd, 0xda, 0xaa, 0x54, 0x99, 0xc3, 0x7d,
+  0xce, 0xef, 0x2b, 0xb8, 0x05, 0xde, 0x10, 0xa9, 0xfd, 0xf0, 0x78, 0x21,
+  0xc2, 0x68, 0xb9, 0xe4, 0x81, 0x48, 0x37, 0x0a, 0x8f, 0xe2, 0xef, 0x86,
+  0xa4, 0xb4, 0x81, 0x3c, 0x8b, 0xa3, 0xc6, 0xa6, 0x0f, 0x87, 0xe6, 0x27,
+  0x59, 0xe2, 0x15, 0xd1, 0x69, 0xb9, 0x2d, 0x5b, 0x6f, 0xca, 0x0e, 0x72,
+  0x9b, 0x6e, 0xc0, 0xf8, 0x5f, 0x49, 0x24, 0x2b, 0x37, 0x81, 0x53, 0xba,
+  0xd2, 0x5e, 0xd6, 0xd8, 0xdf, 0x30, 0x01, 0xc7, 0xf5, 0xcf, 0xb0, 0x54,
+  0x81, 0x01, 0xd3, 0xd2, 0x86, 0xce, 0xe8, 0x67, 0x12, 0x36, 0x43, 0x78,
+  0x06, 0xea, 0x93, 0x19, 0x2a, 0xae, 0x8e, 0x87, 0xd8, 0x45, 0xb4, 0xd6,
+  0x94, 0xcd, 0x74, 0xd8, 0x1a, 0x5a, 0xa4, 0xb0, 0xb8, 0x6c, 0xd9, 0x10,
+  0x77, 0x2b, 0x9c, 0x4d, 0x90, 0x8d, 0xa2, 0xcd, 0x59, 0xdd, 0x40, 0xb1,
+  0x87, 0x79, 0xbf, 0x55, 0xd2, 0x73, 0xea, 0x99, 0xa9, 0x7e, 0x9a, 0x7e,
+  0xaa, 0xc5, 0x8f, 0x23, 0x6e, 0xd0, 0x46, 0x21, 0xd9, 0x9e, 0x17, 0x47,
+  0x46, 0x09, 0x35, 0x7e, 0x04, 0x6e, 0xc8, 0xa8, 0xbc, 0x7d, 0x53, 0xb7,
+  0xa2, 0x2e, 0x02, 0xe1, 0x36, 0x40, 0x6a, 0x6b, 0xbd, 0xb5, 0x68, 0xdd,
+  0x18, 0x76, 0xe3, 0xb8, 0xbc, 0xd9, 0x08, 0x79, 0x90, 0xad, 0xd3, 0xd6,
+  0x32, 0x2a, 0xe9, 0xaa, 0x42, 0x22, 0x93, 0x39, 0x54, 0xbb, 0x02, 0x7b,
+  0xc1, 0x70, 0x28, 0x98, 0xde, 0xd9, 0x33, 0x39, 0x00, 0xb5, 0x9f, 0xf4,
+  0xd0, 0x54, 0x64, 0x58, 0xe5, 0xff, 0xa0, 0x88, 0x98, 0x1f, 0x90, 0xa4,
+  0x67, 0x39, 0x43, 0xaf, 0xc7, 0xc5, 0x6b, 0x56, 0x88, 0x6a, 0x1f, 0xf6,
+  0x5e, 0x3a, 0x9f, 0x27, 0xe3, 0x40, 0x1a, 0x1b, 0x27, 0x71, 0x8d, 0x39,
+  0xfd, 0x5b, 0x9f, 0x76, 0x3c, 0x29, 0x01, 0xf8, 0x01, 0x0d, 0xe0, 0x05,
+  0xa1, 0x38, 0xc5, 0xc1, 0x2f, 0xfa, 0xa0, 0xe0, 0xaa, 0x30, 0x8e, 0x09,
+  0x86, 0x0a, 0xc9, 0x8d, 0xb6, 0x5c, 0x70, 0x4d, 0xab, 0xdb, 0x07, 0x80,
+  0x7b, 0xc6, 0xf7, 0x7c, 0xaf, 0x0e, 0xcc, 0x26, 0x46, 0x49, 0x32, 0x4a,
+  0x74, 0x34, 0xaa, 0xde, 0xb8, 0x8f, 0x19, 0xab, 0xca, 0xa2, 0xda, 0x20,
+  0xc4, 0x81, 0x75, 0x00, 0x31, 0x9c, 0x4c, 0x73, 0x38, 0xb2, 0x9a, 0x90,
+  0xaf, 0x88, 0x04, 0x78, 0x40, 0xe1, 0x45, 0x21, 0x8c, 0x92, 0x1b, 0x41,
+  0x73, 0x0d, 0xa6, 0xeb, 0x1c, 0x6f, 0x3d, 0xbb, 0xff, 0xd9, 0x75, 0xf6,
+  0x57, 0x8d, 0x10, 0xdd, 0xee, 0x79, 0xfc, 0x50, 0x77, 0x8c, 0x35, 0x90,
+  0x69, 0xdd, 0x07, 0x43, 0x27, 0x12, 0x97, 0xb7, 0x9c, 0x7c, 0x30, 0xce,
+  0xed, 0xa9, 0x38, 0x87, 0xc2, 0x82, 0xae, 0x3e, 0x07, 0xc1, 0x1c, 0x0a,
+  0xa7, 0xd5, 0xa1, 0xdd, 0x5f, 0xe4, 0xb3, 0xb2, 0x06, 0x57, 0x27, 0xe8,
+  0x02, 0xc8, 0x6b, 0xcc, 0xc6, 0xf1, 0x37, 0xcb, 0x14, 0xb7, 0x28, 0xce,
+  0x02, 0x69, 0xfb, 0x65, 0x20, 0xaa, 0x8a, 0xba, 0x87, 0x76, 0x91, 0x07,
+  0x6a, 0x09, 0x68, 0x0e, 0x2d, 0xfb, 0xb6, 0xaa, 0xe5, 0x4b, 0xed, 0xc1,
+  0xf6, 0xfc, 0x1c, 0xa9, 0xec, 0x23, 0x8c, 0x08, 0xbb, 0x0c, 0xa6, 0x27,
+  0x39, 0x9b, 0x92, 0xb2, 0x4f, 0xe2, 0x82, 0xb7, 0x34, 0x94, 0x63, 0x92,
+  0x4c, 0x11, 0x3e, 0x09, 0xb5, 0x42, 0x44, 0x90, 0x00, 0x1e, 0x97, 0x3d,
+  0xd1, 0x0e, 0xfd, 0x45, 0xf3, 0x3c, 0xcb, 0x32, 0x3a, 0x5c, 0xdc, 0x14,
+  0x60, 0x61, 0xf9, 0xb5, 0xa8, 0x83, 0x77, 0x11, 0x63, 0x0d, 0xc3, 0x53,
+  0xfc, 0x8c, 0xe1, 0xc0, 0x0e, 0x1c, 0xeb, 0x27, 0xc4, 0x10, 0xc5, 0x24,
+  0xbb, 0x5e, 0x5c, 0xf6, 0x3c, 0xea, 0xb8, 0xb6, 0x20, 0x04, 0x1c, 0x63,
+  0xcd, 0xd9, 0xe6, 0xc7, 0xfc, 0x6e, 0x4c, 0x3b, 0xc8, 0x10, 0xa7, 0x0a,
+  0xe8, 0x63, 0xb3, 0xdf, 0xdf, 0x44, 0xbd, 0x60, 0x13, 0xfe, 0x48, 0x9d,
+  0xa6, 0x4b, 0xcd, 0xce, 0x9e, 0x20, 0x49, 0xf0, 0x5b, 0xe8, 0x66, 0x95,
+  0x2e, 0xd8, 0x4e, 0xa7, 0xc4, 0xbf, 0x2f, 0x29, 0x3d, 0xbf, 0x00, 0x8b,
+  0xad, 0x60, 0x9c, 0x83, 0x79, 0x43, 0x11, 0xf5, 0xfa, 0x69, 0x72, 0xd8,
+  0xb1, 0x14, 0x4c, 0x9d, 0x46, 0x8f, 0x58, 0x74, 0x9d, 0x90, 0x87, 0x13,
+  0x17, 0x91, 0x56, 0x8a, 0x64, 0x48, 0x18, 0x13, 0xf1, 0x4a, 0x9f, 0xc9,
+  0xde, 0x4e, 0xe3, 0xf8, 0x52, 0x38, 0xf0, 0x31, 0xd8, 0x9f, 0x04, 0x80,
+  0x8c, 0x19, 0xca, 0x7e, 0x8d, 0x23, 0x3b, 0xac, 0x25, 0x39, 0xa5, 0x09,
+  0xe9, 0x48, 0xf2, 0xc7, 0x2a, 0xf5, 0x4e, 0xeb, 0x4e, 0xa9, 0xc7, 0xf0,
+  0x14, 0x52, 0xfe, 0x08, 0xe5, 0x38, 0x4a, 0x05, 0x03, 0x91, 0x43, 0x62,
+  0xda, 0x11, 0x09, 0x20, 0x56, 0xcc, 0x19, 0x92, 0x64, 0x20, 0x4b, 0xca,
+  0x54, 0xc8, 0xb3, 0x68, 0xfc, 0x7a, 0x46, 0x68, 0x39, 0x53, 0x80, 0x35,
+  0x23, 0x86, 0x34, 0xec, 0xfc, 0x9b, 0x93, 0x2b, 0xb1, 0x02, 0x08, 0x36,
+  0xc3, 0x36, 0x7e, 0xf7, 0x40, 0xcb, 0xc9, 0x59, 0xf0, 0x62, 0x8f, 0x4c,
+  0x7a, 0xdc, 0xb7, 0xf2, 0x26, 0xde, 0xd9, 0x7f, 0x21, 0xd3, 0x56, 0x44,
+  0x41, 0xf2, 0x45, 0xac, 0xf1, 0xaf, 0x36, 0x37, 0x39, 0x99, 0x08, 0x1d,
+  0x40, 0x9e, 0xec, 0x25, 0x5f, 0x2c, 0x3e, 0xfb, 0xc5, 0x5a, 0x38, 0x8d,
+  0x58, 0xad, 0x43, 0x6d, 0x3f, 0x4e, 0xfd, 0x0f, 0x29, 0xdd, 0xd9, 0x6d,
+  0x5e, 0xd3, 0xad, 0xb5, 0x26, 0xa4, 0xda, 0xbe, 0x78, 0x45, 0x4f, 0x17,
+  0xc1, 0xe0, 0xa1, 0xe6, 0xc9, 0xc0, 0x1d, 0xb4, 0x56, 0x1f, 0xb1, 0x8d,
+  0x9d, 0xdd, 0xe1, 0x0c, 0x61, 0x6c, 0x7a, 0x3f, 0xf2, 0x81, 0x9e, 0xb8,
+  0x06, 0x8e, 0xa8, 0xce, 0x1d, 0x59, 0x92, 0xe3, 0x53, 0x8e, 0xeb, 0x10,
+  0xe5, 0x69, 0x50, 0x9a, 0xdd, 0x9e, 0x74, 0x98, 0xcb, 0xa1, 0x97, 0xc5,
+  0x25, 0xdf, 0x34, 0x58, 0xc4, 0xe4, 0x35, 0x73, 0x72, 0xa7, 0xed, 0x75,
+  0x01, 0x8d, 0xab, 0xe0, 0xe8, 0xb8, 0xb3, 0x01, 0x9e, 0x77, 0x86, 0xb0,
+  0xef, 0x15, 0x62, 0x8a, 0x92, 0x67, 0x47, 0x49, 0xca, 0xe0, 0x74, 0x70,
+  0xb6, 0x18, 0x15, 0xf7, 0xee, 0x01, 0x90, 0xc2, 0x26, 0xd2, 0x81, 0x18,
+  0xf4, 0x5e, 0x93, 0x19, 0x8c, 0xc1, 0xbd, 0xea, 0x6f, 0x1d, 0x28, 0x6c,
+  0x75, 0x37, 0xfa, 0x26, 0x5b, 0xe2, 0x79, 0xe0, 0xa2, 0xbf, 0x19, 0x7c,
+  0xeb, 0x15, 0xa0, 0xe2, 0x1b, 0x7b, 0xbb, 0xf8, 0xc6, 0xf9, 0x80, 0x9f,
+  0xba, 0xcf, 0x67, 0x13, 0x78, 0x33, 0xf4, 0xdc, 0x4b, 0x7c, 0x0e, 0x28,
+  0x6e, 0x5c, 0xcd, 0x4a, 0x25, 0xaa, 0x15, 0x33, 0xd9, 0xdb, 0x0b, 0xcc,
+  0xa4, 0xfb, 0x8b, 0x3f, 0x74, 0x41, 0x72, 0x1d, 0x89, 0x09, 0x7b, 0xb3,
+  0x11, 0xe1, 0x50, 0x69, 0x8e, 0x01, 0x61, 0xff, 0x94, 0xcc, 0x97, 0xc1,
+  0x54, 0x9e, 0xd3, 0xb9, 0xb1, 0x20, 0x2c, 0xc9, 0x8a, 0x30, 0x3a, 0x5e,
+  0xee, 0xec, 0x6e, 0x6f, 0xbe, 0xe8, 0xef, 0xf5, 0x77, 0x4c, 0xaa, 0x2c,
+  0xd0, 0xc1, 0x1d, 0x76, 0x16, 0xc2, 0xcc, 0xa4, 0x40, 0x48, 0x88, 0x92,
+  0xc4, 0xd2, 0x0c, 0xc6, 0x71, 0xa0, 0x63, 0xa4, 0x03, 0x84, 0x4d, 0x92,
+  0x43, 0xa0, 0x98, 0x6d, 0xb7, 0xe6, 0xb2, 0x1f, 0xe8, 0x64, 0x8c, 0xf8,
+  0x33, 0x54, 0x2c, 0x26, 0xfe, 0x3f, 0xac, 0x1a, 0xa0, 0x50, 0xf5, 0x30,
+  0xfd, 0xfb, 0x32, 0xad, 0x40, 0x0b, 0x40, 0xa6, 0x82, 0x5e, 0x4d, 0x6d,
+  0x45, 0x41, 0x76, 0x03, 0xad, 0x03, 0x6f, 0x44, 0xc0, 0x5d, 0xcc, 0x93,
+  0xa7, 0x9a, 0x04, 0x1b, 0x5c, 0xe7, 0xba, 0xce, 0x94, 0x78, 0x57, 0xc4,
+  0x2d, 0xa0, 0xc0, 0xbe, 0xcf, 0x46, 0xd4, 0x59, 0x14, 0xcc, 0xef, 0x3b,
+  0x0a, 0xa5, 0x78, 0x1d, 0x9f, 0xa5, 0x03, 0x14, 0x41, 0xb1, 0x68, 0x30,
+  0x4c, 0x33, 0xb6, 0x6c, 0xbf, 0x08, 0xf9, 0x01, 0xd7, 0x80, 0xb1, 0x57,
+  0x90, 0xd6, 0xed, 0x71, 0x27, 0xbb, 0x0f, 0xb5, 0x13, 0x97, 0x4e, 0x0b,
+  0x58, 0x83, 0xc9, 0x41, 0x1f, 0x86, 0xc7, 0x24, 0x16, 0x85, 0xc5, 0xb4,
+  0x2b, 0x90, 0x9e, 0x9e, 0xf0, 0xd0, 0x09, 0xa6, 0x4e, 0x1d, 0x54, 0x87,
+  0xff, 0xd5, 0xe8, 0x3f, 0xde, 0xda, 0x7a, 0xb6, 0xd9, 0xa0, 0x59, 0xc6,
+  0xfc, 0xd5, 0x54, 0xb6, 0xfb, 0xdb, 0x53, 0xd9, 0xce, 0x73, 0xa9, 0xcc,
+  0x12, 0x19, 0xde, 0xb3, 0x15, 0x24, 0x46, 0x08, 0x82, 0x2c, 0x7a, 0x5b,
+  0xa8, 0xcc, 0x25, 0x33, 0xc9, 0x67, 0xf3, 0x09, 0xad, 0x46, 0x67, 0x86,
+  0xcc, 0x5a, 0xa8, 0x8c, 0x71, 0xf7, 0x98, 0xc6, 0x56, 0x93, 0x98, 0x42,
+  0x3c, 0x44, 0xab, 0xa9, 0xac, 0x1e, 0x98, 0x5a, 0x4d, 0x67, 0x96, 0x1c,
+  0x9e, 0x4d, 0x65, 0xda, 0xe9, 0x8b, 0xb9, 0x4e, 0x0b, 0x89, 0xd5, 0x68,
+  0x4c, 0x88, 0x2c, 0x48, 0x65, 0xaf, 0x42, 0x54, 0xb6, 0xfb, 0x1c, 0x2a,
+  0x83, 0x03, 0x9d, 0xa1, 0xa8, 0xac, 0x51, 0xd9, 0xde, 0x6f, 0x4b, 0x65,
+  0x88, 0xfb, 0xd5, 0xac, 0x1f, 0x8f, 0x8e, 0xfe, 0xd5, 0x73, 0x8c, 0x69,
+  0x58, 0x1d, 0xd5, 0x2b, 0xab, 0xfe, 0x65, 0x9c, 0xa2, 0x71, 0xa1, 0x9f,
+  0x3c, 0xb1, 0x3a, 0xd2, 0xd6, 0xf6, 0x2f, 0x3e, 0xb1, 0x9d, 0xa6, 0x65,
+  0x52, 0x24, 0x1c, 0xcb, 0xf8, 0xab, 0xc6, 0x94, 0x0e, 0x36, 0x37, 0x7f,
+  0x22, 0xdf, 0xdc, 0x01, 0xca, 0xbe, 0x9f, 0x9a, 0x2a, 0x7c, 0x48, 0x9d,
+  0x1d, 0x5c, 0x1c, 0x7f, 0x3b, 0x90, 0x98, 0x88, 0xe8, 0x1c, 0xaa, 0x93,
+  0xb0, 0x0d, 0x0e, 0xba, 0x2a, 0x21, 0x22, 0x78, 0x6a, 0x2e, 0xb7, 0x87,
+  0xee, 0x3d, 0x74, 0x35, 0x30, 0x41, 0xa9, 0x88, 0xc2, 0x8c, 0x09, 0xf8,
+  0x51, 0xb0, 0x06, 0x38, 0xe6, 0x21, 0xa3, 0x96, 0x51, 0x8b, 0xa1, 0xc6,
+  0x13, 0x91, 0x99, 0x18, 0x97, 0x58, 0xe6, 0xbc, 0xb8, 0x5e, 0xdd, 0x14,
+  0x54, 0xec, 0x45, 0x8f, 0x6e, 0x68, 0x58, 0x72, 0xd5, 0xec, 0x64, 0x5e,
+  0xef, 0x08, 0x20, 0x7b, 0x51, 0x68, 0xa4, 0x37, 0x64, 0xe4, 0x9a, 0xdf,
+  0xaa, 0x87, 0x36, 0x04, 0x04, 0x23, 0x80, 0x8f, 0xce, 0x7e, 0xe3, 0x7b,
+  0x5e, 0x5a, 0x6d, 0xfa, 0x50, 0xc3, 0x9d, 0x42, 0xf1, 0x40, 0x7d, 0xd5,
+  0x2b, 0x6d, 0x5d, 0xf4, 0xc0, 0x8d, 0x66, 0x68, 0x10, 0x4e, 0x6a, 0x4c,
+  0xa8, 0x39, 0x50, 0xb9, 0x07, 0x43, 0x36, 0xfd, 0x7d, 0xfc, 0x8b, 0x18,
+  0x7f, 0xc3, 0x7f, 0xdf, 0xc7, 0xef, 0x52, 0xe0, 0x8e, 0xfe, 0x75, 0x83,
+  0xff, 0x94, 0x9c, 0x15, 0xc6, 0x94, 0xab, 0x9d, 0xf2, 0x28, 0xbc, 0xd1,
+  0x6e, 0x15, 0xa1, 0xc1, 0x3b, 0x39, 0xcf, 0x6d, 0x9d, 0xad, 0xbb, 0x6a,
+  0x17, 0x9a, 0xd2, 0x4b, 0x05, 0x33, 0x5c, 0x98, 0x46, 0xde, 0x0b, 0x2b,
+  0x5c, 0x89, 0x0b, 0x3c, 0xab, 0x48, 0x22, 0x6e, 0x3b, 0x41, 0x1b, 0x88,
+  0x97, 0x03, 0xe0, 0xe6, 0xbb, 0x01, 0x64, 0x78, 0x6e, 0x96, 0x23, 0xf3,
+  0xde, 0xde, 0xfa, 0xdc, 0x77, 0x49, 0x7c, 0xd0, 0x2a, 0x57, 0x8b, 0xbe,
+  0x4a, 0xe9, 0x36, 0x54, 0x6f, 0x32, 0xb4, 0xb5, 0x5d, 0xa1, 0xcf, 0x06,
+  0x0a, 0x61, 0xd1, 0xf6, 0x1d, 0x27, 0x6c, 0x2c, 0x0d, 0xd9, 0xee, 0xf5,
+  0xeb, 0x0c, 0xa8, 0xae, 0xbf, 0x24, 0xc9, 0x26, 0xa8, 0xe1, 0x91, 0x24,
+  0x8d, 0x78, 0xfc, 0x1d, 0xbd, 0x18, 0x1a, 0xca, 0xfc, 0xca, 0x62, 0x3b,
+  0xfe, 0x69, 0x6f, 0x0b, 0x4f, 0x55, 0x47, 0xc1, 0x86, 0x59, 0x33, 0x0d,
+  0x41, 0xfd, 0x69, 0x37, 0xee, 0xff, 0x8e, 0xd8, 0x6c, 0xfb, 0x75, 0x2b,
+  0xfa, 0x8f, 0x5d, 0x37, 0xef, 0x6c, 0x18, 0x17, 0x01, 0x9f, 0x8d, 0x68,
+  0x88, 0x8a, 0x3b, 0xa4, 0xa8, 0x3d, 0x26, 0x21, 0x2d, 0x66, 0x03, 0x96,
+  0xea, 0x63, 0xcc, 0x0f, 0x61, 0xa8, 0xc8, 0xef, 0x40, 0x63, 0xe2, 0x40,
+  0x6e, 0x33, 0xf9, 0x2e, 0x7b, 0x16, 0x6b, 0x49, 0x7a, 0x5d, 0x4e, 0x73,
+  0x0b, 0x57, 0xce, 0xd5, 0x3e, 0x32, 0x2e, 0xe2, 0x7b, 0xc7, 0x82, 0xe6,
+  0x6e, 0x15, 0x13, 0x8e, 0x07, 0x99, 0xd4, 0x1e, 0x2c, 0xa3, 0xc0, 0x48,
+  0x7f, 0x48, 0xfb, 0x28, 0x47, 0x45, 0x22, 0x91, 0x37, 0x84, 0x3e, 0xa5,
+  0xa8, 0x3e, 0x22, 0x86, 0x82, 0xda, 0x31, 0x4d, 0xb4, 0x9a, 0xda, 0xac,
+  0x5a, 0xe1, 0x72, 0x08, 0x23, 0xa7, 0x1f, 0x28, 0x54, 0xb0, 0xee, 0x2c,
+  0xcd, 0x5a, 0x8c, 0x05, 0x50, 0x07, 0x5f, 0xd5, 0xba, 0x76, 0xd3, 0xb5,
+  0x06, 0x2f, 0x33, 0x36, 0xb6, 0x84, 0x6f, 0xa7, 0x8b, 0xa6, 0x88, 0xee,
+  0xbd, 0xce, 0x5f, 0xf7, 0x36, 0x0c, 0x88, 0x61, 0x7e, 0x97, 0x94, 0xdc,
+  0xa7, 0x1a, 0x27, 0x8b, 0x79, 0x00, 0x37, 0xe4, 0x64, 0x11, 0xf1, 0x45,
+  0x45, 0xdc, 0x94, 0x94, 0x2d, 0x50, 0x75, 0x5e, 0xcb, 0x25, 0x9e, 0x59,
+  0x81, 0x09, 0x00, 0xc2, 0xef, 0xd0, 0x1d, 0x03, 0xbb, 0x35, 0xe1, 0x9c,
+  0x4f, 0x2a, 0xf3, 0xc6, 0xec, 0x08, 0xc1, 0x56, 0xe7, 0x58, 0x4b, 0xbe,
+  0xa8, 0xcb, 0x26, 0x44, 0x0c, 0x50, 0xde, 0x70, 0xa8, 0x4c, 0xe5, 0xcb,
+  0x27, 0xeb, 0x81, 0x0c, 0xfb, 0x99, 0x88, 0x13, 0x03, 0x2f, 0x1f, 0xd5,
+  0x87, 0x31, 0x2a, 0xfb, 0xe8, 0x26, 0x99, 0x4b, 0x6b, 0xaa, 0x16, 0x74,
+  0x85, 0x56, 0x28, 0x82, 0xfa, 0x9c, 0x38, 0x61, 0x76, 0x52, 0x2d, 0xfa,
+  0xf3, 0xfc, 0x67, 0xd8, 0xe6, 0x18, 0x7b, 0x5d, 0x7a, 0x57, 0x02, 0x64,
+  0x7d, 0xc6, 0xe7, 0x82, 0xa1, 0xb3, 0xcc, 0x58, 0x95, 0x91, 0x83, 0x2f,
+  0x29, 0xd8, 0xf9, 0x8c, 0x82, 0x11, 0x45, 0xc7, 0x30, 0xe3, 0x93, 0x8f,
+  0x1f, 0xce, 0x07, 0x1f, 0x2e, 0x9b, 0x84, 0x7d, 0x79, 0x71, 0x75, 0x7d,
+  0xf2, 0xe6, 0xe3, 0xe5, 0xd5, 0xc5, 0xf5, 0xc5, 0xf1, 0xc5, 0x59, 0xb4,
+  0xbe, 0xbd, 0xb1, 0xb2, 0xea, 0xd3, 0x78, 0x20, 0x1c, 0xfc, 0x50, 0x9d,
+  0x3f, 0xf3, 0x2c, 0x33, 0x8b, 0x75, 0x5c, 0x8f, 0x3f, 0xda, 0xf7, 0x42,
+  0x5d, 0xf5, 0xbe, 0x2b, 0xec, 0x8a, 0x20, 0xf1, 0x46, 0x6c, 0x3d, 0x8e,
+  0xa6, 0x4b, 0xbe, 0x29, 0x36, 0x8b, 0x84, 0xd1, 0x73, 0x3d, 0x85, 0x4b,
+  0xe3, 0xd8, 0x4e, 0xc1, 0xe0, 0x4a, 0x77, 0xdc, 0x7e, 0x53, 0x67, 0xc1,
+  0x33, 0x20, 0x05, 0xcc, 0x52, 0x45, 0xb9, 0x9a, 0x2c, 0x18, 0x65, 0x88,
+  0xa0, 0xe9, 0xcd, 0x1b, 0xd4, 0xb7, 0x43, 0x22, 0x8b, 0x79, 0x66, 0x34,
+  0x3a, 0x10, 0xa5, 0x97, 0x7e, 0xff, 0x36, 0x79, 0x05, 0xe6, 0x9b, 0x49,
+  0x17, 0x61, 0x99, 0x08, 0x45, 0x96, 0xa9, 0x3d, 0x11, 0x27, 0x3a, 0xc0,
+  0x03, 0xf8, 0x5b, 0x87, 0xab, 0x52, 0xb5, 0xa4, 0x17, 0xad, 0xe7, 0x97,
+  0x19, 0x81, 0xe7, 0xde, 0x99, 0x14, 0x0e, 0x87, 0x4a, 0x19, 0xe1, 0x83,
+  0x06, 0x38, 0xec, 0x89, 0x06, 0x2d, 0x19, 0x3d, 0x88, 0x6e, 0x24, 0xa9,
+  0x2f, 0x8a, 0x3b, 0x35, 0x70, 0x17, 0xf3, 0x04, 0x21, 0xf3, 0x26, 0x62,
+  0x14, 0xa9, 0x8b, 0x67, 0xdf, 0x65, 0x82, 0x96, 0x68, 0xed, 0x8a, 0xa2,
+  0x23, 0x0b, 0xe2, 0xe4, 0xba, 0xa4, 0x68, 0x42, 0x5c, 0x54, 0x4a, 0x13,
+  0xe9, 0x1a, 0x3c, 0xac, 0xb7, 0x8d, 0x69, 0x35, 0xd9, 0xcf, 0xcb, 0xfe,
+  0x8b, 0xfd, 0xfe, 0x0e, 0x82, 0xb9, 0x5c, 0xcc, 0x30, 0xbe, 0x29, 0x8a,
+  0x05, 0x39, 0x97, 0xe9, 0x03, 0x82, 0x5c, 0x45, 0xa9, 0x91, 0x76, 0xaf,
+  0x64, 0xc4, 0x90, 0x2d, 0xa5, 0x35, 0xe6, 0x2a, 0xc9, 0x14, 0xee, 0x43,
+  0x3a, 0x4d, 0x0b, 0xda, 0x39, 0x82, 0x05, 0xc1, 0x67, 0x0e, 0x6c, 0x76,
+  0x20, 0xe6, 0xcb, 0x35, 0x79, 0xed, 0xa9, 0xe9, 0xc5, 0x38, 0x38, 0xbe,
+  0x14, 0x50, 0x0e, 0x0b, 0x1f, 0x42, 0xec, 0x5c, 0xdb, 0xa9, 0x6f, 0xf5,
+  0xb7, 0xa2, 0xc1, 0xfb, 0xaf, 0x05, 0xb9, 0xf5, 0xeb, 0x41, 0x40, 0x13,
+  0x20, 0x7d, 0x5e, 0x5f, 0xef, 0xbb, 0x41, 0x46, 0x5c, 0x1c, 0xcc, 0xee,
+  0xcf, 0xf8, 0xa7, 0x16, 0x56, 0x50, 0xe6, 0xb2, 0x5d, 0x71, 0xe4, 0x39,
+  0xf9, 0x74, 0x4b, 0xbb, 0x0e, 0xba, 0x07, 0xdc, 0x57, 0x44, 0xc8, 0x0d,
+  0x2d, 0xb9, 0xbf, 0x1a, 0x21, 0x70, 0xc7, 0xbb, 0x68, 0x4f, 0x5e, 0x31,
+  0xeb, 0xec, 0x7e, 0xea, 0x92, 0x89, 0xa6, 0xa4, 0xd2, 0xa1, 0x29, 0xd3,
+  0x2e, 0x6b, 0x77, 0x20, 0xc1, 0xaa, 0x42, 0x72, 0x0c, 0xcf, 0x92, 0x09,
+  0xa9, 0x86, 0x54, 0xea, 0xdb, 0xa5, 0x5f, 0x52, 0xa4, 0xd9, 0x24, 0x13,
+  0x86, 0xe1, 0xe2, 0xe8, 0x98, 0xa8, 0x0a, 0xd3, 0xd1, 0xb6, 0x0d, 0xbc,
+  0xe4, 0x1a, 0x6c, 0x2c, 0xf6, 0x25, 0x93, 0x7a, 0xf3, 0xd9, 0x23, 0x85,
+  0x21, 0xd3, 0x07, 0xbe, 0xdb, 0x3f, 0x27, 0x45, 0xee, 0xa7, 0x3d, 0x90,
+  0xf2, 0xa0, 0x20, 0x7f, 0xa0, 0x72, 0x1f, 0x29, 0x0a, 0x91, 0xfd, 0x21,
+  0x7e, 0xd5, 0xbb, 0x73, 0x7f, 0xa6, 0x96, 0xd8, 0x0c, 0xda, 0xcd, 0x4a,
+  0x85, 0xa0, 0xd0, 0x10, 0xa0, 0x66, 0xaa, 0xc1, 0x6a, 0x87, 0x07, 0xcc,
+  0xb0, 0x36, 0xf9, 0x91, 0xcb, 0x9a, 0x3d, 0x13, 0x93, 0xd4, 0xbf, 0x31,
+  0x9a, 0x32, 0x36, 0x2b, 0xdb, 0x84, 0xd7, 0xb0, 0xfd, 0x9c, 0x05, 0x22,
+  0x14, 0x7d, 0xce, 0xe7, 0xe9, 0xbd, 0x28, 0x7a, 0x93, 0x64, 0x8f, 0xca,
+  0xd3, 0x6d, 0x42, 0x21, 0xc1, 0x09, 0xdd, 0xb1, 0x4f, 0xdc, 0x22, 0x5e,
+  0x50, 0xea, 0x29, 0xdc, 0x45, 0x33, 0x45, 0x7f, 0x4a, 0xf5, 0x39, 0x87,
+  0x38, 0xd7, 0x6b, 0xb3, 0x0d, 0xc4, 0xb4, 0xea, 0x7b, 0xb1, 0x4e, 0xa0,
+  0x35, 0x1a, 0x6a, 0xa7, 0xef, 0xe9, 0x88, 0x2b, 0xb7, 0x61, 0x83, 0xe2,
+  0x9a, 0x64, 0xd2, 0x95, 0xcb, 0xe1, 0xdf, 0xb8, 0xfb, 0x41, 0x84, 0xae,
+  0x85, 0x42, 0xb6, 0x41, 0x12, 0x50, 0xe1, 0x54, 0xe1, 0x01, 0x0e, 0x5b,
+  0x01, 0x77, 0xc8, 0x42, 0xc3, 0x51, 0x12, 0x80, 0xb6, 0x1d, 0xa8, 0x93,
+  0x18, 0x4d, 0x29, 0x58, 0x2f, 0x9a, 0xb4, 0xa8, 0x0c, 0x7a, 0x7f, 0x7a,
+  0x13, 0xe4, 0xa9, 0x9c, 0xd7, 0xd8, 0x10, 0xbe, 0xbc, 0x97, 0x9c, 0x4b,
+  0x6b, 0x32, 0xbb, 0xf1, 0xf1, 0xd6, 0xb1, 0x94, 0x53, 0x97, 0xdd, 0x3f,
+  0xe3, 0x1f, 0xfe, 0x1a, 0x6a, 0x24, 0x8b, 0xdb, 0xac, 0x8c, 0x04, 0x1f,
+  0x27, 0xb6, 0x44, 0xaf, 0xb7, 0x7d, 0xe0, 0xb5, 0x15, 0x03, 0xab, 0xc7,
+  0x26, 0x2e, 0xf6, 0x9c, 0x0f, 0x7c, 0xc8, 0x14, 0xe4, 0x51, 0xa9, 0x7b,
+  0x61, 0xba, 0x4e, 0x48, 0xe5, 0x4c, 0xdd, 0x10, 0x42, 0x6c, 0xa0, 0x85,
+  0x74, 0xa4, 0x89, 0x27, 0x98, 0xf4, 0x5e, 0x24, 0x16, 0x24, 0x1b, 0x4f,
+  0x92, 0x21, 0xc0, 0x04, 0x75, 0x5f, 0x73, 0xb0, 0x17, 0x79, 0xc5, 0xf8,
+  0xff, 0x98, 0x25, 0x8f, 0x9a, 0x4e, 0x81, 0x3e, 0x42, 0x67, 0x93, 0x55,
+  0x49, 0xc6, 0xd1, 0xcc, 0xe1, 0x73, 0xc2, 0x01, 0x46, 0x0b, 0x25, 0x7f,
+  0x91, 0x23, 0xaf, 0x0e, 0x07, 0x93, 0xcf, 0x71, 0xa2, 0x23, 0xb9, 0x9c,
+  0x6c, 0x70, 0x2f, 0xbe, 0xcb, 0x53, 0xcc, 0x96, 0x33, 0x3c, 0x99, 0xd4,
+  0x37, 0x4b, 0x25, 0xd7, 0xe1, 0x0e, 0x36, 0x36, 0xc5, 0x4c, 0xec, 0x2b,
+  0xf4, 0x64, 0x52, 0x06, 0x20, 0xb9, 0x3c, 0x9c, 0x8a, 0x48, 0xbe, 0xdd,
+  0x3a, 0x1c, 0xe5, 0x21, 0x51, 0xb8, 0x3a, 0xc3, 0x30, 0x53, 0xc6, 0xb1,
+  0x2b, 0x31, 0x3e, 0x95, 0xdd, 0xe2, 0x0c, 0xd1, 0x4c, 0xc3, 0x3c, 0x8c,
+  0x18, 0xa5, 0x92, 0x56, 0x7c, 0x36, 0x40, 0xfe, 0x5d, 0xd7, 0x92, 0xa3,
+  0x0b, 0x98, 0x74, 0x69, 0xab, 0xe6, 0xf6, 0x9f, 0x90, 0x11, 0x0f, 0x8f,
+  0x9a, 0xa0, 0xb9, 0x52, 0x05, 0x5b, 0x10, 0xda, 0x01, 0x6c, 0x74, 0x5a,
+  0xd1, 0x81, 0x35, 0x12, 0xc4, 0x35, 0x6f, 0x5a, 0xfc, 0x35, 0xf3, 0xf9,
+  0xd2, 0x6f, 0x2a, 0x2a, 0xd1, 0x3a, 0x41, 0x2f, 0xa8, 0x6c, 0xb7, 0x38,
+  0x52, 0x80, 0xc4, 0x51, 0xc3, 0x8d, 0x4f, 0x9c, 0x5e, 0x30, 0x98, 0x87,
+  0x8f, 0xf1, 0xbb, 0xb0, 0x1f, 0x71, 0xd3, 0xa0, 0x5d, 0x01, 0xc1, 0x64,
+  0xe3, 0x1e, 0x30, 0x81, 0xc5, 0x0a, 0x3f, 0x9c, 0x75, 0x55, 0xd5, 0x32,
+  0xcb, 0x5d, 0x78, 0x1d, 0xfe, 0x09, 0x27, 0xb0, 0xca, 0xde, 0xf9, 0x95,
+  0x19, 0xa0, 0x69, 0xec, 0x86, 0x76, 0x32, 0x94, 0x21, 0xdb, 0x94, 0xb3,
+  0xb8, 0xa8, 0xd6, 0x6e, 0x28, 0xbc, 0x83, 0xb4, 0x81, 0xba, 0x61, 0x6d,
+  0xe9, 0x84, 0xbc, 0x77, 0xb2, 0x6d, 0x1f, 0xb8, 0xe6, 0x94, 0x46, 0x24,
+  0x28, 0x81, 0x4c, 0x6a, 0x12, 0x9c, 0x2f, 0xb1, 0x29, 0xe7, 0xed, 0x23,
+  0xe1, 0xcf, 0x49, 0x63, 0x0d, 0x79, 0x92, 0xc2, 0x41, 0x2e, 0xb7, 0x0b,
+  0x9f, 0x76, 0xc0, 0x17, 0x44, 0x7c, 0x92, 0x3e, 0x84, 0x13, 0x4b, 0x57,
+  0x22, 0xbb, 0xb4, 0x1c, 0x46, 0x08, 0xd4, 0x68, 0xdc, 0x48, 0xf7, 0xd6,
+  0x9f, 0x8f, 0x62, 0x0c, 0xdc, 0x86, 0x93, 0x4c, 0x07, 0x72, 0xdf, 0x7a,
+  0xfa, 0x14, 0xf2, 0x69, 0xcd, 0xf0, 0x75, 0x9c, 0x83, 0xdc, 0x9c, 0xed,
+  0x61, 0x45, 0x2a, 0x97, 0xf3, 0x39, 0x8a, 0xd7, 0x4b, 0xce, 0x96, 0x8e,
+  0x6b, 0xff, 0xe9, 0xfe, 0xf6, 0xa1, 0x1b, 0x62, 0xd2, 0x78, 0x56, 0xed,
+  0x5e, 0x96, 0xfa, 0x67, 0x0e, 0xe1, 0x46, 0xaf, 0x5a, 0x14, 0x3d, 0xf4,
+  0x6b, 0x16, 0xe5, 0xad, 0x8a, 0x96, 0x41, 0xfb, 0xed, 0x9d, 0x09, 0x7f,
+  0x66, 0x45, 0xac, 0xaa, 0x65, 0x09, 0x30, 0xe2, 0x8a, 0xf6, 0xdc, 0xce,
+  0x32, 0xcc, 0x83, 0xbf, 0x74, 0x25, 0x4f, 0x6f, 0x23, 0x91, 0x06, 0xfe,
+  0xf7, 0xaf, 0x07, 0xe4, 0x06, 0x1c, 0xff, 0xd4, 0x3a, 0x8f, 0x93, 0xae,
+  0xcc, 0xe5, 0x13, 0x4c, 0x23, 0x5d, 0xdc, 0xa0, 0x6e, 0x79, 0x18, 0x2a,
+  0x69, 0x73, 0x36, 0x42, 0x1e, 0xfb, 0xed, 0xbf, 0x5f, 0xcc, 0x2c, 0xf0,
+  0xd7, 0x8a, 0xef, 0xcb, 0x63, 0xbf, 0xf9, 0xf7, 0xf9, 0xee, 0x3e, 0xe9,
+  0xf6, 0x21, 0x46, 0xf5, 0x46, 0xea, 0x06, 0x02, 0x3c, 0xf1, 0x57, 0x33,
+  0x45, 0xa9, 0x45, 0xf0, 0xb9, 0xa2, 0x7c, 0x2c, 0xd8, 0x9d, 0x46, 0xd8,
+  0x22, 0x71, 0xc5, 0xdf, 0x84, 0x83, 0x11, 0x6b, 0xf6, 0x37, 0x47, 0xda,
+  0x45, 0x1d, 0xf2, 0x9f, 0x9b, 0x5f, 0x85, 0xce, 0x48, 0xcb, 0xbb, 0x50,
+  0x0a, 0x6a, 0x7f, 0x29, 0x6a, 0x58, 0xc4, 0x70, 0x2a, 0xa2, 0xf1, 0x9a,
+  0x66, 0x3b, 0xb8, 0x59, 0xa6, 0x2f, 0x19, 0xbe, 0x1a, 0xea, 0x6a, 0x25,
+  0x3b, 0xa4, 0xe9, 0xd9, 0x1a, 0xa6, 0xb0, 0x39, 0x43, 0xa8, 0x78, 0x24,
+  0xce, 0x17, 0xcb, 0xb6, 0x06, 0x85, 0xcd, 0xd6, 0xc0, 0x16, 0xd8, 0xf9,
+  0x5d, 0x57, 0x9a, 0x4a, 0xc1, 0x68, 0x48, 0x55, 0x92, 0x9b, 0x2c, 0xc1,
+  0x0f, 0x39, 0x4e, 0x1f, 0xfe, 0x8a, 0xf1, 0xe7, 0xb8, 0x64, 0x86, 0x2b,
+  0xaf, 0x61, 0x85, 0xc7, 0x17, 0xe7, 0xe7, 0x27, 0xc7, 0xcd, 0x60, 0xa1,
+  0x69, 0xc2, 0x6b, 0x55, 0x7d, 0xaf, 0xa7, 0x29, 0x7d, 0x9e, 0xfa, 0x55,
+  0x48, 0xb4, 0x88, 0xbf, 0x4f, 0xed, 0xce, 0x62, 0x81, 0xae, 0xe6, 0x5f,
+  0x4a, 0x3b, 0x10, 0x86, 0x35, 0x16, 0x0a, 0x08, 0x54, 0x51, 0x7a, 0xf4,
+  0xe0, 0x42, 0x6a, 0x90, 0x33, 0x0d, 0xb1, 0x74, 0xb4, 0xf4, 0x9b, 0x4c,
+  0x58, 0x99, 0x05, 0x55, 0x32, 0x8c, 0xc7, 0x9b, 0x52, 0x28, 0xa0, 0xdf,
+  0x6e, 0xa3, 0x65, 0x46, 0x42, 0xc4, 0x62, 0xac, 0x5e, 0x3e, 0xe1, 0xf6,
+  0xca, 0xf3, 0xb8, 0xb8, 0xc5, 0x70, 0xb6, 0x53, 0x96, 0x45, 0x85, 0xb9,
+  0x04, 0xca, 0x3e, 0x1e, 0x87, 0xb0, 0x3a, 0xc8, 0xeb, 0xee, 0x56, 0xa1,
+  0xc8, 0x64, 0xa4, 0x25, 0xe9, 0x81, 0xd6, 0xcb, 0xe2, 0xeb, 0x59, 0x72,
+  0x8f, 0x9f, 0x61, 0x80, 0x22, 0x04, 0xdc, 0xf0, 0x7b, 0x9c, 0x30, 0xae,
+  0x3e, 0x47, 0x15, 0x1e, 0x05, 0xeb, 0x03, 0x8f, 0x6a, 0xce, 0x5d, 0x44,
+  0x08, 0xa8, 0x1c, 0xdb, 0xf2, 0x71, 0xad, 0x95, 0xb7, 0x57, 0xef, 0x04,
+  0x6c, 0xb4, 0x11, 0x50, 0xf3, 0xf2, 0x90, 0xa5, 0x10, 0xcd, 0x00, 0x90,
+  0x52, 0x31, 0x46, 0x1b, 0x5e, 0x13, 0xef, 0x34, 0x1d, 0x03, 0x5a, 0x2b,
+  0x65, 0x6d, 0x08, 0x3d, 0xdd, 0xb8, 0x25, 0xf2, 0x37, 0xc0, 0xe6, 0x01,
+  0x74, 0x57, 0xf0, 0x13, 0xc0, 0xc4, 0xf6, 0x9b, 0x40, 0xd8, 0x84, 0x11,
+  0x47, 0x4e, 0x52, 0x04, 0x87, 0x9c, 0x52, 0x55, 0x09, 0x3e, 0x4c, 0x97,
+  0xd5, 0x53, 0x73, 0x91, 0xa1, 0x52, 0xc1, 0x65, 0x57, 0xac, 0x02, 0x8a,
+  0x61, 0xc2, 0xee, 0xe2, 0x39, 0xc8, 0xde, 0x2b, 0xd8, 0x13, 0x47, 0x21,
+  0xe4, 0x02, 0xc3, 0x9f, 0x8b, 0x65, 0xe5, 0x05, 0x12, 0x11, 0xf6, 0x8e,
+  0x11, 0x4f, 0xbe, 0xea, 0xf9, 0x2d, 0xe2, 0xe2, 0xb1, 0x7b, 0xa6, 0xc4,
+  0xc0, 0xc9, 0xec, 0x2f, 0xab, 0x71, 0xfa, 0x14, 0x2c, 0xa9, 0xd6, 0x2b,
+  0x85, 0xac, 0x1a, 0xda, 0x31, 0x4b, 0xaa, 0x9b, 0xe4, 0x57, 0x68, 0xd2,
+  0x82, 0x79, 0x45, 0x59, 0xc4, 0x2a, 0x74, 0x23, 0x42, 0x0f, 0x68, 0x70,
+  0x3f, 0xb0, 0x72, 0xd0, 0xb1, 0x95, 0xb4, 0x09, 0xa5, 0x5b, 0xee, 0x5a,
+  0xc7, 0x0f, 0xfd, 0xf6, 0x92, 0xe9, 0x36, 0x79, 0x7c, 0x96, 0x8e, 0x62,
+  0x9e, 0xfb, 0x14, 0x33, 0x88, 0x0e, 0xe1, 0x3f, 0x2b, 0xbf, 0xfd, 0xfc,
+  0xcf, 0x7a, 0x18, 0xa0, 0xcf, 0x93, 0xba, 0x16, 0xdf, 0xd6, 0x02, 0xdc,
+  0x7a, 0x6d, 0x91, 0xee, 0xfd, 0xf2, 0xc8, 0x9a, 0x44, 0x5e, 0x29, 0x83,
+  0x6d, 0x7d, 0xa0, 0x2b, 0x86, 0x03, 0x01, 0xfb, 0x10, 0xd6, 0xae, 0x84,
+  0xa0, 0x9e, 0x27, 0x92, 0x9f, 0x14, 0xc1, 0xb5, 0xf2, 0xea, 0x66, 0x9e,
+  0x95, 0xa9, 0xae, 0x7c, 0xe6, 0xc6, 0x05, 0x6a, 0x8d, 0xa3, 0x7f, 0x51,
+  0x5d, 0xa1, 0x92, 0xce, 0x9a, 0xb2, 0x42, 0x5f, 0xa9, 0x6d, 0xc2, 0x73,
+  0xa4, 0x92, 0xb7, 0x25, 0xcd, 0x1a, 0xcd, 0xda, 0x46, 0xf9, 0xbb, 0xb0,
+  0x2a, 0xeb, 0xdd, 0x92, 0x27, 0x3d, 0xf5, 0x9b, 0x5f, 0x8b, 0xe7, 0xa7,
+  0x6c, 0xd7, 0x0f, 0x66, 0x65, 0xbe, 0x36, 0xe7, 0x03, 0x73, 0x96, 0x75,
+  0x7b, 0xca, 0x76, 0x33, 0x67, 0xdb, 0xf1, 0x4a, 0x04, 0x92, 0xb6, 0x69,
+  0xb4, 0xff, 0x0b, 0x53, 0xb6, 0xdd, 0x8c, 0xed, 0x98, 0xf2, 0xb5, 0x03,
+  0xe9, 0xda, 0xb2, 0xd1, 0x92, 0xaf, 0xc9, 0x19, 0xdb, 0x2b, 0x53, 0xb6,
+  0xdd, 0x9c, 0xed, 0x55, 0x49, 0xdb, 0x04, 0x16, 0xb0, 0x22, 0x65, 0xfb,
+  0xd7, 0x65, 0x6c, 0xb7, 0xa5, 0x6c, 0xff, 0xf2, 0x9c, 0xed, 0xdf, 0x36,
+  0x65, 0xfb, 0xb7, 0xcc, 0x46, 0xa6, 0xdb, 0x83, 0x27, 0x92, 0x8e, 0xa4,
+  0xe8, 0xec, 0xb0, 0x15, 0xea, 0x59, 0x2b, 0x31, 0x6b, 0x09, 0x2c, 0x4e,
+  0x98, 0x59, 0x86, 0x61, 0x8d, 0xc6, 0x51, 0xdc, 0xfd, 0xba, 0x21, 0xa1,
+  0x95, 0x40, 0x06, 0x9c, 0x1b, 0x07, 0xde, 0x0d, 0xdd, 0xf4, 0xb2, 0x9c,
+  0xf5, 0x68, 0x06, 0x58, 0x0b, 0xee, 0x59, 0x89, 0x96, 0xcf, 0x34, 0x9e,
+  0xfb, 0xed, 0x59, 0x4e, 0x35, 0x2b, 0xb7, 0x77, 0xad, 0xad, 0x2e, 0x7f,
+  0x59, 0x62, 0x9d, 0x72, 0xc8, 0x6e, 0x97, 0x82, 0x91, 0x81, 0x70, 0x19,
+  0xc5, 0x9e, 0xe1, 0xd7, 0xc8, 0x4b, 0x9a, 0x98, 0x5e, 0x97, 0x26, 0x24,
+  0x61, 0x5a, 0x57, 0x7b, 0xc5, 0x30, 0x04, 0x4b, 0xe0, 0xae, 0x83, 0x64,
+  0x08, 0x96, 0xbd, 0x28, 0xd3, 0x2e, 0xe9, 0x16, 0x6e, 0xf7, 0x77, 0xb9,
+  0x72, 0x5d, 0x43, 0x3a, 0x32, 0x4f, 0x0f, 0x29, 0x8c, 0xbe, 0xcf, 0x40,
+  0xed, 0x36, 0x07, 0x8d, 0x7b, 0xc9, 0xe9, 0x3b, 0xfd, 0xe8, 0x0a, 0xd5,
+  0x47, 0x50, 0xd6, 0x61, 0x46, 0x32, 0xb8, 0xfc, 0x2e, 0x34, 0x5c, 0x1d,
+  0x1c, 0x18, 0xe8, 0xe7, 0xc3, 0xd5, 0x99, 0x1f, 0x9f, 0xa6, 0xe8, 0xc1,
+  0xc1, 0xe6, 0x26, 0x65, 0x48, 0xdd, 0xc4, 0x0f, 0x0f, 0xfd, 0x32, 0xd9,
+  0x1c, 0xe7, 0xa3, 0x72, 0x13, 0x4f, 0x50, 0xbf, 0x7c, 0x53, 0xcd, 0x67,
+  0xab, 0xb2, 0x1e, 0xd2, 0x52, 0x8b, 0xa5, 0x15, 0x0a, 0xd9, 0x66, 0x5e,
+  0xb2, 0xb5, 0x95, 0xba, 0x2d, 0x00, 0x88, 0xef, 0x7b, 0xc8, 0x61, 0x54,
+  0x55, 0x00, 0x8b, 0x82, 0xff, 0xa3, 0x5e, 0x38, 0x18, 0x54, 0x0a, 0x14,
+  0x94, 0xbb, 0xfd, 0x82, 0x9d, 0x1a, 0x02, 0xff, 0x80, 0xd8, 0x0e, 0x40,
+  0xa8, 0xdf, 0xa4, 0x22, 0x16, 0x56, 0xdf, 0x33, 0xdd, 0xf4, 0x5a, 0xa3,
+  0x5e, 0x43, 0x5e, 0x7e, 0x3b, 0x3d, 0xa2, 0xb3, 0x96, 0xde, 0xbd, 0xbf,
+  0x39, 0x4b, 0x00, 0xea, 0x46, 0x29, 0xff, 0x1c, 0x65, 0xd7, 0x7d, 0xf4,
+  0x53, 0xdc, 0x32, 0x93, 0x90, 0x77, 0xc8, 0xd9, 0x76, 0x2b, 0x67, 0x62,
+  0x1e, 0xfe, 0x14, 0x33, 0x21, 0xfc, 0x84, 0x20, 0x7f, 0xac, 0xcd, 0x81,
+  0x1e, 0xfb, 0x14, 0xdf, 0xbf, 0xdb, 0x6e, 0xfb, 0x2c, 0x35, 0xe7, 0xa5,
+  0x27, 0x7e, 0xc3, 0x0f, 0x7f, 0x30, 0xce, 0x2a, 0xc6, 0x9a, 0x38, 0xc4,
+  0xff, 0x1e, 0xe8, 0x0e, 0xaf, 0xec, 0xfa, 0xd7, 0xd2, 0x52, 0x41, 0xf8,
+  0x9b, 0x95, 0x0d, 0xab, 0xc1, 0x5c, 0x42, 0x64, 0x8e, 0xf7, 0x8a, 0x91,
+  0xba, 0x04, 0x6c, 0x9d, 0x7a, 0x60, 0xf4, 0x14, 0xa9, 0x91, 0x91, 0x6d,
+  0x18, 0x6c, 0x08, 0x3f, 0x3d, 0xce, 0x15, 0xfc, 0x0a, 0x0c, 0x85, 0xb0,
+  0x18, 0x4a, 0x28, 0xd8, 0x1f, 0x40, 0xfa, 0x61, 0x43, 0xdc, 0x5c, 0x64,
+  0xb7, 0x1d, 0x53, 0x99, 0xcc, 0xfc, 0xb4, 0x96, 0xa7, 0x7a, 0x49, 0x10,
+  0xcf, 0x76, 0x21, 0xa2, 0x86, 0xc6, 0x8f, 0x46, 0x7c, 0xa5, 0xc9, 0x44,
+  0x15, 0x67, 0x78, 0x66, 0x41, 0x45, 0xcc, 0x15, 0x3f, 0x88, 0x3a, 0xbd,
+  0x0f, 0xd1, 0x41, 0xc7, 0xdb, 0xa2, 0x8b, 0x4c, 0x7a, 0xf1, 0x90, 0xc7,
+  0xab, 0x20, 0x80, 0x02, 0x6a, 0xef, 0xe5, 0x6a, 0x26, 0x37, 0x08, 0x24,
+  0x65, 0xcd, 0x09, 0xd3, 0xc7, 0x62, 0xea, 0x05, 0xe1, 0xe6, 0xda, 0xb7,
+  0xd5, 0xf4, 0x9d, 0x42, 0x41, 0x82, 0x4e, 0x1b, 0x0b, 0x4a, 0x4f, 0xda,
+  0x13, 0xf7, 0xd4, 0x40, 0xd6, 0x8a, 0xc1, 0x44, 0x0c, 0x66, 0x62, 0x35,
+  0xbe, 0x0f, 0x02, 0x29, 0x3d, 0xdb, 0xa5, 0x94, 0x6e, 0x91, 0x97, 0x65,
+  0x3a, 0x04, 0x4e, 0x3d, 0x15, 0x16, 0x59, 0x26, 0x9c, 0x4f, 0xc5, 0xa5,
+  0xd7, 0xb8, 0x9b, 0x35, 0x58, 0x86, 0xe6, 0x16, 0xd1, 0x4a, 0x05, 0x0d,
+  0x42, 0x9c, 0x4b, 0x30, 0x3b, 0x66, 0x6c, 0x77, 0x29, 0x0e, 0xcd, 0xd4,
+  0x16, 0x47, 0xc3, 0x22, 0x4d, 0x26, 0x98, 0xea, 0x48, 0x2b, 0x12, 0xc5,
+  0xab, 0xc9, 0x64, 0x67, 0x88, 0x98, 0x82, 0x49, 0x3a, 0x98, 0x69, 0x5b,
+  0x22, 0x18, 0x28, 0xa5, 0x5f, 0x53, 0xee, 0xa3, 0xcd, 0xed, 0x2e, 0x12,
+  0xcc, 0x1c, 0xb8, 0x4b, 0xe4, 0x58, 0x63, 0xed, 0x89, 0xd4, 0x92, 0x93,
+  0x5a, 0x18, 0xcc, 0x74, 0xaa, 0x76, 0x20, 0xa8, 0x26, 0x83, 0x1b, 0x83,
+  0x5f, 0xa4, 0x1e, 0x9b, 0x9a, 0xbe, 0x6b, 0x21, 0x15, 0xfa, 0x9f, 0x8c,
+  0xc7, 0x3b, 0x5e, 0xe8, 0x5f, 0x50, 0x07, 0x50, 0x6f, 0xc1, 0xb6, 0x2a,
+  0x2b, 0xde, 0xc9, 0x8c, 0x16, 0x13, 0xe8, 0xa9, 0x74, 0xf8, 0x09, 0x36,
+  0x2b, 0x88, 0xce, 0x9b, 0x5a, 0x4e, 0x20, 0xb1, 0x1c, 0x13, 0xe8, 0x38,
+  0x5f, 0xcd, 0xac, 0xae, 0x22, 0xd4, 0x07, 0x2a, 0xe5, 0x77, 0x03, 0xc3,
+  0x1f, 0x3c, 0x11, 0x6f, 0xd3, 0xe5, 0xdb, 0x13, 0xe4, 0x9d, 0xfc, 0x78,
+  0x2a, 0x08, 0x61, 0x1f, 0x79, 0x8c, 0x33, 0xf0, 0x65, 0x32, 0x62, 0xbb,
+  0x73, 0x6e, 0xbc, 0xa6, 0xc6, 0xbb, 0x99, 0xf1, 0xa0, 0xf3, 0x39, 0xb1,
+  0x7a, 0x8b, 0xc6, 0x8a, 0x0e, 0xd6, 0x70, 0x94, 0x98, 0x6e, 0x28, 0xf5,
+  0xe5, 0x78, 0xe9, 0x75, 0xd7, 0x74, 0x79, 0xb9, 0x0e, 0x75, 0x97, 0xc6,
+  0x46, 0x81, 0xb2, 0x1f, 0xe2, 0xfd, 0x14, 0x58, 0xee, 0xb8, 0xb5, 0x36,
+  0x04, 0xb9, 0x3d, 0xe3, 0x20, 0x05, 0x2a, 0x3b, 0xcf, 0x07, 0x03, 0x3f,
+  0x45, 0x3e, 0x03, 0xe3, 0x24, 0x9f, 0x66, 0xe9, 0xcf, 0x84, 0x19, 0x84,
+  0x41, 0xcb, 0x66, 0x7a, 0x6b, 0xad, 0x48, 0x21, 0x72, 0x02, 0xf2, 0x98,
+  0x28, 0xe1, 0xf3, 0x37, 0x4a, 0xa2, 0x23, 0xa9, 0x83, 0xe9, 0x60, 0x08,
+  0x2c, 0x66, 0x32, 0x01, 0x31, 0xc8, 0xc0, 0x8d, 0xad, 0xc4, 0x16, 0x33,
+  0xb9, 0xb3, 0xfc, 0x61, 0xef, 0x70, 0x95, 0x2a, 0x04, 0x13, 0x28, 0x88,
+  0xf4, 0xc5, 0x23, 0xfd, 0xe2, 0xa2, 0x02, 0x6a, 0x58, 0xf9, 0xcb, 0x4b,
+  0x0a, 0xc2, 0xb0, 0x58, 0xc9, 0x03, 0x33, 0xd0, 0x9a, 0x24, 0x70, 0x60,
+  0x75, 0x24, 0x27, 0xbb, 0x4c, 0x42, 0xe2, 0x45, 0xf7, 0x98, 0x05, 0xe9,
+  0xb3, 0xe0, 0x07, 0x55, 0xf9, 0x8c, 0xfd, 0xbb, 0xd5, 0x44, 0x1e, 0x34,
+  0x81, 0x8e, 0x67, 0x40, 0x0e, 0xa2, 0x1b, 0x5f, 0xc1, 0xfe, 0xc5, 0x9f,
+  0x4e, 0x2d, 0x70, 0x18, 0x7f, 0x21, 0x61, 0x9c, 0x40, 0x53, 0x09, 0x24,
+  0x36, 0x0a, 0x5e, 0xd8, 0x60, 0x73, 0x56, 0x84, 0x63, 0x20, 0xdd, 0x9d,
+  0xdc, 0xcb, 0x52, 0x0d, 0x26, 0xad, 0xd8, 0x71, 0x80, 0x3e, 0x02, 0xe3,
+  0x61, 0x5d, 0x95, 0xba, 0xee, 0xe1, 0xd7, 0x58, 0xa9, 0xa5, 0x54, 0xd1,
+  0x24, 0x2d, 0xdb, 0x78, 0xc1, 0x4c, 0x91, 0x53, 0x44, 0xc4, 0xc7, 0x6f,
+  0x1a, 0x0a, 0xd6, 0xa5, 0x18, 0x23, 0xc3, 0x7a, 0xa4, 0x25, 0x78, 0x41,
+  0xa4, 0x05, 0x2c, 0xc1, 0x26, 0x43, 0x40, 0x66, 0x2e, 0x2b, 0x32, 0xb4,
+  0xd2, 0x45, 0xee, 0xc3, 0x2c, 0x57, 0x3c, 0x75, 0xbd, 0x85, 0x72, 0xd9,
+  0xe6, 0x62, 0x1f, 0x65, 0x90, 0x16, 0x5d, 0xfe, 0x13, 0x54, 0xa2, 0xfc,
+  0xaa, 0x52, 0x94, 0x4f, 0x5b, 0x89, 0x62, 0x25, 0x05, 0x4a, 0x1d, 0x5f,
+  0x4e, 0x50, 0x94, 0x10, 0x5d, 0x32, 0x9c, 0x06, 0x75, 0x1f, 0x9b, 0x8e,
+  0x40, 0xfc, 0x5a, 0x63, 0xb8, 0xf0, 0x65, 0xea, 0x46, 0xb5, 0x2c, 0xd9,
+  0xc4, 0xe3, 0x91, 0xeb, 0xc2, 0x35, 0x36, 0x5a, 0xe0, 0x97, 0x12, 0x2c,
+  0x19, 0x1f, 0x27, 0x02, 0x9d, 0xf6, 0x67, 0xdb, 0x91, 0xe7, 0x53, 0x1b,
+  0x60, 0xdb, 0xc0, 0x9b, 0x0f, 0x1d, 0x79, 0xfc, 0xe5, 0x93, 0x02, 0x99,
+  0xee, 0x19, 0xbe, 0x66, 0x91, 0x49, 0x1d, 0x7e, 0x67, 0x31, 0xca, 0xca,
+  0x10, 0x9c, 0xaa, 0x19, 0x46, 0x98, 0x9d, 0x61, 0x6f, 0x98, 0x19, 0x87,
+  0xef, 0xb7, 0x30, 0xb8, 0x44, 0xe3, 0xae, 0x6a, 0x12, 0x03, 0x47, 0x1f,
+  0x26, 0xd5, 0x3d, 0x6a, 0x71, 0xb4, 0x1f, 0xba, 0x91, 0x0e, 0x17, 0x90,
+  0x2d, 0x6a, 0xcd, 0x77, 0xe9, 0x72, 0x1a, 0x1c, 0x32, 0x14, 0xc6, 0x57,
+  0x36, 0x7e, 0x11, 0x8d, 0xe9, 0x7a, 0xb7, 0x2f, 0xd8, 0x62, 0xcb, 0x86,
+  0xa8, 0x6b, 0x7b, 0xa3, 0xb9, 0xb8, 0xb5, 0x8a, 0x21, 0x4d, 0x5b, 0x92,
+  0x07, 0x5d, 0x1f, 0xbf, 0xb9, 0xc6, 0x72, 0x6d, 0x83, 0x80, 0x15, 0x18,
+  0x18, 0xa3, 0x77, 0x65, 0x3e, 0x7a, 0xfe, 0x8e, 0xaa, 0x15, 0xc0, 0x4e,
+  0xc2, 0xb8, 0x5c, 0x28, 0x34, 0xdc, 0xc6, 0x64, 0xd8, 0x93, 0x23, 0xbf,
+  0x8d, 0x17, 0xf0, 0x33, 0x0c, 0x09, 0x12, 0xd4, 0x2f, 0xf7, 0x83, 0xf4,
+  0xf2, 0x12, 0x88, 0x00, 0xdc, 0x89, 0x35, 0xc2, 0xe2, 0x74, 0x3e, 0x7e,
+  0x03, 0x0b, 0x31, 0xce, 0x42, 0x6d, 0x87, 0x4a, 0x41, 0xd4, 0x52, 0xef,
+  0x94, 0x06, 0xc9, 0x25, 0xd8, 0xe2, 0x0a, 0x57, 0x41, 0x8d, 0xcc, 0xf8,
+  0x00, 0x2b, 0x1f, 0x12, 0xbe, 0xb6, 0xc8, 0xbc, 0x1f, 0x68, 0x3e, 0x4a,
+  0x9a, 0x0e, 0x55, 0x64, 0x79, 0xf3, 0x97, 0x2c, 0x3e, 0x6d, 0x46, 0x69,
+  0x5d, 0x3d, 0xa6, 0xb7, 0xb4, 0xdf, 0x63, 0x18, 0x41, 0xb9, 0xf4, 0x05,
+  0x81, 0xa6, 0x96, 0xf1, 0x4d, 0xcb, 0xde, 0xb6, 0xc8, 0x64, 0x28, 0x87,
+  0xa3, 0x76, 0x6b, 0x25, 0xf6, 0x10, 0x88, 0xcd, 0xad, 0x0f, 0xb0, 0x2e,
+  0x62, 0x70, 0x7c, 0xb9, 0x11, 0x5d, 0x36, 0x90, 0x60, 0xa8, 0x28, 0x09,
+  0x85, 0xa9, 0xcb, 0x87, 0xa5, 0x45, 0x22, 0x23, 0x8f, 0xb6, 0xa3, 0x86,
+  0x28, 0xde, 0xb3, 0xc1, 0xd8, 0xa5, 0xd0, 0xef, 0x6f, 0xce, 0x98, 0x1a,
+  0x6b, 0x39, 0xa2, 0x22, 0x0d, 0x06, 0x05, 0x11, 0x93, 0xd2, 0xbd, 0xa6,
+  0x60, 0x41, 0xe7, 0x58, 0x6a, 0xc7, 0x4d, 0xc9, 0xc4, 0x29, 0xaf, 0xf8,
+  0x27, 0x33, 0x2f, 0xd5, 0x91, 0x36, 0x42, 0xb3, 0xce, 0x1d, 0xf4, 0x23,
+  0xe9, 0x0e, 0x5a, 0xb2, 0x54, 0x6a, 0x74, 0xef, 0x20, 0x1e, 0x36, 0x4d,
+  0xb2, 0x24, 0x84, 0x10, 0xf6, 0x48, 0x82, 0x5c, 0x48, 0x7a, 0xdc, 0x6f,
+  0xa2, 0x9a, 0x3b, 0x41, 0x03, 0x99, 0x5c, 0x9a, 0xdb, 0x0e, 0x06, 0x2d,
+  0xc8, 0xa7, 0xac, 0xe3, 0x61, 0x73, 0x50, 0xe4, 0x88, 0x88, 0x8f, 0x4f,
+  0x26, 0xc1, 0x28, 0x5f, 0x3c, 0xe2, 0x66, 0xc0, 0x63, 0x65, 0x79, 0xb3,
+  0x03, 0x7c, 0x63, 0xa7, 0xff, 0x39, 0xa3, 0x65, 0xdf, 0x80, 0xb0, 0x0e,
+  0xc0, 0x24, 0x73, 0xfa, 0x88, 0xb4, 0x11, 0x6e, 0x8c, 0x27, 0x5a, 0x78,
+  0xdf, 0x2a, 0xfe, 0xbd, 0xff, 0x44, 0x4a, 0xfb, 0xfb, 0xd2, 0x8f, 0xdf,
+  0xad, 0x23, 0x41, 0x45, 0x48, 0x56, 0x1b, 0xdc, 0xf4, 0x92, 0x33, 0x0d,
+  0x86, 0x69, 0x45, 0xcd, 0x26, 0xd4, 0x8a, 0xac, 0x5f, 0x4d, 0x6a, 0x0c,
+  0x57, 0xd0, 0x5b, 0xc1, 0x9a, 0xf8, 0x7e, 0xf4, 0x9f, 0xf8, 0x29, 0x7d,
+  0x9b, 0xcb, 0x32, 0x28, 0x19, 0xe2, 0xeb, 0x93, 0xb7, 0x17, 0x57, 0x27,
+  0xf5, 0x72, 0xc5, 0x8a, 0x30, 0xb7, 0x22, 0x0a, 0xf6, 0x37, 0x67, 0xc7,
+  0x68, 0x83, 0x02, 0x83, 0x20, 0x99, 0x0a, 0x29, 0xda, 0xfd, 0xd1, 0xe5,
+  0xf7, 0x6f, 0xcc, 0xec, 0x50, 0x4b, 0xc8, 0xb8, 0x7b, 0x99, 0x0c, 0xda,
+  0xe5, 0x9d, 0x6e, 0x8a, 0x76, 0xd4, 0x02, 0xb0, 0x49, 0x9b, 0x34, 0x7d,
+  0x37, 0xf3, 0xa3, 0x14, 0x0b, 0x4e, 0x8c, 0xd1, 0x52, 0x7d, 0xc2, 0xb6,
+  0x2f, 0x4b, 0x2c, 0xbd, 0x37, 0x83, 0x7a, 0x7a, 0x2f, 0x5b, 0x47, 0x0c,
+  0x38, 0xc5, 0xa9, 0xc5, 0x71, 0x44, 0xa8, 0x7e, 0x08, 0xf4, 0xd7, 0x8f,
+  0xfc, 0x0f, 0x69, 0x52, 0x08, 0x7d, 0x25, 0xc4, 0xb0, 0x6f, 0x30, 0x4b,
+  0x9b, 0x02, 0x21, 0x2c, 0xed, 0xd0, 0xe1, 0x82, 0x44, 0x6b, 0xfa, 0xc1,
+  0x75, 0x19, 0x81, 0x51, 0xc2, 0x3d, 0xee, 0x46, 0x06, 0x22, 0xe4, 0xf0,
+  0xcd, 0xf5, 0x12, 0x0b, 0x1d, 0x9c, 0xa9, 0x9a, 0xdf, 0x44, 0x6a, 0x41,
+  0xaf, 0xfd, 0x79, 0xcd, 0xd6, 0x84, 0x70, 0x5f, 0xcb, 0x70, 0x1f, 0x58,
+  0xdb, 0x17, 0x70, 0xe3, 0xa9, 0xfc, 0x2d, 0x5d, 0x71, 0x5b, 0x3d, 0xb6,
+  0x84, 0xee, 0x24, 0xa5, 0x87, 0xda, 0xf3, 0x2e, 0x19, 0x49, 0x96, 0x18,
+  0x87, 0x08, 0x53, 0x1d, 0x45, 0x03, 0x7e, 0x7e, 0xf1, 0x45, 0x85, 0xb0,
+  0x0b, 0xb6, 0x57, 0x98, 0x32, 0x1c, 0x0a, 0x98, 0x69, 0x43, 0x0b, 0x0a,
+  0x45, 0x50, 0x13, 0xb6, 0xf2, 0x31, 0xab, 0xf0, 0xa2, 0x32, 0x4f, 0x19,
+  0xe5, 0x45, 0xb0, 0x00, 0x0c, 0x09, 0xc9, 0x92, 0x6e, 0x49, 0x48, 0x13,
+  0xaf, 0xf6, 0x5f, 0xa1, 0x68, 0xa7, 0x0c, 0x25, 0xe9, 0x94, 0x27, 0xb8,
+  0xdb, 0x14, 0x3d, 0x65, 0x50, 0x65, 0x0f, 0xe5, 0xda, 0x5d, 0x83, 0x76,
+  0x37, 0x1f, 0x26, 0x33, 0xee, 0xce, 0x37, 0x70, 0x06, 0xf1, 0xc1, 0x94,
+  0x56, 0x1c, 0x18, 0xc2, 0xf8, 0x01, 0xf9, 0xa4, 0xe5, 0x6d, 0xb4, 0xfe,
+  0x6f, 0x1b, 0x8c, 0x40, 0xa2, 0x69, 0x39, 0xe8, 0x9b, 0x4d, 0xb3, 0xa5,
+  0x47, 0xf9, 0xe8, 0x9c, 0x4b, 0x6b, 0x9b, 0x4a, 0x7b, 0x4e, 0xeb, 0x1b,
+  0x86, 0x6a, 0xf2, 0xca, 0x2a, 0x5f, 0x44, 0xdc, 0x4e, 0xb1, 0xf0, 0x82,
+  0x63, 0x72, 0x5c, 0x2b, 0xed, 0xd4, 0xf6, 0xb2, 0x05, 0x5f, 0x22, 0x12,
+  0x13, 0x22, 0xb0, 0x72, 0x71, 0xb8, 0xaa, 0x76, 0xd5, 0x8f, 0x3e, 0x64,
+  0x94, 0x88, 0x27, 0x74, 0x27, 0x72, 0x22, 0xcd, 0x60, 0xfd, 0x40, 0xd3,
+  0x20, 0x29, 0x02, 0x4c, 0xe8, 0xef, 0x75, 0xe6, 0x23, 0x4c, 0xb2, 0x11,
+  0x20, 0xa5, 0x4b, 0x2b, 0x6c, 0xcd, 0xb0, 0xad, 0x28, 0x7a, 0xeb, 0xf7,
+  0x9d, 0xe4, 0xbe, 0x79, 0x48, 0xea, 0xb0, 0x1c, 0x1a, 0x1b, 0x43, 0xe0,
+  0xc9, 0x6c, 0xd6, 0x63, 0x70, 0x7b, 0x84, 0xfa, 0x46, 0xe5, 0x9e, 0xab,
+  0xa4, 0x29, 0x81, 0xcd, 0x35, 0x7c, 0x3c, 0xc9, 0x42, 0xc5, 0xde, 0x84,
+  0x24, 0xab, 0x70, 0x23, 0x52, 0x8a, 0xa5, 0x81, 0x35, 0xac, 0xdc, 0xb3,
+  0xce, 0x10, 0xda, 0x1c, 0x5e, 0x52, 0x5b, 0xa7, 0x38, 0x1f, 0x2e, 0x76,
+  0x74, 0x33, 0x2d, 0x16, 0xdc, 0xad, 0x32, 0xd4, 0x4a, 0xd3, 0xd5, 0xba,
+  0xf9, 0x51, 0x25, 0x8a, 0x32, 0xa9, 0x78, 0x32, 0xfc, 0xee, 0xe9, 0x9b,
+  0x5a, 0xdb, 0x7b, 0xdc, 0x0a, 0x34, 0xfd, 0xc2, 0xc3, 0x99, 0xc7, 0xe8,
+  0x3e, 0x5a, 0xa9, 0x61, 0x86, 0xb2, 0x26, 0xc6, 0x50, 0x31, 0xc9, 0xe9,
+  0x77, 0xe1, 0xe1, 0x64, 0x14, 0x56, 0x55, 0x79, 0x0c, 0x1d, 0x98, 0x48,
+  0x05, 0x2c, 0xd1, 0x14, 0x1b, 0x8f, 0x21, 0x31, 0x4c, 0x93, 0xc2, 0x7c,
+  0xc6, 0x4f, 0x92, 0xbc, 0x99, 0xe7, 0x63, 0xac, 0xe9, 0x4a, 0x9e, 0xde,
+  0x0b, 0x7c, 0xd2, 0xde, 0x37, 0x29, 0x87, 0x2b, 0x0d, 0xd4, 0x2d, 0x57,
+  0xec, 0x61, 0x13, 0x82, 0xaa, 0x94, 0x9d, 0x09, 0x0f, 0x67, 0x97, 0xaa,
+  0xdd, 0x63, 0xe5, 0x4d, 0x77, 0x09, 0x59, 0x94, 0x8f, 0x2a, 0x67, 0x05,
+  0xf8, 0x40, 0x78, 0x38, 0x66, 0xac, 0x81, 0x95, 0x61, 0x81, 0x14, 0x59,
+  0x94, 0xab, 0x57, 0xc6, 0x0f, 0x7a, 0x87, 0x0c, 0x3f, 0xb4, 0x98, 0xc0,
+  0xb5, 0x13, 0x6e, 0x5f, 0x59, 0xe8, 0x84, 0x69, 0x06, 0xcd, 0x03, 0xd6,
+  0xae, 0x61, 0x05, 0x1f, 0x65, 0x2f, 0x3c, 0x9c, 0x39, 0x61, 0x01, 0x21,
+  0x5f, 0x71, 0xc0, 0xf2, 0x15, 0x6f, 0x17, 0x66, 0x19, 0xa8, 0x77, 0xcb,
+  0x62, 0x94, 0x7c, 0xa4, 0xb9, 0x55, 0x71, 0x31, 0x4d, 0xaa, 0x8f, 0xab,
+  0x37, 0x64, 0x26, 0x68, 0x0a, 0x8f, 0x73, 0x6a, 0xff, 0x6e, 0x98, 0x85,
+  0xe0, 0xfe, 0xc6, 0x82, 0x2e, 0x00, 0x0a, 0x1e, 0xfd, 0x9e, 0xad, 0x99,
+  0x16, 0xb2, 0xb7, 0xdf, 0x8b, 0x14, 0x4a, 0x07, 0xc4, 0x65, 0x9a, 0x29,
+  0x88, 0x8d, 0xf0, 0x18, 0x67, 0x8a, 0x51, 0x08, 0x79, 0x69, 0x55, 0xb8,
+  0x6a, 0x7e, 0x8b, 0x25, 0x56, 0x46, 0x09, 0xf8, 0x18, 0x68, 0xda, 0xe2,
+  0xd2, 0x31, 0x3f, 0xae, 0xc7, 0xcd, 0x6b, 0x92, 0x1a, 0x42, 0xd3, 0x25,
+  0xd8, 0x3d, 0xe9, 0xc8, 0x2f, 0x85, 0x76, 0x04, 0xa2, 0x7e, 0xd0, 0xdc,
+  0xc8, 0xe6, 0xec, 0x16, 0xf7, 0x63, 0xe3, 0x88, 0x81, 0xbf, 0xea, 0x77,
+  0x55, 0xb8, 0x53, 0x53, 0x0f, 0x6d, 0xc4, 0x8d, 0x09, 0x4c, 0x3c, 0xd8,
+  0x44, 0x91, 0xc9, 0x5b, 0x3f, 0x9d, 0x55, 0xbe, 0xfe, 0xe3, 0x7d, 0xbc,
+  0x48, 0x38, 0xef, 0x95, 0xb6, 0x57, 0x0e, 0xa3, 0x7d, 0x6b, 0xe4, 0x69,
+  0x3b, 0x45, 0xe6, 0xee, 0x96, 0x75, 0x15, 0x81, 0x2d, 0x6a, 0x67, 0x77,
+  0xf2, 0xd5, 0xc6, 0x75, 0x18, 0x27, 0xe8, 0x97, 0x15, 0x42, 0xc0, 0x84,
+  0x2d, 0x1e, 0x48, 0xb9, 0xde, 0x2a, 0x32, 0x6a, 0xdd, 0xe3, 0x62, 0xfe,
+  0xc4, 0x15, 0x87, 0x07, 0xec, 0xaa, 0x18, 0x87, 0xc3, 0xac, 0xca, 0xbb,
+  0x97, 0x72, 0x89, 0x5b, 0x76, 0xbe, 0x6d, 0x06, 0x35, 0x1a, 0x5c, 0x35,
+  0x13, 0x97, 0xfa, 0xdc, 0xc9, 0xd8, 0xad, 0x05, 0x55, 0xae, 0xa2, 0x2e,
+  0xe0, 0x3a, 0xb3, 0xf0, 0x70, 0x86, 0x3c, 0xf5, 0x3d, 0xd9, 0x9e, 0xae,
+  0xe3, 0xbb, 0xe4, 0x0e, 0x2f, 0x60, 0x36, 0xfa, 0xb4, 0xa1, 0xd7, 0xfb,
+  0x17, 0xb1, 0x07, 0xb4, 0xcf, 0x67, 0x99, 0x6b, 0x91, 0xe3, 0x17, 0x41,
+  0xf2, 0xae, 0x28, 0x65, 0x71, 0x9a, 0x43, 0x98, 0x03, 0xe7, 0x1e, 0xcf,
+  0x14, 0x77, 0xa5, 0x84, 0x3c, 0x4a, 0x54, 0xa5, 0x06, 0x61, 0xa2, 0xa4,
+  0x12, 0x5c, 0xdc, 0x18, 0x5b, 0xaf, 0xf8, 0x79, 0xf3, 0xfc, 0x49, 0xce,
+  0xda, 0x62, 0x18, 0x64, 0x8c, 0x1c, 0x8a, 0x12, 0xa2, 0x1d, 0xa4, 0xcb,
+  0x44, 0xac, 0x04, 0x7d, 0x3c, 0xe2, 0x6e, 0x2e, 0x7e, 0xe3, 0xec, 0x46,
+  0x02, 0x1d, 0xaa, 0x1f, 0x0d, 0x18, 0xf4, 0x64, 0x3a, 0x76, 0xdb, 0xd0,
+  0x3b, 0xcb, 0x2f, 0xba, 0xbc, 0x05, 0x53, 0x58, 0x3c, 0xfd, 0x11, 0x2c,
+  0x12, 0x21, 0x95, 0x98, 0x74, 0x15, 0x44, 0x3d, 0xd8, 0x88, 0xae, 0x24,
+  0xb4, 0x89, 0x3a, 0xdd, 0x63, 0x85, 0x20, 0xdb, 0x38, 0xc0, 0x7a, 0xda,
+  0x07, 0x61, 0xc8, 0x45, 0x01, 0xa8, 0x20, 0x61, 0xa7, 0x84, 0x50, 0xa0,
+  0x78, 0x43, 0x02, 0xa2, 0xec, 0x70, 0xdb, 0xdc, 0xee, 0x6f, 0x77, 0x5d,
+  0xab, 0xd3, 0xa6, 0xfe, 0xa1, 0xee, 0x1d, 0x1b, 0x88, 0x76, 0xfc, 0x74,
+  0xd3, 0xcf, 0x70, 0x85, 0x1f, 0x2e, 0x7d, 0xb7, 0x30, 0xb9, 0x96, 0xad,
+  0xc1, 0x72, 0x1f, 0x3f, 0xfa, 0x8a, 0xe9, 0x56, 0x6f, 0xef, 0xd5, 0xab,
+  0x9a, 0x3c, 0x2f, 0x1d, 0x7c, 0xfb, 0xfd, 0xad, 0x2d, 0x5a, 0x9b, 0x57,
+  0x13, 0x0d, 0xbf, 0xe8, 0xbd, 0xa2, 0x17, 0xeb, 0xaf, 0x95, 0x09, 0x1c,
+  0xc1, 0xb8, 0xfd, 0xbd, 0x1e, 0xfe, 0x26, 0xf0, 0x39, 0xf2, 0xa7, 0xb4,
+  0xbe, 0xf5, 0x0a, 0x3f, 0x17, 0x78, 0x8b, 0x1e, 0xe6, 0x7d, 0xcc, 0x27,
+  0x13, 0x74, 0x64, 0xe1, 0x93, 0x8a, 0xcb, 0x73, 0x1f, 0x17, 0x63, 0x7f,
+  0xb9, 0x5b, 0xdd, 0xde, 0x76, 0xdb, 0x72, 0x29, 0x9a, 0x4c, 0x09, 0x70,
+  0x78, 0x9e, 0x68, 0x27, 0x82, 0xf5, 0xc1, 0x05, 0x42, 0xcd, 0x81, 0xb6,
+  0x61, 0x46, 0xdb, 0xaf, 0x5e, 0x75, 0x71, 0x66, 0xfb, 0xaf, 0x5e, 0xb5,
+  0x16, 0x84, 0x3b, 0x9f, 0xb9, 0xcf, 0xad, 0xfb, 0x09, 0x5f, 0xb7, 0x44,
+  0x53, 0xa2, 0x91, 0x13, 0xfe, 0x0e, 0xfe, 0x26, 0x7a, 0x1d, 0x9d, 0x5f,
+  0x5c, 0x9f, 0x38, 0x9e, 0x19, 0xba, 0x5f, 0x1c, 0x30, 0x74, 0x4c, 0x4d,
+  0x8a, 0xc1, 0x2e, 0xa8, 0xc7, 0x1a, 0x59, 0xbd, 0x60, 0x93, 0xf8, 0xc6,
+  0x24, 0x15, 0xab, 0xa8, 0x47, 0xf0, 0x0f, 0x7e, 0x46, 0x04, 0x35, 0x52,
+  0x9b, 0xa6, 0x95, 0x0b, 0xdb, 0xb4, 0x0e, 0x87, 0xbd, 0x41, 0x2e, 0x0e,
+  0x4e, 0x72, 0x93, 0x60, 0xca, 0x5a, 0x89, 0xd5, 0x1d, 0x9c, 0x08, 0x8b,
+  0xff, 0xc8, 0x17, 0x6b, 0x5e, 0x81, 0x45, 0x32, 0xc3, 0xbc, 0x55, 0x91,
+  0x84, 0xfc, 0x42, 0x8f, 0x9e, 0x94, 0xeb, 0x42, 0xf6, 0xea, 0x03, 0x79,
+  0xe0, 0x63, 0x42, 0xb5, 0x74, 0x3f, 0x1e, 0x88, 0xa7, 0x20, 0x27, 0xe4,
+  0x44, 0x0c, 0xad, 0xcc, 0xc2, 0x61, 0x5c, 0x74, 0xe3, 0xb5, 0xd2, 0x3a,
+  0x3c, 0x8d, 0x77, 0x2e, 0xc3, 0x73, 0xf0, 0xf0, 0x08, 0xd9, 0x89, 0x3f,
+  0x4e, 0x16, 0x9a, 0x52, 0x9a, 0xd5, 0xc7, 0x01, 0x5a, 0x9e, 0xa4, 0xd3,
+  0x65, 0x11, 0x4e, 0xbf, 0xa4, 0x5e, 0x7e, 0x92, 0xe9, 0xa0, 0xdd, 0x1c,
+  0xe2, 0xfb, 0xb8, 0x48, 0xb4, 0xf9, 0x60, 0xf6, 0x68, 0xee, 0xb6, 0x5a,
+  0xc1, 0x5a, 0x0f, 0x84, 0xad, 0x36, 0x3c, 0x4b, 0x1a, 0x4b, 0xb8, 0x40,
+  0x8f, 0x41, 0x2f, 0x81, 0xa4, 0xe8, 0x48, 0x4b, 0x89, 0xb8, 0xb2, 0x15,
+  0x59, 0xe2, 0x40, 0xc4, 0xc3, 0x46, 0x61, 0x4a, 0x98, 0x99, 0xb4, 0x05,
+  0x7e, 0x4e, 0xdd, 0xda, 0xcc, 0xfa, 0xee, 0xf1, 0x59, 0xf2, 0xb6, 0xdc,
+  0xe4, 0x4e, 0xfb, 0x16, 0x1f, 0xb4, 0x01, 0x39, 0x0f, 0xc3, 0xb9, 0xd0,
+  0x5f, 0xf9, 0x90, 0xe0, 0xf9, 0xfb, 0x6c, 0x96, 0xc7, 0x63, 0xeb, 0x3c,
+  0x59, 0x68, 0xba, 0xae, 0x40, 0x8e, 0xc9, 0xd1, 0x7a, 0x59, 0x1d, 0x78,
+  0xd2, 0x7c, 0xc6, 0xd1, 0xba, 0x03, 0x28, 0x42, 0x14, 0xea, 0xb8, 0x41,
+  0x98, 0x4b, 0x21, 0xa5, 0x30, 0x40, 0x06, 0xc2, 0xdd, 0xf8, 0x66, 0x2f,
+  0xd2, 0x3b, 0x9f, 0x96, 0x49, 0x74, 0xa1, 0x3e, 0xb4, 0x28, 0x24, 0x1d,
+  0x97, 0x46, 0x34, 0x38, 0xfd, 0x9f, 0x27, 0x9f, 0x32, 0xea, 0x54, 0xc4,
+  0xf7, 0xa6, 0x70, 0xf0, 0x7b, 0x06, 0xac, 0x94, 0x68, 0x90, 0x41, 0xaa,
+  0x88, 0x67, 0x62, 0xc3, 0x63, 0xaf, 0x53, 0x92, 0x1e, 0x14, 0x56, 0x94,
+  0x36, 0xd3, 0x40, 0x58, 0x3e, 0x6d, 0x63, 0x7d, 0x9f, 0x45, 0x2e, 0xe3,
+  0x5c, 0x74, 0xaa, 0xf8, 0x62, 0x07, 0x20, 0x9f, 0xe3, 0x9c, 0x5c, 0x89,
+  0x64, 0xda, 0xa3, 0xb7, 0x97, 0xe1, 0xa4, 0x02, 0x1d, 0x64, 0x09, 0x11,
+  0x11, 0x27, 0x05, 0x73, 0x7d, 0xa2, 0x57, 0xa4, 0x5b, 0x69, 0x9f, 0x70,
+  0x5b, 0x0d, 0x0c, 0x4f, 0x15, 0xd1, 0xe1, 0x87, 0xab, 0xb3, 0x96, 0x72,
+  0xc9, 0x01, 0x9d, 0x01, 0x6e, 0x56, 0xe7, 0x2a, 0x21, 0x34, 0xb3, 0x22,
+  0xba, 0x8c, 0xa7, 0x49, 0xc7, 0x05, 0x90, 0xab, 0x21, 0x48, 0x8a, 0x03,
+  0x22, 0xe4, 0x4e, 0x71, 0xdb, 0xa1, 0x20, 0x13, 0xb7, 0x61, 0x61, 0xb7,
+  0xc8, 0x71, 0x32, 0x8b, 0x65, 0xef, 0x96, 0x05, 0x86, 0xf3, 0x69, 0xe7,
+  0x03, 0x2d, 0xbe, 0xd4, 0x4f, 0xd9, 0x80, 0xfe, 0x94, 0xd6, 0x65, 0x54,
+  0x96, 0x15, 0x2f, 0x90, 0x86, 0xa2, 0xce, 0x17, 0xe8, 0x81, 0xef, 0xe8,
+  0x34, 0x7b, 0x89, 0x1f, 0x64, 0xd3, 0xad, 0xc0, 0xc0, 0x70, 0xcd, 0x0b,
+  0x55, 0xf7, 0xdd, 0xe3, 0xac, 0x35, 0xde, 0x9a, 0x20, 0x1e, 0x6f, 0x49,
+  0xb1, 0x64, 0xaf, 0x85, 0x1b, 0x86, 0xbf, 0x10, 0x74, 0x91, 0x71, 0x58,
+  0x31, 0xe3, 0x24, 0x3a, 0x93, 0xf9, 0x1d, 0x48, 0xb0, 0x85, 0x75, 0x21,
+  0x9d, 0x5a, 0x2d, 0x33, 0x28, 0xb4, 0xd8, 0x78, 0x86, 0x8d, 0x8a, 0x8c,
+  0xf7, 0x0b, 0xd7, 0x38, 0xce, 0xb1, 0xb9, 0x0d, 0x4e, 0x29, 0xce, 0x8c,
+  0x33, 0xb9, 0x76, 0xb2, 0x9f, 0x1c, 0xea, 0xd0, 0x06, 0x80, 0x8e, 0xba,
+  0xd2, 0x7d, 0xab, 0x07, 0xd4, 0x91, 0x49, 0x1d, 0xbc, 0x73, 0xac, 0x0e,
+  0xed, 0xfd, 0x87, 0xd3, 0xd2, 0xc5, 0x69, 0xca, 0xd2, 0x82, 0x98, 0xeb,
+  0x4c, 0xb7, 0xa2, 0x32, 0x15, 0x3a, 0x42, 0xaf, 0x2d, 0x8c, 0xad, 0x98,
+  0x15, 0x61, 0x19, 0x74, 0xe7, 0xf7, 0x9c, 0x82, 0x96, 0x63, 0x2e, 0xdd,
+  0xec, 0xbd, 0x49, 0x41, 0x88, 0x94, 0x8c, 0x40, 0x44, 0x5a, 0x2e, 0xb7,
+  0x23, 0xd3, 0x8b, 0xc8, 0x25, 0xbc, 0x3d, 0x1f, 0xdd, 0x6f, 0x24, 0x75,
+  0x1d, 0xe6, 0x15, 0x13, 0xb3, 0x01, 0x8a, 0x78, 0xc2, 0x59, 0x6c, 0xb5,
+  0x85, 0xd8, 0x3a, 0x2b, 0x68, 0xcf, 0x62, 0xed, 0x60, 0x20, 0xf0, 0x1e,
+  0xe8, 0xb7, 0x0c, 0xec, 0x8e, 0xc1, 0x05, 0xa2, 0xcc, 0x99, 0x32, 0x32,
+  0xe9, 0xf1, 0xd2, 0x1d, 0xcb, 0x33, 0x36, 0x4d, 0x4f, 0x79, 0x4e, 0xf6,
+  0x68, 0x86, 0x01, 0x61, 0x52, 0xa6, 0x41, 0x11, 0x47, 0x4e, 0x18, 0x85,
+  0x8f, 0x4b, 0x53, 0x47, 0x30, 0x6c, 0xbf, 0xb1, 0x04, 0x6d, 0xae, 0x14,
+  0x16, 0xb8, 0x8f, 0xb5, 0x85, 0x51, 0xce, 0xa8, 0x4b, 0x78, 0x18, 0x1b,
+  0xc8, 0x72, 0x41, 0x78, 0x09, 0x85, 0xd0, 0x29, 0x7b, 0x07, 0x1f, 0x71,
+  0xe5, 0x20, 0x27, 0x6c, 0x44, 0x7f, 0xea, 0xd9, 0xc6, 0x1b, 0xeb, 0x8f,
+  0x09, 0x68, 0xd8, 0x36, 0xe9, 0x83, 0x0c, 0xa9, 0x40, 0xf5, 0x67, 0xc4,
+  0x5d, 0x5b, 0xcb, 0x5a, 0x5d, 0x0a, 0x19, 0x21, 0x4e, 0x64, 0x91, 0x37,
+  0x5d, 0x7a, 0xe8, 0x2c, 0xb3, 0xe4, 0x01, 0x31, 0xc0, 0xdb, 0x87, 0xf3,
+  0x95, 0xec, 0xef, 0x8f, 0xae, 0xce, 0x4f, 0xcf, 0xbf, 0x39, 0x40, 0x84,
+  0xba, 0xa4, 0x18, 0x61, 0x8b, 0xec, 0xe8, 0x6f, 0xcb, 0x71, 0x3a, 0x62,
+  0x4e, 0x21, 0xbd, 0x9b, 0x6b, 0x95, 0x31, 0x89, 0x38, 0x58, 0x81, 0xb9,
+  0x78, 0x85, 0x30, 0x92, 0xcc, 0x8b, 0x75, 0x3d, 0x45, 0x3e, 0x5d, 0x9a,
+  0xad, 0x1f, 0x91, 0x2a, 0x42, 0x61, 0x00, 0x0a, 0x8f, 0x22, 0x3f, 0x62,
+  0xa2, 0x85, 0xd1, 0x51, 0x51, 0x78, 0x73, 0x76, 0x16, 0xb5, 0xf4, 0xed,
+  0xd6, 0xda, 0x2d, 0xce, 0x18, 0xa2, 0x81, 0x4c, 0xbe, 0x29, 0xc6, 0xf3,
+  0x40, 0xf8, 0x23, 0xb7, 0xa9, 0x71, 0x3d, 0x30, 0x5d, 0xbf, 0xf7, 0x33,
+  0x39, 0x29, 0xcf, 0x98, 0x92, 0x03, 0xe9, 0x84, 0xd3, 0x62, 0x4c, 0xb6,
+  0x10, 0x30, 0xc9, 0x7c, 0x52, 0xa1, 0x7a, 0x54, 0x93, 0xa4, 0xf5, 0x7e,
+  0x4d, 0xab, 0x9c, 0xed, 0x37, 0x6c, 0xe5, 0xd4, 0x80, 0x53, 0x38, 0x22,
+  0x49, 0x49, 0xab, 0x40, 0x8f, 0xac, 0x17, 0x52, 0x8f, 0x2f, 0xf4, 0x49,
+  0x79, 0xd4, 0x3c, 0x4e, 0x62, 0xd3, 0x71, 0xbe, 0x44, 0x6e, 0xe9, 0xb3,
+  0x8b, 0xfb, 0xa4, 0x10, 0xe3, 0xd3, 0x54, 0x11, 0x03, 0xb3, 0xeb, 0x47,
+  0x83, 0x1c, 0x9e, 0x0f, 0x54, 0x2d, 0x68, 0x27, 0x4c, 0xdb, 0xed, 0x36,
+  0xae, 0x24, 0x89, 0xd6, 0xe4, 0x55, 0x51, 0x93, 0x30, 0x8a, 0xb9, 0xd5,
+  0xd7, 0x1b, 0xe8, 0xc3, 0x8d, 0xf4, 0x3f, 0x4c, 0x8c, 0x42, 0xf1, 0xa8,
+  0xa1, 0x1d, 0xa4, 0x90, 0x4e, 0x0f, 0xd8, 0x69, 0x87, 0x1a, 0x1c, 0x62,
+  0x77, 0x70, 0x67, 0xa4, 0x27, 0x7a, 0xdc, 0xba, 0x69, 0xea, 0xcd, 0x05,
+  0x07, 0x5b, 0x07, 0x3a, 0x2d, 0xb9, 0x62, 0xb1, 0x3b, 0x1d, 0xcf, 0xa9,
+  0x74, 0x70, 0x33, 0xa1, 0x52, 0xae, 0xd2, 0x4b, 0x50, 0xc3, 0xf4, 0x02,
+  0xe0, 0x17, 0x0c, 0x66, 0x26, 0x0f, 0xb9, 0x75, 0xf2, 0xee, 0xcb, 0x22,
+  0x6e, 0xba, 0xd6, 0xb9, 0x90, 0x12, 0xa4, 0x4f, 0xe5, 0xd5, 0xe9, 0x4d,
+  0xfa, 0x1b, 0xc1, 0xbc, 0x1a, 0x9e, 0x83, 0x48, 0xa4, 0x32, 0xbe, 0xb3,
+  0x09, 0x5f, 0xad, 0x8c, 0x4f, 0x8b, 0x55, 0x9a, 0x32, 0x9a, 0x0e, 0xd4,
+  0x78, 0x95, 0x74, 0xa8, 0x38, 0x72, 0x0a, 0x59, 0xdc, 0x50, 0x65, 0x0d,
+  0x93, 0xc0, 0x1f, 0x4e, 0x2a, 0xbe, 0x24, 0xc8, 0xd5, 0xca, 0x84, 0x25,
+  0x72, 0x93, 0x66, 0x77, 0x39, 0xfd, 0x46, 0x82, 0x54, 0x81, 0x14, 0x95,
+  0xb4, 0xb5, 0xac, 0xe5, 0xba, 0xb1, 0xab, 0xea, 0xa0, 0xd1, 0x22, 0x02,
+  0x58, 0x0b, 0x97, 0x06, 0xba, 0x3d, 0x5b, 0x6c, 0x9b, 0x96, 0x26, 0x29,
+  0xf0, 0x65, 0x42, 0xe2, 0xed, 0x46, 0xda, 0xea, 0x1d, 0x5e, 0x9c, 0x95,
+  0x89, 0xb4, 0x9f, 0xe6, 0x92, 0x40, 0x15, 0x38, 0x22, 0x6f, 0x52, 0xe3,
+  0xfb, 0x69, 0x97, 0x24, 0xa6, 0x4c, 0xc8, 0xec, 0xb5, 0xb5, 0x5f, 0x31,
+  0xa3, 0x91, 0x1b, 0x41, 0xe3, 0x0d, 0x1e, 0xdd, 0xe4, 0xb9, 0xd4, 0x9c,
+  0xb6, 0x31, 0xdb, 0x88, 0x1b, 0xa4, 0x21, 0x22, 0x46, 0x8b, 0xfe, 0x60,
+  0xe0, 0xc3, 0x6c, 0xb0, 0xce, 0x4b, 0xf0, 0x75, 0xa1, 0x06, 0x6b, 0xe8,
+  0xa4, 0x75, 0xd9, 0xc6, 0xf3, 0x31, 0xc2, 0x59, 0x98, 0xab, 0x0f, 0xaf,
+  0x48, 0x5c, 0x80, 0x45, 0x77, 0x78, 0x7b, 0x24, 0xb3, 0xd2, 0xdd, 0x94,
+  0xa0, 0xb0, 0xe3, 0x5c, 0x4b, 0x0b, 0x90, 0x4d, 0x54, 0x43, 0x66, 0x53,
+  0x56, 0x0f, 0x68, 0xd0, 0x4c, 0xd3, 0x8a, 0x18, 0xc8, 0x9f, 0x76, 0xb6,
+  0xda, 0x98, 0x3c, 0x0e, 0xa4, 0x35, 0xae, 0x78, 0x1b, 0x4b, 0x63, 0x7f,
+  0x91, 0x18, 0xb4, 0x85, 0x01, 0x28, 0x43, 0x96, 0x0b, 0xf4, 0xd3, 0xf5,
+  0x90, 0x5e, 0xe2, 0xb2, 0x6d, 0xff, 0xc3, 0x56, 0xf1, 0xaf, 0x6d, 0x4a,
+  0xd9, 0xd2, 0x93, 0xd2, 0xf2, 0xaf, 0x2b, 0xe7, 0x8c, 0x71, 0xa0, 0x50,
+  0x82, 0x99, 0xf2, 0x12, 0xf5, 0x93, 0x38, 0x4a, 0xbb, 0xd5, 0x19, 0xc8,
+  0xae, 0xa7, 0xe6, 0x83, 0x72, 0x39, 0x71, 0x34, 0xdf, 0x7c, 0x8d, 0xe7,
+  0x8b, 0x28, 0xc0, 0xb2, 0xba, 0x7a, 0x03, 0x34, 0x4d, 0x25, 0xb6, 0x70,
+  0x97, 0xb1, 0xb0, 0xc7, 0x59, 0xee, 0xa3, 0xaf, 0x08, 0x23, 0x65, 0x63,
+  0x3c, 0x96, 0x74, 0x4d, 0xda, 0x10, 0xfc, 0x52, 0x5d, 0x30, 0x52, 0xce,
+  0x59, 0x2f, 0xe8, 0xed, 0x0f, 0x76, 0x8d, 0x90, 0xec, 0x71, 0x17, 0x0a,
+  0xbf, 0xc3, 0x6f, 0x77, 0xa2, 0x75, 0xe4, 0xaa, 0x1b, 0x46, 0x79, 0xf5,
+  0xeb, 0x9f, 0xb5, 0x39, 0x0b, 0xdb, 0x30, 0x31, 0x4b, 0xc8, 0x66, 0xf2,
+  0x2c, 0xea, 0xaf, 0x60, 0xe5, 0x15, 0x20, 0xff, 0xb1, 0xe7, 0x1b, 0x57,
+  0x0f, 0x4e, 0x96, 0xb3, 0x90, 0x99, 0x83, 0x77, 0x5b, 0x82, 0x43, 0x69,
+  0x59, 0x2e, 0xc5, 0x08, 0x34, 0x00, 0x33, 0x06, 0x71, 0x30, 0x9a, 0xc1,
+  0x7c, 0xe8, 0xd3, 0xe5, 0x0c, 0xb3, 0x4a, 0x5a, 0xd5, 0x13, 0xf2, 0x0e,
+  0x8b, 0xe2, 0x6b, 0x1a, 0x78, 0xb2, 0x1d, 0x25, 0xa7, 0xc3, 0x8d, 0xe8,
+  0xa4, 0x91, 0x1a, 0x6e, 0x42, 0x97, 0x64, 0x55, 0x63, 0xb8, 0xce, 0xc5,
+  0xe5, 0xf5, 0xe9, 0xc5, 0xf9, 0x20, 0xfa, 0xb7, 0xce, 0xca, 0xf2, 0xae,
+  0x3a, 0xb0, 0xf2, 0x0f, 0x5d, 0x7b, 0x26, 0xd1, 0xa1, 0xf8, 0x19, 0xda,
+  0x6c, 0x63, 0x47, 0x89, 0x1f, 0x81, 0xf4, 0x06, 0xfe, 0xaa, 0x6f, 0x0a,
+  0xb4, 0x9b, 0x9c, 0x56, 0x03, 0x8d, 0xce, 0xd3, 0x96, 0x0d, 0x9c, 0x5f,
+  0xd3, 0x88, 0x66, 0x66, 0x6f, 0x6d, 0x96, 0xc6, 0xf0, 0x61, 0x0e, 0x2c,
+  0x9c, 0xaf, 0x96, 0xca, 0x29, 0x2f, 0xd0, 0x16, 0xdf, 0x93, 0x5a, 0xca,
+  0x16, 0xf4, 0xba, 0x34, 0x5d, 0x16, 0x45, 0xab, 0x0c, 0x74, 0x98, 0xfb,
+  0xe6, 0xe4, 0x1a, 0x9d, 0x34, 0x54, 0xe5, 0x6a, 0x27, 0x48, 0xae, 0x2e,
+  0x51, 0x7c, 0x62, 0xa3, 0x9c, 0x69, 0x71, 0x2b, 0x5e, 0x1a, 0xd0, 0x9e,
+  0x67, 0x71, 0x16, 0x2c, 0x61, 0x03, 0x8d, 0xf6, 0x18, 0x76, 0x23, 0xb7,
+  0xd0, 0xaf, 0xea, 0x3b, 0x71, 0xfa, 0x9a, 0x30, 0x2c, 0xd3, 0xe5, 0x87,
+  0x6b, 0xf1, 0x53, 0xbd, 0x39, 0x39, 0x3b, 0xb9, 0x3e, 0x69, 0x5a, 0xee,
+  0x43, 0x06, 0xb3, 0xa4, 0x52, 0x97, 0x2a, 0x19, 0xdd, 0x64, 0xf9, 0x2c,
+  0x9f, 0xa6, 0xd2, 0x88, 0x37, 0xfa, 0x3e, 0x19, 0xbe, 0x39, 0xfa, 0x0e,
+  0xf5, 0x09, 0xf4, 0x39, 0x5d, 0x5e, 0x5d, 0x5c, 0xbe, 0x3d, 0x3d, 0x7f,
+  0xd3, 0x8d, 0x8e, 0x2f, 0x2e, 0xff, 0xd2, 0x8d, 0xde, 0x5f, 0x7c, 0x77,
+  0x12, 0x48, 0x71, 0x46, 0x84, 0x5b, 0x8f, 0x62, 0x4c, 0xb3, 0x3e, 0x6b,
+  0x78, 0x67, 0x1c, 0xb2, 0x70, 0x84, 0x08, 0xe6, 0xff, 0x83, 0xf6, 0x8b,
+  0xec, 0x96, 0xee, 0x1a, 0x6c, 0x1d, 0xc8, 0xd0, 0x77, 0x27, 0x47, 0x6f,
+  0xba, 0x1e, 0x80, 0x39, 0xb6, 0x52, 0x81, 0x8f, 0xe1, 0xfa, 0xcc, 0xa2,
+  0x09, 0xf6, 0x9a, 0xad, 0x0f, 0xd2, 0x10, 0x38, 0xc8, 0xc5, 0x37, 0x16,
+  0x08, 0x96, 0xaa, 0xf4, 0xc7, 0x6d, 0x99, 0x13, 0x82, 0xc5, 0xdf, 0xda,
+  0xfa, 0xda, 0x29, 0xbb, 0x40, 0x65, 0xcd, 0x55, 0xb3, 0x05, 0xac, 0x89,
+  0xd2, 0xea, 0xb5, 0x08, 0xcb, 0xcd, 0x92, 0x6d, 0x41, 0x0c, 0xea, 0xd6,
+  0xa0, 0x02, 0x88, 0x1f, 0xb1, 0xeb, 0x31, 0x96, 0x9e, 0x86, 0xd4, 0xb4,
+  0x08, 0xcc, 0x24, 0xd4, 0xaa, 0x27, 0x16, 0x25, 0x76, 0xb5, 0x86, 0x2d,
+  0x40, 0xea, 0x02, 0xdb, 0x84, 0x9b, 0xa7, 0x1b, 0x64, 0x7a, 0x7a, 0xfe,
+  0xc0, 0x3f, 0x16, 0xb0, 0xa8, 0x40, 0xe2, 0xf6, 0x72, 0x02, 0x64, 0x99,
+  0x70, 0xca, 0x14, 0x1f, 0x93, 0x71, 0x0b, 0x44, 0xbd, 0x53, 0x75, 0x4a,
+  0xac, 0x52, 0xb0, 0xf4, 0xc6, 0xa8, 0x63, 0x86, 0xb1, 0xa2, 0xd4, 0x67,
+  0x55, 0x67, 0x13, 0xae, 0x87, 0x04, 0xd7, 0x19, 0xd0, 0xf7, 0xf5, 0x88,
+  0x15, 0xcd, 0x48, 0x3c, 0x38, 0xee, 0xa6, 0x10, 0xe8, 0x86, 0xe7, 0xcb,
+  0x02, 0x01, 0xeb, 0x09, 0x17, 0x7a, 0x12, 0x58, 0x49, 0x26, 0x1e, 0xd1,
+  0x08, 0x43, 0x6f, 0x3d, 0xb6, 0xa5, 0xdd, 0x9c, 0x5f, 0xe5, 0x9e, 0xa2,
+  0x9b, 0xca, 0x1c, 0xbc, 0x10, 0x15, 0xad, 0xd3, 0xf6, 0x98, 0x74, 0x7d,
+  0x79, 0xbb, 0x5b, 0x0f, 0xd6, 0xc7, 0x8e, 0xda, 0x44, 0x19, 0xf5, 0x04,
+  0xeb, 0x9b, 0x8a, 0xf7, 0xbc, 0xad, 0x5b, 0x7f, 0xdb, 0xc2, 0x18, 0x5d,
+  0xaf, 0xad, 0x29, 0xe8, 0x37, 0x2c, 0xea, 0xec, 0x14, 0xae, 0x43, 0x00,
+  0x1a, 0x87, 0x9b, 0xee, 0x72, 0x3a, 0x02, 0xe9, 0x55, 0xb4, 0xfb, 0x30,
+  0x96, 0xff, 0x61, 0x6c, 0x70, 0x1f, 0xfc, 0x32, 0xfe, 0xe2, 0xa9, 0x4f,
+  0x7b, 0x67, 0x76, 0x75, 0x72, 0x7d, 0xd5, 0x8f, 0xd6, 0x5d, 0xcc, 0xd7,
+  0x17, 0xfd, 0x2d, 0x3f, 0x68, 0x73, 0xfa, 0xfe, 0x28, 0xbc, 0x5e, 0xfc,
+  0x45, 0xdb, 0x57, 0x89, 0x37, 0xe0, 0x77, 0xfd, 0x3c, 0x62, 0x07, 0xe9,
+  0x69, 0x2b, 0xf4, 0xbd, 0xc1, 0xfb, 0x96, 0xfd, 0xc5, 0x5f, 0xac, 0x58,
+  0xe5, 0xbb, 0x93, 0xb3, 0x40, 0x6f, 0x9f, 0xef, 0xae, 0xde, 0xfe, 0xa5,
+  0xbe, 0xca, 0xdd, 0xbd, 0xc0, 0x57, 0x7f, 0x4b, 0x87, 0x7a, 0x52, 0xe6,
+  0x33, 0x50, 0x58, 0xa8, 0x8a, 0x83, 0x8a, 0x38, 0x0e, 0x40, 0x04, 0x60,
+  0xae, 0xf9, 0x5f, 0xbb, 0xf2, 0x97, 0x9f, 0xfa, 0xfd, 0xfe, 0x97, 0x3e,
+  0x2a, 0x3a, 0xf9, 0x68, 0xcc, 0x72, 0xe5, 0xd9, 0xa6, 0x05, 0x4e, 0x55,
+  0x33, 0x54, 0x25, 0x84, 0x51, 0x8b, 0x45, 0x9c, 0x16, 0xd4, 0x13, 0x28,
+  0x28, 0x70, 0x71, 0x49, 0xb6, 0xd2, 0xcb, 0x68, 0x73, 0x82, 0x08, 0xc6,
+  0xd7, 0x75, 0xbd, 0xdc, 0x90, 0xba, 0x6a, 0x2b, 0x83, 0xe3, 0xb1, 0xe7,
+  0x08, 0xe1, 0xbe, 0x2c, 0xf8, 0xd9, 0x02, 0xfd, 0xb3, 0x6c, 0xeb, 0x58,
+  0x59, 0x9b, 0xa9, 0xec, 0x90, 0xd5, 0x8f, 0xcd, 0xf4, 0x83, 0xde, 0x0b,
+  0xa9, 0x93, 0x3c, 0x96, 0x90, 0x3a, 0x39, 0x92, 0x63, 0x12, 0x2b, 0xd4,
+  0x66, 0x36, 0xa9, 0x46, 0x9b, 0xb8, 0xce, 0xb2, 0xa6, 0x01, 0x1a, 0x15,
+  0xce, 0x73, 0x22, 0xb9, 0x79, 0x92, 0x54, 0x41, 0xcb, 0xc9, 0x2d, 0x4e,
+  0x49, 0x82, 0x2d, 0xe2, 0x75, 0x34, 0x75, 0xd6, 0x0f, 0x7c, 0x6e, 0x56,
+  0xeb, 0x88, 0xe4, 0x56, 0x20, 0x6a, 0xab, 0x0b, 0x8f, 0x1d, 0x3a, 0x65,
+  0x6a, 0xbe, 0xda, 0x4f, 0xdc, 0x59, 0x29, 0x09, 0x13, 0x29, 0x08, 0x7d,
+  0x7c, 0x52, 0x93, 0x08, 0xea, 0xa1, 0x73, 0x0f, 0xbd, 0xa5, 0xf6, 0x99,
+  0x26, 0xc0, 0x48, 0xe2, 0x6a, 0xc4, 0xe3, 0x4a, 0x7d, 0x79, 0xf8, 0xb5,
+  0x49, 0xd8, 0xa0, 0x32, 0xf3, 0xb5, 0x7f, 0x5b, 0x43, 0x45, 0x98, 0x5e,
+  0x0f, 0xd6, 0xb6, 0x2b, 0xe1, 0xa2, 0x61, 0x83, 0x4f, 0x05, 0xf4, 0x06,
+  0xb3, 0x29, 0x86, 0xf8, 0x94, 0x97, 0xba, 0xc4, 0x43, 0x4b, 0xe8, 0x47,
+  0xdf, 0xa7, 0xb3, 0xf1, 0x28, 0x2e, 0x28, 0x3d, 0xcc, 0x17, 0xaf, 0x42,
+  0x26, 0x7c, 0x9f, 0xca, 0x9c, 0xbe, 0x6a, 0x2f, 0x8f, 0x36, 0x93, 0x09,
+  0x53, 0x7d, 0xa0, 0xe8, 0xc7, 0x1c, 0x06, 0x06, 0xbf, 0xdb, 0x8a, 0xce,
+  0x98, 0x7c, 0x74, 0x8f, 0x51, 0xd4, 0xd5, 0x3b, 0x78, 0xd4, 0xcf, 0x55,
+  0xe3, 0x10, 0xbd, 0x3d, 0x3f, 0x96, 0x92, 0x2e, 0xee, 0xf6, 0xc8, 0x7d,
+  0xf5, 0xa2, 0xcb, 0xff, 0x7a, 0x61, 0xcb, 0x4f, 0x1c, 0x23, 0x8d, 0xed,
+  0x18, 0xd6, 0xfa, 0x4f, 0x2f, 0xb5, 0xc8, 0xb5, 0xc9, 0x13, 0x07, 0x0e,
+  0x26, 0x39, 0xcf, 0x52, 0xcb, 0xd6, 0xe0, 0x1d, 0x9d, 0x2d, 0xee, 0x08,
+  0xf0, 0xaf, 0xbf, 0x0e, 0x0b, 0x84, 0x1d, 0xa9, 0xca, 0x9f, 0x56, 0xd5,
+  0x13, 0x83, 0xce, 0xff, 0xb2, 0x1f, 0x68, 0xbf, 0x1d, 0xfc, 0x90, 0x49,
+  0xf7, 0xb5, 0x5f, 0x43, 0xa0, 0x28, 0x0a, 0xdb, 0x61, 0xd6, 0x8f, 0x2d,
+  0x27, 0x0e, 0x7e, 0xe8, 0xd5, 0x13, 0x1f, 0xe2, 0x23, 0x35, 0xb8, 0x6f,
+  0xf7, 0x4a, 0x15, 0x66, 0xfa, 0xd2, 0x4b, 0x7b, 0xaf, 0xbf, 0xf5, 0xfc,
+  0x0c, 0x65, 0x6b, 0x7c, 0x33, 0xfc, 0x20, 0xff, 0x84, 0xa8, 0x44, 0x52,
+  0xc4, 0xf2, 0x36, 0x9a, 0x5b, 0xd9, 0x19, 0x03, 0x61, 0x73, 0x6a, 0xbc,
+  0x1c, 0x36, 0x80, 0x4a, 0x84, 0x0a, 0x30, 0x0e, 0x4b, 0x6f, 0x07, 0x4e,
+  0xb3, 0x86, 0xbb, 0x45, 0x78, 0x22, 0x06, 0x45, 0xf9, 0xc7, 0x08, 0xbf,
+  0xa0, 0x5c, 0xee, 0x04, 0x8b, 0x98, 0xae, 0x4e, 0xde, 0x7e, 0x18, 0x9c,
+  0xbc, 0x89, 0xe2, 0x00, 0x04, 0x16, 0xc5, 0x4b, 0x53, 0x72, 0xcb, 0x49,
+  0x83, 0xa0, 0x2a, 0xcf, 0x39, 0x23, 0x48, 0xe6, 0xe2, 0xf5, 0x1c, 0x94,
+  0xe4, 0x22, 0xb0, 0x8c, 0xfd, 0xba, 0x13, 0xd6, 0xe3, 0xe4, 0xc5, 0x5f,
+  0x80, 0x3b, 0xc2, 0xab, 0x1e, 0x27, 0xd8, 0x9c, 0xeb, 0x90, 0xb3, 0x60,
+  0x3c, 0x50, 0x35, 0xdb, 0xc6, 0xab, 0x9c, 0x25, 0xc9, 0x42, 0x8a, 0xfe,
+  0x6c, 0x27, 0x79, 0x38, 0x1b, 0xf5, 0x04, 0x4a, 0x73, 0x0e, 0x1a, 0x55,
+  0x03, 0x87, 0x71, 0x4b, 0x27, 0x29, 0x82, 0x57, 0xe3, 0x8c, 0x75, 0x8b,
+  0x19, 0x60, 0xb7, 0x85, 0x77, 0x65, 0x3d, 0xad, 0x1a, 0x2e, 0x74, 0xaf,
+  0xab, 0x1e, 0xb9, 0xd4, 0x11, 0xa0, 0x07, 0xec, 0x22, 0x9e, 0x4c, 0x3c,
+  0x9b, 0xe6, 0x05, 0x8c, 0x37, 0x37, 0x75, 0x8a, 0x0c, 0xe7, 0x50, 0x6e,
+  0x34, 0x7b, 0x71, 0xfa, 0x35, 0xdf, 0x5c, 0xea, 0x48, 0x21, 0xf0, 0x84,
+  0x6b, 0xb8, 0x91, 0x2d, 0xf0, 0x3e, 0x91, 0xc7, 0x04, 0xc3, 0x83, 0x2c,
+  0xd3, 0x06, 0x52, 0x75, 0x4d, 0xfb, 0xc1, 0x5b, 0xe8, 0x99, 0x9b, 0xd8,
+  0x75, 0xa4, 0xe9, 0xce, 0x51, 0xd5, 0x5d, 0xc3, 0x01, 0xee, 0xdc, 0x7f,
+  0xcf, 0x6e, 0x6e, 0xdb, 0x3b, 0xa1, 0x1b, 0x30, 0x8f, 0x1f, 0xc8, 0x45,
+  0xd5, 0x4a, 0x0e, 0xec, 0xb0, 0xc5, 0xed, 0xc0, 0xc7, 0x0a, 0x66, 0xf9,
+  0xc4, 0x60, 0x6d, 0xe5, 0x0b, 0xe7, 0x25, 0x99, 0x93, 0x16, 0x07, 0x16,
+  0xd9, 0xdd, 0x7e, 0xe8, 0x91, 0xd2, 0xb8, 0x4d, 0x4b, 0x33, 0xf2, 0x13,
+  0xc6, 0xb8, 0x4c, 0x34, 0xe2, 0xd6, 0xb9, 0xb5, 0x14, 0x7d, 0x6f, 0x03,
+  0x7f, 0x3c, 0xcb, 0x31, 0x4a, 0xc9, 0xc4, 0x40, 0xdf, 0xf7, 0x21, 0xfb,
+  0xd0, 0x48, 0x28, 0x90, 0x10, 0xd5, 0xa0, 0x65, 0x9f, 0x30, 0xb5, 0xb2,
+  0xa1, 0x62, 0x31, 0x04, 0x30, 0x63, 0x0f, 0xd8, 0xc4, 0x8e, 0x23, 0x6f,
+  0x7a, 0x39, 0xac, 0x3c, 0x0e, 0x2b, 0x0a, 0x34, 0x44, 0xb7, 0x8e, 0xac,
+  0x2c, 0x9b, 0x4d, 0xe5, 0x99, 0xd4, 0xa0, 0x9a, 0x5a, 0xa9, 0x49, 0x8d,
+  0x7c, 0x40, 0x55, 0xeb, 0x6a, 0xfb, 0x1c, 0x2a, 0x6d, 0xc2, 0xe5, 0x90,
+  0x9d, 0x19, 0x67, 0xee, 0x5c, 0xe9, 0x00, 0x60, 0x8c, 0x34, 0x1f, 0x53,
+  0x51, 0x14, 0xb7, 0xe1, 0x69, 0x83, 0x8f, 0x91, 0xb9, 0xac, 0xa1, 0xa7,
+  0xf2, 0x21, 0x9d, 0x2f, 0xe7, 0xf4, 0x7e, 0x97, 0xcb, 0x1f, 0xe7, 0x28,
+  0xb5, 0xf4, 0x50, 0x29, 0xbb, 0xb0, 0x52, 0x8a, 0x0a, 0x39, 0x33, 0x90,
+  0xb7, 0x11, 0xd1, 0x56, 0x9c, 0xf1, 0x83, 0x6f, 0x71, 0x8b, 0x0d, 0x3a,
+  0xa8, 0xff, 0x76, 0xfa, 0x8c, 0x0e, 0x41, 0xa3, 0xfb, 0xd2, 0x9f, 0x84,
+  0xcf, 0x3a, 0x88, 0x2e, 0x31, 0xcf, 0x39, 0x19, 0x3b, 0x56, 0xa4, 0x90,
+  0x1b, 0x81, 0xd8, 0xf0, 0x19, 0xb5, 0x73, 0x28, 0x69, 0x35, 0x49, 0xf3,
+  0x15, 0x8a, 0xc7, 0xa5, 0x5a, 0xe7, 0x2f, 0x8b, 0x25, 0xa1, 0xfb, 0x29,
+  0x43, 0xfa, 0x2d, 0x17, 0x9e, 0xcc, 0x37, 0x7c, 0xc2, 0xa8, 0xa3, 0xf0,
+  0xf9, 0x2d, 0xc9, 0x89, 0x11, 0xdb, 0x16, 0xfd, 0xe5, 0xb2, 0xc7, 0xc6,
+  0x8d, 0x25, 0x0d, 0x17, 0xc2, 0x9d, 0x35, 0x89, 0x97, 0x79, 0x42, 0x84,
+  0x15, 0x53, 0x86, 0x43, 0x3a, 0xc0, 0x4d, 0xe1, 0xe3, 0xeb, 0x6a, 0x19,
+  0xde, 0xde, 0xc3, 0x83, 0x47, 0xe1, 0x8e, 0x41, 0xcc, 0x78, 0x93, 0x6c,
+  0x2d, 0xef, 0x6d, 0x7d, 0x8e, 0xff, 0xdc, 0x7f, 0x68, 0x18, 0xcd, 0xfd,
+  0x20, 0x38, 0xa4, 0x96, 0xe5, 0xc6, 0xc3, 0x9c, 0x43, 0x70, 0xbc, 0x61,
+  0xb1, 0xb3, 0x99, 0x1a, 0x45, 0x90, 0xce, 0xaf, 0xf7, 0x31, 0x6e, 0x6e,
+  0x9e, 0xf9, 0xa9, 0x0d, 0x94, 0x8b, 0xe9, 0xf4, 0x7a, 0xd5, 0x40, 0x29,
+  0x35, 0x2d, 0x04, 0xe5, 0x1f, 0x37, 0x53, 0xf7, 0x4a, 0x07, 0x1d, 0xe7,
+  0x4b, 0x0e, 0x64, 0x26, 0x5e, 0x64, 0x2c, 0xe5, 0xdd, 0xc7, 0x2b, 0x05,
+  0x22, 0x2b, 0x9d, 0xe1, 0x3b, 0x7c, 0xaf, 0xcb, 0x68, 0x1b, 0x8e, 0x21,
+  0xcd, 0x96, 0x95, 0x01, 0xeb, 0xa3, 0x0f, 0x2a, 0x85, 0x06, 0x77, 0x1f,
+  0xf9, 0xbc, 0x11, 0x2c, 0xc2, 0x0b, 0x4a, 0x27, 0x40, 0xc8, 0xf7, 0x84,
+  0x74, 0x72, 0x71, 0xf0, 0xb8, 0x52, 0x36, 0xe0, 0x2a, 0x32, 0x51, 0x58,
+  0xe9, 0xdc, 0x94, 0x3c, 0xc0, 0x66, 0x33, 0x88, 0x52, 0x64, 0x84, 0x83,
+  0x15, 0x6a, 0x92, 0x21, 0xcc, 0x0d, 0x1b, 0x02, 0x99, 0x3f, 0x35, 0x26,
+  0x6e, 0x5a, 0x78, 0x11, 0x9f, 0xcb, 0x2b, 0xb9, 0x92, 0xa6, 0xf9, 0x1a,
+  0x6b, 0x6d, 0xe1, 0xab, 0x2d, 0x0d, 0xd4, 0x18, 0x5b, 0x0f, 0xb4, 0xb6,
+  0x17, 0x58, 0x0d, 0xec, 0x14, 0xa2, 0xc1, 0x49, 0x98, 0xac, 0x4d, 0x1c,
+  0xfe, 0x8a, 0x3e, 0x7d, 0x84, 0x21, 0xe3, 0x83, 0x90, 0x46, 0xe6, 0x16,
+  0x73, 0x23, 0xeb, 0x25, 0x5e, 0x40, 0xfe, 0xfa, 0x44, 0xf1, 0xb8, 0x11,
+  0xa9, 0x9b, 0x2f, 0xab, 0x71, 0xc0, 0x73, 0x3a, 0x40, 0xf2, 0xe0, 0x73,
+  0xe6, 0x90, 0xaa, 0xf3, 0x3b, 0xb2, 0xa3, 0x32, 0x46, 0xf8, 0xc9, 0x65,
+  0x75, 0xf3, 0x73, 0x3a, 0x0e, 0x22, 0x37, 0xe0, 0x6d, 0x80, 0x5f, 0xc3,
+  0xa9, 0x95, 0xec, 0xfe, 0x52, 0x64, 0xd3, 0x68, 0x5d, 0x5e, 0xdb, 0xe8,
+  0x46, 0xe3, 0x25, 0x39, 0xe4, 0x06, 0x47, 0x83, 0xb3, 0xe8, 0xf2, 0xec,
+  0xe8, 0xf4, 0x1c, 0xde, 0xe9, 0xf9, 0x46, 0xaa, 0x01, 0x2c, 0xeb, 0x36,
+  0x5b, 0x8c, 0x91, 0xc7, 0xb3, 0x8e, 0x69, 0x66, 0xbe, 0xc3, 0x1f, 0xf2,
+  0x31, 0x8d, 0xc6, 0x24, 0x4a, 0x6b, 0xb5, 0x07, 0xbd, 0xa5, 0x66, 0x3c,
+  0xb5, 0xa3, 0xea, 0x58, 0xa5, 0x49, 0x33, 0x65, 0x24, 0x15, 0xd5, 0x89,
+  0x35, 0xf2, 0x65, 0x04, 0xc9, 0x75, 0x97, 0xc8, 0xd4, 0xfc, 0xd5, 0xc0,
+  0xca, 0x6d, 0x76, 0x11, 0xce, 0x10, 0x66, 0xc4, 0x1d, 0xb3, 0x80, 0x2a,
+  0x9c, 0x61, 0x09, 0xdc, 0xcd, 0x64, 0xb9, 0x52, 0xc6, 0x60, 0x5b, 0x26,
+  0x14, 0x4c, 0x0a, 0xdd, 0x8e, 0x98, 0x1c, 0x2a, 0xdb, 0xa4, 0x62, 0xd6,
+  0xc9, 0xca, 0x8f, 0xa9, 0x70, 0xd8, 0x58, 0x69, 0xb8, 0xd8, 0xb5, 0xd2,
+  0x93, 0xd0, 0xc3, 0xfc, 0xa1, 0x6b, 0x61, 0x12, 0xa8, 0xb4, 0xc9, 0xe4,
+  0x37, 0x4c, 0x81, 0x99, 0x11, 0x0c, 0x15, 0x8f, 0x04, 0x83, 0x76, 0x4d,
+  0xa6, 0x7b, 0x79, 0x13, 0xfb, 0x05, 0x03, 0x73, 0xd0, 0x6e, 0x61, 0x40,
+  0xd7, 0x35, 0xba, 0x8a, 0xc6, 0x5e, 0x34, 0x7a, 0x79, 0x13, 0x8d, 0xa5,
+  0x4d, 0x1d, 0xe7, 0x84, 0xb2, 0x6c, 0x4d, 0x8e, 0x9c, 0xe1, 0xce, 0x30,
+  0x04, 0xd1, 0x51, 0x9d, 0x1c, 0x56, 0x02, 0xb0, 0x6f, 0x37, 0xbe, 0xf7,
+  0x89, 0x50, 0x62, 0x19, 0xb5, 0xbb, 0xad, 0xf1, 0x65, 0x79, 0xc0, 0x5f,
+  0xb7, 0x60, 0xd4, 0xfe, 0x64, 0x18, 0xd9, 0x0b, 0xab, 0x99, 0xb8, 0x41,
+  0x69, 0x08, 0x1e, 0x8a, 0x9e, 0xd8, 0x94, 0xd4, 0xb8, 0xa7, 0x32, 0x4c,
+  0x18, 0x7a, 0x56, 0x57, 0x3e, 0x40, 0xea, 0xc7, 0x0e, 0xbe, 0xbd, 0x10,
+  0x8c, 0x95, 0x89, 0xcf, 0x8a, 0x9d, 0x55, 0xd2, 0xd3, 0x98, 0x28, 0x57,
+  0x89, 0x3a, 0x67, 0x24, 0x39, 0x8e, 0x61, 0xf3, 0xcd, 0xb0, 0x01, 0x82,
+  0xdf, 0x2e, 0x81, 0x53, 0x10, 0x26, 0xdc, 0x24, 0x55, 0x67, 0xe0, 0x8c,
+  0xe9, 0xf1, 0x61, 0x6a, 0xa2, 0x41, 0x74, 0xf6, 0xf7, 0x65, 0x9a, 0x50,
+  0x37, 0x5f, 0x90, 0xc3, 0xd1, 0x1b, 0xce, 0x98, 0x94, 0x66, 0xa3, 0xdc,
+  0xd5, 0x98, 0x3a, 0x1f, 0xe3, 0xa3, 0x66, 0x02, 0x1e, 0x1f, 0x86, 0x09,
+  0xa1, 0x7c, 0x7a, 0x4f, 0x93, 0x3e, 0xc6, 0x49, 0xcf, 0x41, 0x00, 0x92,
+  0x5f, 0xcb, 0x41, 0xd7, 0xd3, 0x64, 0x1a, 0xad, 0x70, 0x61, 0x51, 0x15,
+  0x97, 0xb7, 0x7e, 0x0d, 0x4b, 0xb7, 0xd6, 0xa9, 0x8d, 0x7c, 0x29, 0xc2,
+  0x98, 0x2a, 0x6c, 0xf3, 0x97, 0xc5, 0xb3, 0xcd, 0xb2, 0x1a, 0xa3, 0x5e,
+  0xb0, 0xcc, 0x66, 0x38, 0x49, 0x1c, 0xaa, 0xa5, 0x6f, 0x68, 0x00, 0x87,
+  0x8a, 0x20, 0xd0, 0x1b, 0x07, 0x44, 0x31, 0x1d, 0xc3, 0x06, 0xa5, 0x96,
+  0xcf, 0x35, 0xec, 0xf0, 0x27, 0x22, 0x57, 0x7d, 0x50, 0x2c, 0x77, 0xab,
+  0x90, 0xed, 0xf0, 0x8a, 0x69, 0x23, 0x6b, 0xe7, 0xb6, 0x0a, 0x22, 0xe4,
+  0x0e, 0x27, 0x04, 0x84, 0x36, 0xcc, 0x4b, 0x05, 0x4f, 0x87, 0x45, 0xc2,
+  0xeb, 0xb5, 0xfb, 0x44, 0x10, 0x74, 0xbf, 0x10, 0xe5, 0x87, 0xfb, 0xa5,
+  0x3b, 0x18, 0x3f, 0xab, 0xda, 0xa4, 0xfb, 0x4d, 0xe6, 0x7f, 0x31, 0xc0,
+  0x4f, 0x08, 0xc1, 0x0c, 0x5d, 0x2c, 0x26, 0x27, 0x58, 0x12, 0xfd, 0x6a,
+  0x40, 0x37, 0xe4, 0xd4, 0xc0, 0xc4, 0x8b, 0x40, 0x8b, 0x4e, 0x20, 0xa7,
+  0xa5, 0x60, 0x83, 0x8c, 0x66, 0xa0, 0x03, 0x05, 0x1c, 0x31, 0x03, 0x01,
+  0x86, 0x43, 0x18, 0xbc, 0x6e, 0x53, 0x64, 0x97, 0x4b, 0x54, 0xcd, 0x67,
+  0x4b, 0xfc, 0x36, 0x23, 0xc8, 0x19, 0x04, 0x33, 0x85, 0x34, 0x08, 0xa2,
+  0xfe, 0x19, 0x08, 0x32, 0xbc, 0xa3, 0x0e, 0x00, 0xa2, 0x62, 0xfa, 0x1a,
+  0x6c, 0xc0, 0x26, 0x46, 0x54, 0xbf, 0x65, 0x76, 0xe8, 0x2d, 0xe1, 0x61,
+  0x12, 0x01, 0x58, 0x75, 0x1c, 0x53, 0x58, 0xe6, 0xa5, 0xd3, 0x11, 0x84,
+  0x40, 0xc1, 0xd4, 0x09, 0xa2, 0xba, 0x51, 0xce, 0x04, 0x2b, 0x5f, 0xee,
+  0xdc, 0x54, 0x43, 0x51, 0x00, 0x01, 0xaa, 0xbc, 0x70, 0x70, 0x00, 0x81,
+  0x00, 0x32, 0x2f, 0x1e, 0x88, 0xc8, 0x5c, 0xdc, 0x58, 0x90, 0x78, 0x0e,
+  0x2b, 0xd4, 0x52, 0x44, 0x56, 0xea, 0xdd, 0xab, 0x4d, 0x89, 0x21, 0x9a,
+  0xb2, 0x50, 0x06, 0x3f, 0xbf, 0xb4, 0xae, 0x20, 0x3d, 0xf4, 0xda, 0x46,
+  0x2d, 0x6e, 0x96, 0xd7, 0x60, 0xa8, 0x7f, 0x57, 0x9d, 0x6b, 0xbf, 0xde,
+  0x50, 0x4f, 0x20, 0x1d, 0x7f, 0xd5, 0x85, 0x8a, 0x9f, 0x77, 0xa3, 0x5a,
+  0xaa, 0x6d, 0xfe, 0xdf, 0xbc, 0x51, 0xf1, 0xf3, 0xae, 0x54, 0x5c, 0xbb,
+  0x53, 0xb8, 0x4c, 0x9f, 0x2d, 0x3d, 0xb4, 0xce, 0xf8, 0x37, 0xbc, 0x65,
+  0x26, 0x31, 0xe9, 0xb9, 0x77, 0x4c, 0x69, 0xe2, 0xff, 0xed, 0x5b, 0xf6,
+  0x79, 0x43, 0x0b, 0x24, 0x7c, 0xd4, 0x15, 0x7d, 0x2b, 0xdd, 0xdc, 0x2d,
+  0x54, 0x90, 0x51, 0xd7, 0xda, 0x34, 0x50, 0x86, 0xe1, 0xe6, 0x95, 0x0c,
+  0xbd, 0x15, 0x0c, 0x5d, 0xe6, 0x7a, 0xb4, 0xfb, 0xe6, 0x38, 0x14, 0x77,
+  0x60, 0xe5, 0xc8, 0x9e, 0xf3, 0x56, 0x11, 0xa2, 0x2d, 0x6e, 0x4a, 0x5f,
+  0xd4, 0x07, 0x5d, 0xd3, 0x14, 0xe4, 0xfa, 0x22, 0x25, 0xed, 0x00, 0x14,
+  0x17, 0x34, 0x6f, 0xbf, 0x19, 0x0c, 0x7a, 0x47, 0x97, 0xa7, 0xd1, 0x13,
+  0x76, 0x17, 0xe1, 0xc2, 0xd8, 0x39, 0x86, 0xec, 0xe5, 0xf6, 0x34, 0xac,
+  0xfa, 0xd7, 0x41, 0xcf, 0x6d, 0x6e, 0xeb, 0x51, 0x19, 0xd5, 0xd2, 0x8c,
+  0x75, 0x52, 0xa6, 0xe5, 0x06, 0x6a, 0xdb, 0x8a, 0xba, 0x4c, 0xa9, 0xfe,
+  0xe8, 0xac, 0x41, 0xae, 0x45, 0x0f, 0x78, 0x39, 0xd9, 0x84, 0xb0, 0x83,
+  0xe8, 0x38, 0xdb, 0xaf, 0x5e, 0x6c, 0xc3, 0xad, 0x78, 0x64, 0xd4, 0x47,
+  0x79, 0x79, 0xaf, 0xbf, 0xbb, 0xb9, 0xd7, 0xdf, 0x43, 0x9e, 0x26, 0xc1,
+  0x52, 0x72, 0x76, 0xc8, 0xf0, 0xc0, 0xed, 0x02, 0x59, 0x49, 0x2c, 0xc4,
+  0xce, 0x4f, 0x8e, 0x23, 0x4e, 0x5d, 0x25, 0x18, 0xc0, 0x86, 0xd1, 0xc5,
+  0x19, 0x6e, 0x94, 0xc2, 0x22, 0x47, 0xc8, 0xc4, 0xea, 0x39, 0x29, 0xbc,
+  0xed, 0x50, 0x53, 0x82, 0x2c, 0xae, 0xcc, 0x4c, 0x04, 0xd9, 0x1d, 0x5b,
+  0x15, 0xb2, 0x2f, 0x38, 0x47, 0xbf, 0x02, 0xcd, 0xd9, 0x12, 0x67, 0xc3,
+  0x9e, 0x48, 0x2f, 0xdf, 0x6b, 0x3f, 0x1f, 0x35, 0x5f, 0x5a, 0x0c, 0x20,
+  0xeb, 0xb9, 0xf7, 0xec, 0x1c, 0x61, 0x88, 0x6a, 0x94, 0xa2, 0x0b, 0x72,
+  0x34, 0x37, 0x26, 0xc9, 0xe4, 0xef, 0xe3, 0xac, 0xff, 0x4b, 0xed, 0xa9,
+  0x80, 0x42, 0xec, 0x98, 0x4d, 0x3a, 0x75, 0x61, 0x64, 0x62, 0x2b, 0xb5,
+  0x2d, 0x48, 0x4c, 0xa4, 0xa6, 0x87, 0x8c, 0x49, 0x00, 0x2f, 0x33, 0x5b,
+  0x50, 0xce, 0x50, 0x66, 0xfc, 0xc0, 0xcf, 0x74, 0xf4, 0x80, 0x41, 0x8e,
+  0x1f, 0xe3, 0xb1, 0x8a, 0x24, 0x9e, 0xc9, 0xac, 0x9c, 0xef, 0xf8, 0xbf,
+  0xc4, 0xdd, 0x23, 0x66, 0x5b, 0xfa, 0x69, 0x99, 0x12, 0x54, 0x70, 0xa6,
+  0x60, 0xd2, 0xb4, 0x6c, 0x27, 0x97, 0x45, 0x01, 0xe2, 0x24, 0x5d, 0xc4,
+  0xb3, 0xe8, 0x19, 0xb5, 0x05, 0xed, 0x87, 0xff, 0x44, 0x9f, 0x5e, 0x9a,
+  0xbd, 0xde, 0xce, 0x15, 0x8c, 0x4e, 0x52, 0x8f, 0x9a, 0x52, 0x35, 0xc0,
+  0xe5, 0x5a, 0x06, 0x43, 0xe4, 0x04, 0xcb, 0xcd, 0x94, 0xe2, 0x9a, 0x09,
+  0x34, 0x60, 0x49, 0x1a, 0xcf, 0x2b, 0xba, 0xe3, 0x6c, 0x28, 0x4d, 0x87,
+  0x95, 0x9a, 0xd7, 0x8d, 0x26, 0x23, 0x0c, 0x31, 0xf7, 0x2a, 0x17, 0xa6,
+  0xf8, 0x24, 0xe7, 0xfd, 0x2d, 0x98, 0x21, 0xaa, 0x70, 0xec, 0x67, 0xf8,
+  0xe5, 0xca, 0x9c, 0x6c, 0x61, 0xb4, 0x4e, 0x69, 0x20, 0x52, 0x23, 0xac,
+  0x38, 0xa1, 0x9a, 0x58, 0x10, 0x70, 0x16, 0x51, 0xd4, 0x98, 0x08, 0x04,
+  0x37, 0xe4, 0x09, 0xd3, 0x2a, 0xa0, 0xf8, 0x79, 0x7c, 0xf6, 0xff, 0x09,
+  0x35, 0x70, 0x3f, 0x32, 0x67, 0xf5, 0x1c, 0x75, 0x90, 0x91, 0xd5, 0xb9,
+  0xdf, 0xb8, 0x07, 0x7d, 0x67, 0x4d, 0xae, 0xff, 0x5f, 0x1b, 0xfc, 0x3f,
+  0x49, 0x1b, 0xfc, 0x57, 0x6e, 0x69, 0x4f, 0xf2, 0x9a, 0xf9, 0x5a, 0x9a,
+  0xcc, 0x2a, 0xa9, 0x43, 0x09, 0x16, 0x1c, 0xcc, 0x1e, 0xfb, 0x51, 0x0b,
+  0xbc, 0xf1, 0x13, 0x57, 0xd4, 0x27, 0x85, 0xff, 0x37, 0xae, 0xe8, 0xb3,
+  0x6e, 0xe6, 0xff, 0xef, 0xfb, 0xf8, 0xdf, 0xed, 0x1e, 0x06, 0x08, 0x52,
+  0x07, 0x5b, 0x07, 0x32, 0xbb, 0xc7, 0xac, 0x3d, 0x6e, 0x76, 0x46, 0x96,
+  0xf6, 0x86, 0x55, 0x7d, 0xb0, 0x1c, 0x8f, 0xb7, 0xee, 0xf4, 0xf2, 0xbb,
+  0x17, 0x84, 0xc2, 0x33, 0x68, 0x26, 0xb3, 0x14, 0xd1, 0xd9, 0x9b, 0xa3,
+  0xcb, 0x5f, 0x70, 0xdb, 0xff, 0x42, 0x6e, 0xd6, 0x45, 0x92, 0x8c, 0x7b,
+  0x1c, 0x37, 0x3c, 0xa4, 0x7f, 0x04, 0x03, 0xee, 0x8a, 0xae, 0x41, 0x64,
+  0x8b, 0xe1, 0x44, 0x3f, 0x8f, 0x81, 0x5e, 0x06, 0x35, 0x25, 0x13, 0xcc,
+  0x9b, 0x05, 0xb5, 0x5d, 0xf6, 0x7c, 0x2c, 0x79, 0x36, 0xde, 0x10, 0x15,
+  0x90, 0xbf, 0x4d, 0xa4, 0x22, 0xf9, 0x27, 0x78, 0xbd, 0xa7, 0x88, 0x8b,
+  0x67, 0xa0, 0x43, 0x9d, 0x67, 0x38, 0x13, 0x2f, 0x98, 0x0c, 0xf5, 0x68,
+  0x97, 0xc2, 0x21, 0x4f, 0x46, 0xaf, 0xdb, 0xdd, 0x42, 0xff, 0x3b, 0x71,
+  0x90, 0xa4, 0xfa, 0x84, 0x68, 0x1b, 0xcd, 0xcf, 0xb7, 0xa5, 0xd3, 0xac,
+  0xdc, 0x4a, 0xf7, 0x24, 0x6a, 0x3b, 0x88, 0x11, 0x72, 0x0e, 0x1d, 0x7a,
+  0x5d, 0xca, 0x9d, 0x6f, 0x72, 0x06, 0x09, 0xcf, 0xd7, 0x7c, 0xa2, 0xbe,
+  0x97, 0xa7, 0x93, 0xfa, 0x76, 0x06, 0xb2, 0x77, 0xbb, 0xb5, 0x6c, 0x25,
+  0x77, 0x4a, 0x26, 0x4e, 0xbe, 0x1d, 0xa9, 0x6b, 0x9f, 0x31, 0x25, 0x04,
+  0xca, 0xe2, 0x2f, 0x7e, 0x36, 0xa5, 0xf3, 0xfa, 0x53, 0x9d, 0x88, 0xf3,
+  0xac, 0x2a, 0xa8, 0xc5, 0x88, 0xa6, 0x10, 0x94, 0x0a, 0xda, 0xbf, 0x74,
+  0xba, 0x39, 0xc7, 0x54, 0x28, 0x40, 0xbb, 0xe6, 0xb7, 0xdb, 0xe4, 0xfb,
+  0x9d, 0x54, 0xa3, 0xbe, 0x39, 0x59, 0x02, 0x30, 0x84, 0x5f, 0x8d, 0x40,
+  0xc5, 0xd5, 0x8e, 0xd4, 0x5d, 0x6a, 0xe1, 0xa6, 0xcd, 0xd9, 0x5a, 0x7c,
+  0x15, 0x9a, 0x09, 0xf3, 0xe9, 0xdb, 0xb3, 0xad, 0xee, 0x7f, 0xe8, 0x43,
+  0x48, 0xa8, 0x3b, 0xc6, 0x70, 0x85, 0x18, 0xd8, 0x19, 0x81, 0x2f, 0x50,
+  0x93, 0x64, 0x8c, 0x04, 0x4f, 0x66, 0xf1, 0xbd, 0xd4, 0xc3, 0x35, 0xf9,
+  0xfd, 0xe0, 0x6c, 0x97, 0xb6, 0xf5, 0xfa, 0x6c, 0xe0, 0xc2, 0xe7, 0x97,
+  0x14, 0x8c, 0xa7, 0xfa, 0xc7, 0xaf, 0x4f, 0x8e, 0x06, 0xd7, 0x7d, 0x6f,
+  0x89, 0x1c, 0x07, 0x0e, 0x12, 0x0c, 0x33, 0xe1, 0xc1, 0x19, 0xac, 0xf5,
+  0x11, 0xe1, 0x33, 0xa5, 0xae, 0x12, 0x27, 0xc7, 0x73, 0xd3, 0xd1, 0xd1,
+  0xce, 0x8d, 0x39, 0xbb, 0xbf, 0x4a, 0x0a, 0x3f, 0x25, 0x09, 0xf6, 0x6e,
+  0x98, 0xce, 0x70, 0x05, 0x30, 0x2f, 0xb0, 0x86, 0xe6, 0x52, 0x34, 0x41,
+  0x55, 0xfa, 0xf9, 0x0c, 0x33, 0x09, 0xf0, 0x33, 0x75, 0x3f, 0x04, 0x26,
+  0x24, 0x0b, 0x74, 0x41, 0x7b, 0x21, 0x32, 0xe8, 0x1d, 0x39, 0xb6, 0x7f,
+  0x32, 0x53, 0xd5, 0xbd, 0xe2, 0xb8, 0xb3, 0xd3, 0xb1, 0x0f, 0xf1, 0x8d,
+  0x10, 0xc4, 0xc5, 0x4f, 0xf7, 0x8e, 0xcb, 0x5b, 0x8d, 0xec, 0x52, 0x5f,
+  0x51, 0x8c, 0x1a, 0xaf, 0xcc, 0x39, 0x6d, 0x5a, 0x42, 0x70, 0xd0, 0x54,
+  0x13, 0x8f, 0xd5, 0x51, 0x5e, 0x71, 0x04, 0x3a, 0x00, 0xb2, 0x64, 0xb6,
+  0xb1, 0xe2, 0xc4, 0x35, 0x73, 0xc4, 0xed, 0x7b, 0x8a, 0xa3, 0x85, 0x7b,
+  0xad, 0x45, 0xa3, 0x9b, 0x04, 0x84, 0x48, 0xdf, 0x41, 0x76, 0x78, 0xf6,
+  0x86, 0x7c, 0xe6, 0xc1, 0xff, 0x05, 0xb6, 0xe7, 0x17, 0x6f, 0xc8, 0xde,
+  0x9e, 0xbf, 0x21, 0x45, 0xf2, 0xf7, 0x71, 0x08, 0x0b, 0x9d, 0x6a, 0x50,
+  0xa8, 0xfc, 0x85, 0xcb, 0x46, 0xae, 0x18, 0xd0, 0x1d, 0xa7, 0xba, 0x89,
+  0x2d, 0x8d, 0x34, 0x8f, 0xde, 0x82, 0xe9, 0xa1, 0x85, 0x8d, 0x01, 0x48,
+  0xbf, 0x1d, 0xbb, 0x82, 0x6e, 0x3a, 0xed, 0x37, 0xd3, 0x30, 0x1c, 0x88,
+  0x64, 0x37, 0xcb, 0x47, 0x56, 0x6a, 0x90, 0x98, 0xcb, 0x42, 0x8d, 0x71,
+  0xb0, 0xc4, 0xd4, 0x5c, 0x9e, 0x5e, 0x6f, 0x52, 0x2d, 0xcc, 0xc2, 0x56,
+  0x52, 0xc7, 0x96, 0xb7, 0x19, 0x2d, 0x4b, 0xbf, 0x2e, 0x1e, 0xd5, 0xfd,
+  0xba, 0x72, 0xf5, 0x7e, 0xb6, 0x25, 0xf6, 0xdc, 0xe1, 0x44, 0x6a, 0x42,
+  0x2d, 0x93, 0x26, 0xea, 0xad, 0xdb, 0x60, 0x4b, 0x56, 0x65, 0x23, 0x7c,
+  0xe6, 0x41, 0xdb, 0x52, 0x8b, 0x8c, 0x9a, 0x05, 0x0b, 0x07, 0xd7, 0xe8,
+  0xa8, 0x6c, 0x01, 0x97, 0x56, 0x52, 0x41, 0x83, 0x77, 0xdb, 0xb3, 0x0a,
+  0xac, 0xf9, 0xbb, 0x64, 0x46, 0x05, 0xde, 0x49, 0x36, 0x2a, 0x1e, 0x17,
+  0x2e, 0x78, 0xff, 0xf8, 0x5f, 0xd9, 0x7f, 0xad, 0x0c, 0xa2, 0xd0, 0x31,
+  0x28, 0x3e, 0xc0, 0xec, 0x36, 0x7c, 0xfd, 0x0b, 0xeb, 0x74, 0x65, 0x3c,
+  0xc6, 0x23, 0x45, 0x29, 0x5c, 0xb9, 0xb5, 0x02, 0x68, 0xcb, 0x28, 0xe7,
+  0x66, 0x08, 0x4d, 0x81, 0x5a, 0x98, 0xf8, 0x0e, 0x64, 0xdc, 0x5c, 0x53,
+  0x09, 0xf0, 0xec, 0x93, 0xdf, 0xe9, 0xf2, 0x76, 0xdd, 0xed, 0x78, 0x3c,
+  0x61, 0x70, 0xb6, 0x11, 0xbd, 0x45, 0x1f, 0x4d, 0xdd, 0x09, 0x8f, 0xd7,
+  0x55, 0xdb, 0x93, 0xed, 0xb0, 0x23, 0xca, 0xed, 0xd6, 0xac, 0x10, 0xf8,
+  0x5e, 0x0a, 0x15, 0x55, 0x86, 0xd3, 0xdb, 0xb6, 0x46, 0x77, 0x00, 0xac,
+  0x95, 0x13, 0x1b, 0xd5, 0xb3, 0xc4, 0x3d, 0x55, 0xb5, 0xf4, 0x19, 0x9e,
+  0xbe, 0xdb, 0x69, 0x03, 0xa2, 0xef, 0xcb, 0xaf, 0xa9, 0x88, 0x7d, 0x9c,
+  0x10, 0x96, 0xbb, 0x62, 0x69, 0x62, 0x05, 0x17, 0xd3, 0x1b, 0x65, 0xf5,
+  0xa2, 0x7b, 0xfa, 0xc5, 0xf6, 0xcb, 0x17, 0x1b, 0xab, 0xba, 0x94, 0x63,
+  0xef, 0x1e, 0x2c, 0xce, 0x65, 0x12, 0xc2, 0x7f, 0xed, 0xf4, 0xdd, 0x0d,
+  0x8a, 0x6c, 0x67, 0x13, 0x29, 0xb2, 0xf6, 0x25, 0x1c, 0x88, 0x1b, 0x24,
+  0x09, 0xda, 0x08, 0x6d, 0xf7, 0x40, 0xc4, 0xc2, 0xeb, 0x42, 0x5b, 0x46,
+  0x6e, 0x39, 0x91, 0x72, 0xd3, 0x28, 0xf4, 0x90, 0xe8, 0xc9, 0x48, 0xec,
+  0xed, 0xea, 0x1c, 0x58, 0x7a, 0xba, 0xed, 0x39, 0x79, 0xb2, 0xf4, 0xf7,
+  0x7e, 0xfd, 0x5f, 0x6e, 0x30, 0xd3, 0x0e, 0xf0, 0x6b, 0x4e, 0x79, 0xf7,
+  0x77, 0x38, 0xe5, 0xdd, 0xd5, 0xa7, 0xbc, 0xfb, 0xdc, 0x53, 0x7e, 0xb9,
+  0xff, 0xe2, 0xf3, 0x5f, 0x71, 0xca, 0xce, 0x0e, 0xff, 0xb7, 0x9d, 0xb2,
+  0x43, 0x69, 0xbf, 0xee, 0x94, 0x25, 0x29, 0xa4, 0x59, 0x90, 0x29, 0xc9,
+  0x2f, 0x94, 0xd6, 0x8a, 0x50, 0x1a, 0x5c, 0xc6, 0xc2, 0xcf, 0xfa, 0x75,
+  0x56, 0xd2, 0x7c, 0x92, 0x9b, 0xde, 0xa1, 0x1e, 0x16, 0x30, 0xb2, 0x2d,
+  0xb4, 0x08, 0x69, 0xb8, 0x8b, 0x19, 0xf6, 0x4e, 0x5b, 0xeb, 0xad, 0xa9,
+  0x7b, 0x44, 0xcb, 0x27, 0x15, 0x17, 0x8b, 0x3f, 0x07, 0x47, 0xfd, 0x3b,
+  0xa2, 0xaa, 0xf9, 0x39, 0x33, 0x4e, 0xd6, 0x53, 0x7d, 0xd3, 0x1e, 0x67,
+  0x60, 0x26, 0x70, 0x0e, 0x52, 0x30, 0xfb, 0x4d, 0x90, 0xdf, 0x0d, 0xb2,
+  0x93, 0x3a, 0x6a, 0x86, 0xa0, 0x14, 0x82, 0x14, 0xc8, 0x30, 0xa9, 0xe7,
+  0x71, 0x96, 0x48, 0x01, 0x31, 0x2e, 0x1a, 0x29, 0x03, 0x4d, 0xf9, 0xa6,
+  0x4b, 0x58, 0x7a, 0x05, 0x35, 0x32, 0x96, 0xfa, 0xe2, 0x2e, 0x07, 0xf5,
+  0xac, 0x36, 0x19, 0x0a, 0x02, 0x94, 0x70, 0x4b, 0x46, 0x37, 0xdc, 0x5f,
+  0x24, 0x00, 0xf6, 0xb3, 0x2a, 0xc1, 0xaf, 0x99, 0x70, 0xd7, 0xd2, 0x9b,
+  0x28, 0xd8, 0x81, 0x0a, 0xfb, 0x54, 0xd5, 0x1b, 0x55, 0x71, 0x8e, 0x38,
+  0x23, 0xea, 0x91, 0xc2, 0xdf, 0xec, 0xfd, 0x24, 0x8d, 0xa3, 0xbc, 0x42,
+  0x64, 0x94, 0xe9, 0xb2, 0xa0, 0x7a, 0xd3, 0x25, 0x9b, 0x4d, 0xa8, 0x3b,
+  0xf3, 0x74, 0xcd, 0x0c, 0x26, 0x9d, 0x4b, 0xcf, 0x6d, 0x15, 0x92, 0x6c,
+  0x82, 0xbf, 0xc1, 0xd3, 0x1d, 0x2f, 0xe7, 0x0b, 0x05, 0x43, 0xc4, 0xea,
+  0xa6, 0x94, 0xca, 0xe8, 0x04, 0x10, 0x81, 0x92, 0xae, 0x03, 0x6e, 0x34,
+  0xe3, 0x65, 0x92, 0xe4, 0x36, 0xf6, 0x58, 0xe9, 0x59, 0x09, 0xb0, 0x07,
+  0x2f, 0x80, 0x12, 0xd7, 0xa8, 0x94, 0x08, 0xf1, 0xd5, 0x92, 0x89, 0x97,
+  0x7a, 0x40, 0x8d, 0x6a, 0x29, 0x3a, 0x99, 0x0c, 0x97, 0x53, 0xc5, 0x14,
+  0x30, 0x0d, 0xee, 0xea, 0x54, 0x49, 0xf5, 0x57, 0x88, 0x32, 0x94, 0x74,
+  0x39, 0x19, 0xfe, 0xd1, 0x07, 0x57, 0xa9, 0xb0, 0xbb, 0xe3, 0x68, 0x55,
+  0x72, 0x98, 0xb7, 0x70, 0x22, 0xf6, 0xda, 0xca, 0xe9, 0x27, 0xb5, 0xc6,
+  0x63, 0x81, 0xd6, 0x59, 0x2e, 0xa9, 0x54, 0xa3, 0x45, 0x6f, 0x12, 0x23,
+  0x34, 0xa9, 0x57, 0x58, 0x2e, 0x09, 0xa1, 0x72, 0x05, 0xae, 0x8f, 0x2f,
+  0xa3, 0xb7, 0xb1, 0xb4, 0x1b, 0x8a, 0xd6, 0x81, 0x03, 0xbf, 0xdc, 0xdb,
+  0xde, 0xdd, 0x58, 0xa9, 0x87, 0xd7, 0xe1, 0xb6, 0xe8, 0x5b, 0x59, 0x1e,
+  0x4a, 0x58, 0xbf, 0x5e, 0x82, 0xd9, 0xac, 0x38, 0x3e, 0xf0, 0xa5, 0x8f,
+  0xe7, 0x17, 0x6f, 0x4e, 0xce, 0x8e, 0xfe, 0x62, 0x50, 0x23, 0x70, 0x13,
+  0xb4, 0xf2, 0xf8, 0x23, 0x98, 0xaf, 0x8f, 0x1f, 0xcb, 0x04, 0xe6, 0x5c,
+  0xad, 0xef, 0x6e, 0x60, 0xe5, 0x9e, 0xd7, 0x14, 0x72, 0x9a, 0xd4, 0xb1,
+  0x36, 0xb8, 0x7e, 0x60, 0x05, 0x60, 0x94, 0x71, 0x50, 0x6e, 0xf5, 0x77,
+  0xa4, 0xeb, 0x88, 0xb4, 0x4d, 0xb0, 0x3c, 0xcb, 0x69, 0x9c, 0x12, 0x0b,
+  0xac, 0x1c, 0xd7, 0xe6, 0xfa, 0x15, 0x5a, 0x08, 0xec, 0x91, 0x8e, 0x52,
+  0xb4, 0x56, 0xe4, 0x5a, 0xa7, 0x18, 0x86, 0x9f, 0xd4, 0x61, 0x29, 0xa9,
+  0x78, 0x17, 0x7f, 0xb1, 0x3a, 0xac, 0x5c, 0xe7, 0xfd, 0x15, 0x09, 0x8b,
+  0x64, 0x96, 0x25, 0x55, 0x4f, 0x26, 0x76, 0x08, 0x7f, 0xbe, 0xbe, 0x8b,
+  0x67, 0x5e, 0x49, 0x38, 0xf6, 0x54, 0x54, 0xca, 0x34, 0xac, 0x08, 0xdf,
+  0x74, 0x3a, 0xae, 0x0c, 0x4c, 0xeb, 0x11, 0x7d, 0x12, 0xae, 0x8a, 0xd7,
+  0x61, 0xe4, 0xfa, 0xfa, 0x2f, 0x97, 0x27, 0xaf, 0x0f, 0x91, 0x91, 0x7d,
+  0x89, 0xb5, 0x27, 0x65, 0x8d, 0xaf, 0x45, 0xd8, 0xc3, 0xdd, 0x5b, 0xc3,
+  0x0f, 0x6f, 0x4e, 0x07, 0x97, 0x67, 0x17, 0xc7, 0xaf, 0x0f, 0x7f, 0x40,
+  0x9b, 0x12, 0x84, 0xc7, 0xa3, 0xf3, 0xae, 0xf9, 0x99, 0xe9, 0xa2, 0xe0,
+  0x03, 0x8a, 0x9c, 0x7c, 0xff, 0xf1, 0xe4, 0xfc, 0xbb, 0xd7, 0x87, 0x77,
+  0x71, 0xd1, 0xc5, 0xf5, 0xf1, 0xdb, 0x2d, 0x0d, 0x4b, 0x6b, 0xa4, 0x86,
+  0xea, 0xf9, 0x70, 0x76, 0x5b, 0xa6, 0x3f, 0x27, 0x11, 0xbc, 0x3e, 0x5b,
+  0xfa, 0x30, 0xe6, 0xd7, 0x8c, 0xc3, 0x00, 0x9b, 0x81, 0x7f, 0x8b, 0xbe,
+  0x3e, 0xfb, 0x16, 0xa1, 0x72, 0x8d, 0x9f, 0x74, 0xce, 0x7d, 0x97, 0xa2,
+  0x2f, 0xf7, 0xb7, 0x77, 0x36, 0x6c, 0xb7, 0x4f, 0x82, 0xda, 0x86, 0x19,
+  0xdf, 0x7a, 0x55, 0x53, 0x3f, 0x4b, 0xfd, 0x97, 0xad, 0x65, 0xa8, 0xac,
+  0x45, 0xc5, 0xe5, 0x07, 0xe2, 0x72, 0xa2, 0xe4, 0x7c, 0xca, 0x7f, 0xc5,
+  0x66, 0xa9, 0x05, 0xa5, 0xad, 0x7b, 0x1e, 0xb7, 0xeb, 0xb7, 0x0e, 0xc6,
+  0xcd, 0xd7, 0x96, 0xf4, 0x60, 0x3a, 0xe2, 0xb5, 0x5b, 0x29, 0x1f, 0x3f,
+  0x61, 0x2c, 0xa7, 0x69, 0x52, 0xd2, 0x66, 0x83, 0x48, 0x13, 0xfa, 0x09,
+  0xef, 0xb3, 0x93, 0xe3, 0x43, 0x15, 0x60, 0x39, 0x63, 0x33, 0xd2, 0x2a,
+  0x95, 0xf0, 0x14, 0x52, 0xe0, 0x09, 0x1f, 0x5e, 0x3a, 0xc7, 0xda, 0xe3,
+  0xa4, 0x8c, 0xd4, 0xbf, 0xe3, 0x78, 0x6f, 0x66, 0xc9, 0x34, 0x1e, 0x3d,
+  0x1a, 0x84, 0x69, 0x3a, 0x90, 0x71, 0xf3, 0x76, 0x92, 0x87, 0x6f, 0x84,
+  0xc6, 0x1c, 0x88, 0xe0, 0x29, 0xb1, 0x67, 0x86, 0x52, 0x81, 0xeb, 0x6a,
+  0x9c, 0x3e, 0x3c, 0x35, 0x03, 0x16, 0xa3, 0xe2, 0x12, 0x37, 0xb5, 0x29,
+  0x9d, 0xeb, 0x5b, 0xdc, 0xa0, 0x3e, 0x24, 0x1b, 0x6a, 0x47, 0xbc, 0x72,
+  0x4f, 0xf7, 0xea, 0x1e, 0xf3, 0x9f, 0xe9, 0x92, 0x23, 0x0a, 0x17, 0x39,
+  0x65, 0x0f, 0xf1, 0xaf, 0x61, 0x1c, 0x7e, 0x6a, 0xcf, 0x45, 0x6e, 0x0b,
+  0x6e, 0x37, 0xcd, 0x4d, 0x0f, 0x70, 0xd9, 0xa6, 0xbe, 0x40, 0xda, 0xda,
+  0x20, 0x9c, 0x7b, 0x65, 0xdd, 0xe9, 0x61, 0x8c, 0x3b, 0xe3, 0xd4, 0x06,
+  0xf2, 0x64, 0x61, 0x85, 0x94, 0xd1, 0x32, 0x9e, 0x29, 0xd0, 0xc5, 0xdf,
+  0x07, 0x1c, 0x9b, 0x92, 0x8c, 0x70, 0x88, 0x63, 0x21, 0x4b, 0x44, 0x9d,
+  0x04, 0x76, 0xea, 0x4b, 0x8d, 0xfa, 0x50, 0xe7, 0xa3, 0x5c, 0x90, 0xd7,
+  0xe8, 0x21, 0x46, 0x92, 0x29, 0x7d, 0x18, 0x0e, 0xce, 0x6e, 0x57, 0xc7,
+  0x01, 0x27, 0x68, 0x60, 0x48, 0xcd, 0xc0, 0x4a, 0xc3, 0x34, 0x4b, 0xd5,
+  0x4a, 0xb1, 0x08, 0x92, 0xcc, 0x74, 0x0b, 0x3c, 0x1b, 0xc0, 0x22, 0x70,
+  0xaa, 0xf6, 0x14, 0x10, 0x9c, 0x57, 0x26, 0xe9, 0x08, 0x34, 0xa1, 0xf5,
+  0x39, 0x2e, 0x44, 0xfa, 0x13, 0x70, 0x33, 0x88, 0xb6, 0x86, 0xed, 0x0d,
+  0x29, 0x05, 0x63, 0xe2, 0x08, 0x22, 0xa1, 0x48, 0x26, 0x31, 0x2c, 0x43,
+  0x63, 0x37, 0x02, 0xd5, 0xc7, 0x15, 0x27, 0xf1, 0x37, 0x45, 0x14, 0x82,
+  0x8a, 0x6b, 0xea, 0x7c, 0x6d, 0x04, 0x29, 0x73, 0xa6, 0x4e, 0x74, 0xeb,
+  0x3d, 0xdb, 0x22, 0x2c, 0xad, 0x8c, 0xca, 0x16, 0x80, 0xdc, 0x31, 0xc0,
+  0xe7, 0x06, 0xb8, 0x8d, 0x5d, 0x9f, 0x4a, 0x1f, 0x42, 0x11, 0xf8, 0xb1,
+  0x4d, 0x2e, 0xfd, 0x54, 0x16, 0x94, 0x06, 0x4a, 0xcf, 0xbd, 0xc1, 0xb2,
+  0xe4, 0xde, 0x1d, 0xcc, 0xda, 0x1d, 0x66, 0xc0, 0x4f, 0xe9, 0xed, 0x06,
+  0x9b, 0x09, 0xeb, 0xd5, 0xa2, 0xc3, 0xef, 0x4e, 0xae, 0x06, 0xa7, 0x17,
+  0xe7, 0x5f, 0x06, 0xcd, 0x61, 0xf9, 0xa5, 0x69, 0xf5, 0xa6, 0x95, 0xae,
+  0xb6, 0x1d, 0x17, 0x7a, 0xc1, 0xd4, 0xd7, 0xc2, 0x5d, 0x9d, 0xd2, 0x0c,
+  0x1f, 0xf1, 0xba, 0x7c, 0x8d, 0x92, 0x45, 0x45, 0xfa, 0x92, 0xda, 0xd2,
+  0xb4, 0x4b, 0x14, 0xb7, 0xa0, 0x3e, 0x30, 0x64, 0xc3, 0x61, 0xa9, 0x9b,
+  0xd8, 0x76, 0xe6, 0x6f, 0x3b, 0x01, 0x98, 0x37, 0xfe, 0xcd, 0xae, 0xb7,
+  0x41, 0xe1, 0x84, 0x1d, 0x27, 0x5e, 0xbe, 0x5c, 0x70, 0x95, 0x24, 0x82,
+  0x99, 0x30, 0xf0, 0x91, 0xbb, 0x00, 0xaf, 0x6f, 0x43, 0x7f, 0xab, 0xfe,
+  0x22, 0x3c, 0x7c, 0xb7, 0xed, 0x54, 0xb0, 0x98, 0xe7, 0xb6, 0x43, 0xcf,
+  0x6d, 0xfb, 0xcf, 0xed, 0x84, 0x9e, 0xdb, 0xf1, 0x9f, 0xdb, 0x0d, 0x3d,
+  0xe7, 0xac, 0xd7, 0x31, 0xe3, 0x65, 0xe7, 0x56, 0x59, 0xc6, 0xb5, 0x7f,
+  0xed, 0xf6, 0xed, 0xf1, 0x7f, 0x66, 0xbc, 0x15, 0xcd, 0x46, 0xb5, 0x8e,
+  0x61, 0xaf, 0x76, 0x7d, 0xbb, 0x59, 0xaf, 0x7c, 0x5a, 0x87, 0x03, 0x35,
+  0xb1, 0xe1, 0x62, 0x86, 0xef, 0x6d, 0xef, 0xf6, 0x46, 0xe9, 0xe2, 0x06,
+  0xa5, 0xce, 0xa1, 0xb6, 0x76, 0xc3, 0xcd, 0xc7, 0xc5, 0xca, 0x2f, 0x96,
+  0x68, 0x92, 0xfb, 0x7a, 0xc8, 0xd9, 0x60, 0x23, 0x72, 0xf0, 0x8a, 0x04,
+  0xa2, 0x93, 0x5e, 0x89, 0xf8, 0x1d, 0x8b, 0x56, 0xe4, 0x3b, 0x98, 0xbd,
+  0x52, 0x17, 0xe3, 0xbe, 0x81, 0xf7, 0x64, 0x02, 0x4c, 0xba, 0x3a, 0x2b,
+  0x9d, 0xa6, 0x8c, 0xcd, 0xa8, 0xba, 0x1a, 0x7a, 0x6f, 0xba, 0x76, 0xa9,
+  0xc7, 0x85, 0xbe, 0xa2, 0x18, 0x77, 0xd8, 0x9b, 0x2d, 0x6b, 0xac, 0x8e,
+  0x87, 0x33, 0x2a, 0x77, 0x9e, 0x85, 0x44, 0xe5, 0x87, 0xab, 0x33, 0x4f,
+  0xb5, 0x8c, 0xd0, 0x35, 0x53, 0x1e, 0x6c, 0x6e, 0x52, 0x83, 0xf1, 0x9b,
+  0xf8, 0xe1, 0xa1, 0x5f, 0x26, 0x9b, 0xc0, 0x4f, 0xca, 0x4d, 0xf2, 0xf7,
+  0xca, 0xa7, 0x6f, 0xaa, 0xf9, 0x6c, 0x95, 0xa3, 0x36, 0x2d, 0x15, 0x53,
+  0x96, 0xb1, 0x18, 0xc7, 0x8c, 0xba, 0x60, 0x8b, 0xb4, 0xe9, 0x42, 0xf2,
+  0x01, 0x6b, 0xd2, 0x5d, 0xb3, 0xe1, 0x07, 0x77, 0x52, 0xa5, 0x3e, 0xce,
+  0xdb, 0x28, 0xfb, 0x48, 0x60, 0x1a, 0x88, 0x56, 0x36, 0x21, 0x39, 0xf3,
+  0xc1, 0x62, 0xe7, 0xe0, 0x0b, 0x58, 0x4f, 0x9b, 0x78, 0xe1, 0x0c, 0x03,
+  0x92, 0x53, 0x10, 0x28, 0x3e, 0xf9, 0x0a, 0x42, 0x7b, 0x56, 0xba, 0x81,
+  0x0f, 0x74, 0x0f, 0xc8, 0x92, 0x83, 0x6a, 0xc6, 0x27, 0x66, 0x9a, 0x98,
+  0x92, 0x87, 0xca, 0x3c, 0xa8, 0x1c, 0xf0, 0xdf, 0x2f, 0xfd, 0xa2, 0xf3,
+  0x88, 0x96, 0xe0, 0xa5, 0xee, 0xa1, 0xfe, 0x8f, 0x65, 0x5f, 0xbc, 0xff,
+  0xfc, 0x3d, 0xb7, 0x3d, 0x06, 0x99, 0x17, 0xc1, 0xf0, 0x11, 0x1d, 0x4b,
+  0x67, 0x70, 0x75, 0xd9, 0xe9, 0x4a, 0xb4, 0x1e, 0x3e, 0xd0, 0x83, 0x7f,
+  0x47, 0x64, 0x65, 0x62, 0x7b, 0x9d, 0xfd, 0x3d, 0x49, 0xac, 0xe3, 0x39,
+  0x72, 0x93, 0x39, 0x3f, 0x7c, 0x44, 0xbf, 0x34, 0xc9, 0x85, 0xdc, 0x85,
+  0xd6, 0x56, 0xa3, 0x82, 0x01, 0x58, 0x5f, 0x21, 0xa7, 0xfc, 0x74, 0x2d,
+  0xf0, 0x7a, 0x58, 0xad, 0x33, 0xb0, 0x8f, 0x40, 0x33, 0x34, 0xcd, 0x7e,
+  0x23, 0x40, 0x90, 0x17, 0xb7, 0xd2, 0x0a, 0x44, 0xc2, 0x1c, 0xcc, 0x5c,
+  0xbc, 0xee, 0xcb, 0x0d, 0x2f, 0xa2, 0x43, 0x8d, 0xec, 0x62, 0xd5, 0x65,
+  0xcb, 0x8e, 0x29, 0x0c, 0x5e, 0x4b, 0x8b, 0x61, 0xa5, 0x55, 0xd8, 0xb0,
+  0x6f, 0xb2, 0x25, 0x9e, 0x09, 0x8d, 0xd2, 0x18, 0xe4, 0x09, 0xac, 0x9a,
+  0xbd, 0xc6, 0xe9, 0xeb, 0xe6, 0x05, 0x8e, 0xdd, 0xec, 0x2b, 0x1e, 0x11,
+  0x59, 0x34, 0x5a, 0xa1, 0x8d, 0xdf, 0x6e, 0x90, 0x83, 0x45, 0x06, 0x6c,
+  0xab, 0x26, 0x53, 0x6c, 0x19, 0xe7, 0x40, 0xfa, 0x1a, 0x7c, 0x13, 0x36,
+  0x6d, 0xcf, 0xda, 0xe9, 0x87, 0x11, 0x36, 0x0d, 0x54, 0x2f, 0xb4, 0xd9,
+  0x2b, 0xca, 0xf8, 0x9e, 0x5c, 0xbf, 0xbb, 0x7c, 0xfa, 0x58, 0x30, 0x3f,
+  0x9b, 0x08, 0x5f, 0x13, 0x58, 0xa3, 0x67, 0xed, 0x81, 0x6c, 0xc1, 0xaf,
+  0xdc, 0x01, 0xf1, 0x48, 0x37, 0x49, 0x1a, 0x37, 0xc2, 0x77, 0x95, 0x7d,
+  0x8a, 0x7d, 0xa9, 0x6d, 0x0c, 0x0a, 0xe0, 0xb0, 0xd8, 0x0a, 0x04, 0x14,
+  0x1c, 0x8d, 0x83, 0x34, 0x0c, 0xe5, 0xa3, 0x4f, 0xd6, 0x6c, 0x50, 0x00,
+  0x51, 0x02, 0x0b, 0x38, 0x88, 0x76, 0x49, 0xf1, 0x31, 0x93, 0xd0, 0x1d,
+  0x2b, 0x9f, 0x20, 0xdb, 0x81, 0x3f, 0x5f, 0x33, 0x12, 0x09, 0x74, 0x4a,
+  0x95, 0x52, 0xf6, 0xd1, 0x44, 0x9c, 0x0b, 0xdf, 0x18, 0xee, 0x23, 0x5e,
+  0xdd, 0x8f, 0xc2, 0xd6, 0x48, 0x45, 0x43, 0x56, 0x41, 0xb0, 0x9c, 0x29,
+  0x36, 0x77, 0x88, 0x09, 0x68, 0x15, 0x23, 0x11, 0x25, 0xb5, 0xa5, 0x69,
+  0x76, 0x48, 0x6a, 0xee, 0x3b, 0x0c, 0x03, 0x77, 0x1c, 0xdb, 0x69, 0xab,
+  0xb7, 0x57, 0x75, 0xd1, 0x06, 0x64, 0x1b, 0x35, 0x25, 0x31, 0x2a, 0xa7,
+  0xec, 0x9a, 0x67, 0x59, 0x3c, 0x55, 0x6b, 0xed, 0x2b, 0x22, 0xa8, 0x1f,
+  0xfd, 0xca, 0xc3, 0xda, 0xfe, 0x3f, 0xec, 0xb0, 0xb6, 0xff, 0x6f, 0x38,
+  0xac, 0x9d, 0x5f, 0x79, 0x58, 0x3b, 0xff, 0x87, 0x1d, 0xd6, 0xce, 0xff,
+  0x0d, 0x87, 0xb5, 0xfb, 0x2b, 0x0f, 0x6b, 0xf7, 0x37, 0x3f, 0xac, 0x73,
+  0xfc, 0x3d, 0x49, 0x09, 0xd5, 0x29, 0xd3, 0xb2, 0xa9, 0x72, 0x0d, 0x1f,
+  0xa9, 0xb5, 0xfd, 0x10, 0x37, 0x44, 0xcc, 0x11, 0x51, 0x55, 0xcb, 0xa6,
+  0x4d, 0x76, 0x54, 0x19, 0xd4, 0x2a, 0xd3, 0x7f, 0x45, 0x02, 0x5c, 0x82,
+  0x85, 0x8f, 0xfa, 0xd4, 0xd7, 0x39, 0xfa, 0x67, 0x40, 0xef, 0xe8, 0x46,
+  0xe7, 0x83, 0x01, 0x27, 0x35, 0x0d, 0x28, 0x30, 0xdb, 0x3c, 0x2c, 0x74,
+  0x75, 0x92, 0x05, 0xb5, 0x8e, 0x4a, 0xe9, 0x05, 0xcc, 0xd0, 0x32, 0x17,
+  0x7e, 0x6f, 0x1e, 0x8f, 0xf0, 0xc7, 0x5b, 0xfd, 0x6d, 0xbb, 0x39, 0x1b,
+  0xbf, 0x00, 0x66, 0xce, 0x46, 0x4d, 0x83, 0xb6, 0x7d, 0x00, 0x10, 0x1e,
+  0xf3, 0x40, 0x50, 0x07, 0xae, 0x1f, 0xcd, 0x83, 0x40, 0xca, 0xa9, 0xd9,
+  0xd4, 0x0e, 0x3d, 0x4e, 0xfd, 0xe5, 0x24, 0xf0, 0x4d, 0x44, 0xad, 0xee,
+  0x59, 0xca, 0xf0, 0x60, 0x94, 0x24, 0x5f, 0xfa, 0x35, 0x43, 0x83, 0xe9,
+  0x14, 0x91, 0xf6, 0x7e, 0x69, 0xdc, 0xda, 0x89, 0x11, 0xff, 0xb7, 0xc5,
+  0xad, 0x9f, 0x65, 0x7d, 0xbb, 0x57, 0xa6, 0xe8, 0x69, 0xe3, 0xb6, 0x30,
+  0x3a, 0xbc, 0x75, 0x5b, 0x62, 0x9d, 0x11, 0x01, 0x47, 0x8e, 0x99, 0x74,
+  0x30, 0x8f, 0xe7, 0x44, 0xde, 0xb5, 0xd1, 0x43, 0x36, 0x92, 0x7c, 0x74,
+  0xa7, 0x5c, 0x73, 0xfa, 0x0d, 0x9e, 0x91, 0x02, 0x67, 0xf0, 0x2a, 0x4b,
+  0xa6, 0xb8, 0x65, 0xa6, 0x9f, 0xb1, 0x08, 0x14, 0x84, 0xac, 0xe6, 0x25,
+  0x37, 0x8c, 0x12, 0xc6, 0xdd, 0x4a, 0x9f, 0xd2, 0xa0, 0x5f, 0xd4, 0xd7,
+  0x1b, 0x8f, 0x92, 0x5e, 0x5c, 0x8e, 0xd2, 0x34, 0xdc, 0x38, 0x56, 0xa3,
+  0xcc, 0x98, 0xd6, 0x43, 0xf1, 0x01, 0x78, 0x3e, 0xc2, 0x88, 0x9e, 0xf6,
+  0x81, 0x47, 0x7e, 0x48, 0x48, 0x54, 0x38, 0xdd, 0x7c, 0x59, 0x4d, 0x73,
+  0x0d, 0x15, 0x74, 0x03, 0x6e, 0x47, 0x8c, 0xf9, 0xd1, 0x11, 0xc3, 0xe9,
+  0x8c, 0x8a, 0x74, 0x41, 0x28, 0xb7, 0x6e, 0xd3, 0xb9, 0xae, 0xe9, 0xc9,
+  0x4e, 0xae, 0x3c, 0x89, 0xcd, 0x72, 0x8b, 0xf2, 0x0f, 0x9e, 0xf9, 0xdb,
+  0xe9, 0x75, 0xd0, 0x69, 0x6a, 0x7a, 0x75, 0xc1, 0xbb, 0x88, 0x4d, 0xee,
+  0x44, 0x45, 0x23, 0x85, 0x54, 0x6a, 0x09, 0xf2, 0x6b, 0x90, 0x04, 0x48,
+  0xe8, 0x51, 0xf1, 0xaf, 0xa9, 0x1d, 0x89, 0x06, 0x3f, 0x51, 0x00, 0xc0,
+  0x1d, 0x44, 0xe7, 0x7d, 0x2e, 0x38, 0x20, 0x37, 0xc9, 0x03, 0x57, 0xa9,
+  0xfa, 0x06, 0x1d, 0xc3, 0x26, 0x62, 0xb4, 0x56, 0x02, 0xf3, 0x47, 0x83,
+  0xe3, 0xd3, 0xd3, 0x5a, 0x4d, 0x2b, 0x6e, 0x1e, 0x83, 0xe7, 0x12, 0xf0,
+  0x48, 0x89, 0x20, 0xc2, 0x18, 0x12, 0x0e, 0xc5, 0xf8, 0xb9, 0x13, 0x25,
+  0x5c, 0x3f, 0x8a, 0xeb, 0x00, 0x27, 0x48, 0xb5, 0x4f, 0x68, 0x2c, 0x66,
+  0x4d, 0x06, 0xd3, 0x4c, 0x11, 0xda, 0xed, 0x66, 0x39, 0x8f, 0xb3, 0x4f,
+  0x8f, 0x4b, 0x17, 0x2e, 0x15, 0x91, 0xdd, 0xe2, 0x7b, 0xe5, 0xc6, 0x91,
+  0x7d, 0x5a, 0x0b, 0xb4, 0xfd, 0xb8, 0x2c, 0xa4, 0x29, 0x24, 0xe3, 0xb4,
+  0x49, 0xdf, 0x0e, 0x58, 0x26, 0xa1, 0x68, 0xf2, 0xc8, 0xb0, 0x56, 0x0d,
+  0x4d, 0x33, 0x24, 0xbe, 0x30, 0x12, 0xbc, 0x33, 0x4d, 0x97, 0x23, 0x07,
+  0xe9, 0x56, 0xd6, 0xe2, 0x6d, 0x37, 0x45, 0x25, 0x7d, 0xe4, 0xf7, 0xbc,
+  0x01, 0xee, 0x05, 0x78, 0x92, 0xfe, 0xe5, 0x02, 0xb4, 0xdc, 0x00, 0xaa,
+  0xc3, 0xb1, 0x2d, 0xee, 0x9e, 0xbe, 0x04, 0xa4, 0x8b, 0x74, 0xfe, 0xd4,
+  0x09, 0x37, 0x86, 0x79, 0xc6, 0x4d, 0xaa, 0xc1, 0xbb, 0xfc, 0xbe, 0x94,
+  0x16, 0xc0, 0x9b, 0x71, 0x98, 0x98, 0x7b, 0xa6, 0xcb, 0x2c, 0x7d, 0xa0,
+  0x72, 0x11, 0x50, 0x25, 0x0e, 0xb1, 0x29, 0x4a, 0x4b, 0xc3, 0x8f, 0x63,
+  0x56, 0x6c, 0x22, 0xad, 0x7e, 0xa1, 0x55, 0x7c, 0x80, 0x97, 0x41, 0x65,
+  0x9c, 0x63, 0xf6, 0x10, 0x8f, 0xd1, 0x75, 0x91, 0xd7, 0x89, 0xad, 0x07,
+  0xb2, 0x8f, 0xb2, 0xa4, 0x42, 0xcb, 0x75, 0x65, 0xdc, 0xac, 0x1e, 0x8b,
+  0xbc, 0x26, 0xbc, 0xb1, 0x05, 0x96, 0x24, 0xac, 0xe8, 0xdf, 0xcd, 0xe1,
+  0x44, 0xa7, 0x00, 0xc0, 0x05, 0xec, 0xc6, 0x38, 0x99, 0x6d, 0xf3, 0x25,
+  0xf4, 0x23, 0x52, 0x9f, 0x9a, 0xbe, 0x84, 0x12, 0xa5, 0x4c, 0x77, 0x22,
+  0xdb, 0xdb, 0x2b, 0x6d, 0xc6, 0x3d, 0xa8, 0x7b, 0x94, 0x0d, 0x0e, 0x4b,
+  0xdf, 0x4d, 0x5f, 0x76, 0x37, 0x9a, 0x8c, 0xf5, 0x9d, 0x7e, 0xc7, 0xb5,
+  0x1e, 0x68, 0x84, 0x82, 0x98, 0xce, 0x90, 0xfc, 0x37, 0x35, 0x77, 0x62,
+  0xe6, 0x67, 0xf6, 0xdb, 0xc6, 0x5a, 0xcc, 0xea, 0xb0, 0x8c, 0x8c, 0xe2,
+  0xa7, 0xf8, 0xef, 0x63, 0x56, 0xef, 0xd9, 0x29, 0x5e, 0x5f, 0x84, 0x34,
+  0xcb, 0x6b, 0xaa, 0x2f, 0x4e, 0x74, 0xfb, 0x06, 0x7b, 0xad, 0xeb, 0xbc,
+  0x0a, 0x26, 0x44, 0xfb, 0x35, 0xcd, 0x1a, 0x6b, 0x74, 0x0b, 0xf2, 0xb2,
+  0xa6, 0x4d, 0x63, 0x2e, 0x51, 0xa3, 0x18, 0xd7, 0x16, 0x4b, 0xf9, 0xb0,
+  0x3d, 0x09, 0x66, 0x01, 0x9a, 0xd6, 0xce, 0x7c, 0xb0, 0xdc, 0x14, 0x5e,
+  0x2a, 0x86, 0x3d, 0xdc, 0xde, 0x74, 0x56, 0xab, 0xca, 0x10, 0x47, 0xb0,
+  0x16, 0x82, 0xad, 0x83, 0xb2, 0xce, 0x4a, 0x1b, 0x5f, 0x1e, 0x6c, 0x2d,
+  0xa2, 0xc0, 0xef, 0xed, 0xa0, 0xe0, 0x41, 0xf0, 0xa8, 0x7a, 0x7a, 0x1c,
+  0x72, 0x8e, 0xf5, 0x58, 0xb1, 0x53, 0x31, 0x12, 0xb7, 0xa1, 0x6a, 0x27,
+  0xdc, 0xf0, 0x34, 0x73, 0xc9, 0xdd, 0x8b, 0x9d, 0x49, 0x7b, 0x31, 0x61,
+  0x4b, 0xd1, 0x91, 0x60, 0xd6, 0x27, 0xe8, 0x48, 0x6d, 0x7e, 0xa7, 0xef,
+  0x7e, 0x87, 0x4b, 0x71, 0x36, 0x3c, 0x78, 0xb8, 0xc7, 0x66, 0xef, 0x73,
+  0xf3, 0x6d, 0x9c, 0xa7, 0x56, 0x9c, 0xcb, 0xcc, 0x28, 0x75, 0x19, 0xf3,
+  0xb6, 0x29, 0xad, 0xc1, 0xbf, 0x89, 0x04, 0x81, 0x60, 0x8d, 0x3c, 0x82,
+  0xaf, 0x95, 0x2e, 0x45, 0x9c, 0xcf, 0x2d, 0x1c, 0x8d, 0x31, 0x6a, 0x65,
+  0xb5, 0x18, 0x2a, 0x66, 0xe0, 0x52, 0xcf, 0x0f, 0x4a, 0xdd, 0x13, 0x83,
+  0xad, 0xb2, 0xdc, 0x82, 0x44, 0xe4, 0x68, 0xfe, 0x75, 0x36, 0x8d, 0x08,
+  0xb1, 0xb3, 0x51, 0xae, 0x1d, 0x58, 0xda, 0xba, 0xbd, 0x08, 0x96, 0x7f,
+  0x74, 0x82, 0x6f, 0xf8, 0x83, 0xfd, 0x59, 0xfa, 0x23, 0xa5, 0x6e, 0xaf,
+  0xd1, 0x7b, 0xba, 0x0c, 0x4d, 0xba, 0x12, 0xca, 0x93, 0xc6, 0x11, 0x84,
+  0x1e, 0xd0, 0x97, 0x36, 0x5a, 0xa8, 0xb4, 0xab, 0x9a, 0x19, 0x75, 0xa6,
+  0xb3, 0x7c, 0x38, 0x84, 0x85, 0x77, 0x1c, 0xa5, 0x14, 0xbe, 0xec, 0x79,
+  0xaa, 0xdd, 0x79, 0x80, 0x65, 0x35, 0x25, 0x63, 0xba, 0xcb, 0x59, 0x6f,
+  0xd2, 0x7a, 0x01, 0x05, 0xb2, 0x86, 0x10, 0xe4, 0xfb, 0x8a, 0xb4, 0x1e,
+  0x90, 0x33, 0x92, 0x7f, 0x2f, 0x84, 0x81, 0x0b, 0xab, 0x05, 0x15, 0xa8,
+  0x58, 0x12, 0x7f, 0xaa, 0x13, 0xe4, 0x4c, 0xc6, 0xa8, 0x2d, 0x19, 0xb7,
+  0xd6, 0xe8, 0xaa, 0xab, 0x7d, 0x0e, 0xd3, 0xd2, 0x8f, 0xde, 0xd0, 0x2e,
+  0xd4, 0x17, 0xd4, 0xf9, 0x07, 0xfe, 0xb1, 0xdd, 0xc5, 0xff, 0xee, 0xfc,
+  0xb3, 0x43, 0x01, 0x9e, 0x83, 0xcd, 0xcd, 0xfb, 0xfb, 0xfb, 0xbe, 0xc2,
+  0x15, 0xc2, 0x91, 0x7d, 0xe6, 0xd7, 0x15, 0x22, 0xca, 0x5b, 0xcb, 0x07,
+  0xae, 0xa3, 0x4e, 0x3a, 0x9f, 0xfe, 0x75, 0xbb, 0xb7, 0xbd, 0xb5, 0xb5,
+  0xf5, 0x53, 0x7f, 0x81, 0x5b, 0x3c, 0xa1, 0x61, 0xe1, 0xbf, 0xee, 0xb0,
+  0x9b, 0x3c, 0x93, 0xcd, 0x20, 0xa0, 0xac, 0x6c, 0xa4, 0x41, 0x88, 0xc9,
+  0xb8, 0x29, 0x08, 0x13, 0xf2, 0x81, 0xc3, 0x64, 0x38, 0x4e, 0x1d, 0xb7,
+  0x57, 0xe9, 0x73, 0x7f, 0x3e, 0x0c, 0x50, 0xec, 0xef, 0xee, 0xec, 0x44,
+  0xac, 0x72, 0x70, 0xf1, 0x1b, 0xa7, 0x4a, 0x20, 0xee, 0x81, 0x34, 0x30,
+  0x67, 0x59, 0x86, 0xe0, 0x8e, 0x31, 0x87, 0x82, 0x80, 0x36, 0x5a, 0x12,
+  0x46, 0x39, 0x33, 0x01, 0x01, 0x1e, 0x81, 0xfb, 0xe4, 0xe3, 0x47, 0x3b,
+  0x30, 0x50, 0x79, 0x81, 0xbc, 0x95, 0x7b, 0x8d, 0x1a, 0x14, 0xc9, 0xb8,
+  0x0c, 0x69, 0x6d, 0xa6, 0x90, 0x8d, 0x84, 0x1c, 0x81, 0xf0, 0x66, 0xb9,
+  0xb4, 0xd1, 0xa6, 0xbc, 0x80, 0xc9, 0xb2, 0x90, 0x1e, 0x4a, 0x94, 0x46,
+  0x71, 0x1f, 0x3f, 0xd6, 0x84, 0x3d, 0xec, 0xf8, 0x21, 0xfc, 0xc7, 0x73,
+  0x83, 0x9b, 0xf2, 0x5c, 0xe9, 0x01, 0x3d, 0x49, 0xaa, 0xd1, 0x8d, 0x87,
+  0x29, 0x4f, 0xec, 0x1b, 0x55, 0xf7, 0x1b, 0x58, 0x8d, 0x81, 0x6c, 0x6f,
+  0xeb, 0x2f, 0x69, 0xab, 0x7e, 0x61, 0x50, 0xec, 0x26, 0x42, 0x75, 0x0f,
+  0xdc, 0x6e, 0x9e, 0x79, 0x62, 0x1b, 0x76, 0xa8, 0xe9, 0x71, 0x4a, 0x19,
+  0xa9, 0x69, 0xa9, 0x55, 0xc9, 0xa3, 0x9b, 0x64, 0x2e, 0xfc, 0x72, 0x5d,
+  0x13, 0x32, 0x3b, 0x42, 0x84, 0x1d, 0x5f, 0xa4, 0x75, 0x26, 0xf2, 0x1b,
+  0x58, 0xcc, 0x86, 0x54, 0xf5, 0x1a, 0x29, 0x27, 0xad, 0x96, 0xa6, 0x4b,
+  0xb4, 0x1a, 0x87, 0xb1, 0x88, 0x13, 0x2d, 0x37, 0x6f, 0xcb, 0x9b, 0x46,
+  0x9e, 0x98, 0x14, 0x24, 0xc5, 0xd0, 0xff, 0xd2, 0x13, 0xdd, 0x47, 0x84,
+  0x2a, 0xa5, 0xaf, 0xc0, 0x8d, 0x7d, 0x73, 0x7a, 0x7c, 0x4d, 0x25, 0xb6,
+  0x5d, 0x2a, 0xc6, 0xe9, 0x52, 0x5d, 0xad, 0xdf, 0x06, 0xeb, 0x92, 0xfc,
+  0x23, 0x44, 0xa8, 0x12, 0xab, 0x8a, 0x6d, 0x02, 0x9f, 0xc5, 0x38, 0xd7,
+  0x2a, 0x39, 0xa7, 0x81, 0x59, 0x20, 0x33, 0xb9, 0xa6, 0x25, 0x9a, 0xb4,
+  0xc7, 0xbd, 0xfd, 0xfe, 0x16, 0xaf, 0xd1, 0x76, 0xd8, 0xd6, 0x3a, 0x30,
+  0x72, 0x23, 0x69, 0xfc, 0x32, 0x0e, 0x67, 0x24, 0x98, 0xe9, 0x74, 0x23,
+  0xc6, 0x56, 0x67, 0xa0, 0x06, 0xfd, 0xad, 0x93, 0x8b, 0xb9, 0x52, 0x33,
+  0x75, 0xa1, 0x55, 0x91, 0x2c, 0x1b, 0xa0, 0xd8, 0x18, 0x79, 0xcb, 0x4d,
+  0x0d, 0xa7, 0xa0, 0xb8, 0x84, 0x8a, 0xf1, 0x88, 0x26, 0x22, 0xf1, 0x60,
+  0x55, 0x49, 0xd6, 0xb5, 0x9d, 0xad, 0x72, 0x94, 0x02, 0x22, 0xb1, 0xa4,
+  0xba, 0xa9, 0xd6, 0x08, 0x36, 0xa4, 0x9f, 0x78, 0x0d, 0xc3, 0x7a, 0x5f,
+  0x0b, 0xae, 0x2d, 0xeb, 0xc9, 0xa1, 0xc2, 0x32, 0x3c, 0xca, 0x0d, 0xcd,
+  0xa1, 0x65, 0xbb, 0x55, 0x15, 0xce, 0x3e, 0xba, 0x0b, 0xf9, 0xd8, 0xab,
+  0x66, 0xcb, 0x77, 0xb8, 0xa2, 0x3d, 0x1f, 0x0b, 0x73, 0x44, 0xc9, 0x56,
+  0x8f, 0xa6, 0x33, 0x61, 0x2c, 0x2b, 0x24, 0x4a, 0x20, 0x63, 0x8f, 0xfc,
+  0x53, 0x9d, 0x2f, 0x30, 0x8a, 0xf4, 0xfa, 0xa8, 0x53, 0xbb, 0x91, 0xa1,
+  0xde, 0x58, 0x25, 0x73, 0xb7, 0xba, 0x25, 0x23, 0x3c, 0x0d, 0xf9, 0x7e,
+  0xf2, 0x50, 0xb1, 0xdc, 0x9f, 0x50, 0x7f, 0xeb, 0x6c, 0x77, 0x27, 0x2a,
+  0x1f, 0x41, 0x89, 0x98, 0xbb, 0x9b, 0xd0, 0x6c, 0x67, 0x1e, 0x8c, 0x9c,
+  0xd5, 0xfa, 0x00, 0x32, 0xdf, 0xfa, 0x80, 0xaf, 0x1c, 0xd1, 0x2b, 0xd2,
+  0x39, 0x4c, 0xb3, 0x01, 0xdd, 0x1a, 0x79, 0x75, 0x7b, 0x36, 0xa8, 0x05,
+  0xb3, 0xb1, 0x99, 0x8b, 0x0d, 0x67, 0x71, 0x76, 0x6b, 0xd2, 0xb6, 0x79,
+  0xa4, 0x2e, 0x36, 0x9f, 0xe5, 0x3a, 0x55, 0xfb, 0x43, 0x49, 0x0f, 0x24,
+  0xc9, 0xe8, 0xf5, 0x68, 0x43, 0xbd, 0x74, 0x1e, 0x17, 0x58, 0xc0, 0x48,
+  0x7b, 0x26, 0xa9, 0xd5, 0xee, 0x99, 0x98, 0x96, 0x66, 0x2c, 0xcd, 0xdf,
+  0x51, 0xbe, 0x3c, 0x3f, 0xe7, 0x8b, 0x30, 0x8e, 0xe0, 0x33, 0xaa, 0x90,
+  0xe6, 0xa7, 0xb7, 0xf4, 0x9b, 0xfb, 0xed, 0x22, 0xf7, 0x06, 0x66, 0x19,
+  0xb8, 0x36, 0xfc, 0xf7, 0x40, 0x23, 0x86, 0x6d, 0xfc, 0xdb, 0x48, 0x0f,
+  0xd3, 0x52, 0xdd, 0xc4, 0x18, 0xdd, 0x26, 0xb9, 0xac, 0xde, 0xd9, 0xb8,
+  0x66, 0x28, 0x7e, 0xdf, 0x8f, 0x2e, 0xac, 0x39, 0x99, 0x75, 0x09, 0x70,
+  0xb7, 0x2a, 0x46, 0x62, 0x4c, 0xd2, 0xdf, 0x25, 0x31, 0x34, 0x9e, 0x85,
+  0x76, 0x80, 0x7a, 0xc6, 0xa5, 0x84, 0xf9, 0x5d, 0x86, 0x66, 0xa7, 0xe0,
+  0xe0, 0xc2, 0xe7, 0x60, 0x63, 0xb1, 0x69, 0x29, 0x27, 0x0a, 0xc4, 0x5e,
+  0xde, 0x37, 0x2f, 0x22, 0xdc, 0xad, 0x8e, 0xd3, 0x06, 0x4c, 0x9b, 0x5a,
+  0xfb, 0x78, 0x29, 0xa9, 0x02, 0x33, 0x90, 0x8b, 0x9c, 0xd9, 0x62, 0xbb,
+  0x4d, 0x00, 0x4b, 0xcb, 0xb3, 0xae, 0x87, 0x1e, 0x85, 0x81, 0x79, 0xf6,
+  0x38, 0x61, 0xc6, 0xe1, 0x5c, 0xba, 0x83, 0x9b, 0x16, 0xc3, 0x31, 0xbf,
+  0xa7, 0xb4, 0xe9, 0x7e, 0xf9, 0x89, 0x46, 0xc6, 0xdc, 0x69, 0x48, 0x0f,
+  0x03, 0xa8, 0xb0, 0xcb, 0x85, 0x82, 0xde, 0x92, 0x2e, 0x32, 0xbd, 0x91,
+  0x02, 0x66, 0x95, 0x72, 0x98, 0xb7, 0x74, 0x6d, 0xcc, 0x1b, 0x6c, 0x09,
+  0xe5, 0xf8, 0x3f, 0x04, 0x11, 0x0c, 0xd4, 0x4d, 0x4f, 0x5f, 0xc6, 0xdb,
+  0x48, 0x49, 0x8e, 0xb0, 0xc3, 0x04, 0x43, 0x8d, 0xd9, 0x42, 0x98, 0x8b,
+  0x69, 0x53, 0x9f, 0x51, 0x9f, 0x48, 0x32, 0xb6, 0xea, 0x73, 0x83, 0xec,
+  0x06, 0xe7, 0xe3, 0x23, 0x33, 0x8e, 0x19, 0xb8, 0xb7, 0xd4, 0x96, 0xca,
+  0xa6, 0x7d, 0xfa, 0x54, 0xe4, 0x48, 0x89, 0x89, 0xa4, 0xc0, 0xd1, 0x2c,
+  0x68, 0x76, 0xa9, 0x1b, 0x1f, 0x68, 0x59, 0xc5, 0x2b, 0x95, 0x0e, 0x1d,
+  0x8f, 0x2e, 0xa0, 0x30, 0xdc, 0x85, 0xbb, 0x94, 0xf7, 0x9e, 0xa1, 0xd2,
+  0x86, 0x45, 0x9a, 0x4c, 0x50, 0x03, 0xa1, 0x15, 0x49, 0x86, 0xaa, 0xe7,
+  0x35, 0x4a, 0x10, 0x55, 0x1b, 0x73, 0xdf, 0xe1, 0x1c, 0xb1, 0x3c, 0x39,
+  0x25, 0xcf, 0x11, 0xf3, 0x44, 0xd3, 0xe9, 0x8b, 0x21, 0xec, 0xb1, 0x12,
+  0x93, 0x16, 0x11, 0x6b, 0xc5, 0x54, 0x30, 0xfb, 0x93, 0xba, 0xbc, 0x8b,
+  0xc7, 0x13, 0xa9, 0x2b, 0xc3, 0x5b, 0x6c, 0x3a, 0x45, 0xd2, 0x17, 0x99,
+  0xad, 0x8a, 0x76, 0xe3, 0x34, 0x1b, 0x0b, 0xe3, 0x42, 0xe3, 0x2e, 0x7d,
+  0x9b, 0x14, 0x20, 0xff, 0xf2, 0x32, 0xfa, 0x6e, 0x5f, 0x93, 0x3c, 0xa5,
+  0xdf, 0xbd, 0xa8, 0x22, 0xa6, 0xa4, 0x96, 0x8a, 0x11, 0x78, 0xea, 0x5e,
+  0xf8, 0x82, 0x4b, 0x43, 0x98, 0x7b, 0xe9, 0xeb, 0xa2, 0x90, 0xb0, 0x91,
+  0x9e, 0x35, 0xaf, 0x1c, 0xfc, 0x04, 0xc8, 0x0f, 0xfe, 0x19, 0xee, 0x6d,
+  0x66, 0x5b, 0x54, 0x83, 0x76, 0x85, 0xc4, 0x82, 0xbe, 0x3c, 0x38, 0xcb,
+  0x61, 0x45, 0x4a, 0x0e, 0x48, 0x27, 0x33, 0xf1, 0xe8, 0x3a, 0x45, 0x77,
+  0x8f, 0xa4, 0xef, 0xf8, 0x2a, 0x20, 0x17, 0x42, 0x88, 0x5a, 0x63, 0xd1,
+  0xc7, 0x1b, 0xb9, 0x14, 0xa8, 0x47, 0x96, 0x37, 0xa8, 0x89, 0xa1, 0x86,
+  0x40, 0x46, 0x7e, 0x8b, 0x7a, 0xcf, 0xf2, 0xf1, 0xfc, 0xfa, 0xec, 0xbd,
+  0x98, 0xce, 0x96, 0xcd, 0x89, 0x56, 0x63, 0xcd, 0x62, 0x61, 0x3b, 0x4c,
+  0x55, 0x3e, 0xe2, 0x80, 0x6e, 0x86, 0x16, 0x2f, 0x32, 0xde, 0x05, 0x6e,
+  0x5b, 0x57, 0x32, 0x7d, 0x0a, 0x29, 0x8b, 0x13, 0xa3, 0x4b, 0x37, 0x35,
+  0xe0, 0xc9, 0x46, 0x22, 0x2c, 0xe9, 0xec, 0xc9, 0x55, 0x02, 0x12, 0x05,
+  0x18, 0xcd, 0x2a, 0xf8, 0x76, 0x94, 0x73, 0xca, 0x0f, 0x9d, 0x2f, 0xf3,
+  0x4a, 0x90, 0xc5, 0x70, 0x37, 0x8e, 0xe8, 0x4d, 0x7e, 0x9f, 0xf5, 0xce,
+  0xb0, 0xba, 0x39, 0x3a, 0xcb, 0xa7, 0xb0, 0x55, 0xe7, 0xa4, 0xb0, 0x34,
+  0x4f, 0xed, 0xc3, 0xe5, 0x79, 0xb4, 0x8e, 0x72, 0x37, 0xba, 0x34, 0x88,
+  0x76, 0xf8, 0xe4, 0x86, 0xd8, 0x17, 0x25, 0xeb, 0x24, 0x32, 0x9b, 0x6e,
+  0x74, 0xf2, 0xc3, 0xd1, 0xfb, 0xcb, 0xb3, 0x93, 0x1f, 0xd9, 0xc4, 0xf0,
+  0x96, 0x83, 0x3f, 0xfe, 0xca, 0xb1, 0xb9, 0x28, 0x42, 0x83, 0x19, 0x89,
+  0x30, 0x8f, 0x20, 0x9c, 0x0d, 0xd3, 0x27, 0xb3, 0x46, 0x25, 0xc1, 0xc1,
+  0xe0, 0xf2, 0xb4, 0xa7, 0x70, 0x74, 0xdc, 0x0b, 0x35, 0xcd, 0xd0, 0x40,
+  0x22, 0x79, 0x24, 0x6d, 0x54, 0xbe, 0xf5, 0x83, 0x51, 0x7a, 0x23, 0xba,
+  0xd1, 0xb9, 0x26, 0x3a, 0x76, 0xe9, 0xc4, 0xf1, 0x0a, 0xbe, 0x49, 0xa7,
+  0x14, 0x50, 0x6a, 0xa4, 0xa7, 0x21, 0x71, 0xd0, 0x14, 0x46, 0x5e, 0xb1,
+  0x10, 0xb5, 0xb0, 0xb3, 0x58, 0x7c, 0x65, 0x32, 0x63, 0xf7, 0x65, 0xab,
+  0x84, 0x24, 0x66, 0x40, 0xc7, 0x88, 0x55, 0x28, 0x5e, 0xa8, 0x4c, 0xaa,
+  0x52, 0x86, 0x8f, 0x6e, 0xef, 0x3c, 0x43, 0x23, 0x2c, 0x17, 0x44, 0x9b,
+  0x30, 0x6c, 0xff, 0x20, 0xea, 0xf4, 0x96, 0xd1, 0x41, 0xe7, 0x13, 0xaa,
+  0x08, 0xae, 0xa7, 0x37, 0xd0, 0x8a, 0x4b, 0xe2, 0x65, 0xea, 0x0a, 0x96,
+  0x06, 0x12, 0xe4, 0xaf, 0x56, 0x6f, 0x1b, 0x7b, 0xcc, 0xe1, 0xaa, 0x8b,
+  0xf4, 0xa5, 0xc2, 0xb7, 0x69, 0x00, 0x2c, 0x26, 0x23, 0xbe, 0x94, 0x70,
+  0xdc, 0x14, 0x34, 0xd4, 0x35, 0x60, 0x03, 0xec, 0xc6, 0x47, 0x16, 0xdf,
+  0xa1, 0xd8, 0xa4, 0x58, 0x50, 0xf9, 0x18, 0x74, 0xd5, 0x23, 0x8e, 0x41,
+  0x94, 0x98, 0xdf, 0xee, 0x0f, 0x47, 0x7b, 0xb5, 0xf6, 0xe5, 0x9a, 0xc4,
+  0x57, 0x3b, 0xa2, 0x54, 0x21, 0xaf, 0xee, 0xb0, 0x02, 0x8b, 0x8a, 0x31,
+  0xce, 0x1e, 0x6e, 0xfc, 0xda, 0xe1, 0x9a, 0xb6, 0xab, 0xd1, 0x27, 0x9b,
+  0x0c, 0x87, 0xde, 0x93, 0x10, 0x9f, 0xaa, 0xd5, 0x72, 0xfa, 0x92, 0xb9,
+  0x0e, 0x52, 0x73, 0x9c, 0x90, 0xf0, 0xe6, 0xae, 0x94, 0x8c, 0x20, 0xc9,
+  0x21, 0xc4, 0xa6, 0xca, 0x51, 0x9b, 0xb9, 0xcc, 0xf5, 0xdf, 0x74, 0xae,
+  0x4e, 0xe7, 0x66, 0x0c, 0x4a, 0xd8, 0x0e, 0x82, 0x43, 0x6e, 0xfe, 0xdb,
+  0xa6, 0x0f, 0x71, 0xe2, 0x2a, 0x1a, 0xc7, 0xa4, 0x09, 0x07, 0x0b, 0x14,
+  0xbb, 0x8d, 0xca, 0x3f, 0x8a, 0x6b, 0xf9, 0xee, 0xcb, 0xca, 0xe0, 0xa5,
+  0xe2, 0xc8, 0x6b, 0x05, 0x36, 0x87, 0xca, 0x6f, 0xa9, 0x63, 0x6c, 0x5e,
+  0xb4, 0xde, 0x54, 0x75, 0xed, 0x5a, 0xca, 0x63, 0x69, 0xab, 0xf9, 0x64,
+  0xa8, 0x4e, 0xd0, 0x83, 0xa2, 0x0e, 0x88, 0x6d, 0xd7, 0xf5, 0xb1, 0x72,
+  0xb8, 0x71, 0x9d, 0xb6, 0xac, 0x31, 0xd1, 0xa7, 0x7a, 0xac, 0x54, 0x8b,
+  0x90, 0x83, 0x18, 0xfd, 0x4e, 0x31, 0x6f, 0xbd, 0x37, 0xa2, 0xf8, 0xb2,
+  0xa9, 0x79, 0x41, 0x7b, 0xd5, 0x24, 0x6d, 0x93, 0xdd, 0x27, 0xaf, 0xee,
+  0xd4, 0x06, 0x43, 0xcc, 0xfc, 0xc2, 0xa9, 0xa5, 0xc1, 0xb0, 0xc8, 0x77,
+  0x72, 0xab, 0x4a, 0xdf, 0xce, 0x7a, 0x23, 0x81, 0x33, 0x37, 0x1e, 0x25,
+  0x85, 0x88, 0xec, 0x38, 0x14, 0x1b, 0x45, 0xc3, 0xf3, 0x9a, 0x34, 0x90,
+  0x92, 0x77, 0xbf, 0xec, 0x87, 0x54, 0x58, 0x69, 0x72, 0xc4, 0x21, 0x3b,
+  0x59, 0x11, 0x7b, 0xd8, 0x29, 0x9a, 0xa6, 0x43, 0x48, 0xde, 0x4e, 0xd7,
+  0x8c, 0x1d, 0x08, 0xad, 0x92, 0xf4, 0xd8, 0x2d, 0xc6, 0x14, 0xac, 0x78,
+  0x94, 0xc4, 0x1a, 0x6e, 0x0a, 0x9e, 0xdd, 0x6a, 0x76, 0x22, 0x8e, 0x9c,
+  0x3c, 0x24, 0xa3, 0x65, 0x55, 0x2f, 0xb0, 0x73, 0xe6, 0x24, 0xb0, 0x51,
+  0x34, 0xa5, 0x75, 0xba, 0x08, 0x6a, 0x8c, 0x5e, 0x2a, 0xe6, 0xcf, 0x41,
+  0x67, 0x43, 0x83, 0xb8, 0xb1, 0xe8, 0xf0, 0xfc, 0x8b, 0x50, 0x7c, 0x56,
+  0xa7, 0x5c, 0x24, 0xec, 0x51, 0xb5, 0xa9, 0x0a, 0xc1, 0xcf, 0x03, 0x8d,
+  0x16, 0xc1, 0xaf, 0xbf, 0x65, 0xdf, 0x9b, 0xf3, 0x71, 0xd3, 0x0b, 0x54,
+  0xdc, 0x72, 0xa5, 0x77, 0x95, 0xbd, 0x2f, 0x53, 0x53, 0x74, 0x60, 0x50,
+  0x77, 0x40, 0xdd, 0x64, 0xc8, 0xeb, 0xab, 0xba, 0xf9, 0x9e, 0x3b, 0xf4,
+  0xf4, 0xf2, 0xee, 0x85, 0xe3, 0xcd, 0x46, 0x89, 0x47, 0x3f, 0x32, 0x1c,
+  0xdf, 0x5b, 0xc5, 0x6d, 0x31, 0xdc, 0x83, 0x3f, 0xbe, 0xc5, 0x3f, 0x26,
+  0xec, 0x17, 0x10, 0xc8, 0x3e, 0xf6, 0xc3, 0xfa, 0xa4, 0x8d, 0x90, 0x0b,
+  0x91, 0x8b, 0xdb, 0x40, 0x99, 0x5a, 0x58, 0x06, 0x89, 0xf8, 0x7e, 0x16,
+  0x6a, 0x89, 0xac, 0x1a, 0x1d, 0xa6, 0xcb, 0xa5, 0xc9, 0x7e, 0x90, 0x52,
+  0xfe, 0x47, 0x78, 0x74, 0x8c, 0xf7, 0xd6, 0x25, 0x9f, 0xd3, 0x80, 0x1b,
+  0xb6, 0xe6, 0xa1, 0xea, 0x54, 0xd8, 0xaa, 0x9f, 0x31, 0x50, 0x61, 0xea,
+  0xe4, 0x81, 0x03, 0x68, 0x6a, 0x85, 0x12, 0xa0, 0x4d, 0xe8, 0x60, 0xf7,
+  0x34, 0x5e, 0x34, 0xe6, 0x67, 0x69, 0xcb, 0x14, 0xda, 0x97, 0x4c, 0xd2,
+  0x5d, 0xfe, 0xf0, 0x21, 0x6d, 0xdb, 0xdf, 0x7b, 0x43, 0xb5, 0xd9, 0x7c,
+  0xe3, 0xb5, 0x4b, 0x22, 0x2a, 0x6c, 0x7a, 0xd4, 0x16, 0x9d, 0x82, 0x1f,
+  0x35, 0xdc, 0x81, 0xd5, 0x92, 0x96, 0x79, 0xce, 0xb9, 0x29, 0x25, 0xf6,
+  0xf4, 0x20, 0xb6, 0x70, 0xcb, 0x3e, 0x19, 0x4c, 0x69, 0x4a, 0xe6, 0x18,
+  0xfa, 0x32, 0x92, 0x91, 0x41, 0xc2, 0x50, 0xb3, 0xc2, 0xcf, 0xf5, 0xc2,
+  0xc3, 0x8d, 0x51, 0x7b, 0x43, 0x29, 0xcb, 0xe9, 0x5b, 0x7f, 0xf0, 0xa2,
+  0x9d, 0xe5, 0x63, 0x36, 0xba, 0x79, 0x73, 0x3e, 0x08, 0xbf, 0xde, 0x5c,
+  0x1c, 0x3d, 0x0d, 0x5a, 0x08, 0xd2, 0x02, 0x9b, 0x9c, 0x82, 0x91, 0x89,
+  0xee, 0xb3, 0x23, 0xe7, 0xb7, 0xe1, 0xe1, 0xea, 0xaf, 0x18, 0x57, 0x20,
+  0x6a, 0x16, 0xcc, 0xc5, 0x45, 0xf1, 0xa4, 0x3a, 0x94, 0x5e, 0x8c, 0x77,
+  0x81, 0xbd, 0x1e, 0xe1, 0xe1, 0xaa, 0x1b, 0x8c, 0x16, 0x01, 0x11, 0xc8,
+  0x88, 0x85, 0x93, 0x80, 0xd6, 0xa4, 0x6b, 0x6a, 0xe7, 0xa3, 0x7f, 0xfc,
+  0x92, 0x63, 0x3e, 0x03, 0x8b, 0x36, 0x09, 0x04, 0x17, 0xbd, 0x1d, 0x32,
+  0x71, 0x1a, 0x1b, 0xfb, 0x05, 0x52, 0x9d, 0xe1, 0xeb, 0x4c, 0xa5, 0x5d,
+  0x21, 0x56, 0xfa, 0x51, 0xd1, 0xb6, 0x24, 0xd8, 0x93, 0x9d, 0x6f, 0xbe,
+  0xf6, 0xa5, 0xe7, 0x9b, 0xf3, 0x96, 0xcf, 0xe1, 0x6f, 0x7a, 0x5a, 0xab,
+  0x28, 0x1a, 0x81, 0xa3, 0xd0, 0xfb, 0x7b, 0x21, 0x40, 0xcb, 0xe1, 0x09,
+  0x28, 0x0a, 0xf3, 0x13, 0x5c, 0x02, 0xe1, 0xe7, 0xf9, 0x8f, 0x95, 0x0f,
+  0x4a, 0xc5, 0x40, 0xf8, 0x53, 0x5c, 0x86, 0xc1, 0x19, 0x7e, 0xd1, 0x15,
+  0x47, 0x71, 0x2f, 0x45, 0x11, 0xde, 0x58, 0x75, 0x46, 0xe1, 0xe1, 0x90,
+  0xbf, 0x85, 0x00, 0xaf, 0x90, 0x2d, 0xec, 0xf0, 0x1f, 0x9b, 0x3b, 0x26,
+  0x35, 0xcd, 0x14, 0x9c, 0xd2, 0x35, 0x05, 0x09, 0xee, 0x2b, 0x08, 0x59,
+  0xfa, 0x30, 0xa0, 0x7c, 0x82, 0x16, 0x6a, 0xa6, 0xc4, 0x03, 0xce, 0x38,
+  0x30, 0x93, 0xc3, 0x79, 0xaa, 0x26, 0x16, 0x9c, 0xc9, 0x80, 0xdd, 0x77,
+  0x4f, 0x11, 0x53, 0x1a, 0xc8, 0xa6, 0x5b, 0x85, 0xea, 0xf9, 0x1e, 0x94,
+  0x24, 0x14, 0xae, 0xcf, 0x26, 0x52, 0x7d, 0x21, 0x5a, 0x1f, 0x82, 0xb8,
+  0x76, 0x40, 0x7a, 0x58, 0xc5, 0xde, 0xe3, 0x02, 0x99, 0xf0, 0x70, 0xfb,
+  0x9f, 0xef, 0xef, 0x6d, 0x6c, 0x74, 0xd5, 0x57, 0x25, 0x09, 0x32, 0x43,
+  0x2a, 0xf7, 0x4a, 0x91, 0x73, 0x71, 0x33, 0x76, 0xd8, 0xe2, 0x1b, 0x62,
+  0x0c, 0xc6, 0x67, 0x14, 0x1e, 0x0e, 0xe5, 0x98, 0xbe, 0x87, 0x87, 0x88,
+  0x26, 0x38, 0x31, 0x74, 0x63, 0x08, 0xa3, 0xb0, 0x49, 0xf8, 0x01, 0x13,
+  0x73, 0x69, 0xe5, 0x0a, 0xe4, 0x48, 0xb1, 0x1e, 0x46, 0x74, 0x2c, 0x71,
+  0xb8, 0x38, 0x56, 0x49, 0xeb, 0x27, 0x82, 0x5e, 0xb2, 0xd8, 0xa3, 0x3f,
+  0xa8, 0xb4, 0xf2, 0x46, 0x1b, 0x44, 0x5f, 0x2e, 0x87, 0x33, 0x90, 0x41,
+  0x83, 0xe5, 0x64, 0x02, 0xa7, 0x7d, 0x96, 0x4a, 0xa7, 0x6f, 0xd6, 0xc1,
+  0x25, 0xb9, 0xa1, 0x4d, 0xe6, 0xd0, 0xba, 0xeb, 0x84, 0x26, 0xb9, 0x9e,
+  0xb6, 0x3c, 0x5c, 0xb4, 0xb6, 0xa8, 0xb3, 0xe0, 0x0f, 0xc1, 0x09, 0x4d,
+  0x7a, 0x6d, 0x0b, 0x7b, 0x48, 0x4a, 0xdf, 0x8c, 0x7b, 0x8f, 0x71, 0x5b,
+  0x10, 0xd8, 0xcf, 0x3e, 0x7a, 0xd3, 0x52, 0xbb, 0x9e, 0xb2, 0x6b, 0xf4,
+  0xce, 0x7b, 0xd4, 0x3b, 0x09, 0xe2, 0x07, 0x63, 0x19, 0xd1, 0x21, 0x6b,
+  0x98, 0xed, 0x3d, 0x96, 0x15, 0x6a, 0xc1, 0xd5, 0x45, 0x49, 0xab, 0x27,
+  0xbf, 0x7f, 0x8c, 0xdd, 0x15, 0x25, 0x09, 0x73, 0x96, 0x60, 0xac, 0x91,
+  0xf8, 0xa3, 0x8f, 0x79, 0x52, 0xb0, 0x7f, 0x92, 0xc7, 0x10, 0xdf, 0x87,
+  0x78, 0xf0, 0x29, 0xb7, 0x2e, 0x26, 0xcc, 0x26, 0xf6, 0x02, 0x31, 0x56,
+  0x10, 0xfb, 0xbc, 0x80, 0x76, 0x1e, 0x3c, 0x9e, 0x20, 0x29, 0xb5, 0xd9,
+  0x63, 0xe4, 0xc4, 0x79, 0x14, 0xcc, 0xa1, 0xac, 0x7d, 0xc9, 0x73, 0xdd,
+  0x60, 0x6d, 0xb7, 0xa7, 0x93, 0x54, 0x64, 0x13, 0x77, 0x78, 0x46, 0x1d,
+  0x2a, 0x5e, 0xd7, 0xf8, 0x39, 0x65, 0x5f, 0xa9, 0xd5, 0xc0, 0x7a, 0xb7,
+  0x8e, 0x2d, 0x1e, 0xca, 0x38, 0x10, 0x53, 0xd7, 0x39, 0x76, 0xbe, 0xd2,
+  0x4c, 0xae, 0x8e, 0xa6, 0x00, 0x34, 0x1a, 0xdf, 0xcb, 0x98, 0x32, 0x64,
+  0x00, 0xcf, 0x81, 0xd3, 0x22, 0x28, 0x49, 0x1d, 0x4f, 0x0d, 0x86, 0xec,
+  0x75, 0x82, 0x0a, 0xad, 0xd9, 0x00, 0xd3, 0xc1, 0xb2, 0x66, 0xf6, 0xe9,
+  0x27, 0x6c, 0xd4, 0x0f, 0xd3, 0xbb, 0xab, 0xb4, 0x5a, 0xfa, 0x4c, 0x77,
+  0xa8, 0xe8, 0xa3, 0x84, 0x7f, 0x41, 0x62, 0x1a, 0x0f, 0xc3, 0x82, 0x54,
+  0x90, 0x99, 0x87, 0x09, 0x9f, 0xd8, 0xca, 0xb5, 0x34, 0x3c, 0x02, 0x9d,
+  0x9f, 0xb3, 0xfc, 0xde, 0xcb, 0x10, 0x47, 0x0b, 0xc3, 0xcc, 0xae, 0x5e,
+  0x5d, 0x07, 0x6f, 0xff, 0xe9, 0x1f, 0xfa, 0xcb, 0x8f, 0xb8, 0x53, 0xff,
+  0xd4, 0x9d, 0xd2, 0xa4, 0xbb, 0xd8, 0x03, 0x61, 0x20, 0xdb, 0x3a, 0xfa,
+  0x13, 0xed, 0xca, 0xdf, 0x30, 0xab, 0x89, 0xb7, 0x06, 0xf1, 0x8f, 0x68,
+  0xc0, 0x3f, 0xf5, 0x8d, 0x1e, 0x2d, 0x83, 0xc4, 0x58, 0x55, 0x4e, 0xca,
+  0xfe, 0xf0, 0xd1, 0x73, 0x49, 0x21, 0x19, 0xfe, 0x98, 0x75, 0x09, 0xc8,
+  0x19, 0x4c, 0x3a, 0xc4, 0x80, 0xe1, 0x56, 0xbd, 0x7c, 0x8a, 0x3f, 0x16,
+  0x82, 0x66, 0x04, 0xb6, 0x0c, 0xcc, 0x1c, 0x0d, 0x3d, 0xfe, 0x79, 0xd8,
+  0xb0, 0xd0, 0xa4, 0x16, 0xf1, 0xa6, 0xd4, 0x00, 0xae, 0x60, 0x1c, 0x6c,
+  0x40, 0xaf, 0x86, 0xf8, 0x50, 0xb1, 0x65, 0x68, 0xaa, 0xf0, 0x74, 0xf3,
+  0xec, 0x09, 0x01, 0x46, 0xa0, 0x87, 0xf4, 0x65, 0x6e, 0x09, 0x67, 0x72,
+  0x34, 0xfe, 0xf4, 0x0f, 0x4e, 0x04, 0xfc, 0xa7, 0xaf, 0xfb, 0x5e, 0x5c,
+  0x9f, 0x1c, 0xd0, 0x94, 0xfe, 0xd4, 0x2b, 0x1f, 0xe7, 0xc3, 0x7c, 0x26,
+  0x17, 0x0f, 0x37, 0x1f, 0x36, 0x50, 0x7f, 0xc6, 0x54, 0x42, 0xb1, 0xba,
+  0x9e, 0x03, 0x8f, 0xd2, 0x0d, 0x76, 0xbe, 0x40, 0x3b, 0x2c, 0x1f, 0x71,
+  0xbd, 0x2c, 0x16, 0x2e, 0xc0, 0xcd, 0xfb, 0x53, 0xa4, 0x88, 0x27, 0xdc,
+  0xf5, 0x56, 0xfa, 0x1b, 0x8b, 0x47, 0x55, 0x4b, 0x40, 0x82, 0x21, 0xa0,
+  0xd5, 0x74, 0x6c, 0x78, 0x7a, 0x10, 0x58, 0x06, 0xf9, 0x05, 0x4c, 0xf3,
+  0x23, 0x95, 0x64, 0x8a, 0x99, 0x7b, 0xcc, 0x3f, 0xeb, 0x5d, 0xd3, 0xcf,
+  0x34, 0x8f, 0x46, 0xa0, 0x0c, 0x30, 0x33, 0x43, 0x8a, 0x4f, 0xba, 0x7e,
+  0xf9, 0x73, 0x14, 0x4a, 0xcd, 0xc3, 0xc4, 0x77, 0xe0, 0x33, 0xde, 0x3c,
+  0xf5, 0x56, 0x7f, 0x4c, 0x08, 0xee, 0x37, 0xbd, 0x4b, 0x56, 0x8f, 0x46,
+  0xfd, 0x83, 0x80, 0x31, 0xcf, 0x63, 0x49, 0x66, 0xe3, 0xec, 0x35, 0x73,
+  0x9f, 0x14, 0x74, 0x8d, 0x72, 0x9b, 0xe1, 0xb4, 0xfb, 0x4f, 0x0d, 0x87,
+  0x7b, 0xaa, 0x55, 0x1b, 0x92, 0xf9, 0x83, 0xfe, 0xb5, 0x74, 0x62, 0x34,
+  0x8c, 0x0a, 0x0b, 0x72, 0x30, 0xe5, 0x08, 0x47, 0x7e, 0x62, 0xad, 0xb9,
+  0x86, 0x28, 0x84, 0x6d, 0x71, 0xb8, 0xf2, 0xa2, 0x1b, 0xd9, 0xe8, 0xb6,
+  0x26, 0xf5, 0x45, 0x18, 0x08, 0x5f, 0x3d, 0x9c, 0x89, 0x92, 0x9b, 0xd0,
+  0xd4, 0x29, 0x35, 0x03, 0xcf, 0x39, 0xfd, 0x90, 0xe6, 0x89, 0x75, 0x2c,
+  0x73, 0xf4, 0xda, 0x06, 0xe2, 0xcc, 0x51, 0x80, 0xdb, 0x53, 0x70, 0xf4,
+  0x3f, 0x9c, 0x68, 0x3b, 0xbb, 0xb6, 0x7a, 0x4e, 0x94, 0x1d, 0x74, 0x11,
+  0x86, 0xd4, 0x5c, 0x3d, 0x1c, 0xe7, 0xdf, 0xbf, 0xe8, 0x6f, 0x6d, 0x78,
+  0x87, 0x5a, 0x2d, 0x3e, 0x02, 0x6d, 0x14, 0x8f, 0x1f, 0x31, 0x4b, 0x95,
+  0xce, 0x4c, 0xa3, 0x0a, 0xf4, 0x03, 0xda, 0x59, 0xc6, 0x46, 0x58, 0x2e,
+  0x70, 0x1c, 0x22, 0xf3, 0x59, 0xce, 0x06, 0xdb, 0x53, 0xcb, 0xa8, 0xe7,
+  0x83, 0xba, 0x10, 0x3d, 0xeb, 0xf5, 0x0e, 0x73, 0x7b, 0xde, 0xc4, 0x30,
+  0x01, 0xe5, 0x23, 0x45, 0xae, 0x0d, 0x31, 0x81, 0xdc, 0x4b, 0x8a, 0x74,
+  0xe4, 0xb6, 0x5b, 0xa5, 0x07, 0x88, 0xa4, 0x18, 0x79, 0x14, 0x43, 0xd9,
+  0x41, 0x88, 0xe5, 0xc6, 0xff, 0xc8, 0xff, 0xeb, 0x84, 0xac, 0x4c, 0xba,
+  0x23, 0x9d, 0x36, 0x4c, 0x14, 0x33, 0x6b, 0x6c, 0x06, 0xc2, 0xe9, 0x13,
+  0xeb, 0x24, 0x0c, 0xf7, 0x1d, 0x46, 0xc3, 0x9b, 0xa5, 0x71, 0x69, 0x26,
+  0xc8, 0x2b, 0xa0, 0x1b, 0x45, 0xeb, 0x25, 0xe4, 0xba, 0x1b, 0xaf, 0xf6,
+  0x2b, 0x0a, 0x44, 0x8d, 0x38, 0xd6, 0x34, 0xc9, 0xfb, 0x2d, 0x3b, 0xc3,
+  0x89, 0xc3, 0xcd, 0x9d, 0x69, 0xdf, 0x10, 0x5e, 0xb3, 0x1f, 0x7c, 0x6c,
+  0xba, 0x15, 0x78, 0x63, 0xd7, 0x25, 0x88, 0x47, 0xca, 0xf9, 0x06, 0xdf,
+  0x16, 0xa2, 0x05, 0x07, 0xa4, 0x8e, 0x18, 0xcc, 0x13, 0xb7, 0x76, 0xbd,
+  0xde, 0xbd, 0xb9, 0xe5, 0x9c, 0x0d, 0x0a, 0x08, 0x73, 0x34, 0xfc, 0x59,
+  0x64, 0xa1, 0x41, 0x38, 0xb9, 0x8f, 0x0a, 0xe9, 0x0c, 0xeb, 0x99, 0x3d,
+  0x46, 0x41, 0xf4, 0xfe, 0x15, 0x9f, 0xdf, 0xdf, 0x0a, 0xd0, 0x3f, 0xa5,
+  0x0f, 0x7f, 0x4c, 0x17, 0x0e, 0xcf, 0x3a, 0xbd, 0xc4, 0xc3, 0xa2, 0xba,
+  0x17, 0x29, 0x9b, 0xe0, 0x1c, 0x63, 0x4c, 0xb9, 0xd0, 0x1e, 0x58, 0x9c,
+  0xab, 0xf4, 0xe4, 0x66, 0x8e, 0x18, 0x5f, 0x81, 0x1d, 0x02, 0x2e, 0x10,
+  0x05, 0xd8, 0xb7, 0xa2, 0xa5, 0x89, 0x83, 0xe0, 0xf4, 0xf2, 0x6e, 0xcf,
+  0x0f, 0x44, 0x45, 0x01, 0x77, 0x99, 0xbb, 0xa4, 0x9d, 0x57, 0xad, 0x4b,
+  0xe2, 0x7e, 0x1d, 0xb2, 0x24, 0x5e, 0x80, 0xdb, 0x64, 0x47, 0x16, 0xa2,
+  0xeb, 0x70, 0x27, 0xfa, 0xc4, 0x92, 0xec, 0x22, 0x9e, 0x9c, 0x09, 0x7c,
+  0xeb, 0xa3, 0x41, 0x80, 0x07, 0xd9, 0xcc, 0x9f, 0xc6, 0x6f, 0x83, 0x62,
+  0x62, 0xb1, 0xe1, 0x11, 0x1d, 0x51, 0x89, 0x94, 0xa7, 0x12, 0xd6, 0xa8,
+  0xa3, 0x80, 0x82, 0xdd, 0xa0, 0xaf, 0xdd, 0xe0, 0x1c, 0xb4, 0xcf, 0x6d,
+  0x69, 0xe6, 0x00, 0x53, 0xb0, 0x3f, 0xe4, 0xeb, 0x82, 0xa2, 0x6f, 0x92,
+  0x4b, 0x4f, 0x76, 0x33, 0x9b, 0x27, 0xe6, 0xc0, 0x57, 0xe0, 0xe9, 0x59,
+  0xd0, 0x35, 0xfa, 0x58, 0x96, 0x33, 0x24, 0xf5, 0x74, 0xf2, 0x08, 0x53,
+  0x2a, 0x5b, 0xa1, 0x69, 0x5c, 0x01, 0xca, 0xcf, 0xe9, 0x71, 0x39, 0x06,
+  0xf3, 0x5a, 0x49, 0x3e, 0xcd, 0x45, 0x82, 0xe9, 0x37, 0x0c, 0x3d, 0xfe,
+  0x14, 0x31, 0xa2, 0x1c, 0xa6, 0xcf, 0xdb, 0x40, 0x9f, 0xf0, 0x09, 0xa3,
+  0x2c, 0xf4, 0xa3, 0x2d, 0x63, 0x09, 0x3e, 0x41, 0x08, 0xb5, 0x91, 0x70,
+  0x10, 0x1b, 0xdd, 0xae, 0x6f, 0x08, 0x16, 0x22, 0x7a, 0x1b, 0xa2, 0xbb,
+  0xff, 0x91, 0x34, 0x01, 0x8e, 0x47, 0x4b, 0xd6, 0xb9, 0x41, 0x61, 0xc2,
+  0x41, 0x89, 0x36, 0x34, 0xa6, 0xdc, 0x3b, 0x43, 0x61, 0x38, 0x0b, 0x40,
+  0xab, 0x47, 0x01, 0xa8, 0x0c, 0x6a, 0xa5, 0x45, 0x39, 0xd8, 0xf6, 0xa8,
+  0xd7, 0x73, 0xa9, 0x28, 0xed, 0x61, 0x25, 0x6c, 0x8f, 0x7e, 0x11, 0xb5,
+  0xba, 0x58, 0x6d, 0xba, 0x47, 0xb5, 0xd1, 0x55, 0xad, 0x4e, 0x55, 0x35,
+  0xc9, 0xb1, 0x21, 0x74, 0x4c, 0x62, 0xfc, 0x23, 0xec, 0x3a, 0x43, 0x99,
+  0x66, 0xf1, 0xea, 0xe1, 0x74, 0x3a, 0xd2, 0x8d, 0x8d, 0xac, 0xad, 0x29,
+  0x01, 0x87, 0xe5, 0x0d, 0x52, 0x02, 0xa1, 0x12, 0xd8, 0x39, 0x14, 0xa6,
+  0x86, 0x65, 0x5d, 0x5b, 0xf9, 0xea, 0x33, 0xae, 0x7f, 0xe9, 0x7a, 0xb7,
+  0xb0, 0xa8, 0x06, 0x17, 0x7a, 0x4a, 0x30, 0x06, 0x19, 0x83, 0xac, 0x41,
+  0x79, 0x94, 0xb3, 0x86, 0x36, 0x1e, 0xf5, 0xa9, 0x58, 0x94, 0x64, 0xbf,
+  0xd6, 0xe2, 0x46, 0x94, 0x2c, 0x28, 0xbf, 0x58, 0x2f, 0x2d, 0x48, 0x33,
+  0x16, 0xcb, 0x8d, 0x4d, 0xc4, 0x60, 0x23, 0x84, 0xe3, 0xd6, 0x54, 0xe3,
+  0x80, 0x82, 0x5d, 0x91, 0x45, 0xe1, 0xe8, 0x27, 0xef, 0x06, 0x02, 0xe1,
+  0x7d, 0x34, 0xbd, 0x42, 0x38, 0x70, 0x93, 0x57, 0x98, 0xe7, 0x31, 0x07,
+  0x79, 0x4e, 0xcc, 0x80, 0x21, 0x0d, 0x2d, 0xe3, 0xd2, 0xa7, 0x03, 0x3e,
+  0x3a, 0x1a, 0x4d, 0xc2, 0xc0, 0xd1, 0xaa, 0xd1, 0xb4, 0x46, 0xd0, 0x0c,
+  0x45, 0xa1, 0xd4, 0x27, 0x6e, 0x1a, 0x62, 0x0d, 0x05, 0xbf, 0xa8, 0x97,
+  0x58, 0xf6, 0x94, 0x3f, 0xb9, 0x62, 0x05, 0x8e, 0xf1, 0xbe, 0xfa, 0x8b,
+  0x2e, 0x8b, 0x08, 0x7f, 0x5a, 0xd2, 0xff, 0xa3, 0xe7, 0x6d, 0x9d, 0x66,
+  0xb0, 0xfb, 0x63, 0x61, 0x9b, 0x14, 0x7b, 0x0e, 0x38, 0x56, 0x8c, 0x89,
+  0x04, 0x53, 0xa7, 0x91, 0x0b, 0x37, 0xd7, 0xb1, 0x36, 0x0d, 0xf0, 0xce,
+  0x72, 0x89, 0x08, 0xdc, 0x93, 0xa7, 0x64, 0x39, 0x23, 0x53, 0xb1, 0x07,
+  0xc9, 0x8c, 0x87, 0xd0, 0x95, 0xf5, 0x0e, 0x33, 0x2d, 0xb3, 0x32, 0x4b,
+  0xa4, 0xcd, 0xd5, 0x69, 0x69, 0xe1, 0xc3, 0x6f, 0x34, 0x2b, 0x1e, 0xed,
+  0x39, 0x73, 0xfa, 0x57, 0xe5, 0x5a, 0x53, 0x92, 0x91, 0xa8, 0x32, 0x12,
+  0xe6, 0x59, 0xcc, 0x7e, 0xb5, 0x28, 0xab, 0x49, 0xab, 0xa7, 0xef, 0x6c,
+  0x9b, 0x28, 0xdb, 0x0e, 0xb2, 0x10, 0x46, 0x0c, 0xd7, 0xff, 0xbd, 0x45,
+  0xc5, 0x99, 0x44, 0xc5, 0x22, 0x4f, 0x91, 0xe4, 0xb2, 0xae, 0xd8, 0x96,
+  0xf7, 0x64, 0x5b, 0x5a, 0x3f, 0x64, 0xb8, 0xee, 0x36, 0x0a, 0x64, 0xa0,
+  0x93, 0xeb, 0x4a, 0x9d, 0x2a, 0x6c, 0x44, 0xa8, 0x67, 0x84, 0x5d, 0x23,
+  0xfd, 0xe7, 0x33, 0xe4, 0x17, 0xbb, 0xe1, 0x35, 0xd0, 0x8c, 0x3e, 0xf1,
+  0x1a, 0xda, 0xfd, 0x42, 0xfd, 0xc8, 0xc5, 0x8c, 0x5d, 0x3d, 0x9c, 0xe4,
+  0xc9, 0xb3, 0x2b, 0xc9, 0x6d, 0x89, 0x56, 0x03, 0x06, 0x47, 0x3f, 0x70,
+  0xc4, 0xce, 0xda, 0x27, 0x2c, 0x1e, 0x7a, 0x41, 0x13, 0xab, 0xb9, 0xc0,
+  0xb4, 0x6e, 0x39, 0x04, 0xb7, 0x0c, 0x85, 0xc2, 0xc7, 0x78, 0xb1, 0x10,
+  0x69, 0xf3, 0x34, 0xc9, 0x47, 0x0c, 0x0b, 0xc9, 0x4d, 0x80, 0xb1, 0x0d,
+  0x15, 0x01, 0x70, 0x56, 0x79, 0x7e, 0xcb, 0x4e, 0x55, 0x4e, 0xc1, 0xc6,
+  0x62, 0x48, 0x1f, 0x87, 0xda, 0x23, 0xf9, 0x99, 0xde, 0x9b, 0xcd, 0xc1,
+  0xe0, 0xdd, 0x66, 0x52, 0x8d, 0x54, 0xea, 0x6d, 0xda, 0xec, 0x3f, 0xb1,
+  0xbe, 0x9f, 0xd6, 0x62, 0x49, 0xf2, 0x52, 0x3f, 0x40, 0x24, 0x7e, 0xe3,
+  0xd7, 0x7e, 0x06, 0xed, 0xd3, 0x26, 0xd4, 0x6d, 0xd1, 0x4f, 0xb0, 0x4c,
+  0x44, 0xd3, 0xd6, 0x8f, 0xd4, 0x5d, 0x0a, 0x34, 0xe9, 0x75, 0x46, 0xa4,
+  0x05, 0x3b, 0xf5, 0xe9, 0x9b, 0x6d, 0x17, 0x17, 0x5c, 0x0a, 0xba, 0x56,
+  0x30, 0xe5, 0x67, 0xb9, 0xf8, 0x6f, 0x39, 0x4f, 0xf2, 0xec, 0x70, 0xec,
+  0x97, 0x12, 0xa4, 0x9e, 0x9e, 0xf0, 0x02, 0x7d, 0x18, 0xec, 0xa6, 0x78,
+  0x7a, 0xc6, 0xcf, 0x9e, 0xf0, 0xf3, 0x66, 0x2c, 0x81, 0x01, 0xf2, 0xa1,
+  0xe9, 0x24, 0x68, 0xce, 0xe4, 0x9e, 0x16, 0x14, 0x71, 0xac, 0x09, 0x98,
+  0xa6, 0xd9, 0x73, 0x9c, 0x7b, 0x26, 0x45, 0x07, 0xfd, 0xad, 0xd8, 0xc0,
+  0xde, 0x0c, 0x2a, 0x09, 0xc0, 0xa5, 0xe4, 0x0a, 0x4f, 0xf3, 0x27, 0x67,
+  0x17, 0x0b, 0x8c, 0x37, 0x8a, 0x05, 0xc7, 0xf9, 0x3e, 0x52, 0xfa, 0xc1,
+  0x3c, 0x9e, 0x74, 0xb4, 0xc4, 0xfc, 0xe3, 0x40, 0x3f, 0x6b, 0xcf, 0x8d,
+  0x05, 0xfa, 0x1e, 0xd7, 0x5a, 0xdd, 0x61, 0x58, 0xbe, 0xe5, 0x2c, 0x8c,
+  0x5e, 0xff, 0xd4, 0x66, 0x63, 0xea, 0xf5, 0x6c, 0x66, 0xec, 0x80, 0x27,
+  0x45, 0x12, 0x88, 0xb3, 0x85, 0x6e, 0x0f, 0xd2, 0x05, 0x91, 0x09, 0x93,
+  0x69, 0x57, 0x2f, 0x46, 0x37, 0x7a, 0x36, 0x29, 0x50, 0xa8, 0x41, 0xb7,
+  0xd6, 0x82, 0x12, 0xd3, 0x59, 0x62, 0xac, 0x9d, 0x7f, 0x19, 0x8f, 0x0c,
+  0x80, 0xd1, 0x53, 0xb3, 0x8b, 0xb9, 0x8f, 0x5d, 0x63, 0x17, 0x38, 0x8f,
+  0xa8, 0xa6, 0x51, 0x50, 0x76, 0xd4, 0xb3, 0xc4, 0x79, 0x2a, 0xdd, 0xbc,
+  0x4d, 0x68, 0xcf, 0xdd, 0xad, 0xd2, 0xf2, 0xe7, 0x67, 0x08, 0xbc, 0xa0,
+  0x41, 0x4e, 0x53, 0xa5, 0x99, 0x3f, 0xff, 0xfa, 0x7c, 0x82, 0x0b, 0xcf,
+  0x29, 0x6a, 0xa8, 0x92, 0x36, 0x2f, 0x8e, 0xb6, 0x72, 0x78, 0xae, 0x2b,
+  0x84, 0x32, 0xf4, 0xd5, 0x49, 0x6e, 0x72, 0xdd, 0x1a, 0x2c, 0x82, 0x63,
+  0x3a, 0xb3, 0x32, 0x7f, 0x5a, 0x0b, 0xa4, 0x13, 0x70, 0xd2, 0xd7, 0x11,
+  0xba, 0x9f, 0x1d, 0x98, 0x60, 0x07, 0xe1, 0xc5, 0xa9, 0x94, 0x68, 0x9e,
+  0x76, 0x29, 0xc2, 0x19, 0x86, 0x6f, 0x8c, 0x58, 0x05, 0x75, 0x23, 0xc1,
+  0xdf, 0x65, 0x83, 0x43, 0x4b, 0x79, 0x7b, 0x94, 0x62, 0xfb, 0x1c, 0x22,
+  0x42, 0x87, 0x67, 0xe0, 0xae, 0x52, 0x53, 0x04, 0x35, 0xca, 0xf8, 0xcb,
+  0x54, 0x9f, 0x69, 0x9c, 0xa6, 0x09, 0xc7, 0x9f, 0xf0, 0x75, 0x5b, 0xce,
+  0x41, 0x56, 0x28, 0xea, 0x93, 0xbd, 0xa7, 0x5c, 0xed, 0x14, 0x94, 0xc0,
+  0xa8, 0x04, 0xe5, 0x90, 0x52, 0x13, 0x6c, 0x0c, 0x4b, 0x68, 0xf8, 0x53,
+  0x7c, 0x12, 0x0a, 0xe3, 0x7f, 0xb0, 0x7a, 0x38, 0x6d, 0x00, 0xf2, 0x09,
+  0x71, 0x4c, 0x1f, 0x62, 0xb8, 0x03, 0xa1, 0xfa, 0x80, 0x32, 0x26, 0x29,
+  0x64, 0x9b, 0xae, 0x70, 0xc0, 0xa4, 0xde, 0x2f, 0xb7, 0x6a, 0x76, 0x67,
+  0x2f, 0xab, 0x40, 0x09, 0x09, 0xa8, 0xf5, 0x14, 0xdf, 0x66, 0x61, 0x01,
+  0x16, 0x75, 0x4c, 0xd5, 0x23, 0x78, 0xca, 0xc9, 0x43, 0xc5, 0xf1, 0x05,
+  0xfa, 0x1d, 0xce, 0x25, 0x05, 0xbd, 0x0e, 0x43, 0xda, 0x16, 0x20, 0x35,
+  0x50, 0x55, 0x21, 0x75, 0xac, 0xf4, 0x35, 0xe3, 0xaf, 0x7b, 0x18, 0x4f,
+  0xfb, 0x79, 0x91, 0xa2, 0xbc, 0xa1, 0x44, 0x4e, 0x1d, 0x0c, 0xe9, 0xbe,
+  0x4b, 0xfc, 0x04, 0xad, 0xc7, 0xd0, 0x70, 0x1a, 0x59, 0x8b, 0x22, 0x0e,
+  0xad, 0x79, 0x43, 0xcf, 0x89, 0x5e, 0xf1, 0x77, 0x66, 0x54, 0x81, 0x4e,
+  0x08, 0xd5, 0x97, 0x6b, 0x0d, 0x8e, 0xe9, 0x14, 0xab, 0x29, 0x2f, 0x66,
+  0xb5, 0x76, 0xa1, 0x18, 0x83, 0x05, 0xc2, 0x2b, 0xb8, 0x92, 0xdd, 0xf3,
+  0x45, 0xa5, 0x65, 0xb9, 0xa4, 0x03, 0x7b, 0x7b, 0x7a, 0x76, 0x62, 0xb2,
+  0xda, 0xfe, 0xd7, 0x66, 0x1f, 0xb7, 0xbc, 0x18, 0x79, 0x39, 0x7c, 0x5c,
+  0x43, 0xea, 0x14, 0x04, 0x4b, 0x91, 0xe9, 0xb7, 0x5d, 0xee, 0xab, 0x49,
+  0x3f, 0xae, 0x55, 0x98, 0x9e, 0x9c, 0x7f, 0x77, 0x7a, 0x75, 0x71, 0xfe,
+  0xfe, 0xe4, 0xfc, 0xfa, 0x33, 0x87, 0xdd, 0x85, 0xba, 0x46, 0x94, 0x7e,
+  0x72, 0x41, 0x8a, 0xe1, 0xa0, 0x7b, 0x2a, 0x02, 0xe4, 0xde, 0x2d, 0xb0,
+  0x52, 0xf9, 0x57, 0xdf, 0x1d, 0xce, 0x79, 0x48, 0x3d, 0xfb, 0x98, 0x49,
+  0xb2, 0x40, 0xcf, 0xce, 0x18, 0xe3, 0xaa, 0x7d, 0x8e, 0x05, 0x98, 0xbe,
+  0xc4, 0xd8, 0xb8, 0xe2, 0x01, 0x81, 0xc2, 0x29, 0x15, 0x18, 0x6b, 0xc7,
+  0x3e, 0x33, 0x5b, 0xc2, 0x41, 0x40, 0x1b, 0x2b, 0xad, 0x4d, 0xc2, 0x12,
+  0xf7, 0x07, 0x29, 0x00, 0xcd, 0xa2, 0xe0, 0x6a, 0x14, 0xfd, 0x8e, 0x14,
+  0x02, 0xfa, 0xec, 0x0d, 0xe7, 0xe1, 0x70, 0xf4, 0x85, 0x99, 0x84, 0x93,
+  0x03, 0xea, 0xa0, 0x0e, 0x3b, 0x2d, 0x94, 0x9b, 0x48, 0xc3, 0xce, 0x2a,
+  0xfe, 0xaa, 0xce, 0xa2, 0x83, 0xcd, 0xcd, 0x9f, 0xa8, 0x7b, 0xf7, 0x97,
+  0xd2, 0xbe, 0xdb, 0x47, 0x4c, 0x2d, 0x9d, 0x69, 0xd8, 0x92, 0x21, 0xad,
+  0x2e, 0x44, 0xba, 0x35, 0xdb, 0x49, 0x6e, 0xe0, 0x8f, 0x97, 0x57, 0x17,
+  0x3f, 0xfc, 0xe5, 0x37, 0xfe, 0x84, 0x93, 0x6c, 0xf6, 0x57, 0xcc, 0xc1,
+  0xd4, 0xc1, 0x7f, 0xfa, 0xcd, 0xbf, 0x56, 0x1f, 0xbe, 0x2b, 0x91, 0x76,
+  0x6e, 0x35, 0xee, 0x2b, 0x64, 0x5c, 0xbc, 0xcd, 0x50, 0xfa, 0x36, 0x25,
+  0x3a, 0x72, 0x7c, 0x1c, 0x26, 0x19, 0x88, 0x44, 0x5c, 0x59, 0x27, 0xd0,
+  0xd8, 0x07, 0xd6, 0xee, 0x73, 0x49, 0xb1, 0xcd, 0xe0, 0xd5, 0xaa, 0x72,
+  0xac, 0x1c, 0xe7, 0xda, 0x72, 0xca, 0x47, 0x35, 0xfb, 0x71, 0x74, 0x76,
+  0xf6, 0x9b, 0x6e, 0x02, 0x75, 0x40, 0xb6, 0x6b, 0xe9, 0x19, 0x0d, 0x55,
+  0x9e, 0x7e, 0x02, 0xb8, 0xf6, 0xfc, 0x42, 0x66, 0x73, 0x48, 0xca, 0x71,
+  0xaf, 0x4c, 0x40, 0xa5, 0x8d, 0x31, 0xde, 0xaf, 0xc0, 0xe5, 0x38, 0xb1,
+  0x72, 0x93, 0x13, 0x27, 0x3d, 0x1c, 0x75, 0x7a, 0x88, 0x92, 0x05, 0xc8,
+  0x84, 0xa2, 0xbc, 0x4a, 0xde, 0x4d, 0x2e, 0x8b, 0xa3, 0xba, 0x85, 0xdc,
+  0xe0, 0x12, 0x71, 0x3f, 0x76, 0xee, 0x07, 0x3e, 0x09, 0xb4, 0x7b, 0x66,
+  0x74, 0x08, 0x94, 0xb7, 0x45, 0x5a, 0xde, 0x52, 0x51, 0x07, 0xde, 0x50,
+  0x52, 0x90, 0xb4, 0x7e, 0x1f, 0x55, 0x5e, 0x9a, 0x53, 0x9f, 0x21, 0x46,
+  0x6c, 0x35, 0x5d, 0x5a, 0x86, 0x66, 0x47, 0x7d, 0xb3, 0x58, 0x14, 0xa3,
+  0x1b, 0x95, 0x9d, 0xd0, 0x71, 0xad, 0xb4, 0x4b, 0xc0, 0xdf, 0x39, 0x89,
+  0xaa, 0x34, 0x38, 0x03, 0xa1, 0xb2, 0xf4, 0xae, 0x96, 0x1b, 0xe3, 0x03,
+  0xfc, 0xe9, 0xaa, 0x4c, 0x66, 0x93, 0x70, 0x85, 0x7d, 0x90, 0x5b, 0x48,
+  0x85, 0xbf, 0x69, 0x48, 0xaf, 0xc4, 0x8a, 0x87, 0x95, 0x10, 0x26, 0x0d,
+  0x86, 0x16, 0x7c, 0x7f, 0x9d, 0xd0, 0x61, 0x2d, 0xcf, 0xe0, 0xc1, 0xb6,
+  0x11, 0x8b, 0x9c, 0x6a, 0x56, 0xce, 0x13, 0xd3, 0xb3, 0x7d, 0x3d, 0xf6,
+  0x0b, 0xa6, 0x80, 0x23, 0xb9, 0xf8, 0x1d, 0x2a, 0x79, 0x7b, 0x0f, 0x91,
+  0x02, 0x87, 0xf0, 0x39, 0xd5, 0x9e, 0x91, 0xdf, 0x3c, 0x67, 0x38, 0x6a,
+  0xce, 0x50, 0x62, 0x6e, 0xb4, 0x4c, 0x35, 0xaa, 0x30, 0xbb, 0xb7, 0x8a,
+  0xc4, 0x2f, 0xce, 0x4a, 0x38, 0x61, 0xed, 0xf8, 0x75, 0x12, 0xce, 0xc4,
+  0x57, 0x4d, 0xb4, 0x75, 0xa6, 0x81, 0xd8, 0x30, 0x3c, 0x86, 0x2e, 0x78,
+  0x06, 0x91, 0x71, 0xc7, 0x33, 0xf3, 0x24, 0x6d, 0x95, 0xe7, 0xc8, 0x7a,
+  0x9c, 0x42, 0x69, 0x25, 0xa1, 0x20, 0x5c, 0x30, 0xfd, 0xc6, 0xbd, 0x32,
+  0x72, 0x17, 0x4c, 0x49, 0x3b, 0x29, 0xe1, 0xa6, 0x2c, 0xd4, 0x46, 0xda,
+  0x31, 0xdc, 0x12, 0xf9, 0xfe, 0x71, 0x8a, 0xbf, 0xa0, 0x50, 0x27, 0x46,
+  0x44, 0xb1, 0x12, 0x53, 0x77, 0x20, 0xc5, 0xb2, 0x54, 0x5f, 0x37, 0xd4,
+  0x32, 0x63, 0x0d, 0x6e, 0x81, 0x08, 0x9c, 0xe5, 0x65, 0x08, 0x4e, 0x73,
+  0x88, 0x59, 0xf3, 0x09, 0x35, 0xfa, 0xe1, 0x2b, 0x0f, 0xff, 0xbd, 0xbe,
+  0x38, 0xbe, 0x38, 0x83, 0xbf, 0x9c, 0xbc, 0x3d, 0xfd, 0xc1, 0x6a, 0x05,
+  0x0c, 0x50, 0x51, 0x2b, 0x90, 0x21, 0xdc, 0xc5, 0x97, 0x5d, 0x97, 0x0d,
+  0x71, 0x0e, 0x22, 0xa6, 0x1f, 0x72, 0x4a, 0x5c, 0x93, 0x42, 0x0d, 0xb7,
+  0x74, 0xf8, 0x1c, 0xca, 0x69, 0xcc, 0x17, 0x75, 0xf0, 0x47, 0x62, 0x01,
+  0x5e, 0x42, 0x2d, 0x9a, 0x47, 0x36, 0xc5, 0x14, 0x76, 0x93, 0xb1, 0x46,
+  0xca, 0x65, 0x73, 0x92, 0x8d, 0x6a, 0x3f, 0x99, 0x2a, 0x2c, 0x51, 0x6d,
+  0x72, 0x79, 0x61, 0xba, 0xe0, 0x56, 0x6e, 0x87, 0xf5, 0x46, 0x4b, 0x1b,
+  0x17, 0x2f, 0x3f, 0x4b, 0xdc, 0x45, 0x9a, 0xb6, 0xe8, 0x55, 0x91, 0x10,
+  0x57, 0x24, 0xa0, 0x3a, 0x54, 0x04, 0x5c, 0x94, 0x8f, 0x06, 0x45, 0x50,
+  0x85, 0x8e, 0x19, 0xb1, 0xbe, 0x26, 0xd9, 0x00, 0xc9, 0xe5, 0xa3, 0xdc,
+  0x0a, 0xd4, 0xe3, 0x1d, 0x88, 0x1f, 0xa1, 0xd6, 0x60, 0xb9, 0xa0, 0xd4,
+  0x29, 0xe1, 0x1f, 0x94, 0x5d, 0xc5, 0x51, 0x0c, 0xe1, 0xa8, 0xd7, 0x4e,
+  0x6b, 0x77, 0x96, 0x0a, 0x12, 0x7c, 0x5a, 0xf8, 0xa6, 0x15, 0x9e, 0x81,
+  0x28, 0xfb, 0x75, 0x8d, 0xa3, 0x6c, 0xfb, 0x34, 0x9a, 0xa8, 0xb2, 0x07,
+  0xf6, 0xd3, 0x5e, 0xd6, 0x35, 0x66, 0x7d, 0x97, 0x7b, 0xab, 0xc6, 0x40,
+  0x8d, 0xf0, 0xef, 0xcb, 0xf4, 0x2e, 0xa6, 0xda, 0x32, 0xb8, 0x2c, 0xbd,
+  0x1e, 0xbf, 0xd4, 0x18, 0x23, 0xfe, 0x55, 0x83, 0xc4, 0xf5, 0x51, 0xf6,
+  0x7f, 0xcd, 0x20, 0xfb, 0x8d, 0x31, 0x6e, 0x7e, 0xd5, 0x20, 0x3d, 0x15,
+  0x10, 0xa0, 0x18, 0xff, 0x70, 0x7a, 0x1d, 0x1d, 0x5f, 0xbc, 0xb1, 0x17,
+  0xec, 0xda, 0x64, 0x6f, 0xc7, 0xd1, 0x70, 0x99, 0x01, 0x0d, 0x62, 0x2f,
+  0x26, 0xd3, 0xdd, 0x82, 0xd3, 0x14, 0x31, 0x07, 0xa7, 0xd4, 0x8a, 0xb5,
+  0xb4, 0x60, 0x28, 0x22, 0xcc, 0xab, 0x61, 0x24, 0x25, 0xa7, 0x46, 0x17,
+  0x9f, 0x9e, 0x23, 0xd0, 0xd1, 0x54, 0xa5, 0x2f, 0xde, 0x4a, 0xc4, 0xba,
+  0x8b, 0x0b, 0xad, 0x2a, 0x1d, 0xc6, 0x08, 0x66, 0x94, 0x71, 0x6d, 0x24,
+  0xc8, 0xce, 0x00, 0xf4, 0xb0, 0x0e, 0xe7, 0x22, 0x10, 0x83, 0xee, 0x9c,
+  0x56, 0x3a, 0x15, 0x37, 0x93, 0x70, 0x5b, 0x73, 0xfd, 0x6b, 0x94, 0x2e,
+  0xed, 0xed, 0x48, 0xf8, 0x61, 0x5e, 0xf7, 0xd8, 0xc0, 0x59, 0xa3, 0x4a,
+  0x9c, 0xd9, 0x9c, 0x7d, 0x6e, 0x72, 0xed, 0x49, 0x6c, 0x33, 0x84, 0xf9,
+  0xce, 0x8e, 0x84, 0x12, 0x40, 0x45, 0x67, 0xbf, 0x81, 0xe4, 0x95, 0xa5,
+  0x3f, 0x3b, 0x0a, 0xfa, 0xae, 0xd1, 0xc7, 0x60, 0xe5, 0x33, 0xea, 0x1c,
+  0x3d, 0xe6, 0x0b, 0x51, 0x3e, 0x82, 0x50, 0x7f, 0x20, 0x83, 0x1c, 0xed,
+  0x27, 0x81, 0x73, 0xb2, 0x6f, 0xee, 0x89, 0x56, 0x16, 0x19, 0xdc, 0x28,
+  0x6a, 0xbf, 0xb5, 0xa8, 0x47, 0x83, 0xac, 0xd7, 0x42, 0x4b, 0xa4, 0x29,
+  0xc4, 0x99, 0x94, 0xd8, 0xc9, 0x3a, 0xe0, 0xb9, 0xb0, 0x89, 0x07, 0x0c,
+  0xdf, 0xc0, 0xe5, 0xd6, 0x02, 0xbf, 0xed, 0xb4, 0x29, 0x34, 0x60, 0x3f,
+  0x98, 0x99, 0x44, 0xfb, 0xd5, 0xe3, 0x1e, 0x4d, 0x5e, 0x5d, 0xba, 0xad,
+  0xc0, 0x54, 0x8b, 0x63, 0x9c, 0xd3, 0x06, 0x76, 0x29, 0x93, 0x17, 0xf6,
+  0x6d, 0x18, 0x23, 0xd4, 0x03, 0xb5, 0x46, 0x8c, 0x33, 0xae, 0x34, 0xd4,
+  0x13, 0x08, 0xd7, 0xdc, 0xd9, 0x9a, 0xa7, 0x7d, 0xfe, 0xe3, 0x58, 0x35,
+  0x36, 0x29, 0x1b, 0x72, 0x19, 0x0b, 0x0b, 0x19, 0xb1, 0x6e, 0x72, 0xc2,
+  0xe8, 0x40, 0x19, 0x44, 0xeb, 0x23, 0x06, 0xe9, 0x6f, 0x42, 0xd9, 0xf0,
+  0x71, 0xbe, 0x68, 0xf9, 0x0a, 0x43, 0x3a, 0xd9, 0x8f, 0xb8, 0x3e, 0x79,
+  0xdd, 0x42, 0x79, 0xd6, 0x19, 0xed, 0x65, 0x93, 0x2e, 0x1c, 0xcf, 0x3e,
+  0x8d, 0x68, 0x9e, 0xfc, 0x5c, 0x7c, 0x11, 0x09, 0x16, 0x2d, 0x8a, 0xf2,
+  0x5c, 0x24, 0x8b, 0x99, 0xac, 0x4c, 0x7e, 0x42, 0x81, 0x63, 0xf2, 0x26,
+  0xd0, 0x2e, 0x8f, 0x74, 0x96, 0xa0, 0x0e, 0xbb, 0xa6, 0xe0, 0x2b, 0xf9,
+  0x2c, 0x36, 0x81, 0x63, 0xd5, 0x81, 0x70, 0x37, 0x52, 0x43, 0x6f, 0xd2,
+  0x74, 0x9e, 0x7e, 0x84, 0x09, 0x8e, 0x84, 0xea, 0xa0, 0xff, 0x96, 0x37,
+  0x3c, 0xa4, 0xbb, 0x86, 0x2b, 0x19, 0x57, 0xbb, 0x2c, 0xb8, 0x68, 0xd7,
+  0x62, 0x3b, 0x2a, 0xd8, 0xba, 0xe4, 0xff, 0x15, 0x08, 0xc9, 0xd7, 0x07,
+  0x5e, 0x94, 0x7b, 0xe8, 0x93, 0xf9, 0xa4, 0x12, 0xec, 0x2f, 0xee, 0xb7,
+  0xc6, 0xfb, 0x73, 0x13, 0x67, 0xd3, 0x84, 0xfd, 0x2f, 0x0e, 0x3c, 0x25,
+  0xf7, 0xea, 0x63, 0x71, 0x08, 0x77, 0x9d, 0x9c, 0x3c, 0xad, 0xe8, 0x13,
+  0x76, 0x1f, 0xb6, 0xb7, 0xcc, 0x3e, 0x70, 0x1b, 0x2e, 0xaa, 0x4e, 0xc1,
+  0x5d, 0xf8, 0x9e, 0x10, 0x09, 0xef, 0x63, 0x6e, 0xd3, 0xab, 0xcd, 0xec,
+  0xad, 0xd1, 0x62, 0xc2, 0x3c, 0x18, 0x59, 0xf3, 0xf3, 0xa4, 0x09, 0xc9,
+  0x01, 0xb3, 0x60, 0x50, 0x1f, 0xe0, 0x54, 0x4f, 0x2e, 0x6f, 0x14, 0x71,
+  0xd5, 0x25, 0x83, 0xde, 0x30, 0x48, 0x8e, 0xb3, 0x12, 0xef, 0xbd, 0x4b,
+  0x42, 0xb0, 0x19, 0x8a, 0x5b, 0xe5, 0x64, 0x73, 0x58, 0xd0, 0x10, 0x67,
+  0x3d, 0xdb, 0x66, 0x3d, 0xf7, 0x44, 0x28, 0x97, 0x47, 0x83, 0x81, 0x92,
+  0xc9, 0xb1, 0x4f, 0x11, 0x12, 0x3d, 0x22, 0x04, 0x1d, 0x29, 0x92, 0x0e,
+  0xa8, 0x8a, 0x32, 0x48, 0x23, 0xc9, 0x60, 0x9b, 0x79, 0xda, 0x1b, 0x66,
+  0xcc, 0xa4, 0x4d, 0xc8, 0x7a, 0x99, 0xae, 0x74, 0xc5, 0xf7, 0xab, 0x77,
+  0xf2, 0xb3, 0x60, 0xba, 0x0a, 0x07, 0x2c, 0x71, 0x9f, 0xa9, 0x18, 0x59,
+  0x79, 0x3c, 0xa9, 0x86, 0x0f, 0x8b, 0xb4, 0xd6, 0x11, 0x71, 0x7b, 0xd7,
+  0x5f, 0xf4, 0x77, 0xbc, 0xaa, 0xee, 0xbf, 0xb4, 0xe8, 0xef, 0x02, 0x8b,
+  0xde, 0xb3, 0x17, 0x87, 0x3f, 0x16, 0xed, 0xec, 0xbc, 0xd4, 0x82, 0x10,
+  0xa0, 0x63, 0xfa, 0x9e, 0xfd, 0xa0, 0xf3, 0x45, 0x78, 0xae, 0x47, 0xf5,
+  0x07, 0xfe, 0xb7, 0x9c, 0xcb, 0xeb, 0x7c, 0x6a, 0xdf, 0x7c, 0x0a, 0xd4,
+  0x6f, 0xb4, 0x40, 0x41, 0xa7, 0x67, 0x2e, 0xe3, 0x31, 0x1f, 0x35, 0xe5,
+  0x50, 0x0d, 0xbf, 0xc7, 0xfc, 0xa9, 0xca, 0xe8, 0x92, 0x8d, 0x4f, 0xe9,
+  0x2c, 0x9c, 0xef, 0xbc, 0x30, 0x6e, 0x94, 0xcd, 0x1d, 0x0d, 0xa0, 0x1f,
+  0x11, 0x2f, 0x9e, 0x25, 0x73, 0xa2, 0xcc, 0x71, 0x82, 0x68, 0x3d, 0xd6,
+  0xfd, 0xc7, 0x35, 0x77, 0x93, 0x22, 0x26, 0xb4, 0xe5, 0x59, 0xfc, 0x18,
+  0x00, 0xdb, 0x12, 0x4f, 0x31, 0x9b, 0x2b, 0x31, 0xce, 0x3e, 0x43, 0x5b,
+  0x81, 0x34, 0x01, 0x71, 0x9b, 0xa1, 0x1f, 0x16, 0x4f, 0x34, 0x9f, 0x18,
+  0x57, 0xad, 0x7c, 0xd5, 0x83, 0x03, 0x28, 0xa5, 0x3d, 0x22, 0x5f, 0x19,
+  0xd1, 0x12, 0xc2, 0xd8, 0x70, 0xdb, 0x2f, 0xed, 0x11, 0x99, 0x73, 0x40,
+  0xc7, 0x16, 0x43, 0x84, 0x38, 0xbb, 0xa7, 0xbc, 0x44, 0xe3, 0x01, 0xd2,
+  0x76, 0x07, 0xa3, 0x74, 0xa9, 0x6f, 0x35, 0x17, 0x8e, 0x82, 0xb8, 0xcd,
+  0xdc, 0xf8, 0x12, 0x99, 0x9d, 0x00, 0xee, 0xf6, 0xa3, 0x0b, 0xf2, 0xc2,
+  0xd5, 0x20, 0xc6, 0x27, 0x4c, 0xfa, 0xb6, 0x68, 0xb4, 0x4e, 0xb8, 0xaf,
+  0xec, 0x09, 0xeb, 0x9c, 0x34, 0xf9, 0x65, 0x53, 0x99, 0xac, 0x11, 0x28,
+  0xea, 0x6d, 0x4e, 0xa2, 0xab, 0x93, 0xeb, 0x2b, 0x8a, 0xf3, 0x12, 0x03,
+  0xf0, 0x40, 0x52, 0xe3, 0x62, 0xc3, 0x80, 0x04, 0x09, 0x3b, 0xb3, 0x7a,
+  0x88, 0x65, 0x10, 0x8c, 0x5f, 0x66, 0xce, 0x9b, 0xff, 0xa9, 0xef, 0x71,
+  0xf5, 0x4b, 0xa2, 0xb5, 0x26, 0x36, 0xa2, 0x53, 0x47, 0x56, 0xdb, 0xd9,
+  0xb1, 0x59, 0x48, 0xdc, 0x3a, 0x99, 0xc5, 0x9c, 0x64, 0x92, 0xf7, 0x25,
+  0xbb, 0x45, 0x8b, 0x2f, 0xb4, 0x55, 0x1e, 0x3e, 0xc4, 0xd9, 0xd8, 0x79,
+  0x11, 0x10, 0xb9, 0xf2, 0x69, 0x95, 0xff, 0x3c, 0x05, 0x8b, 0xa2, 0xc6,
+  0x5f, 0xe3, 0x9f, 0x32, 0xf7, 0x94, 0x0a, 0xc0, 0x68, 0x6f, 0x6b, 0x2b,
+  0x00, 0x3b, 0x1c, 0x0f, 0x81, 0xa9, 0x8a, 0x36, 0x27, 0x55, 0x3d, 0xf4,
+  0x16, 0x7b, 0x4d, 0x49, 0xbd, 0x2c, 0xd1, 0xd4, 0xe8, 0x4d, 0xd0, 0x8d,
+  0x89, 0x3b, 0xe6, 0x1b, 0x15, 0x3b, 0xcc, 0x63, 0xbe, 0xa7, 0x2a, 0x23,
+  0xdd, 0xb4, 0x06, 0x73, 0xe1, 0x12, 0x24, 0xed, 0xcd, 0x1b, 0x3b, 0x60,
+  0xcc, 0xe2, 0xff, 0xf6, 0x66, 0xe6, 0xf1, 0xef, 0x9d, 0x7d, 0x9f, 0x22,
+  0x06, 0xd7, 0x17, 0x57, 0x42, 0x61, 0xbe, 0x68, 0xe6, 0x1d, 0xa1, 0x47,
+  0x2c, 0xda, 0x4a, 0xd7, 0x87, 0xdc, 0x19, 0x1b, 0x7c, 0x00, 0x83, 0x62,
+  0xea, 0x7c, 0x95, 0x39, 0x00, 0xb5, 0xe7, 0x93, 0xa5, 0x7d, 0x27, 0x88,
+  0x00, 0x8a, 0xd7, 0xab, 0xf7, 0xd2, 0x79, 0x89, 0xaf, 0xd9, 0x05, 0xdf,
+  0x5f, 0xae, 0x5e, 0x47, 0x3a, 0x92, 0x3a, 0x76, 0xc4, 0xfb, 0x95, 0x74,
+  0x58, 0xd3, 0x47, 0xb4, 0x49, 0x8b, 0x7c, 0x89, 0x2e, 0x2c, 0x24, 0x33,
+  0x73, 0x78, 0x59, 0xa7, 0xb1, 0x8a, 0xa9, 0x97, 0x2d, 0xf2, 0x09, 0x86,
+  0x2c, 0x96, 0xc4, 0xa6, 0x98, 0x7d, 0x61, 0x23, 0x0f, 0xd6, 0x3d, 0x2f,
+  0xc6, 0x92, 0xbe, 0x22, 0x82, 0x53, 0x8d, 0x05, 0xab, 0x67, 0x5b, 0xa9,
+  0x7f, 0x79, 0x71, 0x75, 0x6d, 0x64, 0x3e, 0x7e, 0x96, 0x7e, 0xd0, 0xb8,
+  0x3d, 0xd8, 0x2f, 0x45, 0xf0, 0x27, 0x44, 0xb2, 0x51, 0x87, 0xe0, 0xcf,
+  0x82, 0x10, 0x04, 0x72, 0x24, 0x34, 0x8e, 0x0e, 0xd4, 0xa5, 0x3e, 0x7e,
+  0xe3, 0x9c, 0xe1, 0x7c, 0x0c, 0xbf, 0x61, 0x0f, 0x3a, 0x09, 0x9a, 0x16,
+  0x64, 0x30, 0xab, 0xdc, 0xee, 0x6e, 0xfb, 0x94, 0x81, 0x36, 0xf4, 0xd5,
+  0xc9, 0xe0, 0x9a, 0x67, 0x8e, 0x7f, 0xf3, 0x66, 0xce, 0xf5, 0xa1, 0xf2,
+  0x43, 0xdf, 0x89, 0x6a, 0x28, 0x03, 0x33, 0xd0, 0xc0, 0xda, 0xa0, 0xf1,
+  0x4d, 0x81, 0xbb, 0xb3, 0x63, 0xbb, 0x4e, 0xb6, 0x21, 0x31, 0x4d, 0xa1,
+  0x13, 0xba, 0xdf, 0xf4, 0x83, 0x8e, 0x7c, 0xa5, 0x03, 0x6a, 0xd9, 0x58,
+  0x1b, 0x87, 0x39, 0x23, 0xec, 0xd9, 0x11, 0x16, 0x28, 0xa9, 0x64, 0x80,
+  0x53, 0x6d, 0xc2, 0x8b, 0x3f, 0xec, 0x29, 0xa9, 0x90, 0xb0, 0x60, 0xa2,
+  0xe0, 0xe7, 0xec, 0x38, 0xfb, 0x52, 0xa2, 0x7e, 0x66, 0x54, 0x05, 0x67,
+  0x2a, 0xf8, 0x63, 0x4d, 0xf9, 0x21, 0x6d, 0xa3, 0x41, 0x72, 0xbb, 0x4c,
+  0xe9, 0x5f, 0x63, 0xb6, 0xa0, 0x49, 0x5b, 0xe4, 0xb5, 0xbb, 0x72, 0x01,
+  0x94, 0xad, 0x34, 0x5b, 0x26, 0xa4, 0xa3, 0xc5, 0xc5, 0x0c, 0x7b, 0x3d,
+  0x00, 0x13, 0x29, 0xb8, 0x7e, 0xec, 0x3e, 0x0b, 0xc1, 0x52, 0x3b, 0xdf,
+  0x10, 0xf9, 0x73, 0x7a, 0x76, 0x62, 0x8f, 0x8a, 0xfb, 0x44, 0xd0, 0x25,
+  0xb6, 0xba, 0x3e, 0x5c, 0xd8, 0xcc, 0x88, 0x89, 0x7e, 0x74, 0x89, 0x1d,
+  0xd1, 0x49, 0x67, 0x2a, 0xff, 0xdd, 0x8e, 0xc6, 0x97, 0x84, 0x3c, 0xf0,
+  0x20, 0x36, 0xa9, 0xdc, 0x39, 0xcd, 0xe0, 0x64, 0xe9, 0x27, 0xf8, 0x57,
+  0x07, 0xd3, 0xdc, 0x5b, 0xee, 0x2b, 0xfb, 0x72, 0x09, 0x2b, 0x01, 0x0b,
+  0xbd, 0xf9, 0xc8, 0x9e, 0xd0, 0x15, 0x98, 0xef, 0x34, 0x84, 0x61, 0xcd,
+  0x78, 0x97, 0xa5, 0x59, 0xcc, 0x98, 0x47, 0x98, 0xe8, 0x33, 0x35, 0x16,
+  0xee, 0x0c, 0xc5, 0xc2, 0xe0, 0x68, 0x68, 0x1a, 0x08, 0x61, 0x92, 0x30,
+  0x2a, 0x72, 0x30, 0x56, 0x86, 0x9c, 0x76, 0x66, 0x72, 0xed, 0xdd, 0x18,
+  0x30, 0x6d, 0xad, 0xc1, 0x8b, 0x6a, 0x6e, 0x6e, 0xa3, 0xbd, 0xfb, 0x1e,
+  0x53, 0xa2, 0x21, 0x1b, 0x23, 0xbf, 0x6a, 0xb3, 0x93, 0xec, 0x64, 0xc1,
+  0xbd, 0x43, 0xa7, 0x01, 0xc6, 0x03, 0x40, 0xbe, 0xbb, 0xca, 0xff, 0xde,
+  0xbe, 0x1d, 0x6a, 0x42, 0xe0, 0x3d, 0xca, 0xd7, 0x8f, 0x6a, 0x4e, 0x39,
+  0xd3, 0x49, 0x22, 0x35, 0x4f, 0xb2, 0xd9, 0xc8, 0xb5, 0xe7, 0x81, 0x2b,
+  0xe5, 0x7c, 0xe3, 0xa5, 0x98, 0xbe, 0x68, 0xfb, 0x66, 0x8f, 0x36, 0xf9,
+  0xbe, 0xcf, 0x51, 0x65, 0xf6, 0x9b, 0x71, 0xa3, 0x1a, 0xf9, 0x8d, 0x80,
+  0x30, 0xde, 0x88, 0x5f, 0x06, 0x5b, 0x51, 0x79, 0x88, 0x8b, 0xcb, 0xb9,
+  0xe4, 0xf0, 0x3a, 0x5f, 0xfa, 0x5c, 0x3c, 0x19, 0x58, 0x7c, 0x9e, 0x59,
+  0x90, 0x22, 0x67, 0x21, 0xa8, 0xe8, 0x8a, 0xd5, 0xac, 0xa1, 0x7c, 0x60,
+  0x8e, 0xa3, 0xd8, 0xa4, 0x00, 0xfb, 0x18, 0x7b, 0x88, 0x5c, 0x86, 0x6c,
+  0x56, 0x94, 0x5d, 0xf5, 0x28, 0xe4, 0x5a, 0x04, 0x2c, 0x9e, 0x05, 0x79,
+  0x8c, 0x7f, 0x65, 0x9a, 0x06, 0xf9, 0x2e, 0xf1, 0x22, 0xf9, 0x1b, 0x29,
+  0x92, 0x7d, 0xd3, 0x0b, 0x56, 0x03, 0xca, 0x71, 0xb6, 0x8c, 0x1d, 0x5b,
+  0x7e, 0xef, 0x95, 0x78, 0xa8, 0xc4, 0x0d, 0x82, 0x91, 0xf5, 0x0c, 0xc1,
+  0xaf, 0x1b, 0xe1, 0xc5, 0xfd, 0x6d, 0xe3, 0xab, 0xc4, 0x94, 0x59, 0xa9,
+  0x03, 0x71, 0x13, 0x67, 0x11, 0xfe, 0x78, 0xf0, 0x2e, 0x7a, 0xff, 0x66,
+  0x1f, 0x13, 0x7a, 0xa6, 0x49, 0xb1, 0x28, 0x30, 0x89, 0x53, 0x69, 0xf8,
+  0xe2, 0x5b, 0x67, 0xb0, 0x1d, 0x9b, 0x7d, 0xa1, 0xe0, 0x88, 0xc2, 0xcc,
+  0xc4, 0x5e, 0x80, 0x23, 0xc4, 0xc2, 0xe7, 0xa9, 0x36, 0xd8, 0x54, 0x1c,
+  0x3f, 0x45, 0xab, 0x22, 0xad, 0xe5, 0xb3, 0x66, 0x52, 0x78, 0x8d, 0x81,
+  0xed, 0xef, 0x5a, 0x06, 0x56, 0x3c, 0x2e, 0xb0, 0xb9, 0x4a, 0x36, 0x45,
+  0xb3, 0x20, 0x70, 0xa3, 0xf6, 0x99, 0x69, 0x1e, 0xf3, 0xbd, 0x47, 0x1d,
+  0xd6, 0x7f, 0x8d, 0xd4, 0x73, 0x72, 0x97, 0x3a, 0xef, 0xed, 0xbb, 0x5e,
+  0x85, 0x52, 0x3a, 0xa3, 0x49, 0x4b, 0x0c, 0xd2, 0x50, 0x9c, 0x67, 0x5f,
+  0x98, 0x67, 0xd1, 0x6f, 0x94, 0x66, 0x4e, 0x0b, 0xa3, 0x96, 0x37, 0x44,
+  0xf9, 0x55, 0x03, 0x41, 0x15, 0x33, 0xd6, 0x77, 0x9c, 0xbd, 0x77, 0x5e,
+  0x79, 0x55, 0x77, 0x9a, 0x50, 0x6f, 0x03, 0x43, 0x98, 0xb4, 0x28, 0xea,
+  0x5b, 0xeb, 0xb8, 0x59, 0x58, 0x46, 0x5f, 0x36, 0xf3, 0xa0, 0x95, 0x07,
+  0x26, 0x2e, 0x82, 0x88, 0x5e, 0x75, 0x26, 0xfd, 0xe3, 0xa3, 0xa8, 0xad,
+  0x08, 0x88, 0x68, 0xdd, 0xf9, 0xc8, 0xb6, 0xdc, 0x19, 0xec, 0x7a, 0x3d,
+  0xcd, 0xd2, 0x9f, 0x13, 0x27, 0x17, 0x4c, 0xdb, 0x4f, 0x39, 0x8f, 0xef,
+  0x08, 0xc3, 0xe0, 0xce, 0xc6, 0xc4, 0x14, 0x31, 0x78, 0x6a, 0x1f, 0xd8,
+  0x15, 0xaa, 0xe5, 0xee, 0x71, 0x9c, 0xfb, 0x00, 0xa3, 0x52, 0xe8, 0x3e,
+  0xa9, 0xa5, 0xd5, 0xbf, 0xd8, 0x13, 0x9d, 0x4b, 0x75, 0x63, 0x94, 0xbc,
+  0xb8, 0x11, 0x33, 0x02, 0x64, 0x6c, 0xb2, 0xe9, 0x17, 0x22, 0xf6, 0xe4,
+  0x28, 0x4d, 0x0b, 0x2a, 0xd3, 0xce, 0x0b, 0xff, 0x7a, 0x9f, 0x66, 0x92,
+  0xe8, 0xee, 0xbd, 0xfe, 0xa2, 0xc5, 0xfd, 0x58, 0xb2, 0xcc, 0x3c, 0x21,
+  0x5a, 0x72, 0x9e, 0x7f, 0x69, 0x6f, 0x82, 0x45, 0xa0, 0xed, 0x5a, 0xdc,
+  0xdb, 0xae, 0x8b, 0x59, 0xaa, 0x77, 0x89, 0x5d, 0x28, 0x09, 0xf7, 0x3a,
+  0x08, 0x20, 0xcb, 0x4f, 0xcc, 0xe7, 0x67, 0x39, 0x72, 0x53, 0xe7, 0x7b,
+  0x4c, 0x52, 0x6f, 0xa9, 0x57, 0x85, 0x35, 0x0e, 0xb2, 0xe8, 0xda, 0x29,
+  0x93, 0xb5, 0x4f, 0xbf, 0x12, 0xda, 0x50, 0x79, 0x69, 0x8c, 0xd5, 0xb6,
+  0x37, 0x5e, 0x6e, 0xb9, 0xca, 0xea, 0x18, 0xa3, 0xb2, 0x5c, 0xc6, 0xdf,
+  0xfa, 0x02, 0x53, 0xc6, 0x29, 0x88, 0x91, 0x29, 0x10, 0x35, 0x3d, 0x63,
+  0xd1, 0x0c, 0xed, 0x63, 0x3b, 0x35, 0xa6, 0x7b, 0xed, 0xaa, 0x4f, 0xd1,
+  0xe9, 0x1b, 0xe7, 0xc1, 0x5d, 0xbb, 0xc0, 0x78, 0x86, 0xda, 0xc0, 0x23,
+  0xfb, 0xa9, 0xca, 0x68, 0x1d, 0xdf, 0x72, 0x30, 0x4b, 0x5e, 0x32, 0x65,
+  0x9c, 0xe7, 0x8c, 0xba, 0x45, 0xdb, 0xef, 0x3d, 0xc3, 0xe4, 0x70, 0x7c,
+  0x03, 0x52, 0x6d, 0x54, 0x51, 0x4e, 0x68, 0xa6, 0x31, 0xae, 0xe6, 0xd9,
+  0xbf, 0x7c, 0xb1, 0xe2, 0x59, 0x11, 0x9a, 0xa5, 0x11, 0xf5, 0xce, 0x7b,
+  0x2f, 0xfd, 0x6b, 0xae, 0xe6, 0x80, 0x96, 0x29, 0xc0, 0x55, 0xc3, 0x9b,
+  0x16, 0xad, 0x63, 0x79, 0xf4, 0xbf, 0xab, 0x63, 0xb0, 0x40, 0x3c, 0xc1,
+  0xf2, 0xdf, 0xdd, 0xf9, 0x7e, 0xee, 0xd6, 0x3a, 0xb0, 0x57, 0xb0, 0x48,
+  0x28, 0x4e, 0x30, 0xaa, 0xb5, 0x8b, 0xb0, 0x39, 0x42, 0xb4, 0x3b, 0xce,
+  0x08, 0x7c, 0xe6, 0xa0, 0x47, 0x2c, 0x33, 0xcb, 0x39, 0xd8, 0x08, 0x14,
+  0x34, 0x82, 0xb1, 0x0b, 0x3d, 0x89, 0x3c, 0x5f, 0x3c, 0x50, 0x8e, 0x0f,
+  0x75, 0xab, 0x71, 0x0d, 0xca, 0x9b, 0x25, 0x9b, 0xdc, 0x66, 0x45, 0xd6,
+  0xc1, 0xe6, 0xbc, 0xb6, 0x63, 0xb9, 0x17, 0xcd, 0x8d, 0xd4, 0xc6, 0x63,
+  0x98, 0x2d, 0xdb, 0xe4, 0xa6, 0x7f, 0x00, 0xd5, 0x4b, 0xdf, 0x17, 0x39,
+  0xfe, 0x55, 0x21, 0x42, 0xd6, 0xe3, 0x96, 0xd4, 0x4c, 0x49, 0x22, 0x77,
+  0x3e, 0x23, 0xaa, 0x0d, 0xa6, 0x38, 0xc1, 0x29, 0xdd, 0x24, 0xa3, 0x5b,
+  0xbd, 0x32, 0x32, 0x88, 0x4d, 0x3d, 0x77, 0xde, 0xda, 0x33, 0x5b, 0x4b,
+  0x06, 0xcd, 0xd5, 0x49, 0xd3, 0x0a, 0xb0, 0x8f, 0x32, 0xd5, 0x5c, 0x5d,
+  0x0f, 0x2e, 0x0f, 0x70, 0xce, 0x1c, 0x37, 0x84, 0x0b, 0x71, 0x3c, 0x48,
+  0xfe, 0x2e, 0x75, 0x66, 0xa5, 0x7d, 0xfa, 0x45, 0xcb, 0xd3, 0x03, 0x71,
+  0xec, 0x9d, 0x12, 0x52, 0x33, 0x9c, 0x83, 0xfb, 0x12, 0x13, 0xcd, 0x32,
+  0x53, 0xff, 0x3e, 0xfb, 0xbf, 0x70, 0x66, 0xc4, 0x0d, 0x31, 0xb6, 0x6c,
+  0x1f, 0xfe, 0xdc, 0xda, 0x34, 0x37, 0xcb, 0xec, 0xd6, 0xe8, 0x8b, 0x82,
+  0xa3, 0xa7, 0x07, 0x6c, 0x5f, 0x78, 0xa5, 0x57, 0xc3, 0xf1, 0x83, 0x9a,
+  0xbc, 0xa7, 0xae, 0x78, 0x28, 0xc4, 0xed, 0x28, 0x31, 0x4f, 0xe0, 0xaf,
+  0x4b, 0x67, 0x0f, 0x5e, 0x6d, 0x19, 0xf1, 0x2b, 0x90, 0x3c, 0xb7, 0xc9,
+  0xa3, 0xa5, 0x3a, 0xcd, 0xb1, 0x58, 0xa4, 0x19, 0xba, 0x20, 0xec, 0x23,
+  0x76, 0x80, 0xed, 0x9a, 0x10, 0x68, 0xaa, 0x1b, 0x65, 0x15, 0x57, 0x4b,
+  0x47, 0xc4, 0xbc, 0x62, 0xda, 0x19, 0x60, 0xd4, 0x71, 0x2e, 0xf4, 0x9a,
+  0x66, 0xea, 0x6d, 0x6b, 0xb8, 0xd0, 0xf4, 0xa5, 0x1f, 0x7e, 0x60, 0x39,
+  0x92, 0x2b, 0x30, 0x92, 0x84, 0xae, 0x4c, 0xf3, 0x27, 0x60, 0xba, 0xac,
+  0x7a, 0xe0, 0x15, 0xa6, 0x78, 0x4f, 0x91, 0x60, 0x7f, 0x4a, 0xc5, 0xbe,
+  0xa1, 0xcb, 0x13, 0x8a, 0x9e, 0xe7, 0x99, 0xc4, 0x6c, 0x31, 0x79, 0x93,
+  0x5c, 0x9f, 0x0c, 0x36, 0xcd, 0xae, 0x30, 0x98, 0xc1, 0xd1, 0x87, 0xeb,
+  0x77, 0x17, 0x57, 0x83, 0x68, 0x13, 0x6b, 0xdb, 0xaf, 0xaf, 0x4e, 0xbf,
+  0xfe, 0x70, 0x0d, 0xff, 0xd4, 0x91, 0xde, 0xc4, 0x59, 0x0a, 0xd2, 0x69,
+  0x50, 0x25, 0x19, 0xd0, 0xca, 0x54, 0x7b, 0x34, 0x51, 0x0e, 0x0a, 0xca,
+  0xe3, 0xbc, 0x50, 0x48, 0x13, 0x4c, 0x47, 0xc9, 0x67, 0x36, 0x99, 0x80,
+  0x3d, 0xd8, 0x98, 0xe3, 0x97, 0x5b, 0xcb, 0x39, 0x6d, 0x14, 0xe5, 0x6b,
+  0xda, 0x4e, 0x74, 0xfd, 0xee, 0xe8, 0xfc, 0xdb, 0x81, 0x76, 0xf0, 0xf8,
+  0xfe, 0xfb, 0xef, 0x9b, 0xc1, 0x5d, 0xd2, 0x61, 0x6f, 0xe2, 0x87, 0x87,
+  0x7e, 0x99, 0x7c, 0xf6, 0xd9, 0xe0, 0xe4, 0x24, 0x3a, 0x3a, 0x1b, 0x5c,
+  0x7c, 0x66, 0x71, 0x1c, 0xd6, 0xb7, 0x37, 0x40, 0x49, 0x9b, 0x26, 0x15,
+  0xfc, 0xe5, 0xb3, 0xcf, 0xfe, 0x3f, 0x9c, 0x42, 0xb5, 0x6c, 0xe8, 0xa0,
+  0x02, 0x00,
 };
 #define BUF_SIZE 0x10000
 static voidpf zalloc_func(voidpf opaque, unsigned int items, unsigned int size)
index 16520b6..9f93969 100644 (file)
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
index 19ec65a..de7ec4d 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
index b3a9b9c..9563cc3 100644 (file)
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
index 612bfcb..06923c3 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -38,6 +38,7 @@
 
 #include "tool_cfgable.h"
 #include "tool_convert.h"
+#include "tool_doswin.h"
 #include "tool_msgs.h"
 #include "tool_operate.h"
 #include "tool_panykey.h"
@@ -111,10 +112,10 @@ static void memory_tracking_init(void)
       env[CURL_MT_LOGFNAME_BUFSIZE-1] = '\0';
     strcpy(fname, env);
     curl_free(env);
-    curl_memdebug(fname);
-    /* this weird stuff here is to make curl_free() get called
-       before curl_memdebug() as otherwise memory tracking will
-       log a free() without an alloc! */
+    curl_dbg_memdebug(fname);
+    /* this weird stuff here is to make curl_free() get called before
+       curl_gdb_memdebug() as otherwise memory tracking will log a free()
+       without an alloc! */
   }
   /* if CURL_MEMLIMIT is set, this enables fail-on-alloc-number-N feature */
   env = curlx_getenv("CURL_MEMLIMIT");
@@ -122,7 +123,7 @@ static void memory_tracking_init(void)
     char *endptr;
     long num = strtol(env, &endptr, 10);
     if((endptr != env) && (endptr == env + strlen(env)) && (num > 0))
-      curl_memlimit(num);
+      curl_dbg_memlimit(num);
     curl_free(env);
   }
 }
@@ -148,6 +149,7 @@ static CURLcode main_init(struct GlobalConfig *config)
   config->showerror = -1;             /* Will show errors */
   config->errors = stderr;            /* Default errors to stderr */
   config->styled_output = TRUE;       /* enable detection */
+  config->parallel_max = PARALLEL_DEFAULT;
 
   /* Allocate the initial operate config */
   config->first = config->last = malloc(sizeof(struct OperationConfig));
@@ -159,39 +161,29 @@ static CURLcode main_init(struct GlobalConfig *config)
       result = get_libcurl_info();
 
       if(!result) {
-        /* Get a curl handle to use for all forthcoming curl transfers */
-        config->easy = curl_easy_init();
-        if(config->easy) {
-          /* Initialise the config */
-          config_init(config->first);
-          config->first->easy = config->easy;
-          config->first->global = config;
-        }
-        else {
-          helpf(stderr, "error initializing curl easy handle\n");
-          result = CURLE_FAILED_INIT;
-          free(config->first);
-        }
+        /* Initialise the config */
+        config_init(config->first);
+        config->first->global = config;
       }
       else {
-        helpf(stderr, "error retrieving curl library information\n");
+        errorf(config, "error retrieving curl library information\n");
         free(config->first);
       }
     }
     else {
-      helpf(stderr, "error initializing curl library\n");
+      errorf(config, "error initializing curl library\n");
       free(config->first);
     }
   }
   else {
-    helpf(stderr, "error initializing curl\n");
+    errorf(config, "error initializing curl\n");
     result = CURLE_FAILED_INIT;
   }
 
   return result;
 }
 
-static void free_config_fields(struct GlobalConfig *config)
+static void free_globalconfig(struct GlobalConfig *config)
 {
   Curl_safefree(config->trace_dump);
 
@@ -213,9 +205,6 @@ static void free_config_fields(struct GlobalConfig *config)
 static void main_free(struct GlobalConfig *config)
 {
   /* Cleanup the easy handle */
-  curl_easy_cleanup(config->easy);
-  config->easy = NULL;
-
   /* Main cleanup */
   curl_global_cleanup();
   convert_cleanup();
@@ -228,7 +217,7 @@ static void main_free(struct GlobalConfig *config)
     PR_Cleanup();
   }
 #endif
-  free_config_fields(config);
+  free_globalconfig(config);
 
   /* Free the config structures */
   config_free(config->last);
@@ -236,18 +225,17 @@ static void main_free(struct GlobalConfig *config)
   config->last = NULL;
 }
 
-#ifdef _WIN32
+#ifdef WIN32
 /* TerminalSettings for Windows */
 static struct TerminalSettings {
   HANDLE hStdOut;
   DWORD dwOutputMode;
-  UINT nCodepage;
 } TerminalSettings;
 
 static void configure_terminal(void)
 {
   /*
-   * If we're running Windows, enable VT output & set codepage to UTF-8.
+   * If we're running Windows, enable VT output.
    * Note: VT mode flag can be set on any version of Windows, but VT
    * processing only performed on Win10 >= Creators Update)
    */
@@ -257,10 +245,7 @@ static void configure_terminal(void)
     #define ENABLE_VIRTUAL_TERMINAL_PROCESSING 0x0004
 #endif
 
-  /* Cache current codepage (will restore on exit) & set codepage to UTF-8 */
   memset(&TerminalSettings, 0, sizeof(TerminalSettings));
-  TerminalSettings.nCodepage = GetConsoleOutputCP();
-  SetConsoleOutputCP(65001);
 
   /* Enable VT output */
   TerminalSettings.hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
@@ -278,11 +263,10 @@ static void configure_terminal(void)
 
 static void restore_terminal(void)
 {
-#ifdef _WIN32
+#ifdef WIN32
   /* Restore Console output mode and codepage to whatever they were
    * when Curl started */
   SetConsoleMode(TerminalSettings.hStdOut, TerminalSettings.dwOutputMode);
-  SetConsoleOutputCP(TerminalSettings.nCodepage);
 #endif
 }
 
@@ -310,6 +294,21 @@ int main(int argc, char *argv[])
   /* Initialize the curl library - do not call any libcurl functions before
      this point */
   result = main_init(&global);
+
+#ifdef WIN32
+  /* Undocumented diagnostic option to list the full paths of all loaded
+     modules, regardless of whether or not initialization succeeded. */
+  if(argc == 2 && !strcmp(argv[1], "--dump-module-paths")) {
+    struct curl_slist *item, *head = GetLoadedModulePaths();
+    for(item = head; item; item = item->next) {
+      printf("%s\n", item->data);
+    }
+    curl_slist_free_all(head);
+    if(!result)
+      main_free(&global);
+  }
+  else
+#endif /* WIN32 */
   if(!result) {
     /* Start our curl operation */
     result = operate(&global, argc, argv);
index 8688188..a68287e 100644 (file)
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -28,6 +28,9 @@
 #define RETRY_SLEEP_DEFAULT 1000L   /* ms */
 #define RETRY_SLEEP_MAX     600000L /* ms == 10 minutes */
 
+#define MAX_PARALLEL 300 /* conservative */
+#define PARALLEL_DEFAULT 50
+
 #ifndef STDIN_FILENO
 #  define STDIN_FILENO  fileno(stdin)
 #endif
index 4c42614..6d62f2d 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -73,7 +73,7 @@
    and later. If you're building for an older cat, well, sorry. */
 #  define COMMON_DIGEST_FOR_OPENSSL
 #  include <CommonCrypto/CommonDigest.h>
-#elif defined(_WIN32)
+#elif defined(WIN32)
 /* For Windows: If no other crypto library is provided, we fallback
    to the hash functions provided within the Microsoft Windows CryptoAPI */
 #  include <wincrypt.h>
@@ -104,6 +104,7 @@ struct win32_crypto_hash {
 #include "tool_paramhlp.h"
 #include "tool_cfgable.h"
 #include "tool_metalink.h"
+#include "tool_operate.h"
 #include "tool_msgs.h"
 
 #include "memdebug.h" /* keep this as LAST include */
@@ -118,7 +119,7 @@ struct win32_crypto_hash {
     *(str) = strdup((val)); \
   if(!(val)) \
     return PARAM_NO_MEM; \
-} WHILE_FALSE
+} while(0)
 
 #if defined(USE_OPENSSL)
 /* Functions are already defined */
@@ -380,7 +381,7 @@ static void SHA256_Final(unsigned char digest[32], SHA256_CTX *ctx)
   sha256_finish(ctx, digest);
 }
 
-#elif defined(_WIN32)
+#elif defined(WIN32)
 
 static void win32_crypto_final(struct win32_crypto_hash *ctx,
                                unsigned char *digest,
@@ -674,8 +675,9 @@ int metalink_check_hash(struct GlobalConfig *config,
   return rv;
 }
 
-static metalink_checksum *new_metalink_checksum_from_hex_digest
-(const metalink_digest_def *digest_def, const char *hex_digest)
+static metalink_checksum *
+checksum_from_hex_digest(const metalink_digest_def *digest_def,
+                         const char *hex_digest)
 {
   metalink_checksum *chksum;
   unsigned char *digest;
@@ -754,8 +756,8 @@ static metalinkfile *new_metalinkfile(metalink_file_t *fileinfo)
         if(curl_strequal(digest_alias->alias_name, (*p)->type) &&
            check_hex_digest((*p)->hash, digest_alias->digest_def)) {
           f->checksum =
-            new_metalink_checksum_from_hex_digest(digest_alias->digest_def,
-                                                  (*p)->hash);
+            checksum_from_hex_digest(digest_alias->digest_def,
+                                     (*p)->hash);
           break;
         }
       }
@@ -891,7 +893,8 @@ int parse_metalink(struct OperationConfig *config, struct OutStruct *outs,
 size_t metalink_write_cb(void *buffer, size_t sz, size_t nmemb,
                          void *userdata)
 {
-  struct OutStruct *outs = userdata;
+  struct per_transfer *per = userdata;
+  struct OutStruct *outs = &per->outs;
   struct OperationConfig *config = outs->config;
   int rv;
 
@@ -962,7 +965,7 @@ static void delete_metalink_resource(metalink_resource *res)
   Curl_safefree(res);
 }
 
-static void delete_metalinkfile(metalinkfile *mlfile)
+void delete_metalinkfile(metalinkfile *mlfile)
 {
   metalink_resource *res;
   if(mlfile == NULL) {
@@ -981,12 +984,14 @@ static void delete_metalinkfile(metalinkfile *mlfile)
 
 void clean_metalink(struct OperationConfig *config)
 {
-  while(config->metalinkfile_list) {
-    metalinkfile *mlfile = config->metalinkfile_list;
-    config->metalinkfile_list = config->metalinkfile_list->next;
-    delete_metalinkfile(mlfile);
+  if(config) {
+    while(config->metalinkfile_list) {
+      metalinkfile *mlfile = config->metalinkfile_list;
+      config->metalinkfile_list = config->metalinkfile_list->next;
+      delete_metalinkfile(mlfile);
+    }
+    config->metalinkfile_last = 0;
   }
-  config->metalinkfile_last = 0;
 }
 
 void metalink_cleanup(void)
index 7ee2736..f5ec306 100644 (file)
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2014, 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -22,6 +22,7 @@
  *
  ***************************************************************************/
 #include "tool_setup.h"
+#include "tool_sdecls.h"
 
 struct GlobalConfig;
 struct OperationConfig;
@@ -104,6 +105,8 @@ extern const digest_params SHA256_DIGEST_PARAMS[1];
  * Counts the resource in the metalinkfile.
  */
 int count_next_metalink_resource(metalinkfile *mlfile);
+
+void delete_metalinkfile(metalinkfile *mlfile);
 void clean_metalink(struct OperationConfig *config);
 
 /*
@@ -157,6 +160,7 @@ void metalink_cleanup(void);
 #else /* USE_METALINK */
 
 #define count_next_metalink_resource(x)  0
+#define delete_metalinkfile(x)  (void)x
 #define clean_metalink(x)  (void)x
 
 /* metalink_cleanup() takes no arguments */
index f5e1df2..48877b3 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2015, 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -32,6 +32,7 @@
 
 #define WARN_PREFIX "Warning: "
 #define NOTE_PREFIX "Note: "
+#define ERROR_PREFIX "curl: "
 
 static void voutf(struct GlobalConfig *config,
                   const char *prefix,
@@ -104,9 +105,9 @@ void warnf(struct GlobalConfig *config, const char *fmt, ...)
   va_end(ap);
 }
 /*
- * Emit help formatted message on given stream.
+ * Emit help formatted message on given stream. This is for errors with or
+ * related to command line arguments.
  */
-
 void helpf(FILE *errors, const char *fmt, ...)
 {
   if(fmt) {
@@ -122,3 +123,17 @@ void helpf(FILE *errors, const char *fmt, ...)
 #endif
           "for more information\n");
 }
+
+/*
+ * Emit error message on error stream if not muted. When errors are not tied
+ * to command line arguments, use helpf() for such errors.
+ */
+void errorf(struct GlobalConfig *config, const char *fmt, ...)
+{
+  if(!config->mute) {
+    va_list ap;
+    va_start(ap, fmt);
+    voutf(config, ERROR_PREFIX, fmt, ap);
+    va_end(ap);
+  }
+}
index d1cc7f8..2c4afd1 100644 (file)
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -25,7 +25,7 @@
 
 void warnf(struct GlobalConfig *config, const char *fmt, ...);
 void notef(struct GlobalConfig *config, const char *fmt, ...);
-
 void helpf(FILE *errors, const char *fmt, ...);
+void errorf(struct GlobalConfig *config, const char *fmt, ...);
 
 #endif /* HEADER_CURL_TOOL_MSGS_H */
index 5a72b6a..2bee934 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
 #  include <locale.h>
 #endif
 
+#ifdef HAVE_SYS_SELECT_H
+#  include <sys/select.h>
+#endif
+
 #ifdef __VMS
 #  include <fabdef.h>
 #endif
 
+#ifdef __AMIGA__
+#  include <proto/dos.h>
+#endif
+
 #include "strcase.h"
 
 #define ENABLE_CURLX_PRINTF
@@ -71,6 +79,7 @@
 #include "tool_vms.h"
 #include "tool_help.h"
 #include "tool_hugehelp.h"
+#include "tool_progress.h"
 
 #include "memdebug.h" /* keep this as LAST include */
 
@@ -94,10 +103,18 @@ CURLcode curl_easy_perform_ev(CURL *easy);
   "this situation and\nhow to fix it, please visit the web page mentioned " \
   "above.\n"
 
+static CURLcode single_transfer(struct GlobalConfig *global,
+                                struct OperationConfig *config,
+                                CURLSH *share,
+                                bool capath_from_env,
+                                bool *added);
+static CURLcode create_transfer(struct GlobalConfig *global,
+                                CURLSH *share,
+                                bool *added);
+
 static bool is_fatal_error(CURLcode code)
 {
   switch(code) {
-  /* TODO: Should CURLE_SSL_CACERT be included as critical error ? */
   case CURLE_FAILED_INIT:
   case CURLE_OUT_OF_MEMORY:
   case CURLE_UNKNOWN_OPTION:
@@ -184,205 +201,544 @@ static curl_off_t VmsSpecialSize(const char *name,
 
 #define BUFFER_SIZE (100*1024)
 
-static CURLcode operate_do(struct GlobalConfig *global,
-                           struct OperationConfig *config)
+struct per_transfer *transfers; /* first node */
+static struct per_transfer *transfersl; /* last node */
+
+/* add_per_transfer creates a new 'per_transfer' node in the linked
+   list of transfers */
+static CURLcode add_per_transfer(struct per_transfer **per)
 {
-  char errorbuffer[CURL_ERROR_SIZE];
-  struct ProgressData progressbar;
-  struct getout *urlnode;
+  struct per_transfer *p;
+  p = calloc(sizeof(struct per_transfer), 1);
+  if(!p)
+    return CURLE_OUT_OF_MEMORY;
+  if(!transfers)
+    /* first entry */
+    transfersl = transfers = p;
+  else {
+    /* make the last node point to the new node */
+    transfersl->next = p;
+    /* make the new node point back to the formerly last node */
+    p->prev = transfersl;
+    /* move the last node pointer to the new entry */
+    transfersl = p;
+  }
+  *per = p;
+  all_xfers++; /* count total number of transfers added */
+  return CURLE_OK;
+}
 
-  struct HdrCbData hdrcbdata;
-  struct OutStruct heads;
+/* Remove the specified transfer from the list (and free it), return the next
+   in line */
+static struct per_transfer *del_per_transfer(struct per_transfer *per)
+{
+  struct per_transfer *n;
+  struct per_transfer *p;
+  DEBUGASSERT(transfers);
+  DEBUGASSERT(transfersl);
+  DEBUGASSERT(per);
 
-  metalinkfile *mlfile_last = NULL;
+  n = per->next;
+  p = per->prev;
+
+  if(p)
+    p->next = n;
+  else
+    transfers = n;
 
-  CURL *curl = config->easy;
-  char *httpgetfields = NULL;
+  if(n)
+    n->prev = p;
+  else
+    transfersl = p;
 
+  free(per);
+
+  return n;
+}
+
+static CURLcode pre_transfer(struct GlobalConfig *global,
+                             struct per_transfer *per)
+{
+  curl_off_t uploadfilesize = -1;
+  struct_stat fileinfo;
   CURLcode result = CURLE_OK;
-  unsigned long li;
-  bool capath_from_env;
 
-  /* Save the values of noprogress and isatty to restore them later on */
-  bool orig_noprogress = global->noprogress;
-  bool orig_isatty = global->isatty;
+  if(per->separator_err)
+    fprintf(global->errors, "%s\n", per->separator_err);
+  if(per->separator)
+    printf("%s\n", per->separator);
 
-  errorbuffer[0] = '\0';
+  if(per->uploadfile && !stdin_upload(per->uploadfile)) {
+    /* VMS Note:
+     *
+     * Reading binary from files can be a problem...  Only FIXED, VAR
+     * etc WITHOUT implied CC will work Others need a \n appended to a
+     * line
+     *
+     * - Stat gives a size but this is UNRELIABLE in VMS As a f.e. a
+     * fixed file with implied CC needs to have a byte added for every
+     * record processed, this can by derived from Filesize & recordsize
+     * for VARiable record files the records need to be counted!  for
+     * every record add 1 for linefeed and subtract 2 for the record
+     * header for VARIABLE header files only the bare record data needs
+     * to be considered with one appended if implied CC
+     */
+#ifdef __VMS
+    /* Calculate the real upload size for VMS */
+    per->infd = -1;
+    if(stat(per->uploadfile, &fileinfo) == 0) {
+      fileinfo.st_size = VmsSpecialSize(uploadfile, &fileinfo);
+      switch(fileinfo.st_fab_rfm) {
+      case FAB$C_VAR:
+      case FAB$C_VFC:
+      case FAB$C_STMCR:
+        per->infd = open(per->uploadfile, O_RDONLY | O_BINARY);
+        break;
+      default:
+        per->infd = open(per->uploadfile, O_RDONLY | O_BINARY,
+                        "rfm=stmlf", "ctx=stm");
+      }
+    }
+    if(per->infd == -1)
+#else
+      per->infd = open(per->uploadfile, O_RDONLY | O_BINARY);
+    if((per->infd == -1) || fstat(per->infd, &fileinfo))
+#endif
+    {
+      helpf(global->errors, "Can't open '%s'!\n", per->uploadfile);
+      if(per->infd != -1) {
+        close(per->infd);
+        per->infd = STDIN_FILENO;
+      }
+      return CURLE_READ_ERROR;
+    }
+    per->infdopen = TRUE;
 
-  /* default headers output stream is stdout */
-  memset(&hdrcbdata, 0, sizeof(struct HdrCbData));
-  memset(&heads, 0, sizeof(struct OutStruct));
-  heads.stream = stdout;
-  heads.config = config;
+    /* we ignore file size for char/block devices, sockets, etc. */
+    if(S_ISREG(fileinfo.st_mode))
+      uploadfilesize = fileinfo.st_size;
 
-  /*
-  ** Beyond this point no return'ing from this function allowed.
-  ** Jump to label 'quit_curl' in order to abandon this function
-  ** from outside of nested loops further down below.
-  */
+    if(uploadfilesize != -1)
+      my_setopt(per->curl, CURLOPT_INFILESIZE_LARGE, uploadfilesize);
+    per->input.fd = per->infd;
+  }
+  return result;
+}
 
-  /* Check we have a url */
-  if(!config->url_list || !config->url_list->url) {
-    helpf(global->errors, "no URL specified!\n");
-    result = CURLE_FAILED_INIT;
-    goto quit_curl;
+/*
+ * Call this after a transfer has completed.
+ */
+static CURLcode post_per_transfer(struct GlobalConfig *global,
+                                  struct per_transfer *per,
+                                  CURLcode result,
+                                  bool *retryp)
+{
+  struct OutStruct *outs = &per->outs;
+  CURL *curl = per->curl;
+  struct OperationConfig *config = per->config;
+
+  if(!curl || !config)
+    return result;
+
+  *retryp = FALSE;
+
+  if(per->infdopen)
+    close(per->infd);
+
+#ifdef __VMS
+  if(is_vms_shell()) {
+    /* VMS DCL shell behavior */
+    if(!global->showerror)
+      vms_show = VMSSTS_HIDE;
   }
+  else
+#endif
+    if(config->synthetic_error) {
+      ;
+    }
+    else if(result && global->showerror) {
+      fprintf(global->errors, "curl: (%d) %s\n", result,
+              (per->errorbuffer[0]) ? per->errorbuffer :
+              curl_easy_strerror(result));
+      if(result == CURLE_PEER_FAILED_VERIFICATION)
+        fputs(CURL_CA_CERT_ERRORMSG, global->errors);
+    }
 
-  /* On WIN32 we can't set the path to curl-ca-bundle.crt
-   * at compile time. So we look here for the file in two ways:
-   * 1: look at the environment variable CURL_CA_BUNDLE for a path
-   * 2: if #1 isn't found, use the windows API function SearchPath()
-   *    to find it along the app's path (includes app's dir and CWD)
-   *
-   * We support the environment variable thing for non-Windows platforms
-   * too. Just for the sake of it.
-   */
-  capath_from_env = false;
-  if(!config->cacert &&
-     !config->capath &&
-     !config->insecure_ok) {
-    struct curl_tlssessioninfo *tls_backend_info = NULL;
+  /* Set file extended attributes */
+  if(!result && config->xattr && outs->fopened && outs->stream) {
+    int rc = fwrite_xattr(curl, fileno(outs->stream));
+    if(rc)
+      warnf(config->global, "Error setting extended attributes: %s\n",
+            strerror(errno));
+  }
 
-    /* With the addition of CAINFO support for Schannel, this search could find
-     * a certificate bundle that was previously ignored. To maintain backward
-     * compatibility, only perform this search if not using Schannel.
-     */
-    result = curl_easy_getinfo(config->easy,
-                               CURLINFO_TLS_SSL_PTR,
-                               &tls_backend_info);
-    if(result) {
-      goto quit_curl;
+  if(!result && !outs->stream && !outs->bytes) {
+    /* we have received no data despite the transfer was successful
+       ==> force cration of an empty output file (if an output file
+       was specified) */
+    long cond_unmet = 0L;
+    /* do not create (or even overwrite) the file in case we get no
+       data because of unmet condition */
+    curl_easy_getinfo(curl, CURLINFO_CONDITION_UNMET, &cond_unmet);
+    if(!cond_unmet && !tool_create_output_file(outs))
+      result = CURLE_WRITE_ERROR;
+  }
+
+  if(!outs->s_isreg && outs->stream) {
+    /* Dump standard stream buffered data */
+    int rc = fflush(outs->stream);
+    if(!result && rc) {
+      /* something went wrong in the writing process */
+      result = CURLE_WRITE_ERROR;
+      fprintf(global->errors, "(%d) Failed writing body\n", result);
     }
+  }
 
-    /* Set the CA cert locations specified in the environment. For Windows if
-     * no environment-specified filename is found then check for CA bundle
-     * default filename curl-ca-bundle.crt in the user's PATH.
-     *
-     * If Schannel (WinSSL) is the selected SSL backend then these locations
-     * are ignored. We allow setting CA location for schannel only when
-     * explicitly specified by the user via CURLOPT_CAINFO / --cacert.
-     */
-    if(tls_backend_info->backend != CURLSSLBACKEND_SCHANNEL) {
-      char *env;
-      env = curlx_getenv("CURL_CA_BUNDLE");
-      if(env) {
-        config->cacert = strdup(env);
-        if(!config->cacert) {
-          curl_free(env);
-          helpf(global->errors, "out of memory\n");
-          result = CURLE_OUT_OF_MEMORY;
-          goto quit_curl;
+#ifdef USE_METALINK
+  if(per->metalink && !per->metalink_next_res)
+    fprintf(global->errors, "Metalink: fetching (%s) from (%s) OK\n",
+            per->mlfile->filename, per->this_url);
+
+  if(!per->metalink && config->use_metalink && result == CURLE_OK) {
+    int rv = parse_metalink(config, outs, per->this_url);
+    if(!rv) {
+      fprintf(config->global->errors, "Metalink: parsing (%s) OK\n",
+              per->this_url);
+    }
+    else if(rv == -1)
+      fprintf(config->global->errors, "Metalink: parsing (%s) FAILED\n",
+              per->this_url);
+  }
+  else if(per->metalink && result == CURLE_OK && !per->metalink_next_res) {
+    int rv;
+    (void)fflush(outs->stream);
+    rv = metalink_check_hash(global, per->mlfile, outs->filename);
+    if(!rv)
+      per->metalink_next_res = 1;
+  }
+#endif /* USE_METALINK */
+
+#ifdef USE_METALINK
+  if(outs->metalink_parser)
+    metalink_parser_context_delete(outs->metalink_parser);
+#endif /* USE_METALINK */
+
+  if(outs->is_cd_filename && outs->stream && !global->mute &&
+     outs->filename)
+    printf("curl: Saved to filename '%s'\n", outs->filename);
+
+  /* if retry-max-time is non-zero, make sure we haven't exceeded the
+     time */
+  if(per->retry_numretries &&
+     (!config->retry_maxtime ||
+      (tvdiff(tvnow(), per->retrystart) <
+       config->retry_maxtime*1000L)) ) {
+    enum {
+      RETRY_NO,
+      RETRY_TIMEOUT,
+      RETRY_CONNREFUSED,
+      RETRY_HTTP,
+      RETRY_FTP,
+      RETRY_LAST /* not used */
+    } retry = RETRY_NO;
+    long response;
+    if((CURLE_OPERATION_TIMEDOUT == result) ||
+       (CURLE_COULDNT_RESOLVE_HOST == result) ||
+       (CURLE_COULDNT_RESOLVE_PROXY == result) ||
+       (CURLE_FTP_ACCEPT_TIMEOUT == result))
+      /* retry timeout always */
+      retry = RETRY_TIMEOUT;
+    else if(config->retry_connrefused &&
+            (CURLE_COULDNT_CONNECT == result)) {
+      long oserrno;
+      curl_easy_getinfo(curl, CURLINFO_OS_ERRNO, &oserrno);
+      if(ECONNREFUSED == oserrno)
+        retry = RETRY_CONNREFUSED;
+    }
+    else if((CURLE_OK == result) ||
+            (config->failonerror &&
+             (CURLE_HTTP_RETURNED_ERROR == result))) {
+      /* If it returned OK. _or_ failonerror was enabled and it
+         returned due to such an error, check for HTTP transient
+         errors to retry on. */
+      long protocol;
+      curl_easy_getinfo(curl, CURLINFO_PROTOCOL, &protocol);
+      if((protocol == CURLPROTO_HTTP) || (protocol == CURLPROTO_HTTPS)) {
+        /* This was HTTP(S) */
+        curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &response);
+
+        switch(response) {
+        case 429: /* Too Many Requests (RFC6585) */
+        case 500: /* Internal Server Error */
+        case 502: /* Bad Gateway */
+        case 503: /* Service Unavailable */
+        case 504: /* Gateway Timeout */
+          retry = RETRY_HTTP;
+          /*
+           * At this point, we have already written data to the output
+           * file (or terminal). If we write to a file, we must rewind
+           * or close/re-open the file so that the next attempt starts
+           * over from the beginning.
+           *
+           * TODO: similar action for the upload case. We might need
+           * to start over reading from a previous point if we have
+           * uploaded something when this was returned.
+           */
+          break;
         }
       }
-      else {
-        env = curlx_getenv("SSL_CERT_DIR");
-        if(env) {
-          config->capath = strdup(env);
-          if(!config->capath) {
-            curl_free(env);
-            helpf(global->errors, "out of memory\n");
-            result = CURLE_OUT_OF_MEMORY;
-            goto quit_curl;
-          }
-          capath_from_env = true;
-        }
-        else {
-          env = curlx_getenv("SSL_CERT_FILE");
-          if(env) {
-            config->cacert = strdup(env);
-            if(!config->cacert) {
-              curl_free(env);
-              helpf(global->errors, "out of memory\n");
-              result = CURLE_OUT_OF_MEMORY;
-              goto quit_curl;
-            }
-          }
+    } /* if CURLE_OK */
+    else if(result) {
+      long protocol;
+
+      curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &response);
+      curl_easy_getinfo(curl, CURLINFO_PROTOCOL, &protocol);
+
+      if((protocol == CURLPROTO_FTP || protocol == CURLPROTO_FTPS) &&
+         response / 100 == 4)
+        /*
+         * This is typically when the FTP server only allows a certain
+         * amount of users and we are not one of them.  All 4xx codes
+         * are transient.
+         */
+        retry = RETRY_FTP;
+    }
+
+    if(retry) {
+      long sleeptime = 0;
+      curl_off_t retry_after = 0;
+      static const char * const m[]={
+        NULL,
+        "timeout",
+        "connection refused",
+        "HTTP error",
+        "FTP error"
+      };
+
+      sleeptime = per->retry_sleep;
+      if(RETRY_HTTP == retry) {
+        curl_easy_getinfo(curl, CURLINFO_RETRY_AFTER, &retry_after);
+        if(retry_after) {
+          /* store in a 'long', make sure it doesn't overflow */
+          if(retry_after > LONG_MAX/1000)
+            sleeptime = LONG_MAX;
+          else
+            sleeptime = (long)retry_after * 1000; /* milliseconds */
         }
       }
-
-      if(env)
-        curl_free(env);
-#ifdef WIN32
-      else {
-        result = FindWin32CACert(config, tls_backend_info->backend,
-                                 "curl-ca-bundle.crt");
-        if(result)
-          goto quit_curl;
+      warnf(config->global, "Transient problem: %s "
+            "Will retry in %ld seconds. "
+            "%ld retries left.\n",
+            m[retry], sleeptime/1000L, per->retry_numretries);
+
+      per->retry_numretries--;
+      tool_go_sleep(sleeptime);
+      if(!config->retry_delay) {
+        per->retry_sleep *= 2;
+        if(per->retry_sleep > RETRY_SLEEP_MAX)
+          per->retry_sleep = RETRY_SLEEP_MAX;
       }
+      if(outs->bytes && outs->filename && outs->stream) {
+        int rc;
+        /* We have written data to a output file, we truncate file
+         */
+        if(!global->mute)
+          fprintf(global->errors, "Throwing away %"
+                  CURL_FORMAT_CURL_OFF_T " bytes\n",
+                  outs->bytes);
+        fflush(outs->stream);
+        /* truncate file at the position where we started appending */
+#ifdef HAVE_FTRUNCATE
+        if(ftruncate(fileno(outs->stream), outs->init)) {
+          /* when truncate fails, we can't just append as then we'll
+             create something strange, bail out */
+          if(!global->mute)
+            fprintf(global->errors,
+                    "failed to truncate, exiting\n");
+          return CURLE_WRITE_ERROR;
+        }
+        /* now seek to the end of the file, the position where we
+           just truncated the file in a large file-safe way */
+        rc = fseek(outs->stream, 0, SEEK_END);
+#else
+        /* ftruncate is not available, so just reposition the file
+           to the location we would have truncated it. This won't
+           work properly with large files on 32-bit systems, but
+           most of those will have ftruncate. */
+        rc = fseek(outs->stream, (long)outs->init, SEEK_SET);
 #endif
-    }
-  }
-
-  if(config->postfields) {
-    if(config->use_httpget) {
-      /* Use the postfields data for a http get */
-      httpgetfields = strdup(config->postfields);
-      Curl_safefree(config->postfields);
-      if(!httpgetfields) {
-        helpf(global->errors, "out of memory\n");
-        result = CURLE_OUT_OF_MEMORY;
-        goto quit_curl;
+        if(rc) {
+          if(!global->mute)
+            fprintf(global->errors,
+                    "failed seeking to end of file, exiting\n");
+          return CURLE_WRITE_ERROR;
+        }
+        outs->bytes = 0; /* clear for next round */
       }
-      if(SetHTTPrequest(config,
-                        (config->no_body?HTTPREQ_HEAD:HTTPREQ_GET),
-                        &config->httpreq)) {
-        result = CURLE_FAILED_INIT;
-        goto quit_curl;
+      *retryp = TRUE; /* curl_easy_perform loop */
+      return CURLE_OK;
+    }
+  } /* if retry_numretries */
+  else if(per->metalink) {
+    /* Metalink: Decide to try the next resource or not. Try the next resource
+       if download was not successful. */
+    long response;
+    if(CURLE_OK == result) {
+      /* TODO We want to try next resource when download was
+         not successful. How to know that? */
+      char *effective_url = NULL;
+      curl_easy_getinfo(curl, CURLINFO_EFFECTIVE_URL, &effective_url);
+      if(effective_url &&
+         curl_strnequal(effective_url, "http", 4)) {
+        /* This was HTTP(S) */
+        curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &response);
+        if(response != 200 && response != 206) {
+          per->metalink_next_res = 1;
+          fprintf(global->errors,
+                  "Metalink: fetching (%s) from (%s) FAILED "
+                  "(HTTP status code %ld)\n",
+                  per->mlfile->filename, per->this_url, response);
+        }
       }
     }
     else {
-      if(SetHTTPrequest(config, HTTPREQ_SIMPLEPOST, &config->httpreq)) {
-        result = CURLE_FAILED_INIT;
-        goto quit_curl;
-      }
+      per->metalink_next_res = 1;
+      fprintf(global->errors,
+              "Metalink: fetching (%s) from (%s) FAILED (%s)\n",
+              per->mlfile->filename, per->this_url,
+              curl_easy_strerror(result));
     }
   }
 
-  /* Single header file for all URLs */
-  if(config->headerfile) {
-    /* open file for output: */
-    if(strcmp(config->headerfile, "-")) {
-      FILE *newfile = fopen(config->headerfile, "wb");
-      if(!newfile) {
-        warnf(config->global, "Failed to open %s\n", config->headerfile);
-        result = CURLE_WRITE_ERROR;
-        goto quit_curl;
-      }
-      else {
-        heads.filename = config->headerfile;
-        heads.s_isreg = TRUE;
-        heads.fopened = TRUE;
-        heads.stream = newfile;
-      }
+  if((global->progressmode == CURL_PROGRESS_BAR) &&
+     per->progressbar.calls)
+    /* if the custom progress bar has been displayed, we output a
+       newline here */
+    fputs("\n", per->progressbar.out);
+
+  if(config->writeout)
+    ourWriteOut(per->curl, &per->outs, config->writeout);
+
+  /* Close the outs file */
+  if(outs->fopened && outs->stream) {
+    int rc = fclose(outs->stream);
+    if(!result && rc) {
+      /* something went wrong in the writing process */
+      result = CURLE_WRITE_ERROR;
+      fprintf(global->errors, "(%d) Failed writing body\n", result);
     }
-    else {
-      /* always use binary mode for protocol header output */
-      set_binmode(heads.stream);
+  }
+
+  /* File time can only be set _after_ the file has been closed */
+  if(!result && config->remote_time && outs->s_isreg && outs->filename) {
+    /* Ask libcurl if we got a remote file time */
+    curl_off_t filetime = -1;
+    curl_easy_getinfo(curl, CURLINFO_FILETIME_T, &filetime);
+    setfiletime(filetime, outs->filename, config->global->errors);
+  }
+
+  /* Close function-local opened file descriptors */
+  if(per->heads.fopened && per->heads.stream)
+    fclose(per->heads.stream);
+
+  if(per->heads.alloc_filename)
+    Curl_safefree(per->heads.filename);
+
+  if(per->etag_save.fopened && per->etag_save.stream)
+    fclose(per->etag_save.stream);
+
+  if(per->etag_save.alloc_filename)
+    Curl_safefree(per->etag_save.filename);
+
+  curl_easy_cleanup(per->curl);
+  if(outs->alloc_filename)
+    free(outs->filename);
+  free(per->this_url);
+  free(per->separator_err);
+  free(per->separator);
+  free(per->outfile);
+  free(per->uploadfile);
+
+  return CURLE_OK;
+}
+
+static void single_transfer_cleanup(struct OperationConfig *config)
+{
+  if(config) {
+    struct State *state = &config->state;
+    if(state->urls) {
+      /* Free list of remaining URLs */
+      glob_cleanup(state->urls);
+      state->urls = NULL;
+    }
+    Curl_safefree(state->outfiles);
+    Curl_safefree(state->httpgetfields);
+    Curl_safefree(state->uploadfile);
+    if(state->inglob) {
+      /* Free list of globbed upload files */
+      glob_cleanup(state->inglob);
+      state->inglob = NULL;
     }
   }
+}
 
-  /*
-  ** Nested loops start here.
-  */
+/* create the next (singular) transfer */
 
-  /* loop through the list of given URLs */
+static CURLcode single_transfer(struct GlobalConfig *global,
+                                struct OperationConfig *config,
+                                CURLSH *share,
+                                bool capath_from_env,
+                                bool *added)
+{
+  CURLcode result = CURLE_OK;
+  struct getout *urlnode;
+  metalinkfile *mlfile_last = NULL;
+  bool orig_noprogress = global->noprogress;
+  bool orig_isatty = global->isatty;
+  struct State *state = &config->state;
+  char *httpgetfields = state->httpgetfields;
+  *added = FALSE; /* not yet */
 
-  for(urlnode = config->url_list; urlnode; urlnode = urlnode->next) {
+  if(config->postfields) {
+    if(config->use_httpget) {
+      if(!httpgetfields) {
+        /* Use the postfields data for a http get */
+        httpgetfields = state->httpgetfields = strdup(config->postfields);
+        Curl_safefree(config->postfields);
+        if(!httpgetfields) {
+          errorf(global, "out of memory\n");
+          result = CURLE_OUT_OF_MEMORY;
+        }
+        else if(SetHTTPrequest(config,
+                               (config->no_body?HTTPREQ_HEAD:HTTPREQ_GET),
+                               &config->httpreq)) {
+          result = CURLE_FAILED_INIT;
+        }
+      }
+    }
+    else {
+      if(SetHTTPrequest(config, HTTPREQ_SIMPLEPOST, &config->httpreq))
+        result = CURLE_FAILED_INIT;
+    }
+    if(result) {
+      single_transfer_cleanup(config);
+      return result;
+    }
+  }
+  if(!state->urlnode) {
+    /* first time caller, setup things */
+    state->urlnode = config->url_list;
+    state->infilenum = 1;
+  }
 
-    unsigned long up; /* upload file counter within a single upload glob */
+  while(config->state.urlnode) {
     char *infiles; /* might be a glob pattern */
-    char *outfiles;
-    unsigned long infilenum;
-    URLGlob *inglob;
-
-    int metalink = 0; /* nonzero for metalink download. */
+    URLGlob *inglob = state->inglob;
+    bool metalink = FALSE; /* metalink download? */
     metalinkfile *mlfile;
     metalink_resource *mlres;
 
-    outfiles = NULL;
-    infilenum = 1;
-    inglob = NULL;
-
+    urlnode = config->state.urlnode;
     if(urlnode->flags & GETOUT_METALINK) {
       metalink = 1;
       if(mlfile_last == NULL) {
@@ -405,14 +761,16 @@ static CURLcode operate_do(struct GlobalConfig *global,
       Curl_safefree(urlnode->outfile);
       Curl_safefree(urlnode->infile);
       urlnode->flags = 0;
+      config->state.urlnode = urlnode->next;
+      state->up = 0;
       continue; /* next URL please */
     }
 
     /* save outfile pattern before expansion */
-    if(urlnode->outfile) {
-      outfiles = strdup(urlnode->outfile);
-      if(!outfiles) {
-        helpf(global->errors, "out of memory\n");
+    if(urlnode->outfile && !state->outfiles) {
+      state->outfiles = strdup(urlnode->outfile);
+      if(!state->outfiles) {
+        errorf(global, "out of memory\n");
         result = CURLE_OUT_OF_MEMORY;
         break;
       }
@@ -420,140 +778,246 @@ static CURLcode operate_do(struct GlobalConfig *global,
 
     infiles = urlnode->infile;
 
-    if(!config->globoff && infiles) {
+    if(!config->globoff && infiles && !inglob) {
       /* Unless explicitly shut off */
-      result = glob_url(&inglob, infiles, &infilenum,
+      result = glob_url(&inglob, infiles, &state->infilenum,
                         global->showerror?global->errors:NULL);
-      if(result) {
-        Curl_safefree(outfiles);
+      if(result)
         break;
-      }
+      config->state.inglob = inglob;
     }
 
-    /* Here's the loop for uploading multiple files within the same
-       single globbed string. If no upload, we enter the loop once anyway. */
-    for(up = 0 ; up < infilenum; up++) {
-
-      char *uploadfile; /* a single file, never a glob */
+    {
       int separator;
-      URLGlob *urls;
       unsigned long urlnum;
 
-      uploadfile = NULL;
-      urls = NULL;
-      urlnum = 0;
-
-      if(!up && !infiles)
+      if(!state->up && !infiles)
         Curl_nop_stmt;
       else {
-        if(inglob) {
-          result = glob_next_url(&uploadfile, inglob);
-          if(result == CURLE_OUT_OF_MEMORY)
-            helpf(global->errors, "out of memory\n");
-        }
-        else if(!up) {
-          uploadfile = strdup(infiles);
-          if(!uploadfile) {
-            helpf(global->errors, "out of memory\n");
-            result = CURLE_OUT_OF_MEMORY;
+        if(!state->uploadfile) {
+          if(inglob) {
+            result = glob_next_url(&state->uploadfile, inglob);
+            if(result == CURLE_OUT_OF_MEMORY)
+              errorf(global, "out of memory\n");
+          }
+          else if(!state->up) {
+            state->uploadfile = strdup(infiles);
+            if(!state->uploadfile) {
+              errorf(global, "out of memory\n");
+              result = CURLE_OUT_OF_MEMORY;
+            }
           }
         }
-        else
-          uploadfile = NULL;
-        if(!uploadfile)
+        if(result)
           break;
       }
 
-      if(metalink) {
-        /* For Metalink download, we don't use glob. Instead we use
-           the number of resources as urlnum. */
-        urlnum = count_next_metalink_resource(mlfile);
-      }
-      else if(!config->globoff) {
-        /* Unless explicitly shut off, we expand '{...}' and '[...]'
-           expressions and return total number of URLs in pattern set */
-        result = glob_url(&urls, urlnode->url, &urlnum,
-                          global->showerror?global->errors:NULL);
-        if(result) {
-          Curl_safefree(uploadfile);
-          break;
+      if(!state->urlnum) {
+        if(metalink) {
+          /* For Metalink download, we don't use glob. Instead we use
+             the number of resources as urlnum. */
+          urlnum = count_next_metalink_resource(mlfile);
+        }
+        else if(!config->globoff) {
+          /* Unless explicitly shut off, we expand '{...}' and '[...]'
+             expressions and return total number of URLs in pattern set */
+          result = glob_url(&state->urls, urlnode->url, &state->urlnum,
+                            global->showerror?global->errors:NULL);
+          if(result)
+            break;
+          urlnum = state->urlnum;
         }
+        else
+          urlnum = 1; /* without globbing, this is a single URL */
       }
       else
-        urlnum = 1; /* without globbing, this is a single URL */
+        urlnum = state->urlnum;
 
       /* if multiple files extracted to stdout, insert separators! */
-      separator = ((!outfiles || !strcmp(outfiles, "-")) && urlnum > 1);
-
-      /* Here's looping around each globbed URL */
-      for(li = 0 ; li < urlnum; li++) {
-
-        int infd;
-        bool infdopen;
-        char *outfile;
-        struct OutStruct outs;
-        struct InStruct input;
-        struct timeval retrystart;
-        curl_off_t uploadfilesize;
-        long retry_numretries;
-        long retry_sleep_default;
-        long retry_sleep;
-        char *this_url = NULL;
-        int metalink_next_res = 0;
-
-        outfile = NULL;
-        infdopen = FALSE;
-        infd = STDIN_FILENO;
-        uploadfilesize = -1; /* -1 means unknown */
+      separator = ((!state->outfiles ||
+                    !strcmp(state->outfiles, "-")) && urlnum > 1);
+
+      if(state->up < state->infilenum) {
+        struct per_transfer *per;
+        struct OutStruct *outs;
+        struct InStruct *input;
+        struct OutStruct *heads;
+        struct OutStruct *etag_save;
+        struct HdrCbData *hdrcbdata = NULL;
+        CURL *curl = curl_easy_init();
+        result = add_per_transfer(&per);
+        if(result || !curl) {
+          curl_easy_cleanup(curl);
+          result = CURLE_OUT_OF_MEMORY;
+          break;
+        }
+        if(state->uploadfile) {
+          per->uploadfile = strdup(state->uploadfile);
+          if(!per->uploadfile) {
+            curl_easy_cleanup(curl);
+            result = CURLE_OUT_OF_MEMORY;
+            break;
+          }
+        }
+        *added = TRUE;
+        per->config = config;
+        per->curl = curl;
+
+        /* default headers output stream is stdout */
+        heads = &per->heads;
+        heads->stream = stdout;
+        heads->config = config;
+
+        /* Single header file for all URLs */
+        if(config->headerfile) {
+          /* open file for output: */
+          if(strcmp(config->headerfile, "-")) {
+            FILE *newfile = fopen(config->headerfile, "wb");
+            if(!newfile) {
+              warnf(config->global, "Failed to open %s\n", config->headerfile);
+              result = CURLE_WRITE_ERROR;
+              break;
+            }
+            else {
+              heads->filename = config->headerfile;
+              heads->s_isreg = TRUE;
+              heads->fopened = TRUE;
+              heads->stream = newfile;
+            }
+          }
+          else {
+            /* always use binary mode for protocol header output */
+            set_binmode(heads->stream);
+          }
+        }
+
+        /* --etag-save */
+        etag_save = &per->etag_save;
+        etag_save->stream = stdout;
+        etag_save->config = config;
+        if(config->etag_save_file) {
+          /* open file for output: */
+          if(strcmp(config->etag_save_file, "-")) {
+            FILE *newfile = fopen(config->etag_save_file, "wb");
+            if(!newfile) {
+              warnf(
+                config->global,
+                "Failed to open %s\n", config->etag_save_file);
+
+              result = CURLE_WRITE_ERROR;
+              break;
+            }
+            else {
+              etag_save->filename = config->etag_save_file;
+              etag_save->s_isreg = TRUE;
+              etag_save->fopened = TRUE;
+              etag_save->stream = newfile;
+            }
+          }
+          else {
+            /* always use binary mode for protocol header output */
+            set_binmode(etag_save->stream);
+          }
+        }
+
+        /* --etag-compare */
+        if(config->etag_compare_file) {
+          char *etag_from_file = NULL;
+          char *header = NULL;
+
+          /* open file for reading: */
+          FILE *file = fopen(config->etag_compare_file, FOPEN_READTEXT);
+          if(!file) {
+            errorf(config->global,
+                   "Failed to open %s\n", config->etag_compare_file);
+            result = CURLE_READ_ERROR;
+            break;
+          }
+
+          if((PARAM_OK == file2string(&etag_from_file, file)) &&
+             etag_from_file) {
+            header = aprintf("If-None-Match: \"%s\"", etag_from_file);
+            Curl_safefree(etag_from_file);
+          }
+          else
+            header = aprintf("If-None-Match: \"\"");
+
+          if(!header) {
+            if(file)
+              fclose(file);
+            errorf(config->global,
+                   "Failed to allocate memory for custom etag header\n");
+            result = CURLE_OUT_OF_MEMORY;
+            break;
+          }
+
+          /* add Etag from file to list of custom headers */
+          add2list(&config->headers, header);
+
+          Curl_safefree(header);
+
+          if(file) {
+            fclose(file);
+          }
+        }
+
+        hdrcbdata = &per->hdrcbdata;
+
+        outs = &per->outs;
+        input = &per->input;
+
+        per->outfile = NULL;
+        per->infdopen = FALSE;
+        per->infd = STDIN_FILENO;
 
         /* default output stream is stdout */
-        memset(&outs, 0, sizeof(struct OutStruct));
-        outs.stream = stdout;
-        outs.config = config;
+        outs->stream = stdout;
+        outs->config = config;
 
         if(metalink) {
           /* For Metalink download, use name in Metalink file as
              filename. */
-          outfile = strdup(mlfile->filename);
-          if(!outfile) {
+          per->outfile = strdup(mlfile->filename);
+          if(!per->outfile) {
             result = CURLE_OUT_OF_MEMORY;
-            goto show_error;
+            break;
           }
-          this_url = strdup(mlres->url);
-          if(!this_url) {
+          per->this_url = strdup(mlres->url);
+          if(!per->this_url) {
             result = CURLE_OUT_OF_MEMORY;
-            goto show_error;
+            break;
           }
+          per->mlfile = mlfile;
         }
         else {
-          if(urls) {
-            result = glob_next_url(&this_url, urls);
+          if(state->urls) {
+            result = glob_next_url(&per->this_url, state->urls);
             if(result)
-              goto show_error;
+              break;
           }
-          else if(!li) {
-            this_url = strdup(urlnode->url);
-            if(!this_url) {
+          else if(!state->li) {
+            per->this_url = strdup(urlnode->url);
+            if(!per->this_url) {
               result = CURLE_OUT_OF_MEMORY;
-              goto show_error;
+              break;
             }
           }
           else
-            this_url = NULL;
-          if(!this_url)
+            per->this_url = NULL;
+          if(!per->this_url)
             break;
 
-          if(outfiles) {
-            outfile = strdup(outfiles);
-            if(!outfile) {
+          if(state->outfiles) {
+            per->outfile = strdup(state->outfiles);
+            if(!per->outfile) {
               result = CURLE_OUT_OF_MEMORY;
-              goto show_error;
+              break;
             }
           }
         }
 
         if(((urlnode->flags&GETOUT_USEREMOTE) ||
-            (outfile && strcmp("-", outfile))) &&
+            (per->outfile && strcmp("-", per->outfile))) &&
            (metalink || !config->use_metalink)) {
 
           /*
@@ -561,26 +1025,26 @@ static CURLcode operate_do(struct GlobalConfig *global,
            * decided we want to use the remote file name.
            */
 
-          if(!outfile) {
+          if(!per->outfile) {
             /* extract the file name from the URL */
-            result = get_url_file_name(&outfile, this_url);
+            result = get_url_file_name(&per->outfile, per->this_url);
             if(result)
-              goto show_error;
-            if(!*outfile && !config->content_disposition) {
-              helpf(global->errors, "Remote file name has no length!\n");
+              break;
+            if(!*per->outfile && !config->content_disposition) {
+              errorf(global, "Remote file name has no length!\n");
               result = CURLE_WRITE_ERROR;
-              goto quit_urls;
+              break;
             }
           }
-          else if(urls) {
+          else if(state->urls) {
             /* fill '#1' ... '#9' terms from URL pattern */
-            char *storefile = outfile;
-            result = glob_match_url(&outfile, storefile, urls);
+            char *storefile = per->outfile;
+            result = glob_match_url(&per->outfile, storefile, state->urls);
             Curl_safefree(storefile);
             if(result) {
               /* bad globbing */
               warnf(config->global, "bad output glob!\n");
-              goto quit_urls;
+              break;
             }
           }
 
@@ -588,19 +1052,16 @@ static CURLcode operate_do(struct GlobalConfig *global,
              file output call */
 
           if(config->create_dirs || metalink) {
-            result = create_dir_hierarchy(outfile, global->errors);
-            /* create_dir_hierarchy shows error upon CURLE_WRITE_ERROR */
-            if(result == CURLE_WRITE_ERROR)
-              goto quit_urls;
-            if(result) {
-              goto show_error;
-            }
+            result = create_dir_hierarchy(per->outfile, global->errors);
+            /* create_dir_hierarchy shows error upon CURLE_WRITE_ERROR */
+            if(result)
+              break;
           }
 
           if((urlnode->flags & GETOUT_USEREMOTE)
              && config->content_disposition) {
             /* Our header callback MIGHT set the filename */
-            DEBUGASSERT(!outs.filename);
+            DEBUGASSERT(!outs->filename);
           }
 
           if(config->resume_from_current) {
@@ -608,7 +1069,7 @@ static CURLcode operate_do(struct GlobalConfig *global,
                of the file as it is now and open it for append instead */
             struct_stat fileinfo;
             /* VMS -- Danger, the filesize is only valid for stream files */
-            if(0 == stat(outfile, &fileinfo))
+            if(0 == stat(per->outfile, &fileinfo))
               /* set offset to current file size: */
               config->resume_from = fileinfo.st_size;
             else
@@ -620,91 +1081,40 @@ static CURLcode operate_do(struct GlobalConfig *global,
 #ifdef __VMS
             /* open file for output, forcing VMS output format into stream
                mode which is needed for stat() call above to always work. */
-            FILE *file = fopen(outfile, config->resume_from?"ab":"wb",
+            FILE *file = fopen(outfile, "ab",
                                "ctx=stm", "rfm=stmlf", "rat=cr", "mrs=0");
 #else
             /* open file for output: */
-            FILE *file = fopen(outfile, config->resume_from?"ab":"wb");
+            FILE *file = fopen(per->outfile, "ab");
 #endif
             if(!file) {
-              helpf(global->errors, "Can't open '%s'!\n", outfile);
+              errorf(global, "Can't open '%s'!\n", per->outfile);
               result = CURLE_WRITE_ERROR;
-              goto quit_urls;
+              break;
             }
-            outs.fopened = TRUE;
-            outs.stream = file;
-            outs.init = config->resume_from;
+            outs->fopened = TRUE;
+            outs->stream = file;
+            outs->init = config->resume_from;
           }
           else {
-            outs.stream = NULL; /* open when needed */
+            outs->stream = NULL; /* open when needed */
           }
-          outs.filename = outfile;
-          outs.s_isreg = TRUE;
+          outs->filename = per->outfile;
+          outs->s_isreg = TRUE;
         }
 
-        if(uploadfile && !stdin_upload(uploadfile)) {
+        if(per->uploadfile && !stdin_upload(per->uploadfile)) {
           /*
            * We have specified a file to upload and it isn't "-".
            */
-          struct_stat fileinfo;
-
-          this_url = add_file_name_to_url(curl, this_url, uploadfile);
-          if(!this_url) {
+          char *nurl = add_file_name_to_url(per->this_url, per->uploadfile);
+          if(!nurl) {
             result = CURLE_OUT_OF_MEMORY;
-            goto show_error;
-          }
-          /* VMS Note:
-           *
-           * Reading binary from files can be a problem...  Only FIXED, VAR
-           * etc WITHOUT implied CC will work Others need a \n appended to a
-           * line
-           *
-           * - Stat gives a size but this is UNRELIABLE in VMS As a f.e. a
-           * fixed file with implied CC needs to have a byte added for every
-           * record processed, this can by derived from Filesize & recordsize
-           * for VARiable record files the records need to be counted!  for
-           * every record add 1 for linefeed and subtract 2 for the record
-           * header for VARIABLE header files only the bare record data needs
-           * to be considered with one appended if implied CC
-           */
-#ifdef __VMS
-          /* Calculate the real upload size for VMS */
-          infd = -1;
-          if(stat(uploadfile, &fileinfo) == 0) {
-            fileinfo.st_size = VmsSpecialSize(uploadfile, &fileinfo);
-            switch(fileinfo.st_fab_rfm) {
-            case FAB$C_VAR:
-            case FAB$C_VFC:
-            case FAB$C_STMCR:
-              infd = open(uploadfile, O_RDONLY | O_BINARY);
-              break;
-            default:
-              infd = open(uploadfile, O_RDONLY | O_BINARY,
-                          "rfm=stmlf", "ctx=stm");
-            }
-          }
-          if(infd == -1)
-#else
-          infd = open(uploadfile, O_RDONLY | O_BINARY);
-          if((infd == -1) || fstat(infd, &fileinfo))
-#endif
-          {
-            helpf(global->errors, "Can't open '%s'!\n", uploadfile);
-            if(infd != -1) {
-              close(infd);
-              infd = STDIN_FILENO;
-            }
-            result = CURLE_READ_ERROR;
-            goto quit_urls;
+            break;
           }
-          infdopen = TRUE;
-
-          /* we ignore file size for char/block devices, sockets, etc. */
-          if(S_ISREG(fileinfo.st_mode))
-            uploadfilesize = fileinfo.st_size;
-
+          per->this_url = nurl;
         }
-        else if(uploadfile && stdin_upload(uploadfile)) {
+        else if(per->uploadfile && stdin_upload(per->uploadfile)) {
           /* count to see if there are more than one auth bit set
              in the authtype field */
           int authbits = 0;
@@ -730,47 +1140,49 @@ static CURLcode operate_do(struct GlobalConfig *global,
                   " file or a fixed auth type instead!\n");
           }
 
-          DEBUGASSERT(infdopen == FALSE);
-          DEBUGASSERT(infd == STDIN_FILENO);
+          DEBUGASSERT(per->infdopen == FALSE);
+          DEBUGASSERT(per->infd == STDIN_FILENO);
 
           set_binmode(stdin);
-          if(!strcmp(uploadfile, ".")) {
-            if(curlx_nonblock((curl_socket_t)infd, TRUE) < 0)
+          if(!strcmp(per->uploadfile, ".")) {
+            if(curlx_nonblock((curl_socket_t)per->infd, TRUE) < 0)
               warnf(config->global,
-                    "fcntl failed on fd=%d: %s\n", infd, strerror(errno));
+                    "fcntl failed on fd=%d: %s\n", per->infd, strerror(errno));
           }
         }
 
-        if(uploadfile && config->resume_from_current)
+        if(per->uploadfile && config->resume_from_current)
           config->resume_from = -1; /* -1 will then force get-it-yourself */
 
-        if(output_expected(this_url, uploadfile) && outs.stream &&
-           isatty(fileno(outs.stream)))
+        if(output_expected(per->this_url, per->uploadfile) && outs->stream &&
+           isatty(fileno(outs->stream)))
           /* we send the output to a tty, therefore we switch off the progress
              meter */
-          global->noprogress = global->isatty = TRUE;
+          per->noprogress = global->noprogress = global->isatty = TRUE;
         else {
           /* progress meter is per download, so restore config
              values */
-          global->noprogress = orig_noprogress;
+          per->noprogress = global->noprogress = orig_noprogress;
           global->isatty = orig_isatty;
         }
 
         if(urlnum > 1 && !global->mute) {
-          fprintf(global->errors, "\n[%lu/%lu]: %s --> %s\n",
-                  li + 1, urlnum, this_url, outfile ? outfile : "<stdout>");
+          per->separator_err =
+            aprintf("\n[%lu/%lu]: %s --> %s",
+                    state->li + 1, urlnum, per->this_url,
+                    per->outfile ? per->outfile : "<stdout>");
           if(separator)
-            printf("%s%s\n", CURLseparator, this_url);
+            per->separator = aprintf("%s%s", CURLseparator, per->this_url);
         }
         if(httpgetfields) {
           char *urlbuffer;
           /* Find out whether the url contains a file name */
-          const char *pc = strstr(this_url, "://");
+          const char *pc = strstr(per->this_url, "://");
           char sep = '?';
           if(pc)
             pc += 3;
           else
-            pc = this_url;
+            pc = per->this_url;
 
           pc = strrchr(pc, '/'); /* check for a slash */
 
@@ -786,33 +1198,40 @@ static CURLcode operate_do(struct GlobalConfig *global,
            * Then append ? followed by the get fields to the url.
            */
           if(pc)
-            urlbuffer = aprintf("%s%c%s", this_url, sep, httpgetfields);
+            urlbuffer = aprintf("%s%c%s", per->this_url, sep, httpgetfields);
           else
             /* Append  / before the ? to create a well-formed url
                if the url contains a hostname only
             */
-            urlbuffer = aprintf("%s/?%s", this_url, httpgetfields);
+            urlbuffer = aprintf("%s/?%s", per->this_url, httpgetfields);
 
           if(!urlbuffer) {
             result = CURLE_OUT_OF_MEMORY;
-            goto show_error;
+            break;
           }
 
-          Curl_safefree(this_url); /* free previous URL */
-          this_url = urlbuffer; /* use our new URL instead! */
+          Curl_safefree(per->this_url); /* free previous URL */
+          per->this_url = urlbuffer; /* use our new URL instead! */
         }
 
         if(!global->errors)
           global->errors = stderr;
 
-        if((!outfile || !strcmp(outfile, "-")) && !config->use_ascii) {
+        if((!per->outfile || !strcmp(per->outfile, "-")) &&
+           !config->use_ascii) {
           /* We get the output to stdout and we have not got the ASCII/text
              flag, then set stdout to be binary */
           set_binmode(stdout);
         }
 
         /* explicitly passed to stdout means okaying binary gunk */
-        config->terminal_binary_ok = (outfile && !strcmp(outfile, "-"));
+        config->terminal_binary_ok =
+          (per->outfile && !strcmp(per->outfile, "-"));
+
+        /* Avoid having this setopt added to the --libcurl source output. */
+        result = curl_easy_setopt(curl, CURLOPT_SHARE, share);
+        if(result)
+          break;
 
         if(!config->tcp_nodelay)
           my_setopt(curl, CURLOPT_TCP_NODELAY, 0L);
@@ -821,8 +1240,9 @@ static CURLcode operate_do(struct GlobalConfig *global,
           my_setopt(curl, CURLOPT_TCP_FASTOPEN, 1L);
 
         /* where to store */
-        my_setopt(curl, CURLOPT_WRITEDATA, &outs);
-        my_setopt(curl, CURLOPT_INTERLEAVEDATA, &outs);
+        my_setopt(curl, CURLOPT_WRITEDATA, per);
+        my_setopt(curl, CURLOPT_INTERLEAVEDATA, per);
+
         if(metalink || !config->use_metalink)
           /* what call to write */
           my_setopt(curl, CURLOPT_WRITEFUNCTION, tool_write_cb);
@@ -834,8 +1254,7 @@ static CURLcode operate_do(struct GlobalConfig *global,
 #endif /* USE_METALINK */
 
         /* for uploads */
-        input.fd = infd;
-        input.config = config;
+        input->config = config;
         /* Note that if CURLOPT_READFUNCTION is fread (the default), then
          * lib/telnet.c will Curl_poll() on the input file descriptor
          * rather then calling the READFUNCTION at regular intervals.
@@ -843,13 +1262,13 @@ static CURLcode operate_do(struct GlobalConfig *global,
          * behaviour, by omitting to set the READFUNCTION & READDATA options,
          * have not been determined.
          */
-        my_setopt(curl, CURLOPT_READDATA, &input);
+        my_setopt(curl, CURLOPT_READDATA, input);
         /* what call to read */
         my_setopt(curl, CURLOPT_READFUNCTION, tool_read_cb);
 
         /* in 7.18.0, the CURLOPT_SEEKFUNCTION/DATA pair is taking over what
            CURLOPT_IOCTLFUNCTION/DATA pair previously provided for seeking */
-        my_setopt(curl, CURLOPT_SEEKDATA, &input);
+        my_setopt(curl, CURLOPT_SEEKDATA, input);
         my_setopt(curl, CURLOPT_SEEKFUNCTION, tool_seek_cb);
 
         if(config->recvpersecond &&
@@ -859,10 +1278,7 @@ static CURLcode operate_do(struct GlobalConfig *global,
         else
           my_setopt(curl, CURLOPT_BUFFERSIZE, (long)BUFFER_SIZE);
 
-        /* size of uploaded file: */
-        if(uploadfilesize != -1)
-          my_setopt(curl, CURLOPT_INFILESIZE_LARGE, uploadfilesize);
-        my_setopt_str(curl, CURLOPT_URL, this_url);     /* what to fetch */
+        my_setopt_str(curl, CURLOPT_URL, per->this_url);
         my_setopt(curl, CURLOPT_NOPROGRESS, global->noprogress?1L:0L);
         if(config->no_body)
           my_setopt(curl, CURLOPT_NOBODY, 1L);
@@ -870,10 +1286,7 @@ static CURLcode operate_do(struct GlobalConfig *global,
         if(config->oauth_bearer)
           my_setopt_str(curl, CURLOPT_XOAUTH2_BEARER, config->oauth_bearer);
 
-#if !defined(CURL_DISABLE_PROXY)
         {
-          /* TODO: Make this a run-time check instead of compile-time one. */
-
           my_setopt_str(curl, CURLOPT_PROXY, config->proxy);
           /* new in libcurl 7.5 */
           if(config->proxy)
@@ -911,11 +1324,10 @@ static CURLcode operate_do(struct GlobalConfig *global,
           my_setopt(curl, CURLOPT_SUPPRESS_CONNECT_HEADERS,
                     config->suppress_connect_headers?1L:0L);
         }
-#endif /* !CURL_DISABLE_PROXY */
 
         my_setopt(curl, CURLOPT_FAILONERROR, config->failonerror?1L:0L);
         my_setopt(curl, CURLOPT_REQUEST_TARGET, config->request_target);
-        my_setopt(curl, CURLOPT_UPLOAD, uploadfile?1L:0L);
+        my_setopt(curl, CURLOPT_UPLOAD, per->uploadfile?1L:0L);
         my_setopt(curl, CURLOPT_DIRLISTONLY, config->dirlistonly?1L:0L);
         my_setopt(curl, CURLOPT_APPEND, config->ftp_append?1L:0L);
 
@@ -934,7 +1346,7 @@ static CURLcode operate_do(struct GlobalConfig *global,
           my_setopt_str(curl, CURLOPT_LOGIN_OPTIONS, config->login_options);
         my_setopt_str(curl, CURLOPT_USERPWD, config->userpwd);
         my_setopt_str(curl, CURLOPT_RANGE, config->range);
-        my_setopt(curl, CURLOPT_ERRORBUFFER, errorbuffer);
+        my_setopt(curl, CURLOPT_ERRORBUFFER, per->errorbuffer);
         my_setopt(curl, CURLOPT_TIMEOUT_MS, (long)(config->timeout * 1000));
 
         switch(config->httpreq) {
@@ -945,11 +1357,19 @@ static CURLcode operate_do(struct GlobalConfig *global,
                     config->postfieldsize);
           break;
         case HTTPREQ_MIMEPOST:
+          /* free previous remainders */
+          curl_mime_free(config->mimepost);
+          config->mimepost = NULL;
+          result = tool2curlmime(curl, config->mimeroot, &config->mimepost);
+          if(result)
+            break;
           my_setopt_mimepost(curl, CURLOPT_MIMEPOST, config->mimepost);
           break;
         default:
           break;
         }
+        if(result)
+          break;
 
         /* new in libcurl 7.10.6 (default is Basic) */
         if(config->authtype)
@@ -1005,6 +1425,9 @@ static CURLcode operate_do(struct GlobalConfig *global,
           /* new in libcurl 7.21.6 */
           if(config->tr_encoding)
             my_setopt(curl, CURLOPT_TRANSFER_ENCODING, 1L);
+          /* new in libcurl 7.64.0 */
+          my_setopt(curl, CURLOPT_HTTP09_ALLOWED,
+                    config->http09_allowed ? 1L : 0L);
 
         } /* (built_in_protos & CURLPROTO_HTTP) */
 
@@ -1056,11 +1479,12 @@ static CURLcode operate_do(struct GlobalConfig *global,
                   "SSL_CERT_DIR environment variable":"--capath");
           }
           else if(result)
-            goto show_error;
+            break;
         }
         /* For the time being if --proxy-capath is not set then we use the
            --capath value for it, if any. See #1257 */
-        if(config->proxy_capath || config->capath) {
+        if((config->proxy_capath || config->capath) &&
+           !tool_setopt_skip(CURLOPT_PROXY_CAPATH)) {
           result = res_setopt_str(curl, CURLOPT_PROXY_CAPATH,
                                   (config->proxy_capath ?
                                    config->proxy_capath :
@@ -1072,7 +1496,7 @@ static CURLcode operate_do(struct GlobalConfig *global,
             }
           }
           else if(result)
-            goto show_error;
+            break;
         }
 
         if(config->crlfile)
@@ -1172,10 +1596,10 @@ static CURLcode operate_do(struct GlobalConfig *global,
           if(!config->insecure_ok) {
             char *home;
             char *file;
-            result = CURLE_OUT_OF_MEMORY;
+            result = CURLE_FAILED_INIT;
             home = homedir();
             if(home) {
-              file = aprintf("%s/%sssh/known_hosts", home, DOT_CHAR);
+              file = aprintf("%s/.ssh/known_hosts", home);
               if(file) {
                 /* new in curl 7.19.6 */
                 result = res_setopt_str(curl, CURLOPT_SSH_KNOWNHOSTS, file);
@@ -1186,8 +1610,11 @@ static CURLcode operate_do(struct GlobalConfig *global,
               }
               Curl_safefree(home);
             }
+            else {
+              errorf(global, "Failed to figure out user's home dir!");
+            }
             if(result)
-              goto show_error;
+              break;
           }
         }
 
@@ -1201,7 +1628,6 @@ static CURLcode operate_do(struct GlobalConfig *global,
         my_setopt_slist(curl, CURLOPT_POSTQUOTE, config->postquote);
         my_setopt_slist(curl, CURLOPT_PREQUOTE, config->prequote);
 
-#if !defined(CURL_DISABLE_HTTP) && !defined(CURL_DISABLE_COOKIES)
         if(config->cookie)
           my_setopt_str(curl, CURLOPT_COOKIE, config->cookie);
 
@@ -1214,13 +1640,6 @@ static CURLcode operate_do(struct GlobalConfig *global,
 
         /* new in libcurl 7.9.7 */
         my_setopt(curl, CURLOPT_COOKIESESSION, config->cookiesession?1L:0L);
-#else
-        if(config->cookie || config->cookiefile || config->cookiejar) {
-          warnf(config->global, "cookie option(s) used even though cookie "
-                "support is disabled!\n");
-          return CURLE_NOT_BUILT_IN;
-        }
-#endif
 
         my_setopt_enum(curl, CURLOPT_TIMECONDITION, (long)config->timecond);
         my_setopt(curl, CURLOPT_TIMEVALUE_LARGE, config->condtime);
@@ -1231,14 +1650,21 @@ static CURLcode operate_do(struct GlobalConfig *global,
         /* three new ones in libcurl 7.3: */
         my_setopt_str(curl, CURLOPT_INTERFACE, config->iface);
         my_setopt_str(curl, CURLOPT_KRBLEVEL, config->krblevel);
+        progressbarinit(&per->progressbar, config);
 
-        progressbarinit(&progressbar, config);
         if((global->progressmode == CURL_PROGRESS_BAR) &&
            !global->noprogress && !global->mute) {
           /* we want the alternative style, then we have to implement it
              ourselves! */
           my_setopt(curl, CURLOPT_XFERINFOFUNCTION, tool_progress_cb);
-          my_setopt(curl, CURLOPT_XFERINFODATA, &progressbar);
+          my_setopt(curl, CURLOPT_XFERINFODATA, per);
+        }
+        else if(per->uploadfile && !strcmp(per->uploadfile, ".")) {
+          /* when reading from stdin in non-blocking mode, we use the progress
+             function to unpause a busy read */
+          my_setopt(curl, CURLOPT_NOPROGRESS, 0L);
+          my_setopt(curl, CURLOPT_XFERINFOFUNCTION, tool_readbusy_cb);
+          my_setopt(curl, CURLOPT_XFERINFODATA, per);
         }
 
         /* new in libcurl 7.24.0: */
@@ -1299,7 +1725,7 @@ static CURLcode operate_do(struct GlobalConfig *global,
         if(config->engine) {
           result = res_setopt_str(curl, CURLOPT_SSLENGINE, config->engine);
           if(result)
-            goto show_error;
+            break;
         }
 
         /* new in curl 7.10.7, extended in 7.19.4. Modified to use
@@ -1360,7 +1786,6 @@ static CURLcode operate_do(struct GlobalConfig *global,
 
         /* curl 7.13.0 */
         my_setopt_str(curl, CURLOPT_FTP_ACCOUNT, config->ftp_account);
-
         my_setopt(curl, CURLOPT_IGNORE_CONTENT_LENGTH, config->ignorecl?1L:0L);
 
         /* curl 7.14.2 */
@@ -1371,9 +1796,8 @@ static CURLcode operate_do(struct GlobalConfig *global,
 
         /* curl 7.15.2 */
         if(config->localport) {
-          my_setopt(curl, CURLOPT_LOCALPORT, (long)config->localport);
-          my_setopt_str(curl, CURLOPT_LOCALPORTRANGE,
-                        (long)config->localportrange);
+          my_setopt(curl, CURLOPT_LOCALPORT, config->localport);
+          my_setopt_str(curl, CURLOPT_LOCALPORTRANGE, config->localportrange);
         }
 
         /* curl 7.15.5 */
@@ -1423,17 +1847,18 @@ static CURLcode operate_do(struct GlobalConfig *global,
 
         if(config->content_disposition
            && (urlnode->flags & GETOUT_USEREMOTE))
-          hdrcbdata.honor_cd_filename = TRUE;
+          hdrcbdata->honor_cd_filename = TRUE;
         else
-          hdrcbdata.honor_cd_filename = FALSE;
+          hdrcbdata->honor_cd_filename = FALSE;
 
-        hdrcbdata.outs = &outs;
-        hdrcbdata.heads = &heads;
-        hdrcbdata.global = global;
-        hdrcbdata.config = config;
+        hdrcbdata->outs = outs;
+        hdrcbdata->heads = heads;
+        hdrcbdata->etag_save = etag_save;
+        hdrcbdata->global = global;
+        hdrcbdata->config = config;
 
         my_setopt(curl, CURLOPT_HEADERFUNCTION, tool_header_cb);
-        my_setopt(curl, CURLOPT_HEADERDATA, &hdrcbdata);
+        my_setopt(curl, CURLOPT_HEADERDATA, per);
 
         if(config->resolve)
           /* new in 7.21.3 */
@@ -1485,6 +1910,10 @@ static CURLcode operate_do(struct GlobalConfig *global,
         if(config->mail_auth)
           my_setopt_str(curl, CURLOPT_MAIL_AUTH, config->mail_auth);
 
+        /* new in 7.66.0 */
+        if(config->sasl_authzid)
+          my_setopt_str(curl, CURLOPT_SASL_AUTHZID, config->sasl_authzid);
+
         /* new in 7.31.0 */
         if(config->sasl_ir)
           my_setopt(curl, CURLOPT_SASL_IR, 1L);
@@ -1508,6 +1937,7 @@ static CURLcode operate_do(struct GlobalConfig *global,
                           config->unix_socket_path);
           }
         }
+
         /* new in 7.45.0 */
         if(config->proto_default)
           my_setopt_str(curl, CURLOPT_DEFAULT_PROTOCOL, config->proto_default);
@@ -1533,481 +1963,447 @@ static CURLcode operate_do(struct GlobalConfig *global,
         if(config->disallow_username_in_url)
           my_setopt(curl, CURLOPT_DISALLOW_USERNAME_IN_URL, 1L);
 
-        /* initialize retry vars for loop below */
-        retry_sleep_default = (config->retry_delay) ?
-          config->retry_delay*1000L : RETRY_SLEEP_DEFAULT; /* ms */
-
-        retry_numretries = config->req_retry;
-        retry_sleep = retry_sleep_default; /* ms */
-        retrystart = tvnow();
-
-#ifndef CURL_DISABLE_LIBCURL_OPTION
-        if(global->libcurl) {
-          result = easysrc_perform();
-          if(result)
-            goto show_error;
-        }
+#ifdef USE_ALTSVC
+        /* only if explicitly enabled in configure */
+        if(config->altsvc)
+          my_setopt_str(curl, CURLOPT_ALTSVC, config->altsvc);
 #endif
 
-        for(;;) {
 #ifdef USE_METALINK
-          if(!metalink && config->use_metalink) {
-            /* If outs.metalink_parser is non-NULL, delete it first. */
-            if(outs.metalink_parser)
-              metalink_parser_context_delete(outs.metalink_parser);
-            outs.metalink_parser = metalink_parser_context_new();
-            if(outs.metalink_parser == NULL) {
-              result = CURLE_OUT_OF_MEMORY;
-              goto show_error;
-            }
-            fprintf(config->global->errors,
-                    "Metalink: parsing (%s) metalink/XML...\n", this_url);
+        if(!metalink && config->use_metalink) {
+          outs->metalink_parser = metalink_parser_context_new();
+          if(outs->metalink_parser == NULL) {
+            result = CURLE_OUT_OF_MEMORY;
+            break;
           }
-          else if(metalink)
-            fprintf(config->global->errors,
-                    "Metalink: fetching (%s) from (%s)...\n",
-                    mlfile->filename, this_url);
+          fprintf(config->global->errors,
+                  "Metalink: parsing (%s) metalink/XML...\n", per->this_url);
+        }
+        else if(metalink)
+          fprintf(config->global->errors,
+                  "Metalink: fetching (%s) from (%s)...\n",
+                  mlfile->filename, per->this_url);
 #endif /* USE_METALINK */
 
-#ifdef CURLDEBUG
-          if(config->test_event_based)
-            result = curl_easy_perform_ev(curl);
-          else
-#endif
-          result = curl_easy_perform(curl);
-
-          if(!result && !outs.stream && !outs.bytes) {
-            /* we have received no data despite the transfer was successful
-               ==> force cration of an empty output file (if an output file
-               was specified) */
-            long cond_unmet = 0L;
-            /* do not create (or even overwrite) the file in case we get no
-               data because of unmet condition */
-            curl_easy_getinfo(curl, CURLINFO_CONDITION_UNMET, &cond_unmet);
-            if(!cond_unmet && !tool_create_output_file(&outs, FALSE))
-              result = CURLE_WRITE_ERROR;
-          }
+        per->metalink = metalink;
+        /* initialize retry vars for loop below */
+        per->retry_sleep_default = (config->retry_delay) ?
+          config->retry_delay*1000L : RETRY_SLEEP_DEFAULT; /* ms */
+        per->retry_numretries = config->req_retry;
+        per->retry_sleep = per->retry_sleep_default; /* ms */
+        per->retrystart = tvnow();
+
+        state->li++;
+        /* Here's looping around each globbed URL */
+        if(state->li >= urlnum) {
+          state->li = 0;
+          state->urlnum = 0; /* forced reglob of URLs */
+          glob_cleanup(state->urls);
+          state->urls = NULL;
+          state->up++;
+          Curl_safefree(state->uploadfile); /* clear it to get the next */
+        }
+      }
+      else {
+        /* Free this URL node data without destroying the
+           the node itself nor modifying next pointer. */
+        Curl_safefree(urlnode->outfile);
+        Curl_safefree(urlnode->infile);
+        urlnode->flags = 0;
+        glob_cleanup(state->urls);
+        state->urls = NULL;
+        state->urlnum = 0;
+
+        Curl_safefree(state->outfiles);
+        Curl_safefree(state->uploadfile);
+        if(state->inglob) {
+          /* Free list of globbed upload files */
+          glob_cleanup(state->inglob);
+          state->inglob = NULL;
+        }
+        config->state.urlnode = urlnode->next;
+        state->up = 0;
+        continue;
+      }
+    }
+    break;
+  }
 
-          if(outs.is_cd_filename && outs.stream && !global->mute &&
-             outs.filename)
-            printf("curl: Saved to filename '%s'\n", outs.filename);
-
-          /* if retry-max-time is non-zero, make sure we haven't exceeded the
-             time */
-          if(retry_numretries &&
-             (!config->retry_maxtime ||
-              (tvdiff(tvnow(), retrystart) <
-               config->retry_maxtime*1000L)) ) {
-            enum {
-              RETRY_NO,
-              RETRY_TIMEOUT,
-              RETRY_CONNREFUSED,
-              RETRY_HTTP,
-              RETRY_FTP,
-              RETRY_LAST /* not used */
-            } retry = RETRY_NO;
-            long response;
-            if((CURLE_OPERATION_TIMEDOUT == result) ||
-               (CURLE_COULDNT_RESOLVE_HOST == result) ||
-               (CURLE_COULDNT_RESOLVE_PROXY == result) ||
-               (CURLE_FTP_ACCEPT_TIMEOUT == result))
-              /* retry timeout always */
-              retry = RETRY_TIMEOUT;
-            else if(config->retry_connrefused &&
-                    (CURLE_COULDNT_CONNECT == result)) {
-              long oserrno;
-              curl_easy_getinfo(curl, CURLINFO_OS_ERRNO, &oserrno);
-              if(ECONNREFUSED == oserrno)
-                retry = RETRY_CONNREFUSED;
-            }
-            else if((CURLE_OK == result) ||
-                    (config->failonerror &&
-                     (CURLE_HTTP_RETURNED_ERROR == result))) {
-              /* If it returned OK. _or_ failonerror was enabled and it
-                 returned due to such an error, check for HTTP transient
-                 errors to retry on. */
-              char *effective_url = NULL;
-              curl_easy_getinfo(curl, CURLINFO_EFFECTIVE_URL, &effective_url);
-              if(effective_url &&
-                 checkprefix("http", effective_url)) {
-                /* This was HTTP(S) */
-                curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &response);
-
-                switch(response) {
-                case 408: /* Request Timeout */
-                case 500: /* Internal Server Error */
-                case 502: /* Bad Gateway */
-                case 503: /* Service Unavailable */
-                case 504: /* Gateway Timeout */
-                  retry = RETRY_HTTP;
-                  /*
-                   * At this point, we have already written data to the output
-                   * file (or terminal). If we write to a file, we must rewind
-                   * or close/re-open the file so that the next attempt starts
-                   * over from the beginning.
-                   *
-                   * TODO: similar action for the upload case. We might need
-                   * to start over reading from a previous point if we have
-                   * uploaded something when this was returned.
-                   */
-                  break;
-                }
-              }
-            } /* if CURLE_OK */
-            else if(result) {
-              long protocol;
-
-              curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &response);
-              curl_easy_getinfo(curl, CURLINFO_PROTOCOL, &protocol);
-
-              if((protocol == CURLPROTO_FTP || protocol == CURLPROTO_FTPS) &&
-                 response / 100 == 4)
-                /*
-                 * This is typically when the FTP server only allows a certain
-                 * amount of users and we are not one of them.  All 4xx codes
-                 * are transient.
-                 */
-                retry = RETRY_FTP;
-            }
+  if(!*added || result) {
+    *added = FALSE;
+    single_transfer_cleanup(config);
+  }
+  return result;
+}
 
-            if(retry) {
-              static const char * const m[]={
-                NULL,
-                "timeout",
-                "connection refused",
-                "HTTP error",
-                "FTP error"
-              };
-
-              warnf(config->global, "Transient problem: %s "
-                    "Will retry in %ld seconds. "
-                    "%ld retries left.\n",
-                    m[retry], retry_sleep/1000L, retry_numretries);
-
-              tool_go_sleep(retry_sleep);
-              retry_numretries--;
-              if(!config->retry_delay) {
-                retry_sleep *= 2;
-                if(retry_sleep > RETRY_SLEEP_MAX)
-                  retry_sleep = RETRY_SLEEP_MAX;
-              }
-              if(outs.bytes && outs.filename && outs.stream) {
-                int rc;
-                /* We have written data to a output file, we truncate file
-                 */
-                if(!global->mute)
-                  fprintf(global->errors, "Throwing away %"
-                          CURL_FORMAT_CURL_OFF_T " bytes\n",
-                          outs.bytes);
-                fflush(outs.stream);
-                /* truncate file at the position where we started appending */
-#ifdef HAVE_FTRUNCATE
-                if(ftruncate(fileno(outs.stream), outs.init)) {
-                  /* when truncate fails, we can't just append as then we'll
-                     create something strange, bail out */
-                  if(!global->mute)
-                    fprintf(global->errors,
-                            "failed to truncate, exiting\n");
-                  result = CURLE_WRITE_ERROR;
-                  goto quit_urls;
-                }
-                /* now seek to the end of the file, the position where we
-                   just truncated the file in a large file-safe way */
-                rc = fseek(outs.stream, 0, SEEK_END);
-#else
-                /* ftruncate is not available, so just reposition the file
-                   to the location we would have truncated it. This won't
-                   work properly with large files on 32-bit systems, but
-                   most of those will have ftruncate. */
-                rc = fseek(outs.stream, (long)outs.init, SEEK_SET);
-#endif
-                if(rc) {
-                  if(!global->mute)
-                    fprintf(global->errors,
-                            "failed seeking to end of file, exiting\n");
-                  result = CURLE_WRITE_ERROR;
-                  goto quit_urls;
-                }
-                outs.bytes = 0; /* clear for next round */
-              }
-              continue; /* curl_easy_perform loop */
-            }
-          } /* if retry_numretries */
-          else if(metalink) {
-            /* Metalink: Decide to try the next resource or
-               not. Basically, we want to try the next resource if
-               download was not successful. */
-            long response;
-            if(CURLE_OK == result) {
-              /* TODO We want to try next resource when download was
-                 not successful. How to know that? */
-              char *effective_url = NULL;
-              curl_easy_getinfo(curl, CURLINFO_EFFECTIVE_URL, &effective_url);
-              if(effective_url &&
-                 curl_strnequal(effective_url, "http", 4)) {
-                /* This was HTTP(S) */
-                curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &response);
-                if(response != 200 && response != 206) {
-                  metalink_next_res = 1;
-                  fprintf(global->errors,
-                          "Metalink: fetching (%s) from (%s) FAILED "
-                          "(HTTP status code %ld)\n",
-                          mlfile->filename, this_url, response);
-                }
-              }
-            }
-            else {
-              metalink_next_res = 1;
-              fprintf(global->errors,
-                      "Metalink: fetching (%s) from (%s) FAILED (%s)\n",
-                      mlfile->filename, this_url,
-                      (errorbuffer[0]) ?
-                      errorbuffer : curl_easy_strerror(result));
-            }
-          }
-          if(metalink && !metalink_next_res)
-            fprintf(global->errors, "Metalink: fetching (%s) from (%s) OK\n",
-                    mlfile->filename, this_url);
+static long all_added; /* number of easy handles currently added */
+
+/*
+ * add_parallel_transfers() sets 'morep' to TRUE if there are more transfers
+ * to add even after this call returns. sets 'addedp' to TRUE if one or more
+ * transfers were added.
+ */
+static CURLcode add_parallel_transfers(struct GlobalConfig *global,
+                                       CURLM *multi,
+                                       CURLSH *share,
+                                       bool *morep,
+                                       bool *addedp)
+{
+  struct per_transfer *per;
+  CURLcode result = CURLE_OK;
+  CURLMcode mcode;
+  *addedp = FALSE;
+  *morep = FALSE;
+  result = create_transfer(global, share, addedp);
+  if(result || !*addedp)
+    return result;
+  for(per = transfers; per && (all_added < global->parallel_max);
+      per = per->next) {
+    bool getadded = FALSE;
+    if(per->added)
+      /* already added */
+      continue;
+
+    result = pre_transfer(global, per);
+    if(result)
+      break;
+
+    /* parallel connect means that we don't set PIPEWAIT since pipewait
+       will make libcurl prefer multiplexing */
+    (void)curl_easy_setopt(per->curl, CURLOPT_PIPEWAIT,
+                           global->parallel_connect ? 0L : 1L);
+    (void)curl_easy_setopt(per->curl, CURLOPT_PRIVATE, per);
+    (void)curl_easy_setopt(per->curl, CURLOPT_XFERINFOFUNCTION, xferinfo_cb);
+    (void)curl_easy_setopt(per->curl, CURLOPT_XFERINFODATA, per);
+
+    mcode = curl_multi_add_handle(multi, per->curl);
+    if(mcode)
+      return CURLE_OUT_OF_MEMORY;
+
+    result = create_transfer(global, share, &getadded);
+    if(result)
+      return result;
+    per->added = TRUE;
+    all_added++;
+    *addedp = TRUE;
+  }
+  *morep = per ? TRUE : FALSE;
+  return CURLE_OK;
+}
 
-          /* In all ordinary cases, just break out of loop here */
-          break; /* curl_easy_perform loop */
+static CURLcode parallel_transfers(struct GlobalConfig *global,
+                                   CURLSH *share)
+{
+  CURLM *multi;
+  CURLMcode mcode = CURLM_OK;
+  CURLcode result = CURLE_OK;
+  int still_running = 1;
+  struct timeval start = tvnow();
+  bool more_transfers;
+  bool added_transfers;
+
+  multi = curl_multi_init();
+  if(!multi)
+    return CURLE_OUT_OF_MEMORY;
+
+  result = add_parallel_transfers(global, multi, share,
+                                  &more_transfers, &added_transfers);
+  if(result) {
+    curl_multi_cleanup(multi);
+    return result;
+  }
 
+  while(!mcode && (still_running || more_transfers)) {
+    mcode = curl_multi_poll(multi, NULL, 0, 1000, NULL);
+    if(!mcode)
+      mcode = curl_multi_perform(multi, &still_running);
+
+    progress_meter(global, &start, FALSE);
+
+    if(!mcode) {
+      int rc;
+      CURLMsg *msg;
+      bool removed = FALSE;
+      do {
+        msg = curl_multi_info_read(multi, &rc);
+        if(msg) {
+          bool retry;
+          struct per_transfer *ended;
+          CURL *easy = msg->easy_handle;
+          result = msg->data.result;
+          curl_easy_getinfo(easy, CURLINFO_PRIVATE, (void *)&ended);
+          curl_multi_remove_handle(multi, easy);
+
+          result = post_per_transfer(global, ended, result, &retry);
+          if(retry)
+            continue;
+          progress_finalize(ended); /* before it goes away */
+          all_added--; /* one fewer added */
+          removed = TRUE;
+          (void)del_per_transfer(ended);
         }
+      } while(msg);
+      if(removed) {
+        /* one or more transfers completed, add more! */
+        (void)add_parallel_transfers(global, multi, share,
+                                     &more_transfers,
+                                     &added_transfers);
+        if(added_transfers)
+          /* we added new ones, make sure the loop doesn't exit yet */
+          still_running = 1;
+      }
+    }
+  }
 
-        if((global->progressmode == CURL_PROGRESS_BAR) &&
-           progressbar.calls)
-          /* if the custom progress bar has been displayed, we output a
-             newline here */
-          fputs("\n", progressbar.out);
+  (void)progress_meter(global, &start, TRUE);
 
-        if(config->writeout)
-          ourWriteOut(curl, &outs, config->writeout);
+  /* Make sure to return some kind of error if there was a multi problem */
+  if(mcode) {
+    result = (mcode == CURLM_OUT_OF_MEMORY) ? CURLE_OUT_OF_MEMORY :
+      /* The other multi errors should never happen, so return
+         something suitably generic */
+      CURLE_BAD_FUNCTION_ARGUMENT;
+  }
 
-        /*
-        ** Code within this loop may jump directly here to label 'show_error'
-        ** in order to display an error message for CURLcode stored in 'res'
-        ** variable and exit loop once that necessary writing and cleanup
-        ** in label 'quit_urls' has been done.
-        */
+  curl_multi_cleanup(multi);
 
-        show_error:
+  return result;
+}
 
-#ifdef __VMS
-        if(is_vms_shell()) {
-          /* VMS DCL shell behavior */
-          if(!global->showerror)
-            vms_show = VMSSTS_HIDE;
-        }
-        else
+static CURLcode serial_transfers(struct GlobalConfig *global,
+                                 CURLSH *share)
+{
+  CURLcode returncode = CURLE_OK;
+  CURLcode result = CURLE_OK;
+  struct per_transfer *per;
+  bool added = FALSE;
+
+  result = create_transfer(global, share, &added);
+  if(result || !added)
+    return result;
+  for(per = transfers; per;) {
+    bool retry;
+    bool bailout = FALSE;
+    result = pre_transfer(global, per);
+    if(result)
+      break;
+
+#ifndef CURL_DISABLE_LIBCURL_OPTION
+    if(global->libcurl) {
+      result = easysrc_perform();
+      if(result)
+        break;
+    }
 #endif
-        if(config->synthetic_error) {
-          ;
-        }
-        else if(result && global->showerror) {
-          fprintf(global->errors, "curl: (%d) %s\n", result, (errorbuffer[0]) ?
-                  errorbuffer : curl_easy_strerror(result));
-          if(result == CURLE_SSL_CACERT)
-            fputs(CURL_CA_CERT_ERRORMSG, global->errors);
-        }
+#ifdef CURLDEBUG
+    if(global->test_event_based)
+      result = curl_easy_perform_ev(per->curl);
+    else
+#endif
+      result = curl_easy_perform(per->curl);
 
-        /* Fall through comment to 'quit_urls' label */
+    /* store the result of the actual transfer */
+    returncode = result;
 
-        /*
-        ** Upon error condition and always that a message has already been
-        ** displayed, code within this loop may jump directly here to label
-        ** 'quit_urls' otherwise it should jump to 'show_error' label above.
-        **
-        ** When 'res' variable is _not_ CURLE_OK loop will exit once that
-        ** all code following 'quit_urls' has been executed. Otherwise it
-        ** will loop to the beginning from where it may exit if there are
-        ** no more urls left.
-        */
-
-        quit_urls:
-
-        /* Set file extended attributes */
-        if(!result && config->xattr && outs.fopened && outs.stream) {
-          int rc = fwrite_xattr(curl, fileno(outs.stream));
-          if(rc)
-            warnf(config->global, "Error setting extended attributes: %s\n",
-                  strerror(errno));
-        }
+    result = post_per_transfer(global, per, result, &retry);
+    if(retry)
+      continue;
 
-        /* Close the file */
-        if(outs.fopened && outs.stream) {
-          int rc = fclose(outs.stream);
-          if(!result && rc) {
-            /* something went wrong in the writing process */
-            result = CURLE_WRITE_ERROR;
-            fprintf(global->errors, "(%d) Failed writing body\n", result);
-          }
-        }
-        else if(!outs.s_isreg && outs.stream) {
-          /* Dump standard stream buffered data */
-          int rc = fflush(outs.stream);
-          if(!result && rc) {
-            /* something went wrong in the writing process */
-            result = CURLE_WRITE_ERROR;
-            fprintf(global->errors, "(%d) Failed writing body\n", result);
-          }
-        }
+    /* Bail out upon critical errors or --fail-early */
+    if(result || is_fatal_error(returncode) ||
+       (returncode && global->fail_early))
+      bailout = TRUE;
+    else {
+      /* setup the next one just before we delete this */
+      result = create_transfer(global, share, &added);
+      if(result)
+        bailout = TRUE;
+    }
 
-#ifdef __AMIGA__
-        if(!result && outs.s_isreg && outs.filename) {
-          /* Set the url (up to 80 chars) as comment for the file */
-          if(strlen(url) > 78)
-            url[79] = '\0';
-          SetComment(outs.filename, url);
-        }
-#endif
+    /* Release metalink related resources here */
+    delete_metalinkfile(per->mlfile);
 
-        /* File time can only be set _after_ the file has been closed */
-        if(!result && config->remote_time && outs.s_isreg && outs.filename) {
-          /* Ask libcurl if we got a remote file time */
-          curl_off_t filetime = -1;
-          curl_easy_getinfo(curl, CURLINFO_FILETIME_T, &filetime);
-          setfiletime(filetime, outs.filename, config->global->errors);
-        }
+    per = del_per_transfer(per);
 
-#ifdef USE_METALINK
-        if(!metalink && config->use_metalink && result == CURLE_OK) {
-          int rv = parse_metalink(config, &outs, this_url);
-          if(rv == 0)
-            fprintf(config->global->errors, "Metalink: parsing (%s) OK\n",
-                    this_url);
-          else if(rv == -1)
-            fprintf(config->global->errors, "Metalink: parsing (%s) FAILED\n",
-                    this_url);
-        }
-        else if(metalink && result == CURLE_OK && !metalink_next_res) {
-          int rv = metalink_check_hash(global, mlfile, outs.filename);
-          if(rv == 0) {
-            metalink_next_res = 1;
-          }
-        }
-#endif /* USE_METALINK */
+    if(bailout)
+      break;
+  }
+  if(returncode)
+    /* returncode errors have priority */
+    result = returncode;
 
-        /* No more business with this output struct */
-        if(outs.alloc_filename)
-          Curl_safefree(outs.filename);
-#ifdef USE_METALINK
-        if(outs.metalink_parser)
-          metalink_parser_context_delete(outs.metalink_parser);
-#endif /* USE_METALINK */
-        memset(&outs, 0, sizeof(struct OutStruct));
-        hdrcbdata.outs = NULL;
+  if(result)
+    single_transfer_cleanup(global->current);
 
-        /* Free loop-local allocated memory and close loop-local opened fd */
+  return result;
+}
 
-        Curl_safefree(outfile);
-        Curl_safefree(this_url);
+/* setup a transfer for the given config */
+static CURLcode transfer_per_config(struct GlobalConfig *global,
+                                    struct OperationConfig *config,
+                                    CURLSH *share,
+                                    bool *added)
+{
+  CURLcode result = CURLE_OK;
+  bool capath_from_env;
+  *added = FALSE;
 
-        if(infdopen)
-          close(infd);
+  /* Check we have a url */
+  if(!config->url_list || !config->url_list->url) {
+    helpf(global->errors, "no URL specified!\n");
+    return CURLE_FAILED_INIT;
+  }
 
-        if(metalink) {
-          /* Should exit if error is fatal. */
-          if(is_fatal_error(result)) {
-            break;
+  /* On WIN32 we can't set the path to curl-ca-bundle.crt
+   * at compile time. So we look here for the file in two ways:
+   * 1: look at the environment variable CURL_CA_BUNDLE for a path
+   * 2: if #1 isn't found, use the windows API function SearchPath()
+   *    to find it along the app's path (includes app's dir and CWD)
+   *
+   * We support the environment variable thing for non-Windows platforms
+   * too. Just for the sake of it.
+   */
+  capath_from_env = false;
+  if(!config->cacert &&
+     !config->capath &&
+     !config->insecure_ok) {
+    CURL *curltls = curl_easy_init();
+    struct curl_tlssessioninfo *tls_backend_info = NULL;
+
+    /* With the addition of CAINFO support for Schannel, this search could find
+     * a certificate bundle that was previously ignored. To maintain backward
+     * compatibility, only perform this search if not using Schannel.
+     */
+    result = curl_easy_getinfo(curltls, CURLINFO_TLS_SSL_PTR,
+                               &tls_backend_info);
+    if(result)
+      return result;
+
+    /* Set the CA cert locations specified in the environment. For Windows if
+     * no environment-specified filename is found then check for CA bundle
+     * default filename curl-ca-bundle.crt in the user's PATH.
+     *
+     * If Schannel is the selected SSL backend then these locations are
+     * ignored. We allow setting CA location for schannel only when explicitly
+     * specified by the user via CURLOPT_CAINFO / --cacert.
+     */
+    if(tls_backend_info->backend != CURLSSLBACKEND_SCHANNEL) {
+      char *env;
+      env = curlx_getenv("CURL_CA_BUNDLE");
+      if(env) {
+        config->cacert = strdup(env);
+        if(!config->cacert) {
+          curl_free(env);
+          errorf(global, "out of memory\n");
+          return CURLE_OUT_OF_MEMORY;
+        }
+      }
+      else {
+        env = curlx_getenv("SSL_CERT_DIR");
+        if(env) {
+          config->capath = strdup(env);
+          if(!config->capath) {
+            curl_free(env);
+            helpf(global->errors, "out of memory\n");
+            return CURLE_OUT_OF_MEMORY;
           }
-          if(!metalink_next_res)
-            break;
-          mlres = mlres->next;
-          if(mlres == NULL)
-            /* TODO If metalink_next_res is 1 and mlres is NULL,
-             * set res to error code
-             */
-            break;
+          capath_from_env = true;
         }
-        else if(urlnum > 1) {
-          /* when url globbing, exit loop upon critical error */
-          if(is_fatal_error(result))
-            break;
+        else {
+          env = curlx_getenv("SSL_CERT_FILE");
+          if(env) {
+            config->cacert = strdup(env);
+            if(!config->cacert) {
+              curl_free(env);
+              errorf(global, "out of memory\n");
+              return CURLE_OUT_OF_MEMORY;
+            }
+          }
         }
-        else if(result)
-          /* when not url globbing, exit loop upon any error */
-          break;
-
-      } /* loop to the next URL */
-
-      /* Free loop-local allocated memory */
-
-      Curl_safefree(uploadfile);
-
-      if(urls) {
-        /* Free list of remaining URLs */
-        glob_cleanup(urls);
-        urls = NULL;
       }
 
-      if(infilenum > 1) {
-        /* when file globbing, exit loop upon critical error */
-        if(is_fatal_error(result))
-          break;
+      if(env)
+        curl_free(env);
+#ifdef WIN32
+      else {
+        result = FindWin32CACert(config, tls_backend_info->backend,
+                                 "curl-ca-bundle.crt");
       }
-      else if(result)
-        /* when not file globbing, exit loop upon any error */
-        break;
-
-    } /* loop to the next globbed upload file */
+#endif
+    }
+    curl_easy_cleanup(curltls);
+  }
 
-    /* Free loop-local allocated memory */
+  if(!result)
+    result = single_transfer(global, config, share, capath_from_env, added);
 
-    Curl_safefree(outfiles);
+  return result;
+}
 
-    if(inglob) {
-      /* Free list of globbed upload files */
-      glob_cleanup(inglob);
-      inglob = NULL;
+/*
+ * 'create_transfer' gets the details and sets up a new transfer if 'added'
+ * returns TRUE.
+ */
+static CURLcode create_transfer(struct GlobalConfig *global,
+                                CURLSH *share,
+                                bool *added)
+{
+  CURLcode result = CURLE_OK;
+  *added = FALSE;
+  while(global->current) {
+    result = transfer_per_config(global, global->current, share, added);
+    if(!result && !*added) {
+      /* when one set is drained, continue to next */
+      global->current = global->current->next;
+      continue;
     }
+    break;
+  }
+  return result;
+}
 
-    /* Free this URL node data without destroying the
-       the node itself nor modifying next pointer. */
-    Curl_safefree(urlnode->url);
-    Curl_safefree(urlnode->outfile);
-    Curl_safefree(urlnode->infile);
-    urlnode->flags = 0;
+static CURLcode run_all_transfers(struct GlobalConfig *global,
+                                  CURLSH *share,
+                                  CURLcode result)
+{
+  /* Save the values of noprogress and isatty to restore them later on */
+  bool orig_noprogress = global->noprogress;
+  bool orig_isatty = global->isatty;
+  struct per_transfer *per;
 
-    /*
-    ** Bail out upon critical errors or --fail-early
-    */
-    if(is_fatal_error(result) || (result && global->fail_early))
-      goto quit_curl;
+  /* Time to actually do the transfers */
+  if(!result) {
+    if(global->parallel)
+      result = parallel_transfers(global, share);
+    else
+      result = serial_transfers(global, share);
+  }
 
-  } /* for-loop through all URLs */
+  /* cleanup if there are any left */
+  for(per = transfers; per;) {
+    bool retry;
+    CURLcode result2 = post_per_transfer(global, per, result, &retry);
+    if(!result)
+      /* don't overwrite the original error */
+      result = result2;
 
-  /*
-  ** Nested loops end here.
-  */
+    /* Free list of given URLs */
+    clean_getout(per->config);
 
-  quit_curl:
+    /* Release metalink related resources here */
+    clean_metalink(per->config);
+    per = del_per_transfer(per);
+  }
 
   /* Reset the global config variables */
   global->noprogress = orig_noprogress;
   global->isatty = orig_isatty;
 
-  /* Free function-local referenced allocated memory */
-  Curl_safefree(httpgetfields);
-
-  /* Free list of given URLs */
-  clean_getout(config);
-
-  hdrcbdata.heads = NULL;
-
-  /* Close function-local opened file descriptors */
-  if(heads.fopened && heads.stream)
-    fclose(heads.stream);
-
-  if(heads.alloc_filename)
-    Curl_safefree(heads.filename);
-
-  /* Release metalink related resources here */
-  clean_metalink(config);
 
   return result;
 }
 
-CURLcode operate(struct GlobalConfig *config, int argc, argv_item_t argv[])
+CURLcode operate(struct GlobalConfig *global, int argc, argv_item_t argv[])
 {
   CURLcode result = CURLE_OK;
 
@@ -2020,18 +2416,18 @@ CURLcode operate(struct GlobalConfig *config, int argc, argv_item_t argv[])
   if((argc == 1) ||
      (!curl_strequal(argv[1], "-q") &&
       !curl_strequal(argv[1], "--disable"))) {
-    parseconfig(NULL, config); /* ignore possible failure */
+    parseconfig(NULL, global); /* ignore possible failure */
 
     /* If we had no arguments then make sure a url was specified in .curlrc */
-    if((argc < 2) && (!config->first->url_list)) {
-      helpf(config->errors, NULL);
+    if((argc < 2) && (!global->first->url_list)) {
+      helpf(global->errors, NULL);
       result = CURLE_FAILED_INIT;
     }
   }
 
   if(!result) {
     /* Parse the command line arguments */
-    ParameterError res = parse_args(config, argc, argv);
+    ParameterError res = parse_args(global, argc, argv);
     if(res) {
       result = CURLE_OK;
 
@@ -2046,7 +2442,7 @@ CURLcode operate(struct GlobalConfig *config, int argc, argv_item_t argv[])
         tool_version_info();
       /* Check if we were asked to list the SSL engines */
       else if(res == PARAM_ENGINES_REQUESTED)
-        tool_list_engines(config->easy);
+        tool_list_engines();
       else if(res == PARAM_LIBCURL_UNSUPPORTED_PROTOCOL)
         result = CURLE_UNSUPPORTED_PROTOCOL;
       else
@@ -2054,7 +2450,7 @@ CURLcode operate(struct GlobalConfig *config, int argc, argv_item_t argv[])
     }
     else {
 #ifndef CURL_DISABLE_LIBCURL_OPTION
-      if(config->libcurl) {
+      if(global->libcurl) {
         /* Initialise the libcurl source output */
         result = easysrc_init();
       }
@@ -2063,40 +2459,50 @@ CURLcode operate(struct GlobalConfig *config, int argc, argv_item_t argv[])
       /* Perform the main operations */
       if(!result) {
         size_t count = 0;
-        struct OperationConfig *operation = config->first;
+        struct OperationConfig *operation = global->first;
+        CURLSH *share = curl_share_init();
+        if(!share) {
+#ifndef CURL_DISABLE_LIBCURL_OPTION
+          if(global->libcurl) {
+            /* Cleanup the libcurl source output */
+            easysrc_cleanup();
+          }
+#endif
+          return CURLE_OUT_OF_MEMORY;
+        }
+
+        curl_share_setopt(share, CURLSHOPT_SHARE, CURL_LOCK_DATA_COOKIE);
+        curl_share_setopt(share, CURLSHOPT_SHARE, CURL_LOCK_DATA_DNS);
+        curl_share_setopt(share, CURLSHOPT_SHARE, CURL_LOCK_DATA_SSL_SESSION);
+        curl_share_setopt(share, CURLSHOPT_SHARE, CURL_LOCK_DATA_CONNECT);
+        curl_share_setopt(share, CURLSHOPT_SHARE, CURL_LOCK_DATA_PSL);
 
         /* Get the required arguments for each operation */
-        while(!result && operation) {
+        do {
           result = get_args(operation, count++);
 
           operation = operation->next;
-        }
+        } while(!result && operation);
 
         /* Set the current operation pointer */
-        config->current = config->first;
+        global->current = global->first;
 
-        /* Perform each operation */
-        while(!result && config->current) {
-          result = operate_do(config, config->current);
-
-          config->current = config->current->next;
-
-          if(config->current && config->current->easy)
-            curl_easy_reset(config->current->easy);
-        }
+        /* now run! */
+        result = run_all_transfers(global, share, result);
 
+        curl_share_cleanup(share);
 #ifndef CURL_DISABLE_LIBCURL_OPTION
-        if(config->libcurl) {
+        if(global->libcurl) {
           /* Cleanup the libcurl source output */
           easysrc_cleanup();
 
           /* Dump the libcurl code if previously enabled */
-          dumpeasysrc(config);
+          dumpeasysrc(global);
         }
 #endif
       }
       else
-        helpf(config->errors, "out of memory\n");
+        errorf(global, "out of memory\n");
     }
   }
 
index b84388b..39227c0 100644 (file)
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
  *
  ***************************************************************************/
 #include "tool_setup.h"
+#include "tool_cb_hdr.h"
+#include "tool_cb_prg.h"
+#include "tool_sdecls.h"
+
+struct per_transfer {
+  /* double linked */
+  struct per_transfer *next;
+  struct per_transfer *prev;
+  struct OperationConfig *config; /* for this transfer */
+  CURL *curl;
+  long retry_numretries;
+  long retry_sleep_default;
+  long retry_sleep;
+  struct timeval retrystart;
+  bool metalink; /* nonzero for metalink download. */
+  bool metalink_next_res;
+  metalinkfile *mlfile;
+  metalink_resource *mlres;
+  char *this_url;
+  char *outfile;
+  bool infdopen; /* TRUE if infd needs closing */
+  int infd;
+  bool noprogress;
+  struct ProgressData progressbar;
+  struct OutStruct outs;
+  struct OutStruct heads;
+  struct OutStruct etag_save;
+  struct InStruct input;
+  struct HdrCbData hdrcbdata;
+  char errorbuffer[CURL_ERROR_SIZE];
+
+  bool added; /* set TRUE when added to the multi handle */
+
+  /* for parallel progress bar */
+  curl_off_t dltotal;
+  curl_off_t dlnow;
+  curl_off_t ultotal;
+  curl_off_t ulnow;
+  bool dltotal_added; /* if the total has been added from this */
+  bool ultotal_added;
+
+  /* NULL or malloced */
+  char *separator_err;
+  char *separator;
+  char *uploadfile;
+};
 
 CURLcode operate(struct GlobalConfig *config, int argc, argv_item_t argv[]);
 
+extern struct per_transfer *transfers; /* first node */
+
 #endif /* HEADER_CURL_TOOL_OPERATE_H */
index 21b5ffe..8a9b7c9 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2014, 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
 
 void clean_getout(struct OperationConfig *config)
 {
-  struct getout *next;
-  struct getout *node = config->url_list;
-
-  while(node) {
-    next = node->next;
-    Curl_safefree(node->url);
-    Curl_safefree(node->outfile);
-    Curl_safefree(node->infile);
-    Curl_safefree(node);
-    node = next;
+  if(config) {
+    struct getout *next;
+    struct getout *node = config->url_list;
+
+    while(node) {
+      next = node->next;
+      Curl_safefree(node->url);
+      Curl_safefree(node->outfile);
+      Curl_safefree(node->infile);
+      Curl_safefree(node);
+      node = next;
+    }
+    config->url_list = NULL;
   }
-  config->url_list = NULL;
 }
 
 bool output_expected(const char *url, const char *uploadfile)
@@ -71,10 +73,13 @@ bool stdin_upload(const char *uploadfile)
  * Adds the file name to the URL if it doesn't already have one.
  * url will be freed before return if the returned pointer is different
  */
-char *add_file_name_to_url(CURL *curl, char *url, const char *filename)
+char *add_file_name_to_url(char *url, const char *filename)
 {
   /* If no file name part is given in the URL, we add this file name */
   char *ptr = strstr(url, "://");
+  CURL *curl = curl_easy_init(); /* for url escaping */
+  if(!curl)
+    return NULL; /* error! */
   if(ptr)
     ptr += 3;
   else
@@ -110,16 +115,18 @@ char *add_file_name_to_url(CURL *curl, char *url, const char *filename)
         urlbuffer = aprintf("%s/%s", url, encfile);
 
       curl_free(encfile);
-      Curl_safefree(url);
 
-      if(!urlbuffer)
-        return NULL;
+      if(!urlbuffer) {
+        url = NULL;
+        goto end;
+      }
 
+      Curl_safefree(url);
       url = urlbuffer; /* use our new URL instead! */
     }
-    else
-      Curl_safefree(url);
   }
+  end:
+  curl_easy_cleanup(curl);
   return url;
 }
 
@@ -176,7 +183,7 @@ CURLcode get_url_file_name(char **filename, const char *url)
     char *tdir = curlx_getenv("CURL_TESTDIR");
     if(tdir) {
       char buffer[512]; /* suitably large */
-      snprintf(buffer, sizeof(buffer), "%s/%s", tdir, *filename);
+      msnprintf(buffer, sizeof(buffer), "%s/%s", tdir, *filename);
       Curl_safefree(*filename);
       *filename = strdup(buffer); /* clone the buffer */
       curl_free(tdir);
index 90c8549..1e2f027 100644 (file)
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -31,7 +31,7 @@ bool output_expected(const char *url, const char *uploadfile);
 
 bool stdin_upload(const char *uploadfile);
 
-char *add_file_name_to_url(CURL *curl, char *url, const char *filename);
+char *add_file_name_to_url(char *url, const char *filename);
 
 CURLcode get_url_file_name(char **filename, const char *url);
 
index b0e5563..7c51902 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
index 6371a88..e5c6f39 100644 (file)
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
index 894d4d4..67702eb 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -58,12 +58,17 @@ struct getout *new_getout(struct OperationConfig *config)
 
 ParameterError file2string(char **bufp, FILE *file)
 {
-  char *ptr;
   char *string = NULL;
-
   if(file) {
+    char *ptr;
+    size_t alloc = 512;
+    size_t alloc_needed;
     char buffer[256];
     size_t stringlen = 0;
+    string = calloc(1, alloc);
+    if(!string)
+      return PARAM_NO_MEM;
+
     while(fgets(buffer, sizeof(buffer), file)) {
       size_t buflen;
       ptr = strchr(buffer, '\r');
@@ -73,12 +78,24 @@ ParameterError file2string(char **bufp, FILE *file)
       if(ptr)
         *ptr = '\0';
       buflen = strlen(buffer);
-      ptr = realloc(string, stringlen + buflen + 1);
-      if(!ptr) {
-        Curl_safefree(string);
-        return PARAM_NO_MEM;
+      alloc_needed = stringlen + buflen + 1;
+      if(alloc < alloc_needed) {
+#if SIZEOF_SIZE_T < 8
+        if(alloc >= (size_t)SIZE_T_MAX/2) {
+          Curl_safefree(string);
+          return PARAM_NO_MEM;
+        }
+#endif
+        /* doubling is enough since the string to add is always max 256 bytes
+           and the alloc size start at 512 */
+        alloc *= 2;
+        ptr = realloc(string, alloc);
+        if(!ptr) {
+          Curl_safefree(string);
+          return PARAM_NO_MEM;
+        }
+        string = ptr;
       }
-      string = ptr;
       strcpy(string + stringlen, buffer);
       stringlen += buflen;
     }
@@ -198,6 +215,28 @@ ParameterError str2unum(long *val, const char *str)
 }
 
 /*
+ * Parse the string and write the long in the given address if it is below the
+ * maximum allowed value. Return PARAM_OK on success, otherwise a parameter
+ * error enum. ONLY ACCEPTS POSITIVE NUMBERS!
+ *
+ * Since this function gets called with the 'nextarg' pointer from within the
+ * getparameter a lot, we must check it for NULL before accessing the str
+ * data.
+ */
+
+ParameterError str2unummax(long *val, const char *str, long max)
+{
+  ParameterError result = str2unum(val, str);
+  if(result != PARAM_OK)
+    return result;
+  if(*val > max)
+    return PARAM_NUMBER_TOO_LARGE;
+
+  return PARAM_OK;
+}
+
+
+/*
  * Parse the string and write the double in the given address. Return PARAM_OK
  * on success, otherwise a parameter specific error enum.
  *
@@ -456,9 +495,8 @@ static CURLcode checkpasswd(const char *kind, /* for what purpose */
                       kind, *userpwd);
     else
       curlx_msnprintf(prompt, sizeof(prompt),
-                      "Enter %s password for user '%s' on URL #%"
-                      CURL_FORMAT_CURL_OFF_TU ":",
-                      kind, *userpwd, (curl_off_t) (i + 1));
+                      "Enter %s password for user '%s' on URL #%zu:",
+                      kind, *userpwd, i + 1);
 
     /* get password */
     getpass_r(prompt, passwd, sizeof(passwd));
@@ -522,7 +560,7 @@ int ftpcccmethod(struct OperationConfig *config, const char *str)
   return CURLFTPSSL_CCC_PASSIVE;
 }
 
-long delegation(struct OperationConfig *config, char *str)
+long delegation(struct OperationConfig *config, const char *str)
 {
   if(curl_strequal("none", str))
     return CURLGSSAPI_DELEGATION_NONE;
@@ -568,7 +606,7 @@ CURLcode get_args(struct OperationConfig *config, const size_t i)
   if(!config->useragent) {
     config->useragent = my_useragent();
     if(!config->useragent) {
-      helpf(config->global->errors, "out of memory\n");
+      errorf(config->global, "out of memory\n");
       result = CURLE_OUT_OF_MEMORY;
     }
   }
index 854f522..d925b84 100644 (file)
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -33,6 +33,7 @@ void cleanarg(char *str);
 
 ParameterError str2num(long *val, const char *str);
 ParameterError str2unum(long *val, const char *str);
+ParameterError str2unummax(long *val, const char *str, long max);
 ParameterError str2udouble(double *val, const char *str, long max);
 
 long proto2num(struct OperationConfig *config, long *val, const char *str);
@@ -49,7 +50,7 @@ int ftpfilemethod(struct OperationConfig *config, const char *str);
 
 int ftpcccmethod(struct OperationConfig *config, const char *str);
 
-long delegation(struct OperationConfig *config, char *str);
+long delegation(struct OperationConfig *config, const char *str);
 
 ParameterError str2tls_max(long *val, const char *str);
 
index e57d760..a9057ea 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -34,8 +34,6 @@
 
 #include "memdebug.h" /* keep this as LAST include */
 
-#define CURLRC DOT_CHAR "curlrc"
-
 /* only acknowledge colon or equals as separators if the option was not
    specified with an initial dash! */
 #define ISSEP(x,dash) (!dash && (((x) == '=') || ((x) == ':')))
 static const char *unslashquote(const char *line, char *param);
 static char *my_get_line(FILE *fp);
 
+#ifdef WIN32
+static FILE *execpath(const char *filename)
+{
+  char filebuffer[512];
+  /* Get the filename of our executable. GetModuleFileName is already declared
+   * via inclusions done in setup header file.  We assume that we are using
+   * the ASCII version here.
+   */
+  unsigned long len = GetModuleFileNameA(0, filebuffer, sizeof(filebuffer));
+  if(len > 0 && len < sizeof(filebuffer)) {
+    /* We got a valid filename - get the directory part */
+    char *lastdirchar = strrchr(filebuffer, '\\');
+    if(lastdirchar) {
+      size_t remaining;
+      *lastdirchar = 0;
+      /* If we have enough space, build the RC filename */
+      remaining = sizeof(filebuffer) - strlen(filebuffer);
+      if(strlen(filename) < remaining - 1) {
+        msnprintf(lastdirchar, remaining, "%s%s", DIR_CHAR, filename);
+        return fopen(filebuffer, FOPEN_READTEXT);
+      }
+    }
+  }
+
+  return NULL;
+}
+#endif
+
+
 /* return 0 on everything-is-fine, and non-zero otherwise */
 int parseconfig(const char *filename, struct GlobalConfig *global)
 {
-  FILE *file;
-  char filebuffer[512];
+  FILE *file = NULL;
   bool usedarg = FALSE;
   int rc = 0;
   struct OperationConfig *operation = global->first;
+  char *pathalloc = NULL;
 
   if(!filename || !*filename) {
     /* NULL or no file name attempts to load .curlrc from the homedir! */
 
-#ifndef __AMIGA__
     char *home = homedir();    /* portable homedir finder */
-    filename = CURLRC;   /* sensible default */
+#ifndef WIN32
     if(home) {
-      if(strlen(home) < (sizeof(filebuffer) - strlen(CURLRC))) {
-        snprintf(filebuffer, sizeof(filebuffer),
-                 "%s%s%s", home, DIR_CHAR, CURLRC);
-
-#ifdef WIN32
-        /* Check if the file exists - if not, try CURLRC in the same
-         * directory as our executable
-         */
-        file = fopen(filebuffer, FOPEN_READTEXT);
-        if(file != NULL) {
-          fclose(file);
-          filename = filebuffer;
-        }
-        else {
-          /* Get the filename of our executable. GetModuleFileName is
-           * already declared via inclusions done in setup header file.
-           * We assume that we are using the ASCII version here.
-           */
-          int n = GetModuleFileNameA(0, filebuffer, sizeof(filebuffer));
-          if(n > 0 && n < (int)sizeof(filebuffer)) {
-            /* We got a valid filename - get the directory part */
-            char *lastdirchar = strrchr(filebuffer, '\\');
-            if(lastdirchar) {
-              size_t remaining;
-              *lastdirchar = 0;
-              /* If we have enough space, build the RC filename */
-              remaining = sizeof(filebuffer) - strlen(filebuffer);
-              if(strlen(CURLRC) < remaining - 1) {
-                snprintf(lastdirchar, remaining,
-                         "%s%s", DIR_CHAR, CURLRC);
-                /* Don't bother checking if it exists - we do
-                 * that later
-                 */
-                filename = filebuffer;
-              }
-            }
-          }
-        }
-#else /* WIN32 */
-        filename = filebuffer;
-#endif /* WIN32 */
+      pathalloc = curl_maprintf("%s%s.curlrc", home, DIR_CHAR);
+      if(!pathalloc) {
+        free(home);
+        return 1; /* out of memory */
       }
-      Curl_safefree(home); /* we've used it, now free it */
+      filename = pathalloc;
     }
+#else /* Windows */
+    if(home) {
+      int i = 0;
+      char prefix = '.';
+      do {
+        /* if it was allocated in a previous attempt */
+        curl_free(pathalloc);
+        /* check for .curlrc then _curlrc in the home dir */
+        pathalloc = curl_maprintf("%s%s%ccurlrc", home, DIR_CHAR, prefix);
+        if(!pathalloc) {
+          free(home);
+          return 1; /* out of memory */
+        }
 
-# else /* __AMIGA__ */
-    /* On AmigaOS all the config files are into env:
-     */
-    filename = "ENV:" CURLRC;
-
+        /* Check if the file exists - if not, try _curlrc */
+        file = fopen(pathalloc, FOPEN_READTEXT);
+        if(file) {
+          filename = pathalloc;
+          break;
+        }
+        prefix = '_';
+      } while(++i < 2);
+    }
+    if(!filename) {
+      /* check for .curlrc then _curlrc in the dir of the executable */
+      file = execpath(".curlrc");
+      if(!file)
+        file = execpath("_curlrc");
+    }
 #endif
+
+    Curl_safefree(home); /* we've used it, now free it */
   }
 
-  if(strcmp(filename, "-"))
-    file = fopen(filename, FOPEN_READTEXT);
-  else
-    file = stdin;
+  if(!file && filename) { /* no need to fopen() again */
+    if(strcmp(filename, "-"))
+      file = fopen(filename, FOPEN_READTEXT);
+    else
+      file = stdin;
+  }
 
   if(file) {
     char *line;
@@ -230,9 +246,6 @@ int parseconfig(const char *filename, struct GlobalConfig *global)
             /* Initialise the newly created config */
             config_init(operation->next);
 
-            /* Copy the easy handle */
-            operation->next->easy = global->easy;
-
             /* Set the global config pointer */
             operation->next->global = global;
 
@@ -274,6 +287,7 @@ int parseconfig(const char *filename, struct GlobalConfig *global)
   else
     rc = 1; /* couldn't open the file */
 
+  curl_free(pathalloc);
   return rc;
 }
 
index 3406261..49919a7 100644 (file)
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
diff --git a/src/tool_progress.c b/src/tool_progress.c
new file mode 100644 (file)
index 0000000..ac4f58f
--- /dev/null
@@ -0,0 +1,322 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+#include "tool_setup.h"
+#include "tool_operate.h"
+#include "tool_progress.h"
+#include "tool_util.h"
+
+#define ENABLE_CURLX_PRINTF
+/* use our own printf() functions */
+#include "curlx.h"
+
+/* The point of this function would be to return a string of the input data,
+   but never longer than 5 columns (+ one zero byte).
+   Add suffix k, M, G when suitable... */
+static char *max5data(curl_off_t bytes, char *max5)
+{
+#define ONE_KILOBYTE  CURL_OFF_T_C(1024)
+#define ONE_MEGABYTE (CURL_OFF_T_C(1024) * ONE_KILOBYTE)
+#define ONE_GIGABYTE (CURL_OFF_T_C(1024) * ONE_MEGABYTE)
+#define ONE_TERABYTE (CURL_OFF_T_C(1024) * ONE_GIGABYTE)
+#define ONE_PETABYTE (CURL_OFF_T_C(1024) * ONE_TERABYTE)
+
+  if(bytes < CURL_OFF_T_C(100000))
+    msnprintf(max5, 6, "%5" CURL_FORMAT_CURL_OFF_T, bytes);
+
+  else if(bytes < CURL_OFF_T_C(10000) * ONE_KILOBYTE)
+    msnprintf(max5, 6, "%4" CURL_FORMAT_CURL_OFF_T "k", bytes/ONE_KILOBYTE);
+
+  else if(bytes < CURL_OFF_T_C(100) * ONE_MEGABYTE)
+    /* 'XX.XM' is good as long as we're less than 100 megs */
+    msnprintf(max5, 6, "%2" CURL_FORMAT_CURL_OFF_T ".%0"
+              CURL_FORMAT_CURL_OFF_T "M", bytes/ONE_MEGABYTE,
+              (bytes%ONE_MEGABYTE) / (ONE_MEGABYTE/CURL_OFF_T_C(10)) );
+
+#if (CURL_SIZEOF_CURL_OFF_T > 4)
+
+  else if(bytes < CURL_OFF_T_C(10000) * ONE_MEGABYTE)
+    /* 'XXXXM' is good until we're at 10000MB or above */
+    msnprintf(max5, 6, "%4" CURL_FORMAT_CURL_OFF_T "M", bytes/ONE_MEGABYTE);
+
+  else if(bytes < CURL_OFF_T_C(100) * ONE_GIGABYTE)
+    /* 10000 MB - 100 GB, we show it as XX.XG */
+    msnprintf(max5, 6, "%2" CURL_FORMAT_CURL_OFF_T ".%0"
+              CURL_FORMAT_CURL_OFF_T "G", bytes/ONE_GIGABYTE,
+              (bytes%ONE_GIGABYTE) / (ONE_GIGABYTE/CURL_OFF_T_C(10)) );
+
+  else if(bytes < CURL_OFF_T_C(10000) * ONE_GIGABYTE)
+    /* up to 10000GB, display without decimal: XXXXG */
+    msnprintf(max5, 6, "%4" CURL_FORMAT_CURL_OFF_T "G", bytes/ONE_GIGABYTE);
+
+  else if(bytes < CURL_OFF_T_C(10000) * ONE_TERABYTE)
+    /* up to 10000TB, display without decimal: XXXXT */
+    msnprintf(max5, 6, "%4" CURL_FORMAT_CURL_OFF_T "T", bytes/ONE_TERABYTE);
+
+  else
+    /* up to 10000PB, display without decimal: XXXXP */
+    msnprintf(max5, 6, "%4" CURL_FORMAT_CURL_OFF_T "P", bytes/ONE_PETABYTE);
+
+    /* 16384 petabytes (16 exabytes) is the maximum a 64 bit unsigned number
+       can hold, but our data type is signed so 8192PB will be the maximum. */
+
+#else
+
+  else
+    msnprintf(max5, 6, "%4" CURL_FORMAT_CURL_OFF_T "M", bytes/ONE_MEGABYTE);
+
+#endif
+
+  return max5;
+}
+
+int xferinfo_cb(void *clientp,
+                curl_off_t dltotal,
+                curl_off_t dlnow,
+                curl_off_t ultotal,
+                curl_off_t ulnow)
+{
+  struct per_transfer *per = clientp;
+  struct OutStruct *outs = &per->outs;
+  struct OperationConfig *config = outs->config;
+  per->dltotal = dltotal;
+  per->dlnow = dlnow;
+  per->ultotal = ultotal;
+  per->ulnow = ulnow;
+
+  if(config->readbusy) {
+    config->readbusy = FALSE;
+    curl_easy_pause(per->curl, CURLPAUSE_CONT);
+  }
+
+  return 0;
+}
+
+/* Provide a string that is 2 + 1 + 2 + 1 + 2 = 8 letters long (plus the zero
+   byte) */
+static void time2str(char *r, curl_off_t seconds)
+{
+  curl_off_t h;
+  if(seconds <= 0) {
+    strcpy(r, "--:--:--");
+    return;
+  }
+  h = seconds / CURL_OFF_T_C(3600);
+  if(h <= CURL_OFF_T_C(99)) {
+    curl_off_t m = (seconds - (h*CURL_OFF_T_C(3600))) / CURL_OFF_T_C(60);
+    curl_off_t s = (seconds - (h*CURL_OFF_T_C(3600))) - (m*CURL_OFF_T_C(60));
+    msnprintf(r, 9, "%2" CURL_FORMAT_CURL_OFF_T ":%02" CURL_FORMAT_CURL_OFF_T
+              ":%02" CURL_FORMAT_CURL_OFF_T, h, m, s);
+  }
+  else {
+    /* this equals to more than 99 hours, switch to a more suitable output
+       format to fit within the limits. */
+    curl_off_t d = seconds / CURL_OFF_T_C(86400);
+    h = (seconds - (d*CURL_OFF_T_C(86400))) / CURL_OFF_T_C(3600);
+    if(d <= CURL_OFF_T_C(999))
+      msnprintf(r, 9, "%3" CURL_FORMAT_CURL_OFF_T
+                "d %02" CURL_FORMAT_CURL_OFF_T "h", d, h);
+    else
+      msnprintf(r, 9, "%7" CURL_FORMAT_CURL_OFF_T "d", d);
+  }
+}
+
+static curl_off_t all_dltotal = 0;
+static curl_off_t all_ultotal = 0;
+static curl_off_t all_dlalready = 0;
+static curl_off_t all_ulalready = 0;
+
+curl_off_t all_xfers = 0;   /* current total */
+
+struct speedcount {
+  curl_off_t dl;
+  curl_off_t ul;
+  struct timeval stamp;
+};
+#define SPEEDCNT 10
+static unsigned int speedindex;
+static bool indexwrapped;
+static struct speedcount speedstore[SPEEDCNT];
+
+/*
+  |DL% UL%  Dled  Uled  Xfers  Live   Qd Total     Current  Left    Speed
+  |  6 --   9.9G     0     2     2     0  0:00:40  0:00:02  0:00:37 4087M
+*/
+bool progress_meter(struct GlobalConfig *global,
+                    struct timeval *start,
+                    bool final)
+{
+  static struct timeval stamp;
+  static bool header = FALSE;
+  struct timeval now;
+  long diff;
+
+  if(global->noprogress)
+    return FALSE;
+
+  now = tvnow();
+  diff = tvdiff(now, stamp);
+
+  if(!header) {
+    header = TRUE;
+    fputs("DL% UL%  Dled  Uled  Xfers  Live   Qd "
+          "Total     Current  Left    Speed\n",
+          global->errors);
+  }
+  if(final || (diff > 500)) {
+    char time_left[10];
+    char time_total[10];
+    char time_spent[10];
+    char buffer[3][6];
+    curl_off_t spent = tvdiff(now, *start)/1000;
+    char dlpercen[4]="--";
+    char ulpercen[4]="--";
+    struct per_transfer *per;
+    curl_off_t all_dlnow = 0;
+    curl_off_t all_ulnow = 0;
+    bool dlknown = TRUE;
+    bool ulknown = TRUE;
+    curl_off_t all_running = 0; /* in progress */
+    curl_off_t all_queued = 0;  /* pending */
+    curl_off_t speed = 0;
+    unsigned int i;
+    stamp = now;
+
+    /* first add the amounts of the already completed transfers */
+    all_dlnow += all_dlalready;
+    all_ulnow += all_ulalready;
+
+    for(per = transfers; per; per = per->next) {
+      all_dlnow += per->dlnow;
+      all_ulnow += per->ulnow;
+      if(!per->dltotal)
+        dlknown = FALSE;
+      else if(!per->dltotal_added) {
+        /* only add this amount once */
+        all_dltotal += per->dltotal;
+        per->dltotal_added = TRUE;
+      }
+      if(!per->ultotal)
+        ulknown = FALSE;
+      else if(!per->ultotal_added) {
+        /* only add this amount once */
+        all_ultotal += per->ultotal;
+        per->ultotal_added = TRUE;
+      }
+      if(!per->added)
+        all_queued++;
+      else
+        all_running++;
+    }
+    if(dlknown && all_dltotal)
+      /* TODO: handle integer overflow */
+      msnprintf(dlpercen, sizeof(dlpercen), "%3d",
+                all_dlnow * 100 / all_dltotal);
+    if(ulknown && all_ultotal)
+      /* TODO: handle integer overflow */
+      msnprintf(ulpercen, sizeof(ulpercen), "%3d",
+                all_ulnow * 100 / all_ultotal);
+
+    /* get the transfer speed, the higher of the two */
+
+    i = speedindex;
+    speedstore[i].dl = all_dlnow;
+    speedstore[i].ul = all_ulnow;
+    speedstore[i].stamp = now;
+    if(++speedindex >= SPEEDCNT) {
+      indexwrapped = TRUE;
+      speedindex = 0;
+    }
+
+    {
+      long deltams;
+      curl_off_t dl;
+      curl_off_t ul;
+      curl_off_t dls;
+      curl_off_t uls;
+      if(indexwrapped) {
+        /* 'speedindex' is the oldest stored data */
+        deltams = tvdiff(now, speedstore[speedindex].stamp);
+        dl = all_dlnow - speedstore[speedindex].dl;
+        ul = all_ulnow - speedstore[speedindex].ul;
+      }
+      else {
+        /* since the beginning */
+        deltams = tvdiff(now, *start);
+        dl = all_dlnow;
+        ul = all_ulnow;
+      }
+      dls = (curl_off_t)((double)dl / ((double)deltams/1000.0));
+      uls = (curl_off_t)((double)ul / ((double)deltams/1000.0));
+      speed = dls > uls ? dls : uls;
+    }
+
+
+    if(dlknown && speed) {
+      curl_off_t est = all_dltotal / speed;
+      curl_off_t left = (all_dltotal - all_dlnow) / speed;
+      time2str(time_left, left);
+      time2str(time_total, est);
+    }
+    else {
+      time2str(time_left, 0);
+      time2str(time_total, 0);
+    }
+    time2str(time_spent, spent);
+
+    fprintf(global->errors,
+            "\r"
+            "%-3s " /* percent downloaded */
+            "%-3s " /* percent uploaded */
+            "%s " /* Dled */
+            "%s " /* Uled */
+            "%5" CURL_FORMAT_CURL_OFF_T " " /* Xfers */
+            "%5" CURL_FORMAT_CURL_OFF_T " " /* Live */
+            "%5" CURL_FORMAT_CURL_OFF_T " " /* Queued */
+            "%s "  /* Total time */
+            "%s "  /* Current time */
+            "%s "  /* Time left */
+            "%s "  /* Speed */
+            "%5s" /* final newline */,
+
+            dlpercen,  /* 3 letters */
+            ulpercen,  /* 3 letters */
+            max5data(all_dlnow, buffer[0]),
+            max5data(all_ulnow, buffer[1]),
+            all_xfers,
+            all_running,
+            all_queued,
+            time_total,
+            time_spent,
+            time_left,
+            max5data(speed, buffer[2]), /* speed */
+            final ? "\n" :"");
+    return TRUE;
+  }
+  return FALSE;
+}
+
+void progress_finalize(struct per_transfer *per)
+{
+  /* get the numbers before this transfer goes away */
+  all_dlalready += per->dlnow;
+  all_ulalready += per->ulnow;
+}
diff --git a/src/tool_progress.h b/src/tool_progress.h
new file mode 100644 (file)
index 0000000..34b6098
--- /dev/null
@@ -0,0 +1,39 @@
+#ifndef HEADER_CURL_TOOL_PROGRESS_H
+#define HEADER_CURL_TOOL_PROGRESS_H
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+#include "tool_setup.h"
+
+int xferinfo_cb(void *clientp,
+                curl_off_t dltotal,
+                curl_off_t dlnow,
+                curl_off_t ultotal,
+                curl_off_t ulnow);
+
+bool progress_meter(struct GlobalConfig *global,
+                    struct timeval *start,
+                    bool final);
+void progress_finalize(struct per_transfer *per);
+
+extern curl_off_t all_xfers;   /* total number */
+
+#endif /* HEADER_CURL_TOOL_PROGRESS_H */
index ebec9ee..562fef8 100644 (file)
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
index fb2cb66..9b308bf 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -32,7 +32,6 @@
 #include "tool_setopt.h"
 #include "tool_convert.h"
 
-#include "mime.h"
 #include "memdebug.h" /* keep this as LAST include */
 
 /* Lookup tables for converting setopt values back to symbols */
@@ -83,6 +82,7 @@ const NameValue setopt_nv_CURL_HTTP_VERSION[] = {
   NV(CURL_HTTP_VERSION_1_1),
   NV(CURL_HTTP_VERSION_2_0),
   NV(CURL_HTTP_VERSION_2TLS),
+  NV(CURL_HTTP_VERSION_3),
   NVEND,
 };
 
@@ -124,6 +124,7 @@ const NameValue setopt_nv_CURLUSESSL[] = {
 const NameValueUnsigned setopt_nv_CURLSSLOPT[] = {
   NV(CURLSSLOPT_ALLOW_BEAST),
   NV(CURLSSLOPT_NO_REVOKE),
+  NV(CURLSSLOPT_NO_PARTIALCHAIN),
   NVEND,
 };
 
@@ -181,12 +182,18 @@ static const NameValue setopt_nv_CURLNONZERODEFAULTS[] = {
   ret = easysrc_add args; \
   if(ret) \
     goto nomem; \
-} WHILE_FALSE
+} while(0)
 #define ADDF(args) do { \
   ret = easysrc_addf args; \
   if(ret) \
     goto nomem; \
-} WHILE_FALSE
+} while(0)
+#define NULL_CHECK(p) do { \
+  if(!p) { \
+    ret = CURLE_OUT_OF_MEMORY; \
+    goto nomem; \
+  } \
+} while(0)
 
 #define DECL0(s) ADD((&easysrc_decl, s))
 #define DECL1(f,a) ADDF((&easysrc_decl, f,a))
@@ -251,7 +258,7 @@ static char *c_escape(const char *str, size_t len)
       e += 2;
     }
     else if(! isprint(c)) {
-      snprintf(e, 5, "\\%03o", (unsigned)c);
+      msnprintf(e, 5, "\\%03o", (unsigned)c);
       e += 4;
     }
     else
@@ -311,8 +318,8 @@ CURLcode tool_setopt_flags(CURL *curl, struct GlobalConfig *config,
     char preamble[80];          /* should accommodate any symbol name */
     long rest = lval;           /* bits not handled yet */
     const NameValue *nv = NULL;
-    snprintf(preamble, sizeof(preamble),
-             "curl_easy_setopt(hnd, %s, ", name);
+    msnprintf(preamble, sizeof(preamble),
+              "curl_easy_setopt(hnd, %s, ", name);
     for(nv = nvlist; nv->name; nv++) {
       if((nv->value & ~ rest) == 0) {
         /* all value flags contained in rest */
@@ -322,7 +329,7 @@ CURLcode tool_setopt_flags(CURL *curl, struct GlobalConfig *config,
         if(!rest)
           break;                /* handled them all */
         /* replace with all spaces for continuation line */
-        snprintf(preamble, sizeof(preamble), "%*s", strlen(preamble), "");
+        msnprintf(preamble, sizeof(preamble), "%*s", strlen(preamble), "");
       }
     }
     /* If any bits have no definition, output an explicit value.
@@ -354,8 +361,8 @@ CURLcode tool_setopt_bitmask(CURL *curl, struct GlobalConfig *config,
     char preamble[80];
     unsigned long rest = (unsigned long)lval;
     const NameValueUnsigned *nv = NULL;
-    snprintf(preamble, sizeof(preamble),
-             "curl_easy_setopt(hnd, %s, ", name);
+    msnprintf(preamble, sizeof(preamble),
+              "curl_easy_setopt(hnd, %s, ", name);
     for(nv = nvlist; nv->name; nv++) {
       if((nv->value & ~ rest) == 0) {
         /* all value flags contained in rest */
@@ -365,7 +372,7 @@ CURLcode tool_setopt_bitmask(CURL *curl, struct GlobalConfig *config,
         if(!rest)
           break;                /* handled them all */
         /* replace with all spaces for continuation line */
-        snprintf(preamble, sizeof(preamble), "%*s", strlen(preamble), "");
+        msnprintf(preamble, sizeof(preamble), "%*s", strlen(preamble), "");
       }
     }
     /* If any bits have no definition, output an explicit value.
@@ -406,174 +413,184 @@ static CURLcode libcurl_generate_slist(struct curl_slist *slist, int *slistno)
   return ret;
 }
 
-/* Generate source code for a mime structure. */
-static CURLcode libcurl_generate_mime(curl_mime *mime, int *mimeno)
+static CURLcode libcurl_generate_mime(CURL *curl,
+                                      struct GlobalConfig *config,
+                                      tool_mime *toolmime,
+                                      int *mimeno);     /* Forward. */
+
+/* Wrapper to generate source code for a mime part. */
+static CURLcode libcurl_generate_mime_part(CURL *curl,
+                                           struct GlobalConfig *config,
+                                           tool_mime *part,
+                                           int mimeno)
 {
   CURLcode ret = CURLE_OK;
-  int i;
-  curl_off_t size;
-  curl_mimepart *part;
-  char *filename;
+  int submimeno = 0;
   char *escaped = NULL;
-  char *cp;
-  char *data;
+  const char *data = NULL;
+  const char *filename = part->filename;
+
+  /* Parts are linked in reverse order. */
+  if(part->prev) {
+    ret = libcurl_generate_mime_part(curl, config, part->prev, mimeno);
+    if(ret)
+      return ret;
+  }
 
-  /* May need several mime variables, so invent name */
-  *mimeno = ++easysrc_mime_count;
+  /* Create the part. */
+  CODE2("part%d = curl_mime_addpart(mime%d);", mimeno, mimeno);
 
-  DECL1("curl_mime *mime%d;", *mimeno);
-  DATA1("mime%d = NULL;", *mimeno);
-  CODE1("mime%d = curl_mime_init(hnd);", *mimeno);
-  CLEAN1("curl_mime_free(mime%d);", *mimeno);
-  CLEAN1("mime%d = NULL;", *mimeno);
-  if(mime->firstpart) {
-    DECL1("curl_mimepart *part%d;", *mimeno);
-    for(part = mime->firstpart; part; part = part->nextpart) {
-      CODE2("part%d = curl_mime_addpart(mime%d);", *mimeno, *mimeno);
-      filename = part->filename;
-      switch(part->kind) {
-      case MIMEKIND_FILE:
-        Curl_safefree(escaped);
-        escaped = c_escape(part->data, CURL_ZERO_TERMINATED);
-        if(!escaped)
-          return CURLE_OUT_OF_MEMORY;
-        CODE2("curl_mime_filedata(part%d, \"%s\");", *mimeno, escaped);
-        if(!filename)
-          CODE1("curl_mime_filename(part%d, NULL);", *mimeno);
-        else {
-          /* Fast check to see if remote file name is base name. */
-          filename = part->data;
-          for(cp = filename; *cp; cp++)
-            if(*cp == '/' || *cp == '\\')
-              filename = cp + 1;
-          if(!part->filename || !strcmp(filename, part->filename))
-            filename = NULL;
-          else
-            filename = part->filename;
-        }
-        break;
-      case MIMEKIND_CALLBACK:
-        /* Can only be reading stdin in the current context. */
-        CODE1("curl_mime_data_cb(part%d, -1, (curl_read_callback) fread, \\",
-              *mimeno);
-        CODE0("                  (curl_seek_callback) fseek, NULL, stdin);");
-        break;
-      case MIMEKIND_DATA:
-#ifdef CURL_DOES_CONVERSIONS
-          /* Data is stored in ASCII and we want in in the host character
-             code. Convert it back for output. */
-          data = malloc(part->datasize + 1);
-          if(!data) {
-            ret = CURLE_OUT_OF_MEMORY;
-            goto nomem;
-          }
-          memcpy(data, part->data, part->datasize + 1);
-          ret = convert_from_network(data, strlen(data));
-          if(ret) {
-            Curl_safefree(data);
-            goto nomem;
-          }
-#else
-        data = part->data;
-#endif
+  switch(part->kind) {
+  case TOOLMIME_PARTS:
+    ret = libcurl_generate_mime(curl, config, part, &submimeno);
+    if(!ret) {
+      CODE2("curl_mime_subparts(part%d, mime%d);", mimeno, submimeno);
+      CODE1("mime%d = NULL;", submimeno);   /* Avoid freeing in CLEAN. */
+    }
+    break;
 
-        /* Are there any nul byte in data? */
-        for(cp = data; *cp; cp++)
-          ;
-        size = (cp == data + part->datasize)? (curl_off_t) -1: part->datasize;
-        Curl_safefree(escaped);
-        escaped = c_escape(data, (size_t) part->datasize);
+  case TOOLMIME_DATA:
 #ifdef CURL_DOES_CONVERSIONS
-        Curl_safefree(data);
+    /* Data will be set in ASCII, thus issue a comment with clear text. */
+    escaped = c_escape(part->data, CURL_ZERO_TERMINATED);
+    NULL_CHECK(escaped);
+    CODE1("/* \"%s\" */", escaped);
+
+    /* Our data is always textual: convert it to ASCII. */
+    {
+      size_t size = strlen(part->data);
+      char *cp = malloc(size + 1);
+
+      NULL_CHECK(cp);
+      memcpy(cp, part->data, size + 1);
+      ret = convert_to_network(cp, size);
+      data = cp;
+    }
+#else
+    data = part->data;
 #endif
-        if(!escaped)
-          return CURLE_OUT_OF_MEMORY;
-        if(size >= 0)
-          CODE3("curl_mime_data(part%d, \"%s\", %" CURL_FORMAT_CURL_OFF_T ");",
-                                *mimeno, escaped, size);
-        else
-          CODE2("curl_mime_data(part%d, \"%s\", CURL_ZERO_TERMINATED);",
-                                *mimeno, escaped);
-        break;
-      case MIMEKIND_MULTIPART:
-        ret = libcurl_generate_mime(part->arg, &i);
-        if(ret)
-          goto nomem;
-        CODE2("curl_mime_subparts(part%d, mime%d);", *mimeno, i);
-        CODE1("mime%d = NULL;", i);   /* Avoid freeing in CLEAN sequence. */
-        break;
-      default:
-        /* Other cases not possible in this context. */
-        break;
-      }
+    if(!ret) {
+      Curl_safefree(escaped);
+      escaped = c_escape(data, CURL_ZERO_TERMINATED);
+      NULL_CHECK(escaped);
+      CODE2("curl_mime_data(part%d, \"%s\", CURL_ZERO_TERMINATED);",
+                            mimeno, escaped);
+    }
+    break;
+
+  case TOOLMIME_FILE:
+  case TOOLMIME_FILEDATA:
+    escaped = c_escape(part->data, CURL_ZERO_TERMINATED);
+    NULL_CHECK(escaped);
+    CODE2("curl_mime_filedata(part%d, \"%s\");", mimeno, escaped);
+    if(part->kind == TOOLMIME_FILEDATA && !filename) {
+      CODE1("curl_mime_filename(part%d, NULL);", mimeno);
+    }
+    break;
+
+  case TOOLMIME_STDIN:
+    if(!filename)
+      filename = "-";
+    /* FALLTHROUGH */
+  case TOOLMIME_STDINDATA:
+    /* Can only be reading stdin in the current context. */
+    CODE1("curl_mime_data_cb(part%d, -1, (curl_read_callback) fread, \\",
+          mimeno);
+    CODE0("                  (curl_seek_callback) fseek, NULL, stdin);");
+    break;
+  default:
+    /* Other cases not possible in this context. */
+    break;
+  }
 
-      if(part->encoder) {
-        Curl_safefree(escaped);
-        escaped = c_escape(part->encoder->name, CURL_ZERO_TERMINATED);
-        if(!escaped)
-          return CURLE_OUT_OF_MEMORY;
-        CODE2("curl_mime_encoder(part%d, \"%s\");", *mimeno, escaped);
-      }
+  if(!ret && part->encoder) {
+    Curl_safefree(escaped);
+    escaped = c_escape(part->encoder, CURL_ZERO_TERMINATED);
+    NULL_CHECK(escaped);
+    CODE2("curl_mime_encoder(part%d, \"%s\");", mimeno, escaped);
+  }
 
-      if(filename) {
-        Curl_safefree(escaped);
-        escaped = c_escape(filename, CURL_ZERO_TERMINATED);
-        if(!escaped)
-          return CURLE_OUT_OF_MEMORY;
-        CODE2("curl_mime_filename(part%d, \"%s\");", *mimeno, escaped);
-      }
+  if(!ret && filename) {
+    Curl_safefree(escaped);
+    escaped = c_escape(filename, CURL_ZERO_TERMINATED);
+    NULL_CHECK(escaped);
+    CODE2("curl_mime_filename(part%d, \"%s\");", mimeno, escaped);
+  }
 
-      if(part->name) {
-        Curl_safefree(escaped);
-        escaped = c_escape(part->name, CURL_ZERO_TERMINATED);
-        if(!escaped)
-          return CURLE_OUT_OF_MEMORY;
-        CODE2("curl_mime_name(part%d, \"%s\");", *mimeno, escaped);
-      }
+  if(!ret && part->name) {
+    Curl_safefree(escaped);
+    escaped = c_escape(part->name, CURL_ZERO_TERMINATED);
+    NULL_CHECK(escaped);
+    CODE2("curl_mime_name(part%d, \"%s\");", mimeno, escaped);
+  }
 
-      if(part->mimetype) {
-        Curl_safefree(escaped);
-        escaped = c_escape(part->mimetype, CURL_ZERO_TERMINATED);
-        if(!escaped)
-          return CURLE_OUT_OF_MEMORY;
-        CODE2("curl_mime_type(part%d, \"%s\");", *mimeno, escaped);
-      }
+  if(!ret && part->type) {
+    Curl_safefree(escaped);
+    escaped = c_escape(part->type, CURL_ZERO_TERMINATED);
+    NULL_CHECK(escaped);
+    CODE2("curl_mime_type(part%d, \"%s\");", mimeno, escaped);
+  }
 
-      if(part->userheaders) {
-        int ownership = part->flags & MIME_USERHEADERS_OWNER? 1: 0;
+  if(!ret && part->headers) {
+    int slistno;
 
-        ret = libcurl_generate_slist(part->userheaders, &i);
-        if(ret)
-          goto nomem;
-        CODE3("curl_mime_headers(part%d, slist%d, %d);",
-              *mimeno, i, ownership);
-        if(ownership)
-          CODE1("slist%d = NULL;", i); /* Prevent freeing in CLEAN sequence. */
-      }
+    ret = libcurl_generate_slist(part->headers, &slistno);
+    if(!ret) {
+      CODE2("curl_mime_headers(part%d, slist%d, 1);", mimeno, slistno);
+      CODE1("slist%d = NULL;", slistno); /* Prevent CLEANing. */
     }
   }
 
 nomem:
+#ifdef CURL_DOES_CONVERSIONS
+  if(data)
+    free((char *) data);
+#endif
+
   Curl_safefree(escaped);
   return ret;
 }
 
+/* Wrapper to generate source code for a mime structure. */
+static CURLcode libcurl_generate_mime(CURL *curl,
+                                      struct GlobalConfig *config,
+                                      tool_mime *toolmime,
+                                      int *mimeno)
+{
+  CURLcode ret = CURLE_OK;
+
+  /* May need several mime variables, so invent name. */
+  *mimeno = ++easysrc_mime_count;
+  DECL1("curl_mime *mime%d;", *mimeno);
+  DATA1("mime%d = NULL;", *mimeno);
+  CODE1("mime%d = curl_mime_init(hnd);", *mimeno);
+  CLEAN1("curl_mime_free(mime%d);", *mimeno);
+  CLEAN1("mime%d = NULL;", *mimeno);
+
+  if(toolmime->subparts) {
+    DECL1("curl_mimepart *part%d;", *mimeno);
+    ret = libcurl_generate_mime_part(curl, config,
+                                     toolmime->subparts, *mimeno);
+  }
+
+nomem:
+  return ret;
+}
+
 /* setopt wrapper for CURLOPT_MIMEPOST */
 CURLcode tool_setopt_mimepost(CURL *curl, struct GlobalConfig *config,
                               const char *name, CURLoption tag,
                               curl_mime *mimepost)
 {
-  CURLcode ret = CURLE_OK;
-
-  ret = curl_easy_setopt(curl, tag, mimepost);
+  CURLcode ret = curl_easy_setopt(curl, tag, mimepost);
+  int mimeno = 0;
 
-  if(config->libcurl && mimepost && !ret) {
-    int i;
-
-    ret = libcurl_generate_mime(mimepost, &i);
+  if(!ret && config->libcurl) {
+    ret = libcurl_generate_mime(curl, config,
+                                config->current->mimeroot, &mimeno);
 
     if(!ret)
-      CODE2("curl_easy_setopt(hnd, %s, mime%d);", name, i);
+      CODE2("curl_easy_setopt(hnd, %s, mime%d);", name, mimeno);
   }
 
 nomem:
@@ -629,7 +646,7 @@ CURLcode tool_setopt(CURL *curl, bool str, struct GlobalConfig *config,
       }
     }
 
-    snprintf(buf, sizeof(buf), "%ldL", lval);
+    msnprintf(buf, sizeof(buf), "%ldL", lval);
     value = buf;
     ret = curl_easy_setopt(curl, tag, lval);
     if(lval == defval)
@@ -666,8 +683,8 @@ CURLcode tool_setopt(CURL *curl, bool str, struct GlobalConfig *config,
   else {
     /* Value is expected to be curl_off_t */
     curl_off_t oval = va_arg(arg, curl_off_t);
-    snprintf(buf, sizeof(buf),
-             "(curl_off_t)%" CURL_FORMAT_CURL_OFF_T, oval);
+    msnprintf(buf, sizeof(buf),
+              "(curl_off_t)%" CURL_FORMAT_CURL_OFF_T, oval);
     value = buf;
     ret = curl_easy_setopt(curl, tag, oval);
 
@@ -685,10 +702,7 @@ CURLcode tool_setopt(CURL *curl, bool str, struct GlobalConfig *config,
     else {
       if(escape) {
         escaped = c_escape(value, CURL_ZERO_TERMINATED);
-        if(!escaped) {
-          ret = CURLE_OUT_OF_MEMORY;
-          goto nomem;
-        }
+        NULL_CHECK(escaped);
         CODE2("curl_easy_setopt(hnd, %s, \"%s\");", name, escaped);
       }
       else
@@ -701,4 +715,129 @@ CURLcode tool_setopt(CURL *curl, bool str, struct GlobalConfig *config,
   return ret;
 }
 
+#else /* CURL_DISABLE_LIBCURL_OPTION */
+
+#include "tool_cfgable.h"
+#include "tool_setopt.h"
+
 #endif /* CURL_DISABLE_LIBCURL_OPTION */
+
+/*
+ * tool_setopt_skip() allows the curl tool code to avoid setopt options that
+ * are explicitly disabled in the build.
+ */
+bool tool_setopt_skip(CURLoption tag)
+{
+#ifdef CURL_DISABLE_PROXY
+#define USED_TAG
+  switch(tag) {
+  case CURLOPT_HAPROXYPROTOCOL:
+  case CURLOPT_HTTPPROXYTUNNEL:
+  case CURLOPT_NOPROXY:
+  case CURLOPT_PRE_PROXY:
+  case CURLOPT_PROXY:
+  case CURLOPT_PROXYAUTH:
+  case CURLOPT_PROXY_CAINFO:
+  case CURLOPT_PROXY_CAPATH:
+  case CURLOPT_PROXY_CRLFILE:
+  case CURLOPT_PROXYHEADER:
+  case CURLOPT_PROXY_KEYPASSWD:
+  case CURLOPT_PROXYPASSWORD:
+  case CURLOPT_PROXY_PINNEDPUBLICKEY:
+  case CURLOPT_PROXYPORT:
+  case CURLOPT_PROXY_SERVICE_NAME:
+  case CURLOPT_PROXY_SSLCERT:
+  case CURLOPT_PROXY_SSLCERTTYPE:
+  case CURLOPT_PROXY_SSL_CIPHER_LIST:
+  case CURLOPT_PROXY_SSLKEY:
+  case CURLOPT_PROXY_SSLKEYTYPE:
+  case CURLOPT_PROXY_SSL_OPTIONS:
+  case CURLOPT_PROXY_SSL_VERIFYHOST:
+  case CURLOPT_PROXY_SSL_VERIFYPEER:
+  case CURLOPT_PROXY_SSLVERSION:
+  case CURLOPT_PROXY_TLS13_CIPHERS:
+  case CURLOPT_PROXY_TLSAUTH_PASSWORD:
+  case CURLOPT_PROXY_TLSAUTH_TYPE:
+  case CURLOPT_PROXY_TLSAUTH_USERNAME:
+  case CURLOPT_PROXY_TRANSFER_MODE:
+  case CURLOPT_PROXYTYPE:
+  case CURLOPT_PROXYUSERNAME:
+  case CURLOPT_PROXYUSERPWD:
+    return TRUE;
+  default:
+    break;
+  }
+#endif
+#ifdef CURL_DISABLE_FTP
+#define USED_TAG
+  switch(tag) {
+  case CURLOPT_FTPPORT:
+  case CURLOPT_FTP_ACCOUNT:
+  case CURLOPT_FTP_ALTERNATIVE_TO_USER:
+  case CURLOPT_FTP_FILEMETHOD:
+  case CURLOPT_FTP_SKIP_PASV_IP:
+  case CURLOPT_FTP_USE_EPRT:
+  case CURLOPT_FTP_USE_EPSV:
+  case CURLOPT_FTP_USE_PRET:
+  case CURLOPT_KRBLEVEL:
+    return TRUE;
+  default:
+    break;
+  }
+#endif
+#ifdef CURL_DISABLE_RTSP
+#define USED_TAG
+  switch(tag) {
+  case CURLOPT_INTERLEAVEDATA:
+    return TRUE;
+  default:
+    break;
+  }
+#endif
+#if defined(CURL_DISABLE_HTTP) || defined(CURL_DISABLE_COOKIES)
+#define USED_TAG
+  switch(tag) {
+  case CURLOPT_COOKIE:
+  case CURLOPT_COOKIEFILE:
+  case CURLOPT_COOKIEJAR:
+  case CURLOPT_COOKIESESSION:
+    return TRUE;
+  default:
+    break;
+  }
+#endif
+#if defined(CURL_DISABLE_TELNET)
+#define USED_TAG
+  switch(tag) {
+  case CURLOPT_TELNETOPTIONS:
+    return TRUE;
+  default:
+    break;
+  }
+#endif
+#ifdef CURL_DISABLE_TFTP
+#define USED_TAG
+  switch(tag) {
+  case CURLOPT_TFTP_BLKSIZE:
+  case CURLOPT_TFTP_NO_OPTIONS:
+    return TRUE;
+  default:
+    break;
+  }
+#endif
+#ifdef CURL_DISABLE_NETRC
+#define USED_TAG
+  switch(tag) {
+  case CURLOPT_NETRC:
+  case CURLOPT_NETRC_FILE:
+    return TRUE;
+  default:
+    break;
+  }
+#endif
+
+#ifndef USED_TAG
+  (void)tag;
+#endif
+  return FALSE;
+}
index f8a52cd..48e9e81 100644 (file)
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
  ***************************************************************************/
 #include "tool_setup.h"
 
+#include "tool_formparse.h"
+
 /*
  * Macros used in operate()
  */
 
-#define SETOPT_CHECK(v) do { \
-  result = (v); \
-  if(result) \
-    goto show_error; \
-} WHILE_FALSE
+#define SETOPT_CHECK(v,opt) do {                \
+    if(!tool_setopt_skip(opt)) {                \
+      result = (v);                             \
+      if(result)                                \
+        break;                                  \
+    }                                           \
+  } while(0)
+
+/* allow removed features to simulate success: */
+bool tool_setopt_skip(CURLoption tag);
 
 #ifndef CURL_DISABLE_LIBCURL_OPTION
 
@@ -95,25 +102,25 @@ CURLcode tool_setopt(CURL *curl, bool str, struct GlobalConfig *config,
                      const char *name, CURLoption tag, ...);
 
 #define my_setopt(x,y,z) \
-  SETOPT_CHECK(tool_setopt(x, FALSE, global, #y, y, z))
+  SETOPT_CHECK(tool_setopt(x, FALSE, global, #y, y, z), y)
 
 #define my_setopt_str(x,y,z) \
-  SETOPT_CHECK(tool_setopt(x, TRUE, global, #y, y, z))
+  SETOPT_CHECK(tool_setopt(x, TRUE, global, #y, y, z), y)
 
 #define my_setopt_enum(x,y,z) \
-  SETOPT_CHECK(tool_setopt_enum(x, global, #y, y, setopt_nv_ ## y, z))
+  SETOPT_CHECK(tool_setopt_enum(x, global, #y, y, setopt_nv_ ## y, z), y)
 
 #define my_setopt_flags(x,y,z) \
-  SETOPT_CHECK(tool_setopt_flags(x, global, #y, y, setopt_nv_ ## y, z))
+  SETOPT_CHECK(tool_setopt_flags(x, global, #y, y, setopt_nv_ ## y, z), y)
 
 #define my_setopt_bitmask(x,y,z) \
-  SETOPT_CHECK(tool_setopt_bitmask(x, global, #y, y, setopt_nv_ ## y, z))
+  SETOPT_CHECK(tool_setopt_bitmask(x, global, #y, y, setopt_nv_ ## y, z), y)
 
 #define my_setopt_mimepost(x,y,z) \
-  SETOPT_CHECK(tool_setopt_mimepost(x, global, #y, y, z))
+  SETOPT_CHECK(tool_setopt_mimepost(x, global, #y, y, z), y)
 
 #define my_setopt_slist(x,y,z) \
-  SETOPT_CHECK(tool_setopt_slist(x, global, #y, y, z))
+  SETOPT_CHECK(tool_setopt_slist(x, global, #y, y, z), y)
 
 #define res_setopt(x,y,z) tool_setopt(x, FALSE, global, #y, y, z)
 
@@ -124,25 +131,25 @@ CURLcode tool_setopt(CURL *curl, bool str, struct GlobalConfig *config,
 /* No --libcurl, so pass options directly to library */
 
 #define my_setopt(x,y,z) \
-  SETOPT_CHECK(curl_easy_setopt(x, y, z))
+  SETOPT_CHECK(curl_easy_setopt(x, y, z), y)
 
 #define my_setopt_str(x,y,z) \
-  SETOPT_CHECK(curl_easy_setopt(x, y, z))
+  SETOPT_CHECK(curl_easy_setopt(x, y, z), y)
 
 #define my_setopt_enum(x,y,z) \
-  SETOPT_CHECK(curl_easy_setopt(x, y, z))
+  SETOPT_CHECK(curl_easy_setopt(x, y, z), y)
 
 #define my_setopt_flags(x,y,z) \
-  SETOPT_CHECK(curl_easy_setopt(x, y, z))
+  SETOPT_CHECK(curl_easy_setopt(x, y, z), y)
 
 #define my_setopt_bitmask(x,y,z) \
-  SETOPT_CHECK(curl_easy_setopt(x, y, z))
+  SETOPT_CHECK(curl_easy_setopt(x, y, z), y)
 
 #define my_setopt_mimepost(x,y,z) \
-  SETOPT_CHECK(curl_easy_setopt(x, y, z))
+  SETOPT_CHECK(curl_easy_setopt(x, y, z), y)
 
 #define my_setopt_slist(x,y,z) \
-  SETOPT_CHECK(curl_easy_setopt(x, y, z))
+  SETOPT_CHECK(curl_easy_setopt(x, y, z), y)
 
 #define res_setopt(x,y,z) curl_easy_setopt(x,y,z)
 
index 854973e..60a7ccd 100644 (file)
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
index edb5aed..67a5443 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
index 3aaab52..59be6aa 100644 (file)
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
index f84b202..e30e403 100644 (file)
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
index e4a5c33..450cdcf 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -462,9 +462,9 @@ CURLcode glob_url(URLGlob **glob, char *url, unsigned long *urlnum,
       char text[512];
       const char *t;
       if(glob_expand->pos) {
-        snprintf(text, sizeof(text), "%s in URL position %zu:\n%s\n%*s^",
-                 glob_expand->error,
-                 glob_expand->pos, url, glob_expand->pos - 1, " ");
+        msnprintf(text, sizeof(text), "%s in URL position %zu:\n%s\n%*s^",
+                  glob_expand->error,
+                  glob_expand->pos, url, glob_expand->pos - 1, " ");
         t = text;
       }
       else
@@ -488,6 +488,9 @@ void glob_cleanup(URLGlob* glob)
   size_t i;
   int elem;
 
+  if(!glob)
+    return;
+
   for(i = 0; i < glob->size; i++) {
     if((glob->pattern[i].type == UPTSet) &&
        (glob->pattern[i].content.Set.elements)) {
@@ -553,8 +556,7 @@ CURLcode glob_next_url(char **globbed, URLGlob *glob)
       }
     }
     if(carry) {         /* first pattern ptr has run into overflow, done! */
-      /* TODO: verify if this should actually return CURLE_OK. */
-      return CURLE_OK; /* CURLE_OK to match previous behavior */
+      return CURLE_OK;
     }
   }
 
@@ -563,8 +565,8 @@ CURLcode glob_next_url(char **globbed, URLGlob *glob)
     switch(pat->type) {
     case UPTSet:
       if(pat->content.Set.elements) {
-        snprintf(buf, buflen, "%s",
-                 pat->content.Set.elements[pat->content.Set.ptr_s]);
+        msnprintf(buf, buflen, "%s",
+                  pat->content.Set.elements[pat->content.Set.ptr_s]);
         len = strlen(buf);
         buf += len;
         buflen -= len;
@@ -578,9 +580,9 @@ CURLcode glob_next_url(char **globbed, URLGlob *glob)
       }
       break;
     case UPTNumRange:
-      snprintf(buf, buflen, "%0*lu",
-               pat->content.NumRange.padlength,
-               pat->content.NumRange.ptr_n);
+      msnprintf(buf, buflen, "%0*lu",
+                pat->content.NumRange.padlength,
+                pat->content.NumRange.ptr_n);
       len = strlen(buf);
       buf += len;
       buflen -= len;
@@ -603,7 +605,7 @@ CURLcode glob_match_url(char **result, char *filename, URLGlob *glob)
   char *target;
   size_t allocsize;
   char numbuf[18];
-  char *appendthis = NULL;
+  char *appendthis = (char *)"";
   size_t appendlen = 0;
   size_t stringlen = 0;
 
@@ -653,9 +655,9 @@ CURLcode glob_match_url(char **result, char *filename, URLGlob *glob)
           appendlen = 1;
           break;
         case UPTNumRange:
-          snprintf(numbuf, sizeof(numbuf), "%0*lu",
-                   pat->content.NumRange.padlength,
-                   pat->content.NumRange.ptr_n);
+          msnprintf(numbuf, sizeof(numbuf), "%0*lu",
+                    pat->content.NumRange.padlength,
+                    pat->content.NumRange.ptr_n);
           appendthis = numbuf;
           appendlen = strlen(numbuf);
           break;
index 55ac346..82326c0 100644 (file)
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
index 1a5b773..04d73e4 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -47,7 +47,7 @@ struct timeval tvnow(void)
   DWORD milliseconds = GetTickCount();
 #endif
   now.tv_sec = (long)(milliseconds / 1000);
-  now.tv_usec = (milliseconds % 1000) * 1000;
+  now.tv_usec = (long)((milliseconds % 1000) * 1000);
   return now;
 }
 
index 5339c11..8e4a3f4 100644 (file)
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
index 333597d..d6553b3 100644 (file)
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -25,7 +25,7 @@
 
 #define CURL_NAME "curl"
 #define CURL_COPYRIGHT LIBCURL_COPYRIGHT
-#define CURL_VERSION "7.62.0"
+#define CURL_VERSION "7.68.0"
 #define CURL_VERSION_MAJOR LIBCURL_VERSION_MAJOR
 #define CURL_VERSION_MINOR LIBCURL_VERSION_MINOR
 #define CURL_VERSION_PATCH LIBCURL_VERSION_PATCH
index 54871a6..7fa0dd6 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
index 96c86f1..1359369 100644 (file)
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
index ffe47c6..27b2ac5 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -60,6 +60,8 @@ typedef enum {
   VAR_LOCAL_PORT,
   VAR_HTTP_VERSION,
   VAR_SCHEME,
+  VAR_STDOUT,
+  VAR_STDERR,
   VAR_NUM_OF_VARS /* must be the last */
 } replaceid;
 
@@ -101,6 +103,8 @@ static const struct variable replacements[]={
   {"local_port", VAR_LOCAL_PORT},
   {"http_version", VAR_HTTP_VERSION},
   {"scheme", VAR_SCHEME},
+  {"stdout", VAR_STDOUT},
+  {"stderr", VAR_STDERR},
   {NULL, VAR_NONE}
 };
 
@@ -310,6 +314,9 @@ void ourWriteOut(CURL *curl, struct OutStruct *outs, const char *writeinfo)
                   case CURL_HTTP_VERSION_2_0:
                     version = "2";
                     break;
+                  case CURL_HTTP_VERSION_3:
+                    version = "3";
+                    break;
                   }
 
                   fprintf(stream, version);
@@ -321,6 +328,12 @@ void ourWriteOut(CURL *curl, struct OutStruct *outs, const char *writeinfo)
                                      &stringp))
                   fprintf(stream, "%s", stringp);
                 break;
+              case VAR_STDOUT:
+                stream = stdout;
+                break;
+              case VAR_STDERR:
+                stream = stderr;
+                break;
               default:
                 break;
               }
index 8d3f645..ee8990f 100644 (file)
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
index 92b99db..592d4a1 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -49,6 +49,46 @@ static const struct xattr_mapping {
   { NULL,                  CURLINFO_NONE } /* last element, abort loop here */
 };
 
+/* returns TRUE if a new URL is returned, that then needs to be freed */
+/* @unittest: 1621 */
+#ifdef UNITTESTS
+bool stripcredentials(char **url);
+#else
+static
+#endif
+bool stripcredentials(char **url)
+{
+  CURLU *u;
+  CURLUcode uc;
+  char *nurl;
+  u = curl_url();
+  if(u) {
+    uc = curl_url_set(u, CURLUPART_URL, *url, 0);
+    if(uc)
+      goto error;
+
+    uc = curl_url_set(u, CURLUPART_USER, NULL, 0);
+    if(uc)
+      goto error;
+
+    uc = curl_url_set(u, CURLUPART_PASSWORD, NULL, 0);
+    if(uc)
+      goto error;
+
+    uc = curl_url_get(u, CURLUPART_URL, &nurl, 0);
+    if(uc)
+      goto error;
+
+    curl_url_cleanup(u);
+
+    *url = nurl;
+    return TRUE;
+  }
+  error:
+  curl_url_cleanup(u);
+  return FALSE;
+}
+
 /* store metadata from the curl request alongside the downloaded
  * file using extended attributes
  */
@@ -62,17 +102,26 @@ int fwrite_xattr(CURL *curl, int fd)
     char *value = NULL;
     CURLcode result = curl_easy_getinfo(curl, mappings[i].info, &value);
     if(!result && value) {
+      bool freeptr = FALSE;
+      if(CURLINFO_EFFECTIVE_URL == mappings[i].info)
+        freeptr = stripcredentials(&value);
+      if(value) {
 #ifdef HAVE_FSETXATTR_6
-      err = fsetxattr(fd, mappings[i].attr, value, strlen(value), 0, 0);
+        err = fsetxattr(fd, mappings[i].attr, value, strlen(value), 0, 0);
 #elif defined(HAVE_FSETXATTR_5)
-      err = fsetxattr(fd, mappings[i].attr, value, strlen(value), 0);
+        err = fsetxattr(fd, mappings[i].attr, value, strlen(value), 0);
 #elif defined(__FreeBSD_version)
-      err = extattr_set_fd(fd, EXTATTR_NAMESPACE_USER, mappings[i].attr, value,
-                           strlen(value));
-      /* FreeBSD's extattr_set_fd returns the length of the extended attribute
-       */
-      err = err < 0 ? err : 0;
+        {
+          ssize_t rc = extattr_set_fd(fd, EXTATTR_NAMESPACE_USER,
+                                      mappings[i].attr, value, strlen(value));
+          /* FreeBSD's extattr_set_fd returns the length of the extended
+             attribute */
+          err = (rc < 0 ? -1 : 0);
+        }
 #endif
+        if(freeptr)
+          curl_free(value);
+      }
     }
     i++;
   }
index 56bd9e4..0339b9b 100644 (file)
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
index 68a7854..8a9eb35 100644 (file)
@@ -156,8 +156,6 @@ auth_required   if this is set and a POST/PUT is made without auth, the
 idle            do nothing after receiving the request, just "sit idle"
 stream          continuously send data to the client, never-ending
 writedelay: [secs] delay this amount between reply packets
-pipe: [num]     tell the server to expect this many HTTP requests before
-                sending back anything, to allow pipelining tests
 skip: [num]     instructs the server to ignore reading this many bytes from a PUT
                 or POST request
 
@@ -188,7 +186,6 @@ ftp-ipv6
 ftps
 http
 http-ipv6
-http-pipe
 http-proxy
 http-unix
 https
@@ -220,7 +217,6 @@ SKIPPED.
 
 Features testable here are:
 
-axTLS
 crypto
 debug
 getrlimit
@@ -250,6 +246,7 @@ unittest
 unix-sockets
 WinSSL
 ld_preload
+alt-svc
 
 as well as each protocol that curl supports.  A protocol only needs to be
 specified if it is different from the server (useful when the server
@@ -354,7 +351,6 @@ Available substitute variables include:
 %HOST6IP      - IPv6 address of the host running this test
 %HOSTIP       - IPv4 address of the host running this test
 %HTTP6PORT    - IPv6 port number of the HTTP server
-%HTTPPIPEPORT - Port number of the HTTP pipelining server
 %HTTPUNIXPATH - Path to the Unix socket of the HTTP server
 %HTTPPORT     - Port number of the HTTP server
 %HTTPSPORT    - Port number of the HTTPS server
@@ -366,6 +362,8 @@ Available substitute variables include:
 %POP3PORT  - Port number of the POP3 server
 %PROXYPORT - Port number of the HTTP proxy
 %PWD       - Current directory
+%POSIX_PWD - Current directory somewhat mingw friendly
+%FILE_PWD  - Current directory, on windows prefixed with a slash
 %RTSP6PORT - IPv6 port number of the RTSP server
 %RTSPPORT  - Port number of the RTSP server
 %SMTP6PORT - IPv6 port number of the SMTP server
index 77a9147..b4cb901 100644 (file)
@@ -5,7 +5,7 @@
 #                            | (__| |_| |  _ <| |___
 #                             \___|\___/|_| \_\_____|
 #
-# Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 #
 # This software is licensed as described in the file COPYING, which
 # you should have received as part of this distribution. The terms
@@ -31,13 +31,14 @@ SMBDEPS = $(IMP)/__init__.py $(IMP)/nmb.py $(IMP)/nt_errors.py          \
  $(IMP)/smbserver.py $(IMP)/spnego.py $(IMP)/structure.py               \
  $(IMP)/uuid.py $(IMP)/version.py smbserver.py curl_test_data.py
 
-EXTRA_DIST = ftpserver.pl httpserver.pl secureserver.pl runtests.pl getpart.pm \
- FILEFORMAT README stunnel.pem memanalyze.pl testcurl.pl valgrind.pm ftp.pm   \
- sshserver.pl sshhelp.pm pathhelp.pm testcurl.1 runtests.1 \
- serverhelp.pm tftpserver.pl rtspserver.pl directories.pm symbol-scan.pl \
- CMakeLists.txt mem-include-scan.pl valgrind.supp http_pipe.py extern-scan.pl \
- manpage-scan.pl nroff-scan.pl http2-server.pl dictserver.py \
- negtelnetserver.py $(SMBDEPS)
+EXTRA_DIST = ftpserver.pl httpserver.pl secureserver.pl runtests.pl           \
+ getpart.pm FILEFORMAT README stunnel.pem memanalyze.pl testcurl.pl           \
+ valgrind.pm ftp.pm sshserver.pl sshhelp.pm pathhelp.pm testcurl.1 runtests.1 \
+ serverhelp.pm tftpserver.pl rtspserver.pl directories.pm symbol-scan.pl      \
+ CMakeLists.txt mem-include-scan.pl valgrind.supp extern-scan.pl              \
+ manpage-scan.pl nroff-scan.pl http2-server.pl dictserver.py                  \
+ negtelnetserver.py $(SMBDEPS) objnames-test08.sh objnames-test10.sh          \
+ objnames.inc disable-scan.pl manpage-syntax.pl error-codes.pl
 
 DISTCLEANFILES = configurehelp.pm
 
index b997cb4..19d1a50 100644 (file)
@@ -21,7 +21,7 @@
 #                            | (__| |_| |  _ <| |___
 #                             \___|\___/|_| \_\_____|
 #
-# Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 #
 # This software is licensed as described in the file COPYING, which
 # you should have received as part of this distribution. The terms
@@ -111,8 +111,7 @@ build_triplet = @build@
 host_triplet = @host@
 subdir = tests
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/ax_code_coverage.m4 \
-       $(top_srcdir)/m4/ax_compile_check_sizeof.m4 \
+am__aclocal_m4_deps = $(top_srcdir)/m4/ax_compile_check_sizeof.m4 \
        $(top_srcdir)/m4/curl-compilers.m4 \
        $(top_srcdir)/m4/curl-confopts.m4 \
        $(top_srcdir)/m4/curl-functions.m4 \
@@ -233,12 +232,6 @@ CC = @CC@
 CCDEPMODE = @CCDEPMODE@
 CFLAGS = @CFLAGS@
 CFLAG_CURL_SYMBOL_HIDING = @CFLAG_CURL_SYMBOL_HIDING@
-CODE_COVERAGE_CFLAGS = @CODE_COVERAGE_CFLAGS@
-CODE_COVERAGE_CPPFLAGS = @CODE_COVERAGE_CPPFLAGS@
-CODE_COVERAGE_CXXFLAGS = @CODE_COVERAGE_CXXFLAGS@
-CODE_COVERAGE_ENABLED = @CODE_COVERAGE_ENABLED@
-CODE_COVERAGE_LDFLAGS = @CODE_COVERAGE_LDFLAGS@
-CODE_COVERAGE_LIBS = @CODE_COVERAGE_LIBS@
 CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
@@ -280,14 +273,15 @@ ENABLE_SHARED = @ENABLE_SHARED@
 ENABLE_STATIC = @ENABLE_STATIC@
 EXEEXT = @EXEEXT@
 FGREP = @FGREP@
+FISH_FUNCTIONS_DIR = @FISH_FUNCTIONS_DIR@
 GCOV = @GCOV@
-GENHTML = @GENHTML@
 GREP = @GREP@
 HAVE_BROTLI = @HAVE_BROTLI@
 HAVE_GNUTLS_SRP = @HAVE_GNUTLS_SRP@
 HAVE_LDAP_SSL = @HAVE_LDAP_SSL@
 HAVE_LIBZ = @HAVE_LIBZ@
 HAVE_OPENSSL_SRP = @HAVE_OPENSSL_SRP@
+HAVE_PROTO_BSDSOCKET_H = @HAVE_PROTO_BSDSOCKET_H@
 IDN_ENABLED = @IDN_ENABLED@
 INSTALL = @INSTALL@
 INSTALL_DATA = @INSTALL_DATA@
@@ -348,9 +342,7 @@ STRIP = @STRIP@
 SUPPORT_FEATURES = @SUPPORT_FEATURES@
 SUPPORT_PROTOCOLS = @SUPPORT_PROTOCOLS@
 USE_ARES = @USE_ARES@
-USE_AXTLS = @USE_AXTLS@
-USE_CYASSL = @USE_CYASSL@
-USE_DARWINSSL = @USE_DARWINSSL@
+USE_BEARSSL = @USE_BEARSSL@
 USE_GNUTLS = @USE_GNUTLS@
 USE_GNUTLS_NETTLE = @USE_GNUTLS_NETTLE@
 USE_LIBRTMP = @USE_LIBRTMP@
@@ -359,12 +351,17 @@ USE_LIBSSH2 = @USE_LIBSSH2@
 USE_MBEDTLS = @USE_MBEDTLS@
 USE_MESALINK = @USE_MESALINK@
 USE_NGHTTP2 = @USE_NGHTTP2@
+USE_NGHTTP3 = @USE_NGHTTP3@
+USE_NGTCP2 = @USE_NGTCP2@
+USE_NGTCP2_CRYPTO_OPENSSL = @USE_NGTCP2_CRYPTO_OPENSSL@
 USE_NSS = @USE_NSS@
 USE_OPENLDAP = @USE_OPENLDAP@
-USE_POLARSSL = @USE_POLARSSL@
+USE_QUICHE = @USE_QUICHE@
 USE_SCHANNEL = @USE_SCHANNEL@
+USE_SECTRANSP = @USE_SECTRANSP@
 USE_UNIX_SOCKETS = @USE_UNIX_SOCKETS@
 USE_WINDOWS_SSPI = @USE_WINDOWS_SSPI@
+USE_WOLFSSL = @USE_WOLFSSL@
 VERSION = @VERSION@
 VERSIONNUM = @VERSIONNUM@
 ZLIB_LIBS = @ZLIB_LIBS@
@@ -435,13 +432,14 @@ SMBDEPS = $(IMP)/__init__.py $(IMP)/nmb.py $(IMP)/nt_errors.py          \
  $(IMP)/smbserver.py $(IMP)/spnego.py $(IMP)/structure.py               \
  $(IMP)/uuid.py $(IMP)/version.py smbserver.py curl_test_data.py
 
-EXTRA_DIST = ftpserver.pl httpserver.pl secureserver.pl runtests.pl getpart.pm \
- FILEFORMAT README stunnel.pem memanalyze.pl testcurl.pl valgrind.pm ftp.pm   \
- sshserver.pl sshhelp.pm pathhelp.pm testcurl.1 runtests.1 \
- serverhelp.pm tftpserver.pl rtspserver.pl directories.pm symbol-scan.pl \
- CMakeLists.txt mem-include-scan.pl valgrind.supp http_pipe.py extern-scan.pl \
- manpage-scan.pl nroff-scan.pl http2-server.pl dictserver.py \
- negtelnetserver.py $(SMBDEPS)
+EXTRA_DIST = ftpserver.pl httpserver.pl secureserver.pl runtests.pl           \
+ getpart.pm FILEFORMAT README stunnel.pem memanalyze.pl testcurl.pl           \
+ valgrind.pm ftp.pm sshserver.pl sshhelp.pm pathhelp.pm testcurl.1 runtests.1 \
+ serverhelp.pm tftpserver.pl rtspserver.pl directories.pm symbol-scan.pl      \
+ CMakeLists.txt mem-include-scan.pl valgrind.supp extern-scan.pl              \
+ manpage-scan.pl nroff-scan.pl http2-server.pl dictserver.py                  \
+ negtelnetserver.py $(SMBDEPS) objnames-test08.sh objnames-test10.sh          \
+ objnames.inc disable-scan.pl manpage-syntax.pl error-codes.pl
 
 DISTCLEANFILES = configurehelp.pm
 @BUILD_UNITTESTS_FALSE@BUILD_UNIT = 
index 16a8f06..bfd234a 100644 (file)
@@ -216,27 +216,12 @@ The curl Test Suite
 
  2.1 Test case numbering
 
-     1   -  99   HTTP
-     100 - 199   FTP
-     200 - 299   FILE
-     300 - 399   HTTPS
-     400 - 499   FTPS
-     500 - 599   libcurl source code tests, not using the curl command tool
-     600 - 699   SCP/SFTP
-     700 - 799   SOCKS4 (even numbers) and SOCK5 (odd numbers)
-     800 - 849   IMAP
-     850 - 899   POP3
-     900 - 999   SMTP
-     1000 - 1299 miscellaneous
-     1300 - 1399 unit tests
-     1400 - 1499 miscellaneous
-     1500 - 1599 libcurl source code tests, not using the curl command tool
-                 (same as 5xx)
-     1600 - 1699 unit tests
-     2000 - x    multiple sequential protocols per test case
-
-  There's nothing in the system that *requires* us to keep within these number
-  series.
+  Test cases used to be numbered by category, but the ranges filled
+  up. Subsets of tests can now be selected by passing keywords to the
+  runtests.pl script via the make TFLAGS variable.
+
+  New tests should now be added by finding a free number in
+  tests/data/Makefile.inc.
 
 3. Write tests
 
index 1d5f070..d055bd5 100644 (file)
@@ -89,8 +89,7 @@ build_triplet = @build@
 host_triplet = @host@
 subdir = tests/certs
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/ax_code_coverage.m4 \
-       $(top_srcdir)/m4/ax_compile_check_sizeof.m4 \
+am__aclocal_m4_deps = $(top_srcdir)/m4/ax_compile_check_sizeof.m4 \
        $(top_srcdir)/m4/curl-compilers.m4 \
        $(top_srcdir)/m4/curl-confopts.m4 \
        $(top_srcdir)/m4/curl-functions.m4 \
@@ -212,12 +211,6 @@ CC = @CC@
 CCDEPMODE = @CCDEPMODE@
 CFLAGS = @CFLAGS@
 CFLAG_CURL_SYMBOL_HIDING = @CFLAG_CURL_SYMBOL_HIDING@
-CODE_COVERAGE_CFLAGS = @CODE_COVERAGE_CFLAGS@
-CODE_COVERAGE_CPPFLAGS = @CODE_COVERAGE_CPPFLAGS@
-CODE_COVERAGE_CXXFLAGS = @CODE_COVERAGE_CXXFLAGS@
-CODE_COVERAGE_ENABLED = @CODE_COVERAGE_ENABLED@
-CODE_COVERAGE_LDFLAGS = @CODE_COVERAGE_LDFLAGS@
-CODE_COVERAGE_LIBS = @CODE_COVERAGE_LIBS@
 CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
@@ -259,14 +252,15 @@ ENABLE_SHARED = @ENABLE_SHARED@
 ENABLE_STATIC = @ENABLE_STATIC@
 EXEEXT = @EXEEXT@
 FGREP = @FGREP@
+FISH_FUNCTIONS_DIR = @FISH_FUNCTIONS_DIR@
 GCOV = @GCOV@
-GENHTML = @GENHTML@
 GREP = @GREP@
 HAVE_BROTLI = @HAVE_BROTLI@
 HAVE_GNUTLS_SRP = @HAVE_GNUTLS_SRP@
 HAVE_LDAP_SSL = @HAVE_LDAP_SSL@
 HAVE_LIBZ = @HAVE_LIBZ@
 HAVE_OPENSSL_SRP = @HAVE_OPENSSL_SRP@
+HAVE_PROTO_BSDSOCKET_H = @HAVE_PROTO_BSDSOCKET_H@
 IDN_ENABLED = @IDN_ENABLED@
 INSTALL = @INSTALL@
 INSTALL_DATA = @INSTALL_DATA@
@@ -327,9 +321,7 @@ STRIP = @STRIP@
 SUPPORT_FEATURES = @SUPPORT_FEATURES@
 SUPPORT_PROTOCOLS = @SUPPORT_PROTOCOLS@
 USE_ARES = @USE_ARES@
-USE_AXTLS = @USE_AXTLS@
-USE_CYASSL = @USE_CYASSL@
-USE_DARWINSSL = @USE_DARWINSSL@
+USE_BEARSSL = @USE_BEARSSL@
 USE_GNUTLS = @USE_GNUTLS@
 USE_GNUTLS_NETTLE = @USE_GNUTLS_NETTLE@
 USE_LIBRTMP = @USE_LIBRTMP@
@@ -338,12 +330,17 @@ USE_LIBSSH2 = @USE_LIBSSH2@
 USE_MBEDTLS = @USE_MBEDTLS@
 USE_MESALINK = @USE_MESALINK@
 USE_NGHTTP2 = @USE_NGHTTP2@
+USE_NGHTTP3 = @USE_NGHTTP3@
+USE_NGTCP2 = @USE_NGTCP2@
+USE_NGTCP2_CRYPTO_OPENSSL = @USE_NGTCP2_CRYPTO_OPENSSL@
 USE_NSS = @USE_NSS@
 USE_OPENLDAP = @USE_OPENLDAP@
-USE_POLARSSL = @USE_POLARSSL@
+USE_QUICHE = @USE_QUICHE@
 USE_SCHANNEL = @USE_SCHANNEL@
+USE_SECTRANSP = @USE_SECTRANSP@
 USE_UNIX_SOCKETS = @USE_UNIX_SOCKETS@
 USE_WINDOWS_SSPI = @USE_WINDOWS_SSPI@
+USE_WOLFSSL = @USE_WOLFSSL@
 VERSION = @VERSION@
 VERSIONNUM = @VERSIONNUM@
 ZLIB_LIBS = @ZLIB_LIBS@
index 0b43141..f876774 100644 (file)
@@ -1,12 +1,12 @@
 -----BEGIN X509 CRL-----
 MIIB3DCBxQIBATANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJOTjExMC8GA1UE
 CgwoRWRlbCBDdXJsIEFyY3RpYyBJbGx1ZGl1bSBSZXNlYXJjaCBDbG91ZDEmMCQG
-A1UEAwwdTm9ydGhlcm4gTm93aGVyZSBUcnVzdCBBbmNob3IXDTE4MDkwNTIzMjkw
-MVoXDTE4MTAwNTIzMjkwMVowGTAXAgYN+LitKqAXDTE4MDkwNTIzMjkwMVqgDjAM
-MAoGA1UdFAQDAgEBMA0GCSqGSIb3DQEBBQUAA4IBAQBc8MVCmUUhPb/yJ05wh1EA
-rBbLCjTYTDL9DW5YJIoBUKYWi5DGETS5BmgPU3ci6Pfa6eJ51oRurOCJHnL691Gp
-Y1d6R5CiM8mtHOPGCAgvvo0x+xJ/GzikxaggTDPA2CZWAFjBApMNdMvGTwurcnW9
-0jOl7zsfFoxSDlRqdFw7QW7Axju8vxRpMj6/pVBKmqgM+NUavcVPmRAYlsxCaeNH
-cdBviuw4qt3T6eLcb/RNIuCuXcp8a7ysqkGdSS/Pp/drOGZAmugbj1kmjS8b0n1M
-9L8wxG0k/TsgKSlWy+wbCJcUiYHgwzTd9i/XEdwxGvOnKFeiCvqShhkEG7QjfHs2
+A1UEAwwdTm9ydGhlcm4gTm93aGVyZSBUcnVzdCBBbmNob3IXDTE5MTEwMjEyNTMy
+N1oXDTE5MTIwMjEyNTMyN1owGTAXAgYOTbnGJLAXDTE5MTEwMjEyNTMyNlqgDjAM
+MAoGA1UdFAQDAgEBMA0GCSqGSIb3DQEBBQUAA4IBAQClxELmQvUD2S0UcNFbjMe/
+vv80HtpnwhTK356DUggVBh+EjvIXT4EakBbxxgDZMkaxJYH70RQ0UPLtB41pfmg3
+BS6Gl/0Vn+cAk8w/+dG4DHibdeqSPjIHCaAlkKqHV89Lp7IS6qrD0Bn/L7De6O7c
+4xLvRiDvx/cO5uAkX8vOtzKsOU/0U06QSSGK09dRL2mHbaH4FQj2PFMgcDd1GxAQ
+saii0bWZ6qLiYkQRtJGAplD+uqOaSSsioqVFy/NjaIip0axNtCG9sBhvp6lTpeiR
+Phl04I+WyKoP5f/NTU+fKbWarWka4evPSpRM2o9QYrYb/vj0TMK8lJ3JqgwlLrJ+
 -----END X509 CRL-----
index b3116b6..578fff7 100644 (file)
@@ -1,41 +1,42 @@
 Certificate:
     Data:
         Version: 3 (0x2)
-        Serial Number: 15361901406880 (0xdf8b8ad2aa0)
-    Signature Algorithm: sha1WithRSAEncryption
+        Serial Number:
+            0e:4d:b9:c6:24:b0
+        Signature Algorithm: sha256WithRSAEncryption
         Issuer:
             countryName               = NN
             organizationName          = Edel Curl Arctic Illudium Research Cloud
             commonName                = Northern Nowhere Trust Anchor
         Validity
-            Not Before: Sep  5 23:29:01 2018 GMT
-            Not After : Nov 22 23:29:01 2026 GMT
+            Not Before: Nov  2 12:53:25 2019 GMT
+            Not After : Jan 19 12:53:25 2028 GMT
         Subject:
             countryName               = NN
             organizationName          = Edel Curl Arctic Illudium Research Cloud
             commonName                = localhost.nn
         Subject Public Key Info:
             Public Key Algorithm: rsaEncryption
-                Public-Key: (2048 bit)
+                RSA Public-Key: (2048 bit)
                 Modulus:
-                    00:df:16:15:5f:2a:a4:50:cf:3a:a8:79:6e:22:8d:
-                    95:16:b7:4d:7d:d2:1f:4f:6d:2d:7a:7d:dc:8a:4f:
-                    53:7b:5f:c9:de:5c:88:6c:a2:74:26:35:1c:78:68:
-                    c1:60:25:a7:7b:b6:1a:9a:aa:33:d0:9f:5e:f2:2e:
-                    21:04:8c:0d:9a:28:f5:61:40:3c:34:1a:9b:8a:70:
-                    81:6d:83:9e:7c:d0:4c:d9:79:dc:37:d9:24:6e:73:
-                    c7:61:31:71:e9:f5:97:b7:65:ad:3d:f6:af:20:6f:
-                    56:b9:b5:42:b5:3d:96:61:31:eb:0d:4c:e9:f5:31:
-                    d3:25:af:40:b3:bb:81:04:7f:1a:ce:21:18:83:52:
-                    2d:51:31:ae:82:f9:cb:10:d3:d5:06:af:f8:71:e8:
-                    a3:c6:9f:7b:48:da:e2:28:af:1c:ff:41:6d:32:81:
-                    45:59:d7:64:e4:b1:d7:c9:86:6a:0b:65:71:66:d6:
-                    42:a8:67:fd:83:49:20:75:16:1e:bb:1b:85:5c:7e:
-                    e2:8f:5f:1c:81:d3:8a:95:d6:92:5c:9e:7f:a2:10:
-                    08:e1:df:ae:69:68:3f:8d:dd:79:4f:da:3f:79:b5:
-                    02:97:57:30:67:4d:3d:76:35:b5:4f:d1:5d:35:dd:
-                    d4:b5:6b:57:b2:e0:23:35:ad:1a:bf:6f:77:e6:bc:
-                    58:ed
+                    00:bd:97:0e:a7:6d:b6:73:8c:d0:21:6b:f3:36:74:
+                    5d:0a:aa:3a:f0:fa:6e:b1:5c:1c:13:74:ca:67:2b:
+                    22:03:d1:a6:3c:25:ef:87:4f:e8:38:9f:21:1d:2e:
+                    88:12:36:66:82:03:02:4c:f8:17:35:02:95:31:b1:
+                    53:40:21:24:2f:00:f0:bf:80:58:16:b1:92:b3:d3:
+                    78:bf:78:cb:0a:91:0c:d2:6d:5d:b2:1f:41:73:16:
+                    02:7c:1a:cd:16:25:c9:e1:1b:81:bd:84:93:4c:63:
+                    ce:38:f4:3e:ad:98:6b:00:89:a8:ba:f5:7e:08:83:
+                    f3:9a:f5:98:b8:9f:d6:d8:c7:d4:f3:07:1c:8f:ef:
+                    bc:29:10:60:8c:85:8b:4c:7a:73:c7:9f:a8:23:2f:
+                    c4:47:f5:18:85:98:fb:27:de:58:93:4b:08:a5:66:
+                    c9:df:db:f0:22:f8:64:9f:a1:56:89:97:ab:02:2c:
+                    5a:99:f2:6f:bf:72:31:90:22:32:ae:86:25:6b:13:
+                    c6:72:ec:df:2e:c8:12:00:c1:e3:38:b4:a0:40:ba:
+                    01:61:c2:d7:b1:ef:7d:4b:29:18:e2:fe:28:d0:98:
+                    e4:65:3f:4c:34:39:e4:82:a9:ca:b2:3d:c4:91:8f:
+                    a0:94:bf:e3:f8:b3:73:48:b7:fe:fa:04:43:e7:b5:
+                    bc:bd
                 Exponent: 65537 (0x10001)
         X509v3 extensions:
             X509v3 Subject Alternative Name: 
@@ -45,48 +46,48 @@ Certificate:
             X509v3 Extended Key Usage: 
                 TLS Web Server Authentication
             X509v3 Subject Key Identifier: 
-                7C:9A:EA:9B:92:98:FB:77:25:89:8B:EF:D3:F4:88:34:AF:EA:24:CC
+                4E:54:63:95:A1:58:0C:FA:BD:3E:58:26:AF:AF:A4:F3:66:1A:CB:25
             X509v3 Authority Key Identifier: 
                 keyid:12:CA:BA:4B:46:04:A7:75:8A:2C:E8:0E:54:94:BC:12:65:A6:7B:CE
 
             X509v3 Basic Constraints: 
                 CA:FALSE
-    Signature Algorithm: sha1WithRSAEncryption
-         0f:97:60:47:2f:22:9f:d4:16:99:5a:ed:f4:b5:54:31:bf:9f:
-         a1:bd:2d:8b:eb:c1:24:db:73:30:c7:46:d6:4c:c8:c6:38:0c:
-         9a:e6:d6:5e:e8:a7:fb:9f:b6:44:66:73:43:86:46:10:c0:4c:
-         40:4e:c1:d7:e4:41:0b:f0:61:f0:6f:45:8c:5a:14:40:42:97:
-         c3:03:d0:ff:6d:4a:06:80:65:49:d4:2f:07:9d:86:59:6b:5b:
-         9e:bc:0c:46:8a:62:da:c0:22:af:13:6c:0d:9d:54:5e:46:53:
-         a5:aa:f2:80:44:c7:07:6e:f7:b0:4c:37:5c:31:08:a0:37:df:
-         8a:35:92:3c:8c:91:2f:64:4f:d3:a0:eb:95:b3:4a:9e:f7:ac:
-         25:ad:06:13:5c:dd:bd:d5:6b:74:8d:c7:c5:a6:b4:89:27:fd:
-         b7:c2:24:a7:6a:b3:64:e6:e6:31:91:35:fc:0e:15:14:38:d6:
-         39:b0:c4:b2:c1:c8:c7:ed:25:d7:b0:a9:b9:a0:70:33:42:90:
-         86:33:2a:d8:d5:8a:02:e6:ab:8d:92:d6:ae:b4:1d:e9:6c:22:
-         a5:2f:1a:48:48:2b:5c:b8:30:01:4b:27:1a:d3:cf:21:77:ab:
-         9f:bc:55:34:2e:9f:03:2b:17:0b:c3:44:8e:a8:94:ae:92:a2:
-         9a:33:c0:8e
+    Signature Algorithm: sha256WithRSAEncryption
+         2c:f9:48:33:7c:93:ca:3c:9c:58:92:8c:2b:87:61:9f:0d:9c:
+         9d:e8:43:43:12:d6:a3:40:71:ec:cb:31:76:80:68:b1:54:d1:
+         86:f4:b3:9e:c8:50:62:b4:87:12:be:9b:d6:3c:2b:cf:22:0e:
+         66:26:c2:31:dd:1f:c6:97:1e:61:a4:51:ea:68:75:81:66:b9:
+         3b:a6:1f:f6:80:ec:6b:aa:65:66:0c:02:ab:c9:57:bd:6a:4e:
+         6d:24:30:13:7b:65:17:60:9a:14:37:57:f7:22:66:55:7d:1a:
+         1a:5b:27:43:3b:d4:88:bc:2f:d3:d7:bb:d5:3f:9b:25:26:5d:
+         39:a0:4c:8a:84:2c:db:04:87:8a:df:49:7d:4b:d2:85:7a:09:
+         5e:df:6b:1b:b5:6e:9c:bb:2b:f6:c5:01:19:5a:87:d0:cf:16:
+         67:8b:54:41:87:c1:33:c3:21:f6:e5:84:d2:84:5d:da:82:cd:
+         39:4d:50:97:f3:83:37:9e:e5:04:0e:dc:c6:20:d1:b3:f6:c7:
+         3d:dd:95:be:8c:b9:72:72:7a:71:66:aa:4a:8e:cf:37:38:e8:
+         c8:06:69:68:8d:d8:d6:8b:4c:23:50:27:fa:e9:bb:2a:a6:89:
+         56:ad:be:4d:bd:be:0c:d7:55:b4:f4:b9:f7:6a:b5:2c:7f:5f:
+         9f:df:f6:61
 -----BEGIN CERTIFICATE-----
-MIID3jCCAsagAwIBAgIGDfi4rSqgMA0GCSqGSIb3DQEBBQUAMGgxCzAJBgNVBAYT
+MIID3jCCAsagAwIBAgIGDk25xiSwMA0GCSqGSIb3DQEBCwUAMGgxCzAJBgNVBAYT
 Ak5OMTEwLwYDVQQKDChFZGVsIEN1cmwgQXJjdGljIElsbHVkaXVtIFJlc2VhcmNo
 IENsb3VkMSYwJAYDVQQDDB1Ob3J0aGVybiBOb3doZXJlIFRydXN0IEFuY2hvcjAe
-Fw0xODA5MDUyMzI5MDFaFw0yNjExMjIyMzI5MDFaMFcxCzAJBgNVBAYTAk5OMTEw
+Fw0xOTExMDIxMjUzMjVaFw0yODAxMTkxMjUzMjVaMFcxCzAJBgNVBAYTAk5OMTEw
 LwYDVQQKDChFZGVsIEN1cmwgQXJjdGljIElsbHVkaXVtIFJlc2VhcmNoIENsb3Vk
 MRUwEwYDVQQDDAxsb2NhbGhvc3Qubm4wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
-ggEKAoIBAQDfFhVfKqRQzzqoeW4ijZUWt0190h9PbS16fdyKT1N7X8neXIhsonQm
-NRx4aMFgJad7thqaqjPQn17yLiEEjA2aKPVhQDw0GpuKcIFtg5580EzZedw32SRu
-c8dhMXHp9Ze3Za099q8gb1a5tUK1PZZhMesNTOn1MdMlr0Czu4EEfxrOIRiDUi1R
-Ma6C+csQ09UGr/hx6KPGn3tI2uIorxz/QW0ygUVZ12TksdfJhmoLZXFm1kKoZ/2D
-SSB1Fh67G4VcfuKPXxyB04qV1pJcnn+iEAjh365paD+N3XlP2j95tQKXVzBnTT12
-NbVP0V013dS1a1ey4CM1rRq/b3fmvFjtAgMBAAGjgZ4wgZswLAYDVR0RBCUwI4IK
+ggEKAoIBAQC9lw6nbbZzjNAha/M2dF0Kqjrw+m6xXBwTdMpnKyID0aY8Je+HT+g4
+nyEdLogSNmaCAwJM+Bc1ApUxsVNAISQvAPC/gFgWsZKz03i/eMsKkQzSbV2yH0Fz
+FgJ8Gs0WJcnhG4G9hJNMY8449D6tmGsAiai69X4Ig/Oa9Zi4n9bYx9TzBxyP77wp
+EGCMhYtMenPHn6gjL8RH9RiFmPsn3liTSwilZsnf2/Ai+GSfoVaJl6sCLFqZ8m+/
+cjGQIjKuhiVrE8Zy7N8uyBIAweM4tKBAugFhwtex731LKRji/ijQmORlP0w0OeSC
+qcqyPcSRj6CUv+P4s3NIt/76BEPntby9AgMBAAGjgZ4wgZswLAYDVR0RBCUwI4IK
 bG9jYWxob3N0MYIKbG9jYWxob3N0MoIJbG9jYWxob3N0MAsGA1UdDwQEAwIDqDAT
-BgNVHSUEDDAKBggrBgEFBQcDATAdBgNVHQ4EFgQUfJrqm5KY+3cliYvv0/SINK/q
-JMwwHwYDVR0jBBgwFoAUEsq6S0YEp3WKLOgOVJS8EmWme84wCQYDVR0TBAIwADAN
-BgkqhkiG9w0BAQUFAAOCAQEAD5dgRy8in9QWmVrt9LVUMb+fob0ti+vBJNtzMMdG
-1kzIxjgMmubWXuin+5+2RGZzQ4ZGEMBMQE7B1+RBC/Bh8G9FjFoUQEKXwwPQ/21K
-BoBlSdQvB52GWWtbnrwMRopi2sAirxNsDZ1UXkZTparygETHB273sEw3XDEIoDff
-ijWSPIyRL2RP06DrlbNKnvesJa0GE1zdvdVrdI3Hxaa0iSf9t8Ikp2qzZObmMZE1
-/A4VFDjWObDEssHIx+0l17CpuaBwM0KQhjMq2NWKAuarjZLWrrQd6WwipS8aSEgr
-XLgwAUsnGtPPIXern7xVNC6fAysXC8NEjqiUrpKimjPAjg==
+BgNVHSUEDDAKBggrBgEFBQcDATAdBgNVHQ4EFgQUTlRjlaFYDPq9Plgmr6+k82Ya
+yyUwHwYDVR0jBBgwFoAUEsq6S0YEp3WKLOgOVJS8EmWme84wCQYDVR0TBAIwADAN
+BgkqhkiG9w0BAQsFAAOCAQEALPlIM3yTyjycWJKMK4dhnw2cnehDQxLWo0Bx7Msx
+doBosVTRhvSznshQYrSHEr6b1jwrzyIOZibCMd0fxpceYaRR6mh1gWa5O6Yf9oDs
+a6plZgwCq8lXvWpObSQwE3tlF2CaFDdX9yJmVX0aGlsnQzvUiLwv09e71T+bJSZd
+OaBMioQs2wSHit9JfUvShXoJXt9rG7VunLsr9sUBGVqH0M8WZ4tUQYfBM8Mh9uWE
+0oRd2oLNOU1Ql/ODN57lBA7cxiDRs/bHPd2Vvoy5cnJ6cWaqSo7PNzjoyAZpaI3Y
+1otMI1An+um7KqaJVq2+Tb2+DNdVtPS592q1LH9fn9/2YQ==
 -----END CERTIFICATE-----
index 78077bc..a113db6 100644 (file)
@@ -1,16 +1,16 @@
 -----BEGIN CERTIFICATE REQUEST-----
 MIICnDCCAYQCAQAwVzELMAkGA1UEBhMCTk4xMTAvBgNVBAoMKEVkZWwgQ3VybCBB
 cmN0aWMgSWxsdWRpdW0gUmVzZWFyY2ggQ2xvdWQxFTATBgNVBAMMDGxvY2FsaG9z
-dC5ubjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAN8WFV8qpFDPOqh5
-biKNlRa3TX3SH09tLXp93IpPU3tfyd5ciGyidCY1HHhowWAlp3u2GpqqM9CfXvIu
-IQSMDZoo9WFAPDQam4pwgW2DnnzQTNl53DfZJG5zx2Excen1l7dlrT32ryBvVrm1
-QrU9lmEx6w1M6fUx0yWvQLO7gQR/Gs4hGINSLVExroL5yxDT1Qav+HHoo8afe0ja
-4iivHP9BbTKBRVnXZOSx18mGagtlcWbWQqhn/YNJIHUWHrsbhVx+4o9fHIHTipXW
-klyef6IQCOHfrmloP43deU/aP3m1ApdXMGdNPXY1tU/RXTXd1LVrV7LgIzWtGr9v
-d+a8WO0CAwEAAaAAMA0GCSqGSIb3DQEBCwUAA4IBAQCNGbWvnceLjA+R8+p1skgq
-0JxCZIUP/E8iOpg0eX2CjtU+9raYMNa7URtWa1kTSfxbuowPn21CSQmQ+1MDZv0Z
-UTAADKwXO6dDvXkYY4LwpRIozsz1zx1ulUaYmg4D2FPBIxg9QNLB0ic9+gUYdUEX
-Uw7vzxY8ExO99Z6rhJcNZPPYmj97MS/ZmBTZ8jxqjuOQ1R9mIhBvdsYdoDQR8SMK
-1b/0qH0F5Ly2iWt+pi+muoz+tYUyiXrIzYGF4+gImYBJEy35Pni/H8mMY62TxbWi
-QfhD9S8hxfT733X+UQQlQPToNDYdrmm/WcABOXrm8ESXfKvzs8aCodfCpDYIyxbu
+dC5ubjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL2XDqdttnOM0CFr
+8zZ0XQqqOvD6brFcHBN0ymcrIgPRpjwl74dP6DifIR0uiBI2ZoIDAkz4FzUClTGx
+U0AhJC8A8L+AWBaxkrPTeL94ywqRDNJtXbIfQXMWAnwazRYlyeEbgb2Ek0xjzjj0
+Pq2YawCJqLr1fgiD85r1mLif1tjH1PMHHI/vvCkQYIyFi0x6c8efqCMvxEf1GIWY
++yfeWJNLCKVmyd/b8CL4ZJ+hVomXqwIsWpnyb79yMZAiMq6GJWsTxnLs3y7IEgDB
+4zi0oEC6AWHC17HvfUspGOL+KNCY5GU/TDQ55IKpyrI9xJGPoJS/4/izc0i3/voE
+Q+e1vL0CAwEAAaAAMA0GCSqGSIb3DQEBCwUAA4IBAQCpqiSx7VjqeQ2g8lpHF0Nb
+/10H1DqaK7Z3y49xFK3xxKWdxKUdq3Nf7JYlhKpWDYokrkw5W+nhGQILYt6ZD8tN
+tBZphyp3rvmTcewEFtbBne5N7OsAaanlBxeCLhnCICGhd+QCqYJKWe+zw8Oc5dCp
+SRmWEL5FTu9AavBc0LDx1gNBupDiXGhF+BptOzgfDbijd0aRgy9cYwAQ9kXo4H+y
+TH1ZYcSfB0gs7sShiY5FvuGr54Vv0czn+HqrdyWKDGLp7ilPYCT4WXBWfTon9j1H
+9NDomhrVme9IGKItYHg+p59WpevklW900X4NZCVspePgNeBOvXYbGqDEN01o1xIG
 -----END CERTIFICATE REQUEST-----
index 220e792..c72bcb9 100644 (file)
Binary files a/tests/certs/Server-localhost-lastSAN-sv.der and b/tests/certs/Server-localhost-lastSAN-sv.der differ
index 618e839..dae4828 100644 (file)
@@ -1,27 +1,27 @@
 -----BEGIN RSA PRIVATE KEY-----
-MIIEogIBAAKCAQEA3xYVXyqkUM86qHluIo2VFrdNfdIfT20ten3cik9Te1/J3lyI
-bKJ0JjUceGjBYCWne7Yamqoz0J9e8i4hBIwNmij1YUA8NBqbinCBbYOefNBM2Xnc
-N9kkbnPHYTFx6fWXt2WtPfavIG9WubVCtT2WYTHrDUzp9THTJa9As7uBBH8aziEY
-g1ItUTGugvnLENPVBq/4ceijxp97SNriKK8c/0FtMoFFWddk5LHXyYZqC2VxZtZC
-qGf9g0kgdRYeuxuFXH7ij18cgdOKldaSXJ5/ohAI4d+uaWg/jd15T9o/ebUCl1cw
-Z009djW1T9FdNd3UtWtXsuAjNa0av2935rxY7QIDAQABAoIBAFz/H7mkVQs62AET
-Xc4Zp2To1Oz2gwbhRGwju6QMnYh4zfZcLKLctf6XdV7cjIBAMiloKH8BJMh7J2Fd
-yXXTzHfPSztXQ8GUtfJoJAw7Kf5t9xtRqXO+mWlR6nOh4RLexng1cpq6Exc6UrTn
-0v8qxV2PKaVJwt3r/1FeVWKXb5kne/Ob4LS7c0xnVqc7TGPtxLdS5mU5jrt0ZdZl
-tcHulLX24rmxKcNvge6r2EiYuet3vUi1uuLBQbWUJIFRwetDufG/2e2ihOuvCj5s
-aYNlRAo0JUwWl7geicRUdxkCpV/Qld7aYldKIcsSzgl6GLpgNpHjUFBbJBGSng0S
-vA4CMQECgYEA9tseJG2IuudqDHnpuUxtnlfDJTfYjtBQnYG1ojbd9FUiuihv/B2K
-pJ5uuowpKSnXOwaHtzyQ6XJA7JChRcDmJ4rf6R/1B61+1XVasyi2WffTJHbKzUk+
-hBAUoGtJIvrChMOnAlQzifP8+b7ec/ghKy87dNlQzQlSunyEW6lAW/UCgYEA51mQ
-JOFsasSvioKilsJuFCcFInZCRTEMz7vK9HW2Qnv71b3xeB6aNoJA8zf1Gw9q5clN
-Yu+8pkGNsWeone8izTzzpgZGJmM/vLjSdIgaJytStha2FwlQxUjggOjSy1zIdW+v
-ROw6OaT2J5+Qw2ruWqSaw2fiDgOpBCJgfg95JhkCgYAy5SppyEuQfXXX7KrLkX5o
-Tx/k5Ia5qylzz/Jq53ULkyH9z6iHCnAzUJbzz0INQpsliEsi9FHMT8oi/A7EGulY
-7cEMh5I1awfjarawiYxPMFFQC0301U0WXVpjWLtTgu/n/47HZCTcJHnb5AZpUpdE
-GBDiHowSOgHcgR+o5lRmoQKBgFaPi0BRW+hi6S9RC5aO7vL5WpF3X/pVjO6Y3Co1
-dNlRXHuv0w5XnOmyOK0IDdxvG1cYx6yx+IrYUjTDjTJyjDnwiVVgWZT5Y5qwKIZT
-ej2Xlx3sR3s9EAyQ5Pc2pdBTSemuvQxzuqFg2H0g1eBYPRCLMCDW2JzXv8B9QE9K
-aNDZAoGAKbVakgVlwrGffJb5c6ZFF9W/WoJYXJRA2/tMqvOcaZwSNq0ySHI/uUyM
-3aexymibv5cGsFhtcr8vqxlX0PZ+PF2SRe/L58PmByEXGmyv6UZ/fhOCh8ttmPzt
-GIh5PiKOd7RR7ydFY22M2+uW99wMf5jSH6uX1DRATFLxJygbnHA=
+MIIEowIBAAKCAQEAvZcOp222c4zQIWvzNnRdCqo68PpusVwcE3TKZysiA9GmPCXv
+h0/oOJ8hHS6IEjZmggMCTPgXNQKVMbFTQCEkLwDwv4BYFrGSs9N4v3jLCpEM0m1d
+sh9BcxYCfBrNFiXJ4RuBvYSTTGPOOPQ+rZhrAImouvV+CIPzmvWYuJ/W2MfU8wcc
+j++8KRBgjIWLTHpzx5+oIy/ER/UYhZj7J95Yk0sIpWbJ39vwIvhkn6FWiZerAixa
+mfJvv3IxkCIyroYlaxPGcuzfLsgSAMHjOLSgQLoBYcLXse99SykY4v4o0JjkZT9M
+NDnkgqnKsj3EkY+glL/j+LNzSLf++gRD57W8vQIDAQABAoIBAQCC0wTKpdtbmtRX
+66y1a9B0NolblgPiISRCjLnKPSpIpldmc+r4XTxqLexkvaIppx5PIpJo2FzzOGgJ
+FUrUGspkIOr/yil+52PK8OcGgOziyrqlTdB0xDqelpZ6WuggG01WJ2v8gco+0TQR
+ewDxOxbDFTq4YARrDdqAmG6dH7baeMDvh6IVe/dkJOVlyh0MA2QP+VR6fDv73jUe
+3yW6G+hql9mjZK6Cgz2lWoeW7YXAvWtTXT68/bcZLO64oLyCjBmsbSrBRQN5m9M9
+dWJV5B0h02P+uMF5H+EAD3qN5I670iSY3d+FWBpd3cA2arRGWlUXNmCGG3CjLYUS
+wGw1lbFhAoGBAPG6JhdXAaH3DN9khp54plbFSIanvjWK8RAEaQgkurwDUL3o1LmC
+ObqiCmMTU25HRlwWkwlCxejHfzOEqFdwiX5QuNmYBE6TYHtmnWSJ5ebMG7SOtlIS
+9Z4dLNZz8j95OGKb3XI9qR0ItxsmuLgWvrJUayd0UXcU7BTzHCXGx99JAoGBAMjI
+0z5+DeTwBhDY1mIUY081FmhrT9PhFHGtRy2OIENW0ZhJ5yE+ygVQssnR+Lr/yl1p
+zGC+CM//5wmJ774Xx0reMsh/rgK4Z0Wq47JJFGo0RMfYVmlod0OndtdobDc7ds7t
+Q3wIGt2ZXW6BtzMo8KVUuuHL8QwZoZqJNe/7QE3VAoGAGGrRRjJHu/CUoEwrPP66
+7rDm7pMrJ4VtbEzFv0jWg/9hvI00T7jT1AJiQjfFibIxbUPqflj8XNMqCi4wQwTf
+Hp9QzMoKRVWlvVFUPL+hNXsQoWB5EjlQDjSsPs1ffwHjrDJKYCvSVVh4BooWxqGl
+iaX1XPrm77xxTHxyL26w6eECgYA176S3g9stpcCrY+RrInju/R7Q3Arsquj4BIk7
+VpOaI0dYdnnNN3XDacMtbec4LKBq6ZHKZyIs5dxldpVdZjvWA8x2ib3v4yNy1o4m
+BXWjdfkICjhkRnjLRsAo61cumx22Row7VF4LKzirB9NzvcqvTwyIvWU6T+RWhAdm
+OQM0JQKBgC+gmBGfnQShTRYlfpb4RVnDijPpC34AdEO7wdeMcdQK9KfWsLZT5y0w
+qoZhW9IPlu1dNRhwHqGHWu2CmQVwFpy5/ccpukCJfyZw7edbb9dIqzKlUWw8Jmmg
+C7WKz4z3mKkZrwptFxDu0dpQ644yOP/gnRaLLyP0zn/brmnYz09X
 -----END RSA PRIVATE KEY-----
index c1684fd..42e4a11 100644 (file)
@@ -24,70 +24,71 @@ commonName_value              = localhost.nn
 # the certificate
 # some dhparam
 -----BEGIN RSA PRIVATE KEY-----
-MIIEogIBAAKCAQEA3xYVXyqkUM86qHluIo2VFrdNfdIfT20ten3cik9Te1/J3lyI
-bKJ0JjUceGjBYCWne7Yamqoz0J9e8i4hBIwNmij1YUA8NBqbinCBbYOefNBM2Xnc
-N9kkbnPHYTFx6fWXt2WtPfavIG9WubVCtT2WYTHrDUzp9THTJa9As7uBBH8aziEY
-g1ItUTGugvnLENPVBq/4ceijxp97SNriKK8c/0FtMoFFWddk5LHXyYZqC2VxZtZC
-qGf9g0kgdRYeuxuFXH7ij18cgdOKldaSXJ5/ohAI4d+uaWg/jd15T9o/ebUCl1cw
-Z009djW1T9FdNd3UtWtXsuAjNa0av2935rxY7QIDAQABAoIBAFz/H7mkVQs62AET
-Xc4Zp2To1Oz2gwbhRGwju6QMnYh4zfZcLKLctf6XdV7cjIBAMiloKH8BJMh7J2Fd
-yXXTzHfPSztXQ8GUtfJoJAw7Kf5t9xtRqXO+mWlR6nOh4RLexng1cpq6Exc6UrTn
-0v8qxV2PKaVJwt3r/1FeVWKXb5kne/Ob4LS7c0xnVqc7TGPtxLdS5mU5jrt0ZdZl
-tcHulLX24rmxKcNvge6r2EiYuet3vUi1uuLBQbWUJIFRwetDufG/2e2ihOuvCj5s
-aYNlRAo0JUwWl7geicRUdxkCpV/Qld7aYldKIcsSzgl6GLpgNpHjUFBbJBGSng0S
-vA4CMQECgYEA9tseJG2IuudqDHnpuUxtnlfDJTfYjtBQnYG1ojbd9FUiuihv/B2K
-pJ5uuowpKSnXOwaHtzyQ6XJA7JChRcDmJ4rf6R/1B61+1XVasyi2WffTJHbKzUk+
-hBAUoGtJIvrChMOnAlQzifP8+b7ec/ghKy87dNlQzQlSunyEW6lAW/UCgYEA51mQ
-JOFsasSvioKilsJuFCcFInZCRTEMz7vK9HW2Qnv71b3xeB6aNoJA8zf1Gw9q5clN
-Yu+8pkGNsWeone8izTzzpgZGJmM/vLjSdIgaJytStha2FwlQxUjggOjSy1zIdW+v
-ROw6OaT2J5+Qw2ruWqSaw2fiDgOpBCJgfg95JhkCgYAy5SppyEuQfXXX7KrLkX5o
-Tx/k5Ia5qylzz/Jq53ULkyH9z6iHCnAzUJbzz0INQpsliEsi9FHMT8oi/A7EGulY
-7cEMh5I1awfjarawiYxPMFFQC0301U0WXVpjWLtTgu/n/47HZCTcJHnb5AZpUpdE
-GBDiHowSOgHcgR+o5lRmoQKBgFaPi0BRW+hi6S9RC5aO7vL5WpF3X/pVjO6Y3Co1
-dNlRXHuv0w5XnOmyOK0IDdxvG1cYx6yx+IrYUjTDjTJyjDnwiVVgWZT5Y5qwKIZT
-ej2Xlx3sR3s9EAyQ5Pc2pdBTSemuvQxzuqFg2H0g1eBYPRCLMCDW2JzXv8B9QE9K
-aNDZAoGAKbVakgVlwrGffJb5c6ZFF9W/WoJYXJRA2/tMqvOcaZwSNq0ySHI/uUyM
-3aexymibv5cGsFhtcr8vqxlX0PZ+PF2SRe/L58PmByEXGmyv6UZ/fhOCh8ttmPzt
-GIh5PiKOd7RR7ydFY22M2+uW99wMf5jSH6uX1DRATFLxJygbnHA=
+MIIEowIBAAKCAQEAvZcOp222c4zQIWvzNnRdCqo68PpusVwcE3TKZysiA9GmPCXv
+h0/oOJ8hHS6IEjZmggMCTPgXNQKVMbFTQCEkLwDwv4BYFrGSs9N4v3jLCpEM0m1d
+sh9BcxYCfBrNFiXJ4RuBvYSTTGPOOPQ+rZhrAImouvV+CIPzmvWYuJ/W2MfU8wcc
+j++8KRBgjIWLTHpzx5+oIy/ER/UYhZj7J95Yk0sIpWbJ39vwIvhkn6FWiZerAixa
+mfJvv3IxkCIyroYlaxPGcuzfLsgSAMHjOLSgQLoBYcLXse99SykY4v4o0JjkZT9M
+NDnkgqnKsj3EkY+glL/j+LNzSLf++gRD57W8vQIDAQABAoIBAQCC0wTKpdtbmtRX
+66y1a9B0NolblgPiISRCjLnKPSpIpldmc+r4XTxqLexkvaIppx5PIpJo2FzzOGgJ
+FUrUGspkIOr/yil+52PK8OcGgOziyrqlTdB0xDqelpZ6WuggG01WJ2v8gco+0TQR
+ewDxOxbDFTq4YARrDdqAmG6dH7baeMDvh6IVe/dkJOVlyh0MA2QP+VR6fDv73jUe
+3yW6G+hql9mjZK6Cgz2lWoeW7YXAvWtTXT68/bcZLO64oLyCjBmsbSrBRQN5m9M9
+dWJV5B0h02P+uMF5H+EAD3qN5I670iSY3d+FWBpd3cA2arRGWlUXNmCGG3CjLYUS
+wGw1lbFhAoGBAPG6JhdXAaH3DN9khp54plbFSIanvjWK8RAEaQgkurwDUL3o1LmC
+ObqiCmMTU25HRlwWkwlCxejHfzOEqFdwiX5QuNmYBE6TYHtmnWSJ5ebMG7SOtlIS
+9Z4dLNZz8j95OGKb3XI9qR0ItxsmuLgWvrJUayd0UXcU7BTzHCXGx99JAoGBAMjI
+0z5+DeTwBhDY1mIUY081FmhrT9PhFHGtRy2OIENW0ZhJ5yE+ygVQssnR+Lr/yl1p
+zGC+CM//5wmJ774Xx0reMsh/rgK4Z0Wq47JJFGo0RMfYVmlod0OndtdobDc7ds7t
+Q3wIGt2ZXW6BtzMo8KVUuuHL8QwZoZqJNe/7QE3VAoGAGGrRRjJHu/CUoEwrPP66
+7rDm7pMrJ4VtbEzFv0jWg/9hvI00T7jT1AJiQjfFibIxbUPqflj8XNMqCi4wQwTf
+Hp9QzMoKRVWlvVFUPL+hNXsQoWB5EjlQDjSsPs1ffwHjrDJKYCvSVVh4BooWxqGl
+iaX1XPrm77xxTHxyL26w6eECgYA176S3g9stpcCrY+RrInju/R7Q3Arsquj4BIk7
+VpOaI0dYdnnNN3XDacMtbec4LKBq6ZHKZyIs5dxldpVdZjvWA8x2ib3v4yNy1o4m
+BXWjdfkICjhkRnjLRsAo61cumx22Row7VF4LKzirB9NzvcqvTwyIvWU6T+RWhAdm
+OQM0JQKBgC+gmBGfnQShTRYlfpb4RVnDijPpC34AdEO7wdeMcdQK9KfWsLZT5y0w
+qoZhW9IPlu1dNRhwHqGHWu2CmQVwFpy5/ccpukCJfyZw7edbb9dIqzKlUWw8Jmmg
+C7WKz4z3mKkZrwptFxDu0dpQ644yOP/gnRaLLyP0zn/brmnYz09X
 -----END RSA PRIVATE KEY-----
 Certificate:
     Data:
         Version: 3 (0x2)
-        Serial Number: 15361901406880 (0xdf8b8ad2aa0)
-    Signature Algorithm: sha1WithRSAEncryption
+        Serial Number:
+            0e:4d:b9:c6:24:b0
+        Signature Algorithm: sha256WithRSAEncryption
         Issuer:
             countryName               = NN
             organizationName          = Edel Curl Arctic Illudium Research Cloud
             commonName                = Northern Nowhere Trust Anchor
         Validity
-            Not Before: Sep  5 23:29:01 2018 GMT
-            Not After : Nov 22 23:29:01 2026 GMT
+            Not Before: Nov  2 12:53:25 2019 GMT
+            Not After : Jan 19 12:53:25 2028 GMT
         Subject:
             countryName               = NN
             organizationName          = Edel Curl Arctic Illudium Research Cloud
             commonName                = localhost.nn
         Subject Public Key Info:
             Public Key Algorithm: rsaEncryption
-                Public-Key: (2048 bit)
+                RSA Public-Key: (2048 bit)
                 Modulus:
-                    00:df:16:15:5f:2a:a4:50:cf:3a:a8:79:6e:22:8d:
-                    95:16:b7:4d:7d:d2:1f:4f:6d:2d:7a:7d:dc:8a:4f:
-                    53:7b:5f:c9:de:5c:88:6c:a2:74:26:35:1c:78:68:
-                    c1:60:25:a7:7b:b6:1a:9a:aa:33:d0:9f:5e:f2:2e:
-                    21:04:8c:0d:9a:28:f5:61:40:3c:34:1a:9b:8a:70:
-                    81:6d:83:9e:7c:d0:4c:d9:79:dc:37:d9:24:6e:73:
-                    c7:61:31:71:e9:f5:97:b7:65:ad:3d:f6:af:20:6f:
-                    56:b9:b5:42:b5:3d:96:61:31:eb:0d:4c:e9:f5:31:
-                    d3:25:af:40:b3:bb:81:04:7f:1a:ce:21:18:83:52:
-                    2d:51:31:ae:82:f9:cb:10:d3:d5:06:af:f8:71:e8:
-                    a3:c6:9f:7b:48:da:e2:28:af:1c:ff:41:6d:32:81:
-                    45:59:d7:64:e4:b1:d7:c9:86:6a:0b:65:71:66:d6:
-                    42:a8:67:fd:83:49:20:75:16:1e:bb:1b:85:5c:7e:
-                    e2:8f:5f:1c:81:d3:8a:95:d6:92:5c:9e:7f:a2:10:
-                    08:e1:df:ae:69:68:3f:8d:dd:79:4f:da:3f:79:b5:
-                    02:97:57:30:67:4d:3d:76:35:b5:4f:d1:5d:35:dd:
-                    d4:b5:6b:57:b2:e0:23:35:ad:1a:bf:6f:77:e6:bc:
-                    58:ed
+                    00:bd:97:0e:a7:6d:b6:73:8c:d0:21:6b:f3:36:74:
+                    5d:0a:aa:3a:f0:fa:6e:b1:5c:1c:13:74:ca:67:2b:
+                    22:03:d1:a6:3c:25:ef:87:4f:e8:38:9f:21:1d:2e:
+                    88:12:36:66:82:03:02:4c:f8:17:35:02:95:31:b1:
+                    53:40:21:24:2f:00:f0:bf:80:58:16:b1:92:b3:d3:
+                    78:bf:78:cb:0a:91:0c:d2:6d:5d:b2:1f:41:73:16:
+                    02:7c:1a:cd:16:25:c9:e1:1b:81:bd:84:93:4c:63:
+                    ce:38:f4:3e:ad:98:6b:00:89:a8:ba:f5:7e:08:83:
+                    f3:9a:f5:98:b8:9f:d6:d8:c7:d4:f3:07:1c:8f:ef:
+                    bc:29:10:60:8c:85:8b:4c:7a:73:c7:9f:a8:23:2f:
+                    c4:47:f5:18:85:98:fb:27:de:58:93:4b:08:a5:66:
+                    c9:df:db:f0:22:f8:64:9f:a1:56:89:97:ab:02:2c:
+                    5a:99:f2:6f:bf:72:31:90:22:32:ae:86:25:6b:13:
+                    c6:72:ec:df:2e:c8:12:00:c1:e3:38:b4:a0:40:ba:
+                    01:61:c2:d7:b1:ef:7d:4b:29:18:e2:fe:28:d0:98:
+                    e4:65:3f:4c:34:39:e4:82:a9:ca:b2:3d:c4:91:8f:
+                    a0:94:bf:e3:f8:b3:73:48:b7:fe:fa:04:43:e7:b5:
+                    bc:bd
                 Exponent: 65537 (0x10001)
         X509v3 extensions:
             X509v3 Subject Alternative Name: 
@@ -97,48 +98,48 @@ Certificate:
             X509v3 Extended Key Usage: 
                 TLS Web Server Authentication
             X509v3 Subject Key Identifier: 
-                7C:9A:EA:9B:92:98:FB:77:25:89:8B:EF:D3:F4:88:34:AF:EA:24:CC
+                4E:54:63:95:A1:58:0C:FA:BD:3E:58:26:AF:AF:A4:F3:66:1A:CB:25
             X509v3 Authority Key Identifier: 
                 keyid:12:CA:BA:4B:46:04:A7:75:8A:2C:E8:0E:54:94:BC:12:65:A6:7B:CE
 
             X509v3 Basic Constraints: 
                 CA:FALSE
-    Signature Algorithm: sha1WithRSAEncryption
-         0f:97:60:47:2f:22:9f:d4:16:99:5a:ed:f4:b5:54:31:bf:9f:
-         a1:bd:2d:8b:eb:c1:24:db:73:30:c7:46:d6:4c:c8:c6:38:0c:
-         9a:e6:d6:5e:e8:a7:fb:9f:b6:44:66:73:43:86:46:10:c0:4c:
-         40:4e:c1:d7:e4:41:0b:f0:61:f0:6f:45:8c:5a:14:40:42:97:
-         c3:03:d0:ff:6d:4a:06:80:65:49:d4:2f:07:9d:86:59:6b:5b:
-         9e:bc:0c:46:8a:62:da:c0:22:af:13:6c:0d:9d:54:5e:46:53:
-         a5:aa:f2:80:44:c7:07:6e:f7:b0:4c:37:5c:31:08:a0:37:df:
-         8a:35:92:3c:8c:91:2f:64:4f:d3:a0:eb:95:b3:4a:9e:f7:ac:
-         25:ad:06:13:5c:dd:bd:d5:6b:74:8d:c7:c5:a6:b4:89:27:fd:
-         b7:c2:24:a7:6a:b3:64:e6:e6:31:91:35:fc:0e:15:14:38:d6:
-         39:b0:c4:b2:c1:c8:c7:ed:25:d7:b0:a9:b9:a0:70:33:42:90:
-         86:33:2a:d8:d5:8a:02:e6:ab:8d:92:d6:ae:b4:1d:e9:6c:22:
-         a5:2f:1a:48:48:2b:5c:b8:30:01:4b:27:1a:d3:cf:21:77:ab:
-         9f:bc:55:34:2e:9f:03:2b:17:0b:c3:44:8e:a8:94:ae:92:a2:
-         9a:33:c0:8e
+    Signature Algorithm: sha256WithRSAEncryption
+         2c:f9:48:33:7c:93:ca:3c:9c:58:92:8c:2b:87:61:9f:0d:9c:
+         9d:e8:43:43:12:d6:a3:40:71:ec:cb:31:76:80:68:b1:54:d1:
+         86:f4:b3:9e:c8:50:62:b4:87:12:be:9b:d6:3c:2b:cf:22:0e:
+         66:26:c2:31:dd:1f:c6:97:1e:61:a4:51:ea:68:75:81:66:b9:
+         3b:a6:1f:f6:80:ec:6b:aa:65:66:0c:02:ab:c9:57:bd:6a:4e:
+         6d:24:30:13:7b:65:17:60:9a:14:37:57:f7:22:66:55:7d:1a:
+         1a:5b:27:43:3b:d4:88:bc:2f:d3:d7:bb:d5:3f:9b:25:26:5d:
+         39:a0:4c:8a:84:2c:db:04:87:8a:df:49:7d:4b:d2:85:7a:09:
+         5e:df:6b:1b:b5:6e:9c:bb:2b:f6:c5:01:19:5a:87:d0:cf:16:
+         67:8b:54:41:87:c1:33:c3:21:f6:e5:84:d2:84:5d:da:82:cd:
+         39:4d:50:97:f3:83:37:9e:e5:04:0e:dc:c6:20:d1:b3:f6:c7:
+         3d:dd:95:be:8c:b9:72:72:7a:71:66:aa:4a:8e:cf:37:38:e8:
+         c8:06:69:68:8d:d8:d6:8b:4c:23:50:27:fa:e9:bb:2a:a6:89:
+         56:ad:be:4d:bd:be:0c:d7:55:b4:f4:b9:f7:6a:b5:2c:7f:5f:
+         9f:df:f6:61
 -----BEGIN CERTIFICATE-----
-MIID3jCCAsagAwIBAgIGDfi4rSqgMA0GCSqGSIb3DQEBBQUAMGgxCzAJBgNVBAYT
+MIID3jCCAsagAwIBAgIGDk25xiSwMA0GCSqGSIb3DQEBCwUAMGgxCzAJBgNVBAYT
 Ak5OMTEwLwYDVQQKDChFZGVsIEN1cmwgQXJjdGljIElsbHVkaXVtIFJlc2VhcmNo
 IENsb3VkMSYwJAYDVQQDDB1Ob3J0aGVybiBOb3doZXJlIFRydXN0IEFuY2hvcjAe
-Fw0xODA5MDUyMzI5MDFaFw0yNjExMjIyMzI5MDFaMFcxCzAJBgNVBAYTAk5OMTEw
+Fw0xOTExMDIxMjUzMjVaFw0yODAxMTkxMjUzMjVaMFcxCzAJBgNVBAYTAk5OMTEw
 LwYDVQQKDChFZGVsIEN1cmwgQXJjdGljIElsbHVkaXVtIFJlc2VhcmNoIENsb3Vk
 MRUwEwYDVQQDDAxsb2NhbGhvc3Qubm4wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
-ggEKAoIBAQDfFhVfKqRQzzqoeW4ijZUWt0190h9PbS16fdyKT1N7X8neXIhsonQm
-NRx4aMFgJad7thqaqjPQn17yLiEEjA2aKPVhQDw0GpuKcIFtg5580EzZedw32SRu
-c8dhMXHp9Ze3Za099q8gb1a5tUK1PZZhMesNTOn1MdMlr0Czu4EEfxrOIRiDUi1R
-Ma6C+csQ09UGr/hx6KPGn3tI2uIorxz/QW0ygUVZ12TksdfJhmoLZXFm1kKoZ/2D
-SSB1Fh67G4VcfuKPXxyB04qV1pJcnn+iEAjh365paD+N3XlP2j95tQKXVzBnTT12
-NbVP0V013dS1a1ey4CM1rRq/b3fmvFjtAgMBAAGjgZ4wgZswLAYDVR0RBCUwI4IK
+ggEKAoIBAQC9lw6nbbZzjNAha/M2dF0Kqjrw+m6xXBwTdMpnKyID0aY8Je+HT+g4
+nyEdLogSNmaCAwJM+Bc1ApUxsVNAISQvAPC/gFgWsZKz03i/eMsKkQzSbV2yH0Fz
+FgJ8Gs0WJcnhG4G9hJNMY8449D6tmGsAiai69X4Ig/Oa9Zi4n9bYx9TzBxyP77wp
+EGCMhYtMenPHn6gjL8RH9RiFmPsn3liTSwilZsnf2/Ai+GSfoVaJl6sCLFqZ8m+/
+cjGQIjKuhiVrE8Zy7N8uyBIAweM4tKBAugFhwtex731LKRji/ijQmORlP0w0OeSC
+qcqyPcSRj6CUv+P4s3NIt/76BEPntby9AgMBAAGjgZ4wgZswLAYDVR0RBCUwI4IK
 bG9jYWxob3N0MYIKbG9jYWxob3N0MoIJbG9jYWxob3N0MAsGA1UdDwQEAwIDqDAT
-BgNVHSUEDDAKBggrBgEFBQcDATAdBgNVHQ4EFgQUfJrqm5KY+3cliYvv0/SINK/q
-JMwwHwYDVR0jBBgwFoAUEsq6S0YEp3WKLOgOVJS8EmWme84wCQYDVR0TBAIwADAN
-BgkqhkiG9w0BAQUFAAOCAQEAD5dgRy8in9QWmVrt9LVUMb+fob0ti+vBJNtzMMdG
-1kzIxjgMmubWXuin+5+2RGZzQ4ZGEMBMQE7B1+RBC/Bh8G9FjFoUQEKXwwPQ/21K
-BoBlSdQvB52GWWtbnrwMRopi2sAirxNsDZ1UXkZTparygETHB273sEw3XDEIoDff
-ijWSPIyRL2RP06DrlbNKnvesJa0GE1zdvdVrdI3Hxaa0iSf9t8Ikp2qzZObmMZE1
-/A4VFDjWObDEssHIx+0l17CpuaBwM0KQhjMq2NWKAuarjZLWrrQd6WwipS8aSEgr
-XLgwAUsnGtPPIXern7xVNC6fAysXC8NEjqiUrpKimjPAjg==
+BgNVHSUEDDAKBggrBgEFBQcDATAdBgNVHQ4EFgQUTlRjlaFYDPq9Plgmr6+k82Ya
+yyUwHwYDVR0jBBgwFoAUEsq6S0YEp3WKLOgOVJS8EmWme84wCQYDVR0TBAIwADAN
+BgkqhkiG9w0BAQsFAAOCAQEALPlIM3yTyjycWJKMK4dhnw2cnehDQxLWo0Bx7Msx
+doBosVTRhvSznshQYrSHEr6b1jwrzyIOZibCMd0fxpceYaRR6mh1gWa5O6Yf9oDs
+a6plZgwCq8lXvWpObSQwE3tlF2CaFDdX9yJmVX0aGlsnQzvUiLwv09e71T+bJSZd
+OaBMioQs2wSHit9JfUvShXoJXt9rG7VunLsr9sUBGVqH0M8WZ4tUQYfBM8Mh9uWE
+0oRd2oLNOU1Ql/ODN57lBA7cxiDRs/bHPd2Vvoy5cnJ6cWaqSo7PNzjoyAZpaI3Y
+1otMI1An+um7KqaJVq2+Tb2+DNdVtPS592q1LH9fn9/2YQ==
 -----END CERTIFICATE-----
index 5cd11dc..480ee31 100644 (file)
Binary files a/tests/certs/Server-localhost-lastSAN-sv.pub.der and b/tests/certs/Server-localhost-lastSAN-sv.pub.der differ
index aaca857..5c1d333 100644 (file)
@@ -1,9 +1,9 @@
 -----BEGIN PUBLIC KEY-----
-MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA3xYVXyqkUM86qHluIo2V
-FrdNfdIfT20ten3cik9Te1/J3lyIbKJ0JjUceGjBYCWne7Yamqoz0J9e8i4hBIwN
-mij1YUA8NBqbinCBbYOefNBM2XncN9kkbnPHYTFx6fWXt2WtPfavIG9WubVCtT2W
-YTHrDUzp9THTJa9As7uBBH8aziEYg1ItUTGugvnLENPVBq/4ceijxp97SNriKK8c
-/0FtMoFFWddk5LHXyYZqC2VxZtZCqGf9g0kgdRYeuxuFXH7ij18cgdOKldaSXJ5/
-ohAI4d+uaWg/jd15T9o/ebUCl1cwZ009djW1T9FdNd3UtWtXsuAjNa0av2935rxY
-7QIDAQAB
+MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvZcOp222c4zQIWvzNnRd
+Cqo68PpusVwcE3TKZysiA9GmPCXvh0/oOJ8hHS6IEjZmggMCTPgXNQKVMbFTQCEk
+LwDwv4BYFrGSs9N4v3jLCpEM0m1dsh9BcxYCfBrNFiXJ4RuBvYSTTGPOOPQ+rZhr
+AImouvV+CIPzmvWYuJ/W2MfU8wccj++8KRBgjIWLTHpzx5+oIy/ER/UYhZj7J95Y
+k0sIpWbJ39vwIvhkn6FWiZerAixamfJvv3IxkCIyroYlaxPGcuzfLsgSAMHjOLSg
+QLoBYcLXse99SykY4v4o0JjkZT9MNDnkgqnKsj3EkY+glL/j+LNzSLf++gRD57W8
+vQIDAQAB
 -----END PUBLIC KEY-----
index 38eb9d4..a230ca2 100644 (file)
@@ -89,8 +89,7 @@ build_triplet = @build@
 host_triplet = @host@
 subdir = tests/certs/scripts
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/ax_code_coverage.m4 \
-       $(top_srcdir)/m4/ax_compile_check_sizeof.m4 \
+am__aclocal_m4_deps = $(top_srcdir)/m4/ax_compile_check_sizeof.m4 \
        $(top_srcdir)/m4/curl-compilers.m4 \
        $(top_srcdir)/m4/curl-confopts.m4 \
        $(top_srcdir)/m4/curl-functions.m4 \
@@ -152,12 +151,6 @@ CC = @CC@
 CCDEPMODE = @CCDEPMODE@
 CFLAGS = @CFLAGS@
 CFLAG_CURL_SYMBOL_HIDING = @CFLAG_CURL_SYMBOL_HIDING@
-CODE_COVERAGE_CFLAGS = @CODE_COVERAGE_CFLAGS@
-CODE_COVERAGE_CPPFLAGS = @CODE_COVERAGE_CPPFLAGS@
-CODE_COVERAGE_CXXFLAGS = @CODE_COVERAGE_CXXFLAGS@
-CODE_COVERAGE_ENABLED = @CODE_COVERAGE_ENABLED@
-CODE_COVERAGE_LDFLAGS = @CODE_COVERAGE_LDFLAGS@
-CODE_COVERAGE_LIBS = @CODE_COVERAGE_LIBS@
 CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
@@ -199,14 +192,15 @@ ENABLE_SHARED = @ENABLE_SHARED@
 ENABLE_STATIC = @ENABLE_STATIC@
 EXEEXT = @EXEEXT@
 FGREP = @FGREP@
+FISH_FUNCTIONS_DIR = @FISH_FUNCTIONS_DIR@
 GCOV = @GCOV@
-GENHTML = @GENHTML@
 GREP = @GREP@
 HAVE_BROTLI = @HAVE_BROTLI@
 HAVE_GNUTLS_SRP = @HAVE_GNUTLS_SRP@
 HAVE_LDAP_SSL = @HAVE_LDAP_SSL@
 HAVE_LIBZ = @HAVE_LIBZ@
 HAVE_OPENSSL_SRP = @HAVE_OPENSSL_SRP@
+HAVE_PROTO_BSDSOCKET_H = @HAVE_PROTO_BSDSOCKET_H@
 IDN_ENABLED = @IDN_ENABLED@
 INSTALL = @INSTALL@
 INSTALL_DATA = @INSTALL_DATA@
@@ -267,9 +261,7 @@ STRIP = @STRIP@
 SUPPORT_FEATURES = @SUPPORT_FEATURES@
 SUPPORT_PROTOCOLS = @SUPPORT_PROTOCOLS@
 USE_ARES = @USE_ARES@
-USE_AXTLS = @USE_AXTLS@
-USE_CYASSL = @USE_CYASSL@
-USE_DARWINSSL = @USE_DARWINSSL@
+USE_BEARSSL = @USE_BEARSSL@
 USE_GNUTLS = @USE_GNUTLS@
 USE_GNUTLS_NETTLE = @USE_GNUTLS_NETTLE@
 USE_LIBRTMP = @USE_LIBRTMP@
@@ -278,12 +270,17 @@ USE_LIBSSH2 = @USE_LIBSSH2@
 USE_MBEDTLS = @USE_MBEDTLS@
 USE_MESALINK = @USE_MESALINK@
 USE_NGHTTP2 = @USE_NGHTTP2@
+USE_NGHTTP3 = @USE_NGHTTP3@
+USE_NGTCP2 = @USE_NGTCP2@
+USE_NGTCP2_CRYPTO_OPENSSL = @USE_NGTCP2_CRYPTO_OPENSSL@
 USE_NSS = @USE_NSS@
 USE_OPENLDAP = @USE_OPENLDAP@
-USE_POLARSSL = @USE_POLARSSL@
+USE_QUICHE = @USE_QUICHE@
 USE_SCHANNEL = @USE_SCHANNEL@
+USE_SECTRANSP = @USE_SECTRANSP@
 USE_UNIX_SOCKETS = @USE_UNIX_SOCKETS@
 USE_WINDOWS_SSPI = @USE_WINDOWS_SSPI@
+USE_WOLFSSL = @USE_WOLFSSL@
 VERSION = @VERSION@
 VERSIONNUM = @VERSIONNUM@
 ZLIB_LIBS = @ZLIB_LIBS@
index 3ab1fb7..8d72ba1 100644 (file)
@@ -21,7 +21,7 @@
 #                            | (__| |_| |  _ <| |___
 #                             \___|\___/|_| \_\_____|
 #
-# Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
 #
 # This software is licensed as described in the file COPYING, which
 # you should have received as part of this distribution. The terms
@@ -111,8 +111,7 @@ build_triplet = @build@
 host_triplet = @host@
 subdir = tests/data
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/ax_code_coverage.m4 \
-       $(top_srcdir)/m4/ax_compile_check_sizeof.m4 \
+am__aclocal_m4_deps = $(top_srcdir)/m4/ax_compile_check_sizeof.m4 \
        $(top_srcdir)/m4/curl-compilers.m4 \
        $(top_srcdir)/m4/curl-confopts.m4 \
        $(top_srcdir)/m4/curl-functions.m4 \
@@ -174,12 +173,6 @@ CC = @CC@
 CCDEPMODE = @CCDEPMODE@
 CFLAGS = @CFLAGS@
 CFLAG_CURL_SYMBOL_HIDING = @CFLAG_CURL_SYMBOL_HIDING@
-CODE_COVERAGE_CFLAGS = @CODE_COVERAGE_CFLAGS@
-CODE_COVERAGE_CPPFLAGS = @CODE_COVERAGE_CPPFLAGS@
-CODE_COVERAGE_CXXFLAGS = @CODE_COVERAGE_CXXFLAGS@
-CODE_COVERAGE_ENABLED = @CODE_COVERAGE_ENABLED@
-CODE_COVERAGE_LDFLAGS = @CODE_COVERAGE_LDFLAGS@
-CODE_COVERAGE_LIBS = @CODE_COVERAGE_LIBS@
 CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
@@ -221,14 +214,15 @@ ENABLE_SHARED = @ENABLE_SHARED@
 ENABLE_STATIC = @ENABLE_STATIC@
 EXEEXT = @EXEEXT@
 FGREP = @FGREP@
+FISH_FUNCTIONS_DIR = @FISH_FUNCTIONS_DIR@
 GCOV = @GCOV@
-GENHTML = @GENHTML@
 GREP = @GREP@
 HAVE_BROTLI = @HAVE_BROTLI@
 HAVE_GNUTLS_SRP = @HAVE_GNUTLS_SRP@
 HAVE_LDAP_SSL = @HAVE_LDAP_SSL@
 HAVE_LIBZ = @HAVE_LIBZ@
 HAVE_OPENSSL_SRP = @HAVE_OPENSSL_SRP@
+HAVE_PROTO_BSDSOCKET_H = @HAVE_PROTO_BSDSOCKET_H@
 IDN_ENABLED = @IDN_ENABLED@
 INSTALL = @INSTALL@
 INSTALL_DATA = @INSTALL_DATA@
@@ -289,9 +283,7 @@ STRIP = @STRIP@
 SUPPORT_FEATURES = @SUPPORT_FEATURES@
 SUPPORT_PROTOCOLS = @SUPPORT_PROTOCOLS@
 USE_ARES = @USE_ARES@
-USE_AXTLS = @USE_AXTLS@
-USE_CYASSL = @USE_CYASSL@
-USE_DARWINSSL = @USE_DARWINSSL@
+USE_BEARSSL = @USE_BEARSSL@
 USE_GNUTLS = @USE_GNUTLS@
 USE_GNUTLS_NETTLE = @USE_GNUTLS_NETTLE@
 USE_LIBRTMP = @USE_LIBRTMP@
@@ -300,12 +292,17 @@ USE_LIBSSH2 = @USE_LIBSSH2@
 USE_MBEDTLS = @USE_MBEDTLS@
 USE_MESALINK = @USE_MESALINK@
 USE_NGHTTP2 = @USE_NGHTTP2@
+USE_NGHTTP3 = @USE_NGHTTP3@
+USE_NGTCP2 = @USE_NGTCP2@
+USE_NGTCP2_CRYPTO_OPENSSL = @USE_NGTCP2_CRYPTO_OPENSSL@
 USE_NSS = @USE_NSS@
 USE_OPENLDAP = @USE_OPENLDAP@
-USE_POLARSSL = @USE_POLARSSL@
+USE_QUICHE = @USE_QUICHE@
 USE_SCHANNEL = @USE_SCHANNEL@
+USE_SECTRANSP = @USE_SECTRANSP@
 USE_UNIX_SOCKETS = @USE_UNIX_SOCKETS@
 USE_WINDOWS_SSPI = @USE_WINDOWS_SSPI@
+USE_WOLFSSL = @USE_WOLFSSL@
 VERSION = @VERSION@
 VERSIONNUM = @VERSIONNUM@
 ZLIB_LIBS = @ZLIB_LIBS@
@@ -402,21 +399,22 @@ test289 test290 test291 test292 test293 test294 test295 test296 test297 \
 test298 test299 test300 test301 test302 test303 test304 test305 test306 \
 test307 test308 test309 test310 test311 test312 test313 test314 test315 \
 test316 test317 test318 test319 test320 test321 test322 test323 test324 \
-test325 test326 \
-\
-test340 \
-\
-test350 test351 test352 test353 test354 \
+test325 test326 test327 test328 test329 test330 test331 test332 test333 \
+test334 test335 test336 test337 test338 test339 test340 test341 test342 \
+test343 \
+test350 test351 test352 test353 test354 test355 test356 \
 test393 test394 test395 \
 \
 test400 test401 test402 test403 test404 test405 test406 test407 test408 \
 test409 \
 \
+test490 test491 test492 \
+\
 test500 test501 test502 test503 test504 test505 test506 test507 test508 \
 test509 test510 test511 test512 test513 test514 test515 test516 test517 \
 test518 test519 test520 test521 test522 test523 test524 test525 test526 \
 test527 test528 test529 test530 test531 test532 test533 test534 test535 \
-test536 test537 test538 test539 test540 test541 test542 test543 test544 \
+        test537 test538 test539 test540 test541 test542 test543 test544 \
 test545 test546 test547 test548 test549 test550 test551 test552 test553 \
 test554 test555 test556 test557 test558 test559 test560 test561 test562 \
 test563 test564 test565 test566 test567 test568 test569 test570 test571 \
@@ -429,30 +427,32 @@ test617 test618 test619 test620 test621 test622 test623 test624 test625 \
 test626 test627 test628 test629 test630 test631 test632 test633 test634 \
 test635 test636 test637 test638 test639 test640 test641 test642 \
 test643 test644 test645 test646 test647 test648 test649 test650 test651 \
-test652 test653 test654 test655 test656 \
+test652 test653 test654 test655 test656 test658 test659 test660 test661 \
+test662 test663 \
 \
 test700 test701 test702 test703 test704 test705 test706 test707 test708 \
-test709 test710 test711 test712 test713 test714 test715 \
+test709 test710 test711 test712 test713 test714 test715 test716 test717 \
 \
 test800 test801 test802 test803 test804 test805 test806 test807 test808 \
 test809 test810 test811 test812 test813 test814 test815 test816 test817 \
 test818 test819 test820 test821 test822 test823 test824 test825 test826 \
 test827 test828 test829 test830 test831 test832 test833 test834 test835 \
 test836 test837 test838 test839 test840 test841 test842 test843 test844 \
-test845 test846 test847 \
+test845 test846 test847 test848 test849 \
 \
 test850 test851 test852 test853 test854 test855 test856 test857 test858 \
 test859 test860 test861 test862 test863 test864 test865 test866 test867 \
 test868 test869 test870 test871 test872 test873 test874 test875 test876 \
 test877 test878 test879 test880 test881 test882 test883 test884 test885 \
-test886 test887 test888 test889 test890 test891 \
+test886 test887 test888 test889 test890 test891 test892 test893 \
 \
 test900 test901 test902 test903 test904 test905 test906 test907 test908 \
 test909 test910 test911 test912 test913 test914 test915 test916 test917 \
 test918 test919 test920 test921 test922 test923 test924 test925 test926 \
 test927 test928 test929 test930 test931 test932 test933 test934 test935 \
 test936 test937 test938 test939 test940 test941 test942 test943 test944 \
-test945 test946 test947 test948 test949 test950 test951 test952 \
+test945 test946 test947 test948 test949 test950 test951 test952 test953 \
+test954 \
 \
 test1000 test1001 test1002 test1003 test1004 test1005 test1006 test1007 \
 test1008 test1009 test1010 test1011 test1012 test1013 test1014 test1015 \
@@ -473,10 +473,10 @@ test1120 test1121 test1122 test1123 test1124 test1125 test1126 test1127 \
 test1128 test1129 test1130 test1131 test1132 test1133 test1134 test1135 \
 test1136 test1137 test1138 test1139 test1140 test1141 test1142 test1143 \
 test1144 test1145 test1146 test1147 test1148 test1149 test1150 test1151 \
-test1152 test1153 test1154 test1155 test1156 test1157 test1158 \
+test1152 test1153 test1154 test1155 test1156 test1157 test1158 test1159 \
+test1160 test1161 test1162 test1163 test1164 test1165 test1166 \
+test1170 test1171 test1172 test1173 test1174 test1175 \
 \
-test1160 test1161 test1162 test1163 test1164 \
-test1170 test1171 \
 test1200 test1201 test1202 test1203 test1204 test1205 test1206 test1207 \
 test1208 test1209 test1210 test1211 test1212 test1213 test1214 test1215 \
 test1216 test1217 test1218 test1219 \
@@ -486,10 +486,10 @@ test1236 test1237 test1238 test1239 test1240 test1241 test1242 test1243 \
 test1244 test1245 test1246 test1247 test1248 test1249 test1250 test1251 \
 test1252 test1253 test1254 test1255 test1256 test1257 test1258 test1259 \
 test1260 test1261 test1262 test1263 test1264 test1265 test1266 test1267 \
-test1268 \
+test1268 test1269 test1270 test1271 \
 \
 test1280 test1281 test1282 test1283 test1284 test1285 test1286 test1287 \
-test1288 test1289 test1290 test1291 test1292 \
+test1288 test1289 test1290 test1291 test1292 test1293 \
 test1298 test1299 \
 test1300 test1301 test1302 test1303 test1304 test1305 test1306 test1307 \
 test1308 test1309 test1310 test1311 test1312 test1313 test1314 test1315 \
@@ -512,31 +512,29 @@ test1424 test1425 test1426 test1427 \
 test1428 test1429 test1430 test1431 test1432 test1433 test1434 test1435 \
 test1436 test1437 test1438 test1439 test1440 test1441 test1442 test1443 \
 test1444 test1445 test1446 test1447 test1448 test1449 test1450 test1451 \
-test1452 test1453 test1454 test1455 test1456 \
+test1452 test1453 test1454 test1455 test1456 test1457 test1458\
 test1500 test1501 test1502 test1503 test1504 test1505 test1506 test1507 \
 test1508 test1509 test1510 test1511 test1512 test1513 test1514 test1515 \
-test1516 test1517 \
-\
-test1520 test1521 test1522 \
+test1516 test1517 test1518 test1519 test1520 test1521 test1522 test1523 \
 \
 test1525 test1526 test1527 test1528 test1529 test1530 test1531 test1532 \
 test1533 test1534 test1535 test1536 test1537 test1538 \
-test1540 \
+test1540 test1541 \
 test1550 test1551 test1552 test1553 test1554 test1555 test1556 test1557 \
+test1558 test1559 test1560 test1561 test1562 test1563 test1564 test1565 \
 \
-test1560 \
+test1590 test1591 test1592 test1593 test1594 test1595 test1596 \
 \
-test1590 \
 test1600 test1601 test1602 test1603 test1604 test1605 test1606 test1607 \
-test1608 test1609 test1620 \
+test1608 test1609 test1620 test1621 \
 \
-test1650 test1651 \
+test1650 test1651 test1652 test1653 test1654 test1655 \
 \
 test1700 test1701 test1702 \
 \
 test1800 test1801 \
 \
-test1900 test1901 test1902 test1903 test1904 \
+test1900 test1901 test1902 test1903 test1904 test1905 test1906 test1907 \
 \
 test2000 test2001 test2002 test2003 test2004 test2005 test2006 test2007 \
 test2008 test2009 test2010 test2011 test2012 test2013 test2014 test2015 \
@@ -547,7 +545,8 @@ test2040 test2041 test2042 test2043 test2044 test2045 test2046 test2047 \
 test2048 test2049 test2050 test2051 test2052 test2053 test2054 test2055 \
 test2056 test2057 test2058 test2059 test2060 test2061 test2062 test2063 \
 test2064 test2065 test2066 test2067 test2068 test2069 \
-test2070 test2071 test2072 test2073 test2074 test2075 \
+         test2071 test2072 test2073 test2074 test2075 test2076 test2077 \
+test2078 \
 test2080 \
 test2100 \
 \
index 35c7aa4..09cb057 100644 (file)
@@ -5,7 +5,7 @@
 #                            | (__| |_| |  _ <| |___
 #                             \___|\___/|_| \_\_____|
 #
-# Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
 #
 # This software is licensed as described in the file COPYING, which
 # you should have received as part of this distribution. The terms
@@ -56,21 +56,22 @@ test289 test290 test291 test292 test293 test294 test295 test296 test297 \
 test298 test299 test300 test301 test302 test303 test304 test305 test306 \
 test307 test308 test309 test310 test311 test312 test313 test314 test315 \
 test316 test317 test318 test319 test320 test321 test322 test323 test324 \
-test325 test326 \
-\
-test340 \
-\
-test350 test351 test352 test353 test354 \
+test325 test326 test327 test328 test329 test330 test331 test332 test333 \
+test334 test335 test336 test337 test338 test339 test340 test341 test342 \
+test343 \
+test350 test351 test352 test353 test354 test355 test356 \
 test393 test394 test395 \
 \
 test400 test401 test402 test403 test404 test405 test406 test407 test408 \
 test409 \
 \
+test490 test491 test492 \
+\
 test500 test501 test502 test503 test504 test505 test506 test507 test508 \
 test509 test510 test511 test512 test513 test514 test515 test516 test517 \
 test518 test519 test520 test521 test522 test523 test524 test525 test526 \
 test527 test528 test529 test530 test531 test532 test533 test534 test535 \
-test536 test537 test538 test539 test540 test541 test542 test543 test544 \
+        test537 test538 test539 test540 test541 test542 test543 test544 \
 test545 test546 test547 test548 test549 test550 test551 test552 test553 \
 test554 test555 test556 test557 test558 test559 test560 test561 test562 \
 test563 test564 test565 test566 test567 test568 test569 test570 test571 \
@@ -83,30 +84,32 @@ test617 test618 test619 test620 test621 test622 test623 test624 test625 \
 test626 test627 test628 test629 test630 test631 test632 test633 test634 \
 test635 test636 test637 test638 test639 test640 test641 test642 \
 test643 test644 test645 test646 test647 test648 test649 test650 test651 \
-test652 test653 test654 test655 test656 \
+test652 test653 test654 test655 test656 test658 test659 test660 test661 \
+test662 test663 \
 \
 test700 test701 test702 test703 test704 test705 test706 test707 test708 \
-test709 test710 test711 test712 test713 test714 test715 \
+test709 test710 test711 test712 test713 test714 test715 test716 test717 \
 \
 test800 test801 test802 test803 test804 test805 test806 test807 test808 \
 test809 test810 test811 test812 test813 test814 test815 test816 test817 \
 test818 test819 test820 test821 test822 test823 test824 test825 test826 \
 test827 test828 test829 test830 test831 test832 test833 test834 test835 \
 test836 test837 test838 test839 test840 test841 test842 test843 test844 \
-test845 test846 test847 \
+test845 test846 test847 test848 test849 \
 \
 test850 test851 test852 test853 test854 test855 test856 test857 test858 \
 test859 test860 test861 test862 test863 test864 test865 test866 test867 \
 test868 test869 test870 test871 test872 test873 test874 test875 test876 \
 test877 test878 test879 test880 test881 test882 test883 test884 test885 \
-test886 test887 test888 test889 test890 test891 \
+test886 test887 test888 test889 test890 test891 test892 test893 \
 \
 test900 test901 test902 test903 test904 test905 test906 test907 test908 \
 test909 test910 test911 test912 test913 test914 test915 test916 test917 \
 test918 test919 test920 test921 test922 test923 test924 test925 test926 \
 test927 test928 test929 test930 test931 test932 test933 test934 test935 \
 test936 test937 test938 test939 test940 test941 test942 test943 test944 \
-test945 test946 test947 test948 test949 test950 test951 test952 \
+test945 test946 test947 test948 test949 test950 test951 test952 test953 \
+test954 \
 \
 test1000 test1001 test1002 test1003 test1004 test1005 test1006 test1007 \
 test1008 test1009 test1010 test1011 test1012 test1013 test1014 test1015 \
@@ -127,10 +130,10 @@ test1120 test1121 test1122 test1123 test1124 test1125 test1126 test1127 \
 test1128 test1129 test1130 test1131 test1132 test1133 test1134 test1135 \
 test1136 test1137 test1138 test1139 test1140 test1141 test1142 test1143 \
 test1144 test1145 test1146 test1147 test1148 test1149 test1150 test1151 \
-test1152 test1153 test1154 test1155 test1156 test1157 test1158 \
+test1152 test1153 test1154 test1155 test1156 test1157 test1158 test1159 \
+test1160 test1161 test1162 test1163 test1164 test1165 test1166 \
+test1170 test1171 test1172 test1173 test1174 test1175 \
 \
-test1160 test1161 test1162 test1163 test1164 \
-test1170 test1171 \
 test1200 test1201 test1202 test1203 test1204 test1205 test1206 test1207 \
 test1208 test1209 test1210 test1211 test1212 test1213 test1214 test1215 \
 test1216 test1217 test1218 test1219 \
@@ -140,10 +143,10 @@ test1236 test1237 test1238 test1239 test1240 test1241 test1242 test1243 \
 test1244 test1245 test1246 test1247 test1248 test1249 test1250 test1251 \
 test1252 test1253 test1254 test1255 test1256 test1257 test1258 test1259 \
 test1260 test1261 test1262 test1263 test1264 test1265 test1266 test1267 \
-test1268 \
+test1268 test1269 test1270 test1271 \
 \
 test1280 test1281 test1282 test1283 test1284 test1285 test1286 test1287 \
-test1288 test1289 test1290 test1291 test1292 \
+test1288 test1289 test1290 test1291 test1292 test1293 \
 test1298 test1299 \
 test1300 test1301 test1302 test1303 test1304 test1305 test1306 test1307 \
 test1308 test1309 test1310 test1311 test1312 test1313 test1314 test1315 \
@@ -166,31 +169,29 @@ test1424 test1425 test1426 test1427 \
 test1428 test1429 test1430 test1431 test1432 test1433 test1434 test1435 \
 test1436 test1437 test1438 test1439 test1440 test1441 test1442 test1443 \
 test1444 test1445 test1446 test1447 test1448 test1449 test1450 test1451 \
-test1452 test1453 test1454 test1455 test1456 \
+test1452 test1453 test1454 test1455 test1456 test1457 test1458\
 test1500 test1501 test1502 test1503 test1504 test1505 test1506 test1507 \
 test1508 test1509 test1510 test1511 test1512 test1513 test1514 test1515 \
-test1516 test1517 \
-\
-test1520 test1521 test1522 \
+test1516 test1517 test1518 test1519 test1520 test1521 test1522 test1523 \
 \
 test1525 test1526 test1527 test1528 test1529 test1530 test1531 test1532 \
 test1533 test1534 test1535 test1536 test1537 test1538 \
-test1540 \
+test1540 test1541 \
 test1550 test1551 test1552 test1553 test1554 test1555 test1556 test1557 \
+test1558 test1559 test1560 test1561 test1562 test1563 test1564 test1565 \
 \
-test1560 \
+test1590 test1591 test1592 test1593 test1594 test1595 test1596 \
 \
-test1590 \
 test1600 test1601 test1602 test1603 test1604 test1605 test1606 test1607 \
-test1608 test1609 test1620 \
+test1608 test1609 test1620 test1621 \
 \
-test1650 test1651 \
+test1650 test1651 test1652 test1653 test1654 test1655 \
 \
 test1700 test1701 test1702 \
 \
 test1800 test1801 \
 \
-test1900 test1901 test1902 test1903 test1904 \
+test1900 test1901 test1902 test1903 test1904 test1905 test1906 test1907 \
 \
 test2000 test2001 test2002 test2003 test2004 test2005 test2006 test2007 \
 test2008 test2009 test2010 test2011 test2012 test2013 test2014 test2015 \
@@ -201,7 +202,8 @@ test2040 test2041 test2042 test2043 test2044 test2045 test2046 test2047 \
 test2048 test2049 test2050 test2051 test2052 test2053 test2054 test2055 \
 test2056 test2057 test2058 test2059 test2060 test2061 test2062 test2063 \
 test2064 test2065 test2066 test2067 test2068 test2069 \
-test2070 test2071 test2072 test2073 test2074 test2075 \
+         test2071 test2072 test2073 test2074 test2075 test2076 test2077 \
+test2078 \
 test2080 \
 test2100 \
 \
index 91b1320..53d7da3 100644 (file)
@@ -66,6 +66,7 @@ http
 <features>
 !SSPI
 crypto
+proxy
 </features>
  <name>
 HTTP POST --digest with PUT and resumed upload and modified method
index 83cce6e..5b6ef94 100644 (file)
@@ -65,9 +65,10 @@ http
 <features>
 !SSPI
 crypto
+proxy
 </features>
  <name>
-HTTP POST --digest with PUT and resumed upload and modified method, twice
+HTTP PUT with Digest auth, resumed upload and modified method, twice
  </name>
  <command>
 http://%HOSTIP:%HTTPPORT/1002.upload1 -T log/1002 http://%HOSTIP:%HTTPPORT/1002.upload2 -T log/1002 -u auser:apasswd --digest -x  http://%HOSTIP:%HTTPPORT -C 2 -X GET
@@ -103,6 +104,14 @@ Expect: 100-continue
 st
 GET http://%HOSTIP:%HTTPPORT/1002.upload2 HTTP/1.1\r
 Host: %HOSTIP:%HTTPPORT\r
+Content-Range: bytes 2-4/5\r
+User-Agent: curl/7.16.1\r
+Accept: */*\r
+Proxy-Connection: Keep-Alive\r
+Content-Length: 0\r
+\r
+GET http://%HOSTIP:%HTTPPORT/1002.upload2 HTTP/1.1\r
+Host: %HOSTIP:%HTTPPORT\r
 Authorization: Digest username="auser", realm="testrealm", nonce="1053604144", uri="/1002.upload2", response="d711f0d2042786d930de635ba0d1a1d0"\r
 Content-Range: bytes 2-4/5\r
 User-Agent: curl/7.16.1\r
index 0bc4131..a1ef0dd 100644 (file)
@@ -19,7 +19,7 @@ connection-monitor
 # this is returned first since we get no proxy-auth
 <connect1001>
 HTTP/1.1 407 Authorization Required to proxy me my dear\r
-Proxy-Authenticate: NTLM TlRMTVNTUAACAAAAAgACADAAAAAGgoEAc51AYVDgyNcAAAAAAAAAAG4AbgAyAAAAQ0MCAAQAQwBDAAEAEgBFAEwASQBTAEEAQgBFAFQASAAEABgAYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAwAsAGUAbABpAHMAYQBiAGUAdABoAC4AYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAAAAAA==\r
+Proxy-Authenticate: NTLM TlRMTVNTUAACAAAAAgACADAAAACGggEAc51AYVDgyNcAAAAAAAAAAG4AbgAyAAAAQ0MCAAQAQwBDAAEAEgBFAEwASQBTAEEAQgBFAFQASAAEABgAYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAwAsAGUAbABpAHMAYQBiAGUAdABoAC4AYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAAAAAA==\r
 Transfer-Encoding: chunked\r
 \r
 20\r
@@ -61,7 +61,7 @@ Nice proxy auth sir!
 
 <datacheck>
 HTTP/1.1 407 Authorization Required to proxy me my dear\r
-Proxy-Authenticate: NTLM TlRMTVNTUAACAAAAAgACADAAAAAGgoEAc51AYVDgyNcAAAAAAAAAAG4AbgAyAAAAQ0MCAAQAQwBDAAEAEgBFAEwASQBTAEEAQgBFAFQASAAEABgAYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAwAsAGUAbABpAHMAYQBiAGUAdABoAC4AYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAAAAAA==\r
+Proxy-Authenticate: NTLM TlRMTVNTUAACAAAAAgACADAAAACGggEAc51AYVDgyNcAAAAAAAAAAG4AbgAyAAAAQ0MCAAQAQwBDAAEAEgBFAEwASQBTAEEAQgBFAFQASAAEABgAYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAwAsAGUAbABpAHMAYQBiAGUAdABoAC4AYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAAAAAA==\r
 Transfer-Encoding: chunked\r
 \r
 HTTP/1.1 200 Things are fine in proxy land\r
@@ -86,8 +86,10 @@ http
 </server>
 <features>
 NTLM
+SSL
 !SSPI
 debug
+proxy
 </features>
  <name>
 HTTP proxy CONNECT auth NTLM with chunked-encoded 407 response
@@ -119,7 +121,7 @@ Proxy-Connection: Keep-Alive
 \r
 CONNECT test.remote.example.com.1008:%HTTPPORT HTTP/1.1\r
 Host: test.remote.example.com.1008:%HTTPPORT\r
-Proxy-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAAAAAD2AAAACAAIAPYAAAAIAAgA/gAAAAAAAAAAAAAABoKBAMOv20GsURsat8gdH/RfnYI0MzIxNTMyMeCdd8AzFZLZ/N1ujmilmCcBAQAAAAAAAACAPtXesZ0BNDMyMTUzMjEAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAdGVzdHVzZXJjdXJsaG9zdA==\r
+Proxy-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAACAAIAHAAAAAIAAgAeAAAAAAAAAAAAAAAhoIBADQzMjE1MzIxAAAAAAAAAAAAAAAAAAAAADj3hs3u3j0kgJqCrLM+74BmaoNHDfIJjHRlc3R1c2VyY3VybGhvc3Q=\r
 Proxy-Connection: Keep-Alive\r
 \r
 GET /path/10080002 HTTP/1.1\r
index b2083af..ef073f5 100644 (file)
@@ -49,9 +49,9 @@ PASS ftp@example.com
 PWD\r
 EPSV\r
 TYPE A\r
-LIST /list/this/path/1010/\r
+LIST /list/this/path/1010\r
 EPSV\r
-LIST /list/this/path/1010/\r
+LIST /list/this/path/1010\r
 QUIT\r
 </protocol>
 </verify>
index 4927f9e..01bf100 100644 (file)
@@ -23,7 +23,7 @@ file
 X-Y range on a file:// URL to stdout
  </name>
 <command option="no-include">
--r 1-4 file://localhost/%PWD/log/test1016.txt 
+-r 1-4 file://localhost%FILE_PWD/log/test1016.txt 
 </command>
 <file name="log/test1016.txt">
 1234567890
index cfdd80f..9790d77 100644 (file)
@@ -24,7 +24,7 @@ file
 0-Y range on a file:// URL to stdout
  </name>
 <command option="no-include">
--r 0-3 file://localhost/%PWD/log/test1017.txt 
+-r 0-3 file://localhost%FILE_PWD/log/test1017.txt 
 </command>
 <file name="log/test1017.txt">
 1234567890
index 5748701..ddf1f25 100644 (file)
@@ -23,7 +23,7 @@ file
 X-X range on a file:// URL to stdout
  </name>
 <command option="no-include">
--r 4-4 file://localhost/%PWD/log/test1018.txt 
+-r 4-4 file://localhost%FILE_PWD/log/test1018.txt 
 </command>
 <file name="log/test1018.txt">
 1234567890
index 054e38d..2a92ae5 100644 (file)
@@ -24,7 +24,7 @@ file
 X- range on a file:// URL to stdout
  </name>
 <command option="no-include">
--r 7- file://localhost/%PWD/log/test1019.txt 
+-r 7- file://localhost%FILE_PWD/log/test1019.txt 
 </command>
 <file name="log/test1019.txt">
 1234567890
index 8e03a17..0d88532 100644 (file)
@@ -24,7 +24,7 @@ file
 -Y range on a file:// URL to stdout
  </name>
 <command option="no-include">
--r -9 file://localhost/%PWD/log/test1020.txt 
+-r -9 file://localhost%FILE_PWD/log/test1020.txt 
 </command>
 <file name="log/test1020.txt">
 1234567890
index 85845a5..84d1e62 100644 (file)
@@ -24,7 +24,7 @@ data to discard
 # this is returned first since we get no proxy-auth
 <connect1001>
 HTTP/1.1 407 Authorization Required to proxy me my dear\r
-Proxy-Authenticate: NTLM TlRMTVNTUAACAAAAAgACADAAAAAGgoEAc51AYVDgyNcAAAAAAAAAAG4AbgAyAAAAQ0MCAAQAQwBDAAEAEgBFAEwASQBTAEEAQgBFAFQASAAEABgAYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAwAsAGUAbABpAHMAYQBiAGUAdABoAC4AYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAAAAAA==\r
+Proxy-Authenticate: NTLM TlRMTVNTUAACAAAAAgACADAAAACGggEAc51AYVDgyNcAAAAAAAAAAG4AbgAyAAAAQ0MCAAQAQwBDAAEAEgBFAEwASQBTAEEAQgBFAFQASAAEABgAYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAwAsAGUAbABpAHMAYQBiAGUAdABoAC4AYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAAAAAA==\r
 Content-Length: 28\r
 
 27 bytes and newline to ign
@@ -66,7 +66,7 @@ Content-Length: 16
 Connection: close\r
 
 HTTP/1.1 407 Authorization Required to proxy me my dear\r
-Proxy-Authenticate: NTLM TlRMTVNTUAACAAAAAgACADAAAAAGgoEAc51AYVDgyNcAAAAAAAAAAG4AbgAyAAAAQ0MCAAQAQwBDAAEAEgBFAEwASQBTAEEAQgBFAFQASAAEABgAYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAwAsAGUAbABpAHMAYQBiAGUAdABoAC4AYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAAAAAA==\r
+Proxy-Authenticate: NTLM TlRMTVNTUAACAAAAAgACADAAAACGggEAc51AYVDgyNcAAAAAAAAAAG4AbgAyAAAAQ0MCAAQAQwBDAAEAEgBFAEwASQBTAEEAQgBFAFQASAAEABgAYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAwAsAGUAbABpAHMAYQBiAGUAdABoAC4AYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAAAAAA==\r
 Content-Length: 28\r
 
 HTTP/1.1 200 Things are fine in proxy land\r
@@ -91,8 +91,10 @@ http
 </server>
 <features>
 NTLM
+SSL
 !SSPI
 debug
+proxy
 </features>
  <name>
 HTTP proxy CONNECT with any proxyauth and proxy offers NTLM and close
@@ -128,7 +130,7 @@ Proxy-Connection: Keep-Alive
 \r
 CONNECT test.remote.example.com.1021:%HTTPPORT HTTP/1.1\r
 Host: test.remote.example.com.1021:%HTTPPORT\r
-Proxy-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAAAAAD2AAAACAAIAPYAAAAIAAgA/gAAAAAAAAAAAAAABoKBAMOv20GsURsat8gdH/RfnYI0MzIxNTMyMeCdd8AzFZLZ/N1ujmilmCcBAQAAAAAAAACAPtXesZ0BNDMyMTUzMjEAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAdGVzdHVzZXJjdXJsaG9zdA==\r
+Proxy-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAACAAIAHAAAAAIAAgAeAAAAAAAAAAAAAAAhoIBADQzMjE1MzIxAAAAAAAAAAAAAAAAAAAAADj3hs3u3j0kgJqCrLM+74BmaoNHDfIJjHRlc3R1c2VyY3VybGhvc3Q=\r
 Proxy-Connection: Keep-Alive\r
 \r
 GET /path/10210002 HTTP/1.1\r
index bd5dc9c..6bda7a4 100644 (file)
@@ -28,7 +28,7 @@ curl --manual
 # Search for these two sentinel lines in the manual output; if they are found,
 # then chances are good the entire manual is there.
 <postcheck>
-perl -e 'open(IN,$ARGV[0]); my $lines=grep(/(a\s*tool\s*to\s*transfer\s*data)|(mailing\s*lists\s*to\s*discuss\s*curl)/, <IN>); exit ($lines != 2); # Let this file pass an XML syntax check: </IN>' log/stdout1026
+perl -e 'open(IN,$ARGV[0]); my $lines=grep(/(curl\s*-\s*transfer\sa\s*URL)|(CONTRIBUTORS)/, <IN>); exit ($lines != 2); # Let this file pass an XML syntax check: </IN>' log/stdout1026
 </postcheck>
 </client>
 
index beab0d3..b4ffc8a 100644 (file)
@@ -1,3 +1,4 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
 <testcase>
 <info>
 <keywords>
index bc4e5c2..e86e132 100644 (file)
@@ -40,7 +40,7 @@ HTTP-IPv6 GET with numeric localhost --interface
 </command>
 # --interface doesn't accept an address surrounded by [] so %CLIENT6IP is out
 <precheck>
-perl -e "print 'Test requires default test server host address' if ( '%CLIENT6IP' ne '[::1]' );"
+perl -e "print 'Test requires default test client host address' if ( '%CLIENT6IP' ne '[::1]' );"
 </precheck>
 </client>
 
index f94ae58..5ed267b 100644 (file)
@@ -48,7 +48,7 @@ FTP-IPv6 dir list PASV with localhost --interface
 </command>
 # --interface doesn't accept an address surrounded by [] so %CLIENT6IP is out
 <precheck>
-perl -e "print 'Test requires default test server host address' if ( '%CLIENT6IP' ne '[::1]' );"
+perl -e "print 'Test requires default test client host address' if ( '%CLIENT6IP' ne '[::1]' );"
 </precheck>
 </client>
 
index a0e5bea..281936b 100644 (file)
@@ -43,7 +43,7 @@ FTP-IPv6 dir list, EPRT with specified IP
 </command>
 # --interface doesn't accept an address surrounded by [] so %CLIENT6IP is out
 <precheck>
-perl -e "print 'Test requires default test server host address' if ( '%CLIENT6IP' ne '[::1]' );"
+perl -e "print 'Test requires default test client host address' if ( '%CLIENT6IP' ne '[::1]' );"
 </precheck>
 </client>
 
index 6820ea6..615e625 100644 (file)
@@ -26,6 +26,7 @@ Content-Length: 0
 <client>
 <features>
 ftp
+proxy
 </features>
 <server>
 http
index 14fc7e5..c4b264c 100644 (file)
@@ -869,6 +869,7 @@ http
 <features>
 !SSPI
 crypto
+proxy
 </features>
  <name>
 HTTP proxy CONNECT auth Digest, large headers and data
index c481d39..6ddddfe 100644 (file)
@@ -874,6 +874,7 @@ http
 <features>
 !SSPI
 crypto
+proxy
 </features>
  <name>
 HTTP proxy CONNECT auth Digest, large headers and chunked data
index 2979094..de2085d 100644 (file)
@@ -28,7 +28,7 @@ Invalid large X- range on a file://
 # This range value is 2**32+7, which will be truncated to the valid value 7
 # if the large file support is not working correctly
  <command>
--r 4294967303- file://localhost/%PWD/log/test1063.txt 
+-r 4294967303- file://localhost%FILE_PWD/log/test1063.txt 
 </command>
 <file name="log/test1063.txt">
 1234567890
index a3c9024..e917e8a 100644 (file)
@@ -44,6 +44,7 @@ http
 </server>
 <features>
 ftp
+proxy
 </features>
  <name>
 FTP over HTTP proxy with downgrade to HTTP 1.0
index a9bb771..d705dbc 100644 (file)
@@ -45,6 +45,9 @@ HTTP 1.0 CONNECT with proxytunnel and downgrade GET to HTTP/1.0
  <command>
 --proxy1.0 %HOSTIP:%PROXYPORT -p http://%HOSTIP.1078:%HTTPPORT/we/want/that/page/1078 http://%HOSTIP.1078:%HTTPPORT/we/want/that/page/1078
 </command>
+<features>
+proxy
+</features>
 </client>
 
 #
index d58dd25..8e4078b 100644 (file)
@@ -35,7 +35,7 @@ HTTP GET with localhost --interface
 http://%HOSTIP:%HTTPPORT/1082 --interface localhost
 </command>
 <precheck>
-perl -e "print 'Test requires default test server host address' if ( '%CLIENTIP' ne '127.0.0.1' );"
+perl -e "print 'Test requires default test client host address' if ( '%CLIENTIP' ne '127.0.0.1' );"
 </precheck>
 </client>
 
index e441278..1b1db05 100644 (file)
@@ -39,7 +39,7 @@ HTTP-IPv6 GET with ip6-localhost --interface
 -g "http://%HOST6IP:%HTTP6PORT/1083" --interface ip6-localhost
 </command>
 <precheck>
-perl -e "if ('%CLIENT6IP' ne '[::1]') {print 'Test requires default test server host address';} else {exec './server/resolve --ipv6 ip6-localhost'; print 'Cannot run precheck resolve';}"
+perl -e "if ('%CLIENT6IP' ne '[::1]') {print 'Test requires default test client host address';} else {exec './server/resolve --ipv6 ip6-localhost'; print 'Cannot run precheck resolve';}"
 </precheck>
 </client>
 
index d228976..883d986 100644 (file)
@@ -80,6 +80,9 @@ HTTP, proxy with --anyauth and Location: to new host
  <command>
 http://first.host.it.is/we/want/that/page/10871000 -x %HOSTIP:%HTTPPORT --user iam:myself --location --anyauth
 </command>
+<features>
+proxy
+</features>
 </client>
 
 #
index a807ce9..f2b6fc2 100644 (file)
@@ -81,6 +81,9 @@ HTTP, proxy with --anyauth and Location: to new host using location-trusted
  <command>
 http://first.host.it.is/we/want/that/page/10881000 -x %HOSTIP:%HTTPPORT --user iam:myself --location-trusted --anyauth
 </command>
+<features>
+proxy
+</features>
 </client>
 
 #
index f3ce860..2466933 100644 (file)
@@ -34,7 +34,8 @@ FTP URL with type=i
 USER anonymous\r
 PASS ftp@example.com\r
 PWD\r
-CWD /tmp\r
+CWD /\r
+CWD tmp\r
 CWD moo\r
 EPSV\r
 TYPE I\r
index adef432..725a274 100644 (file)
@@ -30,6 +30,7 @@ http
 </server>
 <features>
 ftp
+proxy
 </features>
  <name>
 FTP with type=i over HTTP proxy
index 7512a2e..70a8990 100644 (file)
@@ -45,6 +45,7 @@ https
 </server>
 <features>
 NTLM
+SSL
 !SSPI
 </features>
  <name>
@@ -60,7 +61,7 @@ http://test.a.galaxy.far.far.away.1097:%HTTPPORT/1097 --proxy http://%HOSTIP:%HT
 <strip>
 ^User-Agent: curl/.*
 </strip>
-<protocol>
+<protocol nonewline="yes">
 CONNECT test.a.galaxy.far.far.away.1097:%HTTPPORT HTTP/1.1\r
 Host: test.a.galaxy.far.far.away.1097:%HTTPPORT\r
 Proxy-Authorization: NTLM TlRMTVNTUAABAAAABoIIAAAAAAAAAAAAAAAAAAAAAAA=\r
@@ -71,9 +72,10 @@ POST /1097 HTTP/1.1
 User-Agent: curl/7.19.5-CVS (i686-pc-linux-gnu) libcurl/7.19.5-CVS OpenSSL/0.9.8g zlib/1.2.3.3 c-ares/1.6.1-CVS libidn/1.12 libssh2/1.0.1_CVS\r
 Host: test.a.galaxy.far.far.away.1097:%HTTPPORT\r
 Accept: */*\r
-Content-Length: 0\r
+Content-Length: 11\r
 Content-Type: application/x-www-form-urlencoded\r
 \r
+dummy=value
 </protocol>
 
 </verify>
index 9805648..0d39734 100644 (file)
@@ -29,6 +29,7 @@ http
 <features>
 http
 ftp
+proxy
 </features>
  <name>
 FTP RETR twice over proxy confirming persistent connection
index 2e8d761..101b1e7 100644 (file)
@@ -21,7 +21,7 @@ HTTP/1.1 401 Now gimme that second request of crap
 Server: Microsoft-IIS/5.0\r
 Content-Type: text/html; charset=iso-8859-1\r
 Content-Length: 34\r
-WWW-Authenticate: NTLM TlRMTVNTUAACAAAAAgACADAAAAAGgoEAc51AYVDgyNcAAAAAAAAAAG4AbgAyAAAAQ0MCAAQAQwBDAAEAEgBFAEwASQBTAEEAQgBFAFQASAAEABgAYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAwAsAGUAbABpAHMAYQBiAGUAdABoAC4AYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAAAAAA==\r
+WWW-Authenticate: NTLM TlRMTVNTUAACAAAAAgACADAAAACGggEAc51AYVDgyNcAAAAAAAAAAG4AbgAyAAAAQ0MCAAQAQwBDAAEAEgBFAEwASQBTAEEAQgBFAFQASAAEABgAYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAwAsAGUAbABpAHMAYQBiAGUAdABoAC4AYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAAAAAA==\r
 \r
 This is not the real page either!
 </data1001>
@@ -43,7 +43,7 @@ HTTP/1.1 401 Now gimme that second request of crap
 Server: Microsoft-IIS/5.0\r
 Content-Type: text/html; charset=iso-8859-1\r
 Content-Length: 34\r
-WWW-Authenticate: NTLM TlRMTVNTUAACAAAAAgACADAAAAAGgoEAc51AYVDgyNcAAAAAAAAAAG4AbgAyAAAAQ0MCAAQAQwBDAAEAEgBFAEwASQBTAEEAQgBFAFQASAAEABgAYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAwAsAGUAbABpAHMAYQBiAGUAdABoAC4AYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAAAAAA==\r
+WWW-Authenticate: NTLM TlRMTVNTUAACAAAAAgACADAAAACGggEAc51AYVDgyNcAAAAAAAAAAG4AbgAyAAAAQ0MCAAQAQwBDAAEAEgBFAEwASQBTAEEAQgBFAFQASAAEABgAYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAwAsAGUAbABpAHMAYQBiAGUAdABoAC4AYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAAAAAA==\r
 \r
 HTTP/1.1 302 Thanks for this, but we want to redir you!\r
 Server: Microsoft-IIS/5.0\r
@@ -63,6 +63,7 @@ This is the final page !
 <client>
 <features>
 NTLM
+SSL
 !SSPI
 debug
 </features>
@@ -102,7 +103,7 @@ Content-Type: application/x-www-form-urlencoded
 \r
 POST /1100 HTTP/1.1\r
 Host: %HOSTIP:%HTTPPORT\r
-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAAAAAD2AAAACAAIAPYAAAAIAAgA/gAAAAAAAAAAAAAABoKBAMOv20GsURsat8gdH/RfnYI0MzIxNTMyMeCdd8AzFZLZ/N1ujmilmCcBAQAAAAAAAACAPtXesZ0BNDMyMTUzMjEAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAdGVzdHVzZXJjdXJsaG9zdA==\r
+Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAACAAIAHAAAAAIAAgAeAAAAAAAAAAAAAAAhoIBADQzMjE1MzIxAAAAAAAAAAAAAAAAAAAAADj3hs3u3j0kgJqCrLM+74BmaoNHDfIJjHRlc3R1c2VyY3VybGhvc3Q=\r
 User-Agent: curl/7.10.6-pre1 (i686-pc-linux-gnu) libcurl/7.10.6-pre1 OpenSSL/0.9.7a ipv6 zlib/1.1.3\r
 Accept: */*\r
 Content-Length: 18\r
index 102d522..e66da58 100644 (file)
@@ -16,7 +16,7 @@ Date: Thu, 09 Nov 2010 14:49:00 GMT
 Location: /want/data/11040002
 Server: test-server/fake
 Set-Cookie: test=true; domain=127.0.0.1; path=/; expires=Thu Jan  1 00:00:00 GMT 1970;
-Set-Cookie: test2=true; domain=127.0.0.1; path=/; expires=Fri Feb 2 11:56:27 GMT 2035;
+Set-Cookie: test2=true; domain=127.0.0.1; path=/; expires=Fri Feb 13 11:56:27 GMT 2037;
 Connection: close
 
 This server reply is for testing a set-cookie
@@ -37,7 +37,7 @@ Date: Thu, 09 Nov 2010 14:49:00 GMT
 Location: /want/data/11040002
 Server: test-server/fake
 Set-Cookie: test=true; domain=127.0.0.1; path=/; expires=Thu Jan  1 00:00:00 GMT 1970;
-Set-Cookie: test2=true; domain=127.0.0.1; path=/; expires=Fri Feb 2 11:56:27 GMT 2035;
+Set-Cookie: test2=true; domain=127.0.0.1; path=/; expires=Fri Feb 13 11:56:27 GMT 2037;
 Connection: close
 
 HTTP/1.1 200 Followed here fine swsclose
@@ -61,6 +61,9 @@ HTTP cookie expiry date at Jan 1 00:00:00 GMT 1970
  <command>
 http://%HOSTIP:%HTTPPORT/want/1104 -L -x %HOSTIP:%HTTPPORT -c log/cookies1104.jar
 </command>
+<features>
+proxy
+</features>
 </client>
 
 # Verify data after the test has been "shot"
index 0c6bec1..37a77e3 100644 (file)
@@ -24,6 +24,7 @@ hello
 <client>
 <features>
 ftp
+proxy
 </features>
 <server>
 http
index d71155e..737f9d9 100644 (file)
@@ -29,7 +29,7 @@ HTTP RFC1867-type formposting with filename/data contains ',', ';', '"'
 http://%HOSTIP:%HTTPPORT/we/want/1133 -F "file=@\"log/test1133,and;.txt\";type=mo/foo;filename=\"faker,and;.txt\"" -F 'file2=@"log/test1133,and;.txt"' -F 'file3=@"log/test1133,and;.txt";type=m/f,"log/test1133,and;.txt"' -F a="{\"field1\":\"value1\",\"field2\":\"value2\"}" -F 'b=" \\value1;type=\"whatever\" "; type=text/foo; charset=utf-8 ; filename=param_b'
 </command>
 # We create this file before the command is invoked!
-<file name=log/test1133,and;.txt>
+<file name="log/test1133,and;.txt">
 foo bar
 This is a bar foo
 bar
index 3591a54..37a5542 100644 (file)
@@ -91,6 +91,8 @@ CURL_EXTERN CURLMcode curl_multi_add_handle(CURLM *multi_handle,
 CURL_EXTERN CURLMcode curl_multi_remove_handle(CURLM *multi_handle,
 CURL_EXTERN CURLMcode curl_multi_fdset(CURLM *multi_handle,
 CURL_EXTERN CURLMcode curl_multi_wait(CURLM *multi_handle,
+CURL_EXTERN CURLMcode curl_multi_poll(CURLM *multi_handle,
+CURL_EXTERN CURLMcode curl_multi_wakeup(CURLM *multi_handle);
 CURL_EXTERN CURLMcode curl_multi_perform(CURLM *multi_handle,
 CURL_EXTERN CURLMcode curl_multi_cleanup(CURLM *multi_handle);
 CURL_EXTERN CURLMsg *curl_multi_info_read(CURLM *multi_handle,
index e18a923..75b6ee8 100644 (file)
@@ -33,6 +33,7 @@ boo
 <client>
 <features>
 PSL
+proxy
 </features>
 <server>
 http
index 9c41d39..b0cff8e 100644 (file)
@@ -47,6 +47,9 @@ HTTP redirect to http:/// (three slashes!)
  <command>
 %HOSTIP:%HTTPPORT/want/1141 -L -x http://%HOSTIP:%HTTPPORT
 </command>
+<features>
+proxy
+</features>
 </client>
 
 # Verify data after the test has been "shot"
index 76c6bdf..5f1e2b3 100644 (file)
@@ -42,6 +42,9 @@ HTTP redirect to http://// (four slashes!)
  <command>
 %HOSTIP:%HTTPPORT/want/1142 -L -x http://%HOSTIP:%HTTPPORT
 </command>
+<features>
+proxy
+</features>
 </client>
 
 # Verify data after the test has been "shot"
index 3fb9093..84c22db 100644 (file)
@@ -3,6 +3,7 @@
 <keywords>
 HTTP
 HTTP HEAD
+HTTP/0.9
 </keywords>
 </info>
 
@@ -46,7 +47,7 @@ http
 HTTP HEAD, receive no headers only body
  </name>
  <command>
--I http://%HOSTIP:%HTTPPORT/1144
+-I http://%HOSTIP:%HTTPPORT/1144 --http0.9
 </command>
 </client>
 
index ae081a8..f0c297d 100644 (file)
@@ -1,5 +1,5 @@
-# based on test1010
 <testcase>
+# based on test1010
 <info>
 <keywords>
 FTP
@@ -57,7 +57,7 @@ TYPE A
 LIST\r
 CWD /\r
 EPSV\r
-LIST list/this/path/1149/\r
+LIST list/this/path/1149\r
 QUIT\r
 </protocol>
 </verify>
index ecd95d5..e86c7e1 100644 (file)
@@ -32,6 +32,9 @@ HTTP proxy with URLs using different ports
  <command>
 --proxy http://%HOSTIP:%HTTPPORT http://test.remote.example.com.1150:150/path http://test.remote.example.com.1150:1234/path/
 </command>
+<features>
+proxy
+</features>
 </client>
 
 # Verify data after the test has been "shot"
index 9bf3254..3db824d 100644 (file)
@@ -14,7 +14,7 @@ cookies
 HTTP/1.1 200 OK\r
 Date: Thu, 09 Nov 2010 14:49:00 GMT\r
 Content-Length: 0\r
-Set-Cookie: domain=value;secure;path=/
+Set-Cookie: domain=value;path=/
 \r
 </data>
 </reply>
@@ -48,7 +48,7 @@ Accept: */*
 # https://curl.haxx.se/docs/http-cookies.html
 # This file was generated by libcurl! Edit at your own risk.
 
-127.0.0.1      FALSE   /       TRUE    0       domain  value
+127.0.0.1      FALSE   /       FALSE   0       domain  value
 </file>
 </verify>
 </testcase>
index fb48362..f78dc99 100644 (file)
@@ -67,4 +67,5 @@ http://%HOSTIP:%HTTPPORT/want/1156
 <errorcode>
 0
 </errorcode>
+</verify>
 </testcase>
diff --git a/tests/data/test1159 b/tests/data/test1159
new file mode 100644 (file)
index 0000000..a516016
--- /dev/null
@@ -0,0 +1,58 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+HTTP GET
+redirect_url
+followlocation
+--write-out
+</keywords>
+</info>
+
+# Server-side
+<reply>
+<data nocheck="yes">
+HTTP/1.1 301 This is a weirdo text message swsclose\r
+Location: ht3p://localhost/\r
+Content-Length: 62\r
+Connection: close\r
+\r
+This server reply is for testing a simple Location: following
+</data>
+</reply>
+
+# Client-side
+<client>
+<server>
+http
+</server>
+ <name>
+HTTP Location: and 'redirect_url' with non-supported scheme
+ </name>
+<command>
+http://%HOSTIP:%HTTPPORT/we/want/our/1159 -w '%{redirect_url}\n'
+</command>
+</client>
+
+# Verify data after the test has been "shot"
+<verify>
+<strip>
+^User-Agent:.*
+</strip>
+<protocol>
+GET /we/want/our/1159 HTTP/1.1\r
+Host: %HOSTIP:%HTTPPORT\r
+Accept: */*\r
+\r
+</protocol>
+<stdout>
+HTTP/1.1 301 This is a weirdo text message swsclose\r
+Location: ht3p://localhost/\r
+Content-Length: 62\r
+Connection: close\r
+\r
+This server reply is for testing a simple Location: following
+ht3p://localhost/
+</stdout>
+</verify>
+</testcase>
index 26a758c..63dd0a7 100644 (file)
@@ -1,3 +1,4 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
 <testcase>
 <info>
 <keywords>
@@ -43,7 +44,11 @@ Host: %HOSTIP:%HTTPPORT
 Accept: */*\r
 \r
 </protocol>
-<file name="log/cookies1160.txt">
+<file name="log/cookies1160.txt" mode="text">
+# Netscape HTTP Cookie File
+# https://curl.haxx.se/docs/http-cookies.html
+# This file was generated by libcurl! Edit at your own risk.
+
 </file>
 </verify>
 </testcase>
index 73e4646..b6b3941 100644 (file)
@@ -31,6 +31,10 @@ FTP wildcard with crazy pattern
 <command>
 "ftp://%HOSTIP:%FTPPORT/fully_simulated/DOS/[*\\s-'tl"
 </command>
+<setenv>
+# Needed for MSYS2 to not convert backslash to forward slash
+MSYS2_ARG_CONV_EXCL=ftp://
+</setenv>
 </client>
 <verify>
 <protocol>
index be83aa4..a5ce6d1 100644 (file)
@@ -29,7 +29,7 @@ http
 HTTP/0.9 GET and all zeroes
  </name>
  <command option="force-output">
-http://%HOSTIP:%HTTPPORT/1164 -w '%{size_download}\n'
+http://%HOSTIP:%HTTPPORT/1164 -w '%{size_download}\n' --http0.9
 </command>
 </client>
 
diff --git a/tests/data/test1165 b/tests/data/test1165
new file mode 100644 (file)
index 0000000..24c1c3e
--- /dev/null
@@ -0,0 +1,25 @@
+<testcase>
+<info>
+<keywords>
+source analysis
+CURL_DISABLE
+</keywords>
+</info>
+
+#
+# Client-side
+<client>
+<server>
+none
+</server>
+
+ <name>
+Verify configure.ac and source code CURL_DISABLE_-sync
+ </name>
+
+<command type="perl">
+%SRCDIR/disable-scan.pl %SRCDIR/..
+</command>
+</client>
+
+</testcase>
diff --git a/tests/data/test1166 b/tests/data/test1166
new file mode 100644 (file)
index 0000000..3cae80e
--- /dev/null
@@ -0,0 +1,53 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+HTTP GET
+followlocation
+cookies
+</keywords>
+</info>
+
+# Server-side
+<reply>
+<data>
+HTTP/1.1 200 OK\r
+Date: Thu, 09 Nov 2010 14:49:00 GMT\r
+Server: test-server/fake\r
+Set-Cookie: trackyou=want; path=/\r
+Content-Length: 68\r
+\r
+This server reply is for testing a Location: following with cookies
+</data>
+</reply>
+
+# Client-side
+<client>
+<server>
+http
+</server>
+ <name>
+HTTP response with cookies but not receiving!
+ </name>
+ <command>
+http://%HOSTIP:%HTTPPORT/want/1166 http://%HOSTIP:%HTTPPORT/want/1166
+</command>
+</client>
+
+# Verify data after the test has been "shot"
+<verify>
+<strip>
+^User-Agent:.*
+</strip>
+<protocol>
+GET /want/1166 HTTP/1.1\r
+Host: %HOSTIP:%HTTPPORT\r
+Accept: */*\r
+\r
+GET /want/1166 HTTP/1.1\r
+Host: %HOSTIP:%HTTPPORT\r
+Accept: */*\r
+\r
+</protocol>
+</verify>
+</testcase>
diff --git a/tests/data/test1172 b/tests/data/test1172
new file mode 100644 (file)
index 0000000..6e61720
--- /dev/null
@@ -0,0 +1,50 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+HTTP/0.9
+</keywords>
+</info>
+
+#
+# Server-side
+<reply>
+<data>
+-foo- swsclose
+</data>
+<datacheck>
+</datacheck>
+</reply>
+
+#
+# Client-side
+<client>
+<server>
+http
+</server>
+ <name>
+HTTP/0.9 GET response denied
+ </name>
+ <command>
+http://%HOSTIP:%HTTPPORT/1172 --no-http0.9
+</command>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<strip>
+^User-Agent:.*
+</strip>
+<protocol>
+GET /1172 HTTP/1.1\r
+Host: %HOSTIP:%HTTPPORT\r
+Accept: */*\r
+\r
+</protocol>
+# unsupported protocol
+<errorcode>
+1
+</errorcode>
+</verify>
+</testcase>
diff --git a/tests/data/test1173 b/tests/data/test1173
new file mode 100644 (file)
index 0000000..dd09f81
--- /dev/null
@@ -0,0 +1,26 @@
+<testcase>
+<info>
+<keywords>
+source analysis
+documentation
+--manual
+</keywords>
+</info>
+
+#
+# Client-side
+<client>
+<server>
+none
+</server>
+
+ <name>
+Basic man page syntax check
+ </name>
+
+<command type="perl">
+%SRCDIR/manpage-syntax.pl %SRCDIR/../docs/*.1  %SRCDIR/../docs/libcurl/*.3 %SRCDIR/../docs/libcurl/opts/*.3
+</command>
+</client>
+
+</testcase>
diff --git a/tests/data/test1174 b/tests/data/test1174
new file mode 100644 (file)
index 0000000..b316fde
--- /dev/null
@@ -0,0 +1,50 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+HTTP/0.9
+</keywords>
+</info>
+
+#
+# Server-side
+<reply>
+<data>
+-foo- swsclose
+</data>
+<datacheck>
+</datacheck>
+</reply>
+
+#
+# Client-side
+<client>
+<server>
+http
+</server>
+ <name>
+HTTP/0.9 GET response denied by default
+ </name>
+ <command>
+http://%HOSTIP:%HTTPPORT/1174
+</command>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<strip>
+^User-Agent:.*
+</strip>
+<protocol>
+GET /1174 HTTP/1.1\r
+Host: %HOSTIP:%HTTPPORT\r
+Accept: */*\r
+\r
+</protocol>
+# unsupported protocol
+<errorcode>
+1
+</errorcode>
+</verify>
+</testcase>
diff --git a/tests/data/test1175 b/tests/data/test1175
new file mode 100644 (file)
index 0000000..61f0689
--- /dev/null
@@ -0,0 +1,25 @@
+<testcase>
+<info>
+<keywords>
+source analysis
+symbols-in-versions
+</keywords>
+</info>
+
+#
+# Client-side
+<client>
+<server>
+none
+</server>
+
+ <name>
+Verify that symbols-in-versions and libcurl-errors.3 are in sync
+ </name>
+
+<command type="perl">
+%SRCDIR/error-codes.pl %SRCDIR
+</command>
+</client>
+
+</testcase>
index 81a9fe4..29a059a 100644 (file)
@@ -25,7 +25,7 @@ gopher
 Gopher selector
  </name>
  <command>
-gopher://%HOSTIP:%GOPHERPORT/1/selector/SELECTOR/1201
+gopher://%HOSTIP:%GOPHERPORT/1/selector/SELECTOR/1201?
 </command>
 </client>
 
@@ -33,7 +33,7 @@ gopher://%HOSTIP:%GOPHERPORT/1/selector/SELECTOR/1201
 # Verify data after the test has been "shot"
 <verify>
 <protocol>
-/selector/SELECTOR/1201\r
+/selector/SELECTOR/1201?\r
 </protocol>
 </verify>
 </testcase>
index 4f22f0d..46a6938 100644 (file)
@@ -35,6 +35,9 @@ HTTP with proxy and host-only URL
  <command>
 -x %HOSTIP:%HTTPPORT we.want.that.site.com.1213
 </command>
+<features>
+proxy
+</features>
 </client>
 
 # Verify data after the test has been "shot"
index 3eeb3e3..73c799a 100644 (file)
@@ -35,6 +35,9 @@ HTTP with proxy and URL with ? and no slash separator
  <command>
 -x %HOSTIP:%HTTPPORT http://we.want.that.site.com.1214?moo=foo
 </command>
+<features>
+proxy
+</features>
 </client>
 
 # Verify data after the test has been "shot"
index 262910a..ed50da0 100644 (file)
@@ -21,7 +21,7 @@ HTTP/1.1 401 Now gimme that second request of crap
 Server: Microsoft-IIS/5.0
 Content-Type: text/html; charset=iso-8859-1
 Content-Length: 34
-WWW-Authenticate: NTLM TlRMTVNTUAACAAAAAgACADAAAAAGgoEAc51AYVDgyNcAAAAAAAAAAG4AbgAyAAAAQ0MCAAQAQwBDAAEAEgBFAEwASQBTAEEAQgBFAFQASAAEABgAYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAwAsAGUAbABpAHMAYQBiAGUAdABoAC4AYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAAAAAA==
+WWW-Authenticate: NTLM TlRMTVNTUAACAAAAAgACADAAAACGggEAc51AYVDgyNcAAAAAAAAAAG4AbgAyAAAAQ0MCAAQAQwBDAAEAEgBFAEwASQBTAEEAQgBFAFQASAAEABgAYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAwAsAGUAbABpAHMAYQBiAGUAdABoAC4AYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAAAAAA==
 
 This is not the real page either!
 </data1001>
@@ -42,7 +42,7 @@ HTTP/1.1 401 Now gimme that second request of crap
 Server: Microsoft-IIS/5.0
 Content-Type: text/html; charset=iso-8859-1
 Content-Length: 34
-WWW-Authenticate: NTLM TlRMTVNTUAACAAAAAgACADAAAAAGgoEAc51AYVDgyNcAAAAAAAAAAG4AbgAyAAAAQ0MCAAQAQwBDAAEAEgBFAEwASQBTAEEAQgBFAFQASAAEABgAYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAwAsAGUAbABpAHMAYQBiAGUAdABoAC4AYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAAAAAA==
+WWW-Authenticate: NTLM TlRMTVNTUAACAAAAAgACADAAAACGggEAc51AYVDgyNcAAAAAAAAAAG4AbgAyAAAAQ0MCAAQAQwBDAAEAEgBFAEwASQBTAEEAQgBFAFQASAAEABgAYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAwAsAGUAbABpAHMAYQBiAGUAdABoAC4AYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAAAAAA==
 
 HTTP/1.1 200 Things are fine in server land swsclose
 Server: Microsoft-IIS/5.0
@@ -58,8 +58,10 @@ Finally, this is the real page!
 <client>
 <features>
 NTLM
+SSL
 !SSPI
 debug
+proxy
 </features>
 <server>
 http
@@ -96,7 +98,7 @@ Proxy-Connection: Keep-Alive
 \r
 GET http://%HOSTIP:%HTTPPORT/1215 HTTP/1.1\r
 Host: %HOSTIP:%HTTPPORT\r
-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAAAAAD2AAAACAAIAPYAAAAIAAgA/gAAAAAAAAAAAAAABoKBAMOv20GsURsat8gdH/RfnYI0MzIxNTMyMeCdd8AzFZLZ/N1ujmilmCcBAQAAAAAAAACAPtXesZ0BNDMyMTUzMjEAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAdGVzdHVzZXJjdXJsaG9zdA==\r
+Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAACAAIAHAAAAAIAAgAeAAAAAAAAAAAAAAAhoIBADQzMjE1MzIxAAAAAAAAAAAAAAAAAAAAADj3hs3u3j0kgJqCrLM+74BmaoNHDfIJjHRlc3R1c2VyY3VybGhvc3Q=\r
 User-Agent: curl/7.30.0-DEV\r
 Accept: */*\r
 Proxy-Connection: Keep-Alive\r
index be0f5c7..c4f977b 100644 (file)
@@ -39,6 +39,9 @@ example.fake  FALSE   /b      FALSE   0               moo1    indeed
 example.fake   FALSE   /c      FALSE   2139150993      moo2    indeed
 example.fake   TRUE    /c      FALSE   2139150993      moo3    indeed
 </file>
+<features>
+proxy
+</features>
 </client>
 
 # Verify data after the test has been "shot"
index e3f1f6d..37c8f4e 100644 (file)
@@ -32,6 +32,9 @@ HTTP cookies and domains with same prefix
  <command>
 http://example.fake/c/1218 http://example.fake/c/1218 http://bexample.fake/c/1218 -b nonexisting -x %HOSTIP:%HTTPPORT
 </command>
+<features>
+proxy
+</features>
 </client>
 
 # Verify data after the test has been "shot"
index 6752eb5..c8eb52c 100644 (file)
@@ -21,7 +21,7 @@ file
 file:// URLs with query string
  </name>
 <command option="no-include">
-file://localhost/%PWD/log/test1220.txt?a_query=foobar#afragment
+file://localhost%FILE_PWD/log/test1220.txt?a_query=foobar#afragment
 </command>
 <file name="log/test1220.txt">
 contents in a single file
index 261cb8c..15700f4 100644 (file)
@@ -17,7 +17,7 @@ none
 10 chars object name generation testing
 </name>
 <command option="no-output,no-include" type="shell">
-%SRCDIR/../lib/objnames-test10.sh %SRCDIR
+%SRCDIR/objnames-test10.sh %SRCDIR
 </command>
 </client>
 
index 51edc97..5eab55b 100644 (file)
@@ -17,7 +17,7 @@ none
 8 chars object name generation testing
 </name>
 <command option="no-output,no-include" type="shell">
-%SRCDIR/../lib/objnames-test08.sh %SRCDIR
+%SRCDIR/objnames-test08.sh %SRCDIR
 </command>
 </client>
 
index 2b2519c..09a1abb 100644 (file)
@@ -45,7 +45,6 @@ TYPE I
 SIZE 1225\r
 RETR 1225\r
 CWD /\r
-CWD /\r
 CWD foo\r
 CWD bar\r
 EPSV\r
index a7e56a7..50af6bc 100644 (file)
@@ -31,6 +31,9 @@ HTTP cookie path match
  <command>
 http://example.fake/hoge/1228 http://example.fake/hogege/ -b nonexisting -x %HOSTIP:%HTTPPORT
 </command>
+<features>
+proxy
+</features>
 </client>
 
 # Verify data after the test has been "shot"
index ca2f6c6..860ce21 100644 (file)
@@ -43,6 +43,7 @@ mooooooo
 <client>
 <features>
 ipv6
+proxy
 </features>
 <server>
 http-proxy
index d0659f1..7425d44 100644 (file)
@@ -41,6 +41,9 @@ HTTP URL with dotdot removal from path using an HTTP proxy
  <command>
 --proxy http://%HOSTIP:%HTTPPORT http://test.remote.haxx.se.1232:8990/../../hej/but/who/../1232?stupid=me/../1232#soo/../1232 http://test.remote.haxx.se.1232:8990/../../hej/but/who/../12320001#/../12320001
 </command>
+<features>
+proxy
+</features>
 </client>
 
 #
index caf0527..1d4d3d5 100644 (file)
@@ -2,6 +2,7 @@
 <info>
 <keywords>
 FTP
+connect to non-listen
 </keywords>
 </info>
 
index aaa5688..bc6c618 100644 (file)
@@ -40,6 +40,9 @@ HTTP _without_ dotdot removal
  <command>
 --path-as-is --proxy http://%HOSTIP:%HTTPPORT http://test.remote.haxx.se.1241:8990/../../hej/but/who/../1241?stupid=me/../1241#soo/../1241 http://test.remote.haxx.se.1241:8990/../../hej/but/who/../12410001#/../12410001
 </command>
+<features>
+proxy
+</features>
 </client>
 
 #
index 6565929..a35bc89 100644 (file)
@@ -40,6 +40,9 @@ URL with '#' at end of host name instead of '/'
  <command>
 --proxy http://%HOSTIP:%HTTPPORT http://test.remote.haxx.se.1246:%HTTPPORT#@127.0.0.1/tricked.html no-scheme-url.com.1246:%HTTPPORT#@127.127.127.127/again.html
 </command>
+<features>
+proxy
+</features>
 </client>
 
 #
index 7400299..8f240b0 100644 (file)
@@ -35,6 +35,9 @@ NO_PROXY=example.com
 <command>
 http://somewhere.example.com/1253 --proxy http://%HOSTIP:%HTTPPORT --noproxy %HOSTIP
 </command>
+<features>
+proxy
+</features>
 </client>
 
 # Verify data after the test has been "shot"
index 817b934..c059754 100644 (file)
@@ -35,6 +35,9 @@ NO_PROXY=example.com
 <command>
 http://somewhere.example.com/1254 --proxy http://%HOSTIP:%HTTPPORT --noproxy ""
 </command>
+<features>
+proxy
+</features>
 </client>
 
 # Verify data after the test has been "shot"
index 09c59f4..e86afbb 100644 (file)
@@ -36,6 +36,9 @@ NO_PROXY=example.com
 <command>
 http://somewhere.example.com/1256 --noproxy %HOSTIP
 </command>
+<features>
+proxy
+</features>
 </client>
 
 # Verify data after the test has been "shot"
index 6b7e937..16a7c1a 100644 (file)
@@ -36,6 +36,9 @@ NO_PROXY=example.com
 <command>
 http://somewhere.example.com/1257 --noproxy ""
 </command>
+<features>
+proxy
+</features>
 </client>
 
 # Verify data after the test has been "shot"
index 4b08a2c..ed526c0 100644 (file)
@@ -1,5 +1,5 @@
-# similar to test 139 but with a reversed time condition
 <testcase>
+# similar to test 139 but with a reversed time condition
 <info>
 <keywords>
 FTP
index 7946916..7462db4 100644 (file)
@@ -1,5 +1,5 @@
-# similar to test 1260
 <testcase>
+# similar to test 1260
 <info>
 <keywords>
 HTTP
index 75ed7bd..cab11ef 100644 (file)
@@ -26,7 +26,7 @@ http
 HTTP GET with a single-byte HTTP/0.9 response
  </name>
  <command>
-http://%HOSTIP:%HTTPPORT/1266
+http://%HOSTIP:%HTTPPORT/1266 --http0.9
 </command>
 </client>
 
index 8f2a63b..82d3744 100644 (file)
@@ -26,7 +26,7 @@ http
 HTTP GET with a invalid HTTP/1 response line start
  </name>
  <command>
-http://%HOSTIP:%HTTPPORT/1267
+http://%HOSTIP:%HTTPPORT/1267 --http0.9
 </command>
 </client>
 
similarity index 51%
rename from tests/data/test2070
rename to tests/data/test1269
index 655cd8a..c776636 100644 (file)
@@ -1,41 +1,34 @@
 <testcase>
 <info>
 <keywords>
-FILE
+--retry-delay
 </keywords>
 </info>
 
+#
+# Server-side
 <reply>
-<data>
-foo
-   bar
-bar
-   foo
-moo
-</data>
 </reply>
 
+#
 # Client-side
 <client>
 <server>
-file
+none
 </server>
  <name>
-basic file:// file with no authority
+too large --retry-delay value
  </name>
-<command option="no-include">
-file:%PWD/log/test2070.txt
+ <command>
+--retry 3 --retry-delay 9223372036854776 http://%HOSTIP:%HTTPPORT/1269
 </command>
-<file name="log/test2070.txt">
-foo
-   bar
-bar
-   foo
-moo
-</file>
 </client>
 
+#
 # Verify data after the test has been "shot"
 <verify>
+<errorcode>
+2
+</errorcode>
 </verify>
 </testcase>
diff --git a/tests/data/test1270 b/tests/data/test1270
new file mode 100644 (file)
index 0000000..2579981
--- /dev/null
@@ -0,0 +1,69 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+HTTP GET
+redirect_url
+followlocation
+--write-out
+</keywords>
+</info>
+
+# Server-side
+<reply>
+<data nocheck="yes">
+HTTP/1.1 302 Captive Portal\r
+Server: ohlala/2000\r
+Date: Tue, 17 Dec 2019 13:08:30 GMT\r
+Cache-Control: no-cache,no-store,must-revalidate,post-check=0,pre-check=0\r
+Location: https://moo.moo.moo\r
+Content-Type: text/html; charset=utf-8\r
+X-Frame-Options: SAMEORIGIN\r
+Strict-Transport-Security: max-age=604800\r
+Content-Length: 0\r
+Connection: close\r
+\r
+</data>
+</reply>
+
+# Client-side
+<client>
+<server>
+http
+</server>
+ <name>
+Basic 'redirect_url'
+ </name>
+ <command>
+http://%HOSTIP:%HTTPPORT/we/want/our/1270 -w '%{redirect_url}\n' -s
+</command>
+</client>
+
+# Verify data after the test has been "shot"
+<verify>
+<strip>
+^User-Agent:.*
+</strip>
+<protocol>
+GET /we/want/our/1270 HTTP/1.1\r
+Host: %HOSTIP:%HTTPPORT\r
+Accept: */*\r
+\r
+</protocol>
+
+<stdout>
+HTTP/1.1 302 Captive Portal\r
+Server: ohlala/2000\r
+Date: Tue, 17 Dec 2019 13:08:30 GMT\r
+Cache-Control: no-cache,no-store,must-revalidate,post-check=0,pre-check=0\r
+Location: https://moo.moo.moo\r
+Content-Type: text/html; charset=utf-8\r
+X-Frame-Options: SAMEORIGIN\r
+Strict-Transport-Security: max-age=604800\r
+Content-Length: 0\r
+Connection: close\r
+\r
+https://moo.moo.moo/
+</stdout>
+</verify>
+</testcase>
diff --git a/tests/data/test1271 b/tests/data/test1271
new file mode 100644 (file)
index 0000000..687a6a9
--- /dev/null
@@ -0,0 +1,48 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+HTTP GET
+--write-out
+</keywords>
+</info>
+
+# Server-side
+<reply>
+<data>
+HTTP/1.1 200 This is a weirdo text message swsclose\r
+Content-Length: 4\r
+Connection: close\r
+\r
+Moo
+</data>
+</reply>
+
+# Client-side
+<client>
+<server>
+http
+</server>
+ <name>
+--write-out from file with empty file
+ </name>
+ <command>
+http://%HOSTIP:%HTTPPORT/we/want/our/1271 -w @log/blank1271
+</command>
+<file name="log/blank1271">
+</file>
+</client>
+
+# Verify data after the test has been "shot"
+<verify>
+<strip>
+^User-Agent:.*
+</strip>
+<protocol>
+GET /we/want/our/1271 HTTP/1.1\r
+Host: %HOSTIP:%HTTPPORT\r
+Accept: */*\r
+\r
+</protocol>
+</verify>
+</testcase>
index 46c2924..976fd6e 100644 (file)
@@ -60,6 +60,9 @@ HTTP over proxy-tunnel ignore TE and CL in CONNECT 2xx responses
 <command>
 -v --proxytunnel -x %HOSTIP:%PROXYPORT http://test.1287:%HTTPPORT/we/want/that/page/1287
 </command>
+<features>
+proxy
+</features>
 </client>
 
 #
index 543aa3d..d8a1e52 100644 (file)
@@ -44,6 +44,9 @@ Suppress proxy CONNECT response headers
 <command>
 --proxytunnel --suppress-connect-headers --dump-header - --include --write-out "\nCONNECT CODE: %{http_connect}\nRECEIVED HEADER BYTE TOTAL: %{size_header}\n" --proxy %HOSTIP:%PROXYPORT http://%HOSTIP.1288:%HTTPPORT/we/want/that/page/1288
 </command>
+<features>
+proxy
+</features>
 </client>
 
 #
index 12d65f3..a2e505f 100644 (file)
@@ -1,7 +1,6 @@
+<testcase>
 # This test case is primarily meant to verify that parsing and adding the 100K
 # files is a swift operation.
-#
-<testcase>
 <info>
 <keywords>
 HTTP
@@ -22,7 +21,7 @@ HTTP PUT
 none
 </server>
 <name>
-Attempt to upload 100K files but fail immediately
+Attempt to upload 1000 files but fail immediately
 </name>
 <command>
 -K log/cmd1291 --fail-early
@@ -32,7 +31,7 @@ XXXXXXXx
 </file>
 # generate the config file
 <precheck>
-perl -e 'for(1 .. 100000) { printf("upload-file=log/upload-this\nurl=htttttp://non-existing-host.haxx.se/upload/1291\n", $_);}' > log/cmd1291;
+perl -e 'for(1 .. 1000) { printf("upload-file=log/upload-this\nurl=htttttp://non-existing-host.haxx.se/upload/1291\n", $_);}' > log/cmd1291;
 </precheck>
 </client>
 
@@ -41,11 +40,5 @@ perl -e 'for(1 .. 100000) { printf("upload-file=log/upload-this\nurl=htttttp://n
 <errorcode>
 1
 </errorcode>
-
-# we disable valgrind here since it takes 40+ seconds even on a fairly snappy
-# machine
-<valgrind>
-disable
-</valgrind>
 </verify>
 </testcase>
diff --git a/tests/data/test1293 b/tests/data/test1293
new file mode 100644 (file)
index 0000000..11a28a3
--- /dev/null
@@ -0,0 +1,67 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+HTTP GET
+-F
+</keywords>
+</info>
+
+#
+# Server-side
+<reply>
+<data nocheck="yes">
+HTTP/1.1 200 OK
+Date: Thu, 09 Nov 2010 14:49:00 GMT
+Server: test-server/fake
+Last-Modified: Tue, 13 Jun 2000 12:10:00 GMT
+ETag: "21025-dc7-39462498"
+Accept-Ranges: bytes
+Content-Length: 6
+Connection: close
+Content-Type: text/html
+Funny-head: yesyes
+
+-foo-
+</data>
+</reply>
+
+#
+# Client-side
+<client>
+<server>
+http
+</server>
+ <name>
+Multipart formpost to two URLs, the first failing
+ </name>
+ <command>
+http://0 http://%HOSTIP:%HTTPPORT/1293 -F=
+</command>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<strip>
+^User-Agent:.*
+</strip>
+<strippart>
+s/^--------------------------[a-z0-9]*/------------------------------/
+s/boundary=------------------------[a-z0-9]*/boundary=----------------------------/
+</strippart>
+<protocol>
+POST /1293 HTTP/1.1\r
+Host: 127.0.0.1:8990\r
+Accept: */*\r
+Content-Length: 126\r
+Content-Type: multipart/form-data; boundary=----------------------------\r
+\r
+------------------------------\r
+Content-Disposition: form-data\r
+\r
+\r
+--------------------------------\r
+</protocol>
+</verify>
+</testcase>
index 82ed3c0..c4f7ac7 100644 (file)
@@ -15,6 +15,7 @@ none
 </server>
 <features>
 unittest
+ftp
 </features>
  <name>
 internal Curl_fnmatch() testing
index 078ada6..3963bd9 100644 (file)
@@ -56,6 +56,9 @@ HTTP Location: following a // prefixed url
  <command>
 http://firstplace.example.com/want/1314 -L -x http://%HOSTIP:%HTTPPORT
 </command>
+<features>
+proxy
+</features>
 </client>
 
 # Verify data after the test has been "shot"
index f50c531..8fc968c 100644 (file)
@@ -50,6 +50,7 @@ http-proxy
 </server>
 <features>
 http
+proxy
 </features>
  <name>
 POP3 fetch tunneled through HTTP proxy
index 7a15f80..da4079e 100644 (file)
@@ -27,6 +27,7 @@ http-proxy
 </server>
 <features>
 http
+proxy
 </features>
  <name>
 SMTP send tunneled through HTTP proxy
index 72a52c9..cc91177 100644 (file)
@@ -46,6 +46,7 @@ http-proxy
 </server>
 <features>
 http
+proxy
 </features>
  <name>
 IMAP FETCH tunneled through HTTP proxy
index bf10a8d..9749895 100644 (file)
@@ -37,7 +37,7 @@ http
 HTTP with --resolve and hostname with trailing dot
 </name>
 <command>
---resolve example.com:%HTTPPORT:%HOSTIP http://example.com.:%HTTPPORT/1322
+--ipv4 --resolve example.com.:%HTTPPORT:%HOSTIP http://example.com.:%HTTPPORT/1322
 </command>
 </client>
 
index 3d2d0cb..2cec0b8 100644 (file)
@@ -17,6 +17,9 @@ http
  <command>
 http://%HOSTIP:%HTTPPORT/we/want/that/page/1329 -x "/server"
 </command>
+<features>
+proxy
+</features>
 </client>
 
 #
index 1fb5a66..a78dc30 100644 (file)
@@ -45,6 +45,7 @@ s/ =.*//
 s/\(.*\)/()/
 s/:\d+/:/
 s:^(MEM )(.*/)(.*):$1$3:
+s/\r\n/\n/
 </stripfile>
 </verify>
 
index 6b58235..865abd9 100644 (file)
@@ -64,6 +64,9 @@ HTTP --proxy-anyauth and 407 with cookies
  <command>
 -U myname:mypassword -x %HOSTIP:%HTTPPORT http://z.x.com/1331 --proxy-anyauth -c log/dump1331
 </command>
+<features>
+proxy
+</features>
 </client>
 
 # Verify data after the test has been "shot"
index 10faef3..c0d409b 100644 (file)
@@ -50,10 +50,13 @@ Accept: */*
 <stripfile>
 s/(USERAGENT, \")[^\"]+/${1}stripped/
 # CURLOPT_SSL_VERIFYPEER, SSH_KNOWNHOSTS and HTTP_VERSION vary with
+# CURLOPT_INTERLEAVEDATA requires RTSP protocol
 # configurations - just ignore them
 $_ = '' if /CURLOPT_SSL_VERIFYPEER/
 $_ = '' if /CURLOPT_SSH_KNOWNHOSTS/
 $_ = '' if /CURLOPT_HTTP_VERSION/
+$_ = '' if /CURLOPT_HTTP09_ALLOWED/
+$_ = '' if /CURLOPT_INTERLEAVEDATA/
 </stripfile>
 <file name="log/test1400.c" mode="text">
 /********* Sample code generated by the curl command line tool **********
@@ -80,7 +83,6 @@ int main(int argc, char *argv[])
      them yourself.
 
   CURLOPT_WRITEDATA set to a objectpointer
-  CURLOPT_INTERLEAVEDATA set to a objectpointer
   CURLOPT_WRITEFUNCTION set to a functionpointer
   CURLOPT_READDATA set to a objectpointer
   CURLOPT_READFUNCTION set to a functionpointer
index f330931..ec3b25c 100644 (file)
@@ -61,6 +61,7 @@ X-Men: cyclops, iceman
 $_ = '' if /CURLOPT_SSL_VERIFYPEER/
 $_ = '' if /CURLOPT_SSH_KNOWNHOSTS/
 $_ = '' if /CURLOPT_HTTP_VERSION/
+$_ = '' if /CURLOPT_INTERLEAVEDATA/
 </stripfile>
 <file name="log/test1401.c" mode="text">
 /********* Sample code generated by the curl command line tool **********
@@ -99,7 +100,6 @@ int main(int argc, char *argv[])
      them yourself.
 
   CURLOPT_WRITEDATA set to a objectpointer
-  CURLOPT_INTERLEAVEDATA set to a objectpointer
   CURLOPT_WRITEFUNCTION set to a functionpointer
   CURLOPT_READDATA set to a objectpointer
   CURLOPT_READFUNCTION set to a functionpointer
index 9a94283..bf7eb7b 100644 (file)
@@ -59,6 +59,7 @@ s/(USERAGENT, \")[^\"]+/${1}stripped/
 $_ = '' if /CURLOPT_SSL_VERIFYPEER/
 $_ = '' if /CURLOPT_SSH_KNOWNHOSTS/
 $_ = '' if /CURLOPT_HTTP_VERSION/
+$_ = '' if /CURLOPT_INTERLEAVEDATA/
 </stripfile>
 <file name="log/test1402.c" mode="text">
 /********* Sample code generated by the curl command line tool **********
@@ -87,7 +88,6 @@ int main(int argc, char *argv[])
      them yourself.
 
   CURLOPT_WRITEDATA set to a objectpointer
-  CURLOPT_INTERLEAVEDATA set to a objectpointer
   CURLOPT_WRITEFUNCTION set to a functionpointer
   CURLOPT_READDATA set to a objectpointer
   CURLOPT_READFUNCTION set to a functionpointer
index 79cdf49..731d274 100644 (file)
@@ -56,6 +56,7 @@ s/(USERAGENT, \")[^\"]+/${1}stripped/
 $_ = '' if /CURLOPT_SSL_VERIFYPEER/
 $_ = '' if /CURLOPT_SSH_KNOWNHOSTS/
 $_ = '' if /CURLOPT_HTTP_VERSION/
+$_ = '' if /CURLOPT_INTERLEAVEDATA/
 </stripfile>
 <file name="log/test1403.c" mode="text">
 /********* Sample code generated by the curl command line tool **********
@@ -82,7 +83,6 @@ int main(int argc, char *argv[])
      them yourself.
 
   CURLOPT_WRITEDATA set to a objectpointer
-  CURLOPT_INTERLEAVEDATA set to a objectpointer
   CURLOPT_WRITEFUNCTION set to a functionpointer
   CURLOPT_READDATA set to a objectpointer
   CURLOPT_READFUNCTION set to a functionpointer
index 9c6f2e7..d3c66a9 100644 (file)
@@ -94,6 +94,9 @@ s/(USERAGENT, \")[^\"]+/${1}stripped/
 $_ = '' if /CURLOPT_SSL_VERIFYPEER/
 $_ = '' if /CURLOPT_SSH_KNOWNHOSTS/
 $_ = '' if /CURLOPT_HTTP_VERSION/
+$_ = '' if /CURLOPT_INTERLEAVEDATA/
+# CURL_DOES_CONVERSION generates an extra comment.
+$_ = '' if /\/\* "value" \*\//
 </stripfile>
 <file name="log/test1404.c" mode="text">
 /********* Sample code generated by the curl command line tool **********
@@ -151,7 +154,6 @@ int main(int argc, char *argv[])
      them yourself.
 
   CURLOPT_WRITEDATA set to a objectpointer
-  CURLOPT_INTERLEAVEDATA set to a objectpointer
   CURLOPT_WRITEFUNCTION set to a functionpointer
   CURLOPT_READDATA set to a objectpointer
   CURLOPT_READFUNCTION set to a functionpointer
index 73769ee..dcc8f80 100644 (file)
@@ -96,7 +96,6 @@ int main(int argc, char *argv[])
      them yourself.
 
   CURLOPT_WRITEDATA set to a objectpointer
-  CURLOPT_INTERLEAVEDATA set to a objectpointer
   CURLOPT_WRITEFUNCTION set to a functionpointer
   CURLOPT_READDATA set to a objectpointer
   CURLOPT_READFUNCTION set to a functionpointer
@@ -128,6 +127,7 @@ int main(int argc, char *argv[])
 </file>
 <stripfile>
 # CURLOPT_USERAGENT and CURLOPT_MAXREDIRS requires HTTP protocol
+# CURLOPT_INTERLEAVEDATA requires RTSP (HTTP) protocol
 # support, IOW depends on configuration - just ignore these.
 $_ = '' if /CURLOPT_USERAGENT/
 $_ = '' if /CURLOPT_MAXREDIRS/
@@ -136,6 +136,8 @@ $_ = '' if /CURLOPT_MAXREDIRS/
 $_ = '' if /CURLOPT_SSL_VERIFYPEER/
 $_ = '' if /CURLOPT_SSH_KNOWNHOSTS/
 $_ = '' if /CURLOPT_HTTP_VERSION/
+$_ = '' if /CURLOPT_HTTP09_ALLOWED/
+$_ = '' if /CURLOPT_INTERLEAVEDATA/
 </stripfile>
 </verify>
 </testcase>
index 796dd22..8803c84 100644 (file)
@@ -76,20 +76,19 @@ int main(int argc, char *argv[])
 
   hnd = curl_easy_init();
   curl_easy_setopt(hnd, CURLOPT_BUFFERSIZE, 102400L);
-  curl_easy_setopt(hnd, CURLOPT_INFILESIZE_LARGE, (curl_off_t)38);
   curl_easy_setopt(hnd, CURLOPT_URL, "smtp://%HOSTIP:%SMTPPORT/1406");
   curl_easy_setopt(hnd, CURLOPT_UPLOAD, 1L);
   curl_easy_setopt(hnd, CURLOPT_VERBOSE, 1L);
   curl_easy_setopt(hnd, CURLOPT_TCP_KEEPALIVE, 1L);
   curl_easy_setopt(hnd, CURLOPT_MAIL_FROM, "sender@example.com");
   curl_easy_setopt(hnd, CURLOPT_MAIL_RCPT, slist1);
+  curl_easy_setopt(hnd, CURLOPT_INFILESIZE_LARGE, (curl_off_t)38);
 
   /* Here is a list of options the curl code used that cannot get generated
      as source easily. You may select to either not use them or implement
      them yourself.
 
   CURLOPT_WRITEDATA set to a objectpointer
-  CURLOPT_INTERLEAVEDATA set to a objectpointer
   CURLOPT_WRITEFUNCTION set to a functionpointer
   CURLOPT_READDATA set to a objectpointer
   CURLOPT_READFUNCTION set to a functionpointer
@@ -117,11 +116,14 @@ int main(int argc, char *argv[])
 </file>
 <stripfile>
 # These options vary with configurations - just ignore them
+# CURLOPT_INTERLEAVEDATA requires RTSP (HTTP) protocol
 $_ = '' if /CURLOPT_USERAGENT/
 $_ = '' if /CURLOPT_MAXREDIRS/
 $_ = '' if /CURLOPT_SSL_VERIFYPEER/
 $_ = '' if /CURLOPT_SSH_KNOWNHOSTS/
 $_ = '' if /CURLOPT_HTTP_VERSION/
+$_ = '' if /CURLOPT_HTTP09_ALLOWED/
+$_ = '' if /CURLOPT_INTERLEAVEDATA/
 </stripfile>
 </verify>
 </testcase>
index 9800eee..917a5de 100644 (file)
@@ -69,7 +69,6 @@ int main(int argc, char *argv[])
      them yourself.
 
   CURLOPT_WRITEDATA set to a objectpointer
-  CURLOPT_INTERLEAVEDATA set to a objectpointer
   CURLOPT_WRITEFUNCTION set to a functionpointer
   CURLOPT_READDATA set to a objectpointer
   CURLOPT_READFUNCTION set to a functionpointer
@@ -95,11 +94,14 @@ int main(int argc, char *argv[])
 </file>
 <stripfile>
 # These options vary with configurations - just ignore them
+# CURLOPT_INTERLEAVEDATA requires RTSP (HTTP) protocol
 $_ = '' if /CURLOPT_USERAGENT/
 $_ = '' if /CURLOPT_MAXREDIRS/
 $_ = '' if /CURLOPT_SSL_VERIFYPEER/
 $_ = '' if /CURLOPT_SSH_KNOWNHOSTS/
 $_ = '' if /CURLOPT_HTTP_VERSION/
+$_ = '' if /CURLOPT_HTTP09_ALLOWED/
+$_ = '' if /CURLOPT_INTERLEAVEDATA/
 </stripfile>
 </verify>
 </testcase>
index ae63290..36d3d1d 100644 (file)
@@ -25,6 +25,19 @@ Connection: close
 This is not the real page
 </data>
 
+# The second URL will get this response
+<data1>
+HTTP/1.1 401 Authorization Required swsclose\r
+Server: Apache/1.3.27 (Darwin) PHP/4.1.2\r
+WWW-Authenticate: Blackmagic realm="gimme all yer s3cr3ts"\r
+WWW-Authenticate: Basic realm="gimme all yer s3cr3ts"\r
+WWW-Authenticate: Digest realm="gimme all yer s3cr3ts", nonce="11223344"\r
+Content-Type: text/html; charset=iso-8859-1\r
+Connection: close\r
+\r
+This is not the real page
+</data1>
+
 # This is supposed to be returned when the server gets a
 # Authorization: Digest line passed-in from the client
 <data1000>
@@ -109,6 +122,11 @@ Accept: */*
 \r
 GET /14120001 HTTP/1.1\r
 Host: %HOSTIP:%HTTPPORT\r
+User-Agent: curl/7.10.5 (i686-pc-linux-gnu) libcurl/7.10.5 OpenSSL/0.9.7a ipv6 zlib/1.1.3\r
+Accept: */*\r
+\r
+GET /14120001 HTTP/1.1\r
+Host: %HOSTIP:%HTTPPORT\r
 Authorization: Digest username="testuser", realm="gimme all yer s3cr3ts", nonce="11223344", uri="/14120001", response="0085df91870374c8bf4e94415e7fbf8e"\r
 User-Agent: curl/7.10.5 (i686-pc-linux-gnu) libcurl/7.10.5 OpenSSL/0.9.7a ipv6 zlib/1.1.3\r
 Accept: */*\r
index f5660ba..94ce02c 100644 (file)
@@ -20,12 +20,12 @@ Content-Length: 4
 Content-Type: text/html
 Funny-head: yesyes
 Set-Cookie: test1value=test1; domain=example.com; path=/;
-Set-Cookie: test2value=test2; expires=Friday, 01-Jan-2037 00:00:00 GMT; domain=example.com; path=/;
+Set-Cookie: test2value=test2; expires=Thursday, 31-Dec-2037 00:00:00 GMT; domain=example.com; path=/;
 Set-Cookie: test3value=test3; expires=Monday, 13-Jun-1988 03:04:55 GMT; domain=example.com; path=/;
-Set-Cookie: test4value=test4; expires=Friday, 01-Jan-2037 00:00:00 GMT; domain=example.com; path=/;
+Set-Cookie: test4value=test4; expires=Thursday, 31-Dec-2037 00:00:00 GMT; domain=example.com; path=/;
 Set-Cookie: test5value=test5; expires=Monday, 13-Jun-1988 03:04:55 GMT; domain=example.com; path=/;
 Set-Cookie: test6value=test6; expires=Monday, 13-Jun-1988 03:04:55 GMT; domain=example.com; path=/;
-Set-Cookie: test7value=test7; expires=Friday, 01-Jan-2037 00:00:00 GMT; domain=example.com; path=/;
+Set-Cookie: test7value=test7; expires=Thursday, 31-Dec-2037 00:00:00 GMT; domain=example.com; path=/;
 Set-Cookie: test8value=test8; expires=Monday, 13-Jun-1988 03:04:55 GMT; domain=example.com; path=/;
 
 boo
@@ -46,6 +46,9 @@ TZ=GMT
 <command>
 http://example.com/we/want/1415 -b none -c log/jar1415.txt -x %HOSTIP:%HTTPPORT
 </command>
+<features>
+proxy
+</features>
 </client>
 
 # Verify data after the test has been "shot"
@@ -66,9 +69,9 @@ Proxy-Connection: Keep-Alive
 # https://curl.haxx.se/docs/http-cookies.html
 # This file was generated by libcurl! Edit at your own risk.
 
-.example.com   TRUE    /       FALSE   2114380800      test7value      test7
-.example.com   TRUE    /       FALSE   2114380800      test4value      test4
-.example.com   TRUE    /       FALSE   2114380800      test2value      test2
+.example.com   TRUE    /       FALSE   2145830400      test7value      test7
+.example.com   TRUE    /       FALSE   2145830400      test4value      test4
+.example.com   TRUE    /       FALSE   2145830400      test2value      test2
 .example.com   TRUE    /       FALSE   0       test1value      test1
 </file>
 </verify>
index b3a2f23..c137b1c 100644 (file)
@@ -22,6 +22,15 @@ WWW-Authenticate: Basic
 Please auth with me
 </data>
 
+<data3>
+HTTP/1.1 401 Authentication please!\r
+Content-Length: 20\r
+WWW-Authenticate: Digest realm="loonie", nonce="314156592"\r
+WWW-Authenticate: Basic\r
+\r
+Please auth with me
+</data3>
+
 # This is supposed to be returned when the server gets the second
 # Authorization: NTLM line passed-in from the client
 <data1000>
@@ -99,6 +108,10 @@ Accept: */*
 \r
 GET /14180003 HTTP/1.1\r
 Host: %HOSTIP:%HTTPPORT\r
+Accept: */*\r
+\r
+GET /14180003 HTTP/1.1\r
+Host: %HOSTIP:%HTTPPORT\r
 Authorization: Digest username="testuser", realm="loonie", nonce="314156592", uri="/14180003", response="1c6390a67bac3283a9b023402f3b3540"\r
 Accept: */*\r
 \r
index 081ac6b..03c4584 100644 (file)
@@ -74,7 +74,6 @@ int main(int argc, char *argv[])
      them yourself.
 
   CURLOPT_WRITEDATA set to a objectpointer
-  CURLOPT_INTERLEAVEDATA set to a objectpointer
   CURLOPT_WRITEFUNCTION set to a functionpointer
   CURLOPT_READDATA set to a objectpointer
   CURLOPT_READFUNCTION set to a functionpointer
@@ -100,11 +99,13 @@ int main(int argc, char *argv[])
 </file>
 <stripfile>
 # These options vary with configurations - just ignore them
+# CURLOPT_INTERLEAVEDATA requires RTSP (HTTP) protocol
 $_ = '' if /CURLOPT_USERAGENT/
 $_ = '' if /CURLOPT_MAXREDIRS/
 $_ = '' if /CURLOPT_SSL_VERIFYPEER/
 $_ = '' if /CURLOPT_SSH_KNOWNHOSTS/
 $_ = '' if /CURLOPT_HTTP_VERSION/
+$_ = '' if /CURLOPT_INTERLEAVEDATA/
 </stripfile>
 </verify>
 </testcase>
index 6c59b21..dea49e7 100644 (file)
@@ -35,6 +35,9 @@ Re-using HTTP proxy connection for two different host names
  <command>
 --proxy http://%HOSTIP:%HTTPPORT http://test.remote.haxx.se.1421:8990/ http://different.remote.haxx.se.1421:8990
 </command>
+<features>
+proxy
+</features>
 </client>
 
 #
index 0044c69..ce9ba97 100644 (file)
Binary files a/tests/data/test1425 and b/tests/data/test1425 differ
index dd6a8d1..851d8c3 100644 (file)
Binary files a/tests/data/test1426 and b/tests/data/test1426 differ
index 59041ec..f09c02d 100644 (file)
@@ -52,6 +52,9 @@ HTTP over proxy-tunnel with --proxy-header and --header
  <command>
 http://test.1428:%HTTPPORT/we/want/that/page/1428 -p -x %HOSTIP:%PROXYPORT --user 'iam:my:;self' --header "header-type: server" --proxy-header "header-type: proxy"
 </command>
+<features>
+proxy
+</features>
 </client>
 
 #
index 114dc0d..b6a66c7 100644 (file)
@@ -3,12 +3,13 @@
 <keywords>
 HTTP
 HTTP GET
+HTTP/0.9
 </keywords>
 </info>
 
 <reply>
 <data nocheck="yes">
-HTTP/1.1 1234 OK
+HTTP/1.1 2345 OK
 Date: Thu, 09 Nov 2010 14:49:00 GMT
 Server: test-server/fake
 Last-Modified: Tue, 13 Jun 2000 12:10:00 GMT
@@ -34,7 +35,7 @@ http
 HTTP GET with 4-digit response code
  </name>
  <command>
-http://%HOSTIP:%HTTPPORT/1429 --write-out '%{response_code}'
+http://%HOSTIP:%HTTPPORT/1429 --write-out '%{response_code}' --http0.9
 </command>
 </client>
 
@@ -42,7 +43,7 @@ http://%HOSTIP:%HTTPPORT/1429 --write-out '%{response_code}'
 # Verify data after the test has been "shot"
 <verify>
 <stdout nonewline="yes">
-HTTP/1.1 1234 OK
+HTTP/1.1 2345 OK
 Date: Thu, 09 Nov 2010 14:49:00 GMT
 Server: test-server/fake
 Last-Modified: Tue, 13 Jun 2000 12:10:00 GMT
@@ -54,7 +55,7 @@ Content-Type: text/html
 Funny-head: yesyes
 
 -foo-
-123
+234
 </stdout>
 <strip>
 ^User-Agent:.*
index a4df8cb..0f36dd9 100644 (file)
@@ -32,7 +32,8 @@ FTP URL with type=a
 USER anonymous\r
 PASS ftp@example.com\r
 PWD\r
-CWD /tmp\r
+CWD /\r
+CWD tmp\r
 CWD moo\r
 EPSV\r
 TYPE A\r
index f60483d..936c9ae 100644 (file)
@@ -21,7 +21,7 @@ perl %SRCDIR/libtest/test613.pl prepare %PWD/log/test1445.dir
 file:// with --remote-time
  </name>
  <command>
-file://localhost/%PWD/log/test1445.dir/plainfile.txt --remote-time
+file://localhost%FILE_PWD/log/test1445.dir/plainfile.txt --remote-time
 </command>
 <postcheck>
 perl %SRCDIR/libtest/test613.pl postprocess %PWD/log/test1445.dir && \
index e62cd72..d118294 100644 (file)
@@ -18,6 +18,7 @@ none
 </server>
 <features>
 http
+proxy
 </features>
  <name>
 Provide illegal proxy name 
index e04f47b..8de2fd1 100644 (file)
@@ -41,7 +41,7 @@ http
 idn
 </features>
 <setenv>
-LC_ALL=
+LC_ALL=en_US.UTF-8
 LC_CTYPE=en_US.UTF-8
 </setenv>
 <precheck>
index d30c13c..1911b02 100644 (file)
@@ -1,5 +1,5 @@
-# initially based on test110
 <testcase>
+# initially based on test110
 <info>
 <keywords>
 FTP
index 0b77dc4..8483d7b 100644 (file)
@@ -3,13 +3,15 @@
 <keywords>
 HTTP
 HTTP GET
+proxy
+haproxy
 </keywords>
 </info>
 
 #
 # Server-side
 <reply name="1455">
-<data nocheck=yes>
+<data nocheck="yes">
 HTTP/1.1 200 OK
 Date: Thu, 09 Nov 2010 14:49:00 GMT
 Server: test-server/fake
@@ -35,8 +37,11 @@ http
 HTTP GET when PROXY Protocol enabled
 </name>
 <command>
-http://%HOSTIP:%HTTPPORT/1455 --haproxy-protocol
+http://%HOSTIP:%HTTPPORT/1455 --haproxy-protocol -H "Testno: 1455"
 </command>
+<features>
+proxy
+</features>
 </client>
 
 #
@@ -53,6 +58,7 @@ proxy-line
 GET /1455 HTTP/1.1\r
 Host: %HOSTIP:%HTTPPORT\r
 Accept: */*\r
+Testno: 1455\r
 \r
 </protocol>
 </verify>
index 07a6e7c..16a78b2 100644 (file)
@@ -3,13 +3,15 @@
 <keywords>
 HTTP
 HTTP GET
+proxy
+haproxy
 IPv6
 </keywords>
 </info>
 #
 # Server-side
 <reply>
-<data nocheck=yes>
+<data nocheck="yes">
 HTTP/1.1 200 OK
 Date: Thu, 09 Nov 2010 14:49:00 GMT
 Server: test-server/fake
@@ -21,7 +23,7 @@ Connection: close
 Content-Type: text/html
 Funny-head: yesyes
 
--foo-
+These data aren't actually sent to the client
 </data>
 </reply>
 
@@ -38,8 +40,11 @@ http-ipv6
 HTTP-IPv6 GET with PROXY protocol
  </name>
  <command>
--g "http://%HOST6IP:%HTTP6PORT/1456" --local-port 44444 --haproxy-protocol
+-g "http://%HOST6IP:%HTTP6PORT/1456" --haproxy-protocol
 </command>
+<features>
+proxy
+</features>
 </client>
 
 #
@@ -48,8 +53,14 @@ HTTP-IPv6 GET with PROXY protocol
 <strip>
 ^User-Agent:
 </strip>
+
+# Strip off the (random) local port number. This test used to use a fixed
+# local port number that frequently causes the test to fail
+<strippart>
+s/PROXY TCP6 ::1 ::1 (\d+) (\d+)/PROXY TCP6 ::1 ::1 $2/
+</strippart>
 <protocol>
-PROXY TCP6 ::1 ::1 44444 %HTTP6PORT\r
+PROXY TCP6 ::1 ::1 %HTTP6PORT\r
 GET /1456 HTTP/1.1\r
 Host: %HOST6IP:%HTTP6PORT\r
 Accept: */*\r
diff --git a/tests/data/test1457 b/tests/data/test1457
new file mode 100644 (file)
index 0000000..575748f
--- /dev/null
@@ -0,0 +1,61 @@
+<testcase>
+<info>
+<keywords>
+protocol
+--write-out
+</keywords>
+</info>
+# Server-side
+<reply>
+<data nocheck="yes">
+HTTP/1.1 200 OK
+Date: Thu, 09 Nov 2010 14:49:00 GMT
+Content-Length: 9
+Connection: close
+Content-Type: text/plain
+
+testdata
+</data>
+
+</reply>
+
+# Client-side
+<client>
+<server>
+http
+</server>
+
+<name>
+Check if %{stderr} and %{stdout} switch between stdout and stderr.
+</name>
+<command>
+http://%HOSTIP:%HTTPPORT/1457 --silent --write-out 'line1%{stderr}line2%{stdout}line3'
+</command>
+</client>
+
+# Verify data
+<verify>
+<stdout nonewline="yes">
+HTTP/1.1 200 OK
+Date: Thu, 09 Nov 2010 14:49:00 GMT
+Content-Length: 9
+Connection: close
+Content-Type: text/plain
+
+testdata
+line1line3
+</stdout>
+<stderr nonewline="yes">
+line2
+</stderr>
+<protocol>
+GET /1457 HTTP/1.1\r
+Host: %HOSTIP:%HTTPPORT\r
+Accept: */*\r
+\r
+</protocol>
+<strip>
+^User-Agent:.*
+</strip>
+</verify>
+</testcase>
diff --git a/tests/data/test1458 b/tests/data/test1458
new file mode 100644 (file)
index 0000000..072e43c
--- /dev/null
@@ -0,0 +1,56 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+HTTP GET
+--resolve
+</keywords>
+</info>
+
+#
+# Server-side
+<reply>
+<data>
+HTTP/1.1 200 OK
+Date: Thu, 09 Nov 2010 14:49:00 GMT
+Server: test-server/fake
+Last-Modified: Tue, 13 Jun 2000 12:10:00 GMT
+ETag: "21025-dc7-39462498"
+Accept-Ranges: bytes
+Content-Length: 6
+Connection: close
+Content-Type: text/html
+Funny-head: yesyes
+
+-foo-
+</data>
+</reply>
+
+#
+# Client-side
+<client>
+<server>
+http
+</server>
+<name>
+HTTP with wildcard --resolve
+</name>
+<command>
+--resolve *:%HTTPPORT:%HOSTIP http://example.com:%HTTPPORT/1458
+</command>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<strip>
+^User-Agent:.*
+</strip>
+<protocol>
+GET /1458 HTTP/1.1\r
+Host: example.com:%HTTPPORT\r
+Accept: */*\r
+\r
+</protocol>
+</verify>
+</testcase>
index e19826e..e9fde39 100644 (file)
@@ -20,7 +20,7 @@ HTTP/1.1 401 Now gimme that second request of crap
 Server: Microsoft-IIS/5.0\r
 Content-Type: text/html; charset=iso-8859-1\r
 Content-Length: 34\r
-WWW-Authenticate: NTLM TlRMTVNTUAACAAAAAgACADAAAAAGgoEAc51AYVDgyNcAAAAAAAAAAG4AbgAyAAAAQ0MCAAQAQwBDAAEAEgBFAEwASQBTAEEAQgBFAFQASAAEABgAYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAwAsAGUAbABpAHMAYQBiAGUAdABoAC4AYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAAAAAA==\r
+WWW-Authenticate: NTLM TlRMTVNTUAACAAAAAgACADAAAACGggEAc51AYVDgyNcAAAAAAAAAAG4AbgAyAAAAQ0MCAAQAQwBDAAEAEgBFAEwASQBTAEEAQgBFAFQASAAEABgAYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAwAsAGUAbABpAHMAYQBiAGUAdABoAC4AYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAAAAAA==\r
 \r
 This is not the real page either!
 </data1001>
@@ -41,7 +41,7 @@ HTTP/1.1 401 Now gimme that second request of crap
 Server: Microsoft-IIS/5.0\r
 Content-Type: text/html; charset=iso-8859-1\r
 Content-Length: 34\r
-WWW-Authenticate: NTLM TlRMTVNTUAACAAAAAgACADAAAAAGgoEAc51AYVDgyNcAAAAAAAAAAG4AbgAyAAAAQ0MCAAQAQwBDAAEAEgBFAEwASQBTAEEAQgBFAFQASAAEABgAYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAwAsAGUAbABpAHMAYQBiAGUAdABoAC4AYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAAAAAA==\r
+WWW-Authenticate: NTLM TlRMTVNTUAACAAAAAgACADAAAACGggEAc51AYVDgyNcAAAAAAAAAAG4AbgAyAAAAQ0MCAAQAQwBDAAEAEgBFAEwASQBTAEEAQgBFAFQASAAEABgAYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAwAsAGUAbABpAHMAYQBiAGUAdABoAC4AYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAAAAAA==\r
 \r
 HTTP/1.1 200 Things are fine in server land swsclose\r
 Server: Microsoft-IIS/5.0\r
@@ -57,6 +57,7 @@ Finally, this is the real page!
 <client>
 <features>
 NTLM
+SSL
 !SSPI
 debug
 </features>
@@ -94,7 +95,7 @@ Accept: */*
 \r
 GET /150 HTTP/1.1\r
 Host: %HOSTIP:%HTTPPORT\r
-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAAAAAD2AAAACAAIAPYAAAAIAAgA/gAAAAAAAAAAAAAABoKBAMOv20GsURsat8gdH/RfnYI0MzIxNTMyMeCdd8AzFZLZ/N1ujmilmCcBAQAAAAAAAACAPtXesZ0BNDMyMTUzMjEAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAdGVzdHVzZXJjdXJsaG9zdA==\r
+Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAACAAIAHAAAAAIAAgAeAAAAAAAAAAAAAAAhoIBADQzMjE1MzIxAAAAAAAAAAAAAAAAAAAAADj3hs3u3j0kgJqCrLM+74BmaoNHDfIJjHRlc3R1c2VyY3VybGhvc3Q=\r
 User-Agent: curl/7.10.6-pre1 (i686-pc-linux-gnu) libcurl/7.10.6-pre1 OpenSSL/0.9.7a ipv6 zlib/1.1.3\r
 Accept: */*\r
 \r
index b4bfc66..faffc5d 100644 (file)
@@ -53,7 +53,9 @@ http-proxy
 <tool>
 lib1509
 </tool>
-
+<features>
+proxy
+</features>
  <name>
 simple multi http:// through proxytunnel with authentication info
  </name>
index 38f5da6..6c09ae3 100644 (file)
@@ -4,13 +4,14 @@
 HTTP
 HTTP POST
 Content-Length
+chunked Transfer-Encoding
 </keywords>
 </info>
 
 # Server-side
 <reply>
 <data nocheck="yes">
-HTTP/1.1 411 Length Required\r
+HTTP/1.1 200 OK\r
 Date: Sun, 19 Jan 2014 18:50:58 GMT\r
 Server: test-server/fake swsclose\r
 Connection: close\r
@@ -36,13 +37,27 @@ http://%HOSTIP:%HTTPPORT/1514
 # Verify data after the test has been "shot"
 <verify>
 # Content-Length header is not present
+# Transfer-Encoding header is added automatically
 <protocol>
 POST /1514 HTTP/1.1\r
 Host: %HOSTIP:%HTTPPORT\r
 Accept: */*\r
+Transfer-Encoding: chunked\r
 Content-Type: application/x-www-form-urlencoded\r
 Expect: 100-continue\r
 \r
+1\r
+d\r
+1\r
+u\r
+1\r
+m\r
+1\r
+m\r
+1\r
+y\r
+0\r
+\r
 </protocol>
 </verify>
 </testcase>
diff --git a/tests/data/test1518 b/tests/data/test1518
new file mode 100644 (file)
index 0000000..134ea4a
--- /dev/null
@@ -0,0 +1,62 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+</keywords>
+</info>
+#
+# This reproduces issue #3340
+#
+# Server-side
+<reply>
+<data nocheck="yes">
+HTTP/1.1 302 redirect to broken URL
+Date: Thu, 17 Mar 2016 14:41:00 GMT
+Server: test-server/fake
+Content-Type: text/plain; charset=US-ASCII
+X-Special: swsclose
+Location: http://1.2 .4.5/test
+Content-Length: 0
+Connection: close
+
+</data>
+</reply>
+
+# Client-side
+<client>
+<server>
+http
+</server>
+# tool is what to use instead of 'curl'
+<tool>
+lib1518
+</tool>
+
+ <name>
+Extract Location: with broken URL
+ </name>
+ <command>
+http://%HOSTIP:%HTTPPORT/1518
+</command>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<strippart>
+
+</strippart>
+<protocol>
+</protocol>
+<stdout>
+res: 0
+status: 302
+redirects: 0
+effectiveurl: http://%HOSTIP:%HTTPPORT/1518
+redirecturl: http://1.2 .4.5/test
+</stdout>
+<errorcode>
+0
+</errorcode>
+</verify>
+</testcase>
diff --git a/tests/data/test1519 b/tests/data/test1519
new file mode 100644 (file)
index 0000000..292a49c
--- /dev/null
@@ -0,0 +1,62 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+</keywords>
+</info>
+#
+# This reproduces issue #3340
+#
+# Server-side
+<reply>
+<data nocheck="yes">
+HTTP/1.1 302 redirect to broken URL
+Date: Thu, 17 Mar 2016 14:41:00 GMT
+Server: test-server/fake
+Content-Type: text/plain; charset=US-ASCII
+X-Special: swsclose
+Location: h ttp://1.2.4.5/test
+Content-Length: 0
+Connection: close
+
+</data>
+</reply>
+
+# Client-side
+<client>
+<server>
+http
+</server>
+# tool is what to use instead of 'curl'
+<tool>
+lib1518
+</tool>
+
+ <name>
+Extract Location: with broken absolute URL
+ </name>
+ <command>
+http://%HOSTIP:%HTTPPORT/1519
+</command>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<strippart>
+
+</strippart>
+<protocol>
+</protocol>
+<stdout>
+res: 0
+status: 302
+redirects: 0
+effectiveurl: http://%HOSTIP:%HTTPPORT/1519
+redirecturl: http://%HOSTIP:%HTTPPORT/h%20ttp://1.2.4.5/test
+</stdout>
+<errorcode>
+0
+</errorcode>
+</verify>
+</testcase>
diff --git a/tests/data/test1523 b/tests/data/test1523
new file mode 100644 (file)
index 0000000..015f505
--- /dev/null
@@ -0,0 +1,49 @@
+<testcase>
+<info>
+<keywords>
+CURLINFO_LOW_SPEED_LIMIT
+</keywords>
+</info>
+
+# Server-side
+<reply>
+<data nocheck="yes">
+HTTP/1.1 200 OK
+Date: Thu, 09 Nov 2010 14:49:00 GMT
+Content-Length: 3
+Connection: close
+Funny-head: yesyes
+
+AA
+</data>
+<servercmd>
+writedelay: 1
+</servercmd>
+</reply>
+#
+# Client-side
+<client>
+<server>
+http
+</server>
+<tool>
+lib1523
+</tool>
+
+<name>
+CURLINFO_LOW_SPEED_LIMIT
+</name>
+
+<command>
+http://%HOSTIP:%HTTPPORT/1523
+</command>
+<killserver>
+http
+</killserver>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+</verify>
+</testcase>
index 595da5e..673e048 100644 (file)
@@ -49,6 +49,9 @@ CURLOPT_PROXYHEADER is ignored CURLHEADER_UNIFIED
  <command>
  http://the.old.moo.1525:%HTTPPORT/1525 %HOSTIP:%PROXYPORT
 </command>
+<features>
+proxy
+</features>
 </client>
 
 # Verify data after the test has been "shot"
index aa111c8..f6fb44d 100644 (file)
@@ -51,6 +51,9 @@ CURLOPT_PROXYHEADER: separate host/proxy headers
  <command>
  http://the.old.moo.1526:%HTTPPORT/1526 %HOSTIP:%PROXYPORT
 </command>
+<features>
+proxy
+</features>
 </client>
 
 # Verify data after the test has been "shot"
index e8d5279..6bb87d1 100644 (file)
@@ -50,6 +50,9 @@ Check same headers are generated with CURLOPT_HEADEROPT == CURLHEADER_UNIFIED
  <command>
  http://the.old.moo.1527:%HTTPPORT/1527 %HOSTIP:%PROXYPORT
 </command>
+<features>
+proxy
+</features>
 </client>
 
 # Verify data after the test has been "shot"
index 876806a..72c0a32 100644 (file)
@@ -43,6 +43,9 @@ Separately specified proxy/server headers sent in a proxy GET
  <command>
  http://the.old.moo:%HTTPPORT/1528 %HOSTIP:%PROXYPORT
 </command>
+<features>
+proxy
+</features>
 </client>
 
 # Verify data after the test has been "shot"
index 33df268..f7be503 100644 (file)
@@ -31,6 +31,9 @@ HTTP request-injection in URL sent over proxy
  <command>
  "http://the.old.moo:%HTTPPORT/1529" %HOSTIP:%PROXYPORT
 </command>
+<features>
+proxy
+</features>
 </client>
 
 # it should be detected and an error should be reported
index fc1d812..77f7adb 100644 (file)
@@ -9,7 +9,7 @@ HTTP Digest auth
 
 # Server-side
 <reply>
-# reply back and ask for Digest auth
+# First reply back and ask for Digest auth
 <data1>
 HTTP/1.1 401 Authorization Required swsclose\r
 Server: Apache/1.3.27 (Darwin) PHP/4.1.2\r
@@ -20,6 +20,17 @@ Content-Length: 26
 This is not the real page
 </data1>
 
+# second reply back
+<data2>
+HTTP/1.1 401 Authorization Required swsclose\r
+Server: Apache/1.3.27 (Darwin) PHP/4.1.2\r
+WWW-Authenticate: Digest realm="testrealm", nonce="1053604145"\r
+Content-Type: text/html; charset=iso-8859-1\r
+Content-Length: 26\r
+\r
+This is not the real page
+</data2>
+
 # This is supposed to be returned when the server gets a
 # Authorization: Digest line passed-in from the client
 <data1001>
@@ -40,7 +51,7 @@ HTTP/1.1 401 Authorization re-negotiation please swsbounce
 Server: Apache/1.3.27 (Darwin) PHP/4.1.2\r
 WWW-Authenticate: Digest realm="testrealm", algorithm=MD5, nonce="999999", stale=true, qop="auth"\r
 Content-Type: text/html; charset=iso-8859-1\r
-Content-Length: 25\r
+Content-Length: 26\r
 \r
 This is not the real page
 </data1002>
@@ -93,6 +104,11 @@ Accept: */*
 \r
 GET /1530002 HTTP/1.1\r
 Host: %HOSTIP:%HTTPPORT\r
+User-Agent: curl/7.11.0-CVS (i686-pc-linux-gnu) libcurl/7.11.0-CVS OpenSSL/0.9.6b ipv6 zlib/1.1.4 GSS\r
+Accept: */*\r
+\r
+GET /1530002 HTTP/1.1\r
+Host: %HOSTIP:%HTTPPORT\r
 Authorization: Digest username="testuser", realm="testrealm", nonce="1053604145", uri="/1530002", response="f84511b014fdd0ba6494f42871079c32"\r
 User-Agent: curl/7.11.0-CVS (i686-pc-linux-gnu) libcurl/7.11.0-CVS OpenSSL/0.9.6b ipv6 zlib/1.1.4 GSS\r
 Accept: */*\r
@@ -117,11 +133,17 @@ Content-Type: text/html; charset=iso-8859-1
 Content-Length: 23\r
 \r
 This IS the real page!
+HTTP/1.1 401 Authorization Required swsclose\r
+Server: Apache/1.3.27 (Darwin) PHP/4.1.2\r
+WWW-Authenticate: Digest realm="testrealm", nonce="1053604145"\r
+Content-Type: text/html; charset=iso-8859-1\r
+Content-Length: 26\r
+\r
 HTTP/1.1 401 Authorization re-negotiation please swsbounce\r
 Server: Apache/1.3.27 (Darwin) PHP/4.1.2\r
 WWW-Authenticate: Digest realm="testrealm", algorithm=MD5, nonce="999999", stale=true, qop="auth"\r
 Content-Type: text/html; charset=iso-8859-1\r
-Content-Length: 25\r
+Content-Length: 26\r
 \r
 HTTP/1.1 200 OK\r
 Server: Apache/1.3.27 (Darwin) PHP/4.1.2\r
index 98d6731..3b22ebc 100644 (file)
@@ -126,7 +126,9 @@ e90: SSL public key does not match pinned public key
 e91: SSL server certificate status verification FAILED
 e92: Stream error in the HTTP/2 framing layer
 e93: API function called from within callback
-e94: Unknown error
+e94: An authentication function returned an error
+e95: HTTP/3 error
+e96: Unknown error
 m-1: Please call curl_multi_perform() soon
 m0: No error
 m1: Invalid multi handle
@@ -137,7 +139,8 @@ m5: Invalid socket argument
 m6: Unknown option
 m7: The easy handle is already added to a multi handle
 m8: API function called from within callback
-m9: Unknown error
+m9: Wakeup is unavailable or failed
+m10: Unknown error
 s0: No error
 s1: Unknown share option
 s2: Share currently in use
diff --git a/tests/data/test1541 b/tests/data/test1541
new file mode 100644 (file)
index 0000000..e18bb47
--- /dev/null
@@ -0,0 +1,34 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+HTTP GET
+multi-threaded
+connection-sharing
+</keywords>
+</info>
+
+# Server-side
+<reply>
+</reply>
+
+# Client-side
+<client>
+<server>
+http
+</server>
+<tool>
+lib1541
+</tool>
+ <name>
+connection sharing using 67 parallel threads for 7 seconds
+ </name>
+ <command>
+http://%HOSTIP:%HTTPPORT/1
+</command>
+</client>
+
+# Verify data after the test has been "shot"
+<verify>
+</verify>
+</testcase>
index 9bdc841..0cfd10e 100644 (file)
@@ -31,7 +31,7 @@ HTTP/1.1 401 Type-1 received, send back type-2
 Server: Microsoft-IIS/5.0\r
 Content-Length: 34\r
 Content-Type: text/html; charset=iso-8859-1\r
-WWW-Authenticate: NTLM TlRMTVNTUAACAAAAAgACADAAAAAGgoEAc51AYVDgyNcAAAAAAAAAAG4AbgAyAAAAQ0MCAAQAQwBDAAEAEgBFAEwASQBTAEEAQgBFAFQASAAEABgAYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAwAsAGUAbABpAHMAYQBiAGUAdABoAC4AYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAAAAAA==\r
+WWW-Authenticate: NTLM TlRMTVNTUAACAAAAAgACADAAAACGggEAc51AYVDgyNcAAAAAAAAAAG4AbgAyAAAAQ0MCAAQAQwBDAAEAEgBFAEwASQBTAEEAQgBFAFQASAAEABgAYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAwAsAGUAbABpAHMAYQBiAGUAdABoAC4AYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAAAAAA==\r
 \r
 This is not the real page either!
 </data1001>
@@ -60,7 +60,7 @@ HTTP/1.1 401 Type-1 received, send back type-2
 Server: Microsoft-IIS/5.0\r
 Content-Length: 34\r
 Content-Type: text/html; charset=iso-8859-1\r
-WWW-Authenticate: NTLM TlRMTVNTUAACAAAAAgACADAAAAAGgoEAc51AYVDgyNcAAAAAAAAAAG4AbgAyAAAAQ0MCAAQAQwBDAAEAEgBFAEwASQBTAEEAQgBFAFQASAAEABgAYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAwAsAGUAbABpAHMAYQBiAGUAdABoAC4AYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAAAAAA==\r
+WWW-Authenticate: NTLM TlRMTVNTUAACAAAAAgACADAAAACGggEAc51AYVDgyNcAAAAAAAAAAG4AbgAyAAAAQ0MCAAQAQwBDAAEAEgBFAEwASQBTAEEAQgBFAFQASAAEABgAYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAwAsAGUAbABpAHMAYQBiAGUAdABoAC4AYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAAAAAA==\r
 \r
 HTTP/1.1 200 Type-3 Received and all Things are fine swsclose\r
 Server: Microsoft-IIS/5.0\r
@@ -76,6 +76,7 @@ Finally, this is the real page!
 <client>
 <features>
 NTLM
+SSL
 !SSPI
 debug
 </features>
@@ -125,7 +126,7 @@ Content-Length: 0
 \r
 PUT /155 HTTP/1.1\r
 Host: %HOSTIP:%HTTPPORT\r
-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAAAAAD2AAAACAAIAPYAAAAIAAgA/gAAAAAAAAAAAAAABoKBAMOv20GsURsat8gdH/RfnYI0MzIxNTMyMeCdd8AzFZLZ/N1ujmilmCcBAQAAAAAAAACAPtXesZ0BNDMyMTUzMjEAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAdGVzdHVzZXJjdXJsaG9zdA==\r
+Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAACAAIAHAAAAAIAAgAeAAAAAAAAAAAAAAAhoIBADQzMjE1MzIxAAAAAAAAAAAAAAAAAAAAADj3hs3u3j0kgJqCrLM+74BmaoNHDfIJjHRlc3R1c2VyY3VybGhvc3Q=\r
 User-Agent: curl/7.10.5 (i686-pc-linux-gnu) libcurl/7.10.5 OpenSSL/0.9.7a ipv6 zlib/1.1.3\r
 Accept: */*\r
 Content-Length: 85\r
index be48e02..06f1897 100644 (file)
@@ -38,6 +38,8 @@ run 1: foobar and so on fun!
 <- Mutex unlock
 -> Mutex lock
 <- Mutex unlock
+-> Mutex lock
+<- Mutex unlock
 run 1: foobar and so on fun!
 -> Mutex lock
 <- Mutex unlock
@@ -47,6 +49,8 @@ run 1: foobar and so on fun!
 <- Mutex unlock
 -> Mutex lock
 <- Mutex unlock
+-> Mutex lock
+<- Mutex unlock
 run 1: foobar and so on fun!
 -> Mutex lock
 <- Mutex unlock
@@ -54,6 +58,8 @@ run 1: foobar and so on fun!
 <- Mutex unlock
 -> Mutex lock
 <- Mutex unlock
+-> Mutex lock
+<- Mutex unlock
 </datacheck>
 </reply>
 
diff --git a/tests/data/test1558 b/tests/data/test1558
new file mode 100644 (file)
index 0000000..f1538c2
--- /dev/null
@@ -0,0 +1,46 @@
+<testcase>
+<info>
+<keywords>
+curl_easy_getinfo
+CURLINFO_PROTOCOL
+</keywords>
+</info>
+
+<reply>
+</reply>
+
+<client>
+<server>
+none
+</server>
+<features>
+file
+</features>
+<tool>
+lib1558
+</tool>
+
+<name>
+CURLINFO_PROTOCOL for file:// transfer
+</name>
+<command>
+file://%FILE_PWD/log/data1558
+</command>
+<file name="log/data1558">
+hello
+</file>
+</client>
+
+#
+# Verify that the test runs to completion without crashing
+<verify>
+<errorcode>
+0
+</errorcode>
+<stdout>
+hello
+Protocol: 400
+</stdout>
+</verify>
+
+</testcase>
diff --git a/tests/data/test1559 b/tests/data/test1559
new file mode 100644 (file)
index 0000000..cbed6fb
--- /dev/null
@@ -0,0 +1,44 @@
+<testcase>
+<info>
+<keywords>
+CURLOPT_URL
+</keywords>
+</info>
+
+<reply>
+</reply>
+
+<client>
+<server>
+none
+</server>
+
+# require HTTP so that CURLOPT_POSTFIELDS works as assumed
+<features>
+http
+</features>
+<tool>
+lib1559
+</tool>
+
+<name>
+Set excessive URL lengths
+</name>
+</client>
+
+#
+# Verify that the test runs to completion without crashing
+<verify>
+<errorcode>
+0
+</errorcode>
+<stdout>
+CURLOPT_URL 10000000 bytes URL == 43
+CURLOPT_POSTFIELDS 10000000 bytes data == 0
+CURLUPART_URL 10000000 bytes URL == 3
+CURLUPART_SCHEME 10000000 bytes scheme == 3
+CURLUPART_USER 10000000 bytes user == 3
+</stdout>
+</verify>
+
+</testcase>
index 4b6c97a..0a132a1 100644 (file)
@@ -22,6 +22,7 @@ imap
 ldap
 dict
 ftp
+ipv6
 </features>
  <name>
 URL API
@@ -31,4 +32,16 @@ lib1560
 </tool>
 </client>
 
+<verify>
+<stdout>
+we got [fe80::20c:29ff:fe9c:409b]
+we got https://[::1]/hello.html
+we got https://example.com/hello.html
+we got https://[fe80::20c:29ff:fe9c:409b%25eth0]/hello.html
+we got [fe80::20c:29ff:fe9c:409b]
+we got eth0
+we got https://[fe80::20c:29ff:fe9c:409b%25clown]/hello.html
+success
+</stdout>
+</verify>
 </testcase>
diff --git a/tests/data/test1561 b/tests/data/test1561
new file mode 100644 (file)
index 0000000..69352fd
--- /dev/null
@@ -0,0 +1,106 @@
+<testcase>
+<info>
+<keywords>
+HTTPS
+HTTP
+HTTP GET
+cookies
+cookiejar
+HTTP replaced headers
+</keywords>
+</info>
+
+# Server-side
+<reply>
+<data1>
+HTTP/1.1 200 OK
+Date: Thu, 09 Nov 2010 14:49:00 GMT
+Server: test-server/fake
+Set-Cookie: super=secret; domain=example.com; path=/1561; secure;
+Set-Cookie: supersuper=secret; domain=example.com; path=/1561/login/; secure;
+Set-Cookie: __Secure-SID=12345; Domain=example.com
+Set-Cookie: __Secure-SID=12346; Secure; Domain=example.com
+Set-Cookie: supersupersuper=secret; __Secure-SID=12346; Secure; Domain=example.com
+Set-Cookie: __Host-SID=22345
+Set-Cookie: __Host-SID=22346; Secure
+Set-Cookie: __Host-SID=22347; Domain=example.com
+Set-Cookie: __Host-SID=22348; Domain=example.com; Path=/
+Set-Cookie: __Host-SID=22349; Secure; Domain=example.com; Path=/
+Set-Cookie: __Host-SID=12346; Secure; Path=/
+Content-Length: 7
+
+nomnom
+</data1>
+<data2>
+HTTP/1.1 200 OK
+Date: Thu, 09 Nov 2010 14:49:00 GMT
+Server: test-server/fake
+Set-Cookie: super=secret; domain=example.com; path=/1561; httponly;
+Set-Cookie: super=secret; domain=example.com; path=/1561/; httponly;
+Set-Cookie: super=secret; domain=example.com; path=/15; httponly;
+Set-Cookie: public=yes; domain=example.com; path=/foo;
+Set-Cookie: supersuper=secret; domain=example.com; path=/1561/login/en;
+Set-Cookie: supersuper=secret; domain=example.com; path=/1561/login;
+Set-Cookie: secureoverhttp=yes; domain=example.com; path=/1561; secure;
+Set-Cookie: __Secure-SID=22345; Domain=example.com
+Set-Cookie: __Secure-SID=22346; Secure; Domain=example.com
+Set-Cookie: __Host-SID=32345
+Set-Cookie: __Host-SID=32346; Secure
+Set-Cookie: __Host-SID=32347; Domain=example.com
+Set-Cookie: __Host-SID=32348; Domain=example.com; Path=/
+Set-Cookie: __Host-SID=32349; Secure; Domain=example.com; Path=/
+Set-Cookie: __Host-SID=32350; Secure; Path=/
+Content-Length: 7
+
+nomnom
+</data2>
+</reply>
+
+# Client-side
+<client>
+<features>
+SSL
+</features>
+<server>
+http
+https
+</server>
+<name>
+Cookies set over HTTP can't override secure ones
+</name>
+<command>
+-k https://%HOSTIP:%HTTPSPORT/15610001 -L -c log/jar1561.txt -H "Host: www.example.com"  http://%HOSTIP:%HTTPPORT/15610002 -L -c log/jar1561.txt -H "Host: www.example.com"
+</command>
+</client>
+<verify>
+<strip>
+^User-Agent:.*
+</strip>
+<protocol>
+GET /15610001 HTTP/1.1\r
+Host: www.example.com\r
+User-Agent: curl/7.62.0-DEV\r
+Accept: */*\r
+\r
+GET /15610002 HTTP/1.1\r
+Host: www.example.com\r
+User-Agent: curl/7.62.0-DEV\r
+Accept: */*\r
+\r
+</protocol>
+<file name="log/jar1561.txt" mode="text">
+# Netscape HTTP Cookie File
+# https://curl.haxx.se/docs/http-cookies.html
+# This file was generated by libcurl! Edit at your own risk.
+
+.example.com   TRUE    /foo    FALSE   0       public  yes
+www.example.com        FALSE   /       TRUE    0       __Host-SID      12346
+.example.com   TRUE    /       TRUE    0       supersupersuper secret
+.example.com   TRUE    /       TRUE    0       __Secure-SID    12346
+.example.com   TRUE    /1561/login/    TRUE    0       supersuper      secret
+#HttpOnly_.example.com TRUE    /15     FALSE   0       super   secret
+</file>
+
+</verify>
+
+</testcase>
diff --git a/tests/data/test1562 b/tests/data/test1562
new file mode 100644 (file)
index 0000000..59cb9cc
--- /dev/null
@@ -0,0 +1,72 @@
+<testcase>
+<info>
+<keywords>
+HTTPS
+HTTP
+HTTP GET
+cookies
+HTTP replaced headers
+</keywords>
+</info>
+
+# Server-side
+<reply>
+<data1>
+HTTP/1.1 200 OK
+Date: Thu, 09 Nov 2010 14:49:00 GMT
+Server: test-server/fake
+Set-Cookie: foo=123; path=/; secure;
+Content-Length: 7
+
+nomnom
+</data1>
+<data2>
+HTTP/1.1 200 OK
+Date: Thu, 09 Nov 2010 14:49:00 GMT
+Server: test-server/fake
+Set-Cookie: foo=; Expires=Thu, 01-Jan-1970 00:00:00 GMT; Max-Age=0; Path=/
+Content-Length: 7
+
+nomnom
+</data2>
+</reply>
+
+# Client-side
+<client>
+<features>
+SSL
+</features>
+<server>
+http
+https
+</server>
+<name>
+Expire secure cookies over HTTPS
+</name>
+<command>
+-k https://%HOSTIP:%HTTPSPORT/15620001 -H "Host: www.example.com" https://%HOSTIP:%HTTPSPORT/15620002 -b "non-existing" https://%HOSTIP:%HTTPSPORT/15620001
+</command>
+</client>
+<verify>
+<strip>
+^User-Agent:.*
+</strip>
+<protocol>
+GET /15620001 HTTP/1.1\r
+Host: www.example.com\r
+Accept: */*\r
+\r
+GET /15620002 HTTP/1.1\r
+Host: www.example.com\r
+Accept: */*\r
+Cookie: foo=123\r
+\r
+GET /15620001 HTTP/1.1\r
+Host: www.example.com\r
+Accept: */*\r
+\r
+</protocol>
+
+</verify>
+
+</testcase>
diff --git a/tests/data/test1563 b/tests/data/test1563
new file mode 100644 (file)
index 0000000..a3597b9
--- /dev/null
@@ -0,0 +1,51 @@
+<testcase>
+<info>
+<keywords>
+GOPHER
+HTTP GET
+followlocation
+</keywords>
+</info>
+
+# Server-side
+<reply>
+<data1>
+HTTP/1.1 302 OK
+Date: Thu, 09 Nov 2010 14:49:00 GMT
+Server: test-server/fake
+Content-Length: 7
+Location: gopher://www.example.co.uk
+
+nomnom
+</data1>
+</reply>
+
+# Client-side
+<client>
+<server>
+http
+</server>
+<name>
+Make sure redirects to CURLPROTO_GOPHER are forbidden by default
+</name>
+<command>
+http://%HOSTIP:%HTTPPORT/15630001 -L -H "Host: www.example.com"
+</command>
+</client>
+<verify>
+<strip>
+^User-Agent:.*
+</strip>
+<errorcode>
+1
+</errorcode>
+<protocol>
+GET /15630001 HTTP/1.1\r
+Host: www.example.com\r
+Accept: */*\r
+\r
+</protocol>
+
+</verify>
+
+</testcase>
diff --git a/tests/data/test1564 b/tests/data/test1564
new file mode 100644 (file)
index 0000000..279665b
--- /dev/null
@@ -0,0 +1,31 @@
+<testcase>
+<info>
+<keywords>
+multi
+wakeup
+</keywords>
+</info>
+
+# Server-side
+<reply>
+</reply>
+
+# Client-side
+<client>
+<server>
+none
+</server>
+<tool>
+lib1564
+</tool>
+<name>
+wakeup before poll with no easy handles
+</name>
+<command>
+</command>
+</client>
+
+# Verify data after the test has been "shot"
+<verify>
+</verify>
+</testcase>
diff --git a/tests/data/test1565 b/tests/data/test1565
new file mode 100644 (file)
index 0000000..f554e0f
--- /dev/null
@@ -0,0 +1,41 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+HTTP GET
+multi
+multi-threaded
+wakeup
+</keywords>
+</info>
+
+# Server-side
+<reply>
+<data nocheck="yes">
+HTTP/1.1 200 OK
+Content-Length: 3
+
+OK
+</data>
+</reply>
+
+# Client-side
+<client>
+<server>
+http
+</server>
+<tool>
+lib1565
+</tool>
+<name>
+wakeup from another thread
+</name>
+<command>
+http://%HOSTIP:%HTTPPORT/1
+</command>
+</client>
+
+# Verify data after the test has been "shot"
+<verify>
+</verify>
+</testcase>
index 5a06217..a56986f 100644 (file)
@@ -43,6 +43,7 @@ This is not the real page either!
 <client>
 <features>
 NTLM
+SSL
 !SSPI
 debug
 </features>
diff --git a/tests/data/test1591 b/tests/data/test1591
new file mode 100644 (file)
index 0000000..526933a
--- /dev/null
@@ -0,0 +1,63 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+HTTP PUT
+CURLOPT_HTTPTRAILER_FUNCTION
+CURLOPT_HTTPTRAILER_DATA
+</keywords>
+</info>
+
+# Server-side
+<reply>
+<data nocheck="yes">
+HTTP/1.0 200 OK swsclose
+Date: Thu, 09 Nov 2010 14:49:00 GMT
+Server: test-server/fake
+</data>
+</reply>
+# Client-side
+<client>
+<features>
+http
+</features>
+<server>
+http
+</server>
+<name>
+HTTP PUT with trailers at the end
+</name>
+<tool>
+lib1591
+</tool>
+<command>
+http://%HOSTIP:%HTTPPORT/bzz/1591
+</command>
+<stdin>
+more than one byte
+</stdin>
+</client>
+
+# Verify data after the test has been "shot"
+<verify>
+<strip>
+^User-Agent:.*
+</strip>
+<protocol>
+PUT /bzz/1591 HTTP/1.1\r
+Host: %HOSTIP:%HTTPPORT\r
+Accept: */*\r
+Transfer-Encoding: chunked\r
+Trailer: my-super-awesome-trailer, my-other-awesome-trailer\r
+Expect: 100-continue\r
+\r
+e\r
+Hello Cloud!\r
+\r
+0\r
+my-super-awesome-trailer: trail1\r
+my-other-awesome-trailer: trail2\r
+\r
+</protocol>
+</verify>
+</testcase>
diff --git a/tests/data/test1592 b/tests/data/test1592
new file mode 100644 (file)
index 0000000..d1346e1
--- /dev/null
@@ -0,0 +1,37 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+multi
+resolve
+speedcheck
+</keywords>
+</info>
+
+# Client-side
+<client>
+<server>
+none
+</server>
+<tool>
+lib1592
+</tool>
+ <name>
+HTTP request, remove handle while resolving, don't block
+ </name>
+
+ <command>
+http://a-site-never-accessed.example.org/1592
+</command>
+</client>
+
+# Verify data after the test has been "shot"
+<verify>
+<valgrind>
+disable
+</valgrind>
+<errorcode>
+0
+</errorcode>
+</verify>
+</testcase>
diff --git a/tests/data/test1593 b/tests/data/test1593
new file mode 100644 (file)
index 0000000..405aa84
--- /dev/null
@@ -0,0 +1,49 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+HTTP GET
+HTTP replaced headers
+CURLOPT_TIMECONDITION
+If-Modified-Since
+</keywords>
+</info>
+
+# Server-side
+<reply>
+<data nocheck="yes">
+HTTP/1.1 304 Not Modified
+Date: Thu, 11 Jul 2019 02:26:59 GMT
+Server: test-server/swsclose
+
+</data>
+</reply>
+# Client-side
+<client>
+<server>
+http
+</server>
+<name>
+HTTP custom header overrides CURLOPT_TIMECONDITION
+</name>
+<tool>
+lib1593
+</tool>
+<command>
+http://%HOSTIP:%HTTPPORT/1593
+</command>
+</client>
+
+<verify>
+<strip>
+^User-Agent:.*
+</strip>
+# Note here the lack of If-Modified-Since
+<protocol>
+GET /1593 HTTP/1.1\r
+Host: %HOSTIP:%HTTPPORT\r
+Accept: */*\r
+\r
+</protocol>
+</verify>
+</testcase>
diff --git a/tests/data/test1594 b/tests/data/test1594
new file mode 100644 (file)
index 0000000..4907ca2
--- /dev/null
@@ -0,0 +1,52 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+HTTP GET
+HTTP replaced headers
+CURLOPT_TIMECONDITION
+If-Modified-Since
+</keywords>
+</info>
+
+# Server-side
+<reply>
+<data nocheck="yes">
+HTTP/1.1 503 Error
+Date: Thu, 11 Jul 2019 02:26:59 GMT
+Server: test-server/swsclose
+Retry-After: 22
+
+</data>
+</reply>
+# Client-side
+<client>
+<server>
+http
+</server>
+<name>
+HTTP Retry-After header parsing and extraction
+</name>
+<tool>
+lib1594
+</tool>
+<command>
+http://%HOSTIP:%HTTPPORT/1594
+</command>
+</client>
+
+<verify>
+<strip>
+^User-Agent:.*
+</strip>
+<protocol>
+GET /1594 HTTP/1.1\r
+Host: %HOSTIP:%HTTPPORT\r
+Accept: */*\r
+\r
+</protocol>
+<stdout>
+Retry-After: 22
+</stdout>
+</verify>
+</testcase>
diff --git a/tests/data/test1595 b/tests/data/test1595
new file mode 100644 (file)
index 0000000..29b2b86
--- /dev/null
@@ -0,0 +1,51 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+HTTP GET
+HTTP replaced headers
+CURLOPT_TIMECONDITION
+If-Modified-Since
+</keywords>
+</info>
+
+# Server-side
+<reply>
+<data nocheck="yes">
+HTTP/1.1 503 Error
+Date: Thu, 11 Jul 2019 02:26:59 GMT
+Server: test-server/swsclose
+
+</data>
+</reply>
+# Client-side
+<client>
+<server>
+http
+</server>
+<name>
+HTTP Retry-After header extraction (without header)
+</name>
+<tool>
+lib1594
+</tool>
+<command>
+http://%HOSTIP:%HTTPPORT/1595
+</command>
+</client>
+
+<verify>
+<strip>
+^User-Agent:.*
+</strip>
+<protocol>
+GET /1595 HTTP/1.1\r
+Host: %HOSTIP:%HTTPPORT\r
+Accept: */*\r
+\r
+</protocol>
+<stdout>
+Retry-After: 0
+</stdout>
+</verify>
+</testcase>
diff --git a/tests/data/test1596 b/tests/data/test1596
new file mode 100644 (file)
index 0000000..77a10f0
--- /dev/null
@@ -0,0 +1,52 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+HTTP GET
+HTTP replaced headers
+CURLOPT_TIMECONDITION
+If-Modified-Since
+</keywords>
+</info>
+
+# Server-side
+<reply>
+<data nocheck="yes">
+HTTP/1.1 429 Too Many Requests
+Date: Thu, 11 Jul 2019 02:26:59 GMT
+Server: test-server/swsclose
+Retry-After: Thu, 11 Jul 2024 02:26:59 GMT
+
+</data>
+</reply>
+# Client-side
+<client>
+<server>
+http
+</server>
+<name>
+HTTP Retry-After header parsing using a date
+</name>
+<tool>
+lib1596
+</tool>
+<command>
+http://%HOSTIP:%HTTPPORT/1596
+</command>
+</client>
+
+<verify>
+<strip>
+^User-Agent:.*
+</strip>
+<protocol>
+GET /1596 HTTP/1.1\r
+Host: %HOSTIP:%HTTPPORT\r
+Accept: */*\r
+\r
+</protocol>
+<stdout>
+Retry-After: 172066
+</stdout>
+</verify>
+</testcase>
index 15f4c7a..399aa94 100644 (file)
@@ -33,6 +33,9 @@ HTTP with proxy authorization
  <command>
  -U fake@user:loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong -x %HOSTIP:%HTTPPORT http://we.want.that.site.com/16
 </command>
+<features>
+proxy
+</features>
 </client>
 
 # Verify data after the test has been "shot"
index ee2f40a..29791d9 100644 (file)
@@ -27,7 +27,9 @@ isn't because there's no Proxy-Authorization: NTLM header
 <client>
 <features>
 NTLM
+SSL
 !SSPI
+proxy
 </features>
 <server>
 http
diff --git a/tests/data/test1621 b/tests/data/test1621
new file mode 100644 (file)
index 0000000..1117d1b
--- /dev/null
@@ -0,0 +1,27 @@
+<testcase>
+<info>
+<keywords>
+unittest
+stripcredentials
+</keywords>
+</info>
+
+#
+# Client-side
+<client>
+<server>
+none
+</server>
+<features>
+unittest
+https
+</features>
+ <name>
+unit tests for stripcredentials from URL
+ </name>
+<tool>
+unit1621
+</tool>
+</client>
+
+</testcase>
index b9a1ed7..47de391 100644 (file)
@@ -29,9 +29,10 @@ http
 </server>
 <features>
 idn
+proxy
 </features>
 <setenv>
-LC_ALL=
+LC_ALL=en_US.UTF-8
 LC_CTYPE=en_US.UTF-8
 </setenv>
 <precheck>
index 13ca023..7a02a6d 100644 (file)
@@ -14,7 +14,7 @@ none
 </server>
 <features>
 unittest
-http/2
+DoH
 </features>
  <name>
 DOH
diff --git a/tests/data/test1652 b/tests/data/test1652
new file mode 100644 (file)
index 0000000..c411690
--- /dev/null
@@ -0,0 +1,23 @@
+<testcase>
+<info>
+<keywords>
+unittest
+infof
+</keywords>
+</info>
+
+<client>
+<server>
+none
+</server>
+<features>
+unittest
+</features>
+<name>
+infof
+</name>
+<tool>
+unit1652
+</tool>
+</client>
+</testcase>
diff --git a/tests/data/test1653 b/tests/data/test1653
new file mode 100644 (file)
index 0000000..0de2c14
--- /dev/null
@@ -0,0 +1,23 @@
+<testcase>
+<info>
+<keywords>
+unittest
+urlapi
+</keywords>
+</info>
+
+<client>
+<server>
+none
+</server>
+<features>
+unittest
+</features>
+<name>
+urlapi
+</name>
+<tool>
+unit1653
+</tool>
+</client>
+</testcase>
diff --git a/tests/data/test1654 b/tests/data/test1654
new file mode 100644 (file)
index 0000000..6a82daa
--- /dev/null
@@ -0,0 +1,59 @@
+<testcase>
+<info>
+<keywords>
+unittest
+alt-svc
+altsvc
+</keywords>
+</info>
+
+<client>
+<server>
+none
+</server>
+<features>
+unittest
+alt-svc
+</features>
+
+# This date is exactly "20190124 22:34:21" UTC
+<setenv>
+CURL_TIME=1548369261
+</setenv>
+<name>
+alt-svc
+</name>
+<command>
+log/1654
+</command>
+<tool>
+unit1654
+</tool>
+<file name="log/1654" mode="text">
+h2 example.com 443 h3 shiny.example.com 8443 "20191231 00:00:00" 0 1
+# a comment
+h2 foo.example.com 443 h3 shiny.example.com 8443 "20291231 23:30:00" 0 1
+  h1 example.com 443 h3 shiny.example.com 8443 "20121231 00:00:01" 0 1
+       h3 example.com 443 h3 shiny.example.com 8443 "20131231 00:00:00" 0 1
+    # also a comment
+bad example.com 443 h3 shiny.example.com 8443 "20191231 00:00:00" 0 1
+rubbish
+</file>
+</client>
+<verify>
+<file name="log/1654-out" mode="text">
+# Your alt-svc cache. https://curl.haxx.se/docs/alt-svc.html
+# This file was generated by libcurl! Edit at your own risk.
+h2 example.com 443 h3 shiny.example.com 8443 "20191231 00:00:00" 0 1
+h2 foo.example.com 443 h3 shiny.example.com 8443 "20291231 23:30:00" 0 1
+h1 example.com 443 h3 shiny.example.com 8443 "20121231 00:00:01" 0 1
+h3 example.com 443 h3 shiny.example.com 8443 "20131231 00:00:00" 0 1
+h1 example.org 8080 h2 example.com 8080 "20190125 22:34:21" 0 0
+h1 2.example.org 8080 h3 2.example.org 8080 "20190125 22:34:21" 0 0
+h1 3.example.org 8080 h2 example.com 8080 "20190125 22:34:21" 0 0
+h1 3.example.org 8080 h3 yesyes.com 8080 "20190125 22:34:21" 0 0
+h2 example.org 80 h2 example.com 443 "20190124 22:36:21" 0 0
+h2 example.net 80 h2 example.net 443 "20190124 22:37:21" 0 0
+</file>
+</verify>
+</testcase>
diff --git a/tests/data/test1655 b/tests/data/test1655
new file mode 100644 (file)
index 0000000..2e73f55
--- /dev/null
@@ -0,0 +1,27 @@
+<testcase>
+<info>
+<keywords>
+unittest
+doh
+</keywords>
+</info>
+
+#
+# Client-side
+<client>
+<server>
+none
+</server>
+<features>
+unittest
+DoH
+</features>
+ <name>
+unit test for doh_encode
+ </name>
+<tool>
+unit1655
+</tool>
+</client>
+
+</testcase>
index 0b14996..e08555e 100644 (file)
@@ -45,6 +45,7 @@ http
 <features>
 !SSPI
 crypto
+proxy
 </features>
  <name>
 HTTP with proxy-requiring-Basic to site-requiring-Digest
index 20e0b6d..fb87620 100644 (file)
@@ -59,6 +59,7 @@ http
 <features>
 !SSPI
 crypto
+proxy
 </features>
  <name>
 HTTP with proxy-requiring-Digest to site-requiring-Digest
index c1f1b37..209dd9d 100644 (file)
@@ -33,7 +33,7 @@ HTTP/1.1 407 NTLM type-1 received sending back type-2
 Server: Microsoft-IIS/5.0\r
 Content-Length: 34\r
 Content-Type: text/html; charset=iso-8859-1\r
-Proxy-Authenticate: NTLM TlRMTVNTUAACAAAAAgACADAAAAAGgoEAc51AYVDgyNcAAAAAAAAAAG4AbgAyAAAAQ0MCAAQAQwBDAAEAEgBFAEwASQBTAEEAQgBFAFQASAAEABgAYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAwAsAGUAbABpAHMAYQBiAGUAdABoAC4AYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAAAAAA==\r
+Proxy-Authenticate: NTLM TlRMTVNTUAACAAAAAgACADAAAACGggEAc51AYVDgyNcAAAAAAAAAAG4AbgAyAAAAQ0MCAAQAQwBDAAEAEgBFAEwASQBTAEEAQgBFAFQASAAEABgAYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAwAsAGUAbABpAHMAYQBiAGUAdABoAC4AYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAAAAAA==\r
 \r
 This is not the real page either!
 </data1001>
@@ -55,7 +55,7 @@ HTTP/1.1 407 NTLM type-1 received sending back type-2
 Server: Microsoft-IIS/5.0\r
 Content-Length: 34\r
 Content-Type: text/html; charset=iso-8859-1\r
-Proxy-Authenticate: NTLM TlRMTVNTUAACAAAAAgACADAAAAAGgoEAc51AYVDgyNcAAAAAAAAAAG4AbgAyAAAAQ0MCAAQAQwBDAAEAEgBFAEwASQBTAEEAQgBFAFQASAAEABgAYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAwAsAGUAbABpAHMAYQBiAGUAdABoAC4AYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAAAAAA==\r
+Proxy-Authenticate: NTLM TlRMTVNTUAACAAAAAgACADAAAACGggEAc51AYVDgyNcAAAAAAAAAAG4AbgAyAAAAQ0MCAAQAQwBDAAEAEgBFAEwASQBTAEEAQgBFAFQASAAEABgAYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAwAsAGUAbABpAHMAYQBiAGUAdABoAC4AYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAAAAAA==\r
 \r
 HTTP/1.1 401 You now need to authenticate with the host\r
 Server: Microsoft-IIS/5.0\r
@@ -77,8 +77,10 @@ http
 </server>
 <features>
 NTLM
+SSL
 !SSPI
 debug
+proxy
 </features>
  <name>
 HTTP with proxy-requiring-NTLM to site-requiring-Digest
@@ -112,7 +114,7 @@ Proxy-Connection: Keep-Alive
 \r
 GET http://data.from.server.requiring.digest.hohoho.com/169 HTTP/1.1\r
 Host: data.from.server.requiring.digest.hohoho.com\r
-Proxy-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAAAAAD2AAAACAAIAPYAAAAIAAgA/gAAAAAAAAAAAAAABoKBAMOv20GsURsat8gdH/RfnYI0MzIxNTMyMeCdd8AzFZLZ/N1ujmilmCcBAQAAAAAAAACAPtXesZ0BNDMyMTUzMjEAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAdGVzdHVzZXJjdXJsaG9zdA==\r
+Proxy-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAACAAIAHAAAAAIAAgAeAAAAAAAAAAAAAAAhoIBADQzMjE1MzIxAAAAAAAAAAAAAAAAAAAAADj3hs3u3j0kgJqCrLM+74BmaoNHDfIJjHRlc3R1c2VyY3VybGhvc3Q=\r
 User-Agent: curl/7.12.0-CVS (i686-pc-linux-gnu) libcurl/7.12.0-CVS OpenSSL/0.9.6b ipv6 zlib/1.1.4 GSS libidn/0.4.3\r
 Accept: */*\r
 Proxy-Connection: Keep-Alive\r
index 8ce7774..9b41ddd 100644 (file)
@@ -19,7 +19,9 @@ http
 </server>
 <features>
 NTLM
+SSL
 !SSPI
+proxy
 </features>
  <name>
 HTTP POST with --proxy-ntlm and no SSL with no response
index 09e48b7..482c0b7 100644 (file)
@@ -33,6 +33,9 @@ HTTP, get cookie with dot prefixed full domain
  <command>
 -c log/jar171 -x %HOSTIP:%HTTPPORT http://z.x.com/171
 </command>
+<features>
+proxy
+</features>
 </client>
 
 # Verify data after the test has been "shot"
index 73c53ca..e18837a 100644 (file)
@@ -48,6 +48,7 @@ content for you
 <client>
 <features>
 NTLM
+SSL
 !SSPI
 </features>
 <server>
index f8f7811..3a94c00 100644 (file)
@@ -38,6 +38,9 @@ supertrooper.fake     FALSE   /a      FALSE   2139150993      mooo    indeed
 supertrooper.fake      FALSE   /b      FALSE   0               moo1    indeed
 supertrooper.fake      FALSE   /c      FALSE   2139150993      moo2    indeed
 </file>
+<features>
+proxy
+</features>
 </client>
 
 # Verify data after the test has been "shot"
index f34dc0c..cf992a2 100644 (file)
@@ -30,6 +30,9 @@ HTTP GET two URLs over a single proxy with persistent connection
  <command>
 http://deathstar.another.galaxy/183 http://a.galaxy.far.far.away/183 --proxy http://%HOSTIP:%HTTPPORT
 </command>
+<features>
+proxy
+</features>
 </client>
 
 # Verify data after the test has been "shot"
index 8b09dde..42e652e 100644 (file)
@@ -50,6 +50,9 @@ HTTP replace Host: when following Location: to new host
  <command>
 http://deathstar.another.galaxy/184 -L -H "Host: another.visitor.stay.a.while.stay.foreeeeeever" --proxy http://%HOSTIP:%HTTPPORT
 </command>
+<features>
+proxy
+</features>
 </client>
 
 # Verify data after the test has been "shot"
index 298dd49..3bc58a0 100644 (file)
@@ -50,6 +50,9 @@ HTTP replace Host: when following Location: on the same host
  <command>
 http://deathstar.another.galaxy/185 -L -H "Host: another.visitor.stay.a.while.stay.foreeeeeever" --proxy http://%HOSTIP:%HTTPPORT
 </command>
+<features>
+proxy
+</features>
 </client>
 
 # Verify data after the test has been "shot"
index a23a2a1..d8ca1cd 100644 (file)
@@ -14,7 +14,7 @@ followlocation
 <data>
 HTTP/1.1 301 OK swsbounce
 Location: /188
-Content-Length: 2
+Content-Length: 3
 
 OK
 </data>
@@ -30,7 +30,7 @@ Actual content
 <datacheck>
 HTTP/1.1 301 OK swsbounce
 Location: /188
-Content-Length: 2
+Content-Length: 3
 
 HTTP/1.1 200 OK 
 Connection: close
index f82b4ad..65780f8 100644 (file)
@@ -11,7 +11,7 @@ HTTP GET
 <data>
 HTTP/1.1 301 OK swsbounce
 Location: /189
-Content-Length: 2
+Content-Length: 3
 
 OK
 </data>
@@ -26,7 +26,7 @@ Actual content
 <datacheck>
 HTTP/1.1 301 OK swsbounce
 Location: /189
-Content-Length: 2
+Content-Length: 3
 
 HTTP/1.1 200 OK 
 Connection: close
index dd60b8c..8e1bf5e 100644 (file)
@@ -24,7 +24,7 @@ http
 attempt connect to non-listening socket
  </name>
  <command>
-%HOSTIP:60000
+%HOSTIP:2
 </command>
 </client>
 
index 08ad534..7602854 100644 (file)
@@ -53,6 +53,9 @@ HTTP CONNECT with 204 response
  <command>
 http://test.1904:%HTTPPORT/we/want/that/page/1904 -p --proxy %HOSTIP:%PROXYPORT
 </command>
+<features>
+proxy
+</features>
 </client>
 
 #
diff --git a/tests/data/test1905 b/tests/data/test1905
new file mode 100644 (file)
index 0000000..0459b10
--- /dev/null
@@ -0,0 +1,60 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+cookies
+FLUSH
+</keywords>
+</info>
+
+# Server-side
+<reply>
+<data nocheck="yes">
+HTTP/1.1 200 OK
+Date: Thu, 09 Nov 2010 14:49:00 GMT
+Server: test-server/fake
+Content-Type: text/html
+Funny-head: yesyes swsclose
+Set-Cookie: foobar=name;
+Set-Cookie: secondcookie=present;
+
+</data>
+</reply>
+
+# Client-side
+<client>
+<server>
+http
+</server>
+ <name>
+CURLOPT_COOKIELIST set to "FLUSH" of a shared cookie object
+ </name>
+<tool>
+lib1905
+</tool>
+<command>
+http://%HOSTIP:%HTTPPORT/we/want/1905
+</command>
+</client>
+
+# Verify data after the test has been "shot"
+<verify>
+<strip>
+^User-Agent:.*
+</strip>
+<protocol>
+GET /we/want/1905 HTTP/1.1\r
+Host: %HOSTIP:%HTTPPORT\r
+Accept: */*\r
+\r
+</protocol>
+<file name="log/cookies1905" mode="text">
+# Netscape HTTP Cookie File
+# https://curl.haxx.se/docs/http-cookies.html
+# This file was generated by libcurl! Edit at your own risk.
+
+%HOSTIP        FALSE   /we/want/       FALSE   0       secondcookie    present
+%HOSTIP        FALSE   /we/want/       FALSE   0       foobar  name
+</file>
+</verify>
+</testcase>
diff --git a/tests/data/test1906 b/tests/data/test1906
new file mode 100644 (file)
index 0000000..0ff2b2b
--- /dev/null
@@ -0,0 +1,52 @@
+<testcase>
+<info>
+<keywords>
+CURLOPT_CURLU
+CURLOPT_PORT
+</keywords>
+</info>
+
+# Server-side
+<reply>
+<data nocheck="yes">
+HTTP/1.1 200 OK
+Date: Thu, 09 Nov 2010 14:49:00 GMT
+Server: test-server/fake
+Content-Type: text/html
+Funny-head: yesyes swsclose
+
+</data>
+</reply>
+
+# Client-side
+<client>
+<server>
+http
+</server>
+ <name>
+CURLOPT_CURLU and CURLOPT_PORT
+ </name>
+<tool>
+lib1906
+</tool>
+
+# The tool does two requesets, the first sets CURLOPT_PORT to 1
+# the second resets the port again and expects that request to work.
+<command>
+http://%HOSTIP:%HTTPPORT/1906
+</command>
+</client>
+
+# Verify data after the test has been "shot"
+<verify>
+<strip>
+^User-Agent:.*
+</strip>
+<protocol>
+GET /1906 HTTP/1.1\r
+Host: %HOSTIP:%HTTPPORT\r
+Accept: */*\r
+\r
+</protocol>
+</verify>
+</testcase>
diff --git a/tests/data/test1907 b/tests/data/test1907
new file mode 100644 (file)
index 0000000..93f3705
--- /dev/null
@@ -0,0 +1,53 @@
+<testcase>
+<info>
+<keywords>
+CURLINFO_EFFECTIVE_URL
+</keywords>
+</info>
+
+# Server-side
+<reply>
+<data nocheck="yes">
+HTTP/1.1 200 OK
+Date: Thu, 09 Nov 2010 14:49:00 GMT
+Server: test-server/fake
+Content-Type: text/html
+Funny-head: yesyes swsclose
+Content-Length: 0
+
+</data>
+</reply>
+
+# Client-side
+<client>
+<server>
+http
+</server>
+ <name>
+CURLINFO_EFFECTIVE_URL with non-scheme URL
+ </name>
+<tool>
+lib1907
+</tool>
+
+<command>
+%HOSTIP:%HTTPPORT/hello/../1907
+</command>
+</client>
+
+# Verify data after the test has been "shot"
+<verify>
+<strip>
+^User-Agent:.*
+</strip>
+<protocol>
+GET /1907 HTTP/1.1\r
+Host: %HOSTIP:%HTTPPORT\r
+Accept: */*\r
+\r
+</protocol>
+<stdout>
+Effective URL: http://%HOSTIP:%HTTPPORT/1907
+</stdout>
+</verify>
+</testcase>
index ee9d339..31f724b 100644 (file)
@@ -2,6 +2,7 @@
 <info>
 <keywords>
 FTP
+retry
 </keywords>
 </info>
 
index c299a22..4d06cc5 100644 (file)
@@ -3,6 +3,7 @@
 <keywords>
 HTTP
 HTTP GET
+retry
 </keywords>
 </info>
 #
index dca26b9..0200366 100644 (file)
@@ -3,6 +3,7 @@
 <keywords>
 HTTP
 HTTP GET
+retry
 </keywords>
 </info>
 #
index 57fa48d..910cb54 100644 (file)
@@ -25,7 +25,7 @@ http
 attempt connect to non-existing host name
  </name>
  <command>
-non-existing-host.haxx.se.
+--ipv4 non-existing-host.haxx.se.
 </command>
 </client>
 
index c27f7c0..d8adda7 100644 (file)
@@ -24,7 +24,7 @@ file
 basic file:// file
  </name>
 <command option="no-include">
-file://localhost/%PWD/log/test200.txt
+file://localhost%FILE_PWD/log/test200.txt
 </command>
 <file name="log/test200.txt">
 foo
index db1ba13..a91dcd2 100644 (file)
@@ -32,7 +32,7 @@ file
 FTP RETR followed by FILE
  </name>
 <command option="no-include">
-ftp://%HOSTIP:%FTPPORT/2000 file://localhost/%PWD/log/test2000.txt
+ftp://%HOSTIP:%FTPPORT/2000 file://localhost%FILE_PWD/log/test2000.txt
 </command>
 <file name="log/test2000.txt">
 foo
index 88a258e..9232499 100644 (file)
@@ -49,7 +49,7 @@ file
 HTTP GET followed by FTP RETR followed by FILE
  </name>
 <command option="no-include">
-http://%HOSTIP:%HTTPPORT/20010001 ftp://%HOSTIP:%FTPPORT/20010002 file://localhost/%PWD/log/test2001.txt
+http://%HOSTIP:%HTTPPORT/20010001 ftp://%HOSTIP:%FTPPORT/20010002 file://localhost%FILE_PWD/log/test2001.txt
 </command>
 <file name="log/test2001.txt">
 foo
index 6dd2f93..efe75fa 100644 (file)
@@ -58,7 +58,7 @@ tftp
 HTTP GET followed by FTP RETR followed by FILE followed by TFTP RRQ
  </name>
 <command option="no-include">
-http://%HOSTIP:%HTTPPORT/20020001 ftp://%HOSTIP:%FTPPORT/20020002 file://localhost/%PWD/log/test2002.txt tftp://%HOSTIP:%TFTPPORT//20020003
+http://%HOSTIP:%HTTPPORT/20020001 ftp://%HOSTIP:%FTPPORT/20020002 file://localhost%FILE_PWD/log/test2002.txt tftp://%HOSTIP:%TFTPPORT//20020003
 </command>
 <file name="log/test2002.txt">
 foo
index 09bee8e..68ae714 100644 (file)
@@ -58,7 +58,7 @@ tftp
 HTTP GET followed by FTP RETR followed by FILE followed by TFTP RRQ then again in reverse order
  </name>
 <command option="no-include">
-http://%HOSTIP:%HTTPPORT/20030001 ftp://%HOSTIP:%FTPPORT/20030002 file://localhost/%PWD/log/test2003.txt tftp://%HOSTIP:%TFTPPORT//20030003 tftp://%HOSTIP:%TFTPPORT//20030003 file://localhost/%PWD/log/test2003.txt ftp://%HOSTIP:%FTPPORT/20030002 http://%HOSTIP:%HTTPPORT/20030001
+http://%HOSTIP:%HTTPPORT/20030001 ftp://%HOSTIP:%FTPPORT/20030002 file://localhost%FILE_PWD/log/test2003.txt tftp://%HOSTIP:%TFTPPORT//20030003 tftp://%HOSTIP:%TFTPPORT//20030003 file://localhost%FILE_PWD/log/test2003.txt ftp://%HOSTIP:%FTPPORT/20030002 http://%HOSTIP:%HTTPPORT/20030001
 </command>
 <file name="log/test2003.txt">
 foo
index b17890b..5b3b68d 100644 (file)
@@ -30,7 +30,7 @@ sftp
 TFTP RRQ followed by SFTP retrieval followed by FILE followed by SCP retrieval then again in reverse order
  </name>
 <command option="no-include">
---key curl_client_key --pubkey curl_client_key.pub -u %USER: tftp://%HOSTIP:%TFTPPORT//2004 sftp://%HOSTIP:%SSHPORT%POSIX_PWD/log/test2004.txt file://localhost/%PWD/log/test2004.txt scp://%HOSTIP:%SSHPORT%POSIX_PWD/log/test2004.txt file://localhost/%PWD/log/test2004.txt sftp://%HOSTIP:%SSHPORT%POSIX_PWD/log/test2004.txt tftp://%HOSTIP:%TFTPPORT//2004 --insecure
+--key curl_client_key --pubkey curl_client_key.pub -u %USER: tftp://%HOSTIP:%TFTPPORT//2004 sftp://%HOSTIP:%SSHPORT%POSIX_PWD/log/test2004.txt file://localhost%FILE_PWD/log/test2004.txt scp://%HOSTIP:%SSHPORT%POSIX_PWD/log/test2004.txt file://localhost%FILE_PWD/log/test2004.txt sftp://%HOSTIP:%SSHPORT%POSIX_PWD/log/test2004.txt tftp://%HOSTIP:%TFTPPORT//2004 --insecure
 </command>
 <file name="log/test2004.txt">
 This is test data
index 061f99b..f78b4be 100644 (file)
@@ -78,7 +78,7 @@ Data delivered from an HTTP resource
 </file1>
 <file2 name="log/stdout2005">
 </file2>
-<file3 name="log/stderr2005">
+<file3 name="log/stderr2005" mode="text">
 Metalink: parsing (file://%PWD/log/test2005.metalink) metalink/XML...
 Metalink: parsing (file://%PWD/log/test2005.metalink) OK
 Metalink: fetching (log/download2005) from (http://%HOSTIP:%HTTPPORT/2005)...
index 3acbdae..1f59717 100644 (file)
@@ -86,10 +86,6 @@ Accept: */*
 Some data delivered from an HTTP resource
 </file1>
 <file2 name="log/heads2006">
-Content-Length: 496\r
-Accept-ranges: bytes\r
-
-\r
 HTTP/1.1 200 OK
 Date: Thu, 21 Jun 2012 14:49:01 GMT
 Server: test-server/fake
@@ -102,7 +98,7 @@ Funny-head: yesyes
 </file2>
 <file3 name="log/stdout2006">
 </file3>
-<file4 name="log/stderr2006">
+<file4 name="log/stderr2006" mode="text">
 Metalink: parsing (file://%PWD/log/test2006.metalink) metalink/XML...
 Metalink: parsing (file://%PWD/log/test2006.metalink) OK
 Metalink: fetching (log/download2006) from (http://%HOSTIP:%HTTPPORT/2006)...
index b169c49..a8e5f1b 100644 (file)
@@ -90,10 +90,6 @@ Something delivered from an HTTP resource
 s/Last-Modified:.*//
 </stripfile2>
 <file2 name="log/heads2007">
-Content-Length: 496\r
-Accept-ranges: bytes\r
-
-\r
 HTTP/1.1 200 OK
 Date: Thu, 21 Jun 2012 14:50:02 GMT
 Server: test-server/fake
@@ -106,7 +102,7 @@ Funny-head: yesyes
 </file2>
 <file3 name="log/stdout2007">
 </file3>
-<file4 name="log/stderr2007">
+<file4 name="log/stderr2007" mode="text">
 Metalink: parsing (file://%PWD/log/test2007.metalink) metalink/XML...
 Metalink: parsing (file://%PWD/log/test2007.metalink) OK
 Metalink: fetching (log/download2007) from (http://%HOSTIP:%HTTPPORT/2007)...
index 012f221..1a00332 100644 (file)
@@ -82,10 +82,6 @@ Some stuff delivered from an HTTP resource
 s/Last-Modified:.*//
 </stripfile2>
 <file2 name="log/heads2008">
-Content-Length: 496\r
-Accept-ranges: bytes\r
-
-\r
 HTTP/1.1 200 OK
 Date: Thu, 21 Jun 2012 15:23:48 GMT
 Server: test-server/fake
@@ -98,7 +94,7 @@ Funny-head: yesyes
 </file2>
 <file3 name="log/stdout2008">
 </file3>
-<file4 name="log/stderr2008">
+<file4 name="log/stderr2008" mode="text">
 Metalink: parsing (file://%PWD/log/test2008.metalink) metalink/XML...
 Metalink: parsing (file://%PWD/log/test2008.metalink) OK
 Metalink: fetching (log/download2008) from (http://%HOSTIP:%HTTPPORT/2008)...
index b0e5c6c..08308d0 100644 (file)
@@ -83,10 +83,6 @@ Some contents delivered from an HTTP resource
 s/Last-Modified:.*//
 </stripfile2>
 <file2 name="log/heads2009">
-Content-Length: 496\r
-Accept-ranges: bytes\r
-
-\r
 HTTP/1.1 200 OK
 Date: Thu, 21 Jun 2012 16:27:17 GMT
 Server: test-server/fake
@@ -99,7 +95,7 @@ Funny-head: yesyes
 </file2>
 <file3 name="log/stdout2009">
 </file3>
-<file4 name="log/stderr2009">
+<file4 name="log/stderr2009" mode="text">
 Metalink: parsing (file://%PWD/log/test2009.metalink) metalink/XML...
 Metalink: parsing (file://%PWD/log/test2009.metalink) OK
 Metalink: fetching (log/download2009) from (http://%HOSTIP:%HTTPPORT/2009)...
index 33bb309..068c481 100644 (file)
@@ -82,10 +82,6 @@ Contents delivered from an HTTP resource
 s/Last-Modified:.*//
 </stripfile2>
 <file2 name="log/heads2010">
-Content-Length: 496\r
-Accept-ranges: bytes\r
-
-\r
 HTTP/1.1 200 OK
 Date: Thu, 21 Jun 2012 17:37:27 GMT
 Server: test-server/fake
@@ -98,7 +94,7 @@ Funny-head: yesyes
 </file2>
 <file3 name="log/stdout2010">
 </file3>
-<file4 name="log/stderr2010">
+<file4 name="log/stderr2010" mode="text">
 Metalink: parsing (file://%PWD/log/test2010.metalink) metalink/XML...
 Metalink: parsing (file://%PWD/log/test2010.metalink) OK
 Metalink: fetching (log/download2010) from (http://%HOSTIP:%HTTPPORT/2010)...
index 46785cf..a845023 100644 (file)
@@ -78,7 +78,7 @@ Data delivered from an HTTP resource
 </file1>
 <file2 name="log/stdout2011">
 </file2>
-<file3 name="log/stderr2011">
+<file3 name="log/stderr2011" mode="text">
 Metalink: parsing (file://%PWD/log/test2011.metalink) metalink/XML...
 Metalink: parsing (file://%PWD/log/test2011.metalink) OK
 Metalink: fetching (log/download2011) from (http://%HOSTIP:%HTTPPORT/2011)...
index 59c042d..6751269 100644 (file)
@@ -77,7 +77,7 @@ Some contents delivered from an HTTP resource
 </file1>
 <file2 name="log/stdout2012">
 </file2>
-<file3 name="log/stderr2012">
+<file3 name="log/stderr2012" mode="text">
 Metalink: parsing (file://%PWD/log/test2012.metalink) metalink/XML...
 Metalink: parsing (file://%PWD/log/test2012.metalink) WARNING (digest missing)
 Metalink: fetching (log/download2012) from (http://%HOSTIP:%HTTPPORT/2012)...
index 0985b32..f4d0c24 100644 (file)
@@ -66,7 +66,7 @@ perl %SRCDIR/libtest/notexists.pl log/2013 log/name2013 /tmp/download2013
 <verify>
 <file1 name="log/stdout2013">
 </file1>
-<file2 name="log/stderr2013">
+<file2 name="log/stderr2013" mode="text">
 Metalink: parsing (file://%PWD/log/test2013.metalink) metalink/XML...
 Metalink: parsing (file://%PWD/log/test2013.metalink) WARNING (missing or invalid file name)
 Metalink: parsing (file://%PWD/log/test2013.metalink) FAILED
index d2dbdc7..65d2ec7 100644 (file)
@@ -66,7 +66,7 @@ perl %SRCDIR/libtest/notexists.pl log/2014 log/name2014 log/download2014
 <verify>
 <file1 name="log/stdout2014">
 </file1>
-<file2 name="log/stderr2014">
+<file2 name="log/stderr2014" mode="text">
 Metalink: parsing (file://%PWD/log/test2014.metalink) metalink/XML...
 Metalink: parsing (file://%PWD/log/test2014.metalink) WARNING (missing or invalid file name)
 Metalink: parsing (file://%PWD/log/test2014.metalink) FAILED
index a35f311..d356f88 100644 (file)
@@ -66,7 +66,7 @@ perl %SRCDIR/libtest/notexists.pl log/2015 log/name2015 log/download2015
 <verify>
 <file1 name="log/stdout2015">
 </file1>
-<file2 name="log/stderr2015">
+<file2 name="log/stderr2015" mode="text">
 Metalink: parsing (file://%PWD/log/test2015.metalink) metalink/XML...
 Metalink: parsing (file://%PWD/log/test2015.metalink) WARNING (missing or invalid file name)
 Metalink: parsing (file://%PWD/log/test2015.metalink) FAILED
index 572aa65..ff2862d 100644 (file)
@@ -66,7 +66,7 @@ perl %SRCDIR/libtest/notexists.pl log/2016 log/name2016 log/download2016
 <verify>
 <file1 name="log/stdout2016">
 </file1>
-<file2 name="log/stderr2016">
+<file2 name="log/stderr2016" mode="text">
 Metalink: parsing (file://%PWD/log/test2016.metalink) metalink/XML...
 Metalink: parsing (file://%PWD/log/test2016.metalink) WARNING (missing or invalid file name)
 Metalink: parsing (file://%PWD/log/test2016.metalink) FAILED
index 15fd934..11c71c3 100644 (file)
@@ -66,7 +66,7 @@ perl %SRCDIR/libtest/notexists.pl log/2017 log/name2017
 <verify>
 <file1 name="log/stdout2017">
 </file1>
-<file2 name="log/stderr2017">
+<file2 name="log/stderr2017" mode="text">
 Metalink: parsing (file://%PWD/log/test2017.metalink) metalink/XML...
 Metalink: parsing (file://%PWD/log/test2017.metalink) WARNING (missing or invalid file name)
 Metalink: parsing (file://%PWD/log/test2017.metalink) FAILED
index 6d0652d..9fb433d 100644 (file)
@@ -66,7 +66,7 @@ perl %SRCDIR/libtest/notexists.pl log/2018 log/name2018 log/.download2018
 <verify>
 <file1 name="log/stdout2018">
 </file1>
-<file2 name="log/stderr2018">
+<file2 name="log/stderr2018" mode="text">
 Metalink: parsing (file://%PWD/log/test2018.metalink) metalink/XML...
 Metalink: parsing (file://%PWD/log/test2018.metalink) WARNING (missing or invalid file name)
 Metalink: parsing (file://%PWD/log/test2018.metalink) FAILED
index b17b3f2..abd8cad 100644 (file)
@@ -66,7 +66,7 @@ perl %SRCDIR/libtest/notexists.pl log/2019 log/name2019
 <verify>
 <file1 name="log/stdout2019">
 </file1>
-<file2 name="log/stderr2019">
+<file2 name="log/stderr2019" mode="text">
 Metalink: parsing (file://%PWD/log/test2019.metalink) metalink/XML...
 Metalink: parsing (file://%PWD/log/test2019.metalink) WARNING (missing or invalid file name)
 Metalink: parsing (file://%PWD/log/test2019.metalink) FAILED
index 0b324b1..ad9d854 100644 (file)
@@ -20,7 +20,7 @@ file
 two file:// URLs to stdout
  </name>
 <command option="no-include">
-file://localhost/%PWD/log/test202.txt FILE://localhost/%PWD/log/test202.txt
+file://localhost%FILE_PWD/log/test202.txt FILE://localhost%FILE_PWD/log/test202.txt
 </command>
 <file name="log/test202.txt">
 contents in a single file
index 8bf85a4..584f6df 100644 (file)
@@ -66,7 +66,7 @@ perl %SRCDIR/libtest/notexists.pl log/2020 log/name2020
 <verify>
 <file1 name="log/stdout2020">
 </file1>
-<file2 name="log/stderr2020">
+<file2 name="log/stderr2020" mode="text">
 Metalink: parsing (file://%PWD/log/test2020.metalink) metalink/XML...
 Metalink: parsing (file://%PWD/log/test2020.metalink) WARNING (missing or invalid file name)
 Metalink: parsing (file://%PWD/log/test2020.metalink) FAILED
index 20a9224..b0921d4 100644 (file)
@@ -66,7 +66,7 @@ perl %SRCDIR/libtest/notexists.pl log/2021 log/name2021 log/download2021
 <verify>
 <file1 name="log/stdout2021">
 </file1>
-<file2 name="log/stderr2021">
+<file2 name="log/stderr2021" mode="text">
 Metalink: parsing (file://%PWD/log/test2021.metalink) metalink/XML...
 Metalink: parsing (file://%PWD/log/test2021.metalink) WARNING (missing or invalid file name)
 Metalink: parsing (file://%PWD/log/test2021.metalink) FAILED
index 4f4efd1..e904473 100644 (file)
@@ -66,7 +66,7 @@ perl %SRCDIR/libtest/notexists.pl log/2022 log/name2022 log/download2022
 <verify>
 <file1 name="log/stdout2022">
 </file1>
-<file2 name="log/stderr2022">
+<file2 name="log/stderr2022" mode="text">
 Metalink: parsing (file://%PWD/log/test2022.metalink) metalink/XML...
 Metalink: parsing (file://%PWD/log/test2022.metalink) WARNING (missing or invalid file name)
 Metalink: parsing (file://%PWD/log/test2022.metalink) FAILED
index 1eae482..282c698 100644 (file)
@@ -42,7 +42,7 @@ HTTP/1.1 401 NTLM intermediate
 Server: Microsoft-IIS/5.0\r
 Content-Type: text/html; charset=iso-8859-1\r
 Content-Length: 33\r
-WWW-Authenticate: NTLM TlRMTVNTUAACAAAACAAIADAAAAAGggEAq6U1NAWaJCIAAAAAAAAAAAAAAAA4AAAATlRMTUF1dGg=\r
+WWW-Authenticate: NTLM TlRMTVNTUAACAAAACAAIADAAAACGgAEAq6U1NAWaJCIAAAAAAAAAAAAAAAA4AAAATlRMTUF1dGg=\r
 \r
 This is still not the real page!
 </data1201>
@@ -85,7 +85,7 @@ HTTP/1.1 401 NTLM intermediate (2)
 Server: Microsoft-IIS/5.0\r
 Content-Type: text/html; charset=iso-8859-1\r
 Content-Length: 33\r
-WWW-Authenticate: NTLM TlRMTVNTUAACAAAACAAIADAAAAAGggEAq6U1NAWaJCIAAAAAAAAAAAAAAAA4AAAATlRMTUF1dGg=\r
+WWW-Authenticate: NTLM TlRMTVNTUAACAAAACAAIADAAAACGgAEAq6U1NAWaJCIAAAAAAAAAAAAAAAA4AAAATlRMTUF1dGg=\r
 \r
 This is still not the real page!
 </data1401>
@@ -118,7 +118,7 @@ HTTP/1.1 401 NTLM intermediate (3)
 Server: Microsoft-IIS/5.0\r
 Content-Type: text/html; charset=iso-8859-1\r
 Content-Length: 33\r
-WWW-Authenticate: NTLM TlRMTVNTUAACAAAACAAIADAAAAAGggEAq6U1NAWaJCIAAAAAAAAAAAAAAAA4AAAATlRMTUF1dGg=\r
+WWW-Authenticate: NTLM TlRMTVNTUAACAAAACAAIADAAAACGgAEAq6U1NAWaJCIAAAAAAAAAAAAAAAA4AAAATlRMTUF1dGg=\r
 \r
 This is still not the real page!
 </data1501>
@@ -145,7 +145,7 @@ HTTP/1.1 401 NTLM intermediate
 Server: Microsoft-IIS/5.0\r
 Content-Type: text/html; charset=iso-8859-1\r
 Content-Length: 33\r
-WWW-Authenticate: NTLM TlRMTVNTUAACAAAACAAIADAAAAAGggEAq6U1NAWaJCIAAAAAAAAAAAAAAAA4AAAATlRMTUF1dGg=\r
+WWW-Authenticate: NTLM TlRMTVNTUAACAAAACAAIADAAAACGgAEAq6U1NAWaJCIAAAAAAAAAAAAAAAA4AAAATlRMTUF1dGg=\r
 \r
 HTTP/1.1 200 Things are fine in server land\r
 Server: Microsoft-IIS/5.0\r
@@ -165,7 +165,7 @@ HTTP/1.1 401 NTLM intermediate (2)
 Server: Microsoft-IIS/5.0\r
 Content-Type: text/html; charset=iso-8859-1\r
 Content-Length: 33\r
-WWW-Authenticate: NTLM TlRMTVNTUAACAAAACAAIADAAAAAGggEAq6U1NAWaJCIAAAAAAAAAAAAAAAA4AAAATlRMTUF1dGg=\r
+WWW-Authenticate: NTLM TlRMTVNTUAACAAAACAAIADAAAACGgAEAq6U1NAWaJCIAAAAAAAAAAAAAAAA4AAAATlRMTUF1dGg=\r
 \r
 HTTP/1.1 401 Sorry wrong password (3)\r
 Server: Microsoft-IIS/5.0\r
@@ -179,7 +179,7 @@ HTTP/1.1 401 NTLM intermediate (3)
 Server: Microsoft-IIS/5.0\r
 Content-Type: text/html; charset=iso-8859-1\r
 Content-Length: 33\r
-WWW-Authenticate: NTLM TlRMTVNTUAACAAAACAAIADAAAAAGggEAq6U1NAWaJCIAAAAAAAAAAAAAAAA4AAAATlRMTUF1dGg=\r
+WWW-Authenticate: NTLM TlRMTVNTUAACAAAACAAIADAAAACGgAEAq6U1NAWaJCIAAAAAAAAAAAAAAAA4AAAATlRMTUF1dGg=\r
 \r
 HTTP/1.1 200 Things are fine in server land (2)\r
 Server: Microsoft-IIS/5.0\r
@@ -195,6 +195,7 @@ Finally, this is the real page!
 <client>
 <features>
 NTLM
+SSL
 !SSPI
 </features>
 <server>
@@ -239,7 +240,7 @@ Accept: */*
 \r
 GET /20250200 HTTP/1.1\r
 Host: %HOSTIP:%HTTPPORT\r
-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAACAAIAHAAAAAIAAgAeAAAAAAAAAAAAAAABoIBAI+/Fp9IERAQ74OsdNPbBpg7o8CVwLSO4DtFyIcZHUMKVktWIu92s2892OVpd2JzqnRlc3R1c2VyY3VybGhvc3Q=\r
+Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAACAAIAHAAAAAIAAgAeAAAAAAAAAAAAAAAhoABAI+/Fp9IERAQ74OsdNPbBpg7o8CVwLSO4DtFyIcZHUMKVktWIu92s2892OVpd2JzqnRlc3R1c2VyY3VybGhvc3Q=\r
 Accept: */*\r
 \r
 GET /20250300 HTTP/1.1\r
@@ -254,7 +255,7 @@ Accept: */*
 \r
 GET /20250400 HTTP/1.1\r
 Host: %HOSTIP:%HTTPPORT\r
-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAACAAIAHAAAAAIAAgAeAAAAAAAAAAAAAAABoIBANgKEcT5xUUBHw5+0m4FjWTGNzg6PeHJHbaPwNwCt/tXcnIeTQCTMAg12SPDyNXMf3Rlc3R1c2VyY3VybGhvc3Q=\r
+Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAACAAIAHAAAAAIAAgAeAAAAAAAAAAAAAAAhoABANgKEcT5xUUBHw5+0m4FjWTGNzg6PeHJHbaPwNwCt/tXcnIeTQCTMAg12SPDyNXMf3Rlc3R1c2VyY3VybGhvc3Q=\r
 Accept: */*\r
 \r
 GET /20250500 HTTP/1.1\r
@@ -264,7 +265,7 @@ Accept: */*
 \r
 GET /20250500 HTTP/1.1\r
 Host: %HOSTIP:%HTTPPORT\r
-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAACAAIAHAAAAAIAAgAeAAAAAAAAAAAAAAABoIBAI+/Fp9IERAQ74OsdNPbBpg7o8CVwLSO4DtFyIcZHUMKVktWIu92s2892OVpd2JzqnRlc3R1c2VyY3VybGhvc3Q=\r
+Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAACAAIAHAAAAAIAAgAeAAAAAAAAAAAAAAAhoABAI+/Fp9IERAQ74OsdNPbBpg7o8CVwLSO4DtFyIcZHUMKVktWIu92s2892OVpd2JzqnRlc3R1c2VyY3VybGhvc3Q=\r
 Accept: */*\r
 \r
 </protocol>
index 1ae1fae..92a6371 100644 (file)
@@ -53,7 +53,7 @@ HTTP/1.1 401 NTLM intermediate
 Server: Microsoft-IIS/5.0\r
 Content-Type: text/html; charset=iso-8859-1\r
 Content-Length: 33\r
-WWW-Authenticate: NTLM TlRMTVNTUAACAAAACAAIADAAAAAGggEAq6U1NAWaJCIAAAAAAAAAAAAAAAA4AAAATlRMTUF1dGg=\r
+WWW-Authenticate: NTLM TlRMTVNTUAACAAAACAAIADAAAACGgAEAq6U1NAWaJCIAAAAAAAAAAAAAAAA4AAAATlRMTUF1dGg=\r
 \r
 This is still not the real page!
 </data1201>
@@ -107,7 +107,7 @@ HTTP/1.1 401 NTLM intermediate (2)
 Server: Microsoft-IIS/5.0\r
 Content-Type: text/html; charset=iso-8859-1\r
 Content-Length: 33\r
-WWW-Authenticate: NTLM TlRMTVNTUAACAAAACAAIADAAAAAGggEAq6U1NAWaJCIAAAAAAAAAAAAAAAA4AAAATlRMTUF1dGg=\r
+WWW-Authenticate: NTLM TlRMTVNTUAACAAAACAAIADAAAACGgAEAq6U1NAWaJCIAAAAAAAAAAAAAAAA4AAAATlRMTUF1dGg=\r
 \r
 This is still not the real page!
 </data1401>
@@ -140,7 +140,7 @@ HTTP/1.1 401 NTLM intermediate (3)
 Server: Microsoft-IIS/5.0\r
 Content-Type: text/html; charset=iso-8859-1\r
 Content-Length: 33\r
-WWW-Authenticate: NTLM TlRMTVNTUAACAAAACAAIADAAAAAGggEAq6U1NAWaJCIAAAAAAAAAAAAAAAA4AAAATlRMTUF1dGg=\r
+WWW-Authenticate: NTLM TlRMTVNTUAACAAAACAAIADAAAACGgAEAq6U1NAWaJCIAAAAAAAAAAAAAAAA4AAAATlRMTUF1dGg=\r
 \r
 This is still not the real page!
 </data1501>
@@ -174,7 +174,7 @@ HTTP/1.1 401 NTLM intermediate
 Server: Microsoft-IIS/5.0\r
 Content-Type: text/html; charset=iso-8859-1\r
 Content-Length: 33\r
-WWW-Authenticate: NTLM TlRMTVNTUAACAAAACAAIADAAAAAGggEAq6U1NAWaJCIAAAAAAAAAAAAAAAA4AAAATlRMTUF1dGg=\r
+WWW-Authenticate: NTLM TlRMTVNTUAACAAAACAAIADAAAACGgAEAq6U1NAWaJCIAAAAAAAAAAAAAAAA4AAAATlRMTUF1dGg=\r
 \r
 HTTP/1.1 200 Things are fine in server land\r
 Server: Microsoft-IIS/5.0\r
@@ -201,7 +201,7 @@ HTTP/1.1 401 NTLM intermediate (2)
 Server: Microsoft-IIS/5.0\r
 Content-Type: text/html; charset=iso-8859-1\r
 Content-Length: 33\r
-WWW-Authenticate: NTLM TlRMTVNTUAACAAAACAAIADAAAAAGggEAq6U1NAWaJCIAAAAAAAAAAAAAAAA4AAAATlRMTUF1dGg=\r
+WWW-Authenticate: NTLM TlRMTVNTUAACAAAACAAIADAAAACGgAEAq6U1NAWaJCIAAAAAAAAAAAAAAAA4AAAATlRMTUF1dGg=\r
 \r
 HTTP/1.1 401 Sorry wrong password (3)\r
 Server: Microsoft-IIS/5.0\r
@@ -215,7 +215,7 @@ HTTP/1.1 401 NTLM intermediate (3)
 Server: Microsoft-IIS/5.0\r
 Content-Type: text/html; charset=iso-8859-1\r
 Content-Length: 33\r
-WWW-Authenticate: NTLM TlRMTVNTUAACAAAACAAIADAAAAAGggEAq6U1NAWaJCIAAAAAAAAAAAAAAAA4AAAATlRMTUF1dGg=\r
+WWW-Authenticate: NTLM TlRMTVNTUAACAAAACAAIADAAAACGgAEAq6U1NAWaJCIAAAAAAAAAAAAAAAA4AAAATlRMTUF1dGg=\r
 \r
 HTTP/1.1 200 Things are fine in server land (2)\r
 Server: Microsoft-IIS/5.0\r
@@ -231,6 +231,7 @@ Finally, this is the real page!
 <client>
 <features>
 NTLM
+SSL
 !SSPI
 </features>
 <server>
@@ -279,7 +280,7 @@ Accept: */*
 \r
 GET /20280200 HTTP/1.1\r
 Host: %HOSTIP:%HTTPPORT\r
-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAACAAIAHAAAAAIAAgAeAAAAAAAAAAAAAAABoIBAI+/Fp9IERAQ74OsdNPbBpg7o8CVwLSO4DtFyIcZHUMKVktWIu92s2892OVpd2JzqnRlc3R1c2VyY3VybGhvc3Q=\r
+Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAACAAIAHAAAAAIAAgAeAAAAAAAAAAAAAAAhoABAI+/Fp9IERAQ74OsdNPbBpg7o8CVwLSO4DtFyIcZHUMKVktWIu92s2892OVpd2JzqnRlc3R1c2VyY3VybGhvc3Q=\r
 Accept: */*\r
 \r
 GET /20280300 HTTP/1.1\r
@@ -298,7 +299,7 @@ Accept: */*
 \r
 GET /20280400 HTTP/1.1\r
 Host: %HOSTIP:%HTTPPORT\r
-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAACAAIAHAAAAAIAAgAeAAAAAAAAAAAAAAABoIBANgKEcT5xUUBHw5+0m4FjWTGNzg6PeHJHbaPwNwCt/tXcnIeTQCTMAg12SPDyNXMf3Rlc3R1c2VyY3VybGhvc3Q=\r
+Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAACAAIAHAAAAAIAAgAeAAAAAAAAAAAAAAAhoABANgKEcT5xUUBHw5+0m4FjWTGNzg6PeHJHbaPwNwCt/tXcnIeTQCTMAg12SPDyNXMf3Rlc3R1c2VyY3VybGhvc3Q=\r
 Accept: */*\r
 \r
 GET /20280500 HTTP/1.1\r
@@ -308,7 +309,7 @@ Accept: */*
 \r
 GET /20280500 HTTP/1.1\r
 Host: %HOSTIP:%HTTPPORT\r
-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAACAAIAHAAAAAIAAgAeAAAAAAAAAAAAAAABoIBAI+/Fp9IERAQ74OsdNPbBpg7o8CVwLSO4DtFyIcZHUMKVktWIu92s2892OVpd2JzqnRlc3R1c2VyY3VybGhvc3Q=\r
+Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAACAAIAHAAAAAIAAgAeAAAAAAAAAAAAAAAhoABAI+/Fp9IERAQ74OsdNPbBpg7o8CVwLSO4DtFyIcZHUMKVktWIu92s2892OVpd2JzqnRlc3R1c2VyY3VybGhvc3Q=\r
 Accept: */*\r
 \r
 </protocol>
index 42866a3..59a793e 100644 (file)
@@ -30,7 +30,7 @@ HTTP/1.1 401 NTLM intermediate
 Server: Microsoft-IIS/5.0\r
 Content-Type: text/html; charset=iso-8859-1\r
 Content-Length: 33\r
-WWW-Authenticate: NTLM TlRMTVNTUAACAAAACAAIADAAAAAGggEAq6U1NAWaJCIAAAAAAAAAAAAAAAA4AAAATlRMTUF1dGg=\r
+WWW-Authenticate: NTLM TlRMTVNTUAACAAAACAAIADAAAACGgAEAq6U1NAWaJCIAAAAAAAAAAAAAAAA4AAAATlRMTUF1dGg=\r
 \r
 This is still not the real page!
 </data1101>
@@ -73,7 +73,7 @@ HTTP/1.1 401 NTLM intermediate (2)
 Server: Microsoft-IIS/5.0\r
 Content-Type: text/html; charset=iso-8859-1\r
 Content-Length: 33\r
-WWW-Authenticate: NTLM TlRMTVNTUAACAAAACAAIADAAAAAGggEAq6U1NAWaJCIAAAAAAAAAAAAAAAA4AAAATlRMTUF1dGg=\r
+WWW-Authenticate: NTLM TlRMTVNTUAACAAAACAAIADAAAACGgAEAq6U1NAWaJCIAAAAAAAAAAAAAAAA4AAAATlRMTUF1dGg=\r
 \r
 This is still not the real page!
 </data1301>
@@ -116,7 +116,7 @@ HTTP/1.1 401 NTLM intermediate
 Server: Microsoft-IIS/5.0\r
 Content-Type: text/html; charset=iso-8859-1\r
 Content-Length: 33\r
-WWW-Authenticate: NTLM TlRMTVNTUAACAAAACAAIADAAAAAGggEAq6U1NAWaJCIAAAAAAAAAAAAAAAA4AAAATlRMTUF1dGg=\r
+WWW-Authenticate: NTLM TlRMTVNTUAACAAAACAAIADAAAACGgAEAq6U1NAWaJCIAAAAAAAAAAAAAAAA4AAAATlRMTUF1dGg=\r
 \r
 HTTP/1.1 401 Sorry wrong password\r
 Server: Microsoft-IIS/5.0\r
@@ -136,7 +136,7 @@ HTTP/1.1 401 NTLM intermediate (2)
 Server: Microsoft-IIS/5.0\r
 Content-Type: text/html; charset=iso-8859-1\r
 Content-Length: 33\r
-WWW-Authenticate: NTLM TlRMTVNTUAACAAAACAAIADAAAAAGggEAq6U1NAWaJCIAAAAAAAAAAAAAAAA4AAAATlRMTUF1dGg=\r
+WWW-Authenticate: NTLM TlRMTVNTUAACAAAACAAIADAAAACGgAEAq6U1NAWaJCIAAAAAAAAAAAAAAAA4AAAATlRMTUF1dGg=\r
 \r
 HTTP/1.1 401 Sorry wrong password (2)\r
 Server: Microsoft-IIS/5.0\r
@@ -168,6 +168,7 @@ Finally, this is the real page!
 <client>
 <features>
 NTLM
+SSL
 !SSPI
 </features>
 <server>
@@ -207,7 +208,7 @@ Accept: */*
 \r
 GET /20290100 HTTP/1.1\r
 Host: %HOSTIP:%HTTPPORT\r
-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAACAAIAHAAAAAIAAgAeAAAAAAAAAAAAAAABoIBANgKEcT5xUUBHw5+0m4FjWTGNzg6PeHJHbaPwNwCt/tXcnIeTQCTMAg12SPDyNXMf3Rlc3R1c2VyY3VybGhvc3Q=\r
+Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAACAAIAHAAAAAIAAgAeAAAAAAAAAAAAAAAhoABANgKEcT5xUUBHw5+0m4FjWTGNzg6PeHJHbaPwNwCt/tXcnIeTQCTMAg12SPDyNXMf3Rlc3R1c2VyY3VybGhvc3Q=\r
 Accept: */*\r
 \r
 GET /20290200 HTTP/1.1\r
@@ -222,7 +223,7 @@ Accept: */*
 \r
 GET /20290300 HTTP/1.1\r
 Host: %HOSTIP:%HTTPPORT\r
-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAACAAIAHAAAAAIAAgAeAAAAAAAAAAAAAAABoIBANgKEcT5xUUBHw5+0m4FjWTGNzg6PeHJHbaPwNwCt/tXcnIeTQCTMAg12SPDyNXMf3Rlc3R1c2VyY3VybGhvc3Q=\r
+Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAACAAIAHAAAAAIAAgAeAAAAAAAAAAAAAAAhoABANgKEcT5xUUBHw5+0m4FjWTGNzg6PeHJHbaPwNwCt/tXcnIeTQCTMAg12SPDyNXMf3Rlc3R1c2VyY3VybGhvc3Q=\r
 Accept: */*\r
 \r
 GET /20290400 HTTP/1.1\r
index 3938426..ee850cb 100644 (file)
@@ -24,8 +24,12 @@ file
  <name>
 file:/path URL with a single slash
  </name>
+<setenv>
+# Needed for MSYS2 to not convert
+MSYS2_ARG_CONV_EXCL=file:
+</setenv>
 <command option="no-include">
-file:%PWD/log/test203.txt
+file:%FILE_PWD/log/test203.txt
 </command>
 <file name="log/test203.txt">
 foo
index 5c2754c..a158a90 100644 (file)
@@ -42,7 +42,7 @@ HTTP/1.1 401 NTLM intermediate
 Server: Microsoft-IIS/5.0\r
 Content-Type: text/html; charset=iso-8859-1\r
 Content-Length: 33\r
-WWW-Authenticate: NTLM TlRMTVNTUAACAAAACAAIADAAAAAGggEAq6U1NAWaJCIAAAAAAAAAAAAAAAA4AAAATlRMTUF1dGg=\r
+WWW-Authenticate: NTLM TlRMTVNTUAACAAAACAAIADAAAACGgAEAq6U1NAWaJCIAAAAAAAAAAAAAAAA4AAAATlRMTUF1dGg=\r
 \r
 This is still not the real page!
 </data1101>
@@ -96,7 +96,7 @@ HTTP/1.1 401 NTLM intermediate (2)
 Server: Microsoft-IIS/5.0\r
 Content-Type: text/html; charset=iso-8859-1\r
 Content-Length: 33\r
-WWW-Authenticate: NTLM TlRMTVNTUAACAAAACAAIADAAAAAGggEAq6U1NAWaJCIAAAAAAAAAAAAAAAA4AAAATlRMTUF1dGg=\r
+WWW-Authenticate: NTLM TlRMTVNTUAACAAAACAAIADAAAACGgAEAq6U1NAWaJCIAAAAAAAAAAAAAAAA4AAAATlRMTUF1dGg=\r
 \r
 This is still not the real page!
 </data1301>
@@ -161,7 +161,7 @@ HTTP/1.1 401 NTLM intermediate
 Server: Microsoft-IIS/5.0\r
 Content-Type: text/html; charset=iso-8859-1\r
 Content-Length: 33\r
-WWW-Authenticate: NTLM TlRMTVNTUAACAAAACAAIADAAAAAGggEAq6U1NAWaJCIAAAAAAAAAAAAAAAA4AAAATlRMTUF1dGg=\r
+WWW-Authenticate: NTLM TlRMTVNTUAACAAAACAAIADAAAACGgAEAq6U1NAWaJCIAAAAAAAAAAAAAAAA4AAAATlRMTUF1dGg=\r
 \r
 HTTP/1.1 401 Sorry wrong password\r
 Server: Microsoft-IIS/5.0\r
@@ -181,7 +181,7 @@ HTTP/1.1 401 NTLM intermediate (2)
 Server: Microsoft-IIS/5.0\r
 Content-Type: text/html; charset=iso-8859-1\r
 Content-Length: 33\r
-WWW-Authenticate: NTLM TlRMTVNTUAACAAAACAAIADAAAAAGggEAq6U1NAWaJCIAAAAAAAAAAAAAAAA4AAAATlRMTUF1dGg=\r
+WWW-Authenticate: NTLM TlRMTVNTUAACAAAACAAIADAAAACGgAEAq6U1NAWaJCIAAAAAAAAAAAAAAAA4AAAATlRMTUF1dGg=\r
 \r
 HTTP/1.1 401 Sorry wrong password (2)\r
 Server: Microsoft-IIS/5.0\r
@@ -220,6 +220,7 @@ Finally, this is the real page!
 <client>
 <features>
 NTLM
+SSL
 !SSPI
 </features>
 <server>
@@ -259,7 +260,7 @@ Accept: */*
 \r
 GET /20300100 HTTP/1.1\r
 Host: %HOSTIP:%HTTPPORT\r
-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAACAAIAHAAAAAIAAgAeAAAAAAAAAAAAAAABoIBANgKEcT5xUUBHw5+0m4FjWTGNzg6PeHJHbaPwNwCt/tXcnIeTQCTMAg12SPDyNXMf3Rlc3R1c2VyY3VybGhvc3Q=\r
+Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAACAAIAHAAAAAIAAgAeAAAAAAAAAAAAAAAhoABANgKEcT5xUUBHw5+0m4FjWTGNzg6PeHJHbaPwNwCt/tXcnIeTQCTMAg12SPDyNXMf3Rlc3R1c2VyY3VybGhvc3Q=\r
 Accept: */*\r
 \r
 GET /20300200 HTTP/1.1\r
@@ -274,7 +275,7 @@ Accept: */*
 \r
 GET /20300300 HTTP/1.1\r
 Host: %HOSTIP:%HTTPPORT\r
-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAACAAIAHAAAAAIAAgAeAAAAAAAAAAAAAAABoIBANgKEcT5xUUBHw5+0m4FjWTGNzg6PeHJHbaPwNwCt/tXcnIeTQCTMAg12SPDyNXMf3Rlc3R1c2VyY3VybGhvc3Q=\r
+Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAACAAIAHAAAAAIAAgAeAAAAAAAAAAAAAAAhoABANgKEcT5xUUBHw5+0m4FjWTGNzg6PeHJHbaPwNwCt/tXcnIeTQCTMAg12SPDyNXMf3Rlc3R1c2VyY3VybGhvc3Q=\r
 Accept: */*\r
 \r
 GET /20300400 HTTP/1.1\r
index 23b1a52..9acfeef 100644 (file)
@@ -25,7 +25,7 @@ HTTP/1.1 401 NTLM intermediate
 Server: Microsoft-IIS/5.0\r
 Content-Type: text/html; charset=iso-8859-1\r
 Content-Length: 33\r
-WWW-Authenticate: NTLM TlRMTVNTUAACAAAACAAIADAAAAAGggEAq6U1NAWaJCIAAAAAAAAAAAAAAAA4AAAATlRMTUF1dGg=\r
+WWW-Authenticate: NTLM TlRMTVNTUAACAAAACAAIADAAAACGgAEAq6U1NAWaJCIAAAAAAAAAAAAAAAA4AAAATlRMTUF1dGg=\r
 \r
 This is still not the real page!
 </data1101>
@@ -56,7 +56,7 @@ HTTP/1.1 401 NTLM intermediate (2)
 Server: Microsoft-IIS/5.0\r
 Content-Type: text/html; charset=iso-8859-1\r
 Content-Length: 33\r
-WWW-Authenticate: NTLM TlRMTVNTUAACAAAACAAIADAAAAAGggEAq6U1NAWaJCIAAAAAAAAAAAAAAAA4AAAATlRMTUF1dGg=\r
+WWW-Authenticate: NTLM TlRMTVNTUAACAAAACAAIADAAAACGgAEAq6U1NAWaJCIAAAAAAAAAAAAAAAA4AAAATlRMTUF1dGg=\r
 \r
 This is still not the real page!
 </data1201>
@@ -86,7 +86,7 @@ HTTP/1.1 401 NTLM intermediate (3)
 Server: Microsoft-IIS/5.0\r
 Content-Type: text/html; charset=iso-8859-1\r
 Content-Length: 33\r
-WWW-Authenticate: NTLM TlRMTVNTUAACAAAACAAIADAAAAAGggEAq6U1NAWaJCIAAAAAAAAAAAAAAAA4AAAATlRMTUF1dGg=\r
+WWW-Authenticate: NTLM TlRMTVNTUAACAAAACAAIADAAAACGgAEAq6U1NAWaJCIAAAAAAAAAAAAAAAA4AAAATlRMTUF1dGg=\r
 \r
 This is still not the real page!
 </data1301>
@@ -117,7 +117,7 @@ HTTP/1.1 401 NTLM intermediate (4)
 Server: Microsoft-IIS/5.0\r
 Content-Type: text/html; charset=iso-8859-1\r
 Content-Length: 33\r
-WWW-Authenticate: NTLM TlRMTVNTUAACAAAACAAIADAAAAAGggEAq6U1NAWaJCIAAAAAAAAAAAAAAAA4AAAATlRMTUF1dGg=\r
+WWW-Authenticate: NTLM TlRMTVNTUAACAAAACAAIADAAAACGgAEAq6U1NAWaJCIAAAAAAAAAAAAAAAA4AAAATlRMTUF1dGg=\r
 \r
 This is still not the real page!
 </data1401>
@@ -148,7 +148,7 @@ HTTP/1.1 401 NTLM intermediate (5)
 Server: Microsoft-IIS/5.0\r
 Content-Type: text/html; charset=iso-8859-1\r
 Content-Length: 33\r
-WWW-Authenticate: NTLM TlRMTVNTUAACAAAACAAIADAAAAAGggEAq6U1NAWaJCIAAAAAAAAAAAAAAAA4AAAATlRMTUF1dGg=\r
+WWW-Authenticate: NTLM TlRMTVNTUAACAAAACAAIADAAAACGgAEAq6U1NAWaJCIAAAAAAAAAAAAAAAA4AAAATlRMTUF1dGg=\r
 \r
 This is still not the real page!
 </data1501>
@@ -167,7 +167,7 @@ HTTP/1.1 401 NTLM intermediate
 Server: Microsoft-IIS/5.0\r
 Content-Type: text/html; charset=iso-8859-1\r
 Content-Length: 33\r
-WWW-Authenticate: NTLM TlRMTVNTUAACAAAACAAIADAAAAAGggEAq6U1NAWaJCIAAAAAAAAAAAAAAAA4AAAATlRMTUF1dGg=\r
+WWW-Authenticate: NTLM TlRMTVNTUAACAAAACAAIADAAAACGgAEAq6U1NAWaJCIAAAAAAAAAAAAAAAA4AAAATlRMTUF1dGg=\r
 \r
 HTTP/1.1 401 Sorry wrong password\r
 Server: Microsoft-IIS/5.0\r
@@ -180,7 +180,7 @@ HTTP/1.1 401 NTLM intermediate (2)
 Server: Microsoft-IIS/5.0\r
 Content-Type: text/html; charset=iso-8859-1\r
 Content-Length: 33\r
-WWW-Authenticate: NTLM TlRMTVNTUAACAAAACAAIADAAAAAGggEAq6U1NAWaJCIAAAAAAAAAAAAAAAA4AAAATlRMTUF1dGg=\r
+WWW-Authenticate: NTLM TlRMTVNTUAACAAAACAAIADAAAACGgAEAq6U1NAWaJCIAAAAAAAAAAAAAAAA4AAAATlRMTUF1dGg=\r
 \r
 HTTP/1.1 200 Things are fine in server land\r
 Server: Microsoft-IIS/5.0\r
@@ -192,7 +192,7 @@ HTTP/1.1 401 NTLM intermediate (3)
 Server: Microsoft-IIS/5.0\r
 Content-Type: text/html; charset=iso-8859-1\r
 Content-Length: 33\r
-WWW-Authenticate: NTLM TlRMTVNTUAACAAAACAAIADAAAAAGggEAq6U1NAWaJCIAAAAAAAAAAAAAAAA4AAAATlRMTUF1dGg=\r
+WWW-Authenticate: NTLM TlRMTVNTUAACAAAACAAIADAAAACGgAEAq6U1NAWaJCIAAAAAAAAAAAAAAAA4AAAATlRMTUF1dGg=\r
 \r
 HTTP/1.1 401 Sorry wrong password (2)\r
 Server: Microsoft-IIS/5.0\r
@@ -205,7 +205,7 @@ HTTP/1.1 401 NTLM intermediate (4)
 Server: Microsoft-IIS/5.0\r
 Content-Type: text/html; charset=iso-8859-1\r
 Content-Length: 33\r
-WWW-Authenticate: NTLM TlRMTVNTUAACAAAACAAIADAAAAAGggEAq6U1NAWaJCIAAAAAAAAAAAAAAAA4AAAATlRMTUF1dGg=\r
+WWW-Authenticate: NTLM TlRMTVNTUAACAAAACAAIADAAAACGgAEAq6U1NAWaJCIAAAAAAAAAAAAAAAA4AAAATlRMTUF1dGg=\r
 \r
 HTTP/1.1 401 Sorry wrong password (3)\r
 Server: Microsoft-IIS/5.0\r
@@ -218,7 +218,7 @@ HTTP/1.1 401 NTLM intermediate (5)
 Server: Microsoft-IIS/5.0\r
 Content-Type: text/html; charset=iso-8859-1\r
 Content-Length: 33\r
-WWW-Authenticate: NTLM TlRMTVNTUAACAAAACAAIADAAAAAGggEAq6U1NAWaJCIAAAAAAAAAAAAAAAA4AAAATlRMTUF1dGg=\r
+WWW-Authenticate: NTLM TlRMTVNTUAACAAAACAAIADAAAACGgAEAq6U1NAWaJCIAAAAAAAAAAAAAAAA4AAAATlRMTUF1dGg=\r
 \r
 HTTP/1.1 200 Things are fine in server land (2)\r
 Server: Microsoft-IIS/5.0\r
@@ -234,6 +234,7 @@ Finally, this is the real page!
 <client>
 <features>
 NTLM
+SSL
 !SSPI
 </features>
 <server>
@@ -273,7 +274,7 @@ Accept: */*
 \r
 GET /20310100 HTTP/1.1\r
 Host: %HOSTIP:%HTTPPORT\r
-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAACAAIAHAAAAAIAAgAeAAAAAAAAAAAAAAABoIBANgKEcT5xUUBHw5+0m4FjWTGNzg6PeHJHbaPwNwCt/tXcnIeTQCTMAg12SPDyNXMf3Rlc3R1c2VyY3VybGhvc3Q=\r
+Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAACAAIAHAAAAAIAAgAeAAAAAAAAAAAAAAAhoABANgKEcT5xUUBHw5+0m4FjWTGNzg6PeHJHbaPwNwCt/tXcnIeTQCTMAg12SPDyNXMf3Rlc3R1c2VyY3VybGhvc3Q=\r
 Accept: */*\r
 \r
 GET /20310200 HTTP/1.1\r
@@ -283,7 +284,7 @@ Accept: */*
 \r
 GET /20310200 HTTP/1.1\r
 Host: %HOSTIP:%HTTPPORT\r
-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAACAAIAHAAAAAIAAgAeAAAAAAAAAAAAAAABoIBAI+/Fp9IERAQ74OsdNPbBpg7o8CVwLSO4DtFyIcZHUMKVktWIu92s2892OVpd2JzqnRlc3R1c2VyY3VybGhvc3Q=\r
+Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAACAAIAHAAAAAIAAgAeAAAAAAAAAAAAAAAhoABAI+/Fp9IERAQ74OsdNPbBpg7o8CVwLSO4DtFyIcZHUMKVktWIu92s2892OVpd2JzqnRlc3R1c2VyY3VybGhvc3Q=\r
 Accept: */*\r
 \r
 GET /20310300 HTTP/1.1\r
@@ -293,7 +294,7 @@ Accept: */*
 \r
 GET /20310300 HTTP/1.1\r
 Host: %HOSTIP:%HTTPPORT\r
-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAACAAIAHAAAAAIAAgAeAAAAAAAAAAAAAAABoIBANgKEcT5xUUBHw5+0m4FjWTGNzg6PeHJHbaPwNwCt/tXcnIeTQCTMAg12SPDyNXMf3Rlc3R1c2VyY3VybGhvc3Q=\r
+Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAACAAIAHAAAAAIAAgAeAAAAAAAAAAAAAAAhoABANgKEcT5xUUBHw5+0m4FjWTGNzg6PeHJHbaPwNwCt/tXcnIeTQCTMAg12SPDyNXMf3Rlc3R1c2VyY3VybGhvc3Q=\r
 Accept: */*\r
 \r
 GET /20310400 HTTP/1.1\r
@@ -303,7 +304,7 @@ Accept: */*
 \r
 GET /20310400 HTTP/1.1\r
 Host: %HOSTIP:%HTTPPORT\r
-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAACAAIAHAAAAAIAAgAeAAAAAAAAAAAAAAABoIBANgKEcT5xUUBHw5+0m4FjWTGNzg6PeHJHbaPwNwCt/tXcnIeTQCTMAg12SPDyNXMf3Rlc3R1c2VyY3VybGhvc3Q=\r
+Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAACAAIAHAAAAAIAAgAeAAAAAAAAAAAAAAAhoABANgKEcT5xUUBHw5+0m4FjWTGNzg6PeHJHbaPwNwCt/tXcnIeTQCTMAg12SPDyNXMf3Rlc3R1c2VyY3VybGhvc3Q=\r
 Accept: */*\r
 \r
 GET /20310500 HTTP/1.1\r
@@ -313,7 +314,7 @@ Accept: */*
 \r
 GET /20310500 HTTP/1.1\r
 Host: %HOSTIP:%HTTPPORT\r
-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAACAAIAHAAAAAIAAgAeAAAAAAAAAAAAAAABoIBAI+/Fp9IERAQ74OsdNPbBpg7o8CVwLSO4DtFyIcZHUMKVktWIu92s2892OVpd2JzqnRlc3R1c2VyY3VybGhvc3Q=\r
+Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAACAAIAHAAAAAIAAgAeAAAAAAAAAAAAAAAhoABAI+/Fp9IERAQ74OsdNPbBpg7o8CVwLSO4DtFyIcZHUMKVktWIu92s2892OVpd2JzqnRlc3R1c2VyY3VybGhvc3Q=\r
 Accept: */*\r
 \r
 </protocol>
index 94e1f23..8200b8d 100644 (file)
@@ -40,7 +40,7 @@ HTTP/1.1 401 NTLM intermediate (2)
 Server: Microsoft-IIS/5.0\r
 Content-Type: text/html; charset=iso-8859-1\r
 Content-Length: 33\r
-WWW-Authenticate: NTLM TlRMTVNTUAACAAAACAAIADAAAAAGggEAq6U1NAWaJCIAAAAAAAAAAAAAAAA4AAAATlRMTUF1dGg=\r
+WWW-Authenticate: NTLM TlRMTVNTUAACAAAACAAIADAAAACGgAEAq6U1NAWaJCIAAAAAAAAAAAAAAAA4AAAATlRMTUF1dGg=\r
 \r
 This is still not the real page!
 </data1201>
@@ -66,6 +66,7 @@ Data connection 2: 402
 <client>
 <features>
 NTLM
+SSL
 !SSPI
 </features>
 <server>
@@ -99,23 +100,23 @@ chkhostname curlhost
 </strip>
 <protocol>
 GET /20320100 HTTP/1.1\r
-Host: 127.0.0.1:%HTTPPORT\r
+Host: %HOSTIP:%HTTPPORT\r
 Authorization: Basic dGVzdHVzZXI6dGVzdHBhc3M=\r
 Accept: */*\r
 \r
 GET /20320100 HTTP/1.1\r
-Host: 127.0.0.1:%HTTPPORT\r
+Host: %HOSTIP:%HTTPPORT\r
 Authorization: Basic dGVzdHVzZXI6dGVzdHBhc3M=\r
 Accept: */*\r
 \r
 GET /20320200 HTTP/1.1\r
-Host: 127.0.0.1:%HTTPPORT\r
+Host: %HOSTIP:%HTTPPORT\r
 Authorization: NTLM TlRMTVNTUAABAAAABoIIAAAAAAAAAAAAAAAAAAAAAAA=\r
 Accept: */*\r
 \r
 GET /20320200 HTTP/1.1\r
-Host: 127.0.0.1:%HTTPPORT\r
-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAACAAIAHAAAAAIAAgAeAAAAAAAAAAAAAAABoIBAI+/Fp9IERAQ74OsdNPbBpg7o8CVwLSO4DtFyIcZHUMKVktWIu92s2892OVpd2JzqnRlc3R1c2VyY3VybGhvc3Q=\r
+Host: %HOSTIP:%HTTPPORT\r
+Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAACAAIAHAAAAAIAAgAeAAAAAAAAAAAAAAAhoABAI+/Fp9IERAQ74OsdNPbBpg7o8CVwLSO4DtFyIcZHUMKVktWIu92s2892OVpd2JzqnRlc3R1c2VyY3VybGhvc3Q=\r
 Accept: */*\r
 \r
 </protocol>
index 36d30e7..5293b66 100644 (file)
@@ -41,7 +41,7 @@ HTTP/1.1 401 NTLM intermediate (2)
 Server: Microsoft-IIS/5.0\r
 Content-Type: text/html; charset=iso-8859-1\r
 Content-Length: 33\r
-WWW-Authenticate: NTLM TlRMTVNTUAACAAAACAAIADAAAAAGggEAq6U1NAWaJCIAAAAAAAAAAAAAAAA4AAAATlRMTUF1dGg=\r
+WWW-Authenticate: NTLM TlRMTVNTUAACAAAACAAIADAAAACGgAEAq6U1NAWaJCIAAAAAAAAAAAAAAAA4AAAATlRMTUF1dGg=\r
 \r
 This is still not the real page!
 </data1201>
@@ -67,6 +67,7 @@ Data connection 2: 402
 <client>
 <features>
 NTLM
+SSL
 !SSPI
 </features>
 <server>
@@ -116,7 +117,7 @@ Accept: */*
 \r
 GET /20320200 HTTP/1.1\r
 Host: 127.0.0.1:%HTTPPORT\r
-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAACAAIAHAAAAAIAAgAeAAAAAAAAAAAAAAABoIBAI+/Fp9IERAQ74OsdNPbBpg7o8CVwLSO4DtFyIcZHUMKVktWIu92s2892OVpd2JzqnRlc3R1c2VyY3VybGhvc3Q=\r
+Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAACAAIAHAAAAAIAAgAeAAAAAAAAAAAAAAAhoABAI+/Fp9IERAQ74OsdNPbBpg7o8CVwLSO4DtFyIcZHUMKVktWIu92s2892OVpd2JzqnRlc3R1c2VyY3VybGhvc3Q=\r
 Accept: */*\r
 \r
 </protocol>
index 0ed9451..5dad014 100644 (file)
@@ -16,7 +16,7 @@ file
 "upload" with file://
  </name>
 <command option="no-include">
-file://localhost/%PWD/log/result204.txt -T log/upload204.txt
+file://localhost%FILE_PWD/log/result204.txt -T log/upload204.txt
 </command>
 <file name="log/upload204.txt">
 data
index dcd202f..ec49c86 100644 (file)
@@ -41,7 +41,7 @@ http
 idn
 </features>
 <setenv>
-LC_ALL=
+LC_ALL=en_US.UTF-8
 LC_CTYPE=en_US.UTF-8
 </setenv>
 <precheck>
index fc14048..d3654c7 100644 (file)
@@ -42,7 +42,7 @@ http
 idn
 </features>
 <setenv>
-LC_ALL=
+LC_ALL=en_US.UTF-8
 LC_CTYPE=en_US.UTF-8
 </setenv>
 <precheck>
@@ -92,7 +92,7 @@ OK
 1
 1
 3
-http://xn--4cab6c.se/20470001
+http://åäö.se/20470001
 text/plain; charset=us-ascii
 200
 </stdout>
index 81ef79f..5eef3da 100644 (file)
@@ -53,6 +53,9 @@ Connect to specific host via HTTP proxy (switch to tunnel mode automatically)
  <command>
 http://www.example.com.2050/2050 --connect-to ::connect.example.com.2050:%HTTPPORT -x %HOSTIP:%PROXYPORT
 </command>
+<features>
+proxy
+</features>
 </client>
 
 #
index cca4494..a5fac62 100644 (file)
@@ -51,7 +51,9 @@ socks5
  <name>
 Connect to specific host via SOCKS proxy and HTTP proxy (switch to tunnel mode automatically)
  </name>
-
+<features>
+proxy
+</features>
  <command>
 http://www.example.com.2055/2055 --connect-to ::connect.example.com.2055:%HTTPPORT -x %HOSTIP:%PROXYPORT --preproxy socks5://%HOSTIP:%SOCKSPORT
 </command>
index f00e212..5d2584e 100644 (file)
@@ -8,17 +8,7 @@ HTTP Negotiate auth (stub krb5)
 </info>
 # Server-side
 <reply>
-<!-- First request, expect 401 Negotiate -->
-<data>
-HTTP/1.1 401 Authorization Required
-Server: Microsoft-IIS/7.0
-Content-Type: text/html; charset=iso-8859-1
-WWW-Authenticate: Negotiate
-Content-Length: 13
-
-Not yet sir!
-</data>
-<!-- Second request, expect success in one shot -->
+<!-- First request, expect success in one shot -->
 <data1>
 HTTP/1.1 200 Things are fine in server land
 Server: Microsoft-IIS/7.0
@@ -29,12 +19,6 @@ Content-Length: 15
 Nice auth sir!
 </data1>
 <datacheck>
-HTTP/1.1 401 Authorization Required
-Server: Microsoft-IIS/7.0
-Content-Type: text/html; charset=iso-8859-1
-WWW-Authenticate: Negotiate
-Content-Length: 13
-
 HTTP/1.1 200 Things are fine in server land
 Server: Microsoft-IIS/7.0
 Content-Type: text/html; charset=iso-8859-1
@@ -75,10 +59,6 @@ CURL_STUB_GSS_CREDS="KRB5_Alice"
 <protocol>
 GET /2056 HTTP/1.1\r
 Host: %HOSTIP:%HTTPPORT\r
-Accept: */*\r
-\r
-GET /2056 HTTP/1.1\r
-Host: %HOSTIP:%HTTPPORT\r
 Authorization: Negotiate IktSQjVfQWxpY2UiOkhUVFBAMTI3LjAuMC4xOjE6QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQQ==\r
 Accept: */*\r
 \r
index 5625051..92d7824 100644 (file)
@@ -8,17 +8,7 @@ HTTP Negotiate auth (stub ntlm)
 </info>
 # Server-side
 <reply>
-<!-- First request, expect 401 Negotiate -->
-<data>
-HTTP/1.1 401 Authorization Required
-Server: Microsoft-IIS/7.0
-Content-Type: text/html; charset=iso-8859-1
-WWW-Authenticate: Negotiate
-Content-Length: 13
-
-Not yet sir!
-</data>
-<!-- Second request, expect 401 (ntlm challenge) -->
+<!-- First request, expect 401 (ntlm challenge) -->
 <data1>
 HTTP/1.1 401 Authorization Required
 Server: Microsoft-IIS/7.0
@@ -28,7 +18,7 @@ Content-Length: 19
 
 Still not yet sir!
 </data1>
-<!-- Third request, expect success  -->
+<!-- Second request, expect success  -->
 <data2>
 HTTP/1.1 200 Things are fine in server land
 Server: Microsoft-IIS/7.0
@@ -42,12 +32,6 @@ Nice auth sir!
 HTTP/1.1 401 Authorization Required
 Server: Microsoft-IIS/7.0
 Content-Type: text/html; charset=iso-8859-1
-WWW-Authenticate: Negotiate
-Content-Length: 13
-
-HTTP/1.1 401 Authorization Required
-Server: Microsoft-IIS/7.0
-Content-Type: text/html; charset=iso-8859-1
 WWW-Authenticate: Negotiate Qw==
 Content-Length: 19
 
@@ -91,10 +75,6 @@ CURL_STUB_GSS_CREDS="NTLM_Alice"
 <protocol>
 GET /2057 HTTP/1.1\r
 Host: %HOSTIP:%HTTPPORT\r
-Accept: */*\r
-\r
-GET /2057 HTTP/1.1\r
-Host: %HOSTIP:%HTTPPORT\r
 Authorization: Negotiate Ik5UTE1fQWxpY2UiOkhUVFBAMTI3LjAuMC4xOjI6QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQQ==\r
 Accept: */*\r
 \r
index 0082503..65a907f 100644 (file)
@@ -66,6 +66,7 @@ http
 <features>
 !SSPI
 crypto
+proxy
 </features>
  <name>
 HTTP POST --digest with PUT, resumed upload, modified method and SHA-256
index b74b0bd..4272a7b 100644 (file)
@@ -66,6 +66,7 @@ http
 <features>
 !SSPI
 crypto
+proxy
 </features>
  <name>
 HTTP POST --digest with PUT, resumed upload, modified method, SHA-512-256 and userhash=true
index 5f0c885..f99ac4c 100644 (file)
@@ -73,6 +73,7 @@ http
 <features>
 !SSPI
 crypto
+proxy
 </features>
  <name>
 HTTP proxy CONNECT auth Digest
index f323eb5..a0b291d 100644 (file)
@@ -66,6 +66,7 @@ http
 <features>
 !SSPI
 crypto
+proxy
 </features>
  <name>
 HTTP POST --digest with PUT, resumed upload, modified method, SHA-512-256 and userhash=false
index eddfa4d..900f0d5 100644 (file)
@@ -24,7 +24,7 @@ file
 basic file:// file with "127.0.0.1" hostname
  </name>
 <command option="no-include">
-file://127.0.0.1/%PWD/log/test2070.txt
+file://127.0.0.1%FILE_PWD/log/test2070.txt
 </command>
 <file name="log/test2070.txt">
 foo
diff --git a/tests/data/test2076 b/tests/data/test2076
new file mode 100644 (file)
index 0000000..2c477b1
--- /dev/null
@@ -0,0 +1,75 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+HTTP GET
+HTTP Digest auth
+</keywords>
+</info>
+# Server-side
+<reply>
+<data>
+HTTP/1.1 401 Authorization Required swsclose\r
+WWW-Authenticate: Digest realm="testrealm", nonce="1"\r
+Content-Length: 26\r
+\r
+This is not the real page
+</data>
+
+# This is supposed to be returned when the server gets a
+# Authorization: Digest line passed-in from the client
+<data1000>
+HTTP/1.1 200 OK swsclose\r
+Content-Length: 23\r
+\r
+This IS the real page!
+</data1000>
+
+<datacheck>
+HTTP/1.1 401 Authorization Required swsclose\r
+WWW-Authenticate: Digest realm="testrealm", nonce="1"\r
+Content-Length: 26\r
+\r
+HTTP/1.1 200 OK swsclose\r
+Content-Length: 23\r
+\r
+This IS the real page!
+</datacheck>
+
+</reply>
+
+# Client-side
+<client>
+<server>
+http
+</server>
+<features>
+!SSPI
+crypto
+</features>
+<name>
+HTTP with digest auth and URI contains query
+</name>
+<command>
+"http://%HOSTIP:%HTTPPORT/2076?query" -u testuser:testpass --digest
+</command>
+</client>
+
+# Verify data after the test has been "shot"
+<verify>
+<strip>
+^User-Agent:.*
+</strip>
+<protocol>
+GET /2076?query HTTP/1.1\r
+Host: %HOSTIP:%HTTPPORT\r
+Accept: */*\r
+\r
+GET /2076?query HTTP/1.1\r
+Host: %HOSTIP:%HTTPPORT\r
+Authorization: Digest username="testuser", realm="testrealm", nonce="1", uri="/2076?query", response="5758bd3bbde7f33236e6ccd278eb59af"\r
+Accept: */*\r
+\r
+</protocol>
+</verify>
+</testcase>
diff --git a/tests/data/test2077 b/tests/data/test2077
new file mode 100644 (file)
index 0000000..0c600f5
--- /dev/null
@@ -0,0 +1,42 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+HTTP GET
+GSS-API
+</keywords>
+</info>
+
+# Server-side
+<reply>
+<data>
+HTTP/1.1 200 OK swsclose\r
+Content-Length: 23\r
+\r
+This IS the real page!
+</data>
+</reply>
+
+# Client-side
+<client>
+<server>
+http
+</server>
+<features>
+GSS-API
+</features>
+<name>
+curl --fail --negotiate to unauthenticated service fails
+</name>
+<command>
+http://%HOSTIP:%HTTPPORT/2077 -u : --fail --negotiate
+</command>
+</client>
+
+# Verify data after the test has been "shot"
+<verify>
+<errorcode>
+0
+</errorcode>
+</verify>
+</testcase>
diff --git a/tests/data/test2078 b/tests/data/test2078
new file mode 100644 (file)
index 0000000..99bc2db
--- /dev/null
@@ -0,0 +1,54 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+HTTP GET
+GSS-API
+</keywords>
+</info>
+
+# Server-side
+<reply>
+<data>
+HTTP/1.1 200 OK swsclose\r
+Content-Length: 23\r
+\r
+This IS the real page!
+</data>
+</reply>
+
+# Client-side
+<client>
+<server>
+http
+</server>
+<features>
+GSS-API
+</features>
+<name>
+curl --negotiate should not send empty POST request only
+</name>
+<command>
+http://%HOSTIP:%HTTPPORT/2078 -u : --negotiate --data name=value
+</command>
+</client>
+
+# Verify data after the test has been "shot"
+<verify>
+<errorcode>
+0
+</errorcode>
+<strip>
+^User-Agent:.*
+</strip>
+<protocol nonewline="yes">
+POST /2078 HTTP/1.1\r
+Host: 127.0.0.1:8990\r
+Accept: */*\r
+Content-Length: 10\r
+Content-Type: application/x-www-form-urlencoded\r
+\r
+name=value
+</protocol>
+</verify>
+</testcase>
index afb2566..1c86558 100644 (file)
@@ -27,6 +27,7 @@ http
 </server>
 <features>
 ftp
+proxy
 </features>
  <name>
 HTTP PUT to a FTP URL with username+password - over HTTP proxy
index 37c9ad2..67a7fc5 100644 (file)
@@ -15,7 +15,7 @@ HTTP proxy NTLM auth
 # this is returned first since we get no proxy-auth
 <connect1001>
 HTTP/1.1 407 Authorization Required to proxy me my dear\r
-Proxy-Authenticate: NTLM TlRMTVNTUAACAAAAAgACADAAAAAGgoEAc51AYVDgyNcAAAAAAAAAAG4AbgAyAAAAQ0MCAAQAQwBDAAEAEgBFAEwASQBTAEEAQgBFAFQASAAEABgAYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAwAsAGUAbABpAHMAYQBiAGUAdABoAC4AYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAAAAAA==\r
+Proxy-Authenticate: NTLM TlRMTVNTUAACAAAAAgACADAAAACGggEAc51AYVDgyNcAAAAAAAAAAG4AbgAyAAAAQ0MCAAQAQwBDAAEAEgBFAEwASQBTAEEAQgBFAFQASAAEABgAYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAwAsAGUAbABpAHMAYQBiAGUAdABoAC4AYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAAAAAA==\r
 Content-Length: 33\r
 \r
 And you should ignore this data.
@@ -52,7 +52,7 @@ Nice proxy auth sir!
 
 <datacheck>
 HTTP/1.1 407 Authorization Required to proxy me my dear\r
-Proxy-Authenticate: NTLM TlRMTVNTUAACAAAAAgACADAAAAAGgoEAc51AYVDgyNcAAAAAAAAAAG4AbgAyAAAAQ0MCAAQAQwBDAAEAEgBFAEwASQBTAEEAQgBFAFQASAAEABgAYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAwAsAGUAbABpAHMAYQBiAGUAdABoAC4AYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAAAAAA==\r
+Proxy-Authenticate: NTLM TlRMTVNTUAACAAAAAgACADAAAACGggEAc51AYVDgyNcAAAAAAAAAAG4AbgAyAAAAQ0MCAAQAQwBDAAEAEgBFAEwASQBTAEEAQgBFAFQASAAEABgAYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAwAsAGUAbABpAHMAYQBiAGUAdABoAC4AYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAAAAAA==\r
 Content-Length: 33\r
 \r
 HTTP/1.1 200 Things are fine in proxy land\r
@@ -77,8 +77,10 @@ http
 </server>
 <features>
 NTLM
+SSL
 !SSPI
 debug
+proxy
 </features>
  <name>
 HTTP proxy CONNECT auth NTLM
@@ -110,7 +112,7 @@ Proxy-Connection: Keep-Alive
 \r
 CONNECT test.remote.example.com.209:%HTTPPORT HTTP/1.1\r
 Host: test.remote.example.com.209:%HTTPPORT\r
-Proxy-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAAAAAD2AAAACAAIAPYAAAAIAAgA/gAAAAAAAAAAAAAABoKBAMOv20GsURsat8gdH/RfnYI0MzIxNTMyMeCdd8AzFZLZ/N1ujmilmCcBAQAAAAAAAACAPtXesZ0BNDMyMTUzMjEAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAdGVzdHVzZXJjdXJsaG9zdA==\r
+Proxy-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAACAAIAHAAAAAIAAgAeAAAAAAAAAAAAAAAhoIBADQzMjE1MzIxAAAAAAAAAAAAAAAAAAAAADj3hs3u3j0kgJqCrLM+74BmaoNHDfIJjHRlc3R1c2VyY3VybGhvc3Q=\r
 Proxy-Connection: Keep-Alive\r
 \r
 GET /path/2090002 HTTP/1.1\r
index 5a44aa7..6dce69b 100644 (file)
Binary files a/tests/data/test2100 and b/tests/data/test2100 differ
index 93aaf64..e6d7cd5 100644 (file)
@@ -15,7 +15,7 @@ HTTP proxy NTLM auth
 # this is returned first since we get no proxy-auth
 <connect1001>
 HTTP/1.1 407 Authorization Required to proxy me my dear\r
-Proxy-Authenticate: NTLM TlRMTVNTUAACAAAAAgACADAAAAAGgoEAc51AYVDgyNcAAAAAAAAAAG4AbgAyAAAAQ0MCAAQAQwBDAAEAEgBFAEwASQBTAEEAQgBFAFQASAAEABgAYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAwAsAGUAbABpAHMAYQBiAGUAdABoAC4AYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAAAAAA==\r
+Proxy-Authenticate: NTLM TlRMTVNTUAACAAAAAgACADAAAACGggEAc51AYVDgyNcAAAAAAAAAAG4AbgAyAAAAQ0MCAAQAQwBDAAEAEgBFAEwASQBTAEEAQgBFAFQASAAEABgAYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAwAsAGUAbABpAHMAYQBiAGUAdABoAC4AYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAAAAAA==\r
 Content-Length: 33\r
 \r
 And you should ignore this data.
@@ -52,7 +52,7 @@ Nice proxy auth sir!
 
 <datacheck>
 HTTP/1.1 407 Authorization Required to proxy me my dear\r
-Proxy-Authenticate: NTLM TlRMTVNTUAACAAAAAgACADAAAAAGgoEAc51AYVDgyNcAAAAAAAAAAG4AbgAyAAAAQ0MCAAQAQwBDAAEAEgBFAEwASQBTAEEAQgBFAFQASAAEABgAYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAwAsAGUAbABpAHMAYQBiAGUAdABoAC4AYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAAAAAA==\r
+Proxy-Authenticate: NTLM TlRMTVNTUAACAAAAAgACADAAAACGggEAc51AYVDgyNcAAAAAAAAAAG4AbgAyAAAAQ0MCAAQAQwBDAAEAEgBFAEwASQBTAEEAQgBFAFQASAAEABgAYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAwAsAGUAbABpAHMAYQBiAGUAdABoAC4AYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAAAAAA==\r
 Content-Length: 33\r
 \r
 HTTP/1.1 200 Things are fine in proxy land\r
@@ -77,8 +77,10 @@ http
 </server>
 <features>
 NTLM
+SSL
 !SSPI
 debug
+proxy
 </features>
  <name>
 HTTP 1.0 proxy CONNECT auth NTLM and then POST
@@ -110,7 +112,7 @@ Proxy-Connection: Keep-Alive
 \r
 CONNECT test.remote.example.com.213:%HTTPPORT HTTP/1.0\r
 Host: test.remote.example.com.213:%HTTPPORT\r
-Proxy-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAAAAAD2AAAACAAIAPYAAAAIAAgA/gAAAAAAAAAAAAAABoKBAMOv20GsURsat8gdH/RfnYI0MzIxNTMyMeCdd8AzFZLZ/N1ujmilmCcBAQAAAAAAAACAPtXesZ0BNDMyMTUzMjEAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAdGVzdHVzZXJjdXJsaG9zdA==\r
+Proxy-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAACAAIAHAAAAAIAAgAeAAAAAAAAAAAAAAAhoIBADQzMjE1MzIxAAAAAAAAAAAAAAAAAAAAADj3hs3u3j0kgJqCrLM+74BmaoNHDfIJjHRlc3R1c2VyY3VybGhvc3Q=\r
 Proxy-Connection: Keep-Alive\r
 \r
 POST /path/2130002 HTTP/1.1\r
index f10df56..4ab51a2 100644 (file)
@@ -34,6 +34,9 @@ HTTP proxy CONNECT to proxy returning 405
  <command>
 http://test.remote.example.com.217:%HTTPPORT/path/2170002 --proxy http://%HOSTIP:%HTTPPORT --proxytunnel -w "%{http_code} %{http_connect}\n"
 </command>
+<features>
+proxy
+</features>
 </client>
 
 # Verify data after the test has been "shot"
index be3f0f3..49f17e4 100644 (file)
@@ -18,6 +18,7 @@ none
 </server>
 <features>
 http
+proxy
 </features>
  <name>
 try using proxy with unsupported scheme
index 3d4bc77..7254953 100644 (file)
@@ -23,7 +23,7 @@ file
 file:// with resume
  </name>
 <command option="no-include">
-file://localhost/%PWD/log/test231.txt -C 10
+file://localhost%FILE_PWD/log/test231.txt -C 10
 </command>
 <file name="log/test231.txt">
 A01234567
index b631e52..a38d8c9 100644 (file)
@@ -67,6 +67,9 @@ HTTP, proxy, site+proxy auth and Location: to new host
  <command>
 http://first.host.it.is/we/want/that/page/233 -x %HOSTIP:%HTTPPORT --user iam:myself --proxy-user testing:this --location
 </command>
+<features>
+proxy
+</features>
 </client>
 
 #
index 1d2e05b..9e197cd 100644 (file)
@@ -69,6 +69,9 @@ HTTP, proxy, site+proxy auth and Location: to new host using location-trusted
  <command>
 http://first.host.it.is/we/want/that/page/234 -x %HOSTIP:%HTTPPORT --user iam:myself --proxy-user testing:this --location-trusted
 </command>
+<features>
+proxy
+</features>
 </client>
 
 #
index e8fcb77..b6f3879 100644 (file)
@@ -14,7 +14,7 @@ HTTP proxy NTLM auth
 # this is returned first since we get no proxy-auth
 <data1001>
 HTTP/1.1 407 Authorization Required to proxy me my dear\r
-Proxy-Authenticate: NTLM TlRMTVNTUAACAAAAAgACADAAAAAGgoEAc51AYVDgyNcAAAAAAAAAAG4AbgAyAAAAQ0MCAAQAQwBDAAEAEgBFAEwASQBTAEEAQgBFAFQASAAEABgAYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAwAsAGUAbABpAHMAYQBiAGUAdABoAC4AYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAAAAAA==\r
+Proxy-Authenticate: NTLM TlRMTVNTUAACAAAAAgACADAAAACGggEAc51AYVDgyNcAAAAAAAAAAG4AbgAyAAAAQ0MCAAQAQwBDAAEAEgBFAEwASQBTAEEAQgBFAFQASAAEABgAYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAwAsAGUAbABpAHMAYQBiAGUAdABoAC4AYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAAAAAA==\r
 Content-Length: 34\r
 \r
 Hey you, authenticate or go away!
@@ -33,7 +33,7 @@ Contents of that page you requested, sir.
 
 <datacheck>
 HTTP/1.1 407 Authorization Required to proxy me my dear\r
-Proxy-Authenticate: NTLM TlRMTVNTUAACAAAAAgACADAAAAAGgoEAc51AYVDgyNcAAAAAAAAAAG4AbgAyAAAAQ0MCAAQAQwBDAAEAEgBFAEwASQBTAEEAQgBFAFQASAAEABgAYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAwAsAGUAbABpAHMAYQBiAGUAdABoAC4AYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAAAAAA==\r
+Proxy-Authenticate: NTLM TlRMTVNTUAACAAAAAgACADAAAACGggEAc51AYVDgyNcAAAAAAAAAAG4AbgAyAAAAQ0MCAAQAQwBDAAEAEgBFAEwASQBTAEEAQgBFAFQASAAEABgAYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAwAsAGUAbABpAHMAYQBiAGUAdABoAC4AYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAAAAAA==\r
 Content-Length: 34\r
 \r
 HTTP/1.1 200 Things are fine in proxy land swsclose\r
@@ -52,8 +52,10 @@ http
 </server>
 <features>
 NTLM
+SSL
 !SSPI
 debug
+proxy
 </features>
  <name>
 HTTP proxy-auth NTLM and then POST
@@ -89,7 +91,7 @@ Content-Type: application/x-www-form-urlencoded
 \r
 POST http://%HOSTIP:%HTTPPORT/239 HTTP/1.1\r
 Host: %HOSTIP:%HTTPPORT\r
-Proxy-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAAAAAD2AAAACAAIAPYAAAAIAAgA/gAAAAAAAAAAAAAABoKBAMOv20GsURsat8gdH/RfnYI0MzIxNTMyMeCdd8AzFZLZ/N1ujmilmCcBAQAAAAAAAACAPtXesZ0BNDMyMTUzMjEAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAdGVzdHVzZXJjdXJsaG9zdA==\r
+Proxy-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAACAAIAHAAAAAIAAgAeAAAAAAAAAAAAAAAhoIBADQzMjE1MzIxAAAAAAAAAAAAAAAAAAAAADj3hs3u3j0kgJqCrLM+74BmaoNHDfIJjHRlc3R1c2VyY3VybGhvc3Q=\r
 User-Agent: curl/7.13.2-CVS (i686-pc-linux-gnu) libcurl/7.13.2-CVS OpenSSL/0.9.7e zlib/1.2.2 libidn/0.5.13\r
 Accept: */*\r
 Proxy-Connection: Keep-Alive\r
index 5f85298..f7b2386 100644 (file)
@@ -27,7 +27,7 @@ This is not the real page
 # this is returned first since we get no proxy-auth
 <data1001>
 HTTP/1.1 407 Authorization Required to proxy me my dear\r
-Proxy-Authenticate: NTLM TlRMTVNTUAACAAAAAgACADAAAAAGgoEAc51AYVDgyNcAAAAAAAAAAG4AbgAyAAAAQ0MCAAQAQwBDAAEAEgBFAEwASQBTAEEAQgBFAFQASAAEABgAYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAwAsAGUAbABpAHMAYQBiAGUAdABoAC4AYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAAAAAA==\r
+Proxy-Authenticate: NTLM TlRMTVNTUAACAAAAAgACADAAAACGggEAc51AYVDgyNcAAAAAAAAAAG4AbgAyAAAAQ0MCAAQAQwBDAAEAEgBFAEwASQBTAEEAQgBFAFQASAAEABgAYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAwAsAGUAbABpAHMAYQBiAGUAdABoAC4AYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAAAAAA==\r
 Content-Length: 34\r
 \r
 Hey you, authenticate or go away!
@@ -54,7 +54,7 @@ Content-Type: text/html; charset=iso-8859-1
 Connection: close\r
 \r
 HTTP/1.1 407 Authorization Required to proxy me my dear\r
-Proxy-Authenticate: NTLM TlRMTVNTUAACAAAAAgACADAAAAAGgoEAc51AYVDgyNcAAAAAAAAAAG4AbgAyAAAAQ0MCAAQAQwBDAAEAEgBFAEwASQBTAEEAQgBFAFQASAAEABgAYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAwAsAGUAbABpAHMAYQBiAGUAdABoAC4AYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAAAAAA==\r
+Proxy-Authenticate: NTLM TlRMTVNTUAACAAAAAgACADAAAACGggEAc51AYVDgyNcAAAAAAAAAAG4AbgAyAAAAQ0MCAAQAQwBDAAEAEgBFAEwASQBTAEEAQgBFAFQASAAEABgAYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAwAsAGUAbABpAHMAYQBiAGUAdABoAC4AYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAAAAAA==\r
 Content-Length: 34\r
 \r
 HTTP/1.1 200 Things are fine in proxy land swsclose\r
@@ -73,8 +73,10 @@ http
 </server>
 <features>
 NTLM
+SSL
 !SSPI
 debug
+proxy
 </features>
  <name>
 HTTP POST with --proxy-anyauth, picking NTLM
@@ -118,7 +120,7 @@ Content-Type: application/x-www-form-urlencoded
 \r
 POST http://%HOSTIP:%HTTPPORT/243 HTTP/1.1\r
 Host: %HOSTIP:%HTTPPORT\r
-Proxy-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAAAAAD2AAAACAAIAPYAAAAIAAgA/gAAAAAAAAAAAAAABoKBAMOv20GsURsat8gdH/RfnYI0MzIxNTMyMeCdd8AzFZLZ/N1ujmilmCcBAQAAAAAAAACAPtXesZ0BNDMyMTUzMjEAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAdGVzdHVzZXJjdXJsaG9zdA==\r
+Proxy-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAACAAIAHAAAAAIAAgAeAAAAAAAAAAAAAAAhoIBADQzMjE1MzIxAAAAAAAAAAAAAAAAAAAAADj3hs3u3j0kgJqCrLM+74BmaoNHDfIJjHRlc3R1c2VyY3VybGhvc3Q=\r
 User-Agent: curl/7.13.2-CVS (i686-pc-linux-gnu) libcurl/7.13.2-CVS OpenSSL/0.9.7e zlib/1.2.2 libidn/0.5.13\r
 Accept: */*\r
 Proxy-Connection: Keep-Alive\r
index 8ce4b63..080163d 100644 (file)
@@ -47,7 +47,7 @@ PASS ftp@example.com
 PWD\r
 EPSV\r
 TYPE A\r
-LIST fir#t/third/244/\r
+LIST fir#t/third/244\r
 QUIT\r
 </protocol>
 </verify>
index 17ae807..1567c62 100644 (file)
@@ -35,6 +35,9 @@ HTTP resume request over proxy with auth without server supporting it
 This text is here to simulate a partly downloaded file to resume
 download on.
 </file>
+<features>
+proxy
+</features>
 </client>
 
 # Verify data after the test has been "shot"
index 502448d..59a419b 100644 (file)
@@ -73,7 +73,9 @@ HTTP Location: following with --netrc-optional
  <command>
 http://supersite.com/want/257 -L -x http://%HOSTIP:%HTTPPORT --netrc-optional --netrc-file log/netrc257
 </command>
-
+<features>
+proxy
+</features>
 # netrc auth for two out of three sites:
 <file name="log/netrc257">
 machine supersite.com login user1 password passwd1
index 98c3401..6c10564 100644 (file)
@@ -58,6 +58,7 @@ http
 <features>
 !SSPI
 crypto
+proxy
 </features>
  <name>
 HTTP POST multipart without Expect: header using proxy anyauth (Digest)
index 6e18536..58d2512 100644 (file)
@@ -54,6 +54,7 @@ http
 <features>
 !SSPI
 crypto
+proxy
 </features>
  <name>
 HTTP POST multipart with Expect: header using proxy anyauth (Digest)
index 5088141..e10c207 100644 (file)
@@ -25,6 +25,7 @@ hello
 <client>
 <features>
 ipv6
+proxy
 </features>
 <server>
 http-ipv6
index f4d171a..5aca0e6 100644 (file)
@@ -30,6 +30,9 @@ HTTP with proxy string including http:// and user+password
  <command>
 http://we.want.that.site.com/264 -x http://f%61ke:user@%HOSTIP:%HTTPPORT
 </command>
+<features>
+proxy
+</features>
 </client>
 
 # Verify data after the test has been "shot"
index 17176dd..a27633a 100644 (file)
@@ -15,7 +15,7 @@ HTTP proxy NTLM auth
 # this is returned first since we get no proxy-auth
 <connect1001>
 HTTP/1.0 407 Authorization Required to proxy me my dear\r
-Proxy-Authenticate: NTLM TlRMTVNTUAACAAAAAgACADAAAAAGgoEAc51AYVDgyNcAAAAAAAAAAG4AbgAyAAAAQ0MCAAQAQwBDAAEAEgBFAEwASQBTAEEAQgBFAFQASAAEABgAYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAwAsAGUAbABpAHMAYQBiAGUAdABoAC4AYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAAAAAA==\r
+Proxy-Authenticate: NTLM TlRMTVNTUAACAAAAAgACADAAAACGggEAc51AYVDgyNcAAAAAAAAAAG4AbgAyAAAAQ0MCAAQAQwBDAAEAEgBFAEwASQBTAEEAQgBFAFQASAAEABgAYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAwAsAGUAbABpAHMAYQBiAGUAdABoAC4AYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAAAAAA==\r
 Content-Length: 1033\r
 \r
 And you should ignore this data.
@@ -53,7 +53,7 @@ Nice proxy auth sir!
 
 <datacheck>
 HTTP/1.0 407 Authorization Required to proxy me my dear\r
-Proxy-Authenticate: NTLM TlRMTVNTUAACAAAAAgACADAAAAAGgoEAc51AYVDgyNcAAAAAAAAAAG4AbgAyAAAAQ0MCAAQAQwBDAAEAEgBFAEwASQBTAEEAQgBFAFQASAAEABgAYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAwAsAGUAbABpAHMAYQBiAGUAdABoAC4AYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAAAAAA==\r
+Proxy-Authenticate: NTLM TlRMTVNTUAACAAAAAgACADAAAACGggEAc51AYVDgyNcAAAAAAAAAAG4AbgAyAAAAQ0MCAAQAQwBDAAEAEgBFAEwASQBTAEEAQgBFAFQASAAEABgAYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAwAsAGUAbABpAHMAYQBiAGUAdABoAC4AYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAAAAAA==\r
 Content-Length: 1033\r
 \r
 HTTP/1.1 200 Things are fine in proxy land\r
@@ -78,8 +78,10 @@ http
 </server>
 <features>
 NTLM
+SSL
 !SSPI
 debug
+proxy
 </features>
  <name>
 HTTP proxy CONNECT auth NTLM and then POST, response-body in the 407
@@ -111,7 +113,7 @@ Proxy-Connection: Keep-Alive
 \r
 CONNECT test.remote.example.com.265:%HTTPPORT HTTP/1.1\r
 Host: test.remote.example.com.265:%HTTPPORT\r
-Proxy-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAAAAAD2AAAACAAIAPYAAAAIAAgA/gAAAAAAAAAAAAAABoKBAMOv20GsURsat8gdH/RfnYI0MzIxNTMyMeCdd8AzFZLZ/N1ujmilmCcBAQAAAAAAAACAPtXesZ0BNDMyMTUzMjEAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAdGVzdHVzZXJjdXJsaG9zdA==\r
+Proxy-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAACAAIAHAAAAAIAAgAeAAAAAAAAAAAAAAAhoIBADQzMjE1MzIxAAAAAAAAAAAAAAAAAAAAADj3hs3u3j0kgJqCrLM+74BmaoNHDfIJjHRlc3R1c2VyY3VybGhvc3Q=\r
 Proxy-Connection: Keep-Alive\r
 \r
 POST /path/2650002 HTTP/1.1\r
index 7a45d12..a0c3d33 100644 (file)
@@ -19,7 +19,7 @@ HTTP/1.1 401 Now gimme that second request of crap
 Server: Microsoft-IIS/5.0\r
 Content-Type: text/html; charset=iso-8859-1\r
 Content-Length: 34\r
-WWW-Authenticate: NTLM TlRMTVNTUAACAAAAAgACADAAAAAGgoEAc51AYVDgyNcAAAAAAAAAAG4AbgAyAAAAQ0MCAAQAQwBDAAEAEgBFAEwASQBTAEEAQgBFAFQASAAEABgAYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAwAsAGUAbABpAHMAYQBiAGUAdABoAC4AYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAAAAAA==\r
+WWW-Authenticate: NTLM TlRMTVNTUAACAAAAAgACADAAAACGggEAc51AYVDgyNcAAAAAAAAAAG4AbgAyAAAAQ0MCAAQAQwBDAAEAEgBFAEwASQBTAEEAQgBFAFQASAAEABgAYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAwAsAGUAbABpAHMAYQBiAGUAdABoAC4AYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAAAAAA==\r
 \r
 This is not the real page either!
 </data1001>
@@ -40,7 +40,7 @@ HTTP/1.1 401 Now gimme that second request of crap
 Server: Microsoft-IIS/5.0\r
 Content-Type: text/html; charset=iso-8859-1\r
 Content-Length: 34\r
-WWW-Authenticate: NTLM TlRMTVNTUAACAAAAAgACADAAAAAGgoEAc51AYVDgyNcAAAAAAAAAAG4AbgAyAAAAQ0MCAAQAQwBDAAEAEgBFAEwASQBTAEEAQgBFAFQASAAEABgAYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAwAsAGUAbABpAHMAYQBiAGUAdABoAC4AYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAAAAAA==\r
+WWW-Authenticate: NTLM TlRMTVNTUAACAAAAAgACADAAAACGggEAc51AYVDgyNcAAAAAAAAAAG4AbgAyAAAAQ0MCAAQAQwBDAAEAEgBFAEwASQBTAEEAQgBFAFQASAAEABgAYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAwAsAGUAbABpAHMAYQBiAGUAdABoAC4AYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAAAAAA==\r
 \r
 HTTP/1.1 200 Things are fine in server land swsclose\r
 Server: Microsoft-IIS/5.0\r
@@ -56,6 +56,7 @@ Finally, this is the real page!
 <client>
 <features>
 NTLM
+SSL
 !SSPI
 debug
 </features>
@@ -97,7 +98,7 @@ Content-Type: application/x-www-form-urlencoded
 \r
 POST /267 HTTP/1.1\r
 Host: %HOSTIP:%HTTPPORT\r
-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAAAAAD2AAAACAAIAPYAAAAIAAgA/gAAAAAAAAAAAAAABoKBAMOv20GsURsat8gdH/RfnYI0MzIxNTMyMeCdd8AzFZLZ/N1ujmilmCcBAQAAAAAAAACAPtXesZ0BNDMyMTUzMjEAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAdGVzdHVzZXJjdXJsaG9zdA==\r
+Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAACAAIAHAAAAAIAAgAeAAAAAAAAAAAAAAAhoIBADQzMjE1MzIxAAAAAAAAAAAAAAAAAAAAADj3hs3u3j0kgJqCrLM+74BmaoNHDfIJjHRlc3R1c2VyY3VybGhvc3Q=\r
 User-Agent: curl/7.10.6-pre1 (i686-pc-linux-gnu) libcurl/7.10.6-pre1 OpenSSL/0.9.7a ipv6 zlib/1.1.3\r
 Accept: */*\r
 Header1: yes\r
index 802c4bb..6065b4d 100644 (file)
@@ -56,6 +56,9 @@ HTTP CONNECT with proxytunnel getting two URLs from the same host
  <command>
 http://remotesite.com.275:%HTTPPORT/we/want/that/page/275 -p -x %HOSTIP:%PROXYPORT --user iam:myself --proxy-user youare:yourself http://remotesite.com.275:%HTTPPORT/we/want/that/page/275
 </command>
+<features>
+proxy
+</features>
 </client>
 
 #
index 3112264..620f56b 100644 (file)
@@ -30,6 +30,9 @@ HTTP with proxy string including http:// and user+empty password
  <command>
 http://we.want.that.site.com/278 -x http://f%61ke:@%HOSTIP:%HTTPPORT
 </command>
+<features>
+proxy
+</features>
 </client>
 
 # Verify data after the test has been "shot"
index 47f8b68..d5f4194 100644 (file)
@@ -31,6 +31,9 @@ HTTP with proxy string including http:// and user only
  <command>
 http://we.want.that.site.com/279 -x http://f%61ke@%HOSTIP:%HTTPPORT
 </command>
+<features>
+proxy
+</features>
 </client>
 
 # Verify data after the test has been "shot"
index 6772e22..7c29f7f 100644 (file)
@@ -30,6 +30,9 @@ HTTP proxy CONNECT with custom User-Agent header
  <command>
 http://test.remote.example.com.287:%HTTPPORT/path/287 -H "User-Agent: looser/2015" --proxy http://%HOSTIP:%HTTPPORT --proxytunnel --proxy-header "User-Agent: looser/2007"
 </command>
+<features>
+proxy
+</features>
 </client>
 
 # Verify data after the test has been "shot"
index 9f8f6e1..e62eabd 100644 (file)
@@ -31,7 +31,7 @@ file:// with (unsupported) proxy, authentication and range
 all_proxy=http://fake:user@%HOSTIP:%HTTPPORT/
 </setenv>
 <command option="no-include">
-file://localhost/%PWD/log/test288.txt
+file://localhost%FILE_PWD/log/test288.txt
 </command>
 <file name="log/test288.txt">
 foo
index 4daaea4..cfa7430 100644 (file)
@@ -27,6 +27,7 @@ http
 </server>
 <features>
 ftp
+proxy
 </features>
  <name>
 FTP over HTTP proxy with user:pass not in url
index 95d4cef..17306f9 100644 (file)
@@ -45,7 +45,7 @@ https
 HTTPS GET, receive no headers only data!
  </name>
  <command>
--k https://%HOSTIP:%HTTPSPORT/306
+-k https://%HOSTIP:%HTTPSPORT/306 --http0.9
 </command>
 </client>
 
index 78f3766..633b480 100644 (file)
@@ -46,7 +46,7 @@ Set-Cookie: partmatch=present; domain=127.0.0.1 ; path=/;
 Set-Cookie:eat=this; domain=moo.foo.moo;\r
 Set-Cookie: eat=this-too; domain=.foo.moo;\r
 Set-Cookie: nodomainnovalue\r
-Set-Cookie:   nodomain=value; expires=Fri Feb 2 11:56:27 GMT 2035\r
+Set-Cookie:   nodomain=value; expires=Fri Feb 13 11:56:27 GMT 2037\r
 Set-Cookie: novalue; domain=reallysilly\r
 Set-Cookie: test=yes; domain=foo.com; expires=Sat Feb 2 11:56:27 GMT 2030\r
 Set-Cookie: test2=yes; domain=se; expires=Sat Feb 2 11:56:27 GMT 2030\r
@@ -100,36 +100,18 @@ Accept: */*
 # https://curl.haxx.se/docs/http-cookies.html
 # This file was generated by libcurl! Edit at your own risk.
 
-127.0.0.1      FALSE   /we/want/       TRUE    0       securewithspace after
 127.0.0.1      FALSE   /we/want/       FALSE   0       prespace        yes before
 127.0.0.1      FALSE   /we/want/       FALSE   0       withspaces2     before equals
 127.0.0.1      FALSE   /we/want/       FALSE   0       withspaces      yes  within and around
 127.0.0.1      FALSE   /we/want/       FALSE   0       blexp   yesyes
 #HttpOnly_127.0.0.1    FALSE   /silly/ FALSE   0       magic   yessir
-127.0.0.1      FALSE   /we/want/       FALSE   2054030187      nodomain        value
+127.0.0.1      FALSE   /we/want/       FALSE   2118138987      nodomain        value
 127.0.0.1      FALSE   /       FALSE   0       partmatch       present
-#HttpOnly_127.0.0.1    FALSE   /p4/    TRUE    0       httpandsec8     myvalue9
-#HttpOnly_127.0.0.1    FALSE   /p4/    TRUE    0       httpandsec7     myvalue8
-#HttpOnly_127.0.0.1    FALSE   /p4/    TRUE    0       httpandsec6     myvalue7
-#HttpOnly_127.0.0.1    FALSE   /p4/    TRUE    0       httpandsec5     myvalue6
-#HttpOnly_127.0.0.1    FALSE   /p4/    TRUE    0       httpandsec4     myvalue5
-#HttpOnly_127.0.0.1    FALSE   /p4/    TRUE    0       httpandsec3     myvalue4
-#HttpOnly_127.0.0.1    FALSE   /p4/    TRUE    0       httpandsec2     myvalue3
-#HttpOnly_127.0.0.1    FALSE   /p4/    TRUE    0       httpandsec      myvalue2
 #HttpOnly_127.0.0.1    FALSE   /p4/    FALSE   0       httponly        myvalue1
 #HttpOnly_127.0.0.1    FALSE   /p4/    FALSE   0       httpo4  value4
 #HttpOnly_127.0.0.1    FALSE   /p3/    FALSE   0       httpo3  value3
 #HttpOnly_127.0.0.1    FALSE   /p2/    FALSE   0       httpo2  value2
 #HttpOnly_127.0.0.1    FALSE   /p1/    FALSE   0       httpo1  value1
-127.0.0.1      FALSE   /secure9/       TRUE    0       secure  very1
-127.0.0.1      FALSE   /secure8/       TRUE    0       sec8value       secure8
-127.0.0.1      FALSE   /secure7/       TRUE    0       sec7value       secure7
-127.0.0.1      FALSE   /secure6/       TRUE    0       sec6value       secure6
-127.0.0.1      FALSE   /secure5/       TRUE    0       sec5value       secure5
-127.0.0.1      FALSE   /secure4/       TRUE    0       sec4value       secure4
-127.0.0.1      FALSE   /secure3/       TRUE    0       sec3value       secure3
-127.0.0.1      FALSE   /secure2/       TRUE    0       sec2value       secure2
-127.0.0.1      FALSE   /secure1/       TRUE    0       sec1value       secure1
 127.0.0.1      FALSE   /overwrite      FALSE   0       overwrite       this2
 127.0.0.1      FALSE   /silly/ FALSE   0       ismatch this
 </file>
index c6d8697..68a9b5c 100644 (file)
@@ -67,6 +67,9 @@ HTTP with custom Authorization: and redirect to new host
  <command>
 http://first.host.it.is/we/want/that/page/317 -x %HOSTIP:%HTTPPORT -H "Authorization: s3cr3t" --proxy-user testing:this --location
 </command>
+<features>
+proxy
+</features>
 </client>
 
 #
index 838d1ba..fd82c7a 100644 (file)
@@ -67,6 +67,9 @@ HTTP with custom Authorization: and redirect to new host
  <command>
 http://first.host.it.is/we/want/that/page/318 -x %HOSTIP:%HTTPPORT -H "Authorization: s3cr3t" --proxy-user testing:this --location-trusted
 </command>
+<features>
+proxy
+</features>
 </client>
 
 #
diff --git a/tests/data/test327 b/tests/data/test327
new file mode 100644 (file)
index 0000000..3a1c071
--- /dev/null
@@ -0,0 +1,73 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+HTTP GET
+cookies
+header dump
+</keywords>
+</info>
+
+# This test verifies that the cookie file gets created even if the last cookie
+# has been removed - particularly important when the file is going to be read
+# again and thus must not contain old contents.
+
+# Server-side
+<reply>
+<data>
+HTTP/1.1 200 OK
+Date: Thu, 09 Nov 2010 14:49:00 GMT
+Server: test-server/fake
+Content-Type: text/html
+Funny-head: yesyes swsclose
+Set-Cookie: foobar=name; expires=Thu, 22 Nov 2037 10:54:11 GMT;
+
+</data>
+<data2>
+HTTP/1.1 200 OK
+Date: Thu, 09 Nov 2010 14:49:00 GMT
+Server: test-server/fake
+Content-Type: text/html
+Funny-head: yesyes swsclose
+Set-Cookie: foobar=name; expires=Thu, 01 Jan 1970 00:00:00 GMT;
+
+</data2>
+</reply>
+
+# Client-side
+<client>
+<server>
+http
+</server>
+ <name>
+HTTP with cookiejar without cookies left
+ </name>
+ <command>
+http://%HOSTIP:%HTTPPORT/we/want/327 -b none -c log/cookies327 http://%HOSTIP:%HTTPPORT/we/want/3270002
+</command>
+</client>
+
+# Verify data after the test has been "shot"
+<verify>
+<strip>
+^User-Agent:.*
+</strip>
+<protocol>
+GET /we/want/327 HTTP/1.1\r
+Host: %HOSTIP:%HTTPPORT\r
+Accept: */*\r
+\r
+GET /we/want/3270002 HTTP/1.1\r
+Host: %HOSTIP:%HTTPPORT\r
+Accept: */*\r
+Cookie: foobar=name\r
+\r
+</protocol>
+<file name="log/cookies327" mode="text">
+# Netscape HTTP Cookie File
+# https://curl.haxx.se/docs/http-cookies.html
+# This file was generated by libcurl! Edit at your own risk.
+
+</file>
+</verify>
+</testcase>
diff --git a/tests/data/test328 b/tests/data/test328
new file mode 100644 (file)
index 0000000..93c00e1
--- /dev/null
@@ -0,0 +1,55 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+HTTP GET
+Content-Encoding
+</keywords>
+</info>
+
+# Server-side
+<reply>
+<data>
+HTTP/1.1 200 OK
+Date: Thu, 09 Nov 2010 14:49:00 GMT
+Content-Type: text/html
+Content-Encoding: none
+Content-Length: 38
+
+Q: What did 0 say to 8? A: Nice Belt!
+</data>
+</reply>
+
+# Client-side
+<client>
+<server>
+http
+</server>
+
+# we're actually more interested in any compression support but this is the
+# best we can do right now
+<features>
+libz
+</features>
+ <name>
+HTTP with "Content-Encoding: none
+ </name>
+ <command>
+http://%HOSTIP:%HTTPPORT/hello/328 --compressed
+</command>
+</client>
+
+# Verify data after the test has been "shot"
+<verify>
+<strip>
+^User-Agent:.*
+^Accept-Encoding:.*
+</strip>
+<protocol>
+GET /hello/328 HTTP/1.1\r
+Host: %HOSTIP:%HTTPPORT\r
+Accept: */*\r
+\r
+</protocol>
+</verify>
+</testcase>
diff --git a/tests/data/test329 b/tests/data/test329
new file mode 100644 (file)
index 0000000..2274d47
--- /dev/null
@@ -0,0 +1,70 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+HTTP GET
+cookies
+</keywords>
+</info>
+# Server-side
+<reply>
+<data>
+HTTP/1.1 200 OK\r
+Date: Thu, 09 Nov 2010 14:49:00 GMT\r
+Server: test-server/fake\r
+Content-Type: text/html\r
+Funny-head: yesyes\r
+Set-Cookie: test=yes; path=/we/want/; domain=.host.foo.com; Max-Age=0;\r
+Content-Length: 4\r
+\r
+boo
+</data>
+<data2>
+HTTP/1.1 200 OK\r
+Funny-head: yesyes\r
+Content-Length: 4\r
+\r
+moo
+</data2>
+</reply>
+
+# Client-side
+<client>
+<file name="log/jar329.txt" mode="text">
+.host.foo.com  TRUE    /we/want/       FALSE   2147483647      test    no
+</file>
+<server>
+http
+</server>
+ <name>
+HTTP cookie with Max-Age=0
+ </name>
+# Explicitly set the time zone to a known good one, in case the user is
+# using one of the 'right' zones that take into account leap seconds
+# which causes the cookie expiry times to be different.
+<setenv>
+TZ=GMT
+</setenv>
+ <command>
+http://%HOSTIP:%HTTPPORT/we/want/329 -b log/jar329.txt -H "Host: host.foo.com" http://%HOSTIP:%HTTPPORT/we/want/3290002
+</command>
+</client>
+
+# Verify data after the test has been "shot"
+<verify>
+<strip>
+^User-Agent:.*
+</strip>
+<protocol>
+GET /we/want/329 HTTP/1.1\r
+Host: host.foo.com\r
+Accept: */*\r
+Cookie: test=no\r
+\r
+GET /we/want/3290002 HTTP/1.1\r
+Host: host.foo.com\r
+Accept: */*\r
+\r
+</protocol>
+</verify>
+</testcase>
diff --git a/tests/data/test330 b/tests/data/test330
new file mode 100644 (file)
index 0000000..6cda172
--- /dev/null
@@ -0,0 +1,93 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+followlocation
+cookies
+</keywords>
+</info>
+#
+# Server-side
+<reply>
+<data>
+HTTP/1.1 302 OK
+Date: Thu, 09 Nov 2010 14:49:00 GMT
+Server: test-server/fake swsclose
+Content-Type: text/html
+Funny-head: yesyes
+Location: http://goto.second.host.now/3170002
+Content-Length: 8
+Connection: close
+
+contents
+</data>
+<data2>
+HTTP/1.1 200 OK
+Date: Thu, 09 Nov 2010 14:49:00 GMT
+Server: test-server/fake swsclose
+Content-Type: text/html
+Funny-head: yesyes
+Content-Length: 9
+
+contents
+</data2>
+
+<datacheck>
+HTTP/1.1 302 OK
+Date: Thu, 09 Nov 2010 14:49:00 GMT
+Server: test-server/fake swsclose
+Content-Type: text/html
+Funny-head: yesyes
+Location: http://goto.second.host.now/3170002
+Content-Length: 8
+Connection: close
+
+HTTP/1.1 200 OK
+Date: Thu, 09 Nov 2010 14:49:00 GMT
+Server: test-server/fake swsclose
+Content-Type: text/html
+Funny-head: yesyes
+Content-Length: 9
+
+contents
+</datacheck>
+</reply>
+
+#
+# Client-side
+<client>
+<server>
+http
+</server>
+ <name>
+HTTP with custom Cookie: and redirect to new host
+ </name>
+ <command>
+http://first.host.it.is/we/want/that/page/317 -x %HOSTIP:%HTTPPORT -H "Cookie: test=yes" --location
+</command>
+<features>
+proxy
+</features>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<strip>
+^User-Agent:.*
+</strip>
+<protocol>
+GET http://first.host.it.is/we/want/that/page/317 HTTP/1.1\r
+Host: first.host.it.is\r
+Accept: */*\r
+Proxy-Connection: Keep-Alive\r
+Cookie: test=yes\r
+\r
+GET http://goto.second.host.now/3170002 HTTP/1.1\r
+Host: goto.second.host.now\r
+Accept: */*\r
+Proxy-Connection: Keep-Alive\r
+\r
+</protocol>
+</verify>
+</testcase>
diff --git a/tests/data/test331 b/tests/data/test331
new file mode 100644 (file)
index 0000000..2ffac81
--- /dev/null
@@ -0,0 +1,68 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+HTTP GET
+cookies
+</keywords>
+</info>
+
+# Server-side
+<reply>
+<data>
+HTTP/1.1 200 OK
+Date: Thu, 09 Nov 2010 14:49:00 GMT
+Server: test-server/fake
+Content-Type: text/html
+Content-Length: 4
+Set-Cookie: moo=yes;
+
+hej
+</data>
+<data2>
+HTTP/1.1 200 OK
+Date: Thu, 09 Nov 2010 14:49:00 GMT
+Server: test-server/fake
+Content-Type: text/html
+Content-Length: 0
+Funny-head: yesyes swsclose
+
+</data2>
+</reply>
+
+# Client-side
+<client>
+<server>
+http
+</server>
+ <name>
+HTTP with cookie using host name 'moo'
+ </name>
+ <command>
+-x http://%HOSTIP:%HTTPPORT http://moo/we/want/331 -b none http://moo/we/want/3310002
+</command>
+<features>
+proxy
+</features>
+</client>
+
+# Verify data after the test has been "shot"
+<verify>
+<strip>
+^User-Agent:.*
+</strip>
+<protocol>
+GET http://moo/we/want/331 HTTP/1.1\r
+Host: moo\r
+Accept: */*\r
+Proxy-Connection: Keep-Alive\r
+\r
+GET http://moo/we/want/3310002 HTTP/1.1\r
+Host: moo\r
+Accept: */*\r
+Proxy-Connection: Keep-Alive\r
+Cookie: moo=yes\r
+\r
+</protocol>
+</verify>
+</testcase>
diff --git a/tests/data/test332 b/tests/data/test332
new file mode 100644 (file)
index 0000000..3688c2b
--- /dev/null
@@ -0,0 +1,45 @@
+<testcase>
+<info>
+<keywords>
+TFTP
+TFTP RRQ
+FAILURE
+</keywords>
+</info>
+
+<reply>
+<data>
+a chunk of
+data
+returned
+ to client
+</data>
+</reply>
+
+#
+# Client-side
+<client>
+<server>
+tftp
+</server>
+ <name>
+TFTP retrieve with blksize 400
+ </name>
+ <command>
+tftp://%HOSTIP:%TFTPPORT//332 --tftp-blksize 400
+</command>
+</client>
+
+#
+# Verify pseudo protocol after the test has been "shot"
+<verify>
+<protocol>
+opcode: 1
+mode: octet
+tsize: 0
+blksize: 400
+timeout: 6
+filename: /332
+</protocol>
+</verify>
+</testcase>
diff --git a/tests/data/test333 b/tests/data/test333
new file mode 100644 (file)
index 0000000..198af9c
--- /dev/null
@@ -0,0 +1,35 @@
+<testcase>
+<info>
+<keywords>
+command-line
+</keywords>
+</info>
+
+#
+# Server-side
+<reply>
+</reply>
+
+#
+# Client-side
+<client>
+<server>
+none
+</server>
+ <name>
+Try a non-boolean command line option with --no-
+ </name>
+ <command>
+--no-proxy "hey" http://%HOSTIP:%HTTPPORT/333
+</command>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+# detected the bad --no- prefix
+<errorcode>
+2
+</errorcode>
+</verify>
+</testcase>
diff --git a/tests/data/test334 b/tests/data/test334
new file mode 100644 (file)
index 0000000..c02a65b
--- /dev/null
@@ -0,0 +1,44 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+204
+</keywords>
+</info>
+# Server-side
+<reply>
+<data>
+HTTP/1.1 204 No Content
+Date: Mon, 13 Nov 2000 13:41:09 GMT
+Server: myown/1.0
+Transfer-Encoding: chunked
+
+</data>
+</reply>
+
+# Client-side
+<client>
+<server>
+http
+</server>
+<name>
+HTTP 204 No content with chunked header
+</name>
+<command>
+http://%HOSTIP:%HTTPPORT/want/334
+</command>
+</client>
+
+# Verify data after the test has been "shot"
+<verify>
+<strip>
+^User-Agent:.*
+</strip>
+<protocol>
+GET /want/334 HTTP/1.1\r
+Host: %HOSTIP:%HTTPPORT\r
+Accept: */*\r
+\r
+</protocol>
+</verify>
+</testcase>
diff --git a/tests/data/test335 b/tests/data/test335
new file mode 100644 (file)
index 0000000..5817365
--- /dev/null
@@ -0,0 +1,103 @@
+# Mostly a duplicate of test168
+<testcase>
+<info>
+<keywords>
+HTTP
+HTTP GET
+HTTP proxy
+HTTP proxy Digest auth
+HTTP Digest auth
+HTTP auth in URL
+</keywords>
+</info>
+
+# Server-side
+<reply>
+
+# this is returned first since we get no proxy-auth
+<data>
+HTTP/1.1 407 Authorization Required to proxy me my dear swsclose
+Proxy-Authenticate: Digest realm="weirdorealm", nonce="12345"
+
+And you should ignore this data.
+</data>
+
+# then this is returned since we get no server-auth
+<data1000>
+HTTP/1.1 401 Authorization to the remote host as well swsbounce swsclose
+WWW-Authenticate: Digest realm="realmweirdo", nonce="123456"
+
+you should ignore this data too
+</data1000>
+
+<data1001>
+HTTP/1.1 200 OK swsclose
+Server: no
+Content-Length: 15
+
+Nice auth sir!
+</data1001>
+
+<datacheck>
+HTTP/1.1 407 Authorization Required to proxy me my dear swsclose
+Proxy-Authenticate: Digest realm="weirdorealm", nonce="12345"
+
+HTTP/1.1 401 Authorization to the remote host as well swsbounce swsclose
+WWW-Authenticate: Digest realm="realmweirdo", nonce="123456"
+
+HTTP/1.1 200 OK swsclose
+Server: no
+Content-Length: 15
+
+Nice auth sir!
+</datacheck>
+</reply>
+
+# Client-side
+<client>
+<server>
+http
+</server>
+<features>
+!SSPI
+crypto
+proxy
+</features>
+ <name>
+HTTP with proxy Digest and site Digest with creds in URLs
+ </name>
+ <command>
+http://digest:alot@data.from.server.requiring.digest.hohoho.com/335 --proxy http://foo:bar@%HOSTIP:%HTTPPORT --proxy-digest --digest
+</command>
+</client>
+
+# Verify data after the test has been "shot"
+<verify>
+<strip>
+^User-Agent: curl/.*
+</strip>
+<protocol>
+GET http://data.from.server.requiring.digest.hohoho.com/335 HTTP/1.1\r
+Host: data.from.server.requiring.digest.hohoho.com\r
+User-Agent: curl/7.12.0-CVS (i686-pc-linux-gnu) libcurl/7.12.0-CVS OpenSSL/0.9.6b zlib/1.1.4 c-ares/1.2.0 libidn/0.4.3\r
+Accept: */*\r
+Proxy-Connection: Keep-Alive\r
+\r
+GET http://data.from.server.requiring.digest.hohoho.com/335 HTTP/1.1\r
+Host: data.from.server.requiring.digest.hohoho.com\r
+Proxy-Authorization: Digest username="foo", realm="weirdorealm", nonce="12345", uri="/335", response="f61609cd8f5bb205ef4e169b2c5626cb"\r
+User-Agent: curl/7.12.0-CVS (i686-pc-linux-gnu) libcurl/7.12.0-CVS OpenSSL/0.9.6b zlib/1.1.4 c-ares/1.2.0 libidn/0.4.3\r
+Accept: */*\r
+Proxy-Connection: Keep-Alive\r
+\r
+GET http://data.from.server.requiring.digest.hohoho.com/335 HTTP/1.1\r
+Host: data.from.server.requiring.digest.hohoho.com\r
+Proxy-Authorization: Digest username="foo", realm="weirdorealm", nonce="12345", uri="/335", response="f61609cd8f5bb205ef4e169b2c5626cb"\r
+Authorization: Digest username="digest", realm="realmweirdo", nonce="123456", uri="/335", response="08a2e2e684047f4219a38ddc189ac00c"\r
+User-Agent: curl/7.12.0-CVS (i686-pc-linux-gnu) libcurl/7.12.0-CVS OpenSSL/0.9.6b ipv6 zlib/1.1.4 GSS libidn/0.4.3\r
+Accept: */*\r
+Proxy-Connection: Keep-Alive\r
+\r
+</protocol>
+</verify>
+</testcase>
diff --git a/tests/data/test336 b/tests/data/test336
new file mode 100644 (file)
index 0000000..85477c9
--- /dev/null
@@ -0,0 +1,58 @@
+<testcase>
+<info>
+<keywords>
+FTP
+PASV
+TYPE A
+RETR
+</keywords>
+</info>
+# Server-side
+<reply>
+<data>
+data
+    to
+      see
+that FTP
+works
+  so does it?
+</data>
+<datacheck nonewline="yes">
+data
+</datacheck>
+<servercmd>
+REPLY EPSV 500 no such command
+REPLY SIZE 500 no such command
+</servercmd>
+</reply>
+
+# Client-side
+<client>
+<server>
+ftp
+</server>
+ <name>
+FTP range download when SIZE doesn't work
+ </name>
+ <command>
+ftp://%HOSTIP:%FTPPORT/336 --use-ascii --range 3-6
+</command>
+</client>
+
+# Verify data after the test has been "shot"
+<verify>
+<protocol>
+USER anonymous\r
+PASS ftp@example.com\r
+PWD\r
+EPSV\r
+PASV\r
+TYPE A\r
+SIZE 336\r
+REST 3\r
+RETR 336\r
+ABOR\r
+QUIT\r
+</protocol>
+</verify>
+</testcase>
diff --git a/tests/data/test337 b/tests/data/test337
new file mode 100644 (file)
index 0000000..80086dd
--- /dev/null
@@ -0,0 +1,58 @@
+<testcase>
+<info>
+<keywords>
+FTP
+PASV
+TYPE A
+RETR
+</keywords>
+</info>
+# Server-side
+<reply>
+<data>
+data
+    to
+      see
+that FTP
+works
+  so does it?
+</data>
+<datacheck nonewline="yes">
+data
+</datacheck>
+<servercmd>
+REPLY EPSV 500 no such command
+REPLY SIZE 213 file: 213, Size =51
+</servercmd>
+</reply>
+
+# Client-side
+<client>
+<server>
+ftp
+</server>
+ <name>
+FTP range download with SIZE returning extra crap
+ </name>
+ <command>
+ftp://%HOSTIP:%FTPPORT/337 --use-ascii --range 3-6
+</command>
+</client>
+
+# Verify data after the test has been "shot"
+<verify>
+<protocol>
+USER anonymous\r
+PASS ftp@example.com\r
+PWD\r
+EPSV\r
+PASV\r
+TYPE A\r
+SIZE 337\r
+REST 3\r
+RETR 337\r
+ABOR\r
+QUIT\r
+</protocol>
+</verify>
+</testcase>
similarity index 51%
rename from tests/data/test536
rename to tests/data/test338
index 51ac971..f8dab65 100644 (file)
@@ -1,74 +1,63 @@
+# See https://github.com/curl/curl/issues/4499
 <testcase>
 <info>
 <keywords>
 HTTP
 HTTP GET
-pipelining
-multi
 </keywords>
 </info>
 
+#
+# Server-side
 <reply>
 <data>
-HTTP/1.1 404 Badness\r
-Date: Thu, 09 Nov 2010 14:49:00 GMT\r
-ETag: "21025-dc7-39462498"\r
-Content-Length: 6\r
-Content-Type: text/html\r
-Funny-head: yesyes\r
-\r
-hejsan
-</data>
-<data1>
-HTTP/1.1 200 Fine\r
-Date: Thu, 09 Nov 2010 14:49:00 GMT\r
-Content-Length: 13\r
-Connection: close\r
-Content-Type: text/html\r
-\r
-fine content
-</data1>
-
-<datacheck>
-fine content
-Finished!
-</datacheck>
+HTTP/1.1 200 OK
+Date: Thu, 09 Nov 2010 14:49:00 GMT
+Server: test-server/fake
+Last-Modified: Tue, 13 Jun 2000 12:10:00 GMT
+ETag: "21025-dc7-39462498"
+Accept-Ranges: bytes
+Content-Length: 6
+Content-Type: text/html
+Funny-head: yesyes
 
+-foo-
+</data>
 <servercmd>
-pipe: 1
+connection-monitor
 </servercmd>
 </reply>
 
+#
 # Client-side
 <client>
 <server>
 http
 </server>
-# tool is what to use instead of 'curl'
-<tool>
-lib536
-</tool>
-
  <name>
-HTTP GET multi two files with FAILONERROR and pipelining
+ANYAUTH connection reuse of non-authed connection
  </name>
  <command>
-http://%HOSTIP:%HTTPPORT/536 http://%HOSTIP:%HTTPPORT/5360001
+http://%HOSTIP:%HTTPPORT/338 --next http://%HOSTIP:%HTTPPORT/338 --anyauth -u foo:moo
 </command>
 </client>
 
 #
 # Verify data after the test has been "shot"
 <verify>
+<strip>
+^User-Agent:.*
+</strip>
 <protocol>
-GET /536 HTTP/1.1\r
+GET /338 HTTP/1.1\r
 Host: %HOSTIP:%HTTPPORT\r
 Accept: */*\r
 \r
-GET /5360001 HTTP/1.1\r
+GET /338 HTTP/1.1\r
 Host: %HOSTIP:%HTTPPORT\r
 Accept: */*\r
 \r
+[DISCONNECT]
 </protocol>
 </verify>
 </testcase>
diff --git a/tests/data/test339 b/tests/data/test339
new file mode 100644 (file)
index 0000000..cd6e498
--- /dev/null
@@ -0,0 +1,63 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+HTTP GET
+</keywords>
+</info>
+#
+# Server-side
+<reply>
+<data nocheck="yes">
+HTTP/1.1 200 funky chunky!\r
+Server: fakeit/0.9 fakeitbad/1.0\r
+Transfer-Encoding: chunked\r
+Trailer: chunky-trailer\r
+Connection: mooo\r
+ETag: "asdf"\r
+\r
+40
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+30
+bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
+21;heresatest=moooo
+cccccccccccccccccccccccccccccccc
+
+0
+chunky-trailer: header data
+
+</data>
+</reply>
+
+#
+# Client-side
+<client>
+<server>
+http
+</server>
+<name>
+Check if --etag-save saved correct etag to a file
+</name>
+<command>
+http://%HOSTIP:%HTTPPORT/339 --etag-save log/etag339
+</command>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<strip>
+^User-Agent:.*
+</strip>
+<protocol>
+GET /339 HTTP/1.1\r
+Host: %HOSTIP:%HTTPPORT\r
+Accept: */*\r
+\r
+</protocol>
+<file name="log/etag339">
+asdf
+</file>
+</verify>
+
+</testcase>
diff --git a/tests/data/test341 b/tests/data/test341
new file mode 100644 (file)
index 0000000..5e952ad
--- /dev/null
@@ -0,0 +1,57 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+HTTP GET
+</keywords>
+</info>
+#
+# Server-side
+<reply>
+<data nocheck="yes">
+HTTP/1.1 200 funky chunky!\r
+Server: fakeit/0.9 fakeitbad/1.0\r
+Transfer-Encoding: chunked\r
+Trailer: chunky-trailer\r
+Connection: mooo\r
+ETag: "asdf"\r
+\r
+40
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+30
+bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
+21;heresatest=moooo
+cccccccccccccccccccccccccccccccc
+
+0
+chunky-trailer: header data
+
+</data>
+</reply>
+
+#
+# Client-side
+<client>
+<server>
+http
+</server>
+<name>
+Try to open a non existing file with --etag-compare should return an error
+</name>
+<command>
+http://%HOSTIP:%HTTPPORT/341 --etag-compare log/etag341
+</command>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<strip>
+^User-Agent:.*
+</strip>
+<errorcode>
+26
+</errorcode>
+</verify>
+
+</testcase>
diff --git a/tests/data/test342 b/tests/data/test342
new file mode 100644 (file)
index 0000000..95297ba
--- /dev/null
@@ -0,0 +1,58 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+HTTP GET
+</keywords>
+</info>
+
+#
+# Server-side
+<reply>
+<data>
+HTTP/1.1 304 OK
+Date: Thu, 09 Nov 2010 14:49:00 GMT
+Server: test-server/fake
+Last-Modified: Tue, 13 Jun 2000 12:10:00 GMT
+ETag: "21025-dc7-39462498"
+Accept-Ranges: bytes
+Content-Length: 0
+Connection: close
+Content-Type: text/html
+Funny-head: yesyes
+
+</data>
+</reply>
+
+#
+# Client-side
+<client>
+<server>
+http
+</server>
+<name>
+Check if --etag-compare set correct etag in header
+</name>
+<file name="log/etag342">
+21025-dc7-39462498
+</file>
+<command>
+http://%HOSTIP:%HTTPPORT/342 --etag-compare log/etag342
+</command>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<strip>
+^User-Agent:.*
+</strip>
+<protocol>
+GET /342 HTTP/1.1\r
+Host: %HOSTIP:%HTTPPORT\r
+Accept: */*\r
+If-None-Match: "21025-dc7-39462498"\r
+\r
+</protocol>
+</verify>
+</testcase>
diff --git a/tests/data/test343 b/tests/data/test343
new file mode 100644 (file)
index 0000000..e55a181
--- /dev/null
@@ -0,0 +1,61 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+HTTP GET
+</keywords>
+</info>
+
+#
+# Server-side
+<reply>
+<data>
+HTTP/1.1 200 OK
+Date: Thu, 09 Nov 2010 14:49:00 GMT
+Server: test-server/fake
+Last-Modified: Tue, 13 Jun 2000 12:10:00 GMT
+ETag: "21025-dc7-11111"
+Accept-Ranges: bytes
+Content-Length: 0
+Connection: close
+Content-Type: text/html
+Funny-head: yesyes
+
+</data>
+</reply>
+
+#
+# Client-side
+<client>
+<server>
+http
+</server>
+<name>
+Both --etag-compare and --etag-save to save new Etag
+</name>
+<file name="log/etag343">
+21025-dc7-39462498
+</file>
+<command>
+http://%HOSTIP:%HTTPPORT/343 --etag-compare log/etag343 --etag-save log/out343
+</command>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<strip>
+^User-Agent:.*
+</strip>
+<protocol>
+GET /343 HTTP/1.1\r
+Host: %HOSTIP:%HTTPPORT\r
+Accept: */*\r
+If-None-Match: "21025-dc7-39462498"\r
+\r
+</protocol>
+<file name="log/out343">
+21025-dc7-11111
+</file>
+</verify>
+</testcase>
diff --git a/tests/data/test355 b/tests/data/test355
new file mode 100644 (file)
index 0000000..e9c4cb2
--- /dev/null
@@ -0,0 +1,57 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+Alt-Svc
+</keywords>
+</info>
+
+#
+# Server-side
+<reply>
+<data>
+HTTP/1.1 200 OK
+Date: Thu, 09 Nov 2010 14:49:00 GMT
+Content-Length: 6
+Connection: close
+Content-Type: text/html
+Funny-head: yesyes
+
+-foo-
+</data>
+</reply>
+
+#
+# Client-side
+<client>
+<features>
+alt-svc
+</features>
+<server>
+http
+</server>
+ <name>
+load Alt-Svc from file and use
+ </name>
+ <command>
+http://%HOSTIP:%HTTPPORT/355 --alt-svc ""
+</command>
+<file name="log/altsvc-355">
+h1 example.com 80 h1 %HOSTIP %HTTPPORT "20290222 22:19:28" 0 0
+</file>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<strip>
+^User-Agent:.*
+</strip>
+<protocol>
+GET /355 HTTP/1.1\r
+Host: %HOSTIP:%HTTPPORT\r
+Accept: */*\r
+\r
+</protocol>
+</verify>
+</testcase>
diff --git a/tests/data/test356 b/tests/data/test356
new file mode 100644 (file)
index 0000000..c1234b4
--- /dev/null
@@ -0,0 +1,70 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+Alt-Svc
+</keywords>
+</info>
+
+#
+# Server-side
+<reply>
+<data>
+HTTP/1.1 200 OK
+Date: Thu, 09 Nov 2010 14:49:00 GMT
+Content-Length: 6
+Connection: close
+Content-Type: text/html
+Funny-head: yesyes
+Alt-Svc: h1="nowhere.foo:81", un-kno22!wn=":82"
+
+-foo-
+</data>
+</reply>
+
+#
+# Client-side
+<client>
+<features>
+debug
+alt-svc
+</features>
+<server>
+http
+</server>
+ <name>
+parse incoming Alt-Svc and save to file
+ </name>
+<setenv>
+# make debug-curl accept Alt-Svc over plain HTTP
+CURL_ALTSVC_HTTP="yeah"
+</setenv>
+ <command>
+http://%HOSTIP:%HTTPPORT/356 --alt-svc "log/altsvc-356"
+</command>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<strip>
+^User-Agent:.*
+</strip>
+<protocol>
+GET /356 HTTP/1.1\r
+Host: %HOSTIP:%HTTPPORT\r
+Accept: */*\r
+\r
+</protocol>
+<stripfile>
+# strip out the (dynamic) expire date from the file so that the rest
+# matches
+s/\"([^\"]*)\"/TIMESTAMP/
+</stripfile>
+<file name="log/altsvc-356" mode="text">
+# Your alt-svc cache. https://curl.haxx.se/docs/alt-svc.html
+# This file was generated by libcurl! Edit at your own risk.
+h1 %HOSTIP %HTTPPORT h1 nowhere.foo 81 TIMESTAMP 0 0
+</file>
+</verify>
+</testcase>
index e5535bb..1960170 100644 (file)
@@ -56,6 +56,9 @@ HTTP Location: following over HTTP proxy
  <command>
 http://%HOSTIP:%HTTPPORT/want/43 -L -x %HOSTIP:%HTTPPORT
 </command>
+<features>
+proxy
+</features>
 </client>
 
 # Verify data after the test has been "shot"
index 5d849df..4ea2592 100644 (file)
@@ -15,7 +15,7 @@ HTTP/1.1 200 OK
 Server: Microsoft-IIS/4.0\r
 Date: Tue, 25 Sep 2001 19:37:44 GMT\r
 Content-Type: text/html\r
-Set-Cookie: ckyPersistent=permanent; expires=Fri, 02-Feb-2035 11:56:27 GMT; path=/\r
+Set-Cookie: ckyPersistent=permanent; expires=Fri, 13-Feb-2037 11:56:27 GMT; path=/\r
 Set-Cookie: ckySession=temporary; path=/\r
 Set-Cookie: ASPSESSIONIDQGGQQSJJ=GKNBDIFAAOFDPDAIEAKDIBKE; path=/\r
 Set-Cookie: justaname=; path=/;\r
@@ -49,7 +49,7 @@ domain..tld:%HTTPPORT/want/46 --resolve domain..tld:%HTTPPORT:%HOSTIP -c log/jar
 # https://curl.haxx.se/docs/http-cookies.html
 # This is generated by libcurl!  Do not edit.
 
-www.fake.come  FALSE   /       FALSE   2022144953      cookiecliente   si
+www.fake.come  FALSE   /       FALSE   2147483647      cookiecliente   si
 www.loser.com  FALSE   /       FALSE   2139150993      UID     99
 domain..tld    FALSE   /       FALSE   2139150993      mooo    indeed
 #HttpOnly_domain..tld  FALSE   /want   FALSE   2139150993      mooo2   indeed2
@@ -78,12 +78,12 @@ domain..tld FALSE   /want/  FALSE   0       simplyhuge      zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
 domain..tld    FALSE   /       FALSE   0       justaname       
 domain..tld    FALSE   /       FALSE   0       ASPSESSIONIDQGGQQSJJ    GKNBDIFAAOFDPDAIEAKDIBKE
 domain..tld    FALSE   /       FALSE   0       ckySession      temporary
-domain..tld    FALSE   /       FALSE   2054030187      ckyPersistent   permanent
+domain..tld    FALSE   /       FALSE   2118138987      ckyPersistent   permanent
 domain..tld    FALSE   /want   FALSE   0       empty   
 #HttpOnly_domain..tld  FALSE   /want   FALSE   2139150993      mooo2   indeed2
 domain..tld    FALSE   /       FALSE   2139150993      mooo    indeed
 www.loser.com  FALSE   /       FALSE   2139150993      UID     99
-www.fake.come  FALSE   /       FALSE   2022144953      cookiecliente   si
+www.fake.come  FALSE   /       FALSE   2147483647      cookiecliente   si
 </file>
 </verify>
 </testcase>
diff --git a/tests/data/test490 b/tests/data/test490
new file mode 100644 (file)
index 0000000..a3383a9
--- /dev/null
@@ -0,0 +1,68 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+HTTP PUT
+</keywords>
+</info>
+
+#
+# Server-side
+<reply>
+<data>
+HTTP/1.1 200 OK
+Date: Thu, 09 Nov 2010 14:49:00 GMT
+Server: test-server/fake
+Last-Modified: Tue, 13 Jun 2000 12:10:00 GMT
+ETag: "21025-dc7-39462498"
+Accept-Ranges: bytes
+Content-Length: 6
+Connection: close
+Content-Type: text/html
+Funny-head: yesyes
+
+-foo-
+</data>
+</reply>
+
+#
+# Client-side
+<client>
+<server>
+http
+</server>
+ <name>
+Two globbed HTTP PUTs
+ </name>
+ <command>
+http://%HOSTIP:%HTTPPORT/490 -T '{log/in490,log/in490}'
+</command>
+<file name="log/in490">
+surprise!
+</file>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<strip>
+^User-Agent:.*
+</strip>
+<protocol>
+PUT /490 HTTP/1.1\r
+Host: 127.0.0.1:8990\r
+Accept: */*\r
+Content-Length: 10\r
+Expect: 100-continue\r
+\r
+surprise!
+PUT /490 HTTP/1.1\r
+Host: 127.0.0.1:8990\r
+Accept: */*\r
+Content-Length: 10\r
+Expect: 100-continue\r
+\r
+surprise!
+</protocol>
+</verify>
+</testcase>
diff --git a/tests/data/test491 b/tests/data/test491
new file mode 100644 (file)
index 0000000..b49c06c
--- /dev/null
@@ -0,0 +1,64 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+HTTP PUT
+</keywords>
+</info>
+
+#
+# Server-side
+<reply>
+<data>
+HTTP/1.1 200 OK
+Date: Thu, 09 Nov 2010 14:49:00 GMT
+Server: test-server/fake
+Last-Modified: Tue, 13 Jun 2000 12:10:00 GMT
+ETag: "21025-dc7-39462498"
+Accept-Ranges: bytes
+Content-Length: 6
+Connection: close
+Content-Type: text/html
+Funny-head: yesyes
+
+-foo-
+</data>
+</reply>
+
+#
+# Client-side
+<client>
+<server>
+http
+</server>
+ <name>
+Two globbed HTTP PUTs, the second upload file is missing
+ </name>
+ <command>
+http://%HOSTIP:%HTTPPORT/491 -T '{log/in491,log/bad491}'
+</command>
+<file name="log/in491">
+surprise!
+</file>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<strip>
+^User-Agent:.*
+</strip>
+<protocol>
+PUT /491 HTTP/1.1\r
+Host: 127.0.0.1:8990\r
+Accept: */*\r
+Content-Length: 10\r
+Expect: 100-continue\r
+\r
+surprise!
+</protocol>
+<errorcode>
+26
+</errorcode>
+</verify>
+</testcase>
diff --git a/tests/data/test492 b/tests/data/test492
new file mode 100644 (file)
index 0000000..12edd8b
--- /dev/null
@@ -0,0 +1,89 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+HTTP PUT
+</keywords>
+</info>
+
+#
+# Server-side
+<reply>
+<data>
+HTTP/1.1 200 OK
+Date: Thu, 09 Nov 2010 14:49:00 GMT
+Server: test-server/fake
+Last-Modified: Tue, 13 Jun 2000 12:10:00 GMT
+ETag: "21025-dc7-39462498"
+Accept-Ranges: bytes
+Content-Length: 6
+Connection: close
+Content-Type: text/html
+Funny-head: yesyes
+
+-foo-
+</data>
+</reply>
+
+#
+# Client-side
+<client>
+<server>
+http
+</server>
+ <name>
+Two globbed HTTP PUTs to two globbed URLs
+ </name>
+ <command>
+'http://%HOSTIP:%HTTPPORT/{one,two}/' -T '{log/first492,log/second492}' -H "Testno: 492"
+</command>
+<file name="log/first492">
+first 492 contents
+</file>
+<file1 name="log/second492">
+second 492 contents
+</file1>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<strip>
+^User-Agent:.*
+</strip>
+<protocol>
+PUT /one/first492 HTTP/1.1\r
+Host: 127.0.0.1:8990\r
+Accept: */*\r
+Testno: 492\r
+Content-Length: 19\r
+Expect: 100-continue\r
+\r
+first 492 contents
+PUT /two/first492 HTTP/1.1\r
+Host: 127.0.0.1:8990\r
+Accept: */*\r
+Testno: 492\r
+Content-Length: 19\r
+Expect: 100-continue\r
+\r
+first 492 contents
+PUT /one/second492 HTTP/1.1\r
+Host: 127.0.0.1:8990\r
+Accept: */*\r
+Testno: 492\r
+Content-Length: 20\r
+Expect: 100-continue\r
+\r
+second 492 contents
+PUT /two/second492 HTTP/1.1\r
+Host: 127.0.0.1:8990\r
+Accept: */*\r
+Testno: 492\r
+Content-Length: 20\r
+Expect: 100-continue\r
+\r
+second 492 contents
+</protocol>
+</verify>
+</testcase>
index b62f1a1..b98d27b 100644 (file)
@@ -31,6 +31,9 @@ HTTP over proxy
  <command>
 http://%HOSTIP:%HTTPPORT/we/want/that/page/5#5 -x %HOSTIP:%HTTPPORT
 </command>
+<features>
+proxy
+</features>
 </client>
 
 #
index e8dc21e..472149d 100644 (file)
@@ -50,7 +50,9 @@ http-proxy
 <tool>
 lib503
 </tool>
-
+<features>
+proxy
+</features>
  <name>
 simple multi http:// through proxytunnel with authentication info
  </name>
index 2d3a3dd..7c92209 100644 (file)
@@ -6,6 +6,7 @@ HTTP GET
 HTTP proxy
 multi
 FAILURE
+connect to non-listen
 </keywords>
 </info>
 
@@ -20,6 +21,7 @@ none
 </server>
 <features>
 http
+proxy
 </features>
 # tool is what to use instead of 'curl'
 <tool>
index 30f4aa9..f821ad1 100644 (file)
@@ -115,94 +115,98 @@ CURLOPT_SHARE
 lock:   share  [Pigs in space]: 16
 unlock: share  [Pigs in space]: 17
 PERFORM
-lock:   dns    [Pigs in space]: 18
-unlock: dns    [Pigs in space]: 19
+lock:   cookie [Pigs in space]: 18
+unlock: cookie [Pigs in space]: 19
 lock:   dns    [Pigs in space]: 20
 unlock: dns    [Pigs in space]: 21
-lock:   cookie [Pigs in space]: 22
-unlock: cookie [Pigs in space]: 23
+lock:   dns    [Pigs in space]: 22
+unlock: dns    [Pigs in space]: 23
 lock:   cookie [Pigs in space]: 24
 unlock: cookie [Pigs in space]: 25
 lock:   cookie [Pigs in space]: 26
 unlock: cookie [Pigs in space]: 27
 lock:   cookie [Pigs in space]: 28
 unlock: cookie [Pigs in space]: 29
+lock:   cookie [Pigs in space]: 30
+unlock: cookie [Pigs in space]: 31
 run 1: set cookie 1, 2 and 3
-lock:   dns    [Pigs in space]: 30
-unlock: dns    [Pigs in space]: 31
 lock:   dns    [Pigs in space]: 32
 unlock: dns    [Pigs in space]: 33
+lock:   dns    [Pigs in space]: 34
+unlock: dns    [Pigs in space]: 35
 CLEANUP
-lock:   cookie [Pigs in space]: 34
-unlock: cookie [Pigs in space]: 35
-lock:   share  [Pigs in space]: 36
-unlock: share  [Pigs in space]: 37
-*** run 2
-CURLOPT_SHARE
+lock:   cookie [Pigs in space]: 36
+unlock: cookie [Pigs in space]: 37
 lock:   share  [Pigs in space]: 38
 unlock: share  [Pigs in space]: 39
+*** run 2
+CURLOPT_SHARE
+lock:   share  [Pigs in space]: 40
+unlock: share  [Pigs in space]: 41
 PERFORM
-lock:   dns    [Pigs in space]: 40
-unlock: dns    [Pigs in space]: 41
 lock:   cookie [Pigs in space]: 42
 unlock: cookie [Pigs in space]: 43
-lock:   cookie [Pigs in space]: 44
-unlock: cookie [Pigs in space]: 45
+lock:   dns    [Pigs in space]: 44
+unlock: dns    [Pigs in space]: 45
 lock:   cookie [Pigs in space]: 46
 unlock: cookie [Pigs in space]: 47
+lock:   cookie [Pigs in space]: 48
+unlock: cookie [Pigs in space]: 49
+lock:   cookie [Pigs in space]: 50
+unlock: cookie [Pigs in space]: 51
 run 2: set cookie 4 and 5
-lock:   dns    [Pigs in space]: 48
-unlock: dns    [Pigs in space]: 49
-lock:   dns    [Pigs in space]: 50
-unlock: dns    [Pigs in space]: 51
+lock:   dns    [Pigs in space]: 52
+unlock: dns    [Pigs in space]: 53
+lock:   dns    [Pigs in space]: 54
+unlock: dns    [Pigs in space]: 55
 CLEANUP
-lock:   cookie [Pigs in space]: 52
-unlock: cookie [Pigs in space]: 53
-lock:   share  [Pigs in space]: 54
-unlock: share  [Pigs in space]: 55
+lock:   cookie [Pigs in space]: 56
+unlock: cookie [Pigs in space]: 57
+lock:   share  [Pigs in space]: 58
+unlock: share  [Pigs in space]: 59
 *** run 3
 CURLOPT_SHARE
-lock:   share  [Pigs in space]: 56
-unlock: share  [Pigs in space]: 57
+lock:   share  [Pigs in space]: 60
+unlock: share  [Pigs in space]: 61
 CURLOPT_COOKIEJAR
 CURLOPT_COOKIELIST FLUSH
-lock:   cookie [Pigs in space]: 58
-unlock: cookie [Pigs in space]: 59
-PERFORM
-lock:   dns    [Pigs in space]: 60
-unlock: dns    [Pigs in space]: 61
 lock:   cookie [Pigs in space]: 62
 unlock: cookie [Pigs in space]: 63
-lock:   cookie [Pigs in space]: 64
-unlock: cookie [Pigs in space]: 65
+PERFORM
+lock:   dns    [Pigs in space]: 64
+unlock: dns    [Pigs in space]: 65
 lock:   cookie [Pigs in space]: 66
 unlock: cookie [Pigs in space]: 67
 lock:   cookie [Pigs in space]: 68
 unlock: cookie [Pigs in space]: 69
 lock:   cookie [Pigs in space]: 70
 unlock: cookie [Pigs in space]: 71
+lock:   cookie [Pigs in space]: 72
+unlock: cookie [Pigs in space]: 73
+lock:   cookie [Pigs in space]: 74
+unlock: cookie [Pigs in space]: 75
 run 3: overwrite cookie 1 and 4, set cookie 6 with and without tailmatch
-lock:   dns    [Pigs in space]: 72
-unlock: dns    [Pigs in space]: 73
-lock:   dns    [Pigs in space]: 74
-unlock: dns    [Pigs in space]: 75
+lock:   dns    [Pigs in space]: 76
+unlock: dns    [Pigs in space]: 77
+lock:   dns    [Pigs in space]: 78
+unlock: dns    [Pigs in space]: 79
 CLEANUP
-lock:   cookie [Pigs in space]: 76
-unlock: cookie [Pigs in space]: 77
-lock:   share  [Pigs in space]: 78
-unlock: share  [Pigs in space]: 79
+lock:   cookie [Pigs in space]: 80
+unlock: cookie [Pigs in space]: 81
+lock:   share  [Pigs in space]: 82
+unlock: share  [Pigs in space]: 83
 CURLOPT_SHARE
-lock:   share  [Pigs in space]: 80
-unlock: share  [Pigs in space]: 81
+lock:   share  [Pigs in space]: 84
+unlock: share  [Pigs in space]: 85
 CURLOPT_COOKIELIST ALL
-lock:   cookie [Pigs in space]: 82
-unlock: cookie [Pigs in space]: 83
-CURLOPT_COOKIEJAR
-CURLOPT_COOKIELIST RELOAD
-lock:   cookie [Pigs in space]: 84
-unlock: cookie [Pigs in space]: 85
 lock:   cookie [Pigs in space]: 86
 unlock: cookie [Pigs in space]: 87
+CURLOPT_COOKIEJAR
+CURLOPT_COOKIELIST RELOAD
+lock:   cookie [Pigs in space]: 88
+unlock: cookie [Pigs in space]: 89
+lock:   cookie [Pigs in space]: 90
+unlock: cookie [Pigs in space]: 91
 loaded cookies:
 -----------------
   www.host.foo.com     FALSE   /       FALSE   1993463787      test6   six_more
@@ -215,22 +219,19 @@ loaded cookies:
   .host.foo.com        TRUE    /       FALSE   1896263787      injected        yes
 -----------------
 try SHARE_CLEANUP...
-lock:   share  [Pigs in space]: 88
-unlock: share  [Pigs in space]: 89
-SHARE_CLEANUP failed, correct
-CLEANUP
-lock:   cookie [Pigs in space]: 90
-unlock: cookie [Pigs in space]: 91
 lock:   share  [Pigs in space]: 92
 unlock: share  [Pigs in space]: 93
+SHARE_CLEANUP failed, correct
+CLEANUP
+lock:   cookie [Pigs in space]: 94
+unlock: cookie [Pigs in space]: 95
+lock:   share  [Pigs in space]: 96
+unlock: share  [Pigs in space]: 97
 SHARE_CLEANUP
-lock:   share  [Pigs in space]: 94
-unlock: share  [Pigs in space]: 95
+lock:   share  [Pigs in space]: 98
+unlock: share  [Pigs in space]: 99
 GLOBAL_CLEANUP
 </stdout>
-<stderr>
-http://%HOSTIP:%HTTPPORT/506 
-</stderr>
 <file name="log/jar506" mode="text">
 # Netscape HTTP Cookie File
 # https://curl.haxx.se/docs/http-cookies.html
index 665211d..c00a096 100644 (file)
@@ -41,6 +41,9 @@ HTTP GET with proxy and CURLOPT_PORT
  <command>
 http://www.example.com:999/523 http://%HOSTIP:%HTTPPORT
 </command>
+<features>
+proxy
+</features>
 </client>
 
 #
index e9aadd1..a698340 100644 (file)
@@ -64,7 +64,7 @@ SYST
 CWD /\r
 EPSV\r
 TYPE A\r
-LIST path/to/the/file/539./\r
+LIST path/to/the/file/539.\r
 QUIT\r
 </protocol>
 </verify>
index 8391cbe..871c558 100644 (file)
@@ -67,6 +67,7 @@ lib540
 <features>
 !SSPI
 crypto
+proxy
 </features>
  <name>
 HTTP proxy auth Digest multi API re-using connection
index 841c3ff..e4ec398 100644 (file)
@@ -26,7 +26,7 @@ This is not the real page
 # this is returned first since we get no proxy-auth
 <data1001>
 HTTP/1.1 407 Authorization Required to proxy me my dear\r
-Proxy-Authenticate: NTLM TlRMTVNTUAACAAAAAgACADAAAAAGgoEAc51AYVDgyNcAAAAAAAAAAG4AbgAyAAAAQ0MCAAQAQwBDAAEAEgBFAEwASQBTAEEAQgBFAFQASAAEABgAYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAwAsAGUAbABpAHMAYQBiAGUAdABoAC4AYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAAAAAA==\r
+Proxy-Authenticate: NTLM TlRMTVNTUAACAAAAAgACADAAAACGggEAc51AYVDgyNcAAAAAAAAAAG4AbgAyAAAAQ0MCAAQAQwBDAAEAEgBFAEwASQBTAEEAQgBFAFQASAAEABgAYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAwAsAGUAbABpAHMAYQBiAGUAdABoAC4AYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAAAAAA==\r
 Content-Length: 34\r
 \r
 Hey you, authenticate or go away!
@@ -53,7 +53,7 @@ Content-Type: text/html; charset=iso-8859-1
 Connection: close\r
 \r
 HTTP/1.1 407 Authorization Required to proxy me my dear\r
-Proxy-Authenticate: NTLM TlRMTVNTUAACAAAAAgACADAAAAAGgoEAc51AYVDgyNcAAAAAAAAAAG4AbgAyAAAAQ0MCAAQAQwBDAAEAEgBFAEwASQBTAEEAQgBFAFQASAAEABgAYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAwAsAGUAbABpAHMAYQBiAGUAdABoAC4AYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAAAAAA==\r
+Proxy-Authenticate: NTLM TlRMTVNTUAACAAAAAgACADAAAACGggEAc51AYVDgyNcAAAAAAAAAAG4AbgAyAAAAQ0MCAAQAQwBDAAEAEgBFAEwASQBTAEEAQgBFAFQASAAEABgAYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAwAsAGUAbABpAHMAYQBiAGUAdABoAC4AYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAAAAAA==\r
 Content-Length: 34\r
 \r
 HTTP/1.1 200 Things are fine in proxy land swsclose\r
@@ -76,8 +76,10 @@ lib547
 </tool>
 <features>
 NTLM
+SSL
 !SSPI
 debug
+proxy
 </features>
  <name>
 HTTP proxy auth NTLM with POST data from read callback
@@ -122,7 +124,7 @@ Content-Type: application/x-www-form-urlencoded
 \r
 POST http://test.remote.example.com/path/547 HTTP/1.1\r
 Host: test.remote.example.com\r
-Proxy-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAAAAAD2AAAACAAIAPYAAAAIAAgA/gAAAAAAAAAAAAAABoKBAMOv20GsURsat8gdH/RfnYI0MzIxNTMyMeCdd8AzFZLZ/N1ujmilmCcBAQAAAAAAAACAPtXesZ0BNDMyMTUzMjEAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAdGVzdHVzZXJjdXJsaG9zdA==\r
+Proxy-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAACAAIAHAAAAAIAAgAeAAAAAAAAAAAAAAAhoIBADQzMjE1MzIxAAAAAAAAAAAAAAAAAAAAADj3hs3u3j0kgJqCrLM+74BmaoNHDfIJjHRlc3R1c2VyY3VybGhvc3Q=\r
 User-Agent: curl/7.13.2-CVS (i686-pc-linux-gnu) libcurl/7.13.2-CVS OpenSSL/0.9.7e zlib/1.2.2 libidn/0.5.13\r
 Accept: */*\r
 Proxy-Connection: Keep-Alive\r
index 9d1f258..d636ab1 100644 (file)
@@ -26,7 +26,7 @@ This is not the real page
 # this is returned first since we get no proxy-auth
 <data1001>
 HTTP/1.1 407 Authorization Required to proxy me my dear\r
-Proxy-Authenticate: NTLM TlRMTVNTUAACAAAAAgACADAAAAAGgoEAc51AYVDgyNcAAAAAAAAAAG4AbgAyAAAAQ0MCAAQAQwBDAAEAEgBFAEwASQBTAEEAQgBFAFQASAAEABgAYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAwAsAGUAbABpAHMAYQBiAGUAdABoAC4AYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAAAAAA==\r
+Proxy-Authenticate: NTLM TlRMTVNTUAACAAAAAgACADAAAACGggEAc51AYVDgyNcAAAAAAAAAAG4AbgAyAAAAQ0MCAAQAQwBDAAEAEgBFAEwASQBTAEEAQgBFAFQASAAEABgAYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAwAsAGUAbABpAHMAYQBiAGUAdABoAC4AYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAAAAAA==\r
 Content-Length: 34\r
 \r
 Hey you, authenticate or go away!
@@ -53,7 +53,7 @@ Content-Type: text/html; charset=iso-8859-1
 Connection: close\r
 \r
 HTTP/1.1 407 Authorization Required to proxy me my dear\r
-Proxy-Authenticate: NTLM TlRMTVNTUAACAAAAAgACADAAAAAGgoEAc51AYVDgyNcAAAAAAAAAAG4AbgAyAAAAQ0MCAAQAQwBDAAEAEgBFAEwASQBTAEEAQgBFAFQASAAEABgAYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAwAsAGUAbABpAHMAYQBiAGUAdABoAC4AYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAAAAAA==\r
+Proxy-Authenticate: NTLM TlRMTVNTUAACAAAAAgACADAAAACGggEAc51AYVDgyNcAAAAAAAAAAG4AbgAyAAAAQ0MCAAQAQwBDAAEAEgBFAEwASQBTAEEAQgBFAFQASAAEABgAYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAwAsAGUAbABpAHMAYQBiAGUAdABoAC4AYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAAAAAA==\r
 Content-Length: 34\r
 \r
 HTTP/1.1 200 Things are fine in proxy land swsclose\r
@@ -76,8 +76,10 @@ lib548
 </tool>
 <features>
 NTLM
+SSL
 !SSPI
 debug
+proxy
 </features>
  <name>
 HTTP proxy auth NTLM with POST data from CURLOPT_POSTFIELDS
@@ -122,7 +124,7 @@ Content-Type: application/x-www-form-urlencoded
 \r
 POST http://test.remote.example.com/path/548 HTTP/1.1\r
 Host: test.remote.example.com\r
-Proxy-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAAAAAD2AAAACAAIAPYAAAAIAAgA/gAAAAAAAAAAAAAABoKBAMOv20GsURsat8gdH/RfnYI0MzIxNTMyMeCdd8AzFZLZ/N1ujmilmCcBAQAAAAAAAACAPtXesZ0BNDMyMTUzMjEAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAdGVzdHVzZXJjdXJsaG9zdA==\r
+Proxy-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAACAAIAHAAAAAIAAgAeAAAAAAAAAAAAAAAhoIBADQzMjE1MzIxAAAAAAAAAAAAAAAAAAAAADj3hs3u3j0kgJqCrLM+74BmaoNHDfIJjHRlc3R1c2VyY3VybGhvc3Q=\r
 User-Agent: curl/7.13.2-CVS (i686-pc-linux-gnu) libcurl/7.13.2-CVS OpenSSL/0.9.7e zlib/1.2.2 libidn/0.5.13\r
 Accept: */*\r
 Proxy-Connection: Keep-Alive\r
index a248edb..a9f1ca2 100644 (file)
@@ -32,6 +32,7 @@ http
 </server>
 <features>
 ftp
+proxy
 </features>
 <tool>
 lib549
index a609aa2..1eff72a 100644 (file)
@@ -32,6 +32,7 @@ http
 </server>
 <features>
 ftp
+proxy
 </features>
 <tool>
 lib549
index ed6aee2..bb31a36 100644 (file)
@@ -63,6 +63,7 @@ lib547
 <features>
 !SSPI
 crypto
+proxy
 </features>
  <name>
 HTTP proxy auth Digest with POST data from read callback
index 18bbc43..ed8117f 100644 (file)
@@ -31,7 +31,7 @@ This is not the real page
 # this is returned first since we get no proxy-auth
 <data1001>
 HTTP/1.1 407 Authorization Required to proxy me my dear\r
-Proxy-Authenticate: NTLM TlRMTVNTUAACAAAAAgACADAAAAAGgoEAc51AYVDgyNcAAAAAAAAAAG4AbgAyAAAAQ0MCAAQAQwBDAAEAEgBFAEwASQBTAEEAQgBFAFQASAAEABgAYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAwAsAGUAbABpAHMAYQBiAGUAdABoAC4AYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAAAAAA==\r
+Proxy-Authenticate: NTLM TlRMTVNTUAACAAAAAgACADAAAACGggEAc51AYVDgyNcAAAAAAAAAAG4AbgAyAAAAQ0MCAAQAQwBDAAEAEgBFAEwASQBTAEEAQgBFAFQASAAEABgAYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAwAsAGUAbABpAHMAYQBiAGUAdABoAC4AYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAAAAAA==\r
 Content-Length: 34\r
 \r
 Hey you, authenticate or go away!
@@ -58,7 +58,7 @@ Content-Type: text/html; charset=iso-8859-1
 Connection: close\r
 \r
 HTTP/1.1 407 Authorization Required to proxy me my dear\r
-Proxy-Authenticate: NTLM TlRMTVNTUAACAAAAAgACADAAAAAGgoEAc51AYVDgyNcAAAAAAAAAAG4AbgAyAAAAQ0MCAAQAQwBDAAEAEgBFAEwASQBTAEEAQgBFAFQASAAEABgAYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAwAsAGUAbABpAHMAYQBiAGUAdABoAC4AYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAAAAAA==\r
+Proxy-Authenticate: NTLM TlRMTVNTUAACAAAAAgACADAAAACGggEAc51AYVDgyNcAAAAAAAAAAG4AbgAyAAAAQ0MCAAQAQwBDAAEAEgBFAEwASQBTAEEAQgBFAFQASAAEABgAYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAwAsAGUAbABpAHMAYQBiAGUAdABoAC4AYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAAAAAA==\r
 Content-Length: 34\r
 \r
 HTTP/1.1 200 Things are fine in proxy land swsclose\r
@@ -81,8 +81,10 @@ lib555
 </tool>
 <features>
 NTLM
+SSL
 !SSPI
 debug
+proxy
 </features>
  <name>
 HTTP proxy auth NTLM with POST data from read callback multi-if
@@ -127,7 +129,7 @@ Content-Type: application/x-www-form-urlencoded
 \r
 POST http://test.remote.example.com/path/555 HTTP/1.1\r
 Host: test.remote.example.com\r
-Proxy-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAAAAAD2AAAACAAIAPYAAAAIAAgA/gAAAAAAAAAAAAAABoKBAMOv20GsURsat8gdH/RfnYI0MzIxNTMyMeCdd8AzFZLZ/N1ujmilmCcBAQAAAAAAAACAPtXesZ0BNDMyMTUzMjEAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAdGVzdHVzZXJjdXJsaG9zdA==\r
+Proxy-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAACAAIAHAAAAAIAAgAeAAAAAAAAAAAAAAAhoIBADQzMjE1MzIxAAAAAAAAAAAAAAAAAAAAADj3hs3u3j0kgJqCrLM+74BmaoNHDfIJjHRlc3R1c2VyY3VybGhvc3Q=\r
 User-Agent: curl/7.13.2-CVS (i686-pc-linux-gnu) libcurl/7.13.2-CVS OpenSSL/0.9.7e zlib/1.2.2 libidn/0.5.13\r
 Accept: */*\r
 Proxy-Connection: Keep-Alive\r
index 4436186..49ef1c7 100644 (file)
@@ -51,6 +51,7 @@ s/ =.*//
 s/\(.*\)/()/
 s/:\d+/:/
 s:^(MEM |FD )(.*/)(.*):$1$3:
+s/\r\n/\n/
 </stripfile>
 </verify>
 
index a6188ea..359e54c 100644 (file)
@@ -33,6 +33,7 @@ http
 </server>
 <features>
 ftp
+proxy
 </features>
 <tool>
 lib549
index c9df792..eb9372e 100644 (file)
@@ -32,7 +32,9 @@ lib562
  <name>
 FTP type=A URL and CURLOPT_PORT set and proxy
  </name>
-
+<features>
+proxy
+</features>
 <setenv>
 ftp_proxy=http://%HOSTIP:%HTTPPORT/
 </setenv>
index 4c9ecd4..3078e2d 100644 (file)
@@ -38,6 +38,9 @@ FTP RETR a file over a SOCKS proxy using the multi interface
 <command>
 ftp://%HOSTIP:%FTPPORT/path/564 %HOSTIP:%SOCKSPORT
 </command>
+<features>
+proxy
+</features>
 </client>
 
 # Verify data after the test has been "shot"
index abbe49a..788ed72 100644 (file)
@@ -38,7 +38,7 @@ lib578
 HTTP POST lower than MAX_INITIAL_POST_SIZE with progress callback
  </name>
  <command>
-http://%HOSTIP:%HTTPPORT/500 log/ip578
+http://%HOSTIP:%HTTPPORT/578 log/ip578
 </command>
 </client>
 
index 48144d4..5ddc823 100644 (file)
@@ -25,7 +25,7 @@ This is not the real page
 # this is returned first since we get no proxy-auth
 <data1001>
 HTTP/1.1 407 Authorization Required to proxy me my dear\r
-Proxy-Authenticate: NTLM TlRMTVNTUAACAAAAAgACADAAAAAGgoEAc51AYVDgyNcAAAAAAAAAAG4AbgAyAAAAQ0MCAAQAQwBDAAEAEgBFAEwASQBTAEEAQgBFAFQASAAEABgAYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAwAsAGUAbABpAHMAYQBiAGUAdABoAC4AYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAAAAAA==\r
+Proxy-Authenticate: NTLM TlRMTVNTUAACAAAAAgACADAAAACGggEAc51AYVDgyNcAAAAAAAAAAG4AbgAyAAAAQ0MCAAQAQwBDAAEAEgBFAEwASQBTAEEAQgBFAFQASAAEABgAYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAwAsAGUAbABpAHMAYQBiAGUAdABoAC4AYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAAAAAA==\r
 Content-Length: 34\r
 \r
 Hey you, authenticate or go away!
@@ -51,7 +51,7 @@ Content-Type: text/html; charset=iso-8859-1
 Connection: close\r
 \r
 HTTP/1.1 407 Authorization Required to proxy me my dear\r
-Proxy-Authenticate: NTLM TlRMTVNTUAACAAAAAgACADAAAAAGgoEAc51AYVDgyNcAAAAAAAAAAG4AbgAyAAAAQ0MCAAQAQwBDAAEAEgBFAEwASQBTAEEAQgBFAFQASAAEABgAYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAwAsAGUAbABpAHMAYQBiAGUAdABoAC4AYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAAAAAA==\r
+Proxy-Authenticate: NTLM TlRMTVNTUAACAAAAAgACADAAAACGggEAc51AYVDgyNcAAAAAAAAAAG4AbgAyAAAAQ0MCAAQAQwBDAAEAEgBFAEwASQBTAEEAQgBFAFQASAAEABgAYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAwAsAGUAbABpAHMAYQBiAGUAdABoAC4AYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAAAAAA==\r
 Content-Length: 34\r
 \r
 HTTP/1.1 200 Things are fine in proxy land swsclose\r
@@ -74,8 +74,10 @@ lib590
 </tool>
 <features>
 NTLM
+SSL
 !SSPI
 debug
+proxy
 </features>
  <name>
 HTTP proxy offers Negotiate+NTLM, use only NTLM
@@ -115,7 +117,7 @@ Proxy-Connection: Keep-Alive
 \r
 GET http://test.remote.example.com/path/590 HTTP/1.1\r
 Host: test.remote.example.com\r
-Proxy-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAAAAAD2AAAAAgACAPYAAAAIAAgA+AAAAAAAAAAAAAAABoKBAPfkdFqeIuYPjDr2ZbNxCag0MzIxNTMyMQjxxEdSYaUsgjpD8o53NrMBAQAAAAAAAACAPtXesZ0BNDMyMTUzMjEAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAbWVjdXJsaG9zdA==\r
+Proxy-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAAAgACAHAAAAAIAAgAcgAAAAAAAAAAAAAAhoIBADQzMjE1MzIxAAAAAAAAAAAAAAAAAAAAAIWYOdZV0iKA8ytf+dU+Bz9TpMJ4mBKu221lY3VybGhvc3Q=\r
 User-Agent: curl/7.13.2-CVS (i686-pc-linux-gnu) libcurl/7.13.2-CVS OpenSSL/0.9.7e zlib/1.2.2 libidn/0.5.13\r
 Accept: */*\r
 Proxy-Connection: Keep-Alive\r
index 458bb64..3eb9ed8 100644 (file)
@@ -31,7 +31,6 @@ ftp://%HOSTIP:%FTPPORT
 USER anonymous\r
 PASS ftp@example.com\r
 PWD\r
-QUIT\r
 </protocol>
 </verify>
 </testcase>
index 784163f..2bf6490 100644 (file)
@@ -17,8 +17,8 @@ Date: Thu, 09 Nov 2010 14:49:00 GMT
 Server: test-server/fake\r
 Content-Type: text/html\r
 Funny-head: yesyes\r
-Set-Cookie: test=yes; httponly; domain=foo.com; expires=Fri Feb 2 11:56:27 GMT 2035\r
-SET-COOKIE: test2=yes; domain=host.foo.com; expires=Fri Feb 2 11:56:27 GMT 2035\r
+Set-Cookie: test=yes; httponly; domain=foo.com; expires=Fri Feb 13 11:56:27 GMT 2037\r
+SET-COOKIE: test2=yes; domain=host.foo.com; expires=Fri Feb 13 11:56:27 GMT 2037\r
 Set-Cookie: test3=maybe; domain=foo.com; path=/moo; secure\r
 Set-Cookie: test4=no; domain=nope.foo.com; path=/moo; secure\r
 Set-Cookie: test5=name; domain=anything.com; path=/ ; secure\r
@@ -65,9 +65,8 @@ Accept: */*
 # https://curl.haxx.se/docs/http-cookies.html
 # This file was generated by libcurl! Edit at your own risk.
 
-.foo.com       TRUE    /moo    TRUE    0       test3   maybe
-.host.foo.com  TRUE    /we/want/       FALSE   2054030187      test2   yes
-#HttpOnly_.foo.com     TRUE    /we/want/       FALSE   2054030187      test    yes
+.host.foo.com  TRUE    /we/want/       FALSE   2118138987      test2   yes
+#HttpOnly_.foo.com     TRUE    /we/want/       FALSE   2118138987      test    yes
 </file>
 </verify>
 </testcase>
index add2a6a..82bc0d7 100644 (file)
@@ -29,16 +29,16 @@ http
 HTTP, send cookies when using custom Host:
  </name>
  <command>
-http://%HOSTIP:%HTTPPORT/we/want/62 http://%HOSTIP:%HTTPPORT/we/want?hoge=fuga -b log/jar62.txt -H "Host: www.host.foo.com"
+http://%HOSTIP:%HTTPPORT/we/want/62 http://%HOSTIP:%HTTPPORT/we/want/62?hoge=fuga -b log/jar62.txt -H "Host: www.host.foo.com"
 </command>
 <file name="log/jar62.txt">
 # Netscape HTTP Cookie File
 # https://curl.haxx.se/docs/http-cookies.html
 # This file was generated by libcurl! Edit at your own risk.
 
-#HttpOnly_.foo.com     TRUE    /we/want/       FALSE   2054030187      test    yes
-.host.foo.com  TRUE    /we/want/       FALSE   2054030187      test2   yes
-.fake.host.foo.com     TRUE    /we/want/       FALSE   2054030187      test4   yes
+#HttpOnly_.foo.com     TRUE    /we/want/       FALSE   2147483647      test    yes
+.host.foo.com  TRUE    /we/want/       FALSE   2147483647      test2   yes
+.fake.host.foo.com     TRUE    /we/want/       FALSE   2147483647      test4   yes
 
 .foo.com       TRUE    /moo    TRUE    0       test3   maybe
 </file>
@@ -55,7 +55,7 @@ Host: www.host.foo.com
 Accept: */*\r
 Cookie: test2=yes; test=yes\r
 \r
-GET /we/want?hoge=fuga HTTP/1.1\r
+GET /we/want/62?hoge=fuga HTTP/1.1\r
 Host: www.host.foo.com\r
 Accept: */*\r
 Cookie: test2=yes; test=yes\r
index ccc19dd..e7d7a46 100644 (file)
@@ -33,6 +33,9 @@ http_proxy=http://fake:user@%HOSTIP:%HTTPPORT/
  <command>
 http://we.want.that.site.com/63
 </command>
+<features>
+proxy
+</features>
 </client>
 
 # Verify data after the test has been "shot"
index b00ca5d..ae64094 100644 (file)
@@ -57,7 +57,7 @@ s/boundary=------------------------[a-z0-9]*/boundary=--------------------------
 # (5*12) == 60 bytes less
 <protocol>
 POST /651 HTTP/1.1\r
-Host: 127.0.0.1:8990\r
+Host: %HOSTIP:%HTTPPORT\r
 Accept: */*\r
 Content-Length: 17139\r
 Content-Type: multipart/form-data; boundary=----------------------------\r
index d620b57..d7be059 100644 (file)
@@ -67,7 +67,7 @@ s/boundary=------------------------[a-z0-9]*/boundary=--------------------------
 # (5*12) == 60 bytes less
 <protocol>
 POST /653 HTTP/1.1\r
-Host: 127.0.0.1:8990\r
+Host: %HOSTIP:%HTTPPORT\r
 Accept: */*\r
 Content-Length: 150\r
 Content-Type: multipart/form-data; boundary=----------------------------\r
@@ -78,7 +78,7 @@ Content-Disposition: form-data; name="name"
 short value\r
 --------------------------------\r
 POST /653 HTTP/1.1\r
-Host: 127.0.0.1:8990\r
+Host: %HOSTIP:%HTTPPORT\r
 Accept: */*\r
 Content-Length: 167\r
 Content-Type: multipart/form-data; boundary=----------------------------\r
diff --git a/tests/data/test658 b/tests/data/test658
new file mode 100644 (file)
index 0000000..2ed6d64
--- /dev/null
@@ -0,0 +1,52 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+HTTP GET
+CURLOPT_CURLU
+</keywords>
+</info>
+<reply>
+<data nocheck="yes">
+HTTP/1.1 200 OK
+Date: Thu, 09 Nov 2010 14:49:00 GMT
+Server: test-server/fake
+Last-Modified: Tue, 13 Jun 2000 12:10:00 GMT
+ETag: "21025-dc7-39462498"
+Accept-Ranges: bytes
+Content-Length: 6
+Connection: close
+Content-Type: text/html
+Funny-head: yesyes
+
+-foo-
+</data>
+</reply>
+<client>
+<server>
+http
+</server>
+<tool>
+lib658
+</tool>
+<name>
+Pass URL to libcurl with CURLOPT_CURLU
+ </name>
+ <command>
+http://%HOSTIP:%HTTPPORT/658
+</command>
+</client>
+
+<verify>
+<strip>
+^User-Agent:.*
+</strip>
+<protocol>
+GET /658 HTTP/1.1\r
+Host: %HOSTIP:%HTTPPORT\r
+Accept: */*\r
+\r
+</protocol>
+</verify>
+
+</testcase>
diff --git a/tests/data/test659 b/tests/data/test659
new file mode 100644 (file)
index 0000000..048c0d0
--- /dev/null
@@ -0,0 +1,57 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+HTTP GET
+CURLOPT_CURLU
+proxy
+</keywords>
+</info>
+<reply>
+<data nocheck="yes">
+HTTP/1.1 200 OK
+Date: Thu, 09 Nov 2010 14:49:00 GMT
+Server: test-server/fake
+Last-Modified: Tue, 13 Jun 2000 12:10:00 GMT
+ETag: "21025-dc7-39462498"
+Accept-Ranges: bytes
+Content-Length: 6
+Connection: close
+Content-Type: text/html
+Funny-head: yesyes
+
+-foo-
+</data>
+</reply>
+<client>
+<server>
+http
+</server>
+<tool>
+lib659
+</tool>
+<name>
+CURLOPT_CURLU without the path set - over proxy
+ </name>
+ <command>
+http://%HOSTIP:%HTTPPORT
+</command>
+<features>
+proxy
+</features>
+</client>
+
+<verify>
+<strip>
+^User-Agent:.*
+</strip>
+<protocol>
+GET http://www.example.com:80/ HTTP/1.1\r
+Host: www.example.com\r
+Accept: */*\r
+Proxy-Connection: Keep-Alive\r
+\r
+</protocol>
+</verify>
+
+</testcase>
index a018d8f..7b9af29 100644 (file)
@@ -3,6 +3,7 @@
 <keywords>
 HTTP
 HTTP GET
+HTTP/0.9
 </keywords>
 </info>
 # Server-side
@@ -21,7 +22,7 @@ http
 HTTP GET without headers in the response
  </name>
  <command>
-http://%HOSTIP:%HTTPPORT/66
+http://%HOSTIP:%HTTPPORT/66 --http0.9
 </command>
 </client>
 
diff --git a/tests/data/test660 b/tests/data/test660
new file mode 100644 (file)
index 0000000..d480bc3
--- /dev/null
@@ -0,0 +1,34 @@
+<testcase>
+<info>
+<keywords>
+IMAP
+CONNECT_ONLY
+</keywords>
+</info>
+
+# Client-side
+<client>
+<server>
+imap
+</server>
+<tool>
+lib597
+</tool>
+ <name>
+IMAP CONNECT_ONLY option
+ </name>
+
+<command>
+imap://%HOSTIP:%IMAPPORT/660
+</command>
+
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<protocol>
+A001 CAPABILITY\r
+</protocol>
+</verify>
+</testcase>
diff --git a/tests/data/test661 b/tests/data/test661
new file mode 100644 (file)
index 0000000..067612b
--- /dev/null
@@ -0,0 +1,73 @@
+<testcase>
+<info>
+<keywords>
+FTP
+</keywords>
+</info>
+
+#
+# Server-side
+<reply>
+<data>
+</data>
+</reply>
+
+# Client-side
+<client>
+<server>
+ftp
+</server>
+# tool is what to use instead of 'curl'
+<tool>
+lib661
+</tool>
+
+ <name>
+Avoid redundant CWDs
+ </name>
+ <command>
+ftp://%HOSTIP:%FTPPORT/
+</command>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<protocol>
+USER anonymous\r
+PASS ftp@example.com\r
+PWD\r
+CWD /folderA\r
+EPSV\r
+TYPE I\r
+RETR 661\r
+CWD /folderB\r
+EPSV\r
+RETR 661\r
+QUIT\r
+USER anonymous\r
+PASS ftp@example.com\r
+PWD\r
+EPSV\r
+TYPE I\r
+RETR /folderA/661\r
+CWD /folderB\r
+EPSV\r
+RETR 661\r
+EPSV\r
+RETR /folderA/661\r
+QUIT\r
+USER anonymous\r
+PASS ftp@example.com\r
+PWD\r
+SYST\r
+QUIT\r
+USER anonymous\r
+PASS ftp@example.com\r
+PWD\r
+SYST\r
+SYST\r
+QUIT\r
+</protocol>
+</verify>
+</testcase>
diff --git a/tests/data/test662 b/tests/data/test662
new file mode 100644 (file)
index 0000000..53d97c3
--- /dev/null
@@ -0,0 +1,78 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+HTTP GET
+followlocation
+</keywords>
+</info>
+#
+# Server-side
+<reply>
+<data>
+HTTP/1.1 302 OK\r
+Location: http://example.net/tes t case=/6620002\r
+Date: Thu, 09 Nov 2010 14:49:00 GMT\r
+Content-Length: 0\r
+\r
+</data>
+<data2>
+HTTP/1.1 200 OK\r
+Location: this should be ignored\r
+Date: Thu, 09 Nov 2010 14:49:00 GMT\r
+Content-Length: 5\r
+\r
+body
+</data2>
+<datacheck>
+HTTP/1.1 302 OK\r
+Location: http://example.net/tes t case=/6620002\r
+Date: Thu, 09 Nov 2010 14:49:00 GMT\r
+Content-Length: 0\r
+\r
+HTTP/1.1 200 OK\r
+Location: this should be ignored\r
+Date: Thu, 09 Nov 2010 14:49:00 GMT\r
+Content-Length: 5\r
+\r
+body
+</datacheck>
+</reply>
+
+#
+# Client-side
+<client>
+<server>
+http
+</server>
+ <name>
+HTTP redirect with whitespace in absolute Location: URL
+ </name>
+ <command>
+http://example.com/please/gimme/662 -L -x http://%HOSTIP:%HTTPPORT
+</command>
+<features>
+proxy
+</features>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<strip>
+^User-Agent:.*
+</strip>
+<protocol>
+GET http://example.com/please/gimme/662 HTTP/1.1\r
+Host: example.com\r
+Accept: */*\r
+Proxy-Connection: Keep-Alive\r
+\r
+GET http://example.net/tes%20t%20case=/6620002 HTTP/1.1\r
+Host: example.net\r
+Accept: */*\r
+Proxy-Connection: Keep-Alive\r
+\r
+</protocol>
+</verify>
+</testcase>
diff --git a/tests/data/test663 b/tests/data/test663
new file mode 100644 (file)
index 0000000..6743b32
--- /dev/null
@@ -0,0 +1,82 @@
+#
+# This test is crafted to reproduce oss-fuzz bug
+# https://crbug.com/oss-fuzz/17954
+#
+<testcase>
+<info>
+<keywords>
+HTTP
+HTTP GET
+followlocation
+</keywords>
+</info>
+#
+# Server-side
+<reply>
+<data>
+HTTP/1.1 302 OK\r
+Location: http://example.net/there/it/is/../../tes t case=/6630002? yes no\r
+Date: Thu, 09 Nov 2010 14:49:00 GMT\r
+Content-Length: 0\r
+\r
+</data>
+<data2>
+HTTP/1.1 200 OK\r
+Location: this should be ignored\r
+Date: Thu, 09 Nov 2010 14:49:00 GMT\r
+Content-Length: 5\r
+\r
+body
+</data2>
+<datacheck>
+HTTP/1.1 302 OK\r
+Location: http://example.net/there/it/is/../../tes t case=/6630002? yes no\r
+Date: Thu, 09 Nov 2010 14:49:00 GMT\r
+Content-Length: 0\r
+\r
+HTTP/1.1 200 OK\r
+Location: this should be ignored\r
+Date: Thu, 09 Nov 2010 14:49:00 GMT\r
+Content-Length: 5\r
+\r
+body
+</datacheck>
+</reply>
+
+#
+# Client-side
+<client>
+<server>
+http
+</server>
+ <name>
+HTTP redirect with dotdots and whitespaces in absolute Location: URL
+ </name>
+ <command>
+http://example.com/please/../gimme/663?foobar#hello -L -x http://%HOSTIP:%HTTPPORT
+</command>
+<features>
+proxy
+</features>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<strip>
+^User-Agent:.*
+</strip>
+<protocol>
+GET http://example.com/gimme/663?foobar HTTP/1.1\r
+Host: example.com\r
+Accept: */*\r
+Proxy-Connection: Keep-Alive\r
+\r
+GET http://example.net/there/tes%20t%20case=/6630002?+yes+no HTTP/1.1\r
+Host: example.net\r
+Accept: */*\r
+Proxy-Connection: Keep-Alive\r
+\r
+</protocol>
+</verify>
+</testcase>
index 739b82c..c0ccaf8 100644 (file)
@@ -19,7 +19,7 @@ HTTP/1.1 401 Now gimme that second request of crap
 Server: Microsoft-IIS/5.0\r
 Content-Type: text/html; charset=iso-8859-1\r
 Content-Length: 34\r
-WWW-Authenticate: NTLM TlRMTVNTUAACAAAAAgACADAAAAAGgoEAc51AYVDgyNcAAAAAAAAAAG4AbgAyAAAAQ0MCAAQAQwBDAAEAEgBFAEwASQBTAEEAQgBFAFQASAAEABgAYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAwAsAGUAbABpAHMAYQBiAGUAdABoAC4AYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAAAAAA==\r
+WWW-Authenticate: NTLM TlRMTVNTUAACAAAAAgACADAAAACGggEAc51AYVDgyNcAAAAAAAAAAG4AbgAyAAAAQ0MCAAQAQwBDAAEAEgBFAEwASQBTAEEAQgBFAFQASAAEABgAYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAwAsAGUAbABpAHMAYQBiAGUAdABoAC4AYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAAAAAA==\r
 \r
 This is not the real page either!
 </data1001>
@@ -40,7 +40,7 @@ HTTP/1.1 401 Now gimme that second request of crap
 Server: Microsoft-IIS/5.0\r
 Content-Type: text/html; charset=iso-8859-1\r
 Content-Length: 34\r
-WWW-Authenticate: NTLM TlRMTVNTUAACAAAAAgACADAAAAAGgoEAc51AYVDgyNcAAAAAAAAAAG4AbgAyAAAAQ0MCAAQAQwBDAAEAEgBFAEwASQBTAEEAQgBFAFQASAAEABgAYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAwAsAGUAbABpAHMAYQBiAGUAdABoAC4AYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAAAAAA==\r
+WWW-Authenticate: NTLM TlRMTVNTUAACAAAAAgACADAAAACGggEAc51AYVDgyNcAAAAAAAAAAG4AbgAyAAAAQ0MCAAQAQwBDAAEAEgBFAEwASQBTAEEAQgBFAFQASAAEABgAYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAwAsAGUAbABpAHMAYQBiAGUAdABoAC4AYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAAAAAA==\r
 \r
 HTTP/1.1 200 Things are fine in server land swsclose\r
 Server: Microsoft-IIS/5.0\r
@@ -56,6 +56,7 @@ Finally, this is the real page!
 <client>
 <features>
 NTLM
+SSL
 !SSPI
 debug
 </features>
@@ -93,7 +94,7 @@ Accept: */*
 \r
 GET /67 HTTP/1.1\r
 Host: %HOSTIP:%HTTPPORT\r
-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAAAAAD2AAAACAAIAPYAAAAIAAgA/gAAAAAAAAAAAAAABoKBAMOv20GsURsat8gdH/RfnYI0MzIxNTMyMeCdd8AzFZLZ/N1ujmilmCcBAQAAAAAAAACAPtXesZ0BNDMyMTUzMjEAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAdGVzdHVzZXJjdXJsaG9zdA==\r
+Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAACAAIAHAAAAAIAAgAeAAAAAAAAAAAAAAAhoIBADQzMjE1MzIxAAAAAAAAAAAAAAAAAAAAADj3hs3u3j0kgJqCrLM+74BmaoNHDfIJjHRlc3R1c2VyY3VybGhvc3Q=\r
 User-Agent: curl/7.10.6-pre1 (i686-pc-linux-gnu) libcurl/7.10.6-pre1 OpenSSL/0.9.7a ipv6 zlib/1.1.3\r
 Accept: */*\r
 \r
index 239da78..1eaff6e 100644 (file)
@@ -16,7 +16,7 @@ HTTP/1.1 401 Now gimme that second request of crap
 Server: Microsoft-IIS/5.0\r
 Content-Length: 34\r
 Content-Type: text/html; charset=iso-8859-1\r
-WWW-Authenticate: NTLM TlRMTVNTUAACAAAAAgACADAAAAAGgoEAc51AYVDgyNcAAAAAAAAAAG4AbgAyAAAAQ0MCAAQAQwBDAAEAEgBFAEwASQBTAEEAQgBFAFQASAAEABgAYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAwAsAGUAbABpAHMAYQBiAGUAdABoAC4AYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAAAAAA==\r
+WWW-Authenticate: NTLM TlRMTVNTUAACAAAAAgACADAAAACGggEAc51AYVDgyNcAAAAAAAAAAG4AbgAyAAAAQ0MCAAQAQwBDAAEAEgBFAEwASQBTAEEAQgBFAFQASAAEABgAYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAwAsAGUAbABpAHMAYQBiAGUAdABoAC4AYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAAAAAA==\r
 \r
 This is not the real page either!
 </data1001>
@@ -38,7 +38,7 @@ HTTP/1.1 401 Now gimme that second request of crap
 Server: Microsoft-IIS/5.0\r
 Content-Length: 34\r
 Content-Type: text/html; charset=iso-8859-1\r
-WWW-Authenticate: NTLM TlRMTVNTUAACAAAAAgACADAAAAAGgoEAc51AYVDgyNcAAAAAAAAAAG4AbgAyAAAAQ0MCAAQAQwBDAAEAEgBFAEwASQBTAEEAQgBFAFQASAAEABgAYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAwAsAGUAbABpAHMAYQBiAGUAdABoAC4AYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAAAAAA==\r
+WWW-Authenticate: NTLM TlRMTVNTUAACAAAAAgACADAAAACGggEAc51AYVDgyNcAAAAAAAAAAG4AbgAyAAAAQ0MCAAQAQwBDAAEAEgBFAEwASQBTAEEAQgBFAFQASAAEABgAYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAwAsAGUAbABpAHMAYQBiAGUAdABoAC4AYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAAAAAA==\r
 \r
 HTTP/1.1 401 You give me wrong password\r
 Server: Microsoft-IIS/5.0\r
@@ -55,6 +55,7 @@ Wrong password dude. Get it fixed and return.
 <client>
 <features>
 NTLM
+SSL
 !SSPI
 debug
 </features>
@@ -92,7 +93,7 @@ Accept: */*
 \r
 GET /68 HTTP/1.1\r
 Host: %HOSTIP:%HTTPPORT\r
-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAAAAAD2AAAACAAIAPYAAAAIAAgA/gAAAAAAAAAAAAAABoKBAMOv20GsURsat8gdH/RfnYI0MzIxNTMyMeCdd8AzFZLZ/N1ujmilmCcBAQAAAAAAAACAPtXesZ0BNDMyMTUzMjEAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAdGVzdHVzZXJjdXJsaG9zdA==\r
+Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAACAAIAHAAAAAIAAgAeAAAAAAAAAAAAAAAhoIBADQzMjE1MzIxAAAAAAAAAAAAAAAAAAAAADj3hs3u3j0kgJqCrLM+74BmaoNHDfIJjHRlc3R1c2VyY3VybGhvc3Q=\r
 User-Agent: curl/7.10.6-pre1 (i686-pc-linux-gnu) libcurl/7.10.6-pre1 OpenSSL/0.9.7a ipv6 zlib/1.1.3\r
 Accept: */*\r
 \r
index c0503f7..309f039 100644 (file)
@@ -27,7 +27,7 @@ HTTP/1.1 401 Now gimme that second request of crap
 Server: Microsoft-IIS/5.0\r
 Content-Length: 34\r
 Content-Type: text/html; charset=iso-8859-1\r
-WWW-Authenticate: NTLM TlRMTVNTUAACAAAAAgACADAAAAAGgoEAc51AYVDgyNcAAAAAAAAAAG4AbgAyAAAAQ0MCAAQAQwBDAAEAEgBFAEwASQBTAEEAQgBFAFQASAAEABgAYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAwAsAGUAbABpAHMAYQBiAGUAdABoAC4AYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAAAAAA==\r
+WWW-Authenticate: NTLM TlRMTVNTUAACAAAAAgACADAAAACGggEAc51AYVDgyNcAAAAAAAAAAG4AbgAyAAAAQ0MCAAQAQwBDAAEAEgBFAEwASQBTAEEAQgBFAFQASAAEABgAYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAwAsAGUAbABpAHMAYQBiAGUAdABoAC4AYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAAAAAA==\r
 \r
 This is not the real page either!
 </data1001>
@@ -56,7 +56,7 @@ HTTP/1.1 401 Now gimme that second request of crap
 Server: Microsoft-IIS/5.0\r
 Content-Length: 34\r
 Content-Type: text/html; charset=iso-8859-1\r
-WWW-Authenticate: NTLM TlRMTVNTUAACAAAAAgACADAAAAAGgoEAc51AYVDgyNcAAAAAAAAAAG4AbgAyAAAAQ0MCAAQAQwBDAAEAEgBFAEwASQBTAEEAQgBFAFQASAAEABgAYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAwAsAGUAbABpAHMAYQBiAGUAdABoAC4AYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAAAAAA==\r
+WWW-Authenticate: NTLM TlRMTVNTUAACAAAAAgACADAAAACGggEAc51AYVDgyNcAAAAAAAAAAG4AbgAyAAAAQ0MCAAQAQwBDAAEAEgBFAEwASQBTAEEAQgBFAFQASAAEABgAYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAwAsAGUAbABpAHMAYQBiAGUAdABoAC4AYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAAAAAA==\r
 \r
 HTTP/1.1 200 Things are fine in server land swsclose\r
 Server: Microsoft-IIS/5.0\r
@@ -72,6 +72,7 @@ Finally, this is the real page!
 <client>
 <features>
 NTLM
+SSL
 !SSPI
 debug
 </features>
@@ -114,7 +115,7 @@ Accept: */*
 \r
 GET /69 HTTP/1.1\r
 Host: %HOSTIP:%HTTPPORT\r
-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAAAAAD2AAAACAAIAPYAAAAIAAgA/gAAAAAAAAAAAAAABoKBAMOv20GsURsat8gdH/RfnYI0MzIxNTMyMeCdd8AzFZLZ/N1ujmilmCcBAQAAAAAAAACAPtXesZ0BNDMyMTUzMjEAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAdGVzdHVzZXJjdXJsaG9zdA==\r
+Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAACAAIAHAAAAAIAAgAeAAAAAAAAAAAAAAAhoIBADQzMjE1MzIxAAAAAAAAAAAAAAAAAAAAADj3hs3u3j0kgJqCrLM+74BmaoNHDfIJjHRlc3R1c2VyY3VybGhvc3Q=\r
 User-Agent: curl/7.10.6-pre1 (i686-pc-linux-gnu) libcurl/7.10.6-pre1 OpenSSL/0.9.7a ipv6 zlib/1.1.3\r
 Accept: */*\r
 \r
index 36af713..c037236 100644 (file)
@@ -12,6 +12,10 @@ FAILURE
 <reply>
 <data>
 </data>
+# 91 is socks4 failure
+<servercmd>
+response 91
+</servercmd>
 </reply>
 
 # Client-side
@@ -21,6 +25,7 @@ socks4
 </server>
 <features>
 http
+proxy
 </features>
  <name>
 Attempt connect to non-listening HTTP server via SOCKS4 proxy
index 4aa89b4..53d6a02 100644 (file)
@@ -12,6 +12,10 @@ FAILURE
 <reply>
 <data>
 </data>
+# 1 is socks5 failure
+<servercmd>
+response 1
+</servercmd>
 </reply>
 
 # Client-side
@@ -21,6 +25,7 @@ socks5
 </server>
 <features>
 http
+proxy
 </features>
  <name>
 Attempt connect to non-listening HTTP server via SOCKS5 proxy
index 15a1b67..7f891fa 100644 (file)
@@ -23,8 +23,11 @@ http
 Attempt connect to non-listening SOCKS4 proxy
  </name>
  <command>
---socks4 %HOSTIP:60000 http://%HOSTIP:%HTTPPORT/704
+--socks4 %HOSTIP:2 http://%HOSTIP:%HTTPPORT/704
 </command>
+<features>
+proxy
+</features>
 </client>
 
 # Verify data after the test has been "shot"
index 3b904c6..cfbf341 100644 (file)
@@ -23,8 +23,11 @@ http
 Attempt connect to non-listening SOCKS5 proxy
  </name>
  <command>
---socks5 %HOSTIP:60000 http://%HOSTIP:%HTTPPORT/705
+--socks5 %HOSTIP:2 http://%HOSTIP:%HTTPPORT/705
 </command>
+<features>
+proxy
+</features>
 </client>
 
 # Verify data after the test has been "shot"
index 0226888..fa7fbc0 100644 (file)
@@ -34,7 +34,7 @@ http
 socks5
 </server>
 <setenv>
-http_proxy=socks5://%HOSTIP:%SOCKSPORT 
+http_proxy=socks5://%HOSTIP:%SOCKSPORT
 </setenv>
  <name>
 HTTP GET via SOCKS5 set in http_proxy environment variable
index 7be1f3c..3efbb79 100644 (file)
@@ -15,6 +15,8 @@ all_proxy
 <data>
 silly content
 </data>
+<servercmd>
+</servercmd>
 </reply>
 
 #
@@ -25,7 +27,7 @@ ftp
 socks5
 </server>
 <setenv>
-all_proxy=socks5://%HOSTIP:%SOCKSPORT 
+all_proxy=socks5://%HOSTIP:%SOCKSPORT
 </setenv>
  <name>
 FTP fetch with all_proxy set to socks5
index efec032..776d8b2 100644 (file)
@@ -41,6 +41,7 @@ http-proxy
 </server>
 <features>
 http
+proxy
 </features>
  <name>
 FTP fetch with --proxy set to http:// and with --connect-to
index 56936b9..85372ca 100644 (file)
@@ -43,6 +43,7 @@ socks5
 </server>
 <features>
 http
+proxy
 </features>
  <name>
 FTP fetch with --preproxy, --proxy and --connect-to
diff --git a/tests/data/test716 b/tests/data/test716
new file mode 100644 (file)
index 0000000..96167de
--- /dev/null
@@ -0,0 +1,45 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+SOCKS5
+all_proxy
+</keywords>
+</info>
+#
+# Server-side
+<reply>
+# method 2 is SOCKS5 asking for user+password
+<servercmd>
+method 2
+</servercmd>
+</reply>
+
+#
+# Client-side
+<client>
+<server>
+socks5
+</server>
+<features>
+http
+proxy
+</features>
+<name>
+SOCKS5 proxy with too long user name
+</name>
+
+# it should never connect to the target server
+ <command>
+http://hohoho.example.com:99/716 -x socks5://AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA:b@%HOSTIP:%SOCKSPORT
+</command>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<errorcode>
+43
+</errorcode>
+</verify>
+</testcase>
diff --git a/tests/data/test717 b/tests/data/test717
new file mode 100644 (file)
index 0000000..dae50d9
--- /dev/null
@@ -0,0 +1,68 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+SOCKS5
+all_proxy
+</keywords>
+</info>
+#
+# Server-side
+<reply>
+<data>
+HTTP/1.1 200 OK
+Date: Thu, 09 Nov 2010 14:49:00 GMT
+Server: test-server/fake
+Last-Modified: Tue, 13 Jun 2000 12:10:00 GMT
+ETag: "21025-dc7-39462498"
+Accept-Ranges: bytes
+Content-Length: 6
+Connection: close
+Content-Type: text/html
+Funny-head: yesyes
+
+-foo-
+</data>
+# method 2 is SOCKS5 asking for user+password
+<servercmd>
+method 2
+user uz3r
+password p4ssworm
+backendport %HTTPPORT
+</servercmd>
+</reply>
+
+#
+# Client-side
+<client>
+<server>
+socks5
+http
+</server>
+<name>
+SOCKS5 proxy auth
+</name>
+
+# target a port that won't work without the SOCKS magic
+ <command>
+http://%HOSTIP:1/717 -x socks5://uz3r:p4ssworm@%HOSTIP:%SOCKSPORT
+</command>
+<features>
+proxy
+</features>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<strip>
+^User-Agent:.*
+</strip>
+<protocol>
+GET /717 HTTP/1.1\r
+Host: %HOSTIP:1\r
+Accept: */*\r
+\r
+</protocol>
+</verify>
+</testcase>
index b2566e2..9bc8366 100644 (file)
@@ -29,6 +29,7 @@ http
 </server>
 <features>
 ftp
+proxy
 </features>
  <name>
 FTP over HTTP proxy
index 147a6aa..3e61edd 100644 (file)
@@ -55,6 +55,9 @@ HTTP 1.0 CONNECT with proxytunnel and proxy+host Basic authentication
  <command>
 http://test.80:%HTTPPORT/we/want/that/page/80 -p --proxy1.0 %HOSTIP:%PROXYPORT --user iam:myself --proxy-user youare:yourself
 </command>
+<features>
+proxy
+</features>
 </client>
 
 #
index 7483bfb..29e558d 100644 (file)
@@ -18,7 +18,7 @@ HTTP/1.1 407 Now gimme that second request of crap
 Server: Microsoft-IIS/5.0\r
 Content-Type: text/html; charset=iso-8859-1\r
 Content-Length: 34\r
-Proxy-Authenticate: NTLM TlRMTVNTUAACAAAAAgACADAAAAAGgoEAc51AYVDgyNcAAAAAAAAAAG4AbgAyAAAAQ0MCAAQAQwBDAAEAEgBFAEwASQBTAEEAQgBFAFQASAAEABgAYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAwAsAGUAbABpAHMAYQBiAGUAdABoAC4AYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAAAAAA==\r
+Proxy-Authenticate: NTLM TlRMTVNTUAACAAAAAgACADAAAACGggEAc51AYVDgyNcAAAAAAAAAAG4AbgAyAAAAQ0MCAAQAQwBDAAEAEgBFAEwASQBTAEEAQgBFAFQASAAEABgAYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAwAsAGUAbABpAHMAYQBiAGUAdABoAC4AYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAAAAAA==\r
 \r
 This is not the real page either!
 </data1001>
@@ -39,7 +39,7 @@ HTTP/1.1 407 Now gimme that second request of crap
 Server: Microsoft-IIS/5.0\r
 Content-Type: text/html; charset=iso-8859-1\r
 Content-Length: 34\r
-Proxy-Authenticate: NTLM TlRMTVNTUAACAAAAAgACADAAAAAGgoEAc51AYVDgyNcAAAAAAAAAAG4AbgAyAAAAQ0MCAAQAQwBDAAEAEgBFAEwASQBTAEEAQgBFAFQASAAEABgAYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAwAsAGUAbABpAHMAYQBiAGUAdABoAC4AYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAAAAAA==\r
+Proxy-Authenticate: NTLM TlRMTVNTUAACAAAAAgACADAAAACGggEAc51AYVDgyNcAAAAAAAAAAG4AbgAyAAAAQ0MCAAQAQwBDAAEAEgBFAEwASQBTAEEAQgBFAFQASAAEABgAYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAwAsAGUAbABpAHMAYQBiAGUAdABoAC4AYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAAAAAA==\r
 \r
 HTTP/1.1 200 Things are fine in server land swsclose\r
 Server: Microsoft-IIS/5.0\r
@@ -55,8 +55,10 @@ Finally, this is the real page!
 <client>
 <features>
 NTLM
+SSL
 !SSPI
 debug
+proxy
 </features>
 <server>
 http
@@ -93,7 +95,7 @@ Proxy-Connection: Keep-Alive
 \r
 GET http://%HOSTIP:%HTTPPORT/81 HTTP/1.1\r
 Host: %HOSTIP:%HTTPPORT\r
-Proxy-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAAAAAD2AAAACAAIAPYAAAAIAAgA/gAAAAAAAAAAAAAABoKBAMOv20GsURsat8gdH/RfnYI0MzIxNTMyMeCdd8AzFZLZ/N1ujmilmCcBAQAAAAAAAACAPtXesZ0BNDMyMTUzMjEAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAdGVzdHVzZXJjdXJsaG9zdA==\r
+Proxy-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAACAAIAHAAAAAIAAgAeAAAAAAAAAAAAAAAhoIBADQzMjE1MzIxAAAAAAAAAAAAAAAAAAAAADj3hs3u3j0kgJqCrLM+74BmaoNHDfIJjHRlc3R1c2VyY3VybGhvc3Q=\r
 User-Agent: curl/7.10.6-pre1 (i686-pc-linux-gnu) libcurl/7.10.6-pre1 OpenSSL/0.9.7a ipv6 zlib/1.1.3\r
 Accept: */*\r
 Proxy-Connection: Keep-Alive\r
index b88e350..4213e3e 100644 (file)
@@ -14,7 +14,7 @@ RFC4616
 <servercmd>
 AUTH PLAIN
 REPLY AUTHENTICATE +
-REPLY dXNlcgB1c2VyAHNlY3JldA== A002 OK AUTHENTICATE completed
+REPLY AHVzZXIAc2VjcmV0 A002 OK AUTHENTICATE completed
 </servercmd>
 <data>
 From: me@somewhere\r
@@ -47,7 +47,7 @@ IMAP plain authentication
 <protocol>
 A001 CAPABILITY\r
 A002 AUTHENTICATE PLAIN\r
-dXNlcgB1c2VyAHNlY3JldA==\r
+AHVzZXIAc2VjcmV0\r
 A003 SELECT 819\r
 A004 FETCH 1 BODY[]\r
 A005 LOGOUT\r
index 8b58f75..88d5da8 100644 (file)
@@ -26,6 +26,7 @@ This is not the real page either!
 # Client-side
 <client>
 <features>
+proxy
 </features>
 <server>
 http
index 60f0cf1..aa264ed 100644 (file)
@@ -13,8 +13,8 @@ SASL AUTH NTLM
 <servercmd>
 AUTH NTLM
 REPLY AUTHENTICATE +
-REPLY TlRMTVNTUAABAAAABoIIAAAAAAAAAAAAAAAAAAAAAAA= + TlRMTVNTUAACAAAAAgACADAAAAAGgoEAc51AYVDgyNcAAAAAAAAAAG4AbgAyAAAAQ0MCAAQAQwBDAAEAEgBFAEwASQBTAEEAQgBFAFQASAAEABgAYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAwAsAGUAbABpAHMAYQBiAGUAdABoAC4AYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAAAAAA==
-REPLY TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAAAAAD2AAAACAAIAPYAAAAIAAgA/gAAAAAAAAAAAAAABoKBAMOv20GsURsat8gdH/RfnYI0MzIxNTMyMeCdd8AzFZLZ/N1ujmilmCcBAQAAAAAAAACAPtXesZ0BNDMyMTUzMjEAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAdGVzdHVzZXJjdXJsaG9zdA== A002 OK AUTHENTICATE completed
+REPLY TlRMTVNTUAABAAAABoIIAAAAAAAAAAAAAAAAAAAAAAA= + TlRMTVNTUAACAAAAAgACADAAAACGggEAc51AYVDgyNcAAAAAAAAAAG4AbgAyAAAAQ0MCAAQAQwBDAAEAEgBFAEwASQBTAEEAQgBFAFQASAAEABgAYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAwAsAGUAbABpAHMAYQBiAGUAdABoAC4AYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAAAAAA==
+REPLY TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAACAAIAHAAAAAIAAgAeAAAAAAAAAAAAAAAhoIBADQzMjE1MzIxAAAAAAAAAAAAAAAAAAAAADj3hs3u3j0kgJqCrLM+74BmaoNHDfIJjHRlc3R1c2VyY3VybGhvc3Q= A002 OK AUTHENTICATE completed
 </servercmd>
 <data>
 From: me@somewhere\r
@@ -35,6 +35,7 @@ imap
 </server>
 <features>
 NTLM
+SSL
 !SSPI
 debug
 </features>
@@ -62,7 +63,7 @@ chkhostname curlhost
 A001 CAPABILITY\r
 A002 AUTHENTICATE NTLM\r
 TlRMTVNTUAABAAAABoIIAAAAAAAAAAAAAAAAAAAAAAA=\r
-TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAAAAAD2AAAACAAIAPYAAAAIAAgA/gAAAAAAAAAAAAAABoKBAMOv20GsURsat8gdH/RfnYI0MzIxNTMyMeCdd8AzFZLZ/N1ujmilmCcBAQAAAAAAAACAPtXesZ0BNDMyMTUzMjEAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAdGVzdHVzZXJjdXJsaG9zdA==\r
+TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAACAAIAHAAAAAIAAgAeAAAAAAAAAAAAAAAhoIBADQzMjE1MzIxAAAAAAAAAAAAAAAAAAAAADj3hs3u3j0kgJqCrLM+74BmaoNHDfIJjHRlc3R1c2VyY3VybGhvc3Q=\r
 A003 SELECT 822\r
 A004 FETCH 1 BODY[]\r
 A005 LOGOUT\r
index b489e95..d28b6a5 100644 (file)
@@ -47,7 +47,7 @@ IMAP plain authentication with initial response
 <verify>
 <protocol>
 A001 CAPABILITY\r
-A002 AUTHENTICATE PLAIN dXNlcgB1c2VyAHNlY3JldA==\r
+A002 AUTHENTICATE PLAIN AHVzZXIAc2VjcmV0\r
 A003 SELECT 825\r
 A004 FETCH 1 BODY[]\r
 A005 LOGOUT\r
index 1329ed2..9cefb50 100644 (file)
@@ -14,8 +14,8 @@ SASL-IR
 <servercmd>
 AUTH NTLM
 CAPA SASL-IR
-REPLY AUTHENTICATE + TlRMTVNTUAACAAAAAgACADAAAAAGgoEAc51AYVDgyNcAAAAAAAAAAG4AbgAyAAAAQ0MCAAQAQwBDAAEAEgBFAEwASQBTAEEAQgBFAFQASAAEABgAYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAwAsAGUAbABpAHMAYQBiAGUAdABoAC4AYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAAAAAA==
-REPLY TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAAAAAD2AAAACAAIAPYAAAAIAAgA/gAAAAAAAAAAAAAABoKBAMOv20GsURsat8gdH/RfnYI0MzIxNTMyMeCdd8AzFZLZ/N1ujmilmCcBAQAAAAAAAACAPtXesZ0BNDMyMTUzMjEAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAdGVzdHVzZXJjdXJsaG9zdA== A002 OK AUTHENTICATE completed
+REPLY AUTHENTICATE + TlRMTVNTUAACAAAAAgACADAAAACGggEAc51AYVDgyNcAAAAAAAAAAG4AbgAyAAAAQ0MCAAQAQwBDAAEAEgBFAEwASQBTAEEAQgBFAFQASAAEABgAYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAwAsAGUAbABpAHMAYQBiAGUAdABoAC4AYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAAAAAA==
+REPLY TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAACAAIAHAAAAAIAAgAeAAAAAAAAAAAAAAAhoIBADQzMjE1MzIxAAAAAAAAAAAAAAAAAAAAADj3hs3u3j0kgJqCrLM+74BmaoNHDfIJjHRlc3R1c2VyY3VybGhvc3Q= A002 OK AUTHENTICATE completed
 </servercmd>
 <data>
 From: me@somewhere\r
@@ -36,6 +36,7 @@ imap
 </server>
 <features>
 NTLM
+SSL
 !SSPI
 debug
 </features>
@@ -62,7 +63,7 @@ chkhostname curlhost
 <protocol>
 A001 CAPABILITY\r
 A002 AUTHENTICATE NTLM TlRMTVNTUAABAAAABoIIAAAAAAAAAAAAAAAAAAAAAAA=\r
-TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAAAAAD2AAAACAAIAPYAAAAIAAgA/gAAAAAAAAAAAAAABoKBAMOv20GsURsat8gdH/RfnYI0MzIxNTMyMeCdd8AzFZLZ/N1ujmilmCcBAQAAAAAAAACAPtXesZ0BNDMyMTUzMjEAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAdGVzdHVzZXJjdXJsaG9zdA==\r
+TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAACAAIAHAAAAAIAAgAeAAAAAAAAAAAAAAAhoIBADQzMjE1MzIxAAAAAAAAAAAAAAAAAAAAADj3hs3u3j0kgJqCrLM+74BmaoNHDfIJjHRlc3R1c2VyY3VybGhvc3Q=\r
 A003 SELECT 827\r
 A004 FETCH 1 BODY[]\r
 A005 LOGOUT\r
index 120bcc6..400e0a0 100644 (file)
@@ -52,6 +52,9 @@ HTTP over proxy-tunnel with site authentication
  <command>
 http://test.83:%HTTPPORT/we/want/that/page/83 -p -x %HOSTIP:%PROXYPORT --user 'iam:my:;self'
 </command>
+<features>
+proxy
+</features>
 </client>
 
 #
index fdcae29..eae10f0 100644 (file)
@@ -28,6 +28,7 @@ imap
 </server>
 <features>
 NTLM
+SSL
 !SSPI
 </features>
  <name>
index dc8214b..2c694ad 100644 (file)
@@ -18,7 +18,7 @@ AUTH CRAM-MD5 PLAIN
 REPLY "AUTHENTICATE CRAM-MD5" + Rubbish
 REPLY * A002 NO AUTH exchange cancelled by client
 REPLY "AUTHENTICATE PLAIN" +
-REPLY dXNlcgB1c2VyAHNlY3JldA== A003 OK AUTHENTICATE completed
+REPLY AHVzZXIAc2VjcmV0 A003 OK AUTHENTICATE completed
 </servercmd>
 <data>
 From: me@somewhere\r
@@ -56,7 +56,7 @@ A001 CAPABILITY
 A002 AUTHENTICATE CRAM-MD5\r
 *\r
 A003 AUTHENTICATE PLAIN\r
-dXNlcgB1c2VyAHNlY3JldA==\r
+AHVzZXIAc2VjcmV0\r
 A004 SELECT 833\r
 A005 FETCH 1 BODY[]\r
 A006 LOGOUT\r
index fc13177..8ecc223 100644 (file)
@@ -18,7 +18,7 @@ REPLY "AUTHENTICATE NTLM" +
 REPLY TlRMTVNTUAABAAAABoIIAAAAAAAAAAAAAAAAAAAAAAA= + Rubbish
 REPLY * A002 NO AUTH exchange cancelled by client
 REPLY "AUTHENTICATE PLAIN" +
-REPLY dXNlcgB1c2VyAHNlY3JldA== A003 OK AUTHENTICATE completed
+REPLY AHVzZXIAc2VjcmV0 A003 OK AUTHENTICATE completed
 </servercmd>
 <data>
 From: me@somewhere\r
@@ -39,6 +39,7 @@ imap
 </server>
 <features>
 NTLM
+SSL
 !SSPI
 </features>
  <name>
@@ -67,7 +68,7 @@ A002 AUTHENTICATE NTLM
 TlRMTVNTUAABAAAABoIIAAAAAAAAAAAAAAAAAAAAAAA=\r
 *\r
 A003 AUTHENTICATE PLAIN\r
-dXNlcgB1c2VyAHNlY3JldA==\r
+AHVzZXIAc2VjcmV0\r
 A004 SELECT 834\r
 A005 FETCH 1 BODY[]\r
 A006 LOGOUT\r
index 400233c..b44e877 100644 (file)
@@ -18,7 +18,7 @@ AUTH DIGEST-MD5 PLAIN
 REPLY "AUTHENTICATE DIGEST-MD5" + Rubbish
 REPLY * A002 NO AUTH exchange cancelled by client
 REPLY "AUTHENTICATE PLAIN" +
-REPLY dXNlcgB1c2VyAHNlY3JldA== A003 OK AUTHENTICATE completed
+REPLY AHVzZXIAc2VjcmV0 A003 OK AUTHENTICATE completed
 </servercmd>
 <data>
 From: me@somewhere\r
@@ -58,7 +58,7 @@ A001 CAPABILITY
 A002 AUTHENTICATE DIGEST-MD5\r
 *\r
 A003 AUTHENTICATE PLAIN\r
-dXNlcgB1c2VyAHNlY3JldA==\r
+AHVzZXIAc2VjcmV0\r
 A004 SELECT 835\r
 A005 FETCH 1 BODY[]\r
 A006 LOGOUT\r
index 629dae2..4cfde6d 100644 (file)
@@ -33,6 +33,9 @@ HTTP over proxy with site authentication
  <command>
 http://%HOSTIP:%HTTPPORT/we/want/that/page/84 -x %HOSTIP:%HTTPPORT --user iam:myself
 </command>
+<features>
+proxy
+</features>
 </client>
 
 #
index e86abd4..1d9181e 100644 (file)
@@ -15,7 +15,7 @@ RFC7628
 <servercmd>
 AUTH OAUTHBEARER
 REPLY AUTHENTICATE +
-REPLY dXNlcj11c2VyAWhvc3Q9MTI3LjAuMC4xAXBvcnQ9OTAwMwFhdXRoPUJlYXJlciBtRl85LkI1Zi00LjFKcU0BAQ== A002 OK AUTHENTICATE completed
+REPLY bixhPXVzZXIsAWhvc3Q9MTI3LjAuMC4xAXBvcnQ9OTAwMwFhdXRoPUJlYXJlciBtRl85LkI1Zi00LjFKcU0BAQ== A002 OK AUTHENTICATE completed
 </servercmd>
 <data>
 From: me@somewhere\r
@@ -53,7 +53,7 @@ perl -e "print 'Test requires default test server host and port' if ( '%HOSTIP'
 <protocol>
 A001 CAPABILITY\r
 A002 AUTHENTICATE OAUTHBEARER\r
-dXNlcj11c2VyAWhvc3Q9MTI3LjAuMC4xAXBvcnQ9OTAwMwFhdXRoPUJlYXJlciBtRl85LkI1Zi00LjFKcU0BAQ==\r
+bixhPXVzZXIsAWhvc3Q9MTI3LjAuMC4xAXBvcnQ9OTAwMwFhdXRoPUJlYXJlciBtRl85LkI1Zi00LjFKcU0BAQ==\r
 A003 SELECT 842\r
 A004 FETCH 1 BODY[]\r
 A005 LOGOUT\r
index e286fd9..bd39dd9 100644 (file)
@@ -53,7 +53,7 @@ perl -e "print 'Test requires default test server host and port' if ( '%HOSTIP'
 <verify>
 <protocol>
 A001 CAPABILITY\r
-A002 AUTHENTICATE OAUTHBEARER dXNlcj11c2VyAWhvc3Q9MTI3LjAuMC4xAXBvcnQ9OTAwMwFhdXRoPUJlYXJlciBtRl85LkI1Zi00LjFKcU0BAQ==\r
+A002 AUTHENTICATE OAUTHBEARER bixhPXVzZXIsAWhvc3Q9MTI3LjAuMC4xAXBvcnQ9OTAwMwFhdXRoPUJlYXJlciBtRl85LkI1Zi00LjFKcU0BAQ==\r
 A003 SELECT 843\r
 A004 FETCH 1 BODY[]\r
 A005 LOGOUT\r
index 2cdb265..c5093d2 100644 (file)
@@ -15,7 +15,8 @@ RFC7628
 <servercmd>
 AUTH OAUTHBEARER
 REPLY AUTHENTICATE +
-REPLY dXNlcj11c2VyAWhvc3Q9MTI3LjAuMC4xAXBvcnQ9OTAwMwFhdXRoPUJlYXJlciBtRl85LkI1Zi00LjFKcU0BAQ== + eyJzdGF0dXMiOiJpbnZhbGlkX3Rva2VuIiwic2NvcGUiOiJleGFtcGxlX3Njb3BlIiwib3BlbmlkLWNvbmZpZ3VyYXRpb24iOiJodHRwczovL2V4YW1wbGUuY29tLy53ZWxsLWtub3duL29wZW5pZC1jb25maWd1cmF0aW9uIn0=
+REPLY bixhPXVzZXIsAWhvc3Q9MTI3LjAuMC4xAXBvcnQ9OTAwMwFhdXRoPUJlYXJlciBtRl85LkI1Zi00LjFKcU0BAQ== +
+eyJzdGF0dXMiOiJpbnZhbGlkX3Rva2VuIiwic2NvcGUiOiJleGFtcGxlX3Njb3BlIiwib3BlbmlkLWNvbmZpZ3VyYXRpb24iOiJodHRwczovL2V4YW1wbGUuY29tLy53ZWxsLWtub3duL29wZW5pZC1jb25maWd1cmF0aW9uIn0=
 REPLY AQ== A002 NO Authentication failed
 </servercmd>
 </reply>
@@ -52,7 +53,7 @@ perl -e "print 'Test requires default test server host and port' if ( '%HOSTIP'
 <protocol>
 A001 CAPABILITY\r
 A002 AUTHENTICATE OAUTHBEARER\r
-dXNlcj11c2VyAWhvc3Q9MTI3LjAuMC4xAXBvcnQ9OTAwMwFhdXRoPUJlYXJlciBtRl85LkI1Zi00LjFKcU0BAQ==\r
+bixhPXVzZXIsAWhvc3Q9MTI3LjAuMC4xAXBvcnQ9OTAwMwFhdXRoPUJlYXJlciBtRl85LkI1Zi00LjFKcU0BAQ==\r
 AQ==\r
 </protocol>
 </verify>
index d8b5574..70562c7 100644 (file)
@@ -52,7 +52,7 @@ perl -e "print 'Test requires default test server host and port' if ( '%HOSTIP'
 # transfer and such a connection will not get a "LOGOUT"
 <protocol>
 A001 CAPABILITY\r
-A002 AUTHENTICATE OAUTHBEARER dXNlcj11c2VyAWhvc3Q9MTI3LjAuMC4xAXBvcnQ9OTAwMwFhdXRoPUJlYXJlciBtRl85LkI1Zi00LjFKcU0BAQ==\r
+A002 AUTHENTICATE OAUTHBEARER bixhPXVzZXIsAWhvc3Q9MTI3LjAuMC4xAXBvcnQ9OTAwMwFhdXRoPUJlYXJlciBtRl85LkI1Zi00LjFKcU0BAQ==\r
 AQ==\r
 </protocol>
 </verify>
diff --git a/tests/data/test848 b/tests/data/test848
new file mode 100644 (file)
index 0000000..2b4a30b
--- /dev/null
@@ -0,0 +1,56 @@
+<testcase>
+<info>
+<keywords>
+IMAP
+SASL
+SASL AUTH PLAIN
+RFC4616
+</keywords>
+</info>
+
+#
+# Server-side
+<reply>
+<servercmd>
+AUTH PLAIN
+REPLY AUTHENTICATE +
+REPLY c2hhcmVkLW1haWxib3gAdXNlcgBzZWNyZXQ= A002 OK AUTHENTICATE completed
+</servercmd>
+<data>
+From: me@somewhere\r
+To: fake@nowhere\r
+\r
+body\r
+\r
+--\r
+  yours sincerely\r
+</data>
+</reply>
+
+#
+# Client-side
+<client>
+<server>
+imap
+</server>
+ <name>
+IMAP plain authentication with alternative authorization identity
+ </name>
+ <command>
+'imap://%HOSTIP:%IMAPPORT/848/;MAILINDEX=1' -u user:secret --sasl-authzid shared-mailbox
+</command>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<protocol>
+A001 CAPABILITY\r
+A002 AUTHENTICATE PLAIN\r
+c2hhcmVkLW1haWxib3gAdXNlcgBzZWNyZXQ=\r
+A003 SELECT 848\r
+A004 FETCH 1 BODY[]\r
+A005 LOGOUT\r
+</protocol>
+</verify>
+</testcase>
diff --git a/tests/data/test849 b/tests/data/test849
new file mode 100644 (file)
index 0000000..8a4b39c
--- /dev/null
@@ -0,0 +1,51 @@
+<testcase>
+<info>
+<keywords>
+IMAP
+SASL
+SASL AUTH PLAIN
+RFC4616
+</keywords>
+</info>
+
+#
+# Server-side
+<reply>
+<servercmd>
+AUTH PLAIN
+REPLY AUTHENTICATE +
+REPLY dXJzZWwAa3VydAB4aXBqM3BsbXE= A002 NO Not authorized
+</servercmd>
+</reply>
+
+#
+# Client-side
+<client>
+<server>
+imap
+</server>
+ <name>
+IMAP plain authentication with alternative authorization identity (Not authorized)
+ </name>
+ <command>
+'imap://%HOSTIP:%IMAPPORT/849/;MAILINDEX=1' -u kurt:xipj3plmq --sasl-authzid ursel
+</command>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+# 67 - CURLE_LOGIN_DENIED
+<errorcode>
+67
+</errorcode>
+#
+# The multi interface considers a broken "CONNECT" as a prematurely broken
+# transfer and such a connection will not get a "LOGOUT"
+<protocol>
+A001 CAPABILITY\r
+A002 AUTHENTICATE PLAIN\r
+dXJzZWwAa3VydAB4aXBqM3BsbXE=\r
+</protocol>
+</verify>
+</testcase>
index cb5e6e0..8b4cd6a 100644 (file)
@@ -36,6 +36,9 @@ HTTP over proxy with site and proxy authentication
  <command>
 http://%HOSTIP:%HTTPPORT/we/want/that/page/85 -x %HOSTIP:%HTTPPORT --user iam:myself --proxy-user testing:this
 </command>
+<features>
+proxy
+</features>
 </client>
 
 #
index 6f66f82..8a262fc 100644 (file)
@@ -16,7 +16,7 @@ RFC5034
 <servercmd>
 AUTH PLAIN
 REPLY AUTH +
-REPLY dXNlcgB1c2VyAHNlY3JldA== +OK Login successful
+REPLY AHVzZXIAc2VjcmV0 +OK Login successful
 </servercmd>
 <data>
 From: me@somewhere\r
@@ -49,7 +49,7 @@ pop3://%HOSTIP:%POP3PORT/865 -u user:secret
 <protocol>
 CAPA\r
 AUTH PLAIN\r
-dXNlcgB1c2VyAHNlY3JldA==\r
+AHVzZXIAc2VjcmV0\r
 RETR 865\r
 QUIT\r
 </protocol>
index 30426fb..2fa2405 100644 (file)
@@ -15,8 +15,8 @@ RFC5034
 <servercmd>
 AUTH NTLM
 REPLY AUTH +
-REPLY TlRMTVNTUAABAAAABoIIAAAAAAAAAAAAAAAAAAAAAAA= + TlRMTVNTUAACAAAAAgACADAAAAAGgoEAc51AYVDgyNcAAAAAAAAAAG4AbgAyAAAAQ0MCAAQAQwBDAAEAEgBFAEwASQBTAEEAQgBFAFQASAAEABgAYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAwAsAGUAbABpAHMAYQBiAGUAdABoAC4AYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAAAAAA==\r
-REPLY TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAAAAAD2AAAACAAIAPYAAAAIAAgA/gAAAAAAAAAAAAAABoKBAMOv20GsURsat8gdH/RfnYI0MzIxNTMyMeCdd8AzFZLZ/N1ujmilmCcBAQAAAAAAAACAPtXesZ0BNDMyMTUzMjEAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAdGVzdHVzZXJjdXJsaG9zdA== +OK Login successful
+REPLY TlRMTVNTUAABAAAABoIIAAAAAAAAAAAAAAAAAAAAAAA= + TlRMTVNTUAACAAAAAgACADAAAACGggEAc51AYVDgyNcAAAAAAAAAAG4AbgAyAAAAQ0MCAAQAQwBDAAEAEgBFAEwASQBTAEEAQgBFAFQASAAEABgAYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAwAsAGUAbABpAHMAYQBiAGUAdABoAC4AYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAAAAAA==\r
+REPLY TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAACAAIAHAAAAAIAAgAeAAAAAAAAAAAAAAAhoIBADQzMjE1MzIxAAAAAAAAAAAAAAAAAAAAADj3hs3u3j0kgJqCrLM+74BmaoNHDfIJjHRlc3R1c2VyY3VybGhvc3Q= +OK Login successful
 </servercmd>
 <data>
 From: me@somewhere\r
@@ -37,6 +37,7 @@ pop3
 </server>
 <features>
 NTLM
+SSL
 !SSPI
 debug
 </features>
@@ -64,7 +65,7 @@ chkhostname curlhost
 CAPA\r
 AUTH NTLM\r
 TlRMTVNTUAABAAAABoIIAAAAAAAAAAAAAAAAAAAAAAA=\r
-TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAAAAAD2AAAACAAIAPYAAAAIAAgA/gAAAAAAAAAAAAAABoKBAMOv20GsURsat8gdH/RfnYI0MzIxNTMyMeCdd8AzFZLZ/N1ujmilmCcBAQAAAAAAAACAPtXesZ0BNDMyMTUzMjEAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAdGVzdHVzZXJjdXJsaG9zdA==\r
+TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAACAAIAHAAAAAIAAgAeAAAAAAAAAAAAAAAhoIBADQzMjE1MzIxAAAAAAAAAAAAAAAAAAAAADj3hs3u3j0kgJqCrLM+74BmaoNHDfIJjHRlc3R1c2VyY3VybGhvc3Q=\r
 RETR 868\r
 QUIT\r
 </protocol>
index f4f2360..27cc2a4 100644 (file)
@@ -48,7 +48,7 @@ pop3://%HOSTIP:%POP3PORT/871 -u user:secret --sasl-ir
 <verify>
 <protocol>
 CAPA\r
-AUTH PLAIN dXNlcgB1c2VyAHNlY3JldA==\r
+AUTH PLAIN AHVzZXIAc2VjcmV0\r
 RETR 871\r
 QUIT\r
 </protocol>
index 448e8e2..2cabf1f 100644 (file)
@@ -15,8 +15,8 @@ RFC5034
 <reply>
 <servercmd>
 AUTH NTLM
-REPLY AUTH + TlRMTVNTUAACAAAAAgACADAAAAAGgoEAc51AYVDgyNcAAAAAAAAAAG4AbgAyAAAAQ0MCAAQAQwBDAAEAEgBFAEwASQBTAEEAQgBFAFQASAAEABgAYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAwAsAGUAbABpAHMAYQBiAGUAdABoAC4AYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAAAAAA==
-REPLY TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAAAAAD2AAAACAAIAPYAAAAIAAgA/gAAAAAAAAAAAAAABoKBAMOv20GsURsat8gdH/RfnYI0MzIxNTMyMeCdd8AzFZLZ/N1ujmilmCcBAQAAAAAAAACAPtXesZ0BNDMyMTUzMjEAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAdGVzdHVzZXJjdXJsaG9zdA== +OK Login successful
+REPLY AUTH + TlRMTVNTUAACAAAAAgACADAAAACGggEAc51AYVDgyNcAAAAAAAAAAG4AbgAyAAAAQ0MCAAQAQwBDAAEAEgBFAEwASQBTAEEAQgBFAFQASAAEABgAYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAwAsAGUAbABpAHMAYQBiAGUAdABoAC4AYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAAAAAA==
+REPLY TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAACAAIAHAAAAAIAAgAeAAAAAAAAAAAAAAAhoIBADQzMjE1MzIxAAAAAAAAAAAAAAAAAAAAADj3hs3u3j0kgJqCrLM+74BmaoNHDfIJjHRlc3R1c2VyY3VybGhvc3Q= +OK Login successful
 </servercmd>
 <data>
 From: me@somewhere\r
@@ -37,6 +37,7 @@ pop3
 </server>
 <features>
 NTLM
+SSL
 !SSPI
 debug
 </features>
@@ -63,7 +64,7 @@ chkhostname curlhost
 <protocol>
 CAPA\r
 AUTH NTLM TlRMTVNTUAABAAAABoIIAAAAAAAAAAAAAAAAAAAAAAA=\r
-TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAAAAAD2AAAACAAIAPYAAAAIAAgA/gAAAAAAAAAAAAAABoKBAMOv20GsURsat8gdH/RfnYI0MzIxNTMyMeCdd8AzFZLZ/N1ujmilmCcBAQAAAAAAAACAPtXesZ0BNDMyMTUzMjEAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAdGVzdHVzZXJjdXJsaG9zdA==\r
+TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAACAAIAHAAAAAIAAgAeAAAAAAAAAAAAAAAhoIBADQzMjE1MzIxAAAAAAAAAAAAAAAAAAAAADj3hs3u3j0kgJqCrLM+74BmaoNHDfIJjHRlc3R1c2VyY3VybGhvc3Q=\r
 RETR 873\r
 QUIT\r
 </protocol>
index c477594..114707a 100644 (file)
@@ -29,6 +29,7 @@ pop3
 </server>
 <features>
 NTLM
+SSL
 !SSPI
 </features>
  <name>
index 681d779..0d45aaa 100644 (file)
@@ -20,7 +20,7 @@ AUTH CRAM-MD5 PLAIN
 REPLY "AUTH CRAM-MD5" + Rubbish
 REPLY * -ERR AUTH exchange cancelled by client
 REPLY "AUTH PLAIN" +
-REPLY dXNlcgB1c2VyAHNlY3JldA== +OK Login successful
+REPLY AHVzZXIAc2VjcmV0 +OK Login successful
 </servercmd>
 <data>
 From: me@somewhere\r
@@ -58,7 +58,7 @@ CAPA
 AUTH CRAM-MD5\r
 *\r
 AUTH PLAIN\r
-dXNlcgB1c2VyAHNlY3JldA==\r
+AHVzZXIAc2VjcmV0\r
 RETR 879\r
 QUIT\r
 </protocol>
index f5eb697..e0609bb 100644 (file)
@@ -20,7 +20,7 @@ REPLY "AUTH NTLM" +
 REPLY TlRMTVNTUAABAAAABoIIAAAAAAAAAAAAAAAAAAAAAAA= + Rubbish
 REPLY * -ERR AUTH exchange cancelled by client
 REPLY "AUTH PLAIN" +
-REPLY dXNlcgB1c2VyAHNlY3JldA== +OK Login successful
+REPLY AHVzZXIAc2VjcmV0 +OK Login successful
 </servercmd>
 <data>
 From: me@somewhere\r
@@ -41,6 +41,7 @@ pop3
 </server>
 <features>
 NTLM
+SSL
 !SSPI
 </features>
  <name>
@@ -69,7 +70,7 @@ AUTH NTLM
 TlRMTVNTUAABAAAABoIIAAAAAAAAAAAAAAAAAAAAAAA=\r
 *\r
 AUTH PLAIN\r
-dXNlcgB1c2VyAHNlY3JldA==\r
+AHVzZXIAc2VjcmV0\r
 RETR 880\r
 QUIT\r
 </protocol>
index 80eca50..ccb906d 100644 (file)
@@ -20,7 +20,7 @@ AUTH DIGEST-MD5 PLAIN
 REPLY "AUTH DIGEST-MD5" + Rubbish
 REPLY * -ERR AUTH exchange cancelled by client
 REPLY "AUTH PLAIN" +
-REPLY dXNlcgB1c2VyAHNlY3JldA== +OK Login successful
+REPLY AHVzZXIAc2VjcmV0 +OK Login successful
 </servercmd>
 <data>
 From: me@somewhere\r
@@ -60,7 +60,7 @@ CAPA
 AUTH DIGEST-MD5\r
 *\r
 AUTH PLAIN\r
-dXNlcgB1c2VyAHNlY3JldA==\r
+AHVzZXIAc2VjcmV0\r
 RETR 881\r
 QUIT\r
 </protocol>
index fed4e3d..35419b5 100644 (file)
@@ -17,7 +17,7 @@ RFC7628
 <servercmd>
 AUTH OAUTHBEARER
 REPLY AUTH +
-REPLY dXNlcj11c2VyAWhvc3Q9MTI3LjAuMC4xAXBvcnQ9OTAwMQFhdXRoPUJlYXJlciBtRl85LkI1Zi00LjFKcU0BAQ== +OK Login successful
+REPLY bixhPXVzZXIsAWhvc3Q9MTI3LjAuMC4xAXBvcnQ9OTAwMQFhdXRoPUJlYXJlciBtRl85LkI1Zi00LjFKcU0BAQ== +OK Login successful
 </servercmd>
 <data>
 From: me@somewhere\r
@@ -55,7 +55,7 @@ perl -e "print 'Test requires default test server host and port' if ( '%HOSTIP'
 <protocol>
 CAPA\r
 AUTH OAUTHBEARER\r
-dXNlcj11c2VyAWhvc3Q9MTI3LjAuMC4xAXBvcnQ9OTAwMQFhdXRoPUJlYXJlciBtRl85LkI1Zi00LjFKcU0BAQ==\r
+bixhPXVzZXIsAWhvc3Q9MTI3LjAuMC4xAXBvcnQ9OTAwMQFhdXRoPUJlYXJlciBtRl85LkI1Zi00LjFKcU0BAQ==\r
 RETR 887\r
 QUIT\r
 </protocol>
index c52974f..78463fe 100644 (file)
@@ -54,7 +54,7 @@ perl -e "print 'Test requires default test server host and port' if ( '%HOSTIP'
 <verify>
 <protocol>
 CAPA\r
-AUTH OAUTHBEARER dXNlcj11c2VyAWhvc3Q9MTI3LjAuMC4xAXBvcnQ9OTAwMQFhdXRoPUJlYXJlciBtRl85LkI1Zi00LjFKcU0BAQ==\r
+AUTH OAUTHBEARER bixhPXVzZXIsAWhvc3Q9MTI3LjAuMC4xAXBvcnQ9OTAwMQFhdXRoPUJlYXJlciBtRl85LkI1Zi00LjFKcU0BAQ==\r
 RETR 888\r
 QUIT\r
 </protocol>
index da26a37..2edb371 100644 (file)
@@ -17,7 +17,7 @@ RFC7628
 <servercmd>
 AUTH OAUTHBEARER
 REPLY AUTH +
-REPLY dXNlcj11c2VyAWhvc3Q9MTI3LjAuMC4xAXBvcnQ9OTAwMQFhdXRoPUJlYXJlciBtRl85LkI1Zi00LjFKcU0BAQ== + eyJzdGF0dXMiOiJpbnZhbGlkX3Rva2VuIiwic2NvcGUiOiJleGFtcGxlX3Njb3BlIiwib3BlbmlkLWNvbmZpZ3VyYXRpb24iOiJodHRwczovL2V4YW1wbGUuY29tLy53ZWxsLWtub3duL29wZW5pZC1jb25maWd1cmF0aW9uIn0
+REPLY bixhPXVzZXIsAWhvc3Q9MTI3LjAuMC4xAXBvcnQ9OTAwMQFhdXRoPUJlYXJlciBtRl85LkI1Zi00LjFKcU0BAQ== + eyJzdGF0dXMiOiJpbnZhbGlkX3Rva2VuIiwic2NvcGUiOiJleGFtcGxlX3Njb3BlIiwib3BlbmlkLWNvbmZpZ3VyYXRpb24iOiJodHRwczovL2V4YW1wbGUuY29tLy53ZWxsLWtub3duL29wZW5pZC1jb25maWd1cmF0aW9uIn0
 REPLY AQ== -ERR Authentication failed
 </servercmd>
 </reply>
@@ -54,7 +54,7 @@ perl -e "print 'Test requires default test server host and port' if ( '%HOSTIP'
 <protocol>
 CAPA\r
 AUTH OAUTHBEARER\r
-dXNlcj11c2VyAWhvc3Q9MTI3LjAuMC4xAXBvcnQ9OTAwMQFhdXRoPUJlYXJlciBtRl85LkI1Zi00LjFKcU0BAQ==\r
+bixhPXVzZXIsAWhvc3Q9MTI3LjAuMC4xAXBvcnQ9OTAwMQFhdXRoPUJlYXJlciBtRl85LkI1Zi00LjFKcU0BAQ==\r
 AQ==\r
 </protocol>
 </verify>
index 1443a97..fc620cb 100644 (file)
@@ -20,7 +20,7 @@ HTTP/1.1 401 Now gimme that second request of crap
 Server: Microsoft-IIS/5.0\r
 Content-Type: text/html; charset=iso-8859-1\r
 Content-Length: 34\r
-WWW-Authenticate: NTLM TlRMTVNTUAACAAAAAgACADAAAAAGgoEAc51AYVDgyNcAAAAAAAAAAG4AbgAyAAAAQ0MCAAQAQwBDAAEAEgBFAEwASQBTAEEAQgBFAFQASAAEABgAYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAwAsAGUAbABpAHMAYQBiAGUAdABoAC4AYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAAAAAA==\r
+WWW-Authenticate: NTLM TlRMTVNTUAACAAAAAgACADAAAACGggEAc51AYVDgyNcAAAAAAAAAAG4AbgAyAAAAQ0MCAAQAQwBDAAEAEgBFAEwASQBTAEEAQgBFAFQASAAEABgAYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAwAsAGUAbABpAHMAYQBiAGUAdABoAC4AYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAAAAAA==\r
 \r
 This is not the real page either!
 </data1001>
@@ -41,7 +41,7 @@ HTTP/1.1 401 Now gimme that second round of crap
 Server: Microsoft-IIS/5.0\r
 Content-Type: text/html; charset=iso-8859-1\r
 Content-Length: 34\r
-WWW-Authenticate: NTLM TlRMTVNTUAACAAAAAgACADAAAAAGgoEAc51AYVDgyNcAAAAAAAAAAG4AbgAyAAAAQ0MCAAQAQwBDAAEAEgBFAEwASQBTAEEAQgBFAFQASAAEABgAYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAwAsAGUAbABpAHMAYQBiAGUAdABoAC4AYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAAAAAA==\r
+WWW-Authenticate: NTLM TlRMTVNTUAACAAAAAgACADAAAACGggEAc51AYVDgyNcAAAAAAAAAAG4AbgAyAAAAQ0MCAAQAQwBDAAEAEgBFAEwASQBTAEEAQgBFAFQASAAEABgAYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAwAsAGUAbABpAHMAYQBiAGUAdABoAC4AYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAAAAAA==\r
 \r
 This is not the real page either!
 </data1011>
@@ -62,7 +62,7 @@ HTTP/1.1 401 Now gimme that second request of crap
 Server: Microsoft-IIS/5.0\r
 Content-Type: text/html; charset=iso-8859-1\r
 Content-Length: 34\r
-WWW-Authenticate: NTLM TlRMTVNTUAACAAAAAgACADAAAAAGgoEAc51AYVDgyNcAAAAAAAAAAG4AbgAyAAAAQ0MCAAQAQwBDAAEAEgBFAEwASQBTAEEAQgBFAFQASAAEABgAYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAwAsAGUAbABpAHMAYQBiAGUAdABoAC4AYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAAAAAA==\r
+WWW-Authenticate: NTLM TlRMTVNTUAACAAAAAgACADAAAACGggEAc51AYVDgyNcAAAAAAAAAAG4AbgAyAAAAQ0MCAAQAQwBDAAEAEgBFAEwASQBTAEEAQgBFAFQASAAEABgAYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAwAsAGUAbABpAHMAYQBiAGUAdABoAC4AYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAAAAAA==\r
 \r
 HTTP/1.1 301 Things are fine in server land swsclose\r
 Server: Microsoft-IIS/5.0\r
@@ -73,7 +73,7 @@ HTTP/1.1 401 Now gimme that second round of crap
 Server: Microsoft-IIS/5.0\r
 Content-Type: text/html; charset=iso-8859-1\r
 Content-Length: 34\r
-WWW-Authenticate: NTLM TlRMTVNTUAACAAAAAgACADAAAAAGgoEAc51AYVDgyNcAAAAAAAAAAG4AbgAyAAAAQ0MCAAQAQwBDAAEAEgBFAEwASQBTAEEAQgBFAFQASAAEABgAYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAwAsAGUAbABpAHMAYQBiAGUAdABoAC4AYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAAAAAA==\r
+WWW-Authenticate: NTLM TlRMTVNTUAACAAAAAgACADAAAACGggEAc51AYVDgyNcAAAAAAAAAAG4AbgAyAAAAQ0MCAAQAQwBDAAEAEgBFAEwASQBTAEEAQgBFAFQASAAEABgAYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAwAsAGUAbABpAHMAYQBiAGUAdABoAC4AYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAAAAAA==\r
 \r
 HTTP/1.1 200 Things are fine in server land swsclose\r
 Server: Microsoft-IIS/5.0\r
@@ -89,6 +89,7 @@ Finally, this is the real page!
 <client>
 <features>
 NTLM
+SSL
 !SSPI
 debug
 </features>
@@ -126,7 +127,7 @@ Accept: */*
 \r
 GET /89 HTTP/1.1\r
 Host: %HOSTIP:%HTTPPORT\r
-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAAAAAD2AAAACAAIAPYAAAAIAAgA/gAAAAAAAAAAAAAABoKBAMOv20GsURsat8gdH/RfnYI0MzIxNTMyMeCdd8AzFZLZ/N1ujmilmCcBAQAAAAAAAACAPtXesZ0BNDMyMTUzMjEAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAdGVzdHVzZXJjdXJsaG9zdA==\r
+Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAACAAIAHAAAAAIAAgAeAAAAAAAAAAAAAAAhoIBADQzMjE1MzIxAAAAAAAAAAAAAAAAAAAAADj3hs3u3j0kgJqCrLM+74BmaoNHDfIJjHRlc3R1c2VyY3VybGhvc3Q=\r
 User-Agent: curl/7.10.6-pre1 (i686-pc-linux-gnu) libcurl/7.10.6-pre1 OpenSSL/0.9.7a ipv6 zlib/1.1.3\r
 Accept: */*\r
 \r
@@ -138,7 +139,7 @@ Accept: */*
 \r
 GET /you/890010 HTTP/1.1\r
 Host: %HOSTIP:%HTTPPORT\r
-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAAAAAD2AAAACAAIAPYAAAAIAAgA/gAAAAAAAAAAAAAABoKBAOv8cm3wOKJ5nhWWScOgdUI2MzIxNzMyMVgNcU0f3zxHeccvitN7zHkBAQAAAAAAAACAPtXesZ0BNjMyMTczMjEAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAdGVzdHVzZXJjdXJsaG9zdA==\r
+Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAACAAIAHAAAAAIAAgAeAAAAAAAAAAAAAAAhoIBADYzMjE3MzIxAAAAAAAAAAAAAAAAAAAAAEcJ4YHOeb5ga2TCPwDhkyUIuHjBUHcLaHRlc3R1c2VyY3VybGhvc3Q=\r
 User-Agent: curl/7.10.8-pre1 (i686-pc-linux-gnu) libcurl/7.10.8-pre1 OpenSSL/0.9.7a ipv6 zlib/1.1.3 GSS\r
 Accept: */*\r
 \r
index 30aa0b2..ca0ccc7 100644 (file)
@@ -53,7 +53,7 @@ perl -e "print 'Test requires default test server host and port' if ( '%HOSTIP'
 # transfer and such a connection will not get a "QUIT"
 <protocol>
 CAPA\r
-AUTH OAUTHBEARER dXNlcj11c2VyAWhvc3Q9MTI3LjAuMC4xAXBvcnQ9OTAwMQFhdXRoPUJlYXJlciBtRl85LkI1Zi00LjFKcU0BAQ==\r
+AUTH OAUTHBEARER bixhPXVzZXIsAWhvc3Q9MTI3LjAuMC4xAXBvcnQ9OTAwMQFhdXRoPUJlYXJlciBtRl85LkI1Zi00LjFKcU0BAQ==\r
 AQ==\r
 </protocol>
 </verify>
diff --git a/tests/data/test892 b/tests/data/test892
new file mode 100644 (file)
index 0000000..4b83182
--- /dev/null
@@ -0,0 +1,57 @@
+<testcase>
+<info>
+<keywords>
+POP3
+SASL
+SASL AUTH PLAIN
+RFC1734
+RFC4616
+RFC5034
+</keywords>
+</info>
+
+#
+# Server-side
+<reply>
+<servercmd>
+AUTH PLAIN
+REPLY AUTH +
+REPLY c2hhcmVkLW1haWxib3gAdXNlcgBzZWNyZXQ= +OK Login successful
+</servercmd>
+<data>
+From: me@somewhere\r
+To: fake@nowhere\r
+\r
+body\r
+\r
+--\r
+  yours sincerely\r
+</data>
+</reply>
+
+#
+# Client-side
+<client>
+<server>
+pop3
+</server>
+ <name>
+POP3 plain authentication with alternative authorization identity
+ </name>
+ <command>
+pop3://%HOSTIP:%POP3PORT/892 -u user:secret --sasl-authzid shared-mailbox
+</command>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<protocol>
+CAPA\r
+AUTH PLAIN\r
+c2hhcmVkLW1haWxib3gAdXNlcgBzZWNyZXQ=\r
+RETR 892\r
+QUIT\r
+</protocol>
+</verify>
+</testcase>
diff --git a/tests/data/test893 b/tests/data/test893
new file mode 100644 (file)
index 0000000..2a762fc
--- /dev/null
@@ -0,0 +1,53 @@
+<testcase>
+<info>
+<keywords>
+POP3
+SASL
+SASL AUTH PLAIN
+RFC1734
+RFC4616
+RFC5034
+</keywords>
+</info>
+
+#
+# Server-side
+<reply>
+<servercmd>
+AUTH PLAIN
+REPLY AUTH +
+REPLY dXJzZWwAa3VydAB4aXBqM3BsbXE= -ERR Not authorized
+</servercmd>
+</reply>
+
+#
+# Client-side
+<client>
+<server>
+pop3
+</server>
+ <name>
+POP3 plain authentication with alternative authorization identity (Not authorized)
+ </name>
+ <command>
+pop3://%HOSTIP:%POP3PORT/893 -u kurt:xipj3plmq --sasl-authzid ursel
+</command>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+# 67 - CURLE_LOGIN_DENIED
+<errorcode>
+67
+</errorcode>
+#
+# The multi interface considers a broken "CONNECT" as a prematurely broken
+# transfer and such a connection will not get a "QUIT"
+<protocol>
+CAPA\r
+AUTH PLAIN\r
+dXJzZWwAa3VydAB4aXBqM3BsbXE=\r
+</protocol>
+</verify>
+</testcase>
index f18e3df..d40b5a5 100644 (file)
@@ -30,7 +30,7 @@ HTTP/1.1 401 Now gimme that second request of crap
 Server: Microsoft-IIS/5.0\r
 Content-Type: text/html; charset=iso-8859-1\r
 Content-Length: 34\r
-WWW-Authenticate: NTLM TlRMTVNTUAACAAAAAgACADAAAAAGgoEAc51AYVDgyNcAAAAAAAAAAG4AbgAyAAAAQ0MCAAQAQwBDAAEAEgBFAEwASQBTAEEAQgBFAFQASAAEABgAYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAwAsAGUAbABpAHMAYQBiAGUAdABoAC4AYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAAAAAA==\r
+WWW-Authenticate: NTLM TlRMTVNTUAACAAAAAgACADAAAACGggEAc51AYVDgyNcAAAAAAAAAAG4AbgAyAAAAQ0MCAAQAQwBDAAEAEgBFAEwASQBTAEEAQgBFAFQASAAEABgAYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAwAsAGUAbABpAHMAYQBiAGUAdABoAC4AYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAAAAAA==\r
 \r
 This is not the real page either!
 </data1001>
@@ -63,7 +63,7 @@ HTTP/1.1 401 Now gimme that second round of crap
 Server: Microsoft-IIS/5.0\r
 Content-Type: text/html; charset=iso-8859-1\r
 Content-Length: 34\r
-WWW-Authenticate: NTLM TlRMTVNTUAACAAAAAgACADAAAAAGgoEAc51AYVDgyNcAAAAAAAAAAG4AbgAyAAAAQ0MCAAQAQwBDAAEAEgBFAEwASQBTAEEAQgBFAFQASAAEABgAYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAwAsAGUAbABpAHMAYQBiAGUAdABoAC4AYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAAAAAA==\r
+WWW-Authenticate: NTLM TlRMTVNTUAACAAAAAgACADAAAACGggEAc51AYVDgyNcAAAAAAAAAAG4AbgAyAAAAQ0MCAAQAQwBDAAEAEgBFAEwASQBTAEEAQgBFAFQASAAEABgAYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAwAsAGUAbABpAHMAYQBiAGUAdABoAC4AYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAAAAAA==\r
 \r
 This is not the real page either!
 </data1011>
@@ -92,7 +92,7 @@ HTTP/1.1 401 Now gimme that second request of crap
 Server: Microsoft-IIS/5.0\r
 Content-Type: text/html; charset=iso-8859-1\r
 Content-Length: 34\r
-WWW-Authenticate: NTLM TlRMTVNTUAACAAAAAgACADAAAAAGgoEAc51AYVDgyNcAAAAAAAAAAG4AbgAyAAAAQ0MCAAQAQwBDAAEAEgBFAEwASQBTAEEAQgBFAFQASAAEABgAYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAwAsAGUAbABpAHMAYQBiAGUAdABoAC4AYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAAAAAA==\r
+WWW-Authenticate: NTLM TlRMTVNTUAACAAAAAgACADAAAACGggEAc51AYVDgyNcAAAAAAAAAAG4AbgAyAAAAQ0MCAAQAQwBDAAEAEgBFAEwASQBTAEEAQgBFAFQASAAEABgAYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAwAsAGUAbABpAHMAYQBiAGUAdABoAC4AYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAAAAAA==\r
 \r
 HTTP/1.1 301 Things are fine in server land swsclose\r
 Server: Microsoft-IIS/5.0\r
@@ -111,7 +111,7 @@ HTTP/1.1 401 Now gimme that second round of crap
 Server: Microsoft-IIS/5.0\r
 Content-Type: text/html; charset=iso-8859-1\r
 Content-Length: 34\r
-WWW-Authenticate: NTLM TlRMTVNTUAACAAAAAgACADAAAAAGgoEAc51AYVDgyNcAAAAAAAAAAG4AbgAyAAAAQ0MCAAQAQwBDAAEAEgBFAEwASQBTAEEAQgBFAFQASAAEABgAYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAwAsAGUAbABpAHMAYQBiAGUAdABoAC4AYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAAAAAA==\r
+WWW-Authenticate: NTLM TlRMTVNTUAACAAAAAgACADAAAACGggEAc51AYVDgyNcAAAAAAAAAAG4AbgAyAAAAQ0MCAAQAQwBDAAEAEgBFAEwASQBTAEEAQgBFAFQASAAEABgAYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAwAsAGUAbABpAHMAYQBiAGUAdABoAC4AYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAAAAAA==\r
 \r
 HTTP/1.1 200 Things are fine in server land swsclose\r
 Server: Microsoft-IIS/5.0\r
@@ -127,6 +127,7 @@ Finally, this is the real page!
 <client>
 <features>
 NTLM
+SSL
 !SSPI
 debug
 </features>
@@ -168,7 +169,7 @@ Accept: */*
 \r
 GET /90 HTTP/1.1\r
 Host: %HOSTIP:%HTTPPORT\r
-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAAAAAD2AAAACAAIAPYAAAAIAAgA/gAAAAAAAAAAAAAABoKBAMOv20GsURsat8gdH/RfnYI0MzIxNTMyMeCdd8AzFZLZ/N1ujmilmCcBAQAAAAAAAACAPtXesZ0BNDMyMTUzMjEAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAdGVzdHVzZXJjdXJsaG9zdA==\r
+Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAACAAIAHAAAAAIAAgAeAAAAAAAAAAAAAAAhoIBADQzMjE1MzIxAAAAAAAAAAAAAAAAAAAAADj3hs3u3j0kgJqCrLM+74BmaoNHDfIJjHRlc3R1c2VyY3VybGhvc3Q=\r
 User-Agent: curl/7.10.6-pre1 (i686-pc-linux-gnu) libcurl/7.10.6-pre1 OpenSSL/0.9.7a ipv6 zlib/1.1.3\r
 Accept: */*\r
 \r
@@ -184,7 +185,7 @@ Accept: */*
 \r
 GET /you/900010 HTTP/1.1\r
 Host: %HOSTIP:%HTTPPORT\r
-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAAAAAD2AAAACAAIAPYAAAAIAAgA/gAAAAAAAAAAAAAABoKBAOv8cm3wOKJ5nhWWScOgdUI2MzIxNzMyMVgNcU0f3zxHeccvitN7zHkBAQAAAAAAAACAPtXesZ0BNjMyMTczMjEAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAdGVzdHVzZXJjdXJsaG9zdA==\r
+Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAACAAIAHAAAAAIAAgAeAAAAAAAAAAAAAAAhoIBADYzMjE3MzIxAAAAAAAAAAAAAAAAAAAAAEcJ4YHOeb5ga2TCPwDhkyUIuHjBUHcLaHRlc3R1c2VyY3VybGhvc3Q=\r
 User-Agent: curl/7.10.8-pre1 (i686-pc-linux-gnu) libcurl/7.10.8-pre1 OpenSSL/0.9.7a ipv6 zlib/1.1.3 GSS\r
 Accept: */*\r
 \r
index 2baf5e6..8a766e5 100644 (file)
@@ -15,7 +15,7 @@ RFC4954
 <servercmd>
 AUTH PLAIN
 REPLY AUTH 334 PLAIN supported
-REPLY dXNlcgB1c2VyAHNlY3JldA== 235 Authenticated
+REPLY AHVzZXIAc2VjcmV0 235 Authenticated
 </servercmd>
 </reply>
 
@@ -42,7 +42,7 @@ smtp://%HOSTIP:%SMTPPORT/903 --mail-rcpt recipient@example.com --mail-from sende
 <protocol>
 EHLO 903\r
 AUTH PLAIN\r
-dXNlcgB1c2VyAHNlY3JldA==\r
+AHVzZXIAc2VjcmV0\r
 MAIL FROM:<sender@example.com>\r
 RCPT TO:<recipient@example.com>\r
 DATA\r
index 6774561..6ec59c7 100644 (file)
@@ -14,8 +14,8 @@ RFC4954
 <servercmd>
 AUTH NTLM
 REPLY AUTH 334 NTLM supported
-REPLY TlRMTVNTUAABAAAABoIIAAAAAAAAAAAAAAAAAAAAAAA= 334 TlRMTVNTUAACAAAAAgACADAAAAAGgoEAc51AYVDgyNcAAAAAAAAAAG4AbgAyAAAAQ0MCAAQAQwBDAAEAEgBFAEwASQBTAEEAQgBFAFQASAAEABgAYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAwAsAGUAbABpAHMAYQBiAGUAdABoAC4AYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAAAAAA==\r
-REPLY TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAAAAAD2AAAACAAIAPYAAAAIAAgA/gAAAAAAAAAAAAAABoKBAMOv20GsURsat8gdH/RfnYI0MzIxNTMyMeCdd8AzFZLZ/N1ujmilmCcBAQAAAAAAAACAPtXesZ0BNDMyMTUzMjEAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAdGVzdHVzZXJjdXJsaG9zdA== 235 Authenticated
+REPLY TlRMTVNTUAABAAAABoIIAAAAAAAAAAAAAAAAAAAAAAA= 334 TlRMTVNTUAACAAAAAgACADAAAACGggEAc51AYVDgyNcAAAAAAAAAAG4AbgAyAAAAQ0MCAAQAQwBDAAEAEgBFAEwASQBTAEEAQgBFAFQASAAEABgAYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAwAsAGUAbABpAHMAYQBiAGUAdABoAC4AYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAAAAAA==\r
+REPLY TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAACAAIAHAAAAAIAAgAeAAAAAAAAAAAAAAAhoIBADQzMjE1MzIxAAAAAAAAAAAAAAAAAAAAADj3hs3u3j0kgJqCrLM+74BmaoNHDfIJjHRlc3R1c2VyY3VybGhvc3Q= 235 Authenticated
 </servercmd>
 </reply>
 
@@ -27,6 +27,7 @@ smtp
 </server>
 <features>
 NTLM
+SSL
 !SSPI
 debug
 </features>
@@ -57,7 +58,7 @@ chkhostname curlhost
 EHLO 906\r
 AUTH NTLM\r
 TlRMTVNTUAABAAAABoIIAAAAAAAAAAAAAAAAAAAAAAA=\r
-TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAAAAAD2AAAACAAIAPYAAAAIAAgA/gAAAAAAAAAAAAAABoKBAMOv20GsURsat8gdH/RfnYI0MzIxNTMyMeCdd8AzFZLZ/N1ujmilmCcBAQAAAAAAAACAPtXesZ0BNDMyMTUzMjEAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAdGVzdHVzZXJjdXJsaG9zdA==\r
+TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAACAAIAHAAAAAIAAgAeAAAAAAAAAAAAAAAhoIBADQzMjE1MzIxAAAAAAAAAAAAAAAAAAAAADj3hs3u3j0kgJqCrLM+74BmaoNHDfIJjHRlc3R1c2VyY3VybGhvc3Q=\r
 MAIL FROM:<sender@example.com>\r
 RCPT TO:<recipient@example.com>\r
 DATA\r
index cd28142..4942bfd 100644 (file)
@@ -27,7 +27,7 @@ HTTP/1.1 401 Now gimme that second request of crap
 Server: Microsoft-IIS/5.0\r
 Content-Length: 34\r
 Content-Type: text/html; charset=iso-8859-1\r
-WWW-Authenticate: NTLM TlRMTVNTUAACAAAAAgACADAAAAAGgoEAc51AYVDgyNcAAAAAAAAAAG4AbgAyAAAAQ0MCAAQAQwBDAAEAEgBFAEwASQBTAEEAQgBFAFQASAAEABgAYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAwAsAGUAbABpAHMAYQBiAGUAdABoAC4AYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAAAAAA==\r
+WWW-Authenticate: NTLM TlRMTVNTUAACAAAAAgACADAAAACGggEAc51AYVDgyNcAAAAAAAAAAG4AbgAyAAAAQ0MCAAQAQwBDAAEAEgBFAEwASQBTAEEAQgBFAFQASAAEABgAYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAwAsAGUAbABpAHMAYQBiAGUAdABoAC4AYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAAAAAA==\r
 \r
 This is not the real page either!
 </data1001>
@@ -57,7 +57,7 @@ HTTP/1.1 401 Now gimme that second request of crap
 Server: Microsoft-IIS/5.0\r
 Content-Length: 34\r
 Content-Type: text/html; charset=iso-8859-1\r
-WWW-Authenticate: NTLM TlRMTVNTUAACAAAAAgACADAAAAAGgoEAc51AYVDgyNcAAAAAAAAAAG4AbgAyAAAAQ0MCAAQAQwBDAAEAEgBFAEwASQBTAEEAQgBFAFQASAAEABgAYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAwAsAGUAbABpAHMAYQBiAGUAdABoAC4AYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAAAAAA==\r
+WWW-Authenticate: NTLM TlRMTVNTUAACAAAAAgACADAAAACGggEAc51AYVDgyNcAAAAAAAAAAG4AbgAyAAAAQ0MCAAQAQwBDAAEAEgBFAEwASQBTAEEAQgBFAFQASAAEABgAYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAwAsAGUAbABpAHMAYQBiAGUAdABoAC4AYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAAAAAA==\r
 \r
 HTTP/1.1 200 Things are fine in server land swsclose\r
 Server: Microsoft-IIS/5.0\r
@@ -73,6 +73,7 @@ Finally, this is the real page!
 <client>
 <features>
 NTLM
+SSL
 !SSPI
 debug
 </features>
@@ -115,7 +116,7 @@ Accept: */*
 \r
 GET /91 HTTP/1.1\r
 Host: %HOSTIP:%HTTPPORT\r
-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAgACAD2AAAABgAGAP4AAAAIAAgABAEAAAAAAAAAAAAABoKBALJ3z6fQtyQwuFxoPXldKtQ0MzIxNTMyMWnrkzKLCbw9LP1SuH/yJwABAQAAAAAAAACAPtXesZ0BNDMyMTUzMjEAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAbXlkb21haW5teXNlbGZjdXJsaG9zdA==\r
+Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAgACABwAAAABgAGAHgAAAAIAAgAfgAAAAAAAAAAAAAAhoIBADQzMjE1MzIxAAAAAAAAAAAAAAAAAAAAAKBS3rdGYZEGsqW8otYHWXWBxC5mCuFmYm15ZG9tYWlubXlzZWxmY3VybGhvc3Q=\r
 User-Agent: curl/7.10.6-pre1 (i686-pc-linux-gnu) libcurl/7.10.6-pre1 OpenSSL/0.9.7a ipv6 zlib/1.1.3\r
 Accept: */*\r
 \r
index 3e74494..39794e3 100644 (file)
@@ -41,7 +41,7 @@ smtp://%HOSTIP:%SMTPPORT/919 --mail-rcpt recipient@example.com --mail-from sende
 <verify>
 <protocol>
 EHLO 919\r
-AUTH PLAIN dXNlcgB1c2VyAHNlY3JldA==\r
+AUTH PLAIN AHVzZXIAc2VjcmV0\r
 MAIL FROM:<sender@example.com>\r
 RCPT TO:<recipient@example.com>\r
 DATA\r
index e11fe4f..f9e5673 100644 (file)
@@ -14,8 +14,8 @@ RFC4954
 <reply>
 <servercmd>
 AUTH NTLM
-REPLY AUTH 334 TlRMTVNTUAACAAAAAgACADAAAAAGgoEAc51AYVDgyNcAAAAAAAAAAG4AbgAyAAAAQ0MCAAQAQwBDAAEAEgBFAEwASQBTAEEAQgBFAFQASAAEABgAYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAwAsAGUAbABpAHMAYQBiAGUAdABoAC4AYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAAAAAA==\r
-REPLY TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAAAAAD2AAAACAAIAPYAAAAIAAgA/gAAAAAAAAAAAAAABoKBAMOv20GsURsat8gdH/RfnYI0MzIxNTMyMeCdd8AzFZLZ/N1ujmilmCcBAQAAAAAAAACAPtXesZ0BNDMyMTUzMjEAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAdGVzdHVzZXJjdXJsaG9zdA== 235 Authenticated
+REPLY AUTH 334 TlRMTVNTUAACAAAAAgACADAAAACGggEAc51AYVDgyNcAAAAAAAAAAG4AbgAyAAAAQ0MCAAQAQwBDAAEAEgBFAEwASQBTAEEAQgBFAFQASAAEABgAYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAwAsAGUAbABpAHMAYQBiAGUAdABoAC4AYwBjAC4AaQBjAGUAZABlAHYALgBuAHUAAAAAAA==\r
+REPLY TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAACAAIAHAAAAAIAAgAeAAAAAAAAAAAAAAAhoIBADQzMjE1MzIxAAAAAAAAAAAAAAAAAAAAADj3hs3u3j0kgJqCrLM+74BmaoNHDfIJjHRlc3R1c2VyY3VybGhvc3Q= 235 Authenticated
 </servercmd>
 </reply>
 
@@ -27,6 +27,7 @@ smtp
 </server>
 <features>
 NTLM
+SSL
 !SSPI
 debug
 </features>
@@ -56,7 +57,7 @@ chkhostname curlhost
 <protocol>\r
 EHLO 921\r
 AUTH NTLM TlRMTVNTUAABAAAABoIIAAAAAAAAAAAAAAAAAAAAAAA=\r
-TlRMTVNTUAADAAAAGAAYAEAAAACeAJ4AWAAAAAAAAAD2AAAACAAIAPYAAAAIAAgA/gAAAAAAAAAAAAAABoKBAMOv20GsURsat8gdH/RfnYI0MzIxNTMyMeCdd8AzFZLZ/N1ujmilmCcBAQAAAAAAAACAPtXesZ0BNDMyMTUzMjEAAAAAAgAEAEMAQwABABIARQBMAEkAUwBBAEIARQBUAEgABAAYAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAMALABlAGwAaQBzAGEAYgBlAHQAaAAuAGMAYwAuAGkAYwBlAGQAZQB2AC4AbgB1AAAAAAAAAAAAdGVzdHVzZXJjdXJsaG9zdA==\r
+TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAACAAIAHAAAAAIAAgAeAAAAAAAAAAAAAAAhoIBADQzMjE1MzIxAAAAAAAAAAAAAAAAAAAAADj3hs3u3j0kgJqCrLM+74BmaoNHDfIJjHRlc3R1c2VyY3VybGhvc3Q=\r
 MAIL FROM:<sender@example.com>\r
 RCPT TO:<recipient@example.com>\r
 DATA\r
index 1387248..58e47bc 100644 (file)
@@ -31,6 +31,9 @@ HTTP GET with failed proxy auth
  <command>
 http://%HOSTIP:%HTTPPORT/93 -x %HOSTIP:%HTTPPORT
 </command>
+<features>
+proxy
+</features>
 </client>
 
 #
index 08b4e9d..e091de3 100644 (file)
@@ -28,6 +28,7 @@ smtp
 </server>
 <features>
 NTLM
+SSL
 !SSPI
 </features>
  <name>
index 3fd5c2e..9466114 100644 (file)
@@ -19,7 +19,7 @@ AUTH CRAM-MD5 PLAIN
 REPLY "AUTH CRAM-MD5" 334 Rubbish
 REPLY * 501 AUTH exchange cancelled by client
 REPLY "AUTH PLAIN" 334 PLAIN supported
-REPLY dXNlcgB1c2VyAHNlY3JldA== 235 Authenticated
+REPLY AHVzZXIAc2VjcmV0 235 Authenticated
 </servercmd>
 </reply>
 
@@ -51,7 +51,7 @@ EHLO 935
 AUTH CRAM-MD5\r
 *\r
 AUTH PLAIN\r
-dXNlcgB1c2VyAHNlY3JldA==\r
+AHVzZXIAc2VjcmV0\r
 MAIL FROM:<sender@example.com>\r
 RCPT TO:<recipient@example.com>\r
 DATA\r
index 88c8a93..b123499 100644 (file)
@@ -19,7 +19,7 @@ REPLY "AUTH NTLM" 334 NTLM supported
 REPLY TlRMTVNTUAABAAAABoIIAAAAAAAAAAAAAAAAAAAAAAA= 334 Rubbish
 REPLY * 501 AUTH exchange cancelled by client
 REPLY "AUTH PLAIN" 334 PLAIN supported
-REPLY dXNlcgB1c2VyAHNlY3JldA== 235 Authenticated
+REPLY AHVzZXIAc2VjcmV0 235 Authenticated
 </servercmd>
 </reply>
 
@@ -31,6 +31,7 @@ smtp
 </server>
 <features>
 NTLM
+SSL
 !SSPI
 </features>
  <name>
@@ -62,7 +63,7 @@ AUTH NTLM
 TlRMTVNTUAABAAAABoIIAAAAAAAAAAAAAAAAAAAAAAA=\r
 *\r
 AUTH PLAIN\r
-dXNlcgB1c2VyAHNlY3JldA==\r
+AHVzZXIAc2VjcmV0\r
 MAIL FROM:<sender@example.com>\r
 RCPT TO:<recipient@example.com>\r
 DATA\r
index a2cb9b5..5e729e3 100644 (file)
@@ -19,7 +19,7 @@ AUTH DIGEST-MD5 PLAIN
 REPLY "AUTH DIGEST-MD5" 334 Rubbish
 REPLY * 501 AUTH exchange cancelled by client
 REPLY "AUTH PLAIN" 334 PLAIN supported
-REPLY dXNlcgB1c2VyAHNlY3JldA== 235 Authenticated
+REPLY AHVzZXIAc2VjcmV0 235 Authenticated
 </servercmd>
 </reply>
 
@@ -53,7 +53,7 @@ EHLO 937
 AUTH DIGEST-MD5\r
 *\r
 AUTH PLAIN\r
-dXNlcgB1c2VyAHNlY3JldA==\r
+AHVzZXIAc2VjcmV0\r
 MAIL FROM:<sender@example.com>\r
 RCPT TO:<recipient@example.com>\r
 DATA\r
index 2f3f482..4ca53c6 100644 (file)
@@ -29,6 +29,7 @@ http
 </server>
 <features>
 SSL
+proxy
 </features>
  <name>
 HTTPS GET with failed proxy auth (CONNECT 1.0)
index da4b924..c6753dc 100644 (file)
@@ -16,7 +16,7 @@ RFC7628
 <servercmd>
 AUTH OAUTHBEARER
 REPLY AUTH 334 OAUTHBEARER supported
-REPLY dXNlcj11c2VyAWhvc3Q9MTI3LjAuMC4xAXBvcnQ9OTAwNQFhdXRoPUJlYXJlciBtRl85LkI1Zi00LjFKcU0BAQ== 235 Authenticated
+REPLY bixhPXVzZXIsAWhvc3Q9MTI3LjAuMC4xAXBvcnQ9OTAwNQFhdXRoPUJlYXJlciBtRl85LkI1Zi00LjFKcU0BAQ== 235 Authenticated
 </servercmd>
 </reply>
 
@@ -48,7 +48,7 @@ perl -e "print 'Test requires default test server host and port' if ( '%HOSTIP'
 <protocol>
 EHLO 946\r
 AUTH OAUTHBEARER\r
-dXNlcj11c2VyAWhvc3Q9MTI3LjAuMC4xAXBvcnQ9OTAwNQFhdXRoPUJlYXJlciBtRl85LkI1Zi00LjFKcU0BAQ==\r
+bixhPXVzZXIsAWhvc3Q9MTI3LjAuMC4xAXBvcnQ9OTAwNQFhdXRoPUJlYXJlciBtRl85LkI1Zi00LjFKcU0BAQ==\r
 MAIL FROM:<sender@example.com>\r
 RCPT TO:<recipient@example.com>\r
 DATA\r
index d33a559..03c3fbe 100644 (file)
@@ -47,7 +47,7 @@ perl -e "print 'Test requires default test server host and port' if ( '%HOSTIP'
 <verify>
 <protocol>
 EHLO 947\r
-AUTH OAUTHBEARER dXNlcj11c2VyAWhvc3Q9MTI3LjAuMC4xAXBvcnQ9OTAwNQFhdXRoPUJlYXJlciBtRl85LkI1Zi00LjFKcU0BAQ==\r
+AUTH OAUTHBEARER bixhPXVzZXIsAWhvc3Q9MTI3LjAuMC4xAXBvcnQ9OTAwNQFhdXRoPUJlYXJlciBtRl85LkI1Zi00LjFKcU0BAQ==\r
 MAIL FROM:<sender@example.com>\r
 RCPT TO:<recipient@example.com>\r
 DATA\r
index 9c1e31d..8385f0c 100644 (file)
@@ -16,7 +16,7 @@ RFC7628
 <servercmd>
 AUTH OAUTHBEARER
 REPLY AUTH 334 OAUTHBEARER supported
-REPLY dXNlcj11c2VyAWhvc3Q9MTI3LjAuMC4xAXBvcnQ9OTAwNQFhdXRoPUJlYXJlciBtRl85LkI1Zi00LjFKcU0BAQ== 334 eyJzdGF0dXMiOiJpbnZhbGlkX3Rva2VuIiwic2NvcGUiOiJleGFtcGxlX3Njb3BlIiwib3BlbmlkLWNvbmZpZ3VyYXRpb24iOiJodHRwczovL2V4YW1wbGUuY29tLy53ZWxsLWtub3duL29wZW5pZC1jb25maWd1cmF0aW9uIn0
+REPLY bixhPXVzZXIsAWhvc3Q9MTI3LjAuMC4xAXBvcnQ9OTAwNQFhdXRoPUJlYXJlciBtRl85LkI1Zi00LjFKcU0BAQ== 334 eyJzdGF0dXMiOiJpbnZhbGlkX3Rva2VuIiwic2NvcGUiOiJleGFtcGxlX3Njb3BlIiwib3BlbmlkLWNvbmZpZ3VyYXRpb24iOiJodHRwczovL2V4YW1wbGUuY29tLy53ZWxsLWtub3duL29wZW5pZC1jb25maWd1cmF0aW9uIn0
 REPLY AQ== 535 Username and Password not accepted. Learn more at\r\n535 http://support.example.com/mail/oauth
 </servercmd>
 </reply>
@@ -56,7 +56,7 @@ perl -e "print 'Test requires default test server host and port' if ( '%HOSTIP'
 <protocol>
 EHLO 948\r
 AUTH OAUTHBEARER\r
-dXNlcj11c2VyAWhvc3Q9MTI3LjAuMC4xAXBvcnQ9OTAwNQFhdXRoPUJlYXJlciBtRl85LkI1Zi00LjFKcU0BAQ==\r
+bixhPXVzZXIsAWhvc3Q9MTI3LjAuMC4xAXBvcnQ9OTAwNQFhdXRoPUJlYXJlciBtRl85LkI1Zi00LjFKcU0BAQ==\r
 AQ==\r
 </protocol>
 </verify>
index 9145d61..3459400 100644 (file)
@@ -55,7 +55,7 @@ perl -e "print 'Test requires default test server host and port' if ( '%HOSTIP'
 # transfer and such a connection will not get a "QUIT"
 <protocol>
 EHLO 949\r
-AUTH OAUTHBEARER dXNlcj11c2VyAWhvc3Q9MTI3LjAuMC4xAXBvcnQ9OTAwNQFhdXRoPUJlYXJlciBtRl85LkI1Zi00LjFKcU0BAQ==\r
+AUTH OAUTHBEARER bixhPXVzZXIsAWhvc3Q9MTI3LjAuMC4xAXBvcnQ9OTAwNQFhdXRoPUJlYXJlciBtRl85LkI1Zi00LjFKcU0BAQ==\r
 AQ==\r
 </protocol>
 </verify>
index 1cd88ac..afc00ae 100644 (file)
@@ -52,6 +52,9 @@ HTTP over proxytunnel using POST
  <command>
 http://test.95:%HTTPPORT/we/want/that/page/95 -p -x %HOSTIP:%PROXYPORT -d "datatopost=ohthatsfunyesyes"
 </command>
+<features>
+proxy
+</features>
 </client>
 
 #
diff --git a/tests/data/test953 b/tests/data/test953
new file mode 100644 (file)
index 0000000..4a70e1f
--- /dev/null
@@ -0,0 +1,56 @@
+<testcase>
+<info>
+<keywords>
+SMTP
+SASL
+SASL AUTH PLAIN
+RFC4616
+RFC4954
+</keywords>
+</info>
+
+#
+# Server-side
+<reply>
+<servercmd>
+AUTH PLAIN
+REPLY AUTH 334 PLAIN supported
+REPLY dXJzZWwAa3VydAB4aXBqM3BsbXE= 235 Authenticated
+</servercmd>
+</reply>
+
+#
+# Client-side
+<client>
+<server>
+smtp
+</server>
+ <name>
+SMTP plain authentication with alternative authorization identity
+ </name>
+<stdin>
+mail body\r
+</stdin>
+ <command>
+smtp://%HOSTIP:%SMTPPORT/953 --mail-rcpt recipient@example.com --mail-from sender@example.com -u kurt:xipj3plmq --sasl-authzid ursel -T -
+</command>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<protocol>
+EHLO 953\r
+AUTH PLAIN\r
+dXJzZWwAa3VydAB4aXBqM3BsbXE=\r
+MAIL FROM:<sender@example.com>\r
+RCPT TO:<recipient@example.com>\r
+DATA\r
+QUIT\r
+</protocol>
+<upload>
+mail body\r
+.\r
+</upload>
+</verify>
+</testcase>
diff --git a/tests/data/test954 b/tests/data/test954
new file mode 100644 (file)
index 0000000..a5e6bb0
--- /dev/null
@@ -0,0 +1,55 @@
+<testcase>
+<info>
+<keywords>
+SMTP
+SASL
+SASL AUTH PLAIN
+RFC4616
+RFC4954
+</keywords>
+</info>
+
+#
+# Server-side
+<reply>
+<servercmd>
+AUTH PLAIN
+REPLY AUTH 334 PLAIN supported
+REPLY dXJzZWwAa3VydAB4aXBqM3BsbXE= 501 Not authorized
+</servercmd>
+</reply>
+
+#
+# Client-side
+<client>
+<server>
+smtp
+</server>
+ <name>
+SMTP plain authentication with alternative authorization identity (Not authorized)
+ </name>
+<stdin>
+mail body
+</stdin>
+ <command>
+smtp://%HOSTIP:%SMTPPORT/954 --mail-rcpt recipient@example.com --mail-from sender@example.com -u kurt:xipj3plmq --sasl-authzid ursel -T -
+</command>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+# 67 - CURLE_LOGIN_DENIED
+<errorcode>
+67
+</errorcode>
+#
+# The multi interface considers a broken "CONNECT" as a prematurely broken
+# transfer and such a connection will not get a "QUIT"
+<protocol>
+EHLO 954\r
+AUTH PLAIN\r
+dXJzZWwAa3VydAB4aXBqM3BsbXE=\r
+</protocol>
+</verify>
+</testcase>
index a41a8a0..2d1b5a3 100755 (executable)
@@ -33,7 +33,7 @@ def dictserver(options):
         with open(options.pidfile, "w") as f:
             f.write("{0}".format(pid))
 
-    local_bind = (HOST, options.port)
+    local_bind = (options.host, options.port)
     log.info("[DICT] Listening on %s", local_bind)
 
     # Need to set the allow_reuse on the class, not on the instance.
@@ -83,6 +83,8 @@ def get_options():
 
     parser.add_argument("--port", action="store", default=9016,
                         type=int, help="port to listen on")
+    parser.add_argument("--host", action="store", default=HOST,
+                        help="host to listen on")
     parser.add_argument("--verbose", action="store", type=int, default=0,
                         help="verbose output")
     parser.add_argument("--pidfile", action="store",
diff --git a/tests/disable-scan.pl b/tests/disable-scan.pl
new file mode 100755 (executable)
index 0000000..45373ca
--- /dev/null
@@ -0,0 +1,134 @@
+#!/usr/bin/env perl
+#***************************************************************************
+#                                  _   _ ____  _
+#  Project                     ___| | | |  _ \| |
+#                             / __| | | | |_) | |
+#                            | (__| |_| |  _ <| |___
+#                             \___|\___/|_| \_\_____|
+#
+# Copyright (C) 2010-2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
+# are also available at https://curl.haxx.se/docs/copyright.html.
+#
+# You may opt to use, copy, modify, merge, publish, distribute and/or sell
+# copies of the Software, and permit persons to whom the Software is
+# furnished to do so, under the terms of the COPYING file.
+#
+# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+# KIND, either express or implied.
+#
+###########################################################################
+#
+
+use strict;
+use warnings;
+
+# the DISABLE options that can be set by configure
+my %disable;
+# the DISABLE options that are used in C files
+my %file;
+# the DISABLE options that are documented
+my %docs;
+
+# we may get the dir root pointed out
+my $root=$ARGV[0] || ".";
+my $DOCS="CURL-DISABLE.md";
+
+sub scan_configure {
+    open S, "<$root/configure.ac";
+    while(<S>) {
+        if(/(CURL_DISABLE_[A-Z_]+)/g) {
+            my ($sym)=($1);
+            $disable{$sym} = 1;
+        }
+    }
+    close S;
+}
+
+sub scan_file {
+    my ($source)=@_;
+    open F, "<$source";
+    while(<F>) {
+        if(/(CURL_DISABLE_[A-Z_]+)/g) {
+            my ($sym)=($1);
+            $file{$sym} = $source;
+        }
+    }
+    close F;
+}
+
+sub scan_dir {
+    my ($dir)=@_;
+    opendir(my $dh, $dir) || die "Can't opendir $dir: $!";
+    my @cfiles = grep { /\.c\z/ && -f "$dir/$_" } readdir($dh);
+    closedir $dh;
+    for my $f (sort @cfiles) {
+        scan_file("$dir/$f");
+    }
+}
+
+sub scan_sources {
+    scan_dir("$root/src");
+    scan_dir("$root/lib");
+    scan_dir("$root/lib/vtls");
+    scan_dir("$root/lib/vauth");
+}
+
+sub scan_docs {
+    open F, "<$root/docs/$DOCS";
+    my $line = 0;
+    while(<F>) {
+        $line++;
+        if(/^## (CURL_DISABLE_[A-Z_]+)/g) {
+            my ($sym)=($1);
+            $docs{$sym} = $line;
+        }
+    }
+    close F;
+}
+
+scan_configure();
+scan_sources();
+scan_docs();
+
+
+my $error = 0;
+# Check the configure symbols for use in code
+for my $s (sort keys %disable) {
+    if(!$file{$s}) {
+        printf "Present in configure.ac, not used by code: %s\n", $s;
+        $error++;
+    }
+    if(!$docs{$s}) {
+        printf "Present in configure.ac, not documented in $DOCS: %s\n", $s;
+        $error++;
+    }
+}
+
+# Check the code symbols for use in configure
+for my $s (sort keys %file) {
+    if(!$disable{$s}) {
+        printf "Not set by configure: %s (%s)\n", $s, $file{$s};
+        $error++;
+    }
+    if(!$docs{$s}) {
+        printf "Used in code, not documented in $DOCS: %s\n", $s;
+        $error++;
+    }
+}
+
+# Check the documented symbols
+for my $s (sort keys %docs) {
+    if(!$disable{$s}) {
+        printf "Documented but not in configure: %s\n", $s;
+        $error++;
+    }
+    if(!$file{$s}) {
+        printf "Documented, but not used by code: %s\n", $s;
+        $error++;
+    }
+}
+
+exit $error;
diff --git a/tests/error-codes.pl b/tests/error-codes.pl
new file mode 100644 (file)
index 0000000..0d555f6
--- /dev/null
@@ -0,0 +1,80 @@
+#!/usr/bin/env perl
+#***************************************************************************
+#                                  _   _ ____  _
+#  Project                     ___| | | |  _ \| |
+#                             / __| | | | |_) | |
+#                            | (__| |_| |  _ <| |___
+#                             \___|\___/|_| \_\_____|
+#
+# Copyright (C) 2010-2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
+# are also available at https://curl.haxx.se/docs/copyright.html.
+#
+# You may opt to use, copy, modify, merge, publish, distribute and/or sell
+# copies of the Software, and permit persons to whom the Software is
+# furnished to do so, under the terms of the COPYING file.
+#
+# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+# KIND, either express or implied.
+#
+###########################################################################
+#
+#
+
+use strict;
+use warnings;
+
+# we may get the dir root pointed out
+my $root=$ARGV[0] || ".";
+
+my %error; # from the include file
+my %docs; # from libcurl-errors.3
+
+sub getdocserrors {
+    open(F, "<$root/docs/libcurl/libcurl-errors.3");
+    while(<F>) {
+        if($_ =~ /^.IP \"(CURL[EM]_[^ \t\"]*)/) {
+            my ($symbol) = ($1);
+            if($symbol =~ /OBSOLETE/) {
+                ;
+            }
+            else {
+                $docs{$symbol}=1;
+            }
+        }
+    }
+    close(F);
+}
+
+sub getincludeerrors {
+    open(F, "<$root/docs/libcurl/symbols-in-versions");
+    while(<F>) {
+        if($_ =~ /^(CURL[EM]_[^ \t]*)[ \t]*([0-9.]+)[ \t]*(.*)/) {
+            my ($symbol, $added, $rest) = ($1,$2,$3);
+            if($rest =~ /^([0-9.]+)/) {
+                # removed!
+            }
+            else {
+                $error{$symbol}=$added;
+            }
+        }
+    }
+    close(F);
+}
+
+getincludeerrors();
+getdocserrors();
+
+for(sort keys %error) {
+    if($error{$_} && !$docs{$_}) {
+        print "$_ is not in libcurl-errors.3\n";
+    }
+}
+
+for(sort keys %docs) {
+    if($docs{$_} && !$error{$_}) {
+        print "$_ is not in symbols-in-versions\n";
+    }
+}
index d401be2..ac02722 100755 (executable)
@@ -68,6 +68,10 @@ use serverhelp qw(
     datasockf_logfilename
     );
 
+use sshhelp qw(
+    exe_ext
+    );
+
 #**********************************************************************
 # global vars...
 #
@@ -411,7 +415,7 @@ sub sysread_or_die {
 }
 
 sub startsf {
-    my $mainsockfcmd = "./server/sockfilt " .
+    my $mainsockfcmd = "./server/sockfilt".exe_ext('SRV')." " .
         "--ipv$ipvnum --port $port " .
         "--pidfile \"$mainsockf_pidfile\" " .
         "--logfile \"$mainsockf_logfile\"";
@@ -2401,7 +2405,7 @@ sub PASV_ftp {
     logmsg "DATA sockfilt for passive data channel starting...\n";
 
     # We fire up a new sockfilt to do the data transfer for us.
-    my $datasockfcmd = "./server/sockfilt " .
+    my $datasockfcmd = "./server/sockfilt".exe_ext('SRV')." " .
         "--ipv$ipvnum $bindonly --port 0 " .
         "--pidfile \"$datasockf_pidfile\" " .
         "--logfile \"$datasockf_logfile\"";
@@ -2620,7 +2624,7 @@ sub PORT_ftp {
     logmsg "DATA sockfilt for active data channel starting...\n";
 
     # We fire up a new sockfilt to do the data transfer for us.
-    my $datasockfcmd = "./server/sockfilt " .
+    my $datasockfcmd = "./server/sockfilt".exe_ext('SRV')." " .
         "--ipv$ipvnum --connect $port --addr \"$addr\" " .
         "--pidfile \"$datasockf_pidfile\" " .
         "--logfile \"$datasockf_logfile\"";
index 5198b5f..7080bf4 100644 (file)
@@ -5,7 +5,7 @@
 #                            | (__| |_| |  _ <| |___
 #                             \___|\___/|_| \_\_____|
 #
-# Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 #
 # This software is licensed as described in the file COPYING, which
 # you should have received as part of this distribution. The terms
diff --git a/tests/http_pipe.py b/tests/http_pipe.py
deleted file mode 100755 (executable)
index 95389f4..0000000
+++ /dev/null
@@ -1,441 +0,0 @@
-#!/usr/bin/env python
-
-# Copyright 2012 Google Inc. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#    https://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-# Modified by Linus Nielsen Feltzing for inclusion in the libcurl test
-# framework
-#
-try:
-    import socketserver
-except:
-    import SocketServer as socketserver
-import argparse
-import re
-import select
-import socket
-import time
-import pprint
-import os
-
-INFO_MESSAGE = '''
-This is a test server to test the libcurl pipelining functionality.
-It is a modified version if Google's HTTP pipelining test server. More
-information can be found here:
-
-https://dev.chromium.org/developers/design-documents/network-stack/http-pipelining
-
-Source code can be found here:
-
-https://code.google.com/archive/p/http-pipelining-test/
-'''
-MAX_REQUEST_SIZE = 1024  # bytes
-MIN_POLL_TIME = 0.01  # seconds. Minimum time to poll, in order to prevent
-                      # excessive looping because Python refuses to poll for
-                      # small timeouts.
-SEND_BUFFER_TIME = 0.5  # seconds
-TIMEOUT = 30  # seconds
-
-
-class Error(Exception):
-  pass
-
-
-class RequestTooLargeError(Error):
-  pass
-
-
-class ServeIndexError(Error):
-  pass
-
-
-class UnexpectedMethodError(Error):
-  pass
-
-
-class RequestParser(object):
-  """Parses an input buffer looking for HTTP GET requests."""
-
-  global logfile
-
-  LOOKING_FOR_GET = 1
-  READING_HEADERS = 2
-
-  HEADER_RE = re.compile('([^:]+):(.*)\n')
-  REQUEST_RE = re.compile('([^ ]+) ([^ ]+) HTTP/(\d+)\.(\d+)\n')
-
-  def __init__(self):
-    """Initializer."""
-    self._buffer = ""
-    self._pending_headers = {}
-    self._pending_request = ""
-    self._state = self.LOOKING_FOR_GET
-    self._were_all_requests_http_1_1 = True
-    self._valid_requests = []
-
-  def ParseAdditionalData(self, data):
-    """Finds HTTP requests in |data|.
-
-    Args:
-      data: (String) Newly received input data from the socket.
-
-    Returns:
-      (List of Tuples)
-        (String) The request path.
-        (Map of String to String) The header name and value.
-
-    Raises:
-      RequestTooLargeError: If the request exceeds MAX_REQUEST_SIZE.
-      UnexpectedMethodError: On a non-GET method.
-      Error: On a programming error.
-    """
-    logfile = open('log/server.input', 'a')
-    logfile.write(data)
-    logfile.close()
-    self._buffer += data.replace('\r', '')
-    should_continue_parsing = True
-    while should_continue_parsing:
-      if self._state == self.LOOKING_FOR_GET:
-        should_continue_parsing = self._DoLookForGet()
-      elif self._state == self.READING_HEADERS:
-        should_continue_parsing = self._DoReadHeader()
-      else:
-        raise Error('Unexpected state: ' + self._state)
-    if len(self._buffer) > MAX_REQUEST_SIZE:
-      raise RequestTooLargeError(
-          'Request is at least %d bytes' % len(self._buffer))
-    valid_requests = self._valid_requests
-    self._valid_requests = []
-    return valid_requests
-
-  @property
-  def were_all_requests_http_1_1(self):
-    return self._were_all_requests_http_1_1
-
-  def _DoLookForGet(self):
-    """Tries to parse an HTTTP request line.
-
-    Returns:
-      (Boolean) True if a request was found.
-
-    Raises:
-      UnexpectedMethodError: On a non-GET method.
-    """
-    m = self.REQUEST_RE.match(self._buffer)
-    if not m:
-      return False
-    method, path, http_major, http_minor = m.groups()
-
-    if method != 'GET':
-      raise UnexpectedMethodError('Unexpected method: ' + method)
-    if path in ['/', '/index.htm', '/index.html']:
-      raise ServeIndexError()
-
-    if http_major != '1' or http_minor != '1':
-      self._were_all_requests_http_1_1 = False
-
-#    print method, path
-
-    self._pending_request = path
-    self._buffer = self._buffer[m.end():]
-    self._state = self.READING_HEADERS
-    return True
-
-  def _DoReadHeader(self):
-    """Tries to parse a HTTP header.
-
-    Returns:
-      (Boolean) True if it found the end of the request or a HTTP header.
-    """
-    if self._buffer.startswith('\n'):
-      self._buffer = self._buffer[1:]
-      self._state = self.LOOKING_FOR_GET
-      self._valid_requests.append((self._pending_request,
-                                   self._pending_headers))
-      self._pending_headers = {}
-      self._pending_request = ""
-      return True
-
-    m = self.HEADER_RE.match(self._buffer)
-    if not m:
-      return False
-
-    header = m.group(1).lower()
-    value = m.group(2).strip().lower()
-    if header not in self._pending_headers:
-      self._pending_headers[header] = value
-    self._buffer = self._buffer[m.end():]
-    return True
-
-
-class ResponseBuilder(object):
-  """Builds HTTP responses for a list of accumulated requests."""
-
-  def __init__(self):
-    """Initializer."""
-    self._max_pipeline_depth = 0
-    self._requested_paths = []
-    self._processed_end = False
-    self._were_all_requests_http_1_1 = True
-
-  def QueueRequests(self, requested_paths, were_all_requests_http_1_1):
-    """Adds requests to the queue of requests.
-
-    Args:
-      requested_paths: (List of Strings) Requested paths.
-    """
-    self._requested_paths.extend(requested_paths)
-    self._were_all_requests_http_1_1 = were_all_requests_http_1_1
-
-  def Chunkify(self, data, chunksize):
-    """ Divides a string into chunks
-    """
-    return [hex(chunksize)[2:] + "\r\n" + data[i:i+chunksize] + "\r\n" for i in range(0, len(data), chunksize)]
-
-  def BuildResponses(self):
-    """Converts the queue of requests into responses.
-
-    Returns:
-      (String) Buffer containing all of the responses.
-    """
-    result = ""
-    self._max_pipeline_depth = max(self._max_pipeline_depth,
-                                   len(self._requested_paths))
-    for path, headers in self._requested_paths:
-      if path == '/verifiedserver':
-        body = "WE ROOLZ: {}\r\n".format(os.getpid());
-        result += self._BuildResponse(
-            '200 OK', ['Server: Apache',
-                       'Content-Length: {}'.format(len(body)),
-                       'Cache-Control: no-store'], body)
-
-      elif path == '/alphabet.txt':
-        body = 'abcdefghijklmnopqrstuvwxyz'
-        result += self._BuildResponse(
-            '200 OK', ['Server: Apache',
-                       'Content-Length: 26',
-                       'Cache-Control: no-store'], body)
-
-      elif path == '/reverse.txt':
-        body = 'zyxwvutsrqponmlkjihgfedcba'
-        result += self._BuildResponse(
-            '200 OK', ['Content-Length: 26', 'Cache-Control: no-store'], body)
-
-      elif path == '/chunked.txt':
-        body = ('7\r\nchunked\r\n'
-                '8\r\nencoding\r\n'
-                '2\r\nis\r\n'
-                '3\r\nfun\r\n'
-                '0\r\n\r\n')
-        result += self._BuildResponse(
-            '200 OK', ['Transfer-Encoding: chunked', 'Cache-Control: no-store'],
-            body)
-
-      elif path == '/cached.txt':
-        body = 'azbycxdwevfugthsirjqkplomn'
-        result += self._BuildResponse(
-            '200 OK', ['Content-Length: 26', 'Cache-Control: max-age=60'], body)
-
-      elif path == '/connection_close.txt':
-        body = 'azbycxdwevfugthsirjqkplomn'
-        result += self._BuildResponse(
-            '200 OK', ['Content-Length: 26', 'Cache-Control: max-age=60', 'Connection: close'], body)
-        self._processed_end = True
-
-      elif path == '/1k.txt':
-        body = '0123456789abcdef' * 64
-        result += self._BuildResponse(
-            '200 OK', ['Server: Apache',
-                       'Content-Length: 1024',
-                       'Cache-Control: max-age=60'], body)
-
-      elif path == '/10k.txt':
-        body = '0123456789abcdef' * 640
-        result += self._BuildResponse(
-            '200 OK', ['Server: Apache',
-                       'Content-Length: 10240',
-                       'Cache-Control: max-age=60'], body)
-
-      elif path == '/100k.txt':
-        body = '0123456789abcdef' * 6400
-        result += self._BuildResponse(
-            '200 OK',
-            ['Server: Apache',
-             'Content-Length: 102400',
-             'Cache-Control: max-age=60'],
-            body)
-
-      elif path == '/100k_chunked.txt':
-        body = self.Chunkify('0123456789abcdef' * 6400, 20480)
-        body.append('0\r\n\r\n')
-        body = ''.join(body)
-
-        result += self._BuildResponse(
-            '200 OK', ['Transfer-Encoding: chunked', 'Cache-Control: no-store'], body)
-
-      elif path == '/stats.txt':
-        results = {
-            'max_pipeline_depth': self._max_pipeline_depth,
-            'were_all_requests_http_1_1': int(self._were_all_requests_http_1_1),
-        }
-        body = ','.join(['%s:%s' % (k, v) for k, v in results.items()])
-        result += self._BuildResponse(
-            '200 OK',
-            ['Content-Length: %s' % len(body), 'Cache-Control: no-store'], body)
-        self._processed_end = True
-
-      else:
-        result += self._BuildResponse('404 Not Found', ['Content-Length: 7'], 'Go away')
-      if self._processed_end:
-          break
-    self._requested_paths = []
-    return result
-
-  def WriteError(self, status, error):
-    """Returns an HTTP response for the specified error.
-
-    Args:
-      status: (String) Response code and descrtion (e.g. "404 Not Found")
-
-    Returns:
-      (String) Text of HTTP response.
-    """
-    return self._BuildResponse(
-        status, ['Connection: close', 'Content-Type: text/plain'], error)
-
-  @property
-  def processed_end(self):
-    return self._processed_end
-
-  def _BuildResponse(self, status, headers, body):
-    """Builds an HTTP response.
-
-    Args:
-      status: (String) Response code and descrtion (e.g. "200 OK")
-      headers: (List of Strings) Headers (e.g. "Connection: close")
-      body: (String) Response body.
-
-    Returns:
-      (String) Text of HTTP response.
-    """
-    return ('HTTP/1.1 %s\r\n'
-            '%s\r\n'
-            '\r\n'
-            '%s' % (status, '\r\n'.join(headers), body))
-
-
-class PipelineRequestHandler(socketserver.BaseRequestHandler):
-  """Called on an incoming TCP connection."""
-
-  def _GetTimeUntilTimeout(self):
-    return self._start_time + TIMEOUT - time.time()
-
-  def _GetTimeUntilNextSend(self):
-    if not self._last_queued_time:
-      return TIMEOUT
-    return self._last_queued_time + SEND_BUFFER_TIME - time.time()
-
-  def handle(self):
-    self._request_parser = RequestParser()
-    self._response_builder = ResponseBuilder()
-    self._last_queued_time = 0
-    self._num_queued = 0
-    self._num_written = 0
-    self._send_buffer = ""
-    self._start_time = time.time()
-    try:
-      while not self._response_builder.processed_end or self._send_buffer:
-
-        time_left = self._GetTimeUntilTimeout()
-        time_until_next_send = self._GetTimeUntilNextSend()
-        max_poll_time = min(time_left, time_until_next_send) + MIN_POLL_TIME
-
-        rlist, wlist, xlist = [], [], []
-        fileno = self.request.fileno()
-        if max_poll_time > 0:
-          rlist.append(fileno)
-          if self._send_buffer:
-            wlist.append(fileno)
-          rlist, wlist, xlist = select.select(rlist, wlist, xlist, max_poll_time)
-
-        if self._GetTimeUntilTimeout() <= 0:
-          return
-
-        if self._GetTimeUntilNextSend() <= 0:
-          self._send_buffer += self._response_builder.BuildResponses()
-          self._num_written = self._num_queued
-          self._last_queued_time = 0
-
-        if fileno in rlist:
-          self.request.setblocking(False)
-          new_data = self.request.recv(MAX_REQUEST_SIZE)
-          self.request.setblocking(True)
-          if not new_data:
-            return
-          new_requests = self._request_parser.ParseAdditionalData(new_data)
-          self._response_builder.QueueRequests(
-              new_requests, self._request_parser.were_all_requests_http_1_1)
-          self._num_queued += len(new_requests)
-          self._last_queued_time = time.time()
-        elif fileno in wlist:
-          num_bytes_sent = self.request.send(self._send_buffer[0:4096])
-          self._send_buffer = self._send_buffer[num_bytes_sent:]
-          time.sleep(0.05)
-
-    except RequestTooLargeError as e:
-      self.request.send(self._response_builder.WriteError(
-          '413 Request Entity Too Large', e))
-      raise
-    except UnexpectedMethodError as e:
-      self.request.send(self._response_builder.WriteError(
-          '405 Method Not Allowed', e))
-      raise
-    except ServeIndexError:
-      self.request.send(self._response_builder.WriteError(
-          '200 OK', INFO_MESSAGE))
-    except Exception as e:
-      print(e)
-    self.request.close()
-
-
-class PipelineServer(socketserver.ThreadingMixIn, socketserver.TCPServer):
-  pass
-
-
-parser = argparse.ArgumentParser()
-parser.add_argument("--port", action="store", default=0,
-                  type=int, help="port to listen on")
-parser.add_argument("--verbose", action="store", default=0,
-                  type=int, help="verbose output")
-parser.add_argument("--pidfile", action="store", default=0,
-                  help="file name for the PID")
-parser.add_argument("--logfile", action="store", default=0,
-                  help="file name for the log")
-parser.add_argument("--srcdir", action="store", default=0,
-                  help="test directory")
-parser.add_argument("--id", action="store", default=0,
-                  help="server ID")
-parser.add_argument("--ipv4", action="store_true", default=0,
-                  help="IPv4 flag")
-args = parser.parse_args()
-
-if args.pidfile:
-    pid = os.getpid()
-    f = open(args.pidfile, 'w')
-    f.write('{}'.format(pid))
-    f.close()
-
-server = PipelineServer(('0.0.0.0', args.port), PipelineRequestHandler)
-server.allow_reuse_address = True
-server.serve_forever()
index 7f6c86a..8b789a9 100755 (executable)
@@ -34,6 +34,10 @@ use serverhelp qw(
     server_logfilename
     );
 
+use sshhelp qw(
+    exe_ext
+    );
+
 my $verbose = 0;     # set to 1 for debugging
 my $port = 8990;     # just a default
 my $unix_socket;     # location to place a listening Unix socket
@@ -133,7 +137,7 @@ if($ipvnum eq 'unix') {
 $flags .= "--srcdir \"$srcdir\"";
 
 if($verbose) {
-    print STDERR "RUN: server/sws $flags\n";
+    print STDERR "RUN: server/sws".exe_ext('SRV')." $flags\n";
 }
 
-exec("server/sws $flags");
+exec("server/sws".exe_ext('SRV')." $flags");
index aa70d05..6b14ad3 100644 (file)
@@ -1,9 +1,5 @@
 set(TARGET_LABEL_PREFIX "Test ")
 
-if(MSVC)
-  set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /wd4127")
-endif()
-
 function(setup_test TEST_NAME)          # ARGN are the files in the test
   add_executable( ${TEST_NAME} ${ARGN} )
   string(TOUPPER ${TEST_NAME} UPPER_TEST_NAME)
index 56c84a7..ca7c01c 100644 (file)
@@ -5,7 +5,7 @@
 #                            | (__| |_| |  _ <| |___
 #                             \___|\___/|_| \_\_____|
 #
-# Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 #
 # This software is licensed as described in the file COPYING, which
 # you should have received as part of this distribution. The terms
@@ -131,8 +131,13 @@ endif
 lib1521.c: $(top_srcdir)/tests/libtest/mk-lib1521.pl $(top_srcdir)/include/curl/curl.h
        @PERL@ $(top_srcdir)/tests/libtest/mk-lib1521.pl < $(top_srcdir)/include/curl/curl.h > lib1521.c
 
+CHECKSRC = $(CS_$(V))
+CS_0 = @echo "  RUN     " $@;
+CS_1 =
+CS_ = $(CS_0)
+
 checksrc:
-       @PERL@ $(top_srcdir)/lib/checksrc.pl $(srcdir)/*.c
+       $(CHECKSRC)@PERL@ $(top_srcdir)/lib/checksrc.pl $(srcdir)/*.[ch]
 
 if CURLDEBUG
 # for debug builds, we scan the sources on all regular make invokes
index eb81561..684f281 100644 (file)
@@ -101,41 +101,47 @@ noinst_PROGRAMS = chkhostname$(EXEEXT) libauthretry$(EXEEXT) \
        lib521$(EXEEXT) lib523$(EXEEXT) lib524$(EXEEXT) \
        lib525$(EXEEXT) lib526$(EXEEXT) lib527$(EXEEXT) \
        lib529$(EXEEXT) lib530$(EXEEXT) lib532$(EXEEXT) \
-       lib533$(EXEEXT) lib536$(EXEEXT) lib537$(EXEEXT) \
-       lib539$(EXEEXT) lib540$(EXEEXT) lib541$(EXEEXT) \
-       lib542$(EXEEXT) lib543$(EXEEXT) lib544$(EXEEXT) \
-       lib545$(EXEEXT) lib547$(EXEEXT) lib548$(EXEEXT) \
-       lib549$(EXEEXT) lib552$(EXEEXT) lib553$(EXEEXT) \
-       lib554$(EXEEXT) lib555$(EXEEXT) lib556$(EXEEXT) \
-       lib557$(EXEEXT) lib558$(EXEEXT) lib559$(EXEEXT) \
-       lib560$(EXEEXT) lib562$(EXEEXT) lib564$(EXEEXT) \
-       lib565$(EXEEXT) lib566$(EXEEXT) lib567$(EXEEXT) \
-       lib568$(EXEEXT) lib569$(EXEEXT) lib570$(EXEEXT) \
-       lib571$(EXEEXT) lib572$(EXEEXT) lib573$(EXEEXT) \
-       lib574$(EXEEXT) lib575$(EXEEXT) lib576$(EXEEXT) \
-       lib578$(EXEEXT) lib579$(EXEEXT) lib582$(EXEEXT) \
-       lib583$(EXEEXT) lib585$(EXEEXT) lib586$(EXEEXT) \
-       lib587$(EXEEXT) lib589$(EXEEXT) lib590$(EXEEXT) \
-       lib591$(EXEEXT) lib597$(EXEEXT) lib598$(EXEEXT) \
-       lib599$(EXEEXT) lib643$(EXEEXT) lib644$(EXEEXT) \
-       lib645$(EXEEXT) lib650$(EXEEXT) lib651$(EXEEXT) \
-       lib652$(EXEEXT) lib653$(EXEEXT) lib654$(EXEEXT) \
-       lib655$(EXEEXT) lib1156$(EXEEXT) lib1500$(EXEEXT) \
-       lib1501$(EXEEXT) lib1502$(EXEEXT) lib1503$(EXEEXT) \
-       lib1504$(EXEEXT) lib1505$(EXEEXT) lib1506$(EXEEXT) \
-       lib1507$(EXEEXT) lib1508$(EXEEXT) lib1509$(EXEEXT) \
-       lib1510$(EXEEXT) lib1511$(EXEEXT) lib1512$(EXEEXT) \
-       lib1513$(EXEEXT) lib1514$(EXEEXT) lib1515$(EXEEXT) \
-       lib1517$(EXEEXT) lib1520$(EXEEXT) lib1521$(EXEEXT) \
-       lib1522$(EXEEXT) lib1525$(EXEEXT) lib1526$(EXEEXT) \
-       lib1527$(EXEEXT) lib1528$(EXEEXT) lib1529$(EXEEXT) \
-       lib1530$(EXEEXT) lib1531$(EXEEXT) lib1532$(EXEEXT) \
-       lib1533$(EXEEXT) lib1534$(EXEEXT) lib1535$(EXEEXT) \
-       lib1536$(EXEEXT) lib1537$(EXEEXT) lib1538$(EXEEXT) \
-       lib1540$(EXEEXT) lib1550$(EXEEXT) lib1551$(EXEEXT) \
-       lib1552$(EXEEXT) lib1553$(EXEEXT) lib1554$(EXEEXT) \
-       lib1555$(EXEEXT) lib1556$(EXEEXT) lib1557$(EXEEXT) \
-       lib1560$(EXEEXT) lib1900$(EXEEXT) lib2033$(EXEEXT)
+       lib533$(EXEEXT) lib537$(EXEEXT) lib539$(EXEEXT) \
+       lib540$(EXEEXT) lib541$(EXEEXT) lib542$(EXEEXT) \
+       lib543$(EXEEXT) lib544$(EXEEXT) lib545$(EXEEXT) \
+       lib547$(EXEEXT) lib548$(EXEEXT) lib549$(EXEEXT) \
+       lib552$(EXEEXT) lib553$(EXEEXT) lib554$(EXEEXT) \
+       lib555$(EXEEXT) lib556$(EXEEXT) lib557$(EXEEXT) \
+       lib558$(EXEEXT) lib559$(EXEEXT) lib560$(EXEEXT) \
+       lib562$(EXEEXT) lib564$(EXEEXT) lib565$(EXEEXT) \
+       lib566$(EXEEXT) lib567$(EXEEXT) lib568$(EXEEXT) \
+       lib569$(EXEEXT) lib570$(EXEEXT) lib571$(EXEEXT) \
+       lib572$(EXEEXT) lib573$(EXEEXT) lib574$(EXEEXT) \
+       lib575$(EXEEXT) lib576$(EXEEXT) lib578$(EXEEXT) \
+       lib579$(EXEEXT) lib582$(EXEEXT) lib583$(EXEEXT) \
+       lib585$(EXEEXT) lib586$(EXEEXT) lib587$(EXEEXT) \
+       lib589$(EXEEXT) lib590$(EXEEXT) lib591$(EXEEXT) \
+       lib597$(EXEEXT) lib598$(EXEEXT) lib599$(EXEEXT) \
+       lib643$(EXEEXT) lib644$(EXEEXT) lib645$(EXEEXT) \
+       lib650$(EXEEXT) lib651$(EXEEXT) lib652$(EXEEXT) \
+       lib653$(EXEEXT) lib654$(EXEEXT) lib655$(EXEEXT) \
+       lib658$(EXEEXT) lib659$(EXEEXT) lib661$(EXEEXT) \
+       lib1156$(EXEEXT) lib1500$(EXEEXT) lib1501$(EXEEXT) \
+       lib1502$(EXEEXT) lib1503$(EXEEXT) lib1504$(EXEEXT) \
+       lib1505$(EXEEXT) lib1506$(EXEEXT) lib1507$(EXEEXT) \
+       lib1508$(EXEEXT) lib1509$(EXEEXT) lib1510$(EXEEXT) \
+       lib1511$(EXEEXT) lib1512$(EXEEXT) lib1513$(EXEEXT) \
+       lib1514$(EXEEXT) lib1515$(EXEEXT) lib1517$(EXEEXT) \
+       lib1518$(EXEEXT) lib1520$(EXEEXT) lib1521$(EXEEXT) \
+       lib1522$(EXEEXT) lib1523$(EXEEXT) lib1525$(EXEEXT) \
+       lib1526$(EXEEXT) lib1527$(EXEEXT) lib1528$(EXEEXT) \
+       lib1529$(EXEEXT) lib1530$(EXEEXT) lib1531$(EXEEXT) \
+       lib1532$(EXEEXT) lib1533$(EXEEXT) lib1534$(EXEEXT) \
+       lib1535$(EXEEXT) lib1536$(EXEEXT) lib1537$(EXEEXT) \
+       lib1538$(EXEEXT) lib1540$(EXEEXT) lib1541$(EXEEXT) \
+       lib1550$(EXEEXT) lib1551$(EXEEXT) lib1552$(EXEEXT) \
+       lib1553$(EXEEXT) lib1554$(EXEEXT) lib1555$(EXEEXT) \
+       lib1556$(EXEEXT) lib1557$(EXEEXT) lib1558$(EXEEXT) \
+       lib1559$(EXEEXT) lib1560$(EXEEXT) lib1564$(EXEEXT) \
+       lib1565$(EXEEXT) lib1591$(EXEEXT) lib1592$(EXEEXT) \
+       lib1593$(EXEEXT) lib1594$(EXEEXT) lib1596$(EXEEXT) \
+       lib1900$(EXEEXT) lib1905$(EXEEXT) lib1906$(EXEEXT) \
+       lib1907$(EXEEXT) lib2033$(EXEEXT)
 @USE_CPPFLAG_CURL_STATICLIB_TRUE@am__append_1 = -DCURL_STATICLIB
 @CURL_LT_SHLIB_USE_NO_UNDEFINED_TRUE@am__append_2 = -no-undefined
 @CURL_LT_SHLIB_USE_MIMPURE_TEXT_TRUE@am__append_3 = -mimpure-text
@@ -147,8 +153,7 @@ noinst_PROGRAMS = chkhostname$(EXEEXT) libauthretry$(EXEEXT) \
 @BUILD_STUB_GSS_FALSE@libstubgss_la_DEPENDENCIES =
 subdir = tests/libtest
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/ax_code_coverage.m4 \
-       $(top_srcdir)/m4/ax_compile_check_sizeof.m4 \
+am__aclocal_m4_deps = $(top_srcdir)/m4/ax_compile_check_sizeof.m4 \
        $(top_srcdir)/m4/curl-compilers.m4 \
        $(top_srcdir)/m4/curl-confopts.m4 \
        $(top_srcdir)/m4/curl-functions.m4 \
@@ -332,703 +337,804 @@ am_lib1517_OBJECTS = lib1517-lib1517.$(OBJEXT) $(am__objects_51)
 lib1517_OBJECTS = $(am_lib1517_OBJECTS)
 lib1517_LDADD = $(LDADD)
 lib1517_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_52 = lib1520-first.$(OBJEXT)
-am_lib1520_OBJECTS = lib1520-lib1520.$(OBJEXT) $(am__objects_52)
+am__objects_52 = lib1518-first.$(OBJEXT)
+am_lib1518_OBJECTS = lib1518-lib1518.$(OBJEXT) $(am__objects_52)
+lib1518_OBJECTS = $(am_lib1518_OBJECTS)
+lib1518_LDADD = $(LDADD)
+lib1518_DEPENDENCIES = $(am__DEPENDENCIES_1)
+am__objects_53 = lib1520-first.$(OBJEXT)
+am_lib1520_OBJECTS = lib1520-lib1520.$(OBJEXT) $(am__objects_53)
 lib1520_OBJECTS = $(am_lib1520_OBJECTS)
 lib1520_LDADD = $(LDADD)
 lib1520_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_53 = lib1521-first.$(OBJEXT)
-nodist_lib1521_OBJECTS = lib1521-lib1521.$(OBJEXT) $(am__objects_53)
+am__objects_54 = lib1521-first.$(OBJEXT)
+nodist_lib1521_OBJECTS = lib1521-lib1521.$(OBJEXT) $(am__objects_54)
 lib1521_OBJECTS = $(nodist_lib1521_OBJECTS)
 lib1521_LDADD = $(LDADD)
 lib1521_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_54 = lib1522-first.$(OBJEXT)
-am_lib1522_OBJECTS = lib1522-lib1522.$(OBJEXT) $(am__objects_54)
+am__objects_55 = lib1522-first.$(OBJEXT)
+am_lib1522_OBJECTS = lib1522-lib1522.$(OBJEXT) $(am__objects_55)
 lib1522_OBJECTS = $(am_lib1522_OBJECTS)
 lib1522_LDADD = $(LDADD)
 lib1522_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_55 = lib1525-first.$(OBJEXT)
-am__objects_56 = lib1525-testutil.$(OBJEXT)
-am__objects_57 = ../../lib/lib1525-warnless.$(OBJEXT)
-am_lib1525_OBJECTS = lib1525-lib1525.$(OBJEXT) $(am__objects_55) \
-       $(am__objects_56) $(am__objects_57)
+am__objects_56 = lib1523-first.$(OBJEXT)
+am_lib1523_OBJECTS = lib1523-lib1523.$(OBJEXT) $(am__objects_56)
+lib1523_OBJECTS = $(am_lib1523_OBJECTS)
+lib1523_LDADD = $(LDADD)
+lib1523_DEPENDENCIES = $(am__DEPENDENCIES_1)
+am__objects_57 = lib1525-first.$(OBJEXT)
+am__objects_58 = lib1525-testutil.$(OBJEXT)
+am__objects_59 = ../../lib/lib1525-warnless.$(OBJEXT)
+am_lib1525_OBJECTS = lib1525-lib1525.$(OBJEXT) $(am__objects_57) \
+       $(am__objects_58) $(am__objects_59)
 lib1525_OBJECTS = $(am_lib1525_OBJECTS)
 lib1525_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_58 = lib1526-first.$(OBJEXT)
-am__objects_59 = lib1526-testutil.$(OBJEXT)
-am__objects_60 = ../../lib/lib1526-warnless.$(OBJEXT)
-am_lib1526_OBJECTS = lib1526-lib1526.$(OBJEXT) $(am__objects_58) \
-       $(am__objects_59) $(am__objects_60)
+am__objects_60 = lib1526-first.$(OBJEXT)
+am__objects_61 = lib1526-testutil.$(OBJEXT)
+am__objects_62 = ../../lib/lib1526-warnless.$(OBJEXT)
+am_lib1526_OBJECTS = lib1526-lib1526.$(OBJEXT) $(am__objects_60) \
+       $(am__objects_61) $(am__objects_62)
 lib1526_OBJECTS = $(am_lib1526_OBJECTS)
 lib1526_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_61 = lib1527-first.$(OBJEXT)
-am__objects_62 = lib1527-testutil.$(OBJEXT)
-am__objects_63 = ../../lib/lib1527-warnless.$(OBJEXT)
-am_lib1527_OBJECTS = lib1527-lib1527.$(OBJEXT) $(am__objects_61) \
-       $(am__objects_62) $(am__objects_63)
+am__objects_63 = lib1527-first.$(OBJEXT)
+am__objects_64 = lib1527-testutil.$(OBJEXT)
+am__objects_65 = ../../lib/lib1527-warnless.$(OBJEXT)
+am_lib1527_OBJECTS = lib1527-lib1527.$(OBJEXT) $(am__objects_63) \
+       $(am__objects_64) $(am__objects_65)
 lib1527_OBJECTS = $(am_lib1527_OBJECTS)
 lib1527_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_64 = lib1528-first.$(OBJEXT)
-am__objects_65 = lib1528-testutil.$(OBJEXT)
-am__objects_66 = ../../lib/lib1528-warnless.$(OBJEXT)
-am_lib1528_OBJECTS = lib1528-lib1528.$(OBJEXT) $(am__objects_64) \
-       $(am__objects_65) $(am__objects_66)
+am__objects_66 = lib1528-first.$(OBJEXT)
+am__objects_67 = lib1528-testutil.$(OBJEXT)
+am__objects_68 = ../../lib/lib1528-warnless.$(OBJEXT)
+am_lib1528_OBJECTS = lib1528-lib1528.$(OBJEXT) $(am__objects_66) \
+       $(am__objects_67) $(am__objects_68)
 lib1528_OBJECTS = $(am_lib1528_OBJECTS)
 lib1528_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_67 = lib1529-first.$(OBJEXT)
-am__objects_68 = lib1529-testutil.$(OBJEXT)
-am__objects_69 = ../../lib/lib1529-warnless.$(OBJEXT)
-am_lib1529_OBJECTS = lib1529-lib1529.$(OBJEXT) $(am__objects_67) \
-       $(am__objects_68) $(am__objects_69)
+am__objects_69 = lib1529-first.$(OBJEXT)
+am__objects_70 = lib1529-testutil.$(OBJEXT)
+am__objects_71 = ../../lib/lib1529-warnless.$(OBJEXT)
+am_lib1529_OBJECTS = lib1529-lib1529.$(OBJEXT) $(am__objects_69) \
+       $(am__objects_70) $(am__objects_71)
 lib1529_OBJECTS = $(am_lib1529_OBJECTS)
 lib1529_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_70 = lib1530-first.$(OBJEXT)
-am__objects_71 = lib1530-testutil.$(OBJEXT)
-am__objects_72 = ../../lib/lib1530-warnless.$(OBJEXT)
-am_lib1530_OBJECTS = lib1530-lib1530.$(OBJEXT) $(am__objects_70) \
-       $(am__objects_71) $(am__objects_72)
+am__objects_72 = lib1530-first.$(OBJEXT)
+am__objects_73 = lib1530-testutil.$(OBJEXT)
+am__objects_74 = ../../lib/lib1530-warnless.$(OBJEXT)
+am_lib1530_OBJECTS = lib1530-lib1530.$(OBJEXT) $(am__objects_72) \
+       $(am__objects_73) $(am__objects_74)
 lib1530_OBJECTS = $(am_lib1530_OBJECTS)
 lib1530_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_73 = lib1531-first.$(OBJEXT)
-am__objects_74 = lib1531-testutil.$(OBJEXT)
-am__objects_75 = ../../lib/lib1531-warnless.$(OBJEXT)
-am_lib1531_OBJECTS = lib1531-lib1531.$(OBJEXT) $(am__objects_73) \
-       $(am__objects_74) $(am__objects_75)
+am__objects_75 = lib1531-first.$(OBJEXT)
+am__objects_76 = lib1531-testutil.$(OBJEXT)
+am__objects_77 = ../../lib/lib1531-warnless.$(OBJEXT)
+am_lib1531_OBJECTS = lib1531-lib1531.$(OBJEXT) $(am__objects_75) \
+       $(am__objects_76) $(am__objects_77)
 lib1531_OBJECTS = $(am_lib1531_OBJECTS)
 lib1531_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_76 = lib1532-first.$(OBJEXT)
-am__objects_77 = lib1532-testutil.$(OBJEXT)
-am__objects_78 = ../../lib/lib1532-warnless.$(OBJEXT)
-am_lib1532_OBJECTS = lib1532-lib1532.$(OBJEXT) $(am__objects_76) \
-       $(am__objects_77) $(am__objects_78)
+am__objects_78 = lib1532-first.$(OBJEXT)
+am__objects_79 = lib1532-testutil.$(OBJEXT)
+am__objects_80 = ../../lib/lib1532-warnless.$(OBJEXT)
+am_lib1532_OBJECTS = lib1532-lib1532.$(OBJEXT) $(am__objects_78) \
+       $(am__objects_79) $(am__objects_80)
 lib1532_OBJECTS = $(am_lib1532_OBJECTS)
 lib1532_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_79 = lib1533-first.$(OBJEXT)
-am__objects_80 = lib1533-testutil.$(OBJEXT)
-am__objects_81 = ../../lib/lib1533-warnless.$(OBJEXT)
-am_lib1533_OBJECTS = lib1533-lib1533.$(OBJEXT) $(am__objects_79) \
-       $(am__objects_80) $(am__objects_81)
+am__objects_81 = lib1533-first.$(OBJEXT)
+am__objects_82 = lib1533-testutil.$(OBJEXT)
+am__objects_83 = ../../lib/lib1533-warnless.$(OBJEXT)
+am_lib1533_OBJECTS = lib1533-lib1533.$(OBJEXT) $(am__objects_81) \
+       $(am__objects_82) $(am__objects_83)
 lib1533_OBJECTS = $(am_lib1533_OBJECTS)
 lib1533_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_82 = lib1534-first.$(OBJEXT)
-am__objects_83 = lib1534-testutil.$(OBJEXT)
-am__objects_84 = ../../lib/lib1534-warnless.$(OBJEXT)
-am_lib1534_OBJECTS = lib1534-lib1534.$(OBJEXT) $(am__objects_82) \
-       $(am__objects_83) $(am__objects_84)
+am__objects_84 = lib1534-first.$(OBJEXT)
+am__objects_85 = lib1534-testutil.$(OBJEXT)
+am__objects_86 = ../../lib/lib1534-warnless.$(OBJEXT)
+am_lib1534_OBJECTS = lib1534-lib1534.$(OBJEXT) $(am__objects_84) \
+       $(am__objects_85) $(am__objects_86)
 lib1534_OBJECTS = $(am_lib1534_OBJECTS)
 lib1534_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_85 = lib1535-first.$(OBJEXT)
-am__objects_86 = lib1535-testutil.$(OBJEXT)
-am__objects_87 = ../../lib/lib1535-warnless.$(OBJEXT)
-am_lib1535_OBJECTS = lib1535-lib1535.$(OBJEXT) $(am__objects_85) \
-       $(am__objects_86) $(am__objects_87)
+am__objects_87 = lib1535-first.$(OBJEXT)
+am__objects_88 = lib1535-testutil.$(OBJEXT)
+am__objects_89 = ../../lib/lib1535-warnless.$(OBJEXT)
+am_lib1535_OBJECTS = lib1535-lib1535.$(OBJEXT) $(am__objects_87) \
+       $(am__objects_88) $(am__objects_89)
 lib1535_OBJECTS = $(am_lib1535_OBJECTS)
 lib1535_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_88 = lib1536-first.$(OBJEXT)
-am__objects_89 = lib1536-testutil.$(OBJEXT)
-am__objects_90 = ../../lib/lib1536-warnless.$(OBJEXT)
-am_lib1536_OBJECTS = lib1536-lib1536.$(OBJEXT) $(am__objects_88) \
-       $(am__objects_89) $(am__objects_90)
+am__objects_90 = lib1536-first.$(OBJEXT)
+am__objects_91 = lib1536-testutil.$(OBJEXT)
+am__objects_92 = ../../lib/lib1536-warnless.$(OBJEXT)
+am_lib1536_OBJECTS = lib1536-lib1536.$(OBJEXT) $(am__objects_90) \
+       $(am__objects_91) $(am__objects_92)
 lib1536_OBJECTS = $(am_lib1536_OBJECTS)
 lib1536_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_91 = lib1537-first.$(OBJEXT)
-am__objects_92 = lib1537-testutil.$(OBJEXT)
-am__objects_93 = ../../lib/lib1537-warnless.$(OBJEXT)
-am_lib1537_OBJECTS = lib1537-lib1537.$(OBJEXT) $(am__objects_91) \
-       $(am__objects_92) $(am__objects_93)
+am__objects_93 = lib1537-first.$(OBJEXT)
+am__objects_94 = lib1537-testutil.$(OBJEXT)
+am__objects_95 = ../../lib/lib1537-warnless.$(OBJEXT)
+am_lib1537_OBJECTS = lib1537-lib1537.$(OBJEXT) $(am__objects_93) \
+       $(am__objects_94) $(am__objects_95)
 lib1537_OBJECTS = $(am_lib1537_OBJECTS)
 lib1537_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_94 = lib1538-first.$(OBJEXT)
-am__objects_95 = lib1538-testutil.$(OBJEXT)
-am__objects_96 = ../../lib/lib1538-warnless.$(OBJEXT)
-am_lib1538_OBJECTS = lib1538-lib1538.$(OBJEXT) $(am__objects_94) \
-       $(am__objects_95) $(am__objects_96)
+am__objects_96 = lib1538-first.$(OBJEXT)
+am__objects_97 = lib1538-testutil.$(OBJEXT)
+am__objects_98 = ../../lib/lib1538-warnless.$(OBJEXT)
+am_lib1538_OBJECTS = lib1538-lib1538.$(OBJEXT) $(am__objects_96) \
+       $(am__objects_97) $(am__objects_98)
 lib1538_OBJECTS = $(am_lib1538_OBJECTS)
 lib1538_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_97 = lib1540-first.$(OBJEXT)
-am__objects_98 = lib1540-testutil.$(OBJEXT)
-am__objects_99 = ../../lib/lib1540-warnless.$(OBJEXT)
-am_lib1540_OBJECTS = lib1540-lib1540.$(OBJEXT) $(am__objects_97) \
-       $(am__objects_98) $(am__objects_99)
+am__objects_99 = lib1540-first.$(OBJEXT)
+am__objects_100 = lib1540-testutil.$(OBJEXT)
+am__objects_101 = ../../lib/lib1540-warnless.$(OBJEXT)
+am_lib1540_OBJECTS = lib1540-lib1540.$(OBJEXT) $(am__objects_99) \
+       $(am__objects_100) $(am__objects_101)
 lib1540_OBJECTS = $(am_lib1540_OBJECTS)
 lib1540_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_100 = lib1550-first.$(OBJEXT)
-am_lib1550_OBJECTS = lib1550-lib1550.$(OBJEXT) $(am__objects_100)
+am__objects_102 = lib1541-first.$(OBJEXT)
+am__objects_103 = lib1541-testutil.$(OBJEXT)
+am__objects_104 = ../../lib/lib1541-warnless.$(OBJEXT)
+am_lib1541_OBJECTS = lib1541-lib1541.$(OBJEXT) $(am__objects_102) \
+       $(am__objects_103) $(am__objects_104)
+lib1541_OBJECTS = $(am_lib1541_OBJECTS)
+lib1541_DEPENDENCIES = $(am__DEPENDENCIES_1)
+am__objects_105 = lib1550-first.$(OBJEXT)
+am_lib1550_OBJECTS = lib1550-lib1550.$(OBJEXT) $(am__objects_105)
 lib1550_OBJECTS = $(am_lib1550_OBJECTS)
 lib1550_LDADD = $(LDADD)
 lib1550_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_101 = lib1551-first.$(OBJEXT)
-am_lib1551_OBJECTS = lib1551-lib1551.$(OBJEXT) $(am__objects_101)
+am__objects_106 = lib1551-first.$(OBJEXT)
+am_lib1551_OBJECTS = lib1551-lib1551.$(OBJEXT) $(am__objects_106)
 lib1551_OBJECTS = $(am_lib1551_OBJECTS)
 lib1551_LDADD = $(LDADD)
 lib1551_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_102 = lib1552-first.$(OBJEXT)
-am__objects_103 = lib1552-testutil.$(OBJEXT)
-am_lib1552_OBJECTS = lib1552-lib1552.$(OBJEXT) $(am__objects_102) \
-       $(am__objects_103)
+am__objects_107 = lib1552-first.$(OBJEXT)
+am__objects_108 = lib1552-testutil.$(OBJEXT)
+am_lib1552_OBJECTS = lib1552-lib1552.$(OBJEXT) $(am__objects_107) \
+       $(am__objects_108)
 lib1552_OBJECTS = $(am_lib1552_OBJECTS)
 lib1552_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_104 = lib1553-first.$(OBJEXT)
-am__objects_105 = lib1553-testutil.$(OBJEXT)
-am_lib1553_OBJECTS = lib1553-lib1553.$(OBJEXT) $(am__objects_104) \
-       $(am__objects_105)
+am__objects_109 = lib1553-first.$(OBJEXT)
+am__objects_110 = lib1553-testutil.$(OBJEXT)
+am_lib1553_OBJECTS = lib1553-lib1553.$(OBJEXT) $(am__objects_109) \
+       $(am__objects_110)
 lib1553_OBJECTS = $(am_lib1553_OBJECTS)
 lib1553_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_106 = lib1554-first.$(OBJEXT)
-am_lib1554_OBJECTS = lib1554-lib1554.$(OBJEXT) $(am__objects_106)
+am__objects_111 = lib1554-first.$(OBJEXT)
+am_lib1554_OBJECTS = lib1554-lib1554.$(OBJEXT) $(am__objects_111)
 lib1554_OBJECTS = $(am_lib1554_OBJECTS)
 lib1554_LDADD = $(LDADD)
 lib1554_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_107 = lib1555-first.$(OBJEXT)
-am__objects_108 = lib1555-testutil.$(OBJEXT)
-am__objects_109 = ../../lib/lib1555-warnless.$(OBJEXT)
-am_lib1555_OBJECTS = lib1555-lib1555.$(OBJEXT) $(am__objects_107) \
-       $(am__objects_108) $(am__objects_109)
+am__objects_112 = lib1555-first.$(OBJEXT)
+am__objects_113 = lib1555-testutil.$(OBJEXT)
+am__objects_114 = ../../lib/lib1555-warnless.$(OBJEXT)
+am_lib1555_OBJECTS = lib1555-lib1555.$(OBJEXT) $(am__objects_112) \
+       $(am__objects_113) $(am__objects_114)
 lib1555_OBJECTS = $(am_lib1555_OBJECTS)
 lib1555_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_110 = lib1556-first.$(OBJEXT)
-am__objects_111 = lib1556-testutil.$(OBJEXT)
-am__objects_112 = ../../lib/lib1556-warnless.$(OBJEXT)
-am_lib1556_OBJECTS = lib1556-lib1556.$(OBJEXT) $(am__objects_110) \
-       $(am__objects_111) $(am__objects_112)
+am__objects_115 = lib1556-first.$(OBJEXT)
+am__objects_116 = lib1556-testutil.$(OBJEXT)
+am__objects_117 = ../../lib/lib1556-warnless.$(OBJEXT)
+am_lib1556_OBJECTS = lib1556-lib1556.$(OBJEXT) $(am__objects_115) \
+       $(am__objects_116) $(am__objects_117)
 lib1556_OBJECTS = $(am_lib1556_OBJECTS)
 lib1556_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_113 = lib1557-first.$(OBJEXT)
-am__objects_114 = lib1557-testutil.$(OBJEXT)
-am__objects_115 = ../../lib/lib1557-warnless.$(OBJEXT)
-am_lib1557_OBJECTS = lib1557-lib1557.$(OBJEXT) $(am__objects_113) \
-       $(am__objects_114) $(am__objects_115)
+am__objects_118 = lib1557-first.$(OBJEXT)
+am__objects_119 = lib1557-testutil.$(OBJEXT)
+am__objects_120 = ../../lib/lib1557-warnless.$(OBJEXT)
+am_lib1557_OBJECTS = lib1557-lib1557.$(OBJEXT) $(am__objects_118) \
+       $(am__objects_119) $(am__objects_120)
 lib1557_OBJECTS = $(am_lib1557_OBJECTS)
 lib1557_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_116 = first.$(OBJEXT)
-am__objects_117 = testutil.$(OBJEXT)
-am__objects_118 = ../../lib/warnless.$(OBJEXT)
-am_lib1560_OBJECTS = lib1560.$(OBJEXT) $(am__objects_116) \
-       $(am__objects_117) $(am__objects_118)
+am__objects_121 = first.$(OBJEXT)
+am__objects_122 = testutil.$(OBJEXT)
+am__objects_123 = ../../lib/warnless.$(OBJEXT)
+am_lib1558_OBJECTS = lib1558.$(OBJEXT) $(am__objects_121) \
+       $(am__objects_122) $(am__objects_123)
+lib1558_OBJECTS = $(am_lib1558_OBJECTS)
+lib1558_DEPENDENCIES = $(am__DEPENDENCIES_1)
+am_lib1559_OBJECTS = lib1559.$(OBJEXT) $(am__objects_121) \
+       $(am__objects_122) $(am__objects_123)
+lib1559_OBJECTS = $(am_lib1559_OBJECTS)
+lib1559_DEPENDENCIES = $(am__DEPENDENCIES_1)
+am_lib1560_OBJECTS = lib1560.$(OBJEXT) $(am__objects_121) \
+       $(am__objects_122) $(am__objects_123)
 lib1560_OBJECTS = $(am_lib1560_OBJECTS)
 lib1560_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_119 = lib1900-first.$(OBJEXT)
-am__objects_120 = lib1900-testutil.$(OBJEXT)
-am__objects_121 = ../../lib/lib1900-warnless.$(OBJEXT)
-am_lib1900_OBJECTS = lib1900-lib1900.$(OBJEXT) $(am__objects_119) \
-       $(am__objects_120) $(am__objects_121)
+am__objects_124 = lib1564-first.$(OBJEXT)
+am__objects_125 = lib1564-testutil.$(OBJEXT)
+am__objects_126 = ../../lib/lib1564-warnless.$(OBJEXT)
+am_lib1564_OBJECTS = lib1564-lib1564.$(OBJEXT) $(am__objects_124) \
+       $(am__objects_125) $(am__objects_126)
+lib1564_OBJECTS = $(am_lib1564_OBJECTS)
+lib1564_DEPENDENCIES = $(am__DEPENDENCIES_1)
+am__objects_127 = lib1565-first.$(OBJEXT)
+am__objects_128 = lib1565-testutil.$(OBJEXT)
+am__objects_129 = ../../lib/lib1565-warnless.$(OBJEXT)
+am_lib1565_OBJECTS = lib1565-lib1565.$(OBJEXT) $(am__objects_127) \
+       $(am__objects_128) $(am__objects_129)
+lib1565_OBJECTS = $(am_lib1565_OBJECTS)
+lib1565_DEPENDENCIES = $(am__DEPENDENCIES_1)
+am__objects_130 = lib1591-first.$(OBJEXT)
+am__objects_131 = lib1591-testutil.$(OBJEXT)
+am__objects_132 = ../../lib/lib1591-warnless.$(OBJEXT)
+am_lib1591_OBJECTS = lib1591-lib1591.$(OBJEXT) $(am__objects_130) \
+       $(am__objects_131) $(am__objects_132)
+lib1591_OBJECTS = $(am_lib1591_OBJECTS)
+lib1591_DEPENDENCIES = $(am__DEPENDENCIES_1)
+am__objects_133 = lib1592-first.$(OBJEXT)
+am__objects_134 = lib1592-testutil.$(OBJEXT)
+am__objects_135 = ../../lib/lib1592-warnless.$(OBJEXT)
+am_lib1592_OBJECTS = lib1592-lib1592.$(OBJEXT) $(am__objects_133) \
+       $(am__objects_134) $(am__objects_135)
+lib1592_OBJECTS = $(am_lib1592_OBJECTS)
+lib1592_DEPENDENCIES = $(am__DEPENDENCIES_1)
+am_lib1593_OBJECTS = lib1593.$(OBJEXT) $(am__objects_121) \
+       $(am__objects_122) $(am__objects_123)
+lib1593_OBJECTS = $(am_lib1593_OBJECTS)
+lib1593_DEPENDENCIES = $(am__DEPENDENCIES_1)
+am_lib1594_OBJECTS = lib1594.$(OBJEXT) $(am__objects_121) \
+       $(am__objects_122) $(am__objects_123)
+lib1594_OBJECTS = $(am_lib1594_OBJECTS)
+lib1594_DEPENDENCIES = $(am__DEPENDENCIES_1)
+am__objects_136 = lib1596-first.$(OBJEXT)
+am__objects_137 = lib1596-testutil.$(OBJEXT)
+am__objects_138 = ../../lib/lib1596-warnless.$(OBJEXT)
+am_lib1596_OBJECTS = lib1596-lib1594.$(OBJEXT) $(am__objects_136) \
+       $(am__objects_137) $(am__objects_138)
+lib1596_OBJECTS = $(am_lib1596_OBJECTS)
+lib1596_DEPENDENCIES = $(am__DEPENDENCIES_1)
+am__objects_139 = lib1900-first.$(OBJEXT)
+am__objects_140 = lib1900-testutil.$(OBJEXT)
+am__objects_141 = ../../lib/lib1900-warnless.$(OBJEXT)
+am_lib1900_OBJECTS = lib1900-lib1900.$(OBJEXT) $(am__objects_139) \
+       $(am__objects_140) $(am__objects_141)
 lib1900_OBJECTS = $(am_lib1900_OBJECTS)
 lib1900_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_122 = lib2033-first.$(OBJEXT)
-am__objects_123 = lib2033-testutil.$(OBJEXT)
-am__objects_124 = ../../lib/lib2033-warnless.$(OBJEXT)
+am__objects_142 = lib1905-first.$(OBJEXT)
+am__objects_143 = lib1905-testutil.$(OBJEXT)
+am__objects_144 = ../../lib/lib1905-warnless.$(OBJEXT)
+am_lib1905_OBJECTS = lib1905-lib1905.$(OBJEXT) $(am__objects_142) \
+       $(am__objects_143) $(am__objects_144)
+lib1905_OBJECTS = $(am_lib1905_OBJECTS)
+lib1905_DEPENDENCIES = $(am__DEPENDENCIES_1)
+am__objects_145 = lib1906-first.$(OBJEXT)
+am__objects_146 = lib1906-testutil.$(OBJEXT)
+am__objects_147 = ../../lib/lib1906-warnless.$(OBJEXT)
+am_lib1906_OBJECTS = lib1906-lib1906.$(OBJEXT) $(am__objects_145) \
+       $(am__objects_146) $(am__objects_147)
+lib1906_OBJECTS = $(am_lib1906_OBJECTS)
+lib1906_DEPENDENCIES = $(am__DEPENDENCIES_1)
+am__objects_148 = lib1907-first.$(OBJEXT)
+am__objects_149 = lib1907-testutil.$(OBJEXT)
+am__objects_150 = ../../lib/lib1907-warnless.$(OBJEXT)
+am_lib1907_OBJECTS = lib1907-lib1907.$(OBJEXT) $(am__objects_148) \
+       $(am__objects_149) $(am__objects_150)
+lib1907_OBJECTS = $(am_lib1907_OBJECTS)
+lib1907_DEPENDENCIES = $(am__DEPENDENCIES_1)
+am__objects_151 = lib2033-first.$(OBJEXT)
+am__objects_152 = lib2033-testutil.$(OBJEXT)
+am__objects_153 = ../../lib/lib2033-warnless.$(OBJEXT)
 am_lib2033_OBJECTS = lib2033-libntlmconnect.$(OBJEXT) \
-       $(am__objects_122) $(am__objects_123) $(am__objects_124)
+       $(am__objects_151) $(am__objects_152) $(am__objects_153)
 lib2033_OBJECTS = $(am_lib2033_OBJECTS)
 lib2033_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_125 = lib500-first.$(OBJEXT)
-am__objects_126 = lib500-testutil.$(OBJEXT)
-am__objects_127 = lib500-testtrace.$(OBJEXT)
-am_lib500_OBJECTS = lib500-lib500.$(OBJEXT) $(am__objects_125) \
-       $(am__objects_126) $(am__objects_127)
+am__objects_154 = lib500-first.$(OBJEXT)
+am__objects_155 = lib500-testutil.$(OBJEXT)
+am__objects_156 = lib500-testtrace.$(OBJEXT)
+am_lib500_OBJECTS = lib500-lib500.$(OBJEXT) $(am__objects_154) \
+       $(am__objects_155) $(am__objects_156)
 lib500_OBJECTS = $(am_lib500_OBJECTS)
 lib500_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_128 = lib501-first.$(OBJEXT)
-am_lib501_OBJECTS = lib501-lib501.$(OBJEXT) $(am__objects_128)
+am__objects_157 = lib501-first.$(OBJEXT)
+am_lib501_OBJECTS = lib501-lib501.$(OBJEXT) $(am__objects_157)
 lib501_OBJECTS = $(am_lib501_OBJECTS)
 lib501_LDADD = $(LDADD)
 lib501_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_129 = lib502-first.$(OBJEXT)
-am__objects_130 = lib502-testutil.$(OBJEXT)
-am__objects_131 = ../../lib/lib502-warnless.$(OBJEXT)
-am_lib502_OBJECTS = lib502-lib502.$(OBJEXT) $(am__objects_129) \
-       $(am__objects_130) $(am__objects_131)
+am__objects_158 = lib502-first.$(OBJEXT)
+am__objects_159 = lib502-testutil.$(OBJEXT)
+am__objects_160 = ../../lib/lib502-warnless.$(OBJEXT)
+am_lib502_OBJECTS = lib502-lib502.$(OBJEXT) $(am__objects_158) \
+       $(am__objects_159) $(am__objects_160)
 lib502_OBJECTS = $(am_lib502_OBJECTS)
 lib502_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_132 = lib503-first.$(OBJEXT)
-am__objects_133 = lib503-testutil.$(OBJEXT)
-am__objects_134 = ../../lib/lib503-warnless.$(OBJEXT)
-am_lib503_OBJECTS = lib503-lib503.$(OBJEXT) $(am__objects_132) \
-       $(am__objects_133) $(am__objects_134)
+am__objects_161 = lib503-first.$(OBJEXT)
+am__objects_162 = lib503-testutil.$(OBJEXT)
+am__objects_163 = ../../lib/lib503-warnless.$(OBJEXT)
+am_lib503_OBJECTS = lib503-lib503.$(OBJEXT) $(am__objects_161) \
+       $(am__objects_162) $(am__objects_163)
 lib503_OBJECTS = $(am_lib503_OBJECTS)
 lib503_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_135 = lib504-first.$(OBJEXT)
-am__objects_136 = lib504-testutil.$(OBJEXT)
-am__objects_137 = ../../lib/lib504-warnless.$(OBJEXT)
-am_lib504_OBJECTS = lib504-lib504.$(OBJEXT) $(am__objects_135) \
-       $(am__objects_136) $(am__objects_137)
+am__objects_164 = lib504-first.$(OBJEXT)
+am__objects_165 = lib504-testutil.$(OBJEXT)
+am__objects_166 = ../../lib/lib504-warnless.$(OBJEXT)
+am_lib504_OBJECTS = lib504-lib504.$(OBJEXT) $(am__objects_164) \
+       $(am__objects_165) $(am__objects_166)
 lib504_OBJECTS = $(am_lib504_OBJECTS)
 lib504_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_138 = lib505-first.$(OBJEXT)
-am_lib505_OBJECTS = lib505-lib505.$(OBJEXT) $(am__objects_138)
+am__objects_167 = lib505-first.$(OBJEXT)
+am_lib505_OBJECTS = lib505-lib505.$(OBJEXT) $(am__objects_167)
 lib505_OBJECTS = $(am_lib505_OBJECTS)
 lib505_LDADD = $(LDADD)
 lib505_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_139 = lib506-first.$(OBJEXT)
-am_lib506_OBJECTS = lib506-lib506.$(OBJEXT) $(am__objects_139)
+am__objects_168 = lib506-first.$(OBJEXT)
+am_lib506_OBJECTS = lib506-lib506.$(OBJEXT) $(am__objects_168)
 lib506_OBJECTS = $(am_lib506_OBJECTS)
 lib506_LDADD = $(LDADD)
 lib506_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_140 = lib507-first.$(OBJEXT)
-am__objects_141 = lib507-testutil.$(OBJEXT)
-am__objects_142 = ../../lib/lib507-warnless.$(OBJEXT)
-am_lib507_OBJECTS = lib507-lib507.$(OBJEXT) $(am__objects_140) \
-       $(am__objects_141) $(am__objects_142)
+am__objects_169 = lib507-first.$(OBJEXT)
+am__objects_170 = lib507-testutil.$(OBJEXT)
+am__objects_171 = ../../lib/lib507-warnless.$(OBJEXT)
+am_lib507_OBJECTS = lib507-lib507.$(OBJEXT) $(am__objects_169) \
+       $(am__objects_170) $(am__objects_171)
 lib507_OBJECTS = $(am_lib507_OBJECTS)
 lib507_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_143 = lib508-first.$(OBJEXT)
-am_lib508_OBJECTS = lib508-lib508.$(OBJEXT) $(am__objects_143)
+am__objects_172 = lib508-first.$(OBJEXT)
+am_lib508_OBJECTS = lib508-lib508.$(OBJEXT) $(am__objects_172)
 lib508_OBJECTS = $(am_lib508_OBJECTS)
 lib508_LDADD = $(LDADD)
 lib508_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_144 = lib509-first.$(OBJEXT)
-am_lib509_OBJECTS = lib509-lib509.$(OBJEXT) $(am__objects_144)
+am__objects_173 = lib509-first.$(OBJEXT)
+am_lib509_OBJECTS = lib509-lib509.$(OBJEXT) $(am__objects_173)
 lib509_OBJECTS = $(am_lib509_OBJECTS)
 lib509_LDADD = $(LDADD)
 lib509_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_145 = lib510-first.$(OBJEXT)
-am_lib510_OBJECTS = lib510-lib510.$(OBJEXT) $(am__objects_145)
+am__objects_174 = lib510-first.$(OBJEXT)
+am_lib510_OBJECTS = lib510-lib510.$(OBJEXT) $(am__objects_174)
 lib510_OBJECTS = $(am_lib510_OBJECTS)
 lib510_LDADD = $(LDADD)
 lib510_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_146 = lib511-first.$(OBJEXT)
-am_lib511_OBJECTS = lib511-lib511.$(OBJEXT) $(am__objects_146)
+am__objects_175 = lib511-first.$(OBJEXT)
+am_lib511_OBJECTS = lib511-lib511.$(OBJEXT) $(am__objects_175)
 lib511_OBJECTS = $(am_lib511_OBJECTS)
 lib511_LDADD = $(LDADD)
 lib511_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_147 = lib512-first.$(OBJEXT)
-am_lib512_OBJECTS = lib512-lib512.$(OBJEXT) $(am__objects_147)
+am__objects_176 = lib512-first.$(OBJEXT)
+am_lib512_OBJECTS = lib512-lib512.$(OBJEXT) $(am__objects_176)
 lib512_OBJECTS = $(am_lib512_OBJECTS)
 lib512_LDADD = $(LDADD)
 lib512_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_148 = lib513-first.$(OBJEXT)
-am_lib513_OBJECTS = lib513-lib513.$(OBJEXT) $(am__objects_148)
+am__objects_177 = lib513-first.$(OBJEXT)
+am_lib513_OBJECTS = lib513-lib513.$(OBJEXT) $(am__objects_177)
 lib513_OBJECTS = $(am_lib513_OBJECTS)
 lib513_LDADD = $(LDADD)
 lib513_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_149 = lib514-first.$(OBJEXT)
-am_lib514_OBJECTS = lib514-lib514.$(OBJEXT) $(am__objects_149)
+am__objects_178 = lib514-first.$(OBJEXT)
+am_lib514_OBJECTS = lib514-lib514.$(OBJEXT) $(am__objects_178)
 lib514_OBJECTS = $(am_lib514_OBJECTS)
 lib514_LDADD = $(LDADD)
 lib514_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_150 = lib515-first.$(OBJEXT)
-am_lib515_OBJECTS = lib515-lib515.$(OBJEXT) $(am__objects_150)
+am__objects_179 = lib515-first.$(OBJEXT)
+am_lib515_OBJECTS = lib515-lib515.$(OBJEXT) $(am__objects_179)
 lib515_OBJECTS = $(am_lib515_OBJECTS)
 lib515_LDADD = $(LDADD)
 lib515_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_151 = lib516-first.$(OBJEXT)
-am_lib516_OBJECTS = lib516-lib516.$(OBJEXT) $(am__objects_151)
+am__objects_180 = lib516-first.$(OBJEXT)
+am_lib516_OBJECTS = lib516-lib516.$(OBJEXT) $(am__objects_180)
 lib516_OBJECTS = $(am_lib516_OBJECTS)
 lib516_LDADD = $(LDADD)
 lib516_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_152 = lib517-first.$(OBJEXT)
-am_lib517_OBJECTS = lib517-lib517.$(OBJEXT) $(am__objects_152)
+am__objects_181 = lib517-first.$(OBJEXT)
+am_lib517_OBJECTS = lib517-lib517.$(OBJEXT) $(am__objects_181)
 lib517_OBJECTS = $(am_lib517_OBJECTS)
 lib517_LDADD = $(LDADD)
 lib517_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_153 = lib518-first.$(OBJEXT)
-am__objects_154 = ../../lib/lib518-warnless.$(OBJEXT)
-am_lib518_OBJECTS = lib518-lib518.$(OBJEXT) $(am__objects_153) \
-       $(am__objects_154)
+am__objects_182 = lib518-first.$(OBJEXT)
+am__objects_183 = ../../lib/lib518-warnless.$(OBJEXT)
+am_lib518_OBJECTS = lib518-lib518.$(OBJEXT) $(am__objects_182) \
+       $(am__objects_183)
 lib518_OBJECTS = $(am_lib518_OBJECTS)
 lib518_LDADD = $(LDADD)
 lib518_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_155 = lib519-first.$(OBJEXT)
-am_lib519_OBJECTS = lib519-lib519.$(OBJEXT) $(am__objects_155)
+am__objects_184 = lib519-first.$(OBJEXT)
+am_lib519_OBJECTS = lib519-lib519.$(OBJEXT) $(am__objects_184)
 lib519_OBJECTS = $(am_lib519_OBJECTS)
 lib519_LDADD = $(LDADD)
 lib519_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_156 = lib520-first.$(OBJEXT)
-am_lib520_OBJECTS = lib520-lib520.$(OBJEXT) $(am__objects_156)
+am__objects_185 = lib520-first.$(OBJEXT)
+am_lib520_OBJECTS = lib520-lib520.$(OBJEXT) $(am__objects_185)
 lib520_OBJECTS = $(am_lib520_OBJECTS)
 lib520_LDADD = $(LDADD)
 lib520_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_157 = lib521-first.$(OBJEXT)
-am_lib521_OBJECTS = lib521-lib521.$(OBJEXT) $(am__objects_157)
+am__objects_186 = lib521-first.$(OBJEXT)
+am_lib521_OBJECTS = lib521-lib521.$(OBJEXT) $(am__objects_186)
 lib521_OBJECTS = $(am_lib521_OBJECTS)
 lib521_LDADD = $(LDADD)
 lib521_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_158 = lib523-first.$(OBJEXT)
-am_lib523_OBJECTS = lib523-lib523.$(OBJEXT) $(am__objects_158)
+am__objects_187 = lib523-first.$(OBJEXT)
+am_lib523_OBJECTS = lib523-lib523.$(OBJEXT) $(am__objects_187)
 lib523_OBJECTS = $(am_lib523_OBJECTS)
 lib523_LDADD = $(LDADD)
 lib523_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_159 = lib524-first.$(OBJEXT)
-am_lib524_OBJECTS = lib524-lib524.$(OBJEXT) $(am__objects_159)
+am__objects_188 = lib524-first.$(OBJEXT)
+am_lib524_OBJECTS = lib524-lib524.$(OBJEXT) $(am__objects_188)
 lib524_OBJECTS = $(am_lib524_OBJECTS)
 lib524_LDADD = $(LDADD)
 lib524_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_160 = lib525-first.$(OBJEXT)
-am__objects_161 = lib525-testutil.$(OBJEXT)
-am__objects_162 = ../../lib/lib525-warnless.$(OBJEXT)
-am_lib525_OBJECTS = lib525-lib525.$(OBJEXT) $(am__objects_160) \
-       $(am__objects_161) $(am__objects_162)
+am__objects_189 = lib525-first.$(OBJEXT)
+am__objects_190 = lib525-testutil.$(OBJEXT)
+am__objects_191 = ../../lib/lib525-warnless.$(OBJEXT)
+am_lib525_OBJECTS = lib525-lib525.$(OBJEXT) $(am__objects_189) \
+       $(am__objects_190) $(am__objects_191)
 lib525_OBJECTS = $(am_lib525_OBJECTS)
 lib525_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_163 = lib526-first.$(OBJEXT)
-am__objects_164 = lib526-testutil.$(OBJEXT)
-am__objects_165 = ../../lib/lib526-warnless.$(OBJEXT)
-am_lib526_OBJECTS = lib526-lib526.$(OBJEXT) $(am__objects_163) \
-       $(am__objects_164) $(am__objects_165)
+am__objects_192 = lib526-first.$(OBJEXT)
+am__objects_193 = lib526-testutil.$(OBJEXT)
+am__objects_194 = ../../lib/lib526-warnless.$(OBJEXT)
+am_lib526_OBJECTS = lib526-lib526.$(OBJEXT) $(am__objects_192) \
+       $(am__objects_193) $(am__objects_194)
 lib526_OBJECTS = $(am_lib526_OBJECTS)
 lib526_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_166 = lib527-first.$(OBJEXT)
-am__objects_167 = lib527-testutil.$(OBJEXT)
-am__objects_168 = ../../lib/lib527-warnless.$(OBJEXT)
-am_lib527_OBJECTS = lib527-lib526.$(OBJEXT) $(am__objects_166) \
-       $(am__objects_167) $(am__objects_168)
+am__objects_195 = lib527-first.$(OBJEXT)
+am__objects_196 = lib527-testutil.$(OBJEXT)
+am__objects_197 = ../../lib/lib527-warnless.$(OBJEXT)
+am_lib527_OBJECTS = lib527-lib526.$(OBJEXT) $(am__objects_195) \
+       $(am__objects_196) $(am__objects_197)
 lib527_OBJECTS = $(am_lib527_OBJECTS)
 lib527_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_169 = lib529-first.$(OBJEXT)
-am__objects_170 = lib529-testutil.$(OBJEXT)
-am__objects_171 = ../../lib/lib529-warnless.$(OBJEXT)
-am_lib529_OBJECTS = lib529-lib525.$(OBJEXT) $(am__objects_169) \
-       $(am__objects_170) $(am__objects_171)
+am__objects_198 = lib529-first.$(OBJEXT)
+am__objects_199 = lib529-testutil.$(OBJEXT)
+am__objects_200 = ../../lib/lib529-warnless.$(OBJEXT)
+am_lib529_OBJECTS = lib529-lib525.$(OBJEXT) $(am__objects_198) \
+       $(am__objects_199) $(am__objects_200)
 lib529_OBJECTS = $(am_lib529_OBJECTS)
 lib529_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_172 = lib530-first.$(OBJEXT)
-am__objects_173 = lib530-testutil.$(OBJEXT)
-am__objects_174 = ../../lib/lib530-warnless.$(OBJEXT)
-am_lib530_OBJECTS = lib530-lib530.$(OBJEXT) $(am__objects_172) \
-       $(am__objects_173) $(am__objects_174)
+am__objects_201 = lib530-first.$(OBJEXT)
+am__objects_202 = lib530-testutil.$(OBJEXT)
+am__objects_203 = ../../lib/lib530-warnless.$(OBJEXT)
+am_lib530_OBJECTS = lib530-lib530.$(OBJEXT) $(am__objects_201) \
+       $(am__objects_202) $(am__objects_203)
 lib530_OBJECTS = $(am_lib530_OBJECTS)
 lib530_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_175 = lib532-first.$(OBJEXT)
-am__objects_176 = lib532-testutil.$(OBJEXT)
-am__objects_177 = ../../lib/lib532-warnless.$(OBJEXT)
-am_lib532_OBJECTS = lib532-lib526.$(OBJEXT) $(am__objects_175) \
-       $(am__objects_176) $(am__objects_177)
+am__objects_204 = lib532-first.$(OBJEXT)
+am__objects_205 = lib532-testutil.$(OBJEXT)
+am__objects_206 = ../../lib/lib532-warnless.$(OBJEXT)
+am_lib532_OBJECTS = lib532-lib526.$(OBJEXT) $(am__objects_204) \
+       $(am__objects_205) $(am__objects_206)
 lib532_OBJECTS = $(am_lib532_OBJECTS)
 lib532_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_178 = lib533-first.$(OBJEXT)
-am__objects_179 = lib533-testutil.$(OBJEXT)
-am__objects_180 = ../../lib/lib533-warnless.$(OBJEXT)
-am_lib533_OBJECTS = lib533-lib533.$(OBJEXT) $(am__objects_178) \
-       $(am__objects_179) $(am__objects_180)
+am__objects_207 = lib533-first.$(OBJEXT)
+am__objects_208 = lib533-testutil.$(OBJEXT)
+am__objects_209 = ../../lib/lib533-warnless.$(OBJEXT)
+am_lib533_OBJECTS = lib533-lib533.$(OBJEXT) $(am__objects_207) \
+       $(am__objects_208) $(am__objects_209)
 lib533_OBJECTS = $(am_lib533_OBJECTS)
 lib533_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_181 = lib536-first.$(OBJEXT)
-am__objects_182 = lib536-testutil.$(OBJEXT)
-am__objects_183 = ../../lib/lib536-warnless.$(OBJEXT)
-am_lib536_OBJECTS = lib536-lib536.$(OBJEXT) $(am__objects_181) \
-       $(am__objects_182) $(am__objects_183)
-lib536_OBJECTS = $(am_lib536_OBJECTS)
-lib536_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_184 = lib537-first.$(OBJEXT)
-am__objects_185 = ../../lib/lib537-warnless.$(OBJEXT)
-am_lib537_OBJECTS = lib537-lib537.$(OBJEXT) $(am__objects_184) \
-       $(am__objects_185)
+am__objects_210 = lib537-first.$(OBJEXT)
+am__objects_211 = ../../lib/lib537-warnless.$(OBJEXT)
+am_lib537_OBJECTS = lib537-lib537.$(OBJEXT) $(am__objects_210) \
+       $(am__objects_211)
 lib537_OBJECTS = $(am_lib537_OBJECTS)
 lib537_LDADD = $(LDADD)
 lib537_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_186 = lib539-first.$(OBJEXT)
-am_lib539_OBJECTS = lib539-lib539.$(OBJEXT) $(am__objects_186)
+am__objects_212 = lib539-first.$(OBJEXT)
+am_lib539_OBJECTS = lib539-lib539.$(OBJEXT) $(am__objects_212)
 lib539_OBJECTS = $(am_lib539_OBJECTS)
 lib539_LDADD = $(LDADD)
 lib539_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_187 = lib540-first.$(OBJEXT)
-am__objects_188 = lib540-testutil.$(OBJEXT)
-am__objects_189 = ../../lib/lib540-warnless.$(OBJEXT)
-am_lib540_OBJECTS = lib540-lib540.$(OBJEXT) $(am__objects_187) \
-       $(am__objects_188) $(am__objects_189)
+am__objects_213 = lib540-first.$(OBJEXT)
+am__objects_214 = lib540-testutil.$(OBJEXT)
+am__objects_215 = ../../lib/lib540-warnless.$(OBJEXT)
+am_lib540_OBJECTS = lib540-lib540.$(OBJEXT) $(am__objects_213) \
+       $(am__objects_214) $(am__objects_215)
 lib540_OBJECTS = $(am_lib540_OBJECTS)
 lib540_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_190 = lib541-first.$(OBJEXT)
-am_lib541_OBJECTS = lib541-lib541.$(OBJEXT) $(am__objects_190)
+am__objects_216 = lib541-first.$(OBJEXT)
+am_lib541_OBJECTS = lib541-lib541.$(OBJEXT) $(am__objects_216)
 lib541_OBJECTS = $(am_lib541_OBJECTS)
 lib541_LDADD = $(LDADD)
 lib541_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_191 = lib542-first.$(OBJEXT)
-am_lib542_OBJECTS = lib542-lib542.$(OBJEXT) $(am__objects_191)
+am__objects_217 = lib542-first.$(OBJEXT)
+am_lib542_OBJECTS = lib542-lib542.$(OBJEXT) $(am__objects_217)
 lib542_OBJECTS = $(am_lib542_OBJECTS)
 lib542_LDADD = $(LDADD)
 lib542_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_192 = lib543-first.$(OBJEXT)
-am_lib543_OBJECTS = lib543-lib543.$(OBJEXT) $(am__objects_192)
+am__objects_218 = lib543-first.$(OBJEXT)
+am_lib543_OBJECTS = lib543-lib543.$(OBJEXT) $(am__objects_218)
 lib543_OBJECTS = $(am_lib543_OBJECTS)
 lib543_LDADD = $(LDADD)
 lib543_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_193 = lib544-first.$(OBJEXT)
-am_lib544_OBJECTS = lib544-lib544.$(OBJEXT) $(am__objects_193)
+am__objects_219 = lib544-first.$(OBJEXT)
+am_lib544_OBJECTS = lib544-lib544.$(OBJEXT) $(am__objects_219)
 lib544_OBJECTS = $(am_lib544_OBJECTS)
 lib544_LDADD = $(LDADD)
 lib544_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_194 = lib545-first.$(OBJEXT)
-am_lib545_OBJECTS = lib545-lib544.$(OBJEXT) $(am__objects_194)
+am__objects_220 = lib545-first.$(OBJEXT)
+am_lib545_OBJECTS = lib545-lib544.$(OBJEXT) $(am__objects_220)
 lib545_OBJECTS = $(am_lib545_OBJECTS)
 lib545_LDADD = $(LDADD)
 lib545_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_195 = lib547-first.$(OBJEXT)
-am_lib547_OBJECTS = lib547-lib547.$(OBJEXT) $(am__objects_195)
+am__objects_221 = lib547-first.$(OBJEXT)
+am_lib547_OBJECTS = lib547-lib547.$(OBJEXT) $(am__objects_221)
 lib547_OBJECTS = $(am_lib547_OBJECTS)
 lib547_LDADD = $(LDADD)
 lib547_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_196 = lib548-first.$(OBJEXT)
-am_lib548_OBJECTS = lib548-lib547.$(OBJEXT) $(am__objects_196)
+am__objects_222 = lib548-first.$(OBJEXT)
+am_lib548_OBJECTS = lib548-lib547.$(OBJEXT) $(am__objects_222)
 lib548_OBJECTS = $(am_lib548_OBJECTS)
 lib548_LDADD = $(LDADD)
 lib548_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_197 = lib549-first.$(OBJEXT)
-am_lib549_OBJECTS = lib549-lib549.$(OBJEXT) $(am__objects_197)
+am__objects_223 = lib549-first.$(OBJEXT)
+am_lib549_OBJECTS = lib549-lib549.$(OBJEXT) $(am__objects_223)
 lib549_OBJECTS = $(am_lib549_OBJECTS)
 lib549_LDADD = $(LDADD)
 lib549_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_198 = lib552-first.$(OBJEXT)
-am__objects_199 = ../../lib/lib552-warnless.$(OBJEXT)
-am_lib552_OBJECTS = lib552-lib552.$(OBJEXT) $(am__objects_198) \
-       $(am__objects_199)
+am__objects_224 = lib552-first.$(OBJEXT)
+am__objects_225 = ../../lib/lib552-warnless.$(OBJEXT)
+am_lib552_OBJECTS = lib552-lib552.$(OBJEXT) $(am__objects_224) \
+       $(am__objects_225)
 lib552_OBJECTS = $(am_lib552_OBJECTS)
 lib552_LDADD = $(LDADD)
 lib552_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_200 = lib553-first.$(OBJEXT)
-am_lib553_OBJECTS = lib553-lib553.$(OBJEXT) $(am__objects_200)
+am__objects_226 = lib553-first.$(OBJEXT)
+am_lib553_OBJECTS = lib553-lib553.$(OBJEXT) $(am__objects_226)
 lib553_OBJECTS = $(am_lib553_OBJECTS)
 lib553_LDADD = $(LDADD)
 lib553_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_201 = lib554-first.$(OBJEXT)
-am_lib554_OBJECTS = lib554-lib554.$(OBJEXT) $(am__objects_201)
+am__objects_227 = lib554-first.$(OBJEXT)
+am_lib554_OBJECTS = lib554-lib554.$(OBJEXT) $(am__objects_227)
 lib554_OBJECTS = $(am_lib554_OBJECTS)
 lib554_LDADD = $(LDADD)
 lib554_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_202 = lib555-first.$(OBJEXT)
-am__objects_203 = lib555-testutil.$(OBJEXT)
-am__objects_204 = ../../lib/lib555-warnless.$(OBJEXT)
-am_lib555_OBJECTS = lib555-lib555.$(OBJEXT) $(am__objects_202) \
-       $(am__objects_203) $(am__objects_204)
+am__objects_228 = lib555-first.$(OBJEXT)
+am__objects_229 = lib555-testutil.$(OBJEXT)
+am__objects_230 = ../../lib/lib555-warnless.$(OBJEXT)
+am_lib555_OBJECTS = lib555-lib555.$(OBJEXT) $(am__objects_228) \
+       $(am__objects_229) $(am__objects_230)
 lib555_OBJECTS = $(am_lib555_OBJECTS)
 lib555_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_205 = lib556-first.$(OBJEXT)
-am__objects_206 = ../../lib/lib556-warnless.$(OBJEXT)
-am_lib556_OBJECTS = lib556-lib556.$(OBJEXT) $(am__objects_205) \
-       $(am__objects_206)
+am__objects_231 = lib556-first.$(OBJEXT)
+am__objects_232 = ../../lib/lib556-warnless.$(OBJEXT)
+am_lib556_OBJECTS = lib556-lib556.$(OBJEXT) $(am__objects_231) \
+       $(am__objects_232)
 lib556_OBJECTS = $(am_lib556_OBJECTS)
 lib556_LDADD = $(LDADD)
 lib556_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_207 = lib557-first.$(OBJEXT)
-am_lib557_OBJECTS = lib557-lib557.$(OBJEXT) $(am__objects_207)
+am__objects_233 = lib557-first.$(OBJEXT)
+am_lib557_OBJECTS = lib557-lib557.$(OBJEXT) $(am__objects_233)
 lib557_OBJECTS = $(am_lib557_OBJECTS)
 lib557_LDADD = $(LDADD)
 lib557_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_208 = lib558-first.$(OBJEXT)
-am_lib558_OBJECTS = lib558-lib558.$(OBJEXT) $(am__objects_208)
+am__objects_234 = lib558-first.$(OBJEXT)
+am_lib558_OBJECTS = lib558-lib558.$(OBJEXT) $(am__objects_234)
 lib558_OBJECTS = $(am_lib558_OBJECTS)
 lib558_LDADD = $(LDADD)
 lib558_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_209 = lib559-first.$(OBJEXT)
-am_lib559_OBJECTS = lib559-lib559.$(OBJEXT) $(am__objects_209)
+am__objects_235 = lib559-first.$(OBJEXT)
+am_lib559_OBJECTS = lib559-lib559.$(OBJEXT) $(am__objects_235)
 lib559_OBJECTS = $(am_lib559_OBJECTS)
 lib559_LDADD = $(LDADD)
 lib559_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_210 = lib560-first.$(OBJEXT)
-am__objects_211 = lib560-testutil.$(OBJEXT)
-am__objects_212 = ../../lib/lib560-warnless.$(OBJEXT)
-am_lib560_OBJECTS = lib560-lib560.$(OBJEXT) $(am__objects_210) \
-       $(am__objects_211) $(am__objects_212)
+am__objects_236 = lib560-first.$(OBJEXT)
+am__objects_237 = lib560-testutil.$(OBJEXT)
+am__objects_238 = ../../lib/lib560-warnless.$(OBJEXT)
+am_lib560_OBJECTS = lib560-lib560.$(OBJEXT) $(am__objects_236) \
+       $(am__objects_237) $(am__objects_238)
 lib560_OBJECTS = $(am_lib560_OBJECTS)
 lib560_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_213 = lib562-first.$(OBJEXT)
-am_lib562_OBJECTS = lib562-lib562.$(OBJEXT) $(am__objects_213)
+am__objects_239 = lib562-first.$(OBJEXT)
+am_lib562_OBJECTS = lib562-lib562.$(OBJEXT) $(am__objects_239)
 lib562_OBJECTS = $(am_lib562_OBJECTS)
 lib562_LDADD = $(LDADD)
 lib562_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_214 = lib564-first.$(OBJEXT)
-am__objects_215 = lib564-testutil.$(OBJEXT)
-am__objects_216 = ../../lib/lib564-warnless.$(OBJEXT)
-am_lib564_OBJECTS = lib564-lib564.$(OBJEXT) $(am__objects_214) \
-       $(am__objects_215) $(am__objects_216)
+am__objects_240 = lib564-first.$(OBJEXT)
+am__objects_241 = lib564-testutil.$(OBJEXT)
+am__objects_242 = ../../lib/lib564-warnless.$(OBJEXT)
+am_lib564_OBJECTS = lib564-lib564.$(OBJEXT) $(am__objects_240) \
+       $(am__objects_241) $(am__objects_242)
 lib564_OBJECTS = $(am_lib564_OBJECTS)
 lib564_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_217 = lib565-first.$(OBJEXT)
-am_lib565_OBJECTS = lib565-lib510.$(OBJEXT) $(am__objects_217)
+am__objects_243 = lib565-first.$(OBJEXT)
+am_lib565_OBJECTS = lib565-lib510.$(OBJEXT) $(am__objects_243)
 lib565_OBJECTS = $(am_lib565_OBJECTS)
 lib565_LDADD = $(LDADD)
 lib565_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_218 = lib566-first.$(OBJEXT)
-am_lib566_OBJECTS = lib566-lib566.$(OBJEXT) $(am__objects_218)
+am__objects_244 = lib566-first.$(OBJEXT)
+am_lib566_OBJECTS = lib566-lib566.$(OBJEXT) $(am__objects_244)
 lib566_OBJECTS = $(am_lib566_OBJECTS)
 lib566_LDADD = $(LDADD)
 lib566_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_219 = lib567-first.$(OBJEXT)
-am_lib567_OBJECTS = lib567-lib567.$(OBJEXT) $(am__objects_219)
+am__objects_245 = lib567-first.$(OBJEXT)
+am_lib567_OBJECTS = lib567-lib567.$(OBJEXT) $(am__objects_245)
 lib567_OBJECTS = $(am_lib567_OBJECTS)
 lib567_LDADD = $(LDADD)
 lib567_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_220 = lib568-first.$(OBJEXT)
-am_lib568_OBJECTS = lib568-lib568.$(OBJEXT) $(am__objects_220)
+am__objects_246 = lib568-first.$(OBJEXT)
+am_lib568_OBJECTS = lib568-lib568.$(OBJEXT) $(am__objects_246)
 lib568_OBJECTS = $(am_lib568_OBJECTS)
 lib568_LDADD = $(LDADD)
 lib568_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_221 = lib569-first.$(OBJEXT)
-am_lib569_OBJECTS = lib569-lib569.$(OBJEXT) $(am__objects_221)
+am__objects_247 = lib569-first.$(OBJEXT)
+am_lib569_OBJECTS = lib569-lib569.$(OBJEXT) $(am__objects_247)
 lib569_OBJECTS = $(am_lib569_OBJECTS)
 lib569_LDADD = $(LDADD)
 lib569_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_222 = lib570-first.$(OBJEXT)
-am_lib570_OBJECTS = lib570-lib570.$(OBJEXT) $(am__objects_222)
+am__objects_248 = lib570-first.$(OBJEXT)
+am_lib570_OBJECTS = lib570-lib570.$(OBJEXT) $(am__objects_248)
 lib570_OBJECTS = $(am_lib570_OBJECTS)
 lib570_LDADD = $(LDADD)
 lib570_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_223 = lib571-first.$(OBJEXT)
-am__objects_224 = ../../lib/lib571-warnless.$(OBJEXT)
-am_lib571_OBJECTS = lib571-lib571.$(OBJEXT) $(am__objects_223) \
-       $(am__objects_224)
+am__objects_249 = lib571-first.$(OBJEXT)
+am__objects_250 = ../../lib/lib571-warnless.$(OBJEXT)
+am_lib571_OBJECTS = lib571-lib571.$(OBJEXT) $(am__objects_249) \
+       $(am__objects_250)
 lib571_OBJECTS = $(am_lib571_OBJECTS)
 lib571_LDADD = $(LDADD)
 lib571_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_225 = lib572-first.$(OBJEXT)
-am_lib572_OBJECTS = lib572-lib572.$(OBJEXT) $(am__objects_225)
+am__objects_251 = lib572-first.$(OBJEXT)
+am_lib572_OBJECTS = lib572-lib572.$(OBJEXT) $(am__objects_251)
 lib572_OBJECTS = $(am_lib572_OBJECTS)
 lib572_LDADD = $(LDADD)
 lib572_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_226 = lib573-first.$(OBJEXT)
-am__objects_227 = lib573-testutil.$(OBJEXT)
-am__objects_228 = ../../lib/lib573-warnless.$(OBJEXT)
-am__objects_229 = lib573-testtrace.$(OBJEXT)
-am_lib573_OBJECTS = lib573-lib573.$(OBJEXT) $(am__objects_226) \
-       $(am__objects_227) $(am__objects_228) $(am__objects_229)
+am__objects_252 = lib573-first.$(OBJEXT)
+am__objects_253 = lib573-testutil.$(OBJEXT)
+am__objects_254 = ../../lib/lib573-warnless.$(OBJEXT)
+am__objects_255 = lib573-testtrace.$(OBJEXT)
+am_lib573_OBJECTS = lib573-lib573.$(OBJEXT) $(am__objects_252) \
+       $(am__objects_253) $(am__objects_254) $(am__objects_255)
 lib573_OBJECTS = $(am_lib573_OBJECTS)
 lib573_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_230 = lib574-first.$(OBJEXT)
-am_lib574_OBJECTS = lib574-lib574.$(OBJEXT) $(am__objects_230)
+am__objects_256 = lib574-first.$(OBJEXT)
+am_lib574_OBJECTS = lib574-lib574.$(OBJEXT) $(am__objects_256)
 lib574_OBJECTS = $(am_lib574_OBJECTS)
 lib574_LDADD = $(LDADD)
 lib574_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_231 = lib575-first.$(OBJEXT)
-am__objects_232 = lib575-testutil.$(OBJEXT)
-am__objects_233 = ../../lib/lib575-warnless.$(OBJEXT)
-am_lib575_OBJECTS = lib575-lib575.$(OBJEXT) $(am__objects_231) \
-       $(am__objects_232) $(am__objects_233)
+am__objects_257 = lib575-first.$(OBJEXT)
+am__objects_258 = lib575-testutil.$(OBJEXT)
+am__objects_259 = ../../lib/lib575-warnless.$(OBJEXT)
+am_lib575_OBJECTS = lib575-lib575.$(OBJEXT) $(am__objects_257) \
+       $(am__objects_258) $(am__objects_259)
 lib575_OBJECTS = $(am_lib575_OBJECTS)
 lib575_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_234 = lib576-first.$(OBJEXT)
-am_lib576_OBJECTS = lib576-lib576.$(OBJEXT) $(am__objects_234)
+am__objects_260 = lib576-first.$(OBJEXT)
+am_lib576_OBJECTS = lib576-lib576.$(OBJEXT) $(am__objects_260)
 lib576_OBJECTS = $(am_lib576_OBJECTS)
 lib576_LDADD = $(LDADD)
 lib576_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_235 = lib578-first.$(OBJEXT)
-am_lib578_OBJECTS = lib578-lib578.$(OBJEXT) $(am__objects_235)
+am__objects_261 = lib578-first.$(OBJEXT)
+am_lib578_OBJECTS = lib578-lib578.$(OBJEXT) $(am__objects_261)
 lib578_OBJECTS = $(am_lib578_OBJECTS)
 lib578_LDADD = $(LDADD)
 lib578_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_236 = lib579-first.$(OBJEXT)
-am_lib579_OBJECTS = lib579-lib579.$(OBJEXT) $(am__objects_236)
+am__objects_262 = lib579-first.$(OBJEXT)
+am_lib579_OBJECTS = lib579-lib579.$(OBJEXT) $(am__objects_262)
 lib579_OBJECTS = $(am_lib579_OBJECTS)
 lib579_LDADD = $(LDADD)
 lib579_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_237 = lib582-first.$(OBJEXT)
-am__objects_238 = lib582-testutil.$(OBJEXT)
-am__objects_239 = ../../lib/lib582-warnless.$(OBJEXT)
-am_lib582_OBJECTS = lib582-lib582.$(OBJEXT) $(am__objects_237) \
-       $(am__objects_238) $(am__objects_239)
+am__objects_263 = lib582-first.$(OBJEXT)
+am__objects_264 = lib582-testutil.$(OBJEXT)
+am__objects_265 = ../../lib/lib582-warnless.$(OBJEXT)
+am_lib582_OBJECTS = lib582-lib582.$(OBJEXT) $(am__objects_263) \
+       $(am__objects_264) $(am__objects_265)
 lib582_OBJECTS = $(am_lib582_OBJECTS)
 lib582_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_240 = lib583-first.$(OBJEXT)
-am_lib583_OBJECTS = lib583-lib583.$(OBJEXT) $(am__objects_240)
+am__objects_266 = lib583-first.$(OBJEXT)
+am_lib583_OBJECTS = lib583-lib583.$(OBJEXT) $(am__objects_266)
 lib583_OBJECTS = $(am_lib583_OBJECTS)
 lib583_LDADD = $(LDADD)
 lib583_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_241 = lib585-first.$(OBJEXT)
-am__objects_242 = lib585-testutil.$(OBJEXT)
-am__objects_243 = lib585-testtrace.$(OBJEXT)
-am_lib585_OBJECTS = lib585-lib500.$(OBJEXT) $(am__objects_241) \
-       $(am__objects_242) $(am__objects_243)
+am__objects_267 = lib585-first.$(OBJEXT)
+am__objects_268 = lib585-testutil.$(OBJEXT)
+am__objects_269 = lib585-testtrace.$(OBJEXT)
+am_lib585_OBJECTS = lib585-lib500.$(OBJEXT) $(am__objects_267) \
+       $(am__objects_268) $(am__objects_269)
 lib585_OBJECTS = $(am_lib585_OBJECTS)
 lib585_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_244 = lib586-first.$(OBJEXT)
-am_lib586_OBJECTS = lib586-lib586.$(OBJEXT) $(am__objects_244)
+am__objects_270 = lib586-first.$(OBJEXT)
+am_lib586_OBJECTS = lib586-lib586.$(OBJEXT) $(am__objects_270)
 lib586_OBJECTS = $(am_lib586_OBJECTS)
 lib586_LDADD = $(LDADD)
 lib586_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_245 = lib587-first.$(OBJEXT)
-am_lib587_OBJECTS = lib587-lib554.$(OBJEXT) $(am__objects_245)
+am__objects_271 = lib587-first.$(OBJEXT)
+am_lib587_OBJECTS = lib587-lib554.$(OBJEXT) $(am__objects_271)
 lib587_OBJECTS = $(am_lib587_OBJECTS)
 lib587_LDADD = $(LDADD)
 lib587_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_246 = lib589-first.$(OBJEXT)
-am_lib589_OBJECTS = lib589-lib589.$(OBJEXT) $(am__objects_246)
+am__objects_272 = lib589-first.$(OBJEXT)
+am_lib589_OBJECTS = lib589-lib589.$(OBJEXT) $(am__objects_272)
 lib589_OBJECTS = $(am_lib589_OBJECTS)
 lib589_LDADD = $(LDADD)
 lib589_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_247 = lib590-first.$(OBJEXT)
-am_lib590_OBJECTS = lib590-lib590.$(OBJEXT) $(am__objects_247)
+am__objects_273 = lib590-first.$(OBJEXT)
+am_lib590_OBJECTS = lib590-lib590.$(OBJEXT) $(am__objects_273)
 lib590_OBJECTS = $(am_lib590_OBJECTS)
 lib590_LDADD = $(LDADD)
 lib590_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_248 = lib591-first.$(OBJEXT)
-am__objects_249 = lib591-testutil.$(OBJEXT)
-am__objects_250 = ../../lib/lib591-warnless.$(OBJEXT)
-am_lib591_OBJECTS = lib591-lib591.$(OBJEXT) $(am__objects_248) \
-       $(am__objects_249) $(am__objects_250)
+am__objects_274 = lib591-first.$(OBJEXT)
+am__objects_275 = lib591-testutil.$(OBJEXT)
+am__objects_276 = ../../lib/lib591-warnless.$(OBJEXT)
+am_lib591_OBJECTS = lib591-lib591.$(OBJEXT) $(am__objects_274) \
+       $(am__objects_275) $(am__objects_276)
 lib591_OBJECTS = $(am_lib591_OBJECTS)
 lib591_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_251 = lib597-first.$(OBJEXT)
-am__objects_252 = lib597-testutil.$(OBJEXT)
-am__objects_253 = ../../lib/lib597-warnless.$(OBJEXT)
-am_lib597_OBJECTS = lib597-lib597.$(OBJEXT) $(am__objects_251) \
-       $(am__objects_252) $(am__objects_253)
+am__objects_277 = lib597-first.$(OBJEXT)
+am__objects_278 = lib597-testutil.$(OBJEXT)
+am__objects_279 = ../../lib/lib597-warnless.$(OBJEXT)
+am_lib597_OBJECTS = lib597-lib597.$(OBJEXT) $(am__objects_277) \
+       $(am__objects_278) $(am__objects_279)
 lib597_OBJECTS = $(am_lib597_OBJECTS)
 lib597_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_254 = lib598-first.$(OBJEXT)
-am_lib598_OBJECTS = lib598-lib598.$(OBJEXT) $(am__objects_254)
+am__objects_280 = lib598-first.$(OBJEXT)
+am_lib598_OBJECTS = lib598-lib598.$(OBJEXT) $(am__objects_280)
 lib598_OBJECTS = $(am_lib598_OBJECTS)
 lib598_LDADD = $(LDADD)
 lib598_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_255 = lib599-first.$(OBJEXT)
-am_lib599_OBJECTS = lib599-lib599.$(OBJEXT) $(am__objects_255)
+am__objects_281 = lib599-first.$(OBJEXT)
+am_lib599_OBJECTS = lib599-lib599.$(OBJEXT) $(am__objects_281)
 lib599_OBJECTS = $(am_lib599_OBJECTS)
 lib599_LDADD = $(LDADD)
 lib599_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_256 = lib643-first.$(OBJEXT)
-am_lib643_OBJECTS = lib643-lib643.$(OBJEXT) $(am__objects_256)
+am__objects_282 = lib643-first.$(OBJEXT)
+am_lib643_OBJECTS = lib643-lib643.$(OBJEXT) $(am__objects_282)
 lib643_OBJECTS = $(am_lib643_OBJECTS)
 lib643_LDADD = $(LDADD)
 lib643_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_257 = lib644-first.$(OBJEXT)
-am_lib644_OBJECTS = lib644-lib643.$(OBJEXT) $(am__objects_257)
+am__objects_283 = lib644-first.$(OBJEXT)
+am_lib644_OBJECTS = lib644-lib643.$(OBJEXT) $(am__objects_283)
 lib644_OBJECTS = $(am_lib644_OBJECTS)
 lib644_LDADD = $(LDADD)
 lib644_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_258 = lib645-first.$(OBJEXT)
-am_lib645_OBJECTS = lib645-lib643.$(OBJEXT) $(am__objects_258)
+am__objects_284 = lib645-first.$(OBJEXT)
+am_lib645_OBJECTS = lib645-lib643.$(OBJEXT) $(am__objects_284)
 lib645_OBJECTS = $(am_lib645_OBJECTS)
 lib645_LDADD = $(LDADD)
 lib645_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_259 = lib650-first.$(OBJEXT)
-am_lib650_OBJECTS = lib650-lib650.$(OBJEXT) $(am__objects_259)
+am__objects_285 = lib650-first.$(OBJEXT)
+am_lib650_OBJECTS = lib650-lib650.$(OBJEXT) $(am__objects_285)
 lib650_OBJECTS = $(am_lib650_OBJECTS)
 lib650_LDADD = $(LDADD)
 lib650_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_260 = lib651-first.$(OBJEXT)
-am_lib651_OBJECTS = lib651-lib651.$(OBJEXT) $(am__objects_260)
+am__objects_286 = lib651-first.$(OBJEXT)
+am_lib651_OBJECTS = lib651-lib651.$(OBJEXT) $(am__objects_286)
 lib651_OBJECTS = $(am_lib651_OBJECTS)
 lib651_LDADD = $(LDADD)
 lib651_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_261 = lib652-first.$(OBJEXT)
-am_lib652_OBJECTS = lib652-lib652.$(OBJEXT) $(am__objects_261)
+am__objects_287 = lib652-first.$(OBJEXT)
+am_lib652_OBJECTS = lib652-lib652.$(OBJEXT) $(am__objects_287)
 lib652_OBJECTS = $(am_lib652_OBJECTS)
 lib652_LDADD = $(LDADD)
 lib652_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_262 = lib653-first.$(OBJEXT)
-am_lib653_OBJECTS = lib653-lib653.$(OBJEXT) $(am__objects_262)
+am__objects_288 = lib653-first.$(OBJEXT)
+am_lib653_OBJECTS = lib653-lib653.$(OBJEXT) $(am__objects_288)
 lib653_OBJECTS = $(am_lib653_OBJECTS)
 lib653_LDADD = $(LDADD)
 lib653_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_263 = lib654-first.$(OBJEXT)
-am_lib654_OBJECTS = lib654-lib654.$(OBJEXT) $(am__objects_263)
+am__objects_289 = lib654-first.$(OBJEXT)
+am_lib654_OBJECTS = lib654-lib654.$(OBJEXT) $(am__objects_289)
 lib654_OBJECTS = $(am_lib654_OBJECTS)
 lib654_LDADD = $(LDADD)
 lib654_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_264 = lib655-first.$(OBJEXT)
-am_lib655_OBJECTS = lib655-lib655.$(OBJEXT) $(am__objects_264)
+am__objects_290 = lib655-first.$(OBJEXT)
+am_lib655_OBJECTS = lib655-lib655.$(OBJEXT) $(am__objects_290)
 lib655_OBJECTS = $(am_lib655_OBJECTS)
 lib655_LDADD = $(LDADD)
 lib655_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_265 = libauthretry-first.$(OBJEXT)
+am__objects_291 = lib658-first.$(OBJEXT)
+am__objects_292 = lib658-testutil.$(OBJEXT)
+am__objects_293 = ../../lib/lib658-warnless.$(OBJEXT)
+am_lib658_OBJECTS = lib658-lib658.$(OBJEXT) $(am__objects_291) \
+       $(am__objects_292) $(am__objects_293)
+lib658_OBJECTS = $(am_lib658_OBJECTS)
+lib658_DEPENDENCIES = $(am__DEPENDENCIES_1)
+am__objects_294 = lib659-first.$(OBJEXT)
+am__objects_295 = lib659-testutil.$(OBJEXT)
+am__objects_296 = ../../lib/lib659-warnless.$(OBJEXT)
+am_lib659_OBJECTS = lib659-lib659.$(OBJEXT) $(am__objects_294) \
+       $(am__objects_295) $(am__objects_296)
+lib659_OBJECTS = $(am_lib659_OBJECTS)
+lib659_DEPENDENCIES = $(am__DEPENDENCIES_1)
+am__objects_297 = lib661-first.$(OBJEXT)
+am_lib661_OBJECTS = lib661-lib661.$(OBJEXT) $(am__objects_297)
+lib661_OBJECTS = $(am_lib661_OBJECTS)
+lib661_LDADD = $(LDADD)
+lib661_DEPENDENCIES = $(am__DEPENDENCIES_1)
+am__objects_298 = libauthretry-first.$(OBJEXT)
 am_libauthretry_OBJECTS = libauthretry-libauthretry.$(OBJEXT) \
-       $(am__objects_265)
+       $(am__objects_298)
 libauthretry_OBJECTS = $(am_libauthretry_OBJECTS)
 libauthretry_LDADD = $(LDADD)
 libauthretry_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am__objects_266 = libntlmconnect-first.$(OBJEXT)
-am__objects_267 = libntlmconnect-testutil.$(OBJEXT)
-am__objects_268 = ../../lib/libntlmconnect-warnless.$(OBJEXT)
+am__objects_299 = libntlmconnect-first.$(OBJEXT)
+am__objects_300 = libntlmconnect-testutil.$(OBJEXT)
+am__objects_301 = ../../lib/libntlmconnect-warnless.$(OBJEXT)
 am_libntlmconnect_OBJECTS = libntlmconnect-libntlmconnect.$(OBJEXT) \
-       $(am__objects_266) $(am__objects_267) $(am__objects_268)
+       $(am__objects_299) $(am__objects_300) $(am__objects_301)
 libntlmconnect_OBJECTS = $(am_libntlmconnect_OBJECTS)
 libntlmconnect_DEPENDENCIES = $(am__DEPENDENCIES_1)
 AM_V_P = $(am__v_P_@AM_V@)
@@ -1081,10 +1187,19 @@ am__depfiles_remade =  \
        ../../lib/$(DEPDIR)/lib1537-warnless.Po \
        ../../lib/$(DEPDIR)/lib1538-warnless.Po \
        ../../lib/$(DEPDIR)/lib1540-warnless.Po \
+       ../../lib/$(DEPDIR)/lib1541-warnless.Po \
        ../../lib/$(DEPDIR)/lib1555-warnless.Po \
        ../../lib/$(DEPDIR)/lib1556-warnless.Po \
        ../../lib/$(DEPDIR)/lib1557-warnless.Po \
+       ../../lib/$(DEPDIR)/lib1564-warnless.Po \
+       ../../lib/$(DEPDIR)/lib1565-warnless.Po \
+       ../../lib/$(DEPDIR)/lib1591-warnless.Po \
+       ../../lib/$(DEPDIR)/lib1592-warnless.Po \
+       ../../lib/$(DEPDIR)/lib1596-warnless.Po \
        ../../lib/$(DEPDIR)/lib1900-warnless.Po \
+       ../../lib/$(DEPDIR)/lib1905-warnless.Po \
+       ../../lib/$(DEPDIR)/lib1906-warnless.Po \
+       ../../lib/$(DEPDIR)/lib1907-warnless.Po \
        ../../lib/$(DEPDIR)/lib2033-warnless.Po \
        ../../lib/$(DEPDIR)/lib502-warnless.Po \
        ../../lib/$(DEPDIR)/lib503-warnless.Po \
@@ -1098,7 +1213,6 @@ am__depfiles_remade =  \
        ../../lib/$(DEPDIR)/lib530-warnless.Po \
        ../../lib/$(DEPDIR)/lib532-warnless.Po \
        ../../lib/$(DEPDIR)/lib533-warnless.Po \
-       ../../lib/$(DEPDIR)/lib536-warnless.Po \
        ../../lib/$(DEPDIR)/lib537-warnless.Po \
        ../../lib/$(DEPDIR)/lib540-warnless.Po \
        ../../lib/$(DEPDIR)/lib552-warnless.Po \
@@ -1112,6 +1226,8 @@ am__depfiles_remade =  \
        ../../lib/$(DEPDIR)/lib582-warnless.Po \
        ../../lib/$(DEPDIR)/lib591-warnless.Po \
        ../../lib/$(DEPDIR)/lib597-warnless.Po \
+       ../../lib/$(DEPDIR)/lib658-warnless.Po \
+       ../../lib/$(DEPDIR)/lib659-warnless.Po \
        ../../lib/$(DEPDIR)/libntlmconnect-warnless.Po \
        ../../lib/$(DEPDIR)/warnless.Po \
        ./$(DEPDIR)/chkdecimalpoint-chkdecimalpoint.Po \
@@ -1142,10 +1258,12 @@ am__depfiles_remade =  \
        ./$(DEPDIR)/lib1514-lib1514.Po ./$(DEPDIR)/lib1514-testutil.Po \
        ./$(DEPDIR)/lib1515-first.Po ./$(DEPDIR)/lib1515-lib1515.Po \
        ./$(DEPDIR)/lib1515-testutil.Po ./$(DEPDIR)/lib1517-first.Po \
-       ./$(DEPDIR)/lib1517-lib1517.Po ./$(DEPDIR)/lib1520-first.Po \
+       ./$(DEPDIR)/lib1517-lib1517.Po ./$(DEPDIR)/lib1518-first.Po \
+       ./$(DEPDIR)/lib1518-lib1518.Po ./$(DEPDIR)/lib1520-first.Po \
        ./$(DEPDIR)/lib1520-lib1520.Po ./$(DEPDIR)/lib1521-first.Po \
        ./$(DEPDIR)/lib1521-lib1521.Po ./$(DEPDIR)/lib1522-first.Po \
-       ./$(DEPDIR)/lib1522-lib1522.Po ./$(DEPDIR)/lib1525-first.Po \
+       ./$(DEPDIR)/lib1522-lib1522.Po ./$(DEPDIR)/lib1523-first.Po \
+       ./$(DEPDIR)/lib1523-lib1523.Po ./$(DEPDIR)/lib1525-first.Po \
        ./$(DEPDIR)/lib1525-lib1525.Po ./$(DEPDIR)/lib1525-testutil.Po \
        ./$(DEPDIR)/lib1526-first.Po ./$(DEPDIR)/lib1526-lib1526.Po \
        ./$(DEPDIR)/lib1526-testutil.Po ./$(DEPDIR)/lib1527-first.Po \
@@ -1168,19 +1286,35 @@ am__depfiles_remade =  \
        ./$(DEPDIR)/lib1538-first.Po ./$(DEPDIR)/lib1538-lib1538.Po \
        ./$(DEPDIR)/lib1538-testutil.Po ./$(DEPDIR)/lib1540-first.Po \
        ./$(DEPDIR)/lib1540-lib1540.Po ./$(DEPDIR)/lib1540-testutil.Po \
-       ./$(DEPDIR)/lib1550-first.Po ./$(DEPDIR)/lib1550-lib1550.Po \
-       ./$(DEPDIR)/lib1551-first.Po ./$(DEPDIR)/lib1551-lib1551.Po \
-       ./$(DEPDIR)/lib1552-first.Po ./$(DEPDIR)/lib1552-lib1552.Po \
-       ./$(DEPDIR)/lib1552-testutil.Po ./$(DEPDIR)/lib1553-first.Po \
-       ./$(DEPDIR)/lib1553-lib1553.Po ./$(DEPDIR)/lib1553-testutil.Po \
-       ./$(DEPDIR)/lib1554-first.Po ./$(DEPDIR)/lib1554-lib1554.Po \
-       ./$(DEPDIR)/lib1555-first.Po ./$(DEPDIR)/lib1555-lib1555.Po \
-       ./$(DEPDIR)/lib1555-testutil.Po ./$(DEPDIR)/lib1556-first.Po \
-       ./$(DEPDIR)/lib1556-lib1556.Po ./$(DEPDIR)/lib1556-testutil.Po \
-       ./$(DEPDIR)/lib1557-first.Po ./$(DEPDIR)/lib1557-lib1557.Po \
-       ./$(DEPDIR)/lib1557-testutil.Po ./$(DEPDIR)/lib1560.Po \
+       ./$(DEPDIR)/lib1541-first.Po ./$(DEPDIR)/lib1541-lib1541.Po \
+       ./$(DEPDIR)/lib1541-testutil.Po ./$(DEPDIR)/lib1550-first.Po \
+       ./$(DEPDIR)/lib1550-lib1550.Po ./$(DEPDIR)/lib1551-first.Po \
+       ./$(DEPDIR)/lib1551-lib1551.Po ./$(DEPDIR)/lib1552-first.Po \
+       ./$(DEPDIR)/lib1552-lib1552.Po ./$(DEPDIR)/lib1552-testutil.Po \
+       ./$(DEPDIR)/lib1553-first.Po ./$(DEPDIR)/lib1553-lib1553.Po \
+       ./$(DEPDIR)/lib1553-testutil.Po ./$(DEPDIR)/lib1554-first.Po \
+       ./$(DEPDIR)/lib1554-lib1554.Po ./$(DEPDIR)/lib1555-first.Po \
+       ./$(DEPDIR)/lib1555-lib1555.Po ./$(DEPDIR)/lib1555-testutil.Po \
+       ./$(DEPDIR)/lib1556-first.Po ./$(DEPDIR)/lib1556-lib1556.Po \
+       ./$(DEPDIR)/lib1556-testutil.Po ./$(DEPDIR)/lib1557-first.Po \
+       ./$(DEPDIR)/lib1557-lib1557.Po ./$(DEPDIR)/lib1557-testutil.Po \
+       ./$(DEPDIR)/lib1558.Po ./$(DEPDIR)/lib1559.Po \
+       ./$(DEPDIR)/lib1560.Po ./$(DEPDIR)/lib1564-first.Po \
+       ./$(DEPDIR)/lib1564-lib1564.Po ./$(DEPDIR)/lib1564-testutil.Po \
+       ./$(DEPDIR)/lib1565-first.Po ./$(DEPDIR)/lib1565-lib1565.Po \
+       ./$(DEPDIR)/lib1565-testutil.Po ./$(DEPDIR)/lib1591-first.Po \
+       ./$(DEPDIR)/lib1591-lib1591.Po ./$(DEPDIR)/lib1591-testutil.Po \
+       ./$(DEPDIR)/lib1592-first.Po ./$(DEPDIR)/lib1592-lib1592.Po \
+       ./$(DEPDIR)/lib1592-testutil.Po ./$(DEPDIR)/lib1593.Po \
+       ./$(DEPDIR)/lib1594.Po ./$(DEPDIR)/lib1596-first.Po \
+       ./$(DEPDIR)/lib1596-lib1594.Po ./$(DEPDIR)/lib1596-testutil.Po \
        ./$(DEPDIR)/lib1900-first.Po ./$(DEPDIR)/lib1900-lib1900.Po \
-       ./$(DEPDIR)/lib1900-testutil.Po ./$(DEPDIR)/lib2033-first.Po \
+       ./$(DEPDIR)/lib1900-testutil.Po ./$(DEPDIR)/lib1905-first.Po \
+       ./$(DEPDIR)/lib1905-lib1905.Po ./$(DEPDIR)/lib1905-testutil.Po \
+       ./$(DEPDIR)/lib1906-first.Po ./$(DEPDIR)/lib1906-lib1906.Po \
+       ./$(DEPDIR)/lib1906-testutil.Po ./$(DEPDIR)/lib1907-first.Po \
+       ./$(DEPDIR)/lib1907-lib1907.Po ./$(DEPDIR)/lib1907-testutil.Po \
+       ./$(DEPDIR)/lib2033-first.Po \
        ./$(DEPDIR)/lib2033-libntlmconnect.Po \
        ./$(DEPDIR)/lib2033-testutil.Po ./$(DEPDIR)/lib500-first.Po \
        ./$(DEPDIR)/lib500-lib500.Po ./$(DEPDIR)/lib500-testtrace.Po \
@@ -1220,70 +1354,73 @@ am__depfiles_remade =  \
        ./$(DEPDIR)/lib532-first.Po ./$(DEPDIR)/lib532-lib526.Po \
        ./$(DEPDIR)/lib532-testutil.Po ./$(DEPDIR)/lib533-first.Po \
        ./$(DEPDIR)/lib533-lib533.Po ./$(DEPDIR)/lib533-testutil.Po \
-       ./$(DEPDIR)/lib536-first.Po ./$(DEPDIR)/lib536-lib536.Po \
-       ./$(DEPDIR)/lib536-testutil.Po ./$(DEPDIR)/lib537-first.Po \
-       ./$(DEPDIR)/lib537-lib537.Po ./$(DEPDIR)/lib539-first.Po \
-       ./$(DEPDIR)/lib539-lib539.Po ./$(DEPDIR)/lib540-first.Po \
-       ./$(DEPDIR)/lib540-lib540.Po ./$(DEPDIR)/lib540-testutil.Po \
-       ./$(DEPDIR)/lib541-first.Po ./$(DEPDIR)/lib541-lib541.Po \
-       ./$(DEPDIR)/lib542-first.Po ./$(DEPDIR)/lib542-lib542.Po \
-       ./$(DEPDIR)/lib543-first.Po ./$(DEPDIR)/lib543-lib543.Po \
-       ./$(DEPDIR)/lib544-first.Po ./$(DEPDIR)/lib544-lib544.Po \
-       ./$(DEPDIR)/lib545-first.Po ./$(DEPDIR)/lib545-lib544.Po \
-       ./$(DEPDIR)/lib547-first.Po ./$(DEPDIR)/lib547-lib547.Po \
-       ./$(DEPDIR)/lib548-first.Po ./$(DEPDIR)/lib548-lib547.Po \
-       ./$(DEPDIR)/lib549-first.Po ./$(DEPDIR)/lib549-lib549.Po \
-       ./$(DEPDIR)/lib552-first.Po ./$(DEPDIR)/lib552-lib552.Po \
-       ./$(DEPDIR)/lib553-first.Po ./$(DEPDIR)/lib553-lib553.Po \
-       ./$(DEPDIR)/lib554-first.Po ./$(DEPDIR)/lib554-lib554.Po \
-       ./$(DEPDIR)/lib555-first.Po ./$(DEPDIR)/lib555-lib555.Po \
-       ./$(DEPDIR)/lib555-testutil.Po ./$(DEPDIR)/lib556-first.Po \
-       ./$(DEPDIR)/lib556-lib556.Po ./$(DEPDIR)/lib557-first.Po \
-       ./$(DEPDIR)/lib557-lib557.Po ./$(DEPDIR)/lib558-first.Po \
-       ./$(DEPDIR)/lib558-lib558.Po ./$(DEPDIR)/lib559-first.Po \
-       ./$(DEPDIR)/lib559-lib559.Po ./$(DEPDIR)/lib560-first.Po \
-       ./$(DEPDIR)/lib560-lib560.Po ./$(DEPDIR)/lib560-testutil.Po \
-       ./$(DEPDIR)/lib562-first.Po ./$(DEPDIR)/lib562-lib562.Po \
-       ./$(DEPDIR)/lib564-first.Po ./$(DEPDIR)/lib564-lib564.Po \
-       ./$(DEPDIR)/lib564-testutil.Po ./$(DEPDIR)/lib565-first.Po \
-       ./$(DEPDIR)/lib565-lib510.Po ./$(DEPDIR)/lib566-first.Po \
-       ./$(DEPDIR)/lib566-lib566.Po ./$(DEPDIR)/lib567-first.Po \
-       ./$(DEPDIR)/lib567-lib567.Po ./$(DEPDIR)/lib568-first.Po \
-       ./$(DEPDIR)/lib568-lib568.Po ./$(DEPDIR)/lib569-first.Po \
-       ./$(DEPDIR)/lib569-lib569.Po ./$(DEPDIR)/lib570-first.Po \
-       ./$(DEPDIR)/lib570-lib570.Po ./$(DEPDIR)/lib571-first.Po \
-       ./$(DEPDIR)/lib571-lib571.Po ./$(DEPDIR)/lib572-first.Po \
-       ./$(DEPDIR)/lib572-lib572.Po ./$(DEPDIR)/lib573-first.Po \
-       ./$(DEPDIR)/lib573-lib573.Po ./$(DEPDIR)/lib573-testtrace.Po \
-       ./$(DEPDIR)/lib573-testutil.Po ./$(DEPDIR)/lib574-first.Po \
-       ./$(DEPDIR)/lib574-lib574.Po ./$(DEPDIR)/lib575-first.Po \
-       ./$(DEPDIR)/lib575-lib575.Po ./$(DEPDIR)/lib575-testutil.Po \
-       ./$(DEPDIR)/lib576-first.Po ./$(DEPDIR)/lib576-lib576.Po \
-       ./$(DEPDIR)/lib578-first.Po ./$(DEPDIR)/lib578-lib578.Po \
-       ./$(DEPDIR)/lib579-first.Po ./$(DEPDIR)/lib579-lib579.Po \
-       ./$(DEPDIR)/lib582-first.Po ./$(DEPDIR)/lib582-lib582.Po \
-       ./$(DEPDIR)/lib582-testutil.Po ./$(DEPDIR)/lib583-first.Po \
-       ./$(DEPDIR)/lib583-lib583.Po ./$(DEPDIR)/lib585-first.Po \
-       ./$(DEPDIR)/lib585-lib500.Po ./$(DEPDIR)/lib585-testtrace.Po \
-       ./$(DEPDIR)/lib585-testutil.Po ./$(DEPDIR)/lib586-first.Po \
-       ./$(DEPDIR)/lib586-lib586.Po ./$(DEPDIR)/lib587-first.Po \
-       ./$(DEPDIR)/lib587-lib554.Po ./$(DEPDIR)/lib589-first.Po \
-       ./$(DEPDIR)/lib589-lib589.Po ./$(DEPDIR)/lib590-first.Po \
-       ./$(DEPDIR)/lib590-lib590.Po ./$(DEPDIR)/lib591-first.Po \
-       ./$(DEPDIR)/lib591-lib591.Po ./$(DEPDIR)/lib591-testutil.Po \
-       ./$(DEPDIR)/lib597-first.Po ./$(DEPDIR)/lib597-lib597.Po \
-       ./$(DEPDIR)/lib597-testutil.Po ./$(DEPDIR)/lib598-first.Po \
-       ./$(DEPDIR)/lib598-lib598.Po ./$(DEPDIR)/lib599-first.Po \
-       ./$(DEPDIR)/lib599-lib599.Po ./$(DEPDIR)/lib643-first.Po \
-       ./$(DEPDIR)/lib643-lib643.Po ./$(DEPDIR)/lib644-first.Po \
-       ./$(DEPDIR)/lib644-lib643.Po ./$(DEPDIR)/lib645-first.Po \
-       ./$(DEPDIR)/lib645-lib643.Po ./$(DEPDIR)/lib650-first.Po \
-       ./$(DEPDIR)/lib650-lib650.Po ./$(DEPDIR)/lib651-first.Po \
-       ./$(DEPDIR)/lib651-lib651.Po ./$(DEPDIR)/lib652-first.Po \
-       ./$(DEPDIR)/lib652-lib652.Po ./$(DEPDIR)/lib653-first.Po \
-       ./$(DEPDIR)/lib653-lib653.Po ./$(DEPDIR)/lib654-first.Po \
-       ./$(DEPDIR)/lib654-lib654.Po ./$(DEPDIR)/lib655-first.Po \
-       ./$(DEPDIR)/lib655-lib655.Po ./$(DEPDIR)/libauthretry-first.Po \
+       ./$(DEPDIR)/lib537-first.Po ./$(DEPDIR)/lib537-lib537.Po \
+       ./$(DEPDIR)/lib539-first.Po ./$(DEPDIR)/lib539-lib539.Po \
+       ./$(DEPDIR)/lib540-first.Po ./$(DEPDIR)/lib540-lib540.Po \
+       ./$(DEPDIR)/lib540-testutil.Po ./$(DEPDIR)/lib541-first.Po \
+       ./$(DEPDIR)/lib541-lib541.Po ./$(DEPDIR)/lib542-first.Po \
+       ./$(DEPDIR)/lib542-lib542.Po ./$(DEPDIR)/lib543-first.Po \
+       ./$(DEPDIR)/lib543-lib543.Po ./$(DEPDIR)/lib544-first.Po \
+       ./$(DEPDIR)/lib544-lib544.Po ./$(DEPDIR)/lib545-first.Po \
+       ./$(DEPDIR)/lib545-lib544.Po ./$(DEPDIR)/lib547-first.Po \
+       ./$(DEPDIR)/lib547-lib547.Po ./$(DEPDIR)/lib548-first.Po \
+       ./$(DEPDIR)/lib548-lib547.Po ./$(DEPDIR)/lib549-first.Po \
+       ./$(DEPDIR)/lib549-lib549.Po ./$(DEPDIR)/lib552-first.Po \
+       ./$(DEPDIR)/lib552-lib552.Po ./$(DEPDIR)/lib553-first.Po \
+       ./$(DEPDIR)/lib553-lib553.Po ./$(DEPDIR)/lib554-first.Po \
+       ./$(DEPDIR)/lib554-lib554.Po ./$(DEPDIR)/lib555-first.Po \
+       ./$(DEPDIR)/lib555-lib555.Po ./$(DEPDIR)/lib555-testutil.Po \
+       ./$(DEPDIR)/lib556-first.Po ./$(DEPDIR)/lib556-lib556.Po \
+       ./$(DEPDIR)/lib557-first.Po ./$(DEPDIR)/lib557-lib557.Po \
+       ./$(DEPDIR)/lib558-first.Po ./$(DEPDIR)/lib558-lib558.Po \
+       ./$(DEPDIR)/lib559-first.Po ./$(DEPDIR)/lib559-lib559.Po \
+       ./$(DEPDIR)/lib560-first.Po ./$(DEPDIR)/lib560-lib560.Po \
+       ./$(DEPDIR)/lib560-testutil.Po ./$(DEPDIR)/lib562-first.Po \
+       ./$(DEPDIR)/lib562-lib562.Po ./$(DEPDIR)/lib564-first.Po \
+       ./$(DEPDIR)/lib564-lib564.Po ./$(DEPDIR)/lib564-testutil.Po \
+       ./$(DEPDIR)/lib565-first.Po ./$(DEPDIR)/lib565-lib510.Po \
+       ./$(DEPDIR)/lib566-first.Po ./$(DEPDIR)/lib566-lib566.Po \
+       ./$(DEPDIR)/lib567-first.Po ./$(DEPDIR)/lib567-lib567.Po \
+       ./$(DEPDIR)/lib568-first.Po ./$(DEPDIR)/lib568-lib568.Po \
+       ./$(DEPDIR)/lib569-first.Po ./$(DEPDIR)/lib569-lib569.Po \
+       ./$(DEPDIR)/lib570-first.Po ./$(DEPDIR)/lib570-lib570.Po \
+       ./$(DEPDIR)/lib571-first.Po ./$(DEPDIR)/lib571-lib571.Po \
+       ./$(DEPDIR)/lib572-first.Po ./$(DEPDIR)/lib572-lib572.Po \
+       ./$(DEPDIR)/lib573-first.Po ./$(DEPDIR)/lib573-lib573.Po \
+       ./$(DEPDIR)/lib573-testtrace.Po ./$(DEPDIR)/lib573-testutil.Po \
+       ./$(DEPDIR)/lib574-first.Po ./$(DEPDIR)/lib574-lib574.Po \
+       ./$(DEPDIR)/lib575-first.Po ./$(DEPDIR)/lib575-lib575.Po \
+       ./$(DEPDIR)/lib575-testutil.Po ./$(DEPDIR)/lib576-first.Po \
+       ./$(DEPDIR)/lib576-lib576.Po ./$(DEPDIR)/lib578-first.Po \
+       ./$(DEPDIR)/lib578-lib578.Po ./$(DEPDIR)/lib579-first.Po \
+       ./$(DEPDIR)/lib579-lib579.Po ./$(DEPDIR)/lib582-first.Po \
+       ./$(DEPDIR)/lib582-lib582.Po ./$(DEPDIR)/lib582-testutil.Po \
+       ./$(DEPDIR)/lib583-first.Po ./$(DEPDIR)/lib583-lib583.Po \
+       ./$(DEPDIR)/lib585-first.Po ./$(DEPDIR)/lib585-lib500.Po \
+       ./$(DEPDIR)/lib585-testtrace.Po ./$(DEPDIR)/lib585-testutil.Po \
+       ./$(DEPDIR)/lib586-first.Po ./$(DEPDIR)/lib586-lib586.Po \
+       ./$(DEPDIR)/lib587-first.Po ./$(DEPDIR)/lib587-lib554.Po \
+       ./$(DEPDIR)/lib589-first.Po ./$(DEPDIR)/lib589-lib589.Po \
+       ./$(DEPDIR)/lib590-first.Po ./$(DEPDIR)/lib590-lib590.Po \
+       ./$(DEPDIR)/lib591-first.Po ./$(DEPDIR)/lib591-lib591.Po \
+       ./$(DEPDIR)/lib591-testutil.Po ./$(DEPDIR)/lib597-first.Po \
+       ./$(DEPDIR)/lib597-lib597.Po ./$(DEPDIR)/lib597-testutil.Po \
+       ./$(DEPDIR)/lib598-first.Po ./$(DEPDIR)/lib598-lib598.Po \
+       ./$(DEPDIR)/lib599-first.Po ./$(DEPDIR)/lib599-lib599.Po \
+       ./$(DEPDIR)/lib643-first.Po ./$(DEPDIR)/lib643-lib643.Po \
+       ./$(DEPDIR)/lib644-first.Po ./$(DEPDIR)/lib644-lib643.Po \
+       ./$(DEPDIR)/lib645-first.Po ./$(DEPDIR)/lib645-lib643.Po \
+       ./$(DEPDIR)/lib650-first.Po ./$(DEPDIR)/lib650-lib650.Po \
+       ./$(DEPDIR)/lib651-first.Po ./$(DEPDIR)/lib651-lib651.Po \
+       ./$(DEPDIR)/lib652-first.Po ./$(DEPDIR)/lib652-lib652.Po \
+       ./$(DEPDIR)/lib653-first.Po ./$(DEPDIR)/lib653-lib653.Po \
+       ./$(DEPDIR)/lib654-first.Po ./$(DEPDIR)/lib654-lib654.Po \
+       ./$(DEPDIR)/lib655-first.Po ./$(DEPDIR)/lib655-lib655.Po \
+       ./$(DEPDIR)/lib658-first.Po ./$(DEPDIR)/lib658-lib658.Po \
+       ./$(DEPDIR)/lib658-testutil.Po ./$(DEPDIR)/lib659-first.Po \
+       ./$(DEPDIR)/lib659-lib659.Po ./$(DEPDIR)/lib659-testutil.Po \
+       ./$(DEPDIR)/lib661-first.Po ./$(DEPDIR)/lib661-lib661.Po \
+       ./$(DEPDIR)/libauthretry-first.Po \
        ./$(DEPDIR)/libauthretry-libauthretry.Po \
        ./$(DEPDIR)/libhostname_la-sethostname.Plo \
        ./$(DEPDIR)/libntlmconnect-first.Po \
@@ -1318,27 +1455,32 @@ SOURCES = $(libhostname_la_SOURCES) $(libstubgss_la_SOURCES) \
        $(lib1508_SOURCES) $(lib1509_SOURCES) $(lib1510_SOURCES) \
        $(lib1511_SOURCES) $(lib1512_SOURCES) $(lib1513_SOURCES) \
        $(lib1514_SOURCES) $(lib1515_SOURCES) $(lib1517_SOURCES) \
-       $(lib1520_SOURCES) $(nodist_lib1521_SOURCES) \
-       $(lib1522_SOURCES) $(lib1525_SOURCES) $(lib1526_SOURCES) \
+       $(lib1518_SOURCES) $(lib1520_SOURCES) \
+       $(nodist_lib1521_SOURCES) $(lib1522_SOURCES) \
+       $(lib1523_SOURCES) $(lib1525_SOURCES) $(lib1526_SOURCES) \
        $(lib1527_SOURCES) $(lib1528_SOURCES) $(lib1529_SOURCES) \
        $(lib1530_SOURCES) $(lib1531_SOURCES) $(lib1532_SOURCES) \
        $(lib1533_SOURCES) $(lib1534_SOURCES) $(lib1535_SOURCES) \
        $(lib1536_SOURCES) $(lib1537_SOURCES) $(lib1538_SOURCES) \
-       $(lib1540_SOURCES) $(lib1550_SOURCES) $(lib1551_SOURCES) \
-       $(lib1552_SOURCES) $(lib1553_SOURCES) $(lib1554_SOURCES) \
-       $(lib1555_SOURCES) $(lib1556_SOURCES) $(lib1557_SOURCES) \
-       $(lib1560_SOURCES) $(lib1900_SOURCES) $(lib2033_SOURCES) \
-       $(lib500_SOURCES) $(lib501_SOURCES) $(lib502_SOURCES) \
-       $(lib503_SOURCES) $(lib504_SOURCES) $(lib505_SOURCES) \
-       $(lib506_SOURCES) $(lib507_SOURCES) $(lib508_SOURCES) \
-       $(lib509_SOURCES) $(lib510_SOURCES) $(lib511_SOURCES) \
-       $(lib512_SOURCES) $(lib513_SOURCES) $(lib514_SOURCES) \
-       $(lib515_SOURCES) $(lib516_SOURCES) $(lib517_SOURCES) \
-       $(lib518_SOURCES) $(lib519_SOURCES) $(lib520_SOURCES) \
-       $(lib521_SOURCES) $(lib523_SOURCES) $(lib524_SOURCES) \
-       $(lib525_SOURCES) $(lib526_SOURCES) $(lib527_SOURCES) \
-       $(lib529_SOURCES) $(lib530_SOURCES) $(lib532_SOURCES) \
-       $(lib533_SOURCES) $(lib536_SOURCES) $(lib537_SOURCES) \
+       $(lib1540_SOURCES) $(lib1541_SOURCES) $(lib1550_SOURCES) \
+       $(lib1551_SOURCES) $(lib1552_SOURCES) $(lib1553_SOURCES) \
+       $(lib1554_SOURCES) $(lib1555_SOURCES) $(lib1556_SOURCES) \
+       $(lib1557_SOURCES) $(lib1558_SOURCES) $(lib1559_SOURCES) \
+       $(lib1560_SOURCES) $(lib1564_SOURCES) $(lib1565_SOURCES) \
+       $(lib1591_SOURCES) $(lib1592_SOURCES) $(lib1593_SOURCES) \
+       $(lib1594_SOURCES) $(lib1596_SOURCES) $(lib1900_SOURCES) \
+       $(lib1905_SOURCES) $(lib1906_SOURCES) $(lib1907_SOURCES) \
+       $(lib2033_SOURCES) $(lib500_SOURCES) $(lib501_SOURCES) \
+       $(lib502_SOURCES) $(lib503_SOURCES) $(lib504_SOURCES) \
+       $(lib505_SOURCES) $(lib506_SOURCES) $(lib507_SOURCES) \
+       $(lib508_SOURCES) $(lib509_SOURCES) $(lib510_SOURCES) \
+       $(lib511_SOURCES) $(lib512_SOURCES) $(lib513_SOURCES) \
+       $(lib514_SOURCES) $(lib515_SOURCES) $(lib516_SOURCES) \
+       $(lib517_SOURCES) $(lib518_SOURCES) $(lib519_SOURCES) \
+       $(lib520_SOURCES) $(lib521_SOURCES) $(lib523_SOURCES) \
+       $(lib524_SOURCES) $(lib525_SOURCES) $(lib526_SOURCES) \
+       $(lib527_SOURCES) $(lib529_SOURCES) $(lib530_SOURCES) \
+       $(lib532_SOURCES) $(lib533_SOURCES) $(lib537_SOURCES) \
        $(lib539_SOURCES) $(lib540_SOURCES) $(lib541_SOURCES) \
        $(lib542_SOURCES) $(lib543_SOURCES) $(lib544_SOURCES) \
        $(lib545_SOURCES) $(lib547_SOURCES) $(lib548_SOURCES) \
@@ -1357,7 +1499,8 @@ SOURCES = $(libhostname_la_SOURCES) $(libstubgss_la_SOURCES) \
        $(lib599_SOURCES) $(lib643_SOURCES) $(lib644_SOURCES) \
        $(lib645_SOURCES) $(lib650_SOURCES) $(lib651_SOURCES) \
        $(lib652_SOURCES) $(lib653_SOURCES) $(lib654_SOURCES) \
-       $(lib655_SOURCES) $(libauthretry_SOURCES) \
+       $(lib655_SOURCES) $(lib658_SOURCES) $(lib659_SOURCES) \
+       $(lib661_SOURCES) $(libauthretry_SOURCES) \
        $(libntlmconnect_SOURCES)
 DIST_SOURCES = $(libhostname_la_SOURCES) \
        $(am__libstubgss_la_SOURCES_DIST) $(chkdecimalpoint_SOURCES) \
@@ -1367,16 +1510,21 @@ DIST_SOURCES = $(libhostname_la_SOURCES) \
        $(lib1507_SOURCES) $(lib1508_SOURCES) $(lib1509_SOURCES) \
        $(lib1510_SOURCES) $(lib1511_SOURCES) $(lib1512_SOURCES) \
        $(lib1513_SOURCES) $(lib1514_SOURCES) $(lib1515_SOURCES) \
-       $(lib1517_SOURCES) $(lib1520_SOURCES) $(lib1522_SOURCES) \
-       $(lib1525_SOURCES) $(lib1526_SOURCES) $(lib1527_SOURCES) \
-       $(lib1528_SOURCES) $(lib1529_SOURCES) $(lib1530_SOURCES) \
-       $(lib1531_SOURCES) $(lib1532_SOURCES) $(lib1533_SOURCES) \
-       $(lib1534_SOURCES) $(lib1535_SOURCES) $(lib1536_SOURCES) \
-       $(lib1537_SOURCES) $(lib1538_SOURCES) $(lib1540_SOURCES) \
+       $(lib1517_SOURCES) $(lib1518_SOURCES) $(lib1520_SOURCES) \
+       $(lib1522_SOURCES) $(lib1523_SOURCES) $(lib1525_SOURCES) \
+       $(lib1526_SOURCES) $(lib1527_SOURCES) $(lib1528_SOURCES) \
+       $(lib1529_SOURCES) $(lib1530_SOURCES) $(lib1531_SOURCES) \
+       $(lib1532_SOURCES) $(lib1533_SOURCES) $(lib1534_SOURCES) \
+       $(lib1535_SOURCES) $(lib1536_SOURCES) $(lib1537_SOURCES) \
+       $(lib1538_SOURCES) $(lib1540_SOURCES) $(lib1541_SOURCES) \
        $(lib1550_SOURCES) $(lib1551_SOURCES) $(lib1552_SOURCES) \
        $(lib1553_SOURCES) $(lib1554_SOURCES) $(lib1555_SOURCES) \
-       $(lib1556_SOURCES) $(lib1557_SOURCES) $(lib1560_SOURCES) \
-       $(lib1900_SOURCES) $(lib2033_SOURCES) $(lib500_SOURCES) \
+       $(lib1556_SOURCES) $(lib1557_SOURCES) $(lib1558_SOURCES) \
+       $(lib1559_SOURCES) $(lib1560_SOURCES) $(lib1564_SOURCES) \
+       $(lib1565_SOURCES) $(lib1591_SOURCES) $(lib1592_SOURCES) \
+       $(lib1593_SOURCES) $(lib1594_SOURCES) $(lib1596_SOURCES) \
+       $(lib1900_SOURCES) $(lib1905_SOURCES) $(lib1906_SOURCES) \
+       $(lib1907_SOURCES) $(lib2033_SOURCES) $(lib500_SOURCES) \
        $(lib501_SOURCES) $(lib502_SOURCES) $(lib503_SOURCES) \
        $(lib504_SOURCES) $(lib505_SOURCES) $(lib506_SOURCES) \
        $(lib507_SOURCES) $(lib508_SOURCES) $(lib509_SOURCES) \
@@ -1387,26 +1535,27 @@ DIST_SOURCES = $(libhostname_la_SOURCES) \
        $(lib523_SOURCES) $(lib524_SOURCES) $(lib525_SOURCES) \
        $(lib526_SOURCES) $(lib527_SOURCES) $(lib529_SOURCES) \
        $(lib530_SOURCES) $(lib532_SOURCES) $(lib533_SOURCES) \
-       $(lib536_SOURCES) $(lib537_SOURCES) $(lib539_SOURCES) \
-       $(lib540_SOURCES) $(lib541_SOURCES) $(lib542_SOURCES) \
-       $(lib543_SOURCES) $(lib544_SOURCES) $(lib545_SOURCES) \
-       $(lib547_SOURCES) $(lib548_SOURCES) $(lib549_SOURCES) \
-       $(lib552_SOURCES) $(lib553_SOURCES) $(lib554_SOURCES) \
-       $(lib555_SOURCES) $(lib556_SOURCES) $(lib557_SOURCES) \
-       $(lib558_SOURCES) $(lib559_SOURCES) $(lib560_SOURCES) \
-       $(lib562_SOURCES) $(lib564_SOURCES) $(lib565_SOURCES) \
-       $(lib566_SOURCES) $(lib567_SOURCES) $(lib568_SOURCES) \
-       $(lib569_SOURCES) $(lib570_SOURCES) $(lib571_SOURCES) \
-       $(lib572_SOURCES) $(lib573_SOURCES) $(lib574_SOURCES) \
-       $(lib575_SOURCES) $(lib576_SOURCES) $(lib578_SOURCES) \
-       $(lib579_SOURCES) $(lib582_SOURCES) $(lib583_SOURCES) \
-       $(lib585_SOURCES) $(lib586_SOURCES) $(lib587_SOURCES) \
-       $(lib589_SOURCES) $(lib590_SOURCES) $(lib591_SOURCES) \
-       $(lib597_SOURCES) $(lib598_SOURCES) $(lib599_SOURCES) \
-       $(lib643_SOURCES) $(lib644_SOURCES) $(lib645_SOURCES) \
-       $(lib650_SOURCES) $(lib651_SOURCES) $(lib652_SOURCES) \
-       $(lib653_SOURCES) $(lib654_SOURCES) $(lib655_SOURCES) \
-       $(libauthretry_SOURCES) $(libntlmconnect_SOURCES)
+       $(lib537_SOURCES) $(lib539_SOURCES) $(lib540_SOURCES) \
+       $(lib541_SOURCES) $(lib542_SOURCES) $(lib543_SOURCES) \
+       $(lib544_SOURCES) $(lib545_SOURCES) $(lib547_SOURCES) \
+       $(lib548_SOURCES) $(lib549_SOURCES) $(lib552_SOURCES) \
+       $(lib553_SOURCES) $(lib554_SOURCES) $(lib555_SOURCES) \
+       $(lib556_SOURCES) $(lib557_SOURCES) $(lib558_SOURCES) \
+       $(lib559_SOURCES) $(lib560_SOURCES) $(lib562_SOURCES) \
+       $(lib564_SOURCES) $(lib565_SOURCES) $(lib566_SOURCES) \
+       $(lib567_SOURCES) $(lib568_SOURCES) $(lib569_SOURCES) \
+       $(lib570_SOURCES) $(lib571_SOURCES) $(lib572_SOURCES) \
+       $(lib573_SOURCES) $(lib574_SOURCES) $(lib575_SOURCES) \
+       $(lib576_SOURCES) $(lib578_SOURCES) $(lib579_SOURCES) \
+       $(lib582_SOURCES) $(lib583_SOURCES) $(lib585_SOURCES) \
+       $(lib586_SOURCES) $(lib587_SOURCES) $(lib589_SOURCES) \
+       $(lib590_SOURCES) $(lib591_SOURCES) $(lib597_SOURCES) \
+       $(lib598_SOURCES) $(lib599_SOURCES) $(lib643_SOURCES) \
+       $(lib644_SOURCES) $(lib645_SOURCES) $(lib650_SOURCES) \
+       $(lib651_SOURCES) $(lib652_SOURCES) $(lib653_SOURCES) \
+       $(lib654_SOURCES) $(lib655_SOURCES) $(lib658_SOURCES) \
+       $(lib659_SOURCES) $(lib661_SOURCES) $(libauthretry_SOURCES) \
+       $(libntlmconnect_SOURCES)
 am__can_run_installinfo = \
   case $$AM_UPDATE_INFO_DIR in \
     n|no|NO) false;; \
@@ -1449,12 +1598,6 @@ CC = @CC@
 CCDEPMODE = @CCDEPMODE@
 CFLAGS = @CFLAGS@ @CURL_CFLAG_EXTRAS@
 CFLAG_CURL_SYMBOL_HIDING = @CFLAG_CURL_SYMBOL_HIDING@
-CODE_COVERAGE_CFLAGS = @CODE_COVERAGE_CFLAGS@
-CODE_COVERAGE_CPPFLAGS = @CODE_COVERAGE_CPPFLAGS@
-CODE_COVERAGE_CXXFLAGS = @CODE_COVERAGE_CXXFLAGS@
-CODE_COVERAGE_ENABLED = @CODE_COVERAGE_ENABLED@
-CODE_COVERAGE_LDFLAGS = @CODE_COVERAGE_LDFLAGS@
-CODE_COVERAGE_LIBS = @CODE_COVERAGE_LIBS@
 CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
@@ -1496,14 +1639,15 @@ ENABLE_SHARED = @ENABLE_SHARED@
 ENABLE_STATIC = @ENABLE_STATIC@
 EXEEXT = @EXEEXT@
 FGREP = @FGREP@
+FISH_FUNCTIONS_DIR = @FISH_FUNCTIONS_DIR@
 GCOV = @GCOV@
-GENHTML = @GENHTML@
 GREP = @GREP@
 HAVE_BROTLI = @HAVE_BROTLI@
 HAVE_GNUTLS_SRP = @HAVE_GNUTLS_SRP@
 HAVE_LDAP_SSL = @HAVE_LDAP_SSL@
 HAVE_LIBZ = @HAVE_LIBZ@
 HAVE_OPENSSL_SRP = @HAVE_OPENSSL_SRP@
+HAVE_PROTO_BSDSOCKET_H = @HAVE_PROTO_BSDSOCKET_H@
 IDN_ENABLED = @IDN_ENABLED@
 INSTALL = @INSTALL@
 INSTALL_DATA = @INSTALL_DATA@
@@ -1566,9 +1710,7 @@ STRIP = @STRIP@
 SUPPORT_FEATURES = @SUPPORT_FEATURES@
 SUPPORT_PROTOCOLS = @SUPPORT_PROTOCOLS@
 USE_ARES = @USE_ARES@
-USE_AXTLS = @USE_AXTLS@
-USE_CYASSL = @USE_CYASSL@
-USE_DARWINSSL = @USE_DARWINSSL@
+USE_BEARSSL = @USE_BEARSSL@
 USE_GNUTLS = @USE_GNUTLS@
 USE_GNUTLS_NETTLE = @USE_GNUTLS_NETTLE@
 USE_LIBRTMP = @USE_LIBRTMP@
@@ -1577,12 +1719,17 @@ USE_LIBSSH2 = @USE_LIBSSH2@
 USE_MBEDTLS = @USE_MBEDTLS@
 USE_MESALINK = @USE_MESALINK@
 USE_NGHTTP2 = @USE_NGHTTP2@
+USE_NGHTTP3 = @USE_NGHTTP3@
+USE_NGTCP2 = @USE_NGTCP2@
+USE_NGTCP2_CRYPTO_OPENSSL = @USE_NGTCP2_CRYPTO_OPENSSL@
 USE_NSS = @USE_NSS@
 USE_OPENLDAP = @USE_OPENLDAP@
-USE_POLARSSL = @USE_POLARSSL@
+USE_QUICHE = @USE_QUICHE@
 USE_SCHANNEL = @USE_SCHANNEL@
+USE_SECTRANSP = @USE_SECTRANSP@
 USE_UNIX_SOCKETS = @USE_UNIX_SOCKETS@
 USE_WINDOWS_SSPI = @USE_WINDOWS_SSPI@
+USE_WOLFSSL = @USE_WOLFSSL@
 VERSION = @VERSION@
 VERSIONNUM = @VERSIONNUM@
 ZLIB_LIBS = @ZLIB_LIBS@
@@ -1650,7 +1797,7 @@ top_srcdir = @top_srcdir@
 #                            | (__| |_| |  _ <| |___
 #                             \___|\___/|_| \_\_____|
 #
-# Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 #
 # This software is licensed as described in the file COPYING, which
 # you should have received as part of this distribution. The terms
@@ -1797,9 +1944,6 @@ lib532_CPPFLAGS = $(AM_CPPFLAGS) -DLIB532
 lib533_SOURCES = lib533.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
 lib533_LDADD = $(TESTUTIL_LIBS)
 lib533_CPPFLAGS = $(AM_CPPFLAGS)
-lib536_SOURCES = lib536.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
-lib536_LDADD = $(TESTUTIL_LIBS)
-lib536_CPPFLAGS = $(AM_CPPFLAGS)
 lib537_SOURCES = lib537.c $(SUPPORTFILES) $(WARNLESS)
 lib537_CPPFLAGS = $(AM_CPPFLAGS)
 lib539_SOURCES = lib539.c $(SUPPORTFILES)
@@ -1922,6 +2066,14 @@ lib654_SOURCES = lib654.c $(SUPPORTFILES)
 lib654_CPPFLAGS = $(AM_CPPFLAGS)
 lib655_SOURCES = lib655.c $(SUPPORTFILES)
 lib655_CPPFLAGS = $(AM_CPPFLAGS)
+lib658_SOURCES = lib658.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
+lib658_LDADD = $(TESTUTIL_LIBS)
+lib658_CPPFLAGS = $(AM_CPPFLAGS)
+lib659_SOURCES = lib659.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
+lib659_LDADD = $(TESTUTIL_LIBS)
+lib659_CPPFLAGS = $(AM_CPPFLAGS)
+lib661_SOURCES = lib661.c $(SUPPORTFILES)
+lib661_CPPFLAGS = $(AM_CPPFLAGS)
 lib1500_SOURCES = lib1500.c $(SUPPORTFILES) $(TESTUTIL)
 lib1500_LDADD = $(TESTUTIL_LIBS)
 lib1500_CPPFLAGS = $(AM_CPPFLAGS)
@@ -1975,12 +2127,16 @@ lib1515_LDADD = $(TESTUTIL_LIBS)
 lib1515_CPPFLAGS = $(AM_CPPFLAGS) -DLIB1515
 lib1517_SOURCES = lib1517.c $(SUPPORTFILES)
 lib1517_CPPFLAGS = $(AM_CPPFLAGS) -DLIB1517
+lib1518_SOURCES = lib1518.c $(SUPPORTFILES)
+lib1518_CPPFLAGS = $(AM_CPPFLAGS)
 lib1520_SOURCES = lib1520.c $(SUPPORTFILES)
 lib1520_CPPFLAGS = $(AM_CPPFLAGS) -DLIB1520
 nodist_lib1521_SOURCES = lib1521.c $(SUPPORTFILES)
 lib1521_CPPFLAGS = $(AM_CPPFLAGS) -I$(srcdir)
 lib1522_SOURCES = lib1522.c $(SUPPORTFILES)
 lib1522_CPPFLAGS = $(AM_CPPFLAGS)
+lib1523_SOURCES = lib1523.c $(SUPPORTFILES)
+lib1523_CPPFLAGS = $(AM_CPPFLAGS)
 lib1525_SOURCES = lib1525.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
 lib1525_LDADD = $(TESTUTIL_LIBS)
 lib1525_CPPFLAGS = $(AM_CPPFLAGS) -DLIB1525
@@ -2026,6 +2182,9 @@ lib1538_CPPFLAGS = $(AM_CPPFLAGS)
 lib1540_SOURCES = lib1540.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
 lib1540_LDADD = $(TESTUTIL_LIBS)
 lib1540_CPPFLAGS = $(AM_CPPFLAGS)
+lib1541_SOURCES = lib1541.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
+lib1541_LDADD = $(TESTUTIL_LIBS)
+lib1541_CPPFLAGS = $(AM_CPPFLAGS)
 lib1550_SOURCES = lib1550.c $(SUPPORTFILES)
 lib1550_CPPFLAGS = $(AM_CPPFLAGS) -DLIB1517
 lib1551_SOURCES = lib1551.c $(SUPPORTFILES)
@@ -2047,11 +2206,43 @@ lib1556_CPPFLAGS = $(AM_CPPFLAGS) -DLIB1556
 lib1557_SOURCES = lib1557.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
 lib1557_LDADD = $(TESTUTIL_LIBS)
 lib1557_CPPFLAGS = $(AM_CPPFLAGS) -DLIB1557
+lib1558_SOURCES = lib1558.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
+lib1558_LDADD = $(TESTUTIL_LIBS)
+lib1559_SOURCES = lib1559.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
+lib1559_LDADD = $(TESTUTIL_LIBS)
 lib1560_SOURCES = lib1560.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
 lib1560_LDADD = $(TESTUTIL_LIBS)
+lib1564_SOURCES = lib1564.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
+lib1564_LDADD = $(TESTUTIL_LIBS)
+lib1564_CPPFLAGS = $(AM_CPPFLAGS)
+lib1565_SOURCES = lib1565.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
+lib1565_LDADD = $(TESTUTIL_LIBS)
+lib1565_CPPFLAGS = $(AM_CPPFLAGS)
+lib1591_SOURCES = lib1591.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
+lib1591_LDADD = $(TESTUTIL_LIBS)
+lib1591_CPPFLAGS = $(AM_CPPFLAGS) -DLIB1591
+lib1592_SOURCES = lib1592.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
+lib1592_LDADD = $(TESTUTIL_LIBS)
+lib1592_CPPFLAGS = $(AM_CPPFLAGS) -DLIB1592
+lib1593_SOURCES = lib1593.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
+lib1593_LDADD = $(TESTUTIL_LIBS)
+lib1594_SOURCES = lib1594.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
+lib1594_LDADD = $(TESTUTIL_LIBS)
+lib1596_SOURCES = lib1594.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
+lib1596_LDADD = $(TESTUTIL_LIBS)
+lib1596_CPPFLAGS = $(AM_CPPFLAGS) -DLIB1596
 lib1900_SOURCES = lib1900.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
 lib1900_LDADD = $(TESTUTIL_LIBS)
 lib1900_CPPFLAGS = $(AM_CPPFLAGS)
+lib1905_SOURCES = lib1905.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
+lib1905_LDADD = $(TESTUTIL_LIBS)
+lib1905_CPPFLAGS = $(AM_CPPFLAGS)
+lib1906_SOURCES = lib1906.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
+lib1906_LDADD = $(TESTUTIL_LIBS)
+lib1906_CPPFLAGS = $(AM_CPPFLAGS)
+lib1907_SOURCES = lib1907.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
+lib1907_LDADD = $(TESTUTIL_LIBS)
+lib1907_CPPFLAGS = $(AM_CPPFLAGS)
 lib2033_SOURCES = libntlmconnect.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
 lib2033_LDADD = $(TESTUTIL_LIBS)
 lib2033_CPPFLAGS = $(AM_CPPFLAGS) -DUSE_PIPELINING
@@ -2082,6 +2273,10 @@ libhostname_la_DEPENDENCIES =
 @BUILD_STUB_GSS_TRUE@libstubgss_la_SOURCES = stub_gssapi.c stub_gssapi.h
 @BUILD_STUB_GSS_TRUE@libstubgss_la_LIBADD = 
 @BUILD_STUB_GSS_TRUE@libstubgss_la_DEPENDENCIES = 
+CHECKSRC = $(CS_$(V))
+CS_0 = @echo "  RUN     " $@;
+CS_1 = 
+CS_ = $(CS_0)
 all: all-am
 
 .SUFFIXES:
@@ -2267,6 +2462,10 @@ lib1517$(EXEEXT): $(lib1517_OBJECTS) $(lib1517_DEPENDENCIES) $(EXTRA_lib1517_DEP
        @rm -f lib1517$(EXEEXT)
        $(AM_V_CCLD)$(LINK) $(lib1517_OBJECTS) $(lib1517_LDADD) $(LIBS)
 
+lib1518$(EXEEXT): $(lib1518_OBJECTS) $(lib1518_DEPENDENCIES) $(EXTRA_lib1518_DEPENDENCIES) 
+       @rm -f lib1518$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(lib1518_OBJECTS) $(lib1518_LDADD) $(LIBS)
+
 lib1520$(EXEEXT): $(lib1520_OBJECTS) $(lib1520_DEPENDENCIES) $(EXTRA_lib1520_DEPENDENCIES) 
        @rm -f lib1520$(EXEEXT)
        $(AM_V_CCLD)$(LINK) $(lib1520_OBJECTS) $(lib1520_LDADD) $(LIBS)
@@ -2278,6 +2477,10 @@ lib1521$(EXEEXT): $(lib1521_OBJECTS) $(lib1521_DEPENDENCIES) $(EXTRA_lib1521_DEP
 lib1522$(EXEEXT): $(lib1522_OBJECTS) $(lib1522_DEPENDENCIES) $(EXTRA_lib1522_DEPENDENCIES) 
        @rm -f lib1522$(EXEEXT)
        $(AM_V_CCLD)$(LINK) $(lib1522_OBJECTS) $(lib1522_LDADD) $(LIBS)
+
+lib1523$(EXEEXT): $(lib1523_OBJECTS) $(lib1523_DEPENDENCIES) $(EXTRA_lib1523_DEPENDENCIES) 
+       @rm -f lib1523$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(lib1523_OBJECTS) $(lib1523_LDADD) $(LIBS)
 ../../lib/lib1525-warnless.$(OBJEXT): ../../lib/$(am__dirstamp) \
        ../../lib/$(DEPDIR)/$(am__dirstamp)
 
@@ -2368,6 +2571,12 @@ lib1538$(EXEEXT): $(lib1538_OBJECTS) $(lib1538_DEPENDENCIES) $(EXTRA_lib1538_DEP
 lib1540$(EXEEXT): $(lib1540_OBJECTS) $(lib1540_DEPENDENCIES) $(EXTRA_lib1540_DEPENDENCIES) 
        @rm -f lib1540$(EXEEXT)
        $(AM_V_CCLD)$(LINK) $(lib1540_OBJECTS) $(lib1540_LDADD) $(LIBS)
+../../lib/lib1541-warnless.$(OBJEXT): ../../lib/$(am__dirstamp) \
+       ../../lib/$(DEPDIR)/$(am__dirstamp)
+
+lib1541$(EXEEXT): $(lib1541_OBJECTS) $(lib1541_DEPENDENCIES) $(EXTRA_lib1541_DEPENDENCIES) 
+       @rm -f lib1541$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(lib1541_OBJECTS) $(lib1541_LDADD) $(LIBS)
 
 lib1550$(EXEEXT): $(lib1550_OBJECTS) $(lib1550_DEPENDENCIES) $(EXTRA_lib1550_DEPENDENCIES) 
        @rm -f lib1550$(EXEEXT)
@@ -2409,15 +2618,79 @@ lib1557$(EXEEXT): $(lib1557_OBJECTS) $(lib1557_DEPENDENCIES) $(EXTRA_lib1557_DEP
 ../../lib/warnless.$(OBJEXT): ../../lib/$(am__dirstamp) \
        ../../lib/$(DEPDIR)/$(am__dirstamp)
 
+lib1558$(EXEEXT): $(lib1558_OBJECTS) $(lib1558_DEPENDENCIES) $(EXTRA_lib1558_DEPENDENCIES) 
+       @rm -f lib1558$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(lib1558_OBJECTS) $(lib1558_LDADD) $(LIBS)
+
+lib1559$(EXEEXT): $(lib1559_OBJECTS) $(lib1559_DEPENDENCIES) $(EXTRA_lib1559_DEPENDENCIES) 
+       @rm -f lib1559$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(lib1559_OBJECTS) $(lib1559_LDADD) $(LIBS)
+
 lib1560$(EXEEXT): $(lib1560_OBJECTS) $(lib1560_DEPENDENCIES) $(EXTRA_lib1560_DEPENDENCIES) 
        @rm -f lib1560$(EXEEXT)
        $(AM_V_CCLD)$(LINK) $(lib1560_OBJECTS) $(lib1560_LDADD) $(LIBS)
+../../lib/lib1564-warnless.$(OBJEXT): ../../lib/$(am__dirstamp) \
+       ../../lib/$(DEPDIR)/$(am__dirstamp)
+
+lib1564$(EXEEXT): $(lib1564_OBJECTS) $(lib1564_DEPENDENCIES) $(EXTRA_lib1564_DEPENDENCIES) 
+       @rm -f lib1564$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(lib1564_OBJECTS) $(lib1564_LDADD) $(LIBS)
+../../lib/lib1565-warnless.$(OBJEXT): ../../lib/$(am__dirstamp) \
+       ../../lib/$(DEPDIR)/$(am__dirstamp)
+
+lib1565$(EXEEXT): $(lib1565_OBJECTS) $(lib1565_DEPENDENCIES) $(EXTRA_lib1565_DEPENDENCIES) 
+       @rm -f lib1565$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(lib1565_OBJECTS) $(lib1565_LDADD) $(LIBS)
+../../lib/lib1591-warnless.$(OBJEXT): ../../lib/$(am__dirstamp) \
+       ../../lib/$(DEPDIR)/$(am__dirstamp)
+
+lib1591$(EXEEXT): $(lib1591_OBJECTS) $(lib1591_DEPENDENCIES) $(EXTRA_lib1591_DEPENDENCIES) 
+       @rm -f lib1591$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(lib1591_OBJECTS) $(lib1591_LDADD) $(LIBS)
+../../lib/lib1592-warnless.$(OBJEXT): ../../lib/$(am__dirstamp) \
+       ../../lib/$(DEPDIR)/$(am__dirstamp)
+
+lib1592$(EXEEXT): $(lib1592_OBJECTS) $(lib1592_DEPENDENCIES) $(EXTRA_lib1592_DEPENDENCIES) 
+       @rm -f lib1592$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(lib1592_OBJECTS) $(lib1592_LDADD) $(LIBS)
+
+lib1593$(EXEEXT): $(lib1593_OBJECTS) $(lib1593_DEPENDENCIES) $(EXTRA_lib1593_DEPENDENCIES) 
+       @rm -f lib1593$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(lib1593_OBJECTS) $(lib1593_LDADD) $(LIBS)
+
+lib1594$(EXEEXT): $(lib1594_OBJECTS) $(lib1594_DEPENDENCIES) $(EXTRA_lib1594_DEPENDENCIES) 
+       @rm -f lib1594$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(lib1594_OBJECTS) $(lib1594_LDADD) $(LIBS)
+../../lib/lib1596-warnless.$(OBJEXT): ../../lib/$(am__dirstamp) \
+       ../../lib/$(DEPDIR)/$(am__dirstamp)
+
+lib1596$(EXEEXT): $(lib1596_OBJECTS) $(lib1596_DEPENDENCIES) $(EXTRA_lib1596_DEPENDENCIES) 
+       @rm -f lib1596$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(lib1596_OBJECTS) $(lib1596_LDADD) $(LIBS)
 ../../lib/lib1900-warnless.$(OBJEXT): ../../lib/$(am__dirstamp) \
        ../../lib/$(DEPDIR)/$(am__dirstamp)
 
 lib1900$(EXEEXT): $(lib1900_OBJECTS) $(lib1900_DEPENDENCIES) $(EXTRA_lib1900_DEPENDENCIES) 
        @rm -f lib1900$(EXEEXT)
        $(AM_V_CCLD)$(LINK) $(lib1900_OBJECTS) $(lib1900_LDADD) $(LIBS)
+../../lib/lib1905-warnless.$(OBJEXT): ../../lib/$(am__dirstamp) \
+       ../../lib/$(DEPDIR)/$(am__dirstamp)
+
+lib1905$(EXEEXT): $(lib1905_OBJECTS) $(lib1905_DEPENDENCIES) $(EXTRA_lib1905_DEPENDENCIES) 
+       @rm -f lib1905$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(lib1905_OBJECTS) $(lib1905_LDADD) $(LIBS)
+../../lib/lib1906-warnless.$(OBJEXT): ../../lib/$(am__dirstamp) \
+       ../../lib/$(DEPDIR)/$(am__dirstamp)
+
+lib1906$(EXEEXT): $(lib1906_OBJECTS) $(lib1906_DEPENDENCIES) $(EXTRA_lib1906_DEPENDENCIES) 
+       @rm -f lib1906$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(lib1906_OBJECTS) $(lib1906_LDADD) $(LIBS)
+../../lib/lib1907-warnless.$(OBJEXT): ../../lib/$(am__dirstamp) \
+       ../../lib/$(DEPDIR)/$(am__dirstamp)
+
+lib1907$(EXEEXT): $(lib1907_OBJECTS) $(lib1907_DEPENDENCIES) $(EXTRA_lib1907_DEPENDENCIES) 
+       @rm -f lib1907$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(lib1907_OBJECTS) $(lib1907_LDADD) $(LIBS)
 ../../lib/lib2033-warnless.$(OBJEXT): ../../lib/$(am__dirstamp) \
        ../../lib/$(DEPDIR)/$(am__dirstamp)
 
@@ -2572,12 +2845,6 @@ lib532$(EXEEXT): $(lib532_OBJECTS) $(lib532_DEPENDENCIES) $(EXTRA_lib532_DEPENDE
 lib533$(EXEEXT): $(lib533_OBJECTS) $(lib533_DEPENDENCIES) $(EXTRA_lib533_DEPENDENCIES) 
        @rm -f lib533$(EXEEXT)
        $(AM_V_CCLD)$(LINK) $(lib533_OBJECTS) $(lib533_LDADD) $(LIBS)
-../../lib/lib536-warnless.$(OBJEXT): ../../lib/$(am__dirstamp) \
-       ../../lib/$(DEPDIR)/$(am__dirstamp)
-
-lib536$(EXEEXT): $(lib536_OBJECTS) $(lib536_DEPENDENCIES) $(EXTRA_lib536_DEPENDENCIES) 
-       @rm -f lib536$(EXEEXT)
-       $(AM_V_CCLD)$(LINK) $(lib536_OBJECTS) $(lib536_LDADD) $(LIBS)
 ../../lib/lib537-warnless.$(OBJEXT): ../../lib/$(am__dirstamp) \
        ../../lib/$(DEPDIR)/$(am__dirstamp)
 
@@ -2828,6 +3095,22 @@ lib654$(EXEEXT): $(lib654_OBJECTS) $(lib654_DEPENDENCIES) $(EXTRA_lib654_DEPENDE
 lib655$(EXEEXT): $(lib655_OBJECTS) $(lib655_DEPENDENCIES) $(EXTRA_lib655_DEPENDENCIES) 
        @rm -f lib655$(EXEEXT)
        $(AM_V_CCLD)$(LINK) $(lib655_OBJECTS) $(lib655_LDADD) $(LIBS)
+../../lib/lib658-warnless.$(OBJEXT): ../../lib/$(am__dirstamp) \
+       ../../lib/$(DEPDIR)/$(am__dirstamp)
+
+lib658$(EXEEXT): $(lib658_OBJECTS) $(lib658_DEPENDENCIES) $(EXTRA_lib658_DEPENDENCIES) 
+       @rm -f lib658$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(lib658_OBJECTS) $(lib658_LDADD) $(LIBS)
+../../lib/lib659-warnless.$(OBJEXT): ../../lib/$(am__dirstamp) \
+       ../../lib/$(DEPDIR)/$(am__dirstamp)
+
+lib659$(EXEEXT): $(lib659_OBJECTS) $(lib659_DEPENDENCIES) $(EXTRA_lib659_DEPENDENCIES) 
+       @rm -f lib659$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(lib659_OBJECTS) $(lib659_LDADD) $(LIBS)
+
+lib661$(EXEEXT): $(lib661_OBJECTS) $(lib661_DEPENDENCIES) $(EXTRA_lib661_DEPENDENCIES) 
+       @rm -f lib661$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(lib661_OBJECTS) $(lib661_LDADD) $(LIBS)
 
 libauthretry$(EXEEXT): $(libauthretry_OBJECTS) $(libauthretry_DEPENDENCIES) $(EXTRA_libauthretry_DEPENDENCIES) 
        @rm -f libauthretry$(EXEEXT)
@@ -2880,10 +3163,19 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/lib1537-warnless.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/lib1538-warnless.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/lib1540-warnless.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/lib1541-warnless.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/lib1555-warnless.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/lib1556-warnless.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/lib1557-warnless.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/lib1564-warnless.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/lib1565-warnless.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/lib1591-warnless.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/lib1592-warnless.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/lib1596-warnless.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/lib1900-warnless.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/lib1905-warnless.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/lib1906-warnless.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/lib1907-warnless.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/lib2033-warnless.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/lib502-warnless.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/lib503-warnless.Po@am__quote@ # am--include-marker
@@ -2897,7 +3189,6 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/lib530-warnless.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/lib532-warnless.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/lib533-warnless.Po@am__quote@ # am--include-marker
-@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/lib536-warnless.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/lib537-warnless.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/lib540-warnless.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/lib552-warnless.Po@am__quote@ # am--include-marker
@@ -2911,6 +3202,8 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/lib582-warnless.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/lib591-warnless.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/lib597-warnless.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/lib658-warnless.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/lib659-warnless.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/libntlmconnect-warnless.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/warnless.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/chkdecimalpoint-chkdecimalpoint.Po@am__quote@ # am--include-marker
@@ -2969,12 +3262,16 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1515-testutil.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1517-first.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1517-lib1517.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1518-first.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1518-lib1518.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1520-first.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1520-lib1520.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1521-first.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1521-lib1521.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1522-first.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1522-lib1522.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1523-first.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1523-lib1523.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1525-first.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1525-lib1525.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1525-testutil.Po@am__quote@ # am--include-marker
@@ -3020,6 +3317,9 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1540-first.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1540-lib1540.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1540-testutil.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1541-first.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1541-lib1541.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1541-testutil.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1550-first.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1550-lib1550.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1551-first.Po@am__quote@ # am--include-marker
@@ -3041,10 +3341,38 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1557-first.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1557-lib1557.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1557-testutil.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1558.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1559.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1560.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1564-first.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1564-lib1564.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1564-testutil.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1565-first.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1565-lib1565.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1565-testutil.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1591-first.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1591-lib1591.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1591-testutil.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1592-first.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1592-lib1592.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1592-testutil.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1593.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1594.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1596-first.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1596-lib1594.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1596-testutil.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1900-first.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1900-lib1900.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1900-testutil.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1905-first.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1905-lib1905.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1905-testutil.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1906-first.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1906-lib1906.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1906-testutil.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1907-first.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1907-lib1907.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1907-testutil.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib2033-first.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib2033-libntlmconnect.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib2033-testutil.Po@am__quote@ # am--include-marker
@@ -3123,9 +3451,6 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib533-first.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib533-lib533.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib533-testutil.Po@am__quote@ # am--include-marker
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib536-first.Po@am__quote@ # am--include-marker
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib536-lib536.Po@am__quote@ # am--include-marker
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib536-testutil.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib537-first.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib537-lib537.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib539-first.Po@am__quote@ # am--include-marker
@@ -3250,6 +3575,14 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib654-lib654.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib655-first.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib655-lib655.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib658-first.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib658-lib658.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib658-testutil.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib659-first.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib659-lib659.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib659-testutil.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib661-first.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib661-lib661.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libauthretry-first.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libauthretry-libauthretry.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhostname_la-sethostname.Plo@am__quote@ # am--include-marker
@@ -4339,6 +4672,34 @@ lib1517-first.obj: first.c
 @AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1517_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1517-first.obj `if test -f 'first.c'; then $(CYGPATH_W) 'first.c'; else $(CYGPATH_W) '$(srcdir)/first.c'; fi`
 
+lib1518-lib1518.o: lib1518.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1518_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1518-lib1518.o -MD -MP -MF $(DEPDIR)/lib1518-lib1518.Tpo -c -o lib1518-lib1518.o `test -f 'lib1518.c' || echo '$(srcdir)/'`lib1518.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/lib1518-lib1518.Tpo $(DEPDIR)/lib1518-lib1518.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='lib1518.c' object='lib1518-lib1518.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1518_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1518-lib1518.o `test -f 'lib1518.c' || echo '$(srcdir)/'`lib1518.c
+
+lib1518-lib1518.obj: lib1518.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1518_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1518-lib1518.obj -MD -MP -MF $(DEPDIR)/lib1518-lib1518.Tpo -c -o lib1518-lib1518.obj `if test -f 'lib1518.c'; then $(CYGPATH_W) 'lib1518.c'; else $(CYGPATH_W) '$(srcdir)/lib1518.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/lib1518-lib1518.Tpo $(DEPDIR)/lib1518-lib1518.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='lib1518.c' object='lib1518-lib1518.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1518_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1518-lib1518.obj `if test -f 'lib1518.c'; then $(CYGPATH_W) 'lib1518.c'; else $(CYGPATH_W) '$(srcdir)/lib1518.c'; fi`
+
+lib1518-first.o: first.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1518_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1518-first.o -MD -MP -MF $(DEPDIR)/lib1518-first.Tpo -c -o lib1518-first.o `test -f 'first.c' || echo '$(srcdir)/'`first.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/lib1518-first.Tpo $(DEPDIR)/lib1518-first.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='first.c' object='lib1518-first.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1518_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1518-first.o `test -f 'first.c' || echo '$(srcdir)/'`first.c
+
+lib1518-first.obj: first.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1518_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1518-first.obj -MD -MP -MF $(DEPDIR)/lib1518-first.Tpo -c -o lib1518-first.obj `if test -f 'first.c'; then $(CYGPATH_W) 'first.c'; else $(CYGPATH_W) '$(srcdir)/first.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/lib1518-first.Tpo $(DEPDIR)/lib1518-first.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='first.c' object='lib1518-first.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1518_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1518-first.obj `if test -f 'first.c'; then $(CYGPATH_W) 'first.c'; else $(CYGPATH_W) '$(srcdir)/first.c'; fi`
+
 lib1520-lib1520.o: lib1520.c
 @am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1520_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1520-lib1520.o -MD -MP -MF $(DEPDIR)/lib1520-lib1520.Tpo -c -o lib1520-lib1520.o `test -f 'lib1520.c' || echo '$(srcdir)/'`lib1520.c
 @am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/lib1520-lib1520.Tpo $(DEPDIR)/lib1520-lib1520.Po
@@ -4423,6 +4784,34 @@ lib1522-first.obj: first.c
 @AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1522_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1522-first.obj `if test -f 'first.c'; then $(CYGPATH_W) 'first.c'; else $(CYGPATH_W) '$(srcdir)/first.c'; fi`
 
+lib1523-lib1523.o: lib1523.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1523_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1523-lib1523.o -MD -MP -MF $(DEPDIR)/lib1523-lib1523.Tpo -c -o lib1523-lib1523.o `test -f 'lib1523.c' || echo '$(srcdir)/'`lib1523.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/lib1523-lib1523.Tpo $(DEPDIR)/lib1523-lib1523.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='lib1523.c' object='lib1523-lib1523.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1523_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1523-lib1523.o `test -f 'lib1523.c' || echo '$(srcdir)/'`lib1523.c
+
+lib1523-lib1523.obj: lib1523.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1523_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1523-lib1523.obj -MD -MP -MF $(DEPDIR)/lib1523-lib1523.Tpo -c -o lib1523-lib1523.obj `if test -f 'lib1523.c'; then $(CYGPATH_W) 'lib1523.c'; else $(CYGPATH_W) '$(srcdir)/lib1523.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/lib1523-lib1523.Tpo $(DEPDIR)/lib1523-lib1523.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='lib1523.c' object='lib1523-lib1523.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1523_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1523-lib1523.obj `if test -f 'lib1523.c'; then $(CYGPATH_W) 'lib1523.c'; else $(CYGPATH_W) '$(srcdir)/lib1523.c'; fi`
+
+lib1523-first.o: first.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1523_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1523-first.o -MD -MP -MF $(DEPDIR)/lib1523-first.Tpo -c -o lib1523-first.o `test -f 'first.c' || echo '$(srcdir)/'`first.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/lib1523-first.Tpo $(DEPDIR)/lib1523-first.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='first.c' object='lib1523-first.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1523_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1523-first.o `test -f 'first.c' || echo '$(srcdir)/'`first.c
+
+lib1523-first.obj: first.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1523_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1523-first.obj -MD -MP -MF $(DEPDIR)/lib1523-first.Tpo -c -o lib1523-first.obj `if test -f 'first.c'; then $(CYGPATH_W) 'first.c'; else $(CYGPATH_W) '$(srcdir)/first.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/lib1523-first.Tpo $(DEPDIR)/lib1523-first.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='first.c' object='lib1523-first.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1523_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1523-first.obj `if test -f 'first.c'; then $(CYGPATH_W) 'first.c'; else $(CYGPATH_W) '$(srcdir)/first.c'; fi`
+
 lib1525-lib1525.o: lib1525.c
 @am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1525_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1525-lib1525.o -MD -MP -MF $(DEPDIR)/lib1525-lib1525.Tpo -c -o lib1525-lib1525.o `test -f 'lib1525.c' || echo '$(srcdir)/'`lib1525.c
 @am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/lib1525-lib1525.Tpo $(DEPDIR)/lib1525-lib1525.Po
@@ -5263,6 +5652,62 @@ lib1540-testutil.obj: testutil.c
 @AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1540_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../../lib/lib1540-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
 
+lib1541-lib1541.o: lib1541.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1541_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1541-lib1541.o -MD -MP -MF $(DEPDIR)/lib1541-lib1541.Tpo -c -o lib1541-lib1541.o `test -f 'lib1541.c' || echo '$(srcdir)/'`lib1541.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/lib1541-lib1541.Tpo $(DEPDIR)/lib1541-lib1541.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='lib1541.c' object='lib1541-lib1541.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1541_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1541-lib1541.o `test -f 'lib1541.c' || echo '$(srcdir)/'`lib1541.c
+
+lib1541-lib1541.obj: lib1541.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1541_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1541-lib1541.obj -MD -MP -MF $(DEPDIR)/lib1541-lib1541.Tpo -c -o lib1541-lib1541.obj `if test -f 'lib1541.c'; then $(CYGPATH_W) 'lib1541.c'; else $(CYGPATH_W) '$(srcdir)/lib1541.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/lib1541-lib1541.Tpo $(DEPDIR)/lib1541-lib1541.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='lib1541.c' object='lib1541-lib1541.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1541_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1541-lib1541.obj `if test -f 'lib1541.c'; then $(CYGPATH_W) 'lib1541.c'; else $(CYGPATH_W) '$(srcdir)/lib1541.c'; fi`
+
+lib1541-first.o: first.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1541_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1541-first.o -MD -MP -MF $(DEPDIR)/lib1541-first.Tpo -c -o lib1541-first.o `test -f 'first.c' || echo '$(srcdir)/'`first.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/lib1541-first.Tpo $(DEPDIR)/lib1541-first.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='first.c' object='lib1541-first.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1541_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1541-first.o `test -f 'first.c' || echo '$(srcdir)/'`first.c
+
+lib1541-first.obj: first.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1541_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1541-first.obj -MD -MP -MF $(DEPDIR)/lib1541-first.Tpo -c -o lib1541-first.obj `if test -f 'first.c'; then $(CYGPATH_W) 'first.c'; else $(CYGPATH_W) '$(srcdir)/first.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/lib1541-first.Tpo $(DEPDIR)/lib1541-first.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='first.c' object='lib1541-first.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1541_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1541-first.obj `if test -f 'first.c'; then $(CYGPATH_W) 'first.c'; else $(CYGPATH_W) '$(srcdir)/first.c'; fi`
+
+lib1541-testutil.o: testutil.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1541_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1541-testutil.o -MD -MP -MF $(DEPDIR)/lib1541-testutil.Tpo -c -o lib1541-testutil.o `test -f 'testutil.c' || echo '$(srcdir)/'`testutil.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/lib1541-testutil.Tpo $(DEPDIR)/lib1541-testutil.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='testutil.c' object='lib1541-testutil.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1541_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1541-testutil.o `test -f 'testutil.c' || echo '$(srcdir)/'`testutil.c
+
+lib1541-testutil.obj: testutil.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1541_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1541-testutil.obj -MD -MP -MF $(DEPDIR)/lib1541-testutil.Tpo -c -o lib1541-testutil.obj `if test -f 'testutil.c'; then $(CYGPATH_W) 'testutil.c'; else $(CYGPATH_W) '$(srcdir)/testutil.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/lib1541-testutil.Tpo $(DEPDIR)/lib1541-testutil.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='testutil.c' object='lib1541-testutil.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1541_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1541-testutil.obj `if test -f 'testutil.c'; then $(CYGPATH_W) 'testutil.c'; else $(CYGPATH_W) '$(srcdir)/testutil.c'; fi`
+
+../../lib/lib1541-warnless.o: ../../lib/warnless.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1541_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../../lib/lib1541-warnless.o -MD -MP -MF ../../lib/$(DEPDIR)/lib1541-warnless.Tpo -c -o ../../lib/lib1541-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/lib1541-warnless.Tpo ../../lib/$(DEPDIR)/lib1541-warnless.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='../../lib/warnless.c' object='../../lib/lib1541-warnless.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1541_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../../lib/lib1541-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
+
+../../lib/lib1541-warnless.obj: ../../lib/warnless.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1541_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../../lib/lib1541-warnless.obj -MD -MP -MF ../../lib/$(DEPDIR)/lib1541-warnless.Tpo -c -o ../../lib/lib1541-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/lib1541-warnless.Tpo ../../lib/$(DEPDIR)/lib1541-warnless.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='../../lib/warnless.c' object='../../lib/lib1541-warnless.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1541_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../../lib/lib1541-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
+
 lib1550-lib1550.o: lib1550.c
 @am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1550_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1550-lib1550.o -MD -MP -MF $(DEPDIR)/lib1550-lib1550.Tpo -c -o lib1550-lib1550.o `test -f 'lib1550.c' || echo '$(srcdir)/'`lib1550.c
 @am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/lib1550-lib1550.Tpo $(DEPDIR)/lib1550-lib1550.Po
@@ -5599,6 +6044,286 @@ lib1557-testutil.obj: testutil.c
 @AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1557_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../../lib/lib1557-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
 
+lib1564-lib1564.o: lib1564.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1564_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1564-lib1564.o -MD -MP -MF $(DEPDIR)/lib1564-lib1564.Tpo -c -o lib1564-lib1564.o `test -f 'lib1564.c' || echo '$(srcdir)/'`lib1564.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/lib1564-lib1564.Tpo $(DEPDIR)/lib1564-lib1564.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='lib1564.c' object='lib1564-lib1564.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1564_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1564-lib1564.o `test -f 'lib1564.c' || echo '$(srcdir)/'`lib1564.c
+
+lib1564-lib1564.obj: lib1564.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1564_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1564-lib1564.obj -MD -MP -MF $(DEPDIR)/lib1564-lib1564.Tpo -c -o lib1564-lib1564.obj `if test -f 'lib1564.c'; then $(CYGPATH_W) 'lib1564.c'; else $(CYGPATH_W) '$(srcdir)/lib1564.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/lib1564-lib1564.Tpo $(DEPDIR)/lib1564-lib1564.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='lib1564.c' object='lib1564-lib1564.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1564_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1564-lib1564.obj `if test -f 'lib1564.c'; then $(CYGPATH_W) 'lib1564.c'; else $(CYGPATH_W) '$(srcdir)/lib1564.c'; fi`
+
+lib1564-first.o: first.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1564_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1564-first.o -MD -MP -MF $(DEPDIR)/lib1564-first.Tpo -c -o lib1564-first.o `test -f 'first.c' || echo '$(srcdir)/'`first.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/lib1564-first.Tpo $(DEPDIR)/lib1564-first.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='first.c' object='lib1564-first.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1564_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1564-first.o `test -f 'first.c' || echo '$(srcdir)/'`first.c
+
+lib1564-first.obj: first.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1564_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1564-first.obj -MD -MP -MF $(DEPDIR)/lib1564-first.Tpo -c -o lib1564-first.obj `if test -f 'first.c'; then $(CYGPATH_W) 'first.c'; else $(CYGPATH_W) '$(srcdir)/first.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/lib1564-first.Tpo $(DEPDIR)/lib1564-first.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='first.c' object='lib1564-first.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1564_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1564-first.obj `if test -f 'first.c'; then $(CYGPATH_W) 'first.c'; else $(CYGPATH_W) '$(srcdir)/first.c'; fi`
+
+lib1564-testutil.o: testutil.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1564_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1564-testutil.o -MD -MP -MF $(DEPDIR)/lib1564-testutil.Tpo -c -o lib1564-testutil.o `test -f 'testutil.c' || echo '$(srcdir)/'`testutil.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/lib1564-testutil.Tpo $(DEPDIR)/lib1564-testutil.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='testutil.c' object='lib1564-testutil.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1564_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1564-testutil.o `test -f 'testutil.c' || echo '$(srcdir)/'`testutil.c
+
+lib1564-testutil.obj: testutil.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1564_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1564-testutil.obj -MD -MP -MF $(DEPDIR)/lib1564-testutil.Tpo -c -o lib1564-testutil.obj `if test -f 'testutil.c'; then $(CYGPATH_W) 'testutil.c'; else $(CYGPATH_W) '$(srcdir)/testutil.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/lib1564-testutil.Tpo $(DEPDIR)/lib1564-testutil.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='testutil.c' object='lib1564-testutil.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1564_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1564-testutil.obj `if test -f 'testutil.c'; then $(CYGPATH_W) 'testutil.c'; else $(CYGPATH_W) '$(srcdir)/testutil.c'; fi`
+
+../../lib/lib1564-warnless.o: ../../lib/warnless.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1564_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../../lib/lib1564-warnless.o -MD -MP -MF ../../lib/$(DEPDIR)/lib1564-warnless.Tpo -c -o ../../lib/lib1564-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/lib1564-warnless.Tpo ../../lib/$(DEPDIR)/lib1564-warnless.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='../../lib/warnless.c' object='../../lib/lib1564-warnless.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1564_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../../lib/lib1564-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
+
+../../lib/lib1564-warnless.obj: ../../lib/warnless.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1564_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../../lib/lib1564-warnless.obj -MD -MP -MF ../../lib/$(DEPDIR)/lib1564-warnless.Tpo -c -o ../../lib/lib1564-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/lib1564-warnless.Tpo ../../lib/$(DEPDIR)/lib1564-warnless.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='../../lib/warnless.c' object='../../lib/lib1564-warnless.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1564_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../../lib/lib1564-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
+
+lib1565-lib1565.o: lib1565.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1565_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1565-lib1565.o -MD -MP -MF $(DEPDIR)/lib1565-lib1565.Tpo -c -o lib1565-lib1565.o `test -f 'lib1565.c' || echo '$(srcdir)/'`lib1565.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/lib1565-lib1565.Tpo $(DEPDIR)/lib1565-lib1565.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='lib1565.c' object='lib1565-lib1565.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1565_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1565-lib1565.o `test -f 'lib1565.c' || echo '$(srcdir)/'`lib1565.c
+
+lib1565-lib1565.obj: lib1565.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1565_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1565-lib1565.obj -MD -MP -MF $(DEPDIR)/lib1565-lib1565.Tpo -c -o lib1565-lib1565.obj `if test -f 'lib1565.c'; then $(CYGPATH_W) 'lib1565.c'; else $(CYGPATH_W) '$(srcdir)/lib1565.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/lib1565-lib1565.Tpo $(DEPDIR)/lib1565-lib1565.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='lib1565.c' object='lib1565-lib1565.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1565_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1565-lib1565.obj `if test -f 'lib1565.c'; then $(CYGPATH_W) 'lib1565.c'; else $(CYGPATH_W) '$(srcdir)/lib1565.c'; fi`
+
+lib1565-first.o: first.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1565_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1565-first.o -MD -MP -MF $(DEPDIR)/lib1565-first.Tpo -c -o lib1565-first.o `test -f 'first.c' || echo '$(srcdir)/'`first.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/lib1565-first.Tpo $(DEPDIR)/lib1565-first.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='first.c' object='lib1565-first.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1565_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1565-first.o `test -f 'first.c' || echo '$(srcdir)/'`first.c
+
+lib1565-first.obj: first.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1565_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1565-first.obj -MD -MP -MF $(DEPDIR)/lib1565-first.Tpo -c -o lib1565-first.obj `if test -f 'first.c'; then $(CYGPATH_W) 'first.c'; else $(CYGPATH_W) '$(srcdir)/first.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/lib1565-first.Tpo $(DEPDIR)/lib1565-first.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='first.c' object='lib1565-first.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1565_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1565-first.obj `if test -f 'first.c'; then $(CYGPATH_W) 'first.c'; else $(CYGPATH_W) '$(srcdir)/first.c'; fi`
+
+lib1565-testutil.o: testutil.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1565_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1565-testutil.o -MD -MP -MF $(DEPDIR)/lib1565-testutil.Tpo -c -o lib1565-testutil.o `test -f 'testutil.c' || echo '$(srcdir)/'`testutil.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/lib1565-testutil.Tpo $(DEPDIR)/lib1565-testutil.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='testutil.c' object='lib1565-testutil.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1565_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1565-testutil.o `test -f 'testutil.c' || echo '$(srcdir)/'`testutil.c
+
+lib1565-testutil.obj: testutil.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1565_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1565-testutil.obj -MD -MP -MF $(DEPDIR)/lib1565-testutil.Tpo -c -o lib1565-testutil.obj `if test -f 'testutil.c'; then $(CYGPATH_W) 'testutil.c'; else $(CYGPATH_W) '$(srcdir)/testutil.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/lib1565-testutil.Tpo $(DEPDIR)/lib1565-testutil.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='testutil.c' object='lib1565-testutil.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1565_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1565-testutil.obj `if test -f 'testutil.c'; then $(CYGPATH_W) 'testutil.c'; else $(CYGPATH_W) '$(srcdir)/testutil.c'; fi`
+
+../../lib/lib1565-warnless.o: ../../lib/warnless.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1565_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../../lib/lib1565-warnless.o -MD -MP -MF ../../lib/$(DEPDIR)/lib1565-warnless.Tpo -c -o ../../lib/lib1565-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/lib1565-warnless.Tpo ../../lib/$(DEPDIR)/lib1565-warnless.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='../../lib/warnless.c' object='../../lib/lib1565-warnless.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1565_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../../lib/lib1565-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
+
+../../lib/lib1565-warnless.obj: ../../lib/warnless.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1565_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../../lib/lib1565-warnless.obj -MD -MP -MF ../../lib/$(DEPDIR)/lib1565-warnless.Tpo -c -o ../../lib/lib1565-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/lib1565-warnless.Tpo ../../lib/$(DEPDIR)/lib1565-warnless.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='../../lib/warnless.c' object='../../lib/lib1565-warnless.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1565_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../../lib/lib1565-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
+
+lib1591-lib1591.o: lib1591.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1591_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1591-lib1591.o -MD -MP -MF $(DEPDIR)/lib1591-lib1591.Tpo -c -o lib1591-lib1591.o `test -f 'lib1591.c' || echo '$(srcdir)/'`lib1591.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/lib1591-lib1591.Tpo $(DEPDIR)/lib1591-lib1591.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='lib1591.c' object='lib1591-lib1591.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1591_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1591-lib1591.o `test -f 'lib1591.c' || echo '$(srcdir)/'`lib1591.c
+
+lib1591-lib1591.obj: lib1591.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1591_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1591-lib1591.obj -MD -MP -MF $(DEPDIR)/lib1591-lib1591.Tpo -c -o lib1591-lib1591.obj `if test -f 'lib1591.c'; then $(CYGPATH_W) 'lib1591.c'; else $(CYGPATH_W) '$(srcdir)/lib1591.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/lib1591-lib1591.Tpo $(DEPDIR)/lib1591-lib1591.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='lib1591.c' object='lib1591-lib1591.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1591_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1591-lib1591.obj `if test -f 'lib1591.c'; then $(CYGPATH_W) 'lib1591.c'; else $(CYGPATH_W) '$(srcdir)/lib1591.c'; fi`
+
+lib1591-first.o: first.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1591_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1591-first.o -MD -MP -MF $(DEPDIR)/lib1591-first.Tpo -c -o lib1591-first.o `test -f 'first.c' || echo '$(srcdir)/'`first.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/lib1591-first.Tpo $(DEPDIR)/lib1591-first.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='first.c' object='lib1591-first.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1591_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1591-first.o `test -f 'first.c' || echo '$(srcdir)/'`first.c
+
+lib1591-first.obj: first.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1591_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1591-first.obj -MD -MP -MF $(DEPDIR)/lib1591-first.Tpo -c -o lib1591-first.obj `if test -f 'first.c'; then $(CYGPATH_W) 'first.c'; else $(CYGPATH_W) '$(srcdir)/first.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/lib1591-first.Tpo $(DEPDIR)/lib1591-first.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='first.c' object='lib1591-first.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1591_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1591-first.obj `if test -f 'first.c'; then $(CYGPATH_W) 'first.c'; else $(CYGPATH_W) '$(srcdir)/first.c'; fi`
+
+lib1591-testutil.o: testutil.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1591_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1591-testutil.o -MD -MP -MF $(DEPDIR)/lib1591-testutil.Tpo -c -o lib1591-testutil.o `test -f 'testutil.c' || echo '$(srcdir)/'`testutil.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/lib1591-testutil.Tpo $(DEPDIR)/lib1591-testutil.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='testutil.c' object='lib1591-testutil.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1591_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1591-testutil.o `test -f 'testutil.c' || echo '$(srcdir)/'`testutil.c
+
+lib1591-testutil.obj: testutil.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1591_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1591-testutil.obj -MD -MP -MF $(DEPDIR)/lib1591-testutil.Tpo -c -o lib1591-testutil.obj `if test -f 'testutil.c'; then $(CYGPATH_W) 'testutil.c'; else $(CYGPATH_W) '$(srcdir)/testutil.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/lib1591-testutil.Tpo $(DEPDIR)/lib1591-testutil.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='testutil.c' object='lib1591-testutil.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1591_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1591-testutil.obj `if test -f 'testutil.c'; then $(CYGPATH_W) 'testutil.c'; else $(CYGPATH_W) '$(srcdir)/testutil.c'; fi`
+
+../../lib/lib1591-warnless.o: ../../lib/warnless.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1591_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../../lib/lib1591-warnless.o -MD -MP -MF ../../lib/$(DEPDIR)/lib1591-warnless.Tpo -c -o ../../lib/lib1591-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/lib1591-warnless.Tpo ../../lib/$(DEPDIR)/lib1591-warnless.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='../../lib/warnless.c' object='../../lib/lib1591-warnless.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1591_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../../lib/lib1591-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
+
+../../lib/lib1591-warnless.obj: ../../lib/warnless.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1591_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../../lib/lib1591-warnless.obj -MD -MP -MF ../../lib/$(DEPDIR)/lib1591-warnless.Tpo -c -o ../../lib/lib1591-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/lib1591-warnless.Tpo ../../lib/$(DEPDIR)/lib1591-warnless.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='../../lib/warnless.c' object='../../lib/lib1591-warnless.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1591_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../../lib/lib1591-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
+
+lib1592-lib1592.o: lib1592.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1592_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1592-lib1592.o -MD -MP -MF $(DEPDIR)/lib1592-lib1592.Tpo -c -o lib1592-lib1592.o `test -f 'lib1592.c' || echo '$(srcdir)/'`lib1592.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/lib1592-lib1592.Tpo $(DEPDIR)/lib1592-lib1592.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='lib1592.c' object='lib1592-lib1592.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1592_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1592-lib1592.o `test -f 'lib1592.c' || echo '$(srcdir)/'`lib1592.c
+
+lib1592-lib1592.obj: lib1592.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1592_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1592-lib1592.obj -MD -MP -MF $(DEPDIR)/lib1592-lib1592.Tpo -c -o lib1592-lib1592.obj `if test -f 'lib1592.c'; then $(CYGPATH_W) 'lib1592.c'; else $(CYGPATH_W) '$(srcdir)/lib1592.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/lib1592-lib1592.Tpo $(DEPDIR)/lib1592-lib1592.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='lib1592.c' object='lib1592-lib1592.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1592_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1592-lib1592.obj `if test -f 'lib1592.c'; then $(CYGPATH_W) 'lib1592.c'; else $(CYGPATH_W) '$(srcdir)/lib1592.c'; fi`
+
+lib1592-first.o: first.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1592_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1592-first.o -MD -MP -MF $(DEPDIR)/lib1592-first.Tpo -c -o lib1592-first.o `test -f 'first.c' || echo '$(srcdir)/'`first.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/lib1592-first.Tpo $(DEPDIR)/lib1592-first.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='first.c' object='lib1592-first.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1592_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1592-first.o `test -f 'first.c' || echo '$(srcdir)/'`first.c
+
+lib1592-first.obj: first.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1592_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1592-first.obj -MD -MP -MF $(DEPDIR)/lib1592-first.Tpo -c -o lib1592-first.obj `if test -f 'first.c'; then $(CYGPATH_W) 'first.c'; else $(CYGPATH_W) '$(srcdir)/first.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/lib1592-first.Tpo $(DEPDIR)/lib1592-first.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='first.c' object='lib1592-first.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1592_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1592-first.obj `if test -f 'first.c'; then $(CYGPATH_W) 'first.c'; else $(CYGPATH_W) '$(srcdir)/first.c'; fi`
+
+lib1592-testutil.o: testutil.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1592_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1592-testutil.o -MD -MP -MF $(DEPDIR)/lib1592-testutil.Tpo -c -o lib1592-testutil.o `test -f 'testutil.c' || echo '$(srcdir)/'`testutil.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/lib1592-testutil.Tpo $(DEPDIR)/lib1592-testutil.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='testutil.c' object='lib1592-testutil.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1592_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1592-testutil.o `test -f 'testutil.c' || echo '$(srcdir)/'`testutil.c
+
+lib1592-testutil.obj: testutil.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1592_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1592-testutil.obj -MD -MP -MF $(DEPDIR)/lib1592-testutil.Tpo -c -o lib1592-testutil.obj `if test -f 'testutil.c'; then $(CYGPATH_W) 'testutil.c'; else $(CYGPATH_W) '$(srcdir)/testutil.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/lib1592-testutil.Tpo $(DEPDIR)/lib1592-testutil.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='testutil.c' object='lib1592-testutil.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1592_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1592-testutil.obj `if test -f 'testutil.c'; then $(CYGPATH_W) 'testutil.c'; else $(CYGPATH_W) '$(srcdir)/testutil.c'; fi`
+
+../../lib/lib1592-warnless.o: ../../lib/warnless.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1592_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../../lib/lib1592-warnless.o -MD -MP -MF ../../lib/$(DEPDIR)/lib1592-warnless.Tpo -c -o ../../lib/lib1592-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/lib1592-warnless.Tpo ../../lib/$(DEPDIR)/lib1592-warnless.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='../../lib/warnless.c' object='../../lib/lib1592-warnless.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1592_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../../lib/lib1592-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
+
+../../lib/lib1592-warnless.obj: ../../lib/warnless.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1592_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../../lib/lib1592-warnless.obj -MD -MP -MF ../../lib/$(DEPDIR)/lib1592-warnless.Tpo -c -o ../../lib/lib1592-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/lib1592-warnless.Tpo ../../lib/$(DEPDIR)/lib1592-warnless.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='../../lib/warnless.c' object='../../lib/lib1592-warnless.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1592_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../../lib/lib1592-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
+
+lib1596-lib1594.o: lib1594.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1596_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1596-lib1594.o -MD -MP -MF $(DEPDIR)/lib1596-lib1594.Tpo -c -o lib1596-lib1594.o `test -f 'lib1594.c' || echo '$(srcdir)/'`lib1594.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/lib1596-lib1594.Tpo $(DEPDIR)/lib1596-lib1594.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='lib1594.c' object='lib1596-lib1594.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1596_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1596-lib1594.o `test -f 'lib1594.c' || echo '$(srcdir)/'`lib1594.c
+
+lib1596-lib1594.obj: lib1594.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1596_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1596-lib1594.obj -MD -MP -MF $(DEPDIR)/lib1596-lib1594.Tpo -c -o lib1596-lib1594.obj `if test -f 'lib1594.c'; then $(CYGPATH_W) 'lib1594.c'; else $(CYGPATH_W) '$(srcdir)/lib1594.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/lib1596-lib1594.Tpo $(DEPDIR)/lib1596-lib1594.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='lib1594.c' object='lib1596-lib1594.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1596_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1596-lib1594.obj `if test -f 'lib1594.c'; then $(CYGPATH_W) 'lib1594.c'; else $(CYGPATH_W) '$(srcdir)/lib1594.c'; fi`
+
+lib1596-first.o: first.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1596_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1596-first.o -MD -MP -MF $(DEPDIR)/lib1596-first.Tpo -c -o lib1596-first.o `test -f 'first.c' || echo '$(srcdir)/'`first.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/lib1596-first.Tpo $(DEPDIR)/lib1596-first.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='first.c' object='lib1596-first.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1596_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1596-first.o `test -f 'first.c' || echo '$(srcdir)/'`first.c
+
+lib1596-first.obj: first.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1596_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1596-first.obj -MD -MP -MF $(DEPDIR)/lib1596-first.Tpo -c -o lib1596-first.obj `if test -f 'first.c'; then $(CYGPATH_W) 'first.c'; else $(CYGPATH_W) '$(srcdir)/first.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/lib1596-first.Tpo $(DEPDIR)/lib1596-first.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='first.c' object='lib1596-first.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1596_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1596-first.obj `if test -f 'first.c'; then $(CYGPATH_W) 'first.c'; else $(CYGPATH_W) '$(srcdir)/first.c'; fi`
+
+lib1596-testutil.o: testutil.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1596_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1596-testutil.o -MD -MP -MF $(DEPDIR)/lib1596-testutil.Tpo -c -o lib1596-testutil.o `test -f 'testutil.c' || echo '$(srcdir)/'`testutil.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/lib1596-testutil.Tpo $(DEPDIR)/lib1596-testutil.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='testutil.c' object='lib1596-testutil.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1596_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1596-testutil.o `test -f 'testutil.c' || echo '$(srcdir)/'`testutil.c
+
+lib1596-testutil.obj: testutil.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1596_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1596-testutil.obj -MD -MP -MF $(DEPDIR)/lib1596-testutil.Tpo -c -o lib1596-testutil.obj `if test -f 'testutil.c'; then $(CYGPATH_W) 'testutil.c'; else $(CYGPATH_W) '$(srcdir)/testutil.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/lib1596-testutil.Tpo $(DEPDIR)/lib1596-testutil.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='testutil.c' object='lib1596-testutil.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1596_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1596-testutil.obj `if test -f 'testutil.c'; then $(CYGPATH_W) 'testutil.c'; else $(CYGPATH_W) '$(srcdir)/testutil.c'; fi`
+
+../../lib/lib1596-warnless.o: ../../lib/warnless.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1596_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../../lib/lib1596-warnless.o -MD -MP -MF ../../lib/$(DEPDIR)/lib1596-warnless.Tpo -c -o ../../lib/lib1596-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/lib1596-warnless.Tpo ../../lib/$(DEPDIR)/lib1596-warnless.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='../../lib/warnless.c' object='../../lib/lib1596-warnless.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1596_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../../lib/lib1596-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
+
+../../lib/lib1596-warnless.obj: ../../lib/warnless.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1596_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../../lib/lib1596-warnless.obj -MD -MP -MF ../../lib/$(DEPDIR)/lib1596-warnless.Tpo -c -o ../../lib/lib1596-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/lib1596-warnless.Tpo ../../lib/$(DEPDIR)/lib1596-warnless.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='../../lib/warnless.c' object='../../lib/lib1596-warnless.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1596_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../../lib/lib1596-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
+
 lib1900-lib1900.o: lib1900.c
 @am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1900_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1900-lib1900.o -MD -MP -MF $(DEPDIR)/lib1900-lib1900.Tpo -c -o lib1900-lib1900.o `test -f 'lib1900.c' || echo '$(srcdir)/'`lib1900.c
 @am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/lib1900-lib1900.Tpo $(DEPDIR)/lib1900-lib1900.Po
@@ -5655,6 +6380,174 @@ lib1900-testutil.obj: testutil.c
 @AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1900_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../../lib/lib1900-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
 
+lib1905-lib1905.o: lib1905.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1905_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1905-lib1905.o -MD -MP -MF $(DEPDIR)/lib1905-lib1905.Tpo -c -o lib1905-lib1905.o `test -f 'lib1905.c' || echo '$(srcdir)/'`lib1905.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/lib1905-lib1905.Tpo $(DEPDIR)/lib1905-lib1905.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='lib1905.c' object='lib1905-lib1905.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1905_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1905-lib1905.o `test -f 'lib1905.c' || echo '$(srcdir)/'`lib1905.c
+
+lib1905-lib1905.obj: lib1905.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1905_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1905-lib1905.obj -MD -MP -MF $(DEPDIR)/lib1905-lib1905.Tpo -c -o lib1905-lib1905.obj `if test -f 'lib1905.c'; then $(CYGPATH_W) 'lib1905.c'; else $(CYGPATH_W) '$(srcdir)/lib1905.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/lib1905-lib1905.Tpo $(DEPDIR)/lib1905-lib1905.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='lib1905.c' object='lib1905-lib1905.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1905_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1905-lib1905.obj `if test -f 'lib1905.c'; then $(CYGPATH_W) 'lib1905.c'; else $(CYGPATH_W) '$(srcdir)/lib1905.c'; fi`
+
+lib1905-first.o: first.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1905_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1905-first.o -MD -MP -MF $(DEPDIR)/lib1905-first.Tpo -c -o lib1905-first.o `test -f 'first.c' || echo '$(srcdir)/'`first.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/lib1905-first.Tpo $(DEPDIR)/lib1905-first.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='first.c' object='lib1905-first.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1905_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1905-first.o `test -f 'first.c' || echo '$(srcdir)/'`first.c
+
+lib1905-first.obj: first.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1905_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1905-first.obj -MD -MP -MF $(DEPDIR)/lib1905-first.Tpo -c -o lib1905-first.obj `if test -f 'first.c'; then $(CYGPATH_W) 'first.c'; else $(CYGPATH_W) '$(srcdir)/first.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/lib1905-first.Tpo $(DEPDIR)/lib1905-first.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='first.c' object='lib1905-first.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1905_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1905-first.obj `if test -f 'first.c'; then $(CYGPATH_W) 'first.c'; else $(CYGPATH_W) '$(srcdir)/first.c'; fi`
+
+lib1905-testutil.o: testutil.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1905_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1905-testutil.o -MD -MP -MF $(DEPDIR)/lib1905-testutil.Tpo -c -o lib1905-testutil.o `test -f 'testutil.c' || echo '$(srcdir)/'`testutil.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/lib1905-testutil.Tpo $(DEPDIR)/lib1905-testutil.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='testutil.c' object='lib1905-testutil.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1905_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1905-testutil.o `test -f 'testutil.c' || echo '$(srcdir)/'`testutil.c
+
+lib1905-testutil.obj: testutil.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1905_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1905-testutil.obj -MD -MP -MF $(DEPDIR)/lib1905-testutil.Tpo -c -o lib1905-testutil.obj `if test -f 'testutil.c'; then $(CYGPATH_W) 'testutil.c'; else $(CYGPATH_W) '$(srcdir)/testutil.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/lib1905-testutil.Tpo $(DEPDIR)/lib1905-testutil.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='testutil.c' object='lib1905-testutil.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1905_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1905-testutil.obj `if test -f 'testutil.c'; then $(CYGPATH_W) 'testutil.c'; else $(CYGPATH_W) '$(srcdir)/testutil.c'; fi`
+
+../../lib/lib1905-warnless.o: ../../lib/warnless.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1905_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../../lib/lib1905-warnless.o -MD -MP -MF ../../lib/$(DEPDIR)/lib1905-warnless.Tpo -c -o ../../lib/lib1905-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/lib1905-warnless.Tpo ../../lib/$(DEPDIR)/lib1905-warnless.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='../../lib/warnless.c' object='../../lib/lib1905-warnless.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1905_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../../lib/lib1905-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
+
+../../lib/lib1905-warnless.obj: ../../lib/warnless.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1905_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../../lib/lib1905-warnless.obj -MD -MP -MF ../../lib/$(DEPDIR)/lib1905-warnless.Tpo -c -o ../../lib/lib1905-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/lib1905-warnless.Tpo ../../lib/$(DEPDIR)/lib1905-warnless.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='../../lib/warnless.c' object='../../lib/lib1905-warnless.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1905_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../../lib/lib1905-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
+
+lib1906-lib1906.o: lib1906.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1906_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1906-lib1906.o -MD -MP -MF $(DEPDIR)/lib1906-lib1906.Tpo -c -o lib1906-lib1906.o `test -f 'lib1906.c' || echo '$(srcdir)/'`lib1906.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/lib1906-lib1906.Tpo $(DEPDIR)/lib1906-lib1906.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='lib1906.c' object='lib1906-lib1906.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1906_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1906-lib1906.o `test -f 'lib1906.c' || echo '$(srcdir)/'`lib1906.c
+
+lib1906-lib1906.obj: lib1906.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1906_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1906-lib1906.obj -MD -MP -MF $(DEPDIR)/lib1906-lib1906.Tpo -c -o lib1906-lib1906.obj `if test -f 'lib1906.c'; then $(CYGPATH_W) 'lib1906.c'; else $(CYGPATH_W) '$(srcdir)/lib1906.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/lib1906-lib1906.Tpo $(DEPDIR)/lib1906-lib1906.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='lib1906.c' object='lib1906-lib1906.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1906_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1906-lib1906.obj `if test -f 'lib1906.c'; then $(CYGPATH_W) 'lib1906.c'; else $(CYGPATH_W) '$(srcdir)/lib1906.c'; fi`
+
+lib1906-first.o: first.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1906_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1906-first.o -MD -MP -MF $(DEPDIR)/lib1906-first.Tpo -c -o lib1906-first.o `test -f 'first.c' || echo '$(srcdir)/'`first.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/lib1906-first.Tpo $(DEPDIR)/lib1906-first.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='first.c' object='lib1906-first.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1906_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1906-first.o `test -f 'first.c' || echo '$(srcdir)/'`first.c
+
+lib1906-first.obj: first.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1906_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1906-first.obj -MD -MP -MF $(DEPDIR)/lib1906-first.Tpo -c -o lib1906-first.obj `if test -f 'first.c'; then $(CYGPATH_W) 'first.c'; else $(CYGPATH_W) '$(srcdir)/first.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/lib1906-first.Tpo $(DEPDIR)/lib1906-first.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='first.c' object='lib1906-first.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1906_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1906-first.obj `if test -f 'first.c'; then $(CYGPATH_W) 'first.c'; else $(CYGPATH_W) '$(srcdir)/first.c'; fi`
+
+lib1906-testutil.o: testutil.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1906_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1906-testutil.o -MD -MP -MF $(DEPDIR)/lib1906-testutil.Tpo -c -o lib1906-testutil.o `test -f 'testutil.c' || echo '$(srcdir)/'`testutil.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/lib1906-testutil.Tpo $(DEPDIR)/lib1906-testutil.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='testutil.c' object='lib1906-testutil.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1906_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1906-testutil.o `test -f 'testutil.c' || echo '$(srcdir)/'`testutil.c
+
+lib1906-testutil.obj: testutil.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1906_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1906-testutil.obj -MD -MP -MF $(DEPDIR)/lib1906-testutil.Tpo -c -o lib1906-testutil.obj `if test -f 'testutil.c'; then $(CYGPATH_W) 'testutil.c'; else $(CYGPATH_W) '$(srcdir)/testutil.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/lib1906-testutil.Tpo $(DEPDIR)/lib1906-testutil.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='testutil.c' object='lib1906-testutil.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1906_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1906-testutil.obj `if test -f 'testutil.c'; then $(CYGPATH_W) 'testutil.c'; else $(CYGPATH_W) '$(srcdir)/testutil.c'; fi`
+
+../../lib/lib1906-warnless.o: ../../lib/warnless.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1906_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../../lib/lib1906-warnless.o -MD -MP -MF ../../lib/$(DEPDIR)/lib1906-warnless.Tpo -c -o ../../lib/lib1906-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/lib1906-warnless.Tpo ../../lib/$(DEPDIR)/lib1906-warnless.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='../../lib/warnless.c' object='../../lib/lib1906-warnless.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1906_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../../lib/lib1906-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
+
+../../lib/lib1906-warnless.obj: ../../lib/warnless.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1906_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../../lib/lib1906-warnless.obj -MD -MP -MF ../../lib/$(DEPDIR)/lib1906-warnless.Tpo -c -o ../../lib/lib1906-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/lib1906-warnless.Tpo ../../lib/$(DEPDIR)/lib1906-warnless.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='../../lib/warnless.c' object='../../lib/lib1906-warnless.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1906_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../../lib/lib1906-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
+
+lib1907-lib1907.o: lib1907.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1907_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1907-lib1907.o -MD -MP -MF $(DEPDIR)/lib1907-lib1907.Tpo -c -o lib1907-lib1907.o `test -f 'lib1907.c' || echo '$(srcdir)/'`lib1907.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/lib1907-lib1907.Tpo $(DEPDIR)/lib1907-lib1907.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='lib1907.c' object='lib1907-lib1907.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1907_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1907-lib1907.o `test -f 'lib1907.c' || echo '$(srcdir)/'`lib1907.c
+
+lib1907-lib1907.obj: lib1907.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1907_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1907-lib1907.obj -MD -MP -MF $(DEPDIR)/lib1907-lib1907.Tpo -c -o lib1907-lib1907.obj `if test -f 'lib1907.c'; then $(CYGPATH_W) 'lib1907.c'; else $(CYGPATH_W) '$(srcdir)/lib1907.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/lib1907-lib1907.Tpo $(DEPDIR)/lib1907-lib1907.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='lib1907.c' object='lib1907-lib1907.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1907_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1907-lib1907.obj `if test -f 'lib1907.c'; then $(CYGPATH_W) 'lib1907.c'; else $(CYGPATH_W) '$(srcdir)/lib1907.c'; fi`
+
+lib1907-first.o: first.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1907_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1907-first.o -MD -MP -MF $(DEPDIR)/lib1907-first.Tpo -c -o lib1907-first.o `test -f 'first.c' || echo '$(srcdir)/'`first.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/lib1907-first.Tpo $(DEPDIR)/lib1907-first.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='first.c' object='lib1907-first.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1907_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1907-first.o `test -f 'first.c' || echo '$(srcdir)/'`first.c
+
+lib1907-first.obj: first.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1907_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1907-first.obj -MD -MP -MF $(DEPDIR)/lib1907-first.Tpo -c -o lib1907-first.obj `if test -f 'first.c'; then $(CYGPATH_W) 'first.c'; else $(CYGPATH_W) '$(srcdir)/first.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/lib1907-first.Tpo $(DEPDIR)/lib1907-first.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='first.c' object='lib1907-first.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1907_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1907-first.obj `if test -f 'first.c'; then $(CYGPATH_W) 'first.c'; else $(CYGPATH_W) '$(srcdir)/first.c'; fi`
+
+lib1907-testutil.o: testutil.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1907_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1907-testutil.o -MD -MP -MF $(DEPDIR)/lib1907-testutil.Tpo -c -o lib1907-testutil.o `test -f 'testutil.c' || echo '$(srcdir)/'`testutil.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/lib1907-testutil.Tpo $(DEPDIR)/lib1907-testutil.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='testutil.c' object='lib1907-testutil.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1907_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1907-testutil.o `test -f 'testutil.c' || echo '$(srcdir)/'`testutil.c
+
+lib1907-testutil.obj: testutil.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1907_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1907-testutil.obj -MD -MP -MF $(DEPDIR)/lib1907-testutil.Tpo -c -o lib1907-testutil.obj `if test -f 'testutil.c'; then $(CYGPATH_W) 'testutil.c'; else $(CYGPATH_W) '$(srcdir)/testutil.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/lib1907-testutil.Tpo $(DEPDIR)/lib1907-testutil.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='testutil.c' object='lib1907-testutil.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1907_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1907-testutil.obj `if test -f 'testutil.c'; then $(CYGPATH_W) 'testutil.c'; else $(CYGPATH_W) '$(srcdir)/testutil.c'; fi`
+
+../../lib/lib1907-warnless.o: ../../lib/warnless.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1907_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../../lib/lib1907-warnless.o -MD -MP -MF ../../lib/$(DEPDIR)/lib1907-warnless.Tpo -c -o ../../lib/lib1907-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/lib1907-warnless.Tpo ../../lib/$(DEPDIR)/lib1907-warnless.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='../../lib/warnless.c' object='../../lib/lib1907-warnless.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1907_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../../lib/lib1907-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
+
+../../lib/lib1907-warnless.obj: ../../lib/warnless.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1907_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../../lib/lib1907-warnless.obj -MD -MP -MF ../../lib/$(DEPDIR)/lib1907-warnless.Tpo -c -o ../../lib/lib1907-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/lib1907-warnless.Tpo ../../lib/$(DEPDIR)/lib1907-warnless.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='../../lib/warnless.c' object='../../lib/lib1907-warnless.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1907_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../../lib/lib1907-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
+
 lib2033-libntlmconnect.o: libntlmconnect.c
 @am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib2033_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib2033-libntlmconnect.o -MD -MP -MF $(DEPDIR)/lib2033-libntlmconnect.Tpo -c -o lib2033-libntlmconnect.o `test -f 'libntlmconnect.c' || echo '$(srcdir)/'`libntlmconnect.c
 @am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/lib2033-libntlmconnect.Tpo $(DEPDIR)/lib2033-libntlmconnect.Po
@@ -6929,62 +7822,6 @@ lib533-testutil.obj: testutil.c
 @AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib533_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../../lib/lib533-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
 
-lib536-lib536.o: lib536.c
-@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib536_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib536-lib536.o -MD -MP -MF $(DEPDIR)/lib536-lib536.Tpo -c -o lib536-lib536.o `test -f 'lib536.c' || echo '$(srcdir)/'`lib536.c
-@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/lib536-lib536.Tpo $(DEPDIR)/lib536-lib536.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='lib536.c' object='lib536-lib536.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib536_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib536-lib536.o `test -f 'lib536.c' || echo '$(srcdir)/'`lib536.c
-
-lib536-lib536.obj: lib536.c
-@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib536_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib536-lib536.obj -MD -MP -MF $(DEPDIR)/lib536-lib536.Tpo -c -o lib536-lib536.obj `if test -f 'lib536.c'; then $(CYGPATH_W) 'lib536.c'; else $(CYGPATH_W) '$(srcdir)/lib536.c'; fi`
-@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/lib536-lib536.Tpo $(DEPDIR)/lib536-lib536.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='lib536.c' object='lib536-lib536.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib536_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib536-lib536.obj `if test -f 'lib536.c'; then $(CYGPATH_W) 'lib536.c'; else $(CYGPATH_W) '$(srcdir)/lib536.c'; fi`
-
-lib536-first.o: first.c
-@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib536_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib536-first.o -MD -MP -MF $(DEPDIR)/lib536-first.Tpo -c -o lib536-first.o `test -f 'first.c' || echo '$(srcdir)/'`first.c
-@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/lib536-first.Tpo $(DEPDIR)/lib536-first.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='first.c' object='lib536-first.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib536_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib536-first.o `test -f 'first.c' || echo '$(srcdir)/'`first.c
-
-lib536-first.obj: first.c
-@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib536_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib536-first.obj -MD -MP -MF $(DEPDIR)/lib536-first.Tpo -c -o lib536-first.obj `if test -f 'first.c'; then $(CYGPATH_W) 'first.c'; else $(CYGPATH_W) '$(srcdir)/first.c'; fi`
-@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/lib536-first.Tpo $(DEPDIR)/lib536-first.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='first.c' object='lib536-first.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib536_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib536-first.obj `if test -f 'first.c'; then $(CYGPATH_W) 'first.c'; else $(CYGPATH_W) '$(srcdir)/first.c'; fi`
-
-lib536-testutil.o: testutil.c
-@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib536_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib536-testutil.o -MD -MP -MF $(DEPDIR)/lib536-testutil.Tpo -c -o lib536-testutil.o `test -f 'testutil.c' || echo '$(srcdir)/'`testutil.c
-@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/lib536-testutil.Tpo $(DEPDIR)/lib536-testutil.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='testutil.c' object='lib536-testutil.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib536_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib536-testutil.o `test -f 'testutil.c' || echo '$(srcdir)/'`testutil.c
-
-lib536-testutil.obj: testutil.c
-@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib536_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib536-testutil.obj -MD -MP -MF $(DEPDIR)/lib536-testutil.Tpo -c -o lib536-testutil.obj `if test -f 'testutil.c'; then $(CYGPATH_W) 'testutil.c'; else $(CYGPATH_W) '$(srcdir)/testutil.c'; fi`
-@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/lib536-testutil.Tpo $(DEPDIR)/lib536-testutil.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='testutil.c' object='lib536-testutil.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib536_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib536-testutil.obj `if test -f 'testutil.c'; then $(CYGPATH_W) 'testutil.c'; else $(CYGPATH_W) '$(srcdir)/testutil.c'; fi`
-
-../../lib/lib536-warnless.o: ../../lib/warnless.c
-@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib536_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../../lib/lib536-warnless.o -MD -MP -MF ../../lib/$(DEPDIR)/lib536-warnless.Tpo -c -o ../../lib/lib536-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
-@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/lib536-warnless.Tpo ../../lib/$(DEPDIR)/lib536-warnless.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='../../lib/warnless.c' object='../../lib/lib536-warnless.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib536_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../../lib/lib536-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
-
-../../lib/lib536-warnless.obj: ../../lib/warnless.c
-@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib536_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../../lib/lib536-warnless.obj -MD -MP -MF ../../lib/$(DEPDIR)/lib536-warnless.Tpo -c -o ../../lib/lib536-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
-@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/lib536-warnless.Tpo ../../lib/$(DEPDIR)/lib536-warnless.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='../../lib/warnless.c' object='../../lib/lib536-warnless.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib536_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../../lib/lib536-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
-
 lib537-lib537.o: lib537.c
 @am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib537_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib537-lib537.o -MD -MP -MF $(DEPDIR)/lib537-lib537.Tpo -c -o lib537-lib537.o `test -f 'lib537.c' || echo '$(srcdir)/'`lib537.c
 @am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/lib537-lib537.Tpo $(DEPDIR)/lib537-lib537.Po
@@ -8903,6 +9740,146 @@ lib655-first.obj: first.c
 @AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib655_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib655-first.obj `if test -f 'first.c'; then $(CYGPATH_W) 'first.c'; else $(CYGPATH_W) '$(srcdir)/first.c'; fi`
 
+lib658-lib658.o: lib658.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib658_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib658-lib658.o -MD -MP -MF $(DEPDIR)/lib658-lib658.Tpo -c -o lib658-lib658.o `test -f 'lib658.c' || echo '$(srcdir)/'`lib658.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/lib658-lib658.Tpo $(DEPDIR)/lib658-lib658.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='lib658.c' object='lib658-lib658.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib658_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib658-lib658.o `test -f 'lib658.c' || echo '$(srcdir)/'`lib658.c
+
+lib658-lib658.obj: lib658.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib658_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib658-lib658.obj -MD -MP -MF $(DEPDIR)/lib658-lib658.Tpo -c -o lib658-lib658.obj `if test -f 'lib658.c'; then $(CYGPATH_W) 'lib658.c'; else $(CYGPATH_W) '$(srcdir)/lib658.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/lib658-lib658.Tpo $(DEPDIR)/lib658-lib658.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='lib658.c' object='lib658-lib658.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib658_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib658-lib658.obj `if test -f 'lib658.c'; then $(CYGPATH_W) 'lib658.c'; else $(CYGPATH_W) '$(srcdir)/lib658.c'; fi`
+
+lib658-first.o: first.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib658_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib658-first.o -MD -MP -MF $(DEPDIR)/lib658-first.Tpo -c -o lib658-first.o `test -f 'first.c' || echo '$(srcdir)/'`first.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/lib658-first.Tpo $(DEPDIR)/lib658-first.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='first.c' object='lib658-first.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib658_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib658-first.o `test -f 'first.c' || echo '$(srcdir)/'`first.c
+
+lib658-first.obj: first.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib658_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib658-first.obj -MD -MP -MF $(DEPDIR)/lib658-first.Tpo -c -o lib658-first.obj `if test -f 'first.c'; then $(CYGPATH_W) 'first.c'; else $(CYGPATH_W) '$(srcdir)/first.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/lib658-first.Tpo $(DEPDIR)/lib658-first.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='first.c' object='lib658-first.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib658_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib658-first.obj `if test -f 'first.c'; then $(CYGPATH_W) 'first.c'; else $(CYGPATH_W) '$(srcdir)/first.c'; fi`
+
+lib658-testutil.o: testutil.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib658_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib658-testutil.o -MD -MP -MF $(DEPDIR)/lib658-testutil.Tpo -c -o lib658-testutil.o `test -f 'testutil.c' || echo '$(srcdir)/'`testutil.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/lib658-testutil.Tpo $(DEPDIR)/lib658-testutil.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='testutil.c' object='lib658-testutil.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib658_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib658-testutil.o `test -f 'testutil.c' || echo '$(srcdir)/'`testutil.c
+
+lib658-testutil.obj: testutil.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib658_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib658-testutil.obj -MD -MP -MF $(DEPDIR)/lib658-testutil.Tpo -c -o lib658-testutil.obj `if test -f 'testutil.c'; then $(CYGPATH_W) 'testutil.c'; else $(CYGPATH_W) '$(srcdir)/testutil.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/lib658-testutil.Tpo $(DEPDIR)/lib658-testutil.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='testutil.c' object='lib658-testutil.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib658_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib658-testutil.obj `if test -f 'testutil.c'; then $(CYGPATH_W) 'testutil.c'; else $(CYGPATH_W) '$(srcdir)/testutil.c'; fi`
+
+../../lib/lib658-warnless.o: ../../lib/warnless.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib658_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../../lib/lib658-warnless.o -MD -MP -MF ../../lib/$(DEPDIR)/lib658-warnless.Tpo -c -o ../../lib/lib658-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/lib658-warnless.Tpo ../../lib/$(DEPDIR)/lib658-warnless.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='../../lib/warnless.c' object='../../lib/lib658-warnless.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib658_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../../lib/lib658-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
+
+../../lib/lib658-warnless.obj: ../../lib/warnless.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib658_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../../lib/lib658-warnless.obj -MD -MP -MF ../../lib/$(DEPDIR)/lib658-warnless.Tpo -c -o ../../lib/lib658-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/lib658-warnless.Tpo ../../lib/$(DEPDIR)/lib658-warnless.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='../../lib/warnless.c' object='../../lib/lib658-warnless.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib658_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../../lib/lib658-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
+
+lib659-lib659.o: lib659.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib659_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib659-lib659.o -MD -MP -MF $(DEPDIR)/lib659-lib659.Tpo -c -o lib659-lib659.o `test -f 'lib659.c' || echo '$(srcdir)/'`lib659.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/lib659-lib659.Tpo $(DEPDIR)/lib659-lib659.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='lib659.c' object='lib659-lib659.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib659_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib659-lib659.o `test -f 'lib659.c' || echo '$(srcdir)/'`lib659.c
+
+lib659-lib659.obj: lib659.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib659_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib659-lib659.obj -MD -MP -MF $(DEPDIR)/lib659-lib659.Tpo -c -o lib659-lib659.obj `if test -f 'lib659.c'; then $(CYGPATH_W) 'lib659.c'; else $(CYGPATH_W) '$(srcdir)/lib659.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/lib659-lib659.Tpo $(DEPDIR)/lib659-lib659.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='lib659.c' object='lib659-lib659.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib659_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib659-lib659.obj `if test -f 'lib659.c'; then $(CYGPATH_W) 'lib659.c'; else $(CYGPATH_W) '$(srcdir)/lib659.c'; fi`
+
+lib659-first.o: first.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib659_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib659-first.o -MD -MP -MF $(DEPDIR)/lib659-first.Tpo -c -o lib659-first.o `test -f 'first.c' || echo '$(srcdir)/'`first.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/lib659-first.Tpo $(DEPDIR)/lib659-first.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='first.c' object='lib659-first.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib659_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib659-first.o `test -f 'first.c' || echo '$(srcdir)/'`first.c
+
+lib659-first.obj: first.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib659_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib659-first.obj -MD -MP -MF $(DEPDIR)/lib659-first.Tpo -c -o lib659-first.obj `if test -f 'first.c'; then $(CYGPATH_W) 'first.c'; else $(CYGPATH_W) '$(srcdir)/first.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/lib659-first.Tpo $(DEPDIR)/lib659-first.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='first.c' object='lib659-first.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib659_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib659-first.obj `if test -f 'first.c'; then $(CYGPATH_W) 'first.c'; else $(CYGPATH_W) '$(srcdir)/first.c'; fi`
+
+lib659-testutil.o: testutil.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib659_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib659-testutil.o -MD -MP -MF $(DEPDIR)/lib659-testutil.Tpo -c -o lib659-testutil.o `test -f 'testutil.c' || echo '$(srcdir)/'`testutil.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/lib659-testutil.Tpo $(DEPDIR)/lib659-testutil.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='testutil.c' object='lib659-testutil.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib659_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib659-testutil.o `test -f 'testutil.c' || echo '$(srcdir)/'`testutil.c
+
+lib659-testutil.obj: testutil.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib659_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib659-testutil.obj -MD -MP -MF $(DEPDIR)/lib659-testutil.Tpo -c -o lib659-testutil.obj `if test -f 'testutil.c'; then $(CYGPATH_W) 'testutil.c'; else $(CYGPATH_W) '$(srcdir)/testutil.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/lib659-testutil.Tpo $(DEPDIR)/lib659-testutil.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='testutil.c' object='lib659-testutil.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib659_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib659-testutil.obj `if test -f 'testutil.c'; then $(CYGPATH_W) 'testutil.c'; else $(CYGPATH_W) '$(srcdir)/testutil.c'; fi`
+
+../../lib/lib659-warnless.o: ../../lib/warnless.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib659_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../../lib/lib659-warnless.o -MD -MP -MF ../../lib/$(DEPDIR)/lib659-warnless.Tpo -c -o ../../lib/lib659-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/lib659-warnless.Tpo ../../lib/$(DEPDIR)/lib659-warnless.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='../../lib/warnless.c' object='../../lib/lib659-warnless.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib659_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../../lib/lib659-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
+
+../../lib/lib659-warnless.obj: ../../lib/warnless.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib659_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../../lib/lib659-warnless.obj -MD -MP -MF ../../lib/$(DEPDIR)/lib659-warnless.Tpo -c -o ../../lib/lib659-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/lib659-warnless.Tpo ../../lib/$(DEPDIR)/lib659-warnless.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='../../lib/warnless.c' object='../../lib/lib659-warnless.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib659_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../../lib/lib659-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
+
+lib661-lib661.o: lib661.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib661_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib661-lib661.o -MD -MP -MF $(DEPDIR)/lib661-lib661.Tpo -c -o lib661-lib661.o `test -f 'lib661.c' || echo '$(srcdir)/'`lib661.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/lib661-lib661.Tpo $(DEPDIR)/lib661-lib661.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='lib661.c' object='lib661-lib661.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib661_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib661-lib661.o `test -f 'lib661.c' || echo '$(srcdir)/'`lib661.c
+
+lib661-lib661.obj: lib661.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib661_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib661-lib661.obj -MD -MP -MF $(DEPDIR)/lib661-lib661.Tpo -c -o lib661-lib661.obj `if test -f 'lib661.c'; then $(CYGPATH_W) 'lib661.c'; else $(CYGPATH_W) '$(srcdir)/lib661.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/lib661-lib661.Tpo $(DEPDIR)/lib661-lib661.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='lib661.c' object='lib661-lib661.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib661_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib661-lib661.obj `if test -f 'lib661.c'; then $(CYGPATH_W) 'lib661.c'; else $(CYGPATH_W) '$(srcdir)/lib661.c'; fi`
+
+lib661-first.o: first.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib661_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib661-first.o -MD -MP -MF $(DEPDIR)/lib661-first.Tpo -c -o lib661-first.o `test -f 'first.c' || echo '$(srcdir)/'`first.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/lib661-first.Tpo $(DEPDIR)/lib661-first.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='first.c' object='lib661-first.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib661_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib661-first.o `test -f 'first.c' || echo '$(srcdir)/'`first.c
+
+lib661-first.obj: first.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib661_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib661-first.obj -MD -MP -MF $(DEPDIR)/lib661-first.Tpo -c -o lib661-first.obj `if test -f 'first.c'; then $(CYGPATH_W) 'first.c'; else $(CYGPATH_W) '$(srcdir)/first.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/lib661-first.Tpo $(DEPDIR)/lib661-first.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='first.c' object='lib661-first.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib661_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib661-first.obj `if test -f 'first.c'; then $(CYGPATH_W) 'first.c'; else $(CYGPATH_W) '$(srcdir)/first.c'; fi`
+
 libauthretry-libauthretry.o: libauthretry.c
 @am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libauthretry_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libauthretry-libauthretry.o -MD -MP -MF $(DEPDIR)/libauthretry-libauthretry.Tpo -c -o libauthretry-libauthretry.o `test -f 'libauthretry.c' || echo '$(srcdir)/'`libauthretry.c
 @am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/libauthretry-libauthretry.Tpo $(DEPDIR)/libauthretry-libauthretry.Po
@@ -9156,10 +10133,19 @@ distclean: distclean-am
        -rm -f ../../lib/$(DEPDIR)/lib1537-warnless.Po
        -rm -f ../../lib/$(DEPDIR)/lib1538-warnless.Po
        -rm -f ../../lib/$(DEPDIR)/lib1540-warnless.Po
+       -rm -f ../../lib/$(DEPDIR)/lib1541-warnless.Po
        -rm -f ../../lib/$(DEPDIR)/lib1555-warnless.Po
        -rm -f ../../lib/$(DEPDIR)/lib1556-warnless.Po
        -rm -f ../../lib/$(DEPDIR)/lib1557-warnless.Po
+       -rm -f ../../lib/$(DEPDIR)/lib1564-warnless.Po
+       -rm -f ../../lib/$(DEPDIR)/lib1565-warnless.Po
+       -rm -f ../../lib/$(DEPDIR)/lib1591-warnless.Po
+       -rm -f ../../lib/$(DEPDIR)/lib1592-warnless.Po
+       -rm -f ../../lib/$(DEPDIR)/lib1596-warnless.Po
        -rm -f ../../lib/$(DEPDIR)/lib1900-warnless.Po
+       -rm -f ../../lib/$(DEPDIR)/lib1905-warnless.Po
+       -rm -f ../../lib/$(DEPDIR)/lib1906-warnless.Po
+       -rm -f ../../lib/$(DEPDIR)/lib1907-warnless.Po
        -rm -f ../../lib/$(DEPDIR)/lib2033-warnless.Po
        -rm -f ../../lib/$(DEPDIR)/lib502-warnless.Po
        -rm -f ../../lib/$(DEPDIR)/lib503-warnless.Po
@@ -9173,7 +10159,6 @@ distclean: distclean-am
        -rm -f ../../lib/$(DEPDIR)/lib530-warnless.Po
        -rm -f ../../lib/$(DEPDIR)/lib532-warnless.Po
        -rm -f ../../lib/$(DEPDIR)/lib533-warnless.Po
-       -rm -f ../../lib/$(DEPDIR)/lib536-warnless.Po
        -rm -f ../../lib/$(DEPDIR)/lib537-warnless.Po
        -rm -f ../../lib/$(DEPDIR)/lib540-warnless.Po
        -rm -f ../../lib/$(DEPDIR)/lib552-warnless.Po
@@ -9187,6 +10172,8 @@ distclean: distclean-am
        -rm -f ../../lib/$(DEPDIR)/lib582-warnless.Po
        -rm -f ../../lib/$(DEPDIR)/lib591-warnless.Po
        -rm -f ../../lib/$(DEPDIR)/lib597-warnless.Po
+       -rm -f ../../lib/$(DEPDIR)/lib658-warnless.Po
+       -rm -f ../../lib/$(DEPDIR)/lib659-warnless.Po
        -rm -f ../../lib/$(DEPDIR)/libntlmconnect-warnless.Po
        -rm -f ../../lib/$(DEPDIR)/warnless.Po
        -rm -f ./$(DEPDIR)/chkdecimalpoint-chkdecimalpoint.Po
@@ -9245,12 +10232,16 @@ distclean: distclean-am
        -rm -f ./$(DEPDIR)/lib1515-testutil.Po
        -rm -f ./$(DEPDIR)/lib1517-first.Po
        -rm -f ./$(DEPDIR)/lib1517-lib1517.Po
+       -rm -f ./$(DEPDIR)/lib1518-first.Po
+       -rm -f ./$(DEPDIR)/lib1518-lib1518.Po
        -rm -f ./$(DEPDIR)/lib1520-first.Po
        -rm -f ./$(DEPDIR)/lib1520-lib1520.Po
        -rm -f ./$(DEPDIR)/lib1521-first.Po
        -rm -f ./$(DEPDIR)/lib1521-lib1521.Po
        -rm -f ./$(DEPDIR)/lib1522-first.Po
        -rm -f ./$(DEPDIR)/lib1522-lib1522.Po
+       -rm -f ./$(DEPDIR)/lib1523-first.Po
+       -rm -f ./$(DEPDIR)/lib1523-lib1523.Po
        -rm -f ./$(DEPDIR)/lib1525-first.Po
        -rm -f ./$(DEPDIR)/lib1525-lib1525.Po
        -rm -f ./$(DEPDIR)/lib1525-testutil.Po
@@ -9296,6 +10287,9 @@ distclean: distclean-am
        -rm -f ./$(DEPDIR)/lib1540-first.Po
        -rm -f ./$(DEPDIR)/lib1540-lib1540.Po
        -rm -f ./$(DEPDIR)/lib1540-testutil.Po
+       -rm -f ./$(DEPDIR)/lib1541-first.Po
+       -rm -f ./$(DEPDIR)/lib1541-lib1541.Po
+       -rm -f ./$(DEPDIR)/lib1541-testutil.Po
        -rm -f ./$(DEPDIR)/lib1550-first.Po
        -rm -f ./$(DEPDIR)/lib1550-lib1550.Po
        -rm -f ./$(DEPDIR)/lib1551-first.Po
@@ -9317,10 +10311,38 @@ distclean: distclean-am
        -rm -f ./$(DEPDIR)/lib1557-first.Po
        -rm -f ./$(DEPDIR)/lib1557-lib1557.Po
        -rm -f ./$(DEPDIR)/lib1557-testutil.Po
+       -rm -f ./$(DEPDIR)/lib1558.Po
+       -rm -f ./$(DEPDIR)/lib1559.Po
        -rm -f ./$(DEPDIR)/lib1560.Po
+       -rm -f ./$(DEPDIR)/lib1564-first.Po
+       -rm -f ./$(DEPDIR)/lib1564-lib1564.Po
+       -rm -f ./$(DEPDIR)/lib1564-testutil.Po
+       -rm -f ./$(DEPDIR)/lib1565-first.Po
+       -rm -f ./$(DEPDIR)/lib1565-lib1565.Po
+       -rm -f ./$(DEPDIR)/lib1565-testutil.Po
+       -rm -f ./$(DEPDIR)/lib1591-first.Po
+       -rm -f ./$(DEPDIR)/lib1591-lib1591.Po
+       -rm -f ./$(DEPDIR)/lib1591-testutil.Po
+       -rm -f ./$(DEPDIR)/lib1592-first.Po
+       -rm -f ./$(DEPDIR)/lib1592-lib1592.Po
+       -rm -f ./$(DEPDIR)/lib1592-testutil.Po
+       -rm -f ./$(DEPDIR)/lib1593.Po
+       -rm -f ./$(DEPDIR)/lib1594.Po
+       -rm -f ./$(DEPDIR)/lib1596-first.Po
+       -rm -f ./$(DEPDIR)/lib1596-lib1594.Po
+       -rm -f ./$(DEPDIR)/lib1596-testutil.Po
        -rm -f ./$(DEPDIR)/lib1900-first.Po
        -rm -f ./$(DEPDIR)/lib1900-lib1900.Po
        -rm -f ./$(DEPDIR)/lib1900-testutil.Po
+       -rm -f ./$(DEPDIR)/lib1905-first.Po
+       -rm -f ./$(DEPDIR)/lib1905-lib1905.Po
+       -rm -f ./$(DEPDIR)/lib1905-testutil.Po
+       -rm -f ./$(DEPDIR)/lib1906-first.Po
+       -rm -f ./$(DEPDIR)/lib1906-lib1906.Po
+       -rm -f ./$(DEPDIR)/lib1906-testutil.Po
+       -rm -f ./$(DEPDIR)/lib1907-first.Po
+       -rm -f ./$(DEPDIR)/lib1907-lib1907.Po
+       -rm -f ./$(DEPDIR)/lib1907-testutil.Po
        -rm -f ./$(DEPDIR)/lib2033-first.Po
        -rm -f ./$(DEPDIR)/lib2033-libntlmconnect.Po
        -rm -f ./$(DEPDIR)/lib2033-testutil.Po
@@ -9399,9 +10421,6 @@ distclean: distclean-am
        -rm -f ./$(DEPDIR)/lib533-first.Po
        -rm -f ./$(DEPDIR)/lib533-lib533.Po
        -rm -f ./$(DEPDIR)/lib533-testutil.Po
-       -rm -f ./$(DEPDIR)/lib536-first.Po
-       -rm -f ./$(DEPDIR)/lib536-lib536.Po
-       -rm -f ./$(DEPDIR)/lib536-testutil.Po
        -rm -f ./$(DEPDIR)/lib537-first.Po
        -rm -f ./$(DEPDIR)/lib537-lib537.Po
        -rm -f ./$(DEPDIR)/lib539-first.Po
@@ -9526,6 +10545,14 @@ distclean: distclean-am
        -rm -f ./$(DEPDIR)/lib654-lib654.Po
        -rm -f ./$(DEPDIR)/lib655-first.Po
        -rm -f ./$(DEPDIR)/lib655-lib655.Po
+       -rm -f ./$(DEPDIR)/lib658-first.Po
+       -rm -f ./$(DEPDIR)/lib658-lib658.Po
+       -rm -f ./$(DEPDIR)/lib658-testutil.Po
+       -rm -f ./$(DEPDIR)/lib659-first.Po
+       -rm -f ./$(DEPDIR)/lib659-lib659.Po
+       -rm -f ./$(DEPDIR)/lib659-testutil.Po
+       -rm -f ./$(DEPDIR)/lib661-first.Po
+       -rm -f ./$(DEPDIR)/lib661-lib661.Po
        -rm -f ./$(DEPDIR)/libauthretry-first.Po
        -rm -f ./$(DEPDIR)/libauthretry-libauthretry.Po
        -rm -f ./$(DEPDIR)/libhostname_la-sethostname.Plo
@@ -9613,10 +10640,19 @@ maintainer-clean: maintainer-clean-am
        -rm -f ../../lib/$(DEPDIR)/lib1537-warnless.Po
        -rm -f ../../lib/$(DEPDIR)/lib1538-warnless.Po
        -rm -f ../../lib/$(DEPDIR)/lib1540-warnless.Po
+       -rm -f ../../lib/$(DEPDIR)/lib1541-warnless.Po
        -rm -f ../../lib/$(DEPDIR)/lib1555-warnless.Po
        -rm -f ../../lib/$(DEPDIR)/lib1556-warnless.Po
        -rm -f ../../lib/$(DEPDIR)/lib1557-warnless.Po
+       -rm -f ../../lib/$(DEPDIR)/lib1564-warnless.Po
+       -rm -f ../../lib/$(DEPDIR)/lib1565-warnless.Po
+       -rm -f ../../lib/$(DEPDIR)/lib1591-warnless.Po
+       -rm -f ../../lib/$(DEPDIR)/lib1592-warnless.Po
+       -rm -f ../../lib/$(DEPDIR)/lib1596-warnless.Po
        -rm -f ../../lib/$(DEPDIR)/lib1900-warnless.Po
+       -rm -f ../../lib/$(DEPDIR)/lib1905-warnless.Po
+       -rm -f ../../lib/$(DEPDIR)/lib1906-warnless.Po
+       -rm -f ../../lib/$(DEPDIR)/lib1907-warnless.Po
        -rm -f ../../lib/$(DEPDIR)/lib2033-warnless.Po
        -rm -f ../../lib/$(DEPDIR)/lib502-warnless.Po
        -rm -f ../../lib/$(DEPDIR)/lib503-warnless.Po
@@ -9630,7 +10666,6 @@ maintainer-clean: maintainer-clean-am
        -rm -f ../../lib/$(DEPDIR)/lib530-warnless.Po
        -rm -f ../../lib/$(DEPDIR)/lib532-warnless.Po
        -rm -f ../../lib/$(DEPDIR)/lib533-warnless.Po
-       -rm -f ../../lib/$(DEPDIR)/lib536-warnless.Po
        -rm -f ../../lib/$(DEPDIR)/lib537-warnless.Po
        -rm -f ../../lib/$(DEPDIR)/lib540-warnless.Po
        -rm -f ../../lib/$(DEPDIR)/lib552-warnless.Po
@@ -9644,6 +10679,8 @@ maintainer-clean: maintainer-clean-am
        -rm -f ../../lib/$(DEPDIR)/lib582-warnless.Po
        -rm -f ../../lib/$(DEPDIR)/lib591-warnless.Po
        -rm -f ../../lib/$(DEPDIR)/lib597-warnless.Po
+       -rm -f ../../lib/$(DEPDIR)/lib658-warnless.Po
+       -rm -f ../../lib/$(DEPDIR)/lib659-warnless.Po
        -rm -f ../../lib/$(DEPDIR)/libntlmconnect-warnless.Po
        -rm -f ../../lib/$(DEPDIR)/warnless.Po
        -rm -f ./$(DEPDIR)/chkdecimalpoint-chkdecimalpoint.Po
@@ -9702,12 +10739,16 @@ maintainer-clean: maintainer-clean-am
        -rm -f ./$(DEPDIR)/lib1515-testutil.Po
        -rm -f ./$(DEPDIR)/lib1517-first.Po
        -rm -f ./$(DEPDIR)/lib1517-lib1517.Po
+       -rm -f ./$(DEPDIR)/lib1518-first.Po
+       -rm -f ./$(DEPDIR)/lib1518-lib1518.Po
        -rm -f ./$(DEPDIR)/lib1520-first.Po
        -rm -f ./$(DEPDIR)/lib1520-lib1520.Po
        -rm -f ./$(DEPDIR)/lib1521-first.Po
        -rm -f ./$(DEPDIR)/lib1521-lib1521.Po
        -rm -f ./$(DEPDIR)/lib1522-first.Po
        -rm -f ./$(DEPDIR)/lib1522-lib1522.Po
+       -rm -f ./$(DEPDIR)/lib1523-first.Po
+       -rm -f ./$(DEPDIR)/lib1523-lib1523.Po
        -rm -f ./$(DEPDIR)/lib1525-first.Po
        -rm -f ./$(DEPDIR)/lib1525-lib1525.Po
        -rm -f ./$(DEPDIR)/lib1525-testutil.Po
@@ -9753,6 +10794,9 @@ maintainer-clean: maintainer-clean-am
        -rm -f ./$(DEPDIR)/lib1540-first.Po
        -rm -f ./$(DEPDIR)/lib1540-lib1540.Po
        -rm -f ./$(DEPDIR)/lib1540-testutil.Po
+       -rm -f ./$(DEPDIR)/lib1541-first.Po
+       -rm -f ./$(DEPDIR)/lib1541-lib1541.Po
+       -rm -f ./$(DEPDIR)/lib1541-testutil.Po
        -rm -f ./$(DEPDIR)/lib1550-first.Po
        -rm -f ./$(DEPDIR)/lib1550-lib1550.Po
        -rm -f ./$(DEPDIR)/lib1551-first.Po
@@ -9774,10 +10818,38 @@ maintainer-clean: maintainer-clean-am
        -rm -f ./$(DEPDIR)/lib1557-first.Po
        -rm -f ./$(DEPDIR)/lib1557-lib1557.Po
        -rm -f ./$(DEPDIR)/lib1557-testutil.Po
+       -rm -f ./$(DEPDIR)/lib1558.Po
+       -rm -f ./$(DEPDIR)/lib1559.Po
        -rm -f ./$(DEPDIR)/lib1560.Po
+       -rm -f ./$(DEPDIR)/lib1564-first.Po
+       -rm -f ./$(DEPDIR)/lib1564-lib1564.Po
+       -rm -f ./$(DEPDIR)/lib1564-testutil.Po
+       -rm -f ./$(DEPDIR)/lib1565-first.Po
+       -rm -f ./$(DEPDIR)/lib1565-lib1565.Po
+       -rm -f ./$(DEPDIR)/lib1565-testutil.Po
+       -rm -f ./$(DEPDIR)/lib1591-first.Po
+       -rm -f ./$(DEPDIR)/lib1591-lib1591.Po
+       -rm -f ./$(DEPDIR)/lib1591-testutil.Po
+       -rm -f ./$(DEPDIR)/lib1592-first.Po
+       -rm -f ./$(DEPDIR)/lib1592-lib1592.Po
+       -rm -f ./$(DEPDIR)/lib1592-testutil.Po
+       -rm -f ./$(DEPDIR)/lib1593.Po
+       -rm -f ./$(DEPDIR)/lib1594.Po
+       -rm -f ./$(DEPDIR)/lib1596-first.Po
+       -rm -f ./$(DEPDIR)/lib1596-lib1594.Po
+       -rm -f ./$(DEPDIR)/lib1596-testutil.Po
        -rm -f ./$(DEPDIR)/lib1900-first.Po
        -rm -f ./$(DEPDIR)/lib1900-lib1900.Po
        -rm -f ./$(DEPDIR)/lib1900-testutil.Po
+       -rm -f ./$(DEPDIR)/lib1905-first.Po
+       -rm -f ./$(DEPDIR)/lib1905-lib1905.Po
+       -rm -f ./$(DEPDIR)/lib1905-testutil.Po
+       -rm -f ./$(DEPDIR)/lib1906-first.Po
+       -rm -f ./$(DEPDIR)/lib1906-lib1906.Po
+       -rm -f ./$(DEPDIR)/lib1906-testutil.Po
+       -rm -f ./$(DEPDIR)/lib1907-first.Po
+       -rm -f ./$(DEPDIR)/lib1907-lib1907.Po
+       -rm -f ./$(DEPDIR)/lib1907-testutil.Po
        -rm -f ./$(DEPDIR)/lib2033-first.Po
        -rm -f ./$(DEPDIR)/lib2033-libntlmconnect.Po
        -rm -f ./$(DEPDIR)/lib2033-testutil.Po
@@ -9856,9 +10928,6 @@ maintainer-clean: maintainer-clean-am
        -rm -f ./$(DEPDIR)/lib533-first.Po
        -rm -f ./$(DEPDIR)/lib533-lib533.Po
        -rm -f ./$(DEPDIR)/lib533-testutil.Po
-       -rm -f ./$(DEPDIR)/lib536-first.Po
-       -rm -f ./$(DEPDIR)/lib536-lib536.Po
-       -rm -f ./$(DEPDIR)/lib536-testutil.Po
        -rm -f ./$(DEPDIR)/lib537-first.Po
        -rm -f ./$(DEPDIR)/lib537-lib537.Po
        -rm -f ./$(DEPDIR)/lib539-first.Po
@@ -9983,6 +11052,14 @@ maintainer-clean: maintainer-clean-am
        -rm -f ./$(DEPDIR)/lib654-lib654.Po
        -rm -f ./$(DEPDIR)/lib655-first.Po
        -rm -f ./$(DEPDIR)/lib655-lib655.Po
+       -rm -f ./$(DEPDIR)/lib658-first.Po
+       -rm -f ./$(DEPDIR)/lib658-lib658.Po
+       -rm -f ./$(DEPDIR)/lib658-testutil.Po
+       -rm -f ./$(DEPDIR)/lib659-first.Po
+       -rm -f ./$(DEPDIR)/lib659-lib659.Po
+       -rm -f ./$(DEPDIR)/lib659-testutil.Po
+       -rm -f ./$(DEPDIR)/lib661-first.Po
+       -rm -f ./$(DEPDIR)/lib661-lib661.Po
        -rm -f ./$(DEPDIR)/libauthretry-first.Po
        -rm -f ./$(DEPDIR)/libauthretry-libauthretry.Po
        -rm -f ./$(DEPDIR)/libhostname_la-sethostname.Plo
@@ -10033,7 +11110,7 @@ lib1521.c: $(top_srcdir)/tests/libtest/mk-lib1521.pl $(top_srcdir)/include/curl/
        @PERL@ $(top_srcdir)/tests/libtest/mk-lib1521.pl < $(top_srcdir)/include/curl/curl.h > lib1521.c
 
 checksrc:
-       @PERL@ $(top_srcdir)/lib/checksrc.pl $(srcdir)/*.c
+       $(CHECKSRC)@PERL@ $(top_srcdir)/lib/checksrc.pl $(srcdir)/*.[ch]
 
 # for debug builds, we scan the sources on all regular make invokes
 @CURLDEBUG_TRUE@all-local: checksrc
index 7a3cd16..374a667 100644 (file)
@@ -16,22 +16,24 @@ noinst_PROGRAMS = chkhostname libauthretry libntlmconnect                \
  lib500 lib501 lib502 lib503 lib504 lib505 lib506 lib507 lib508 lib509   \
  lib510 lib511 lib512 lib513 lib514 lib515 lib516 lib517 lib518 lib519   \
  lib520 lib521 lib523 lib524 lib525 lib526 lib527 lib529 lib530 lib532   \
- lib533 lib536 lib537 lib539 lib540 lib541 lib542 lib543 lib544 lib545   \
+ lib533        lib537 lib539 lib540 lib541 lib542 lib543 lib544 lib545   \
  lib547 lib548 lib549 lib552 lib553 lib554 lib555 lib556 lib557 lib558   \
  lib559 lib560 lib562 lib564 lib565 lib566 lib567 lib568 lib569 lib570   \
  lib571 lib572 lib573 lib574 lib575 lib576        lib578 lib579 lib582   \
  lib583 lib585 lib586 lib587 lib589 lib590 lib591 lib597 lib598 lib599   \
- lib643 lib644 lib645 lib650 lib651 lib652 lib653 lib654 lib655 \
+ lib643 lib644 lib645 lib650 lib651 lib652 lib653 lib654 lib655 lib658   \
+ lib659 lib661 \
  lib1156 \
  lib1500 lib1501 lib1502 lib1503 lib1504 lib1505 lib1506 lib1507 lib1508 \
  lib1509 lib1510 lib1511 lib1512 lib1513 lib1514 lib1515         lib1517 \
- lib1520 lib1521 lib1522 \
+ lib1518         lib1520 lib1521 lib1522 lib1523 \
  lib1525 lib1526 lib1527 lib1528 lib1529 lib1530 lib1531 lib1532 lib1533 \
  lib1534 lib1535 lib1536 lib1537 lib1538 \
- lib1540 \
+ lib1540 lib1541 \
  lib1550 lib1551 lib1552 lib1553 lib1554 lib1555 lib1556 lib1557 \
- lib1560 \
- lib1900 \
+ lib1558 lib1559 lib1560 lib1564 lib1565 \
+ lib1591 lib1592 lib1593 lib1594 lib1596 \
+ lib1900 lib1905 lib1906 lib1907 \
  lib2033
 
 chkdecimalpoint_SOURCES = chkdecimalpoint.c ../../lib/mprintf.c \
@@ -157,10 +159,6 @@ lib533_SOURCES = lib533.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
 lib533_LDADD = $(TESTUTIL_LIBS)
 lib533_CPPFLAGS = $(AM_CPPFLAGS)
 
-lib536_SOURCES = lib536.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
-lib536_LDADD = $(TESTUTIL_LIBS)
-lib536_CPPFLAGS = $(AM_CPPFLAGS)
-
 lib537_SOURCES = lib537.c $(SUPPORTFILES) $(WARNLESS)
 lib537_CPPFLAGS = $(AM_CPPFLAGS)
 
@@ -339,6 +337,17 @@ lib654_CPPFLAGS = $(AM_CPPFLAGS)
 lib655_SOURCES = lib655.c $(SUPPORTFILES)
 lib655_CPPFLAGS = $(AM_CPPFLAGS)
 
+lib658_SOURCES = lib658.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
+lib658_LDADD = $(TESTUTIL_LIBS)
+lib658_CPPFLAGS = $(AM_CPPFLAGS)
+
+lib659_SOURCES = lib659.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
+lib659_LDADD = $(TESTUTIL_LIBS)
+lib659_CPPFLAGS = $(AM_CPPFLAGS)
+
+lib661_SOURCES = lib661.c $(SUPPORTFILES)
+lib661_CPPFLAGS = $(AM_CPPFLAGS)
+
 lib1500_SOURCES = lib1500.c $(SUPPORTFILES) $(TESTUTIL)
 lib1500_LDADD = $(TESTUTIL_LIBS)
 lib1500_CPPFLAGS = $(AM_CPPFLAGS)
@@ -410,6 +419,9 @@ lib1515_CPPFLAGS = $(AM_CPPFLAGS) -DLIB1515
 lib1517_SOURCES = lib1517.c $(SUPPORTFILES)
 lib1517_CPPFLAGS = $(AM_CPPFLAGS) -DLIB1517
 
+lib1518_SOURCES = lib1518.c $(SUPPORTFILES)
+lib1518_CPPFLAGS = $(AM_CPPFLAGS)
+
 lib1520_SOURCES = lib1520.c $(SUPPORTFILES)
 lib1520_CPPFLAGS = $(AM_CPPFLAGS) -DLIB1520
 
@@ -419,6 +431,9 @@ lib1521_CPPFLAGS = $(AM_CPPFLAGS) -I$(srcdir)
 lib1522_SOURCES = lib1522.c $(SUPPORTFILES)
 lib1522_CPPFLAGS = $(AM_CPPFLAGS)
 
+lib1523_SOURCES = lib1523.c $(SUPPORTFILES)
+lib1523_CPPFLAGS = $(AM_CPPFLAGS)
+
 lib1525_SOURCES = lib1525.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
 lib1525_LDADD = $(TESTUTIL_LIBS)
 lib1525_CPPFLAGS = $(AM_CPPFLAGS) -DLIB1525
@@ -479,6 +494,10 @@ lib1540_SOURCES = lib1540.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
 lib1540_LDADD = $(TESTUTIL_LIBS)
 lib1540_CPPFLAGS = $(AM_CPPFLAGS)
 
+lib1541_SOURCES = lib1541.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
+lib1541_LDADD = $(TESTUTIL_LIBS)
+lib1541_CPPFLAGS = $(AM_CPPFLAGS)
+
 lib1550_SOURCES = lib1550.c $(SUPPORTFILES)
 lib1550_CPPFLAGS = $(AM_CPPFLAGS) -DLIB1517
 
@@ -508,13 +527,57 @@ lib1557_SOURCES = lib1557.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
 lib1557_LDADD = $(TESTUTIL_LIBS)
 lib1557_CPPFLAGS = $(AM_CPPFLAGS) -DLIB1557
 
+lib1558_SOURCES = lib1558.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
+lib1558_LDADD = $(TESTUTIL_LIBS)
+
+lib1559_SOURCES = lib1559.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
+lib1559_LDADD = $(TESTUTIL_LIBS)
+
 lib1560_SOURCES = lib1560.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
 lib1560_LDADD = $(TESTUTIL_LIBS)
 
+lib1564_SOURCES = lib1564.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
+lib1564_LDADD = $(TESTUTIL_LIBS)
+lib1564_CPPFLAGS = $(AM_CPPFLAGS)
+
+lib1565_SOURCES = lib1565.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
+lib1565_LDADD = $(TESTUTIL_LIBS)
+lib1565_CPPFLAGS = $(AM_CPPFLAGS)
+
+lib1591_SOURCES = lib1591.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
+lib1591_LDADD = $(TESTUTIL_LIBS)
+lib1591_CPPFLAGS = $(AM_CPPFLAGS) -DLIB1591
+
+lib1592_SOURCES = lib1592.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
+lib1592_LDADD = $(TESTUTIL_LIBS)
+lib1592_CPPFLAGS = $(AM_CPPFLAGS) -DLIB1592
+
+lib1593_SOURCES = lib1593.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
+lib1593_LDADD = $(TESTUTIL_LIBS)
+
+lib1594_SOURCES = lib1594.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
+lib1594_LDADD = $(TESTUTIL_LIBS)
+
+lib1596_SOURCES = lib1594.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
+lib1596_LDADD = $(TESTUTIL_LIBS)
+lib1596_CPPFLAGS = $(AM_CPPFLAGS) -DLIB1596
+
 lib1900_SOURCES = lib1900.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
 lib1900_LDADD = $(TESTUTIL_LIBS)
 lib1900_CPPFLAGS = $(AM_CPPFLAGS)
 
+lib1905_SOURCES = lib1905.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
+lib1905_LDADD = $(TESTUTIL_LIBS)
+lib1905_CPPFLAGS = $(AM_CPPFLAGS)
+
+lib1906_SOURCES = lib1906.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
+lib1906_LDADD = $(TESTUTIL_LIBS)
+lib1906_CPPFLAGS = $(AM_CPPFLAGS)
+
+lib1907_SOURCES = lib1907.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
+lib1907_LDADD = $(TESTUTIL_LIBS)
+lib1907_CPPFLAGS = $(AM_CPPFLAGS)
+
 lib2033_SOURCES = libntlmconnect.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
 lib2033_LDADD = $(TESTUTIL_LIBS)
 lib2033_CPPFLAGS = $(AM_CPPFLAGS) -DUSE_PIPELINING
index b5f5070..7bb7715 100644 (file)
@@ -33,7 +33,7 @@ int main(void)
   int chars;
 
   setlocale(LC_NUMERIC, "");
-  chars = snprintf(zero, TOTAL_STR_LEN, "%.1f", 0.0);
+  chars = msnprintf(zero, TOTAL_STR_LEN, "%.1f", 0.0);
   if((chars == (TOTAL_STR_LEN - 1)) && (strcmp(zero, "0.0") == 0))
     return 0;
   else
index 86d84ca..2731ef8 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -96,10 +96,10 @@ static void memory_tracking_init(void)
       env[CURL_MT_LOGFNAME_BUFSIZE-1] = '\0';
     strcpy(fname, env);
     curl_free(env);
-    curl_memdebug(fname);
-    /* this weird stuff here is to make curl_free() get called
-       before curl_memdebug() as otherwise memory tracking will
-       log a free() without an alloc! */
+    curl_dbg_memdebug(fname);
+    /* this weird stuff here is to make curl_free() get called before
+       curl_dbg_memdebug() as otherwise memory tracking will log a free()
+       without an alloc! */
   }
   /* if CURL_MEMLIMIT is set, this enables fail-on-alloc-number-N feature */
   env = curl_getenv("CURL_MEMLIMIT");
@@ -107,7 +107,7 @@ static void memory_tracking_init(void)
     char *endptr;
     long num = strtol(env, &endptr, 10);
     if((endptr != env) && (endptr == env + strlen(env)) && (num > 0))
-      curl_memlimit(num);
+      curl_dbg_memlimit(num);
     curl_free(env);
   }
 }
@@ -124,7 +124,7 @@ char *hexdump(const unsigned char *buffer, size_t len)
   if(len > 200)
     return NULL;
   for(i = 0; i<len; i++, p += 3)
-    snprintf(p, 4, "%02x ", buffer[i]);
+    msnprintf(p, 4, "%02x ", buffer[i]);
   return dump;
 }
 
index 63348de..df6062c 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -88,15 +88,15 @@ static int onetest(CURL *curl, const char *url, const testparams *p)
   unsigned int replyselector;
   char urlbuf[256];
 
-  replyselector = p->flags & F_CONTENTRANGE? 1: 0;
+  replyselector = (p->flags & F_CONTENTRANGE)? 1: 0;
   if(p->flags & F_HTTP416)
     replyselector += 2;
-  snprintf(urlbuf, sizeof(urlbuf), "%s%04u", url, replyselector);
+  msnprintf(urlbuf, sizeof(urlbuf), "%s%04u", url, replyselector);
   test_setopt(curl, CURLOPT_URL, urlbuf);
   test_setopt(curl, CURLOPT_RESUME_FROM, (p->flags & F_RESUME)? 3: 0);
   test_setopt(curl, CURLOPT_RANGE, !(p->flags & F_RESUME)?
                                    "3-1000000": (char *) NULL);
-  test_setopt(curl, CURLOPT_FAILONERROR, p->flags & F_FAIL? 1: 0);
+  test_setopt(curl, CURLOPT_FAILONERROR, (p->flags & F_FAIL)? 1: 0);
   hasbody = 0;
   res = curl_easy_perform(curl);
   if(res != p->result) {
index bd7c7c8..6bde00a 100644 (file)
@@ -50,8 +50,8 @@ int test(char *URL)
   /* DNS cache injection */
   struct curl_slist *dns_cache_list;
 
-  snprintf(redirect, sizeof(redirect), "google.com:%s:%s", libtest_arg2,
-           libtest_arg3);
+  msnprintf(redirect, sizeof(redirect), "google.com:%s:%s", libtest_arg2,
+            libtest_arg3);
 
   start_test_timing();
 
index d456bc9..1d5e8de 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 2013, 2017, Linus Nielsen Feltzing <linus@haxx.se>
+ * Copyright (C) 2013 - 2018, Linus Nielsen Feltzing <linus@haxx.se>
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -46,8 +46,8 @@ int test(char *URL)
 
   /* Create fake DNS entries for serverX.example.com for all handles */
   for(i = 0; i < NUM_HANDLES; i++) {
-    snprintf(dnsentry, sizeof(dnsentry), "server%d.example.com:%s:%s",
-             i + 1, port, address);
+    msnprintf(dnsentry, sizeof(dnsentry), "server%d.example.com:%s:%s",
+              i + 1, port, address);
     printf("%s\n", dnsentry);
     slist2 = curl_slist_append(slist, dnsentry);
     if(!slist2) {
@@ -70,9 +70,9 @@ int test(char *URL)
     /* get an easy handle */
     easy_init(curl[i]);
     /* specify target */
-    snprintf(target_url, sizeof(target_url),
-             "http://server%d.example.com:%s/path/1506%04i",
-             i + 1, port, i + 1);
+    msnprintf(target_url, sizeof(target_url),
+              "http://server%d.example.com:%s/path/1506%04i",
+              i + 1, port, i + 1);
     target_url[sizeof(target_url) - 1] = '\0';
     easy_setopt(curl[i], CURLOPT_URL, target_url);
     /* go verbose */
index d72749b..4c7b670 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 2013, 2017, Linus Nielsen Feltzing <linus@haxx.se>
+ * Copyright (C) 2013 - 2018, Linus Nielsen Feltzing <linus@haxx.se>
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -44,8 +44,8 @@ int test(char *URL)
 
   /* Create fake DNS entries for serverX.example.com for all handles */
   for(i = 0; i < NUM_URLS; i++) {
-    snprintf(dnsentry, sizeof(dnsentry), "server%d.example.com:%s:%s", i + 1,
-             port, address);
+    msnprintf(dnsentry, sizeof(dnsentry), "server%d.example.com:%s:%s", i + 1,
+              port, address);
     printf("%s\n", dnsentry);
     slist2 = curl_slist_append(slist, dnsentry);
     if(!slist2) {
@@ -74,9 +74,9 @@ int test(char *URL)
   /* get NUM_HANDLES easy handles */
   for(i = 0; i < NUM_URLS; i++) {
     /* specify target */
-    snprintf(target_url, sizeof(target_url),
-             "http://server%d.example.com:%s/path/1510%04i",
-             i + 1, port, i + 1);
+    msnprintf(target_url, sizeof(target_url),
+              "http://server%d.example.com:%s/path/1510%04i",
+              i + 1, port, i + 1);
     target_url[sizeof(target_url) - 1] = '\0';
     easy_setopt(curl, CURLOPT_URL, target_url);
 
index 1c25789..0b71ad3 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 2013 - 2017, Linus Nielsen Feltzing <linus@haxx.se>
+ * Copyright (C) 2013 - 2018, Linus Nielsen Feltzing <linus@haxx.se>
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -49,8 +49,8 @@ int test(char *URL)
     return TEST_ERR_MAJOR_BAD;
   }
 
-  snprintf(dnsentry, sizeof(dnsentry), "server.example.curl:%s:%s",
-           port, address);
+  msnprintf(dnsentry, sizeof(dnsentry), "server.example.curl:%s:%s",
+            port, address);
   printf("%s\n", dnsentry);
   slist = curl_slist_append(slist, dnsentry);
 
@@ -59,9 +59,9 @@ int test(char *URL)
     /* get an easy handle */
     easy_init(curl[i]);
     /* specify target */
-    snprintf(target_url, sizeof(target_url),
-             "http://server.example.curl:%s/path/1512%04i",
-             port, i + 1);
+    msnprintf(target_url, sizeof(target_url),
+              "http://server.example.curl:%s/path/1512%04i",
+              port, i + 1);
     target_url[sizeof(target_url) - 1] = '\0';
     easy_setopt(curl[i], CURLOPT_URL, target_url);
     /* go verbose */
index 39bccc5..c72554a 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -123,8 +123,8 @@ int test(char *URL)
   int i;
   int count = 2;
 
-  snprintf(dns_entry, sizeof(dns_entry), "testserver.example.com:%s:%s",
-           port, address);
+  msnprintf(dns_entry, sizeof(dns_entry), "testserver.example.com:%s:%s",
+            port, address);
 
   start_test_timing();
 
@@ -133,8 +133,8 @@ int test(char *URL)
 
   for(i = 1; i <= count; i++) {
     char target_url[256];
-    snprintf(target_url, sizeof(target_url),
-             "http://testserver.example.com:%s/%s%04d", port, path, i);
+    msnprintf(target_url, sizeof(target_url),
+              "http://testserver.example.com:%s/%s%04d", port, path, i);
 
     /* second request must succeed like the first one */
     res = do_one_request(multi, target_url, dns_entry);
diff --git a/tests/libtest/lib1518.c b/tests/libtest/lib1518.c
new file mode 100644 (file)
index 0000000..1751b58
--- /dev/null
@@ -0,0 +1,74 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+#include "test.h"
+
+#include "memdebug.h"
+
+/* Test inspired by github issue 3340 */
+
+int test(char *URL)
+{
+  CURL *curl;
+  CURLcode res = CURLE_OK;
+  long curlResponseCode;
+  long curlRedirectCount;
+  char *effectiveUrl = NULL;
+  char *redirectUrl = NULL;
+
+  curl = curl_easy_init();
+  if(!curl) {
+    fprintf(stderr, "curl_easy_init() failed\n");
+    curl_global_cleanup();
+    return TEST_ERR_MAJOR_BAD;
+  }
+
+  test_setopt(curl, CURLOPT_URL, URL);
+  /* just to make it explicit and visible in this test: */
+  test_setopt(curl, CURLOPT_FOLLOWLOCATION, 0L);
+
+  /* Perform the request, res will get the return code */
+  res = curl_easy_perform(curl);
+
+  curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &curlResponseCode);
+  curl_easy_getinfo(curl, CURLINFO_REDIRECT_COUNT, &curlRedirectCount);
+  curl_easy_getinfo(curl, CURLINFO_EFFECTIVE_URL, &effectiveUrl);
+  curl_easy_getinfo(curl, CURLINFO_REDIRECT_URL, &redirectUrl);
+
+  printf("res: %d\n"
+         "status: %d\n"
+         "redirects: %d\n"
+         "effectiveurl: %s\n"
+         "redirecturl: %s\n",
+         (int)res,
+         (int)curlResponseCode,
+         (int)curlRedirectCount,
+         effectiveUrl,
+         redirectUrl);
+
+test_cleanup:
+
+  /* always cleanup */
+  curl_easy_cleanup(curl);
+  curl_global_cleanup();
+
+  return res;
+}
index 2de9552..6df152f 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -32,14 +32,16 @@ static char g_Data[40 * 1024]; /* POST 40KB */
 static int sockopt_callback(void *clientp, curl_socket_t curlfd,
                             curlsocktype purpose)
 {
+#if defined(SOL_SOCKET) && defined(SO_SNDBUF)
   int sndbufsize = 4 * 1024; /* 4KB send buffer */
   (void) clientp;
   (void) purpose;
-#if defined(SOL_SOCKET) && defined(SO_SNDBUF)
   setsockopt(curlfd, SOL_SOCKET, SO_SNDBUF,
              (const char *)&sndbufsize, sizeof(sndbufsize));
 #else
+  (void)clientp;
   (void)curlfd;
+  (void)purpose;
 #endif
   return CURL_SOCKOPT_OK;
 }
@@ -82,6 +84,7 @@ int test(char *URL)
 
   curl_slist_free_all(pHeaderList);
   curl_easy_cleanup(pCurl);
+  curl_global_cleanup();
 
   return 0;
 }
diff --git a/tests/libtest/lib1523.c b/tests/libtest/lib1523.c
new file mode 100644 (file)
index 0000000..170527d
--- /dev/null
@@ -0,0 +1,82 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+#include "test.h"
+
+/* test case and code based on https://github.com/curl/curl/issues/3927 */
+
+#include "testutil.h"
+#include "warnless.h"
+#include "memdebug.h"
+
+static int dload_progress_cb(void *a, curl_off_t b, curl_off_t c,
+                             curl_off_t d, curl_off_t e)
+{
+  (void)a;
+  (void)b;
+  (void)c;
+  (void)d;
+  (void)e;
+  return 0;
+}
+
+static size_t write_cb(char *d, size_t n, size_t l, void *p)
+{
+  /* take care of the data here, ignored in this example */
+  (void)d;
+  (void)p;
+  return n*l;
+}
+
+static CURLcode run(CURL *hnd, long limit, long time)
+{
+  curl_easy_setopt(hnd, CURLOPT_LOW_SPEED_LIMIT, limit);
+  curl_easy_setopt(hnd, CURLOPT_LOW_SPEED_TIME, time);
+  return curl_easy_perform(hnd);
+}
+
+int test(char *URL)
+{
+  CURLcode ret;
+  CURL *hnd = curl_easy_init();
+  char buffer[CURL_ERROR_SIZE];
+  curl_easy_setopt(hnd, CURLOPT_URL, URL);
+  curl_easy_setopt(hnd, CURLOPT_WRITEFUNCTION, write_cb);
+  curl_easy_setopt(hnd, CURLOPT_ERRORBUFFER, buffer);
+  curl_easy_setopt(hnd, CURLOPT_NOPROGRESS, 0L);
+  curl_easy_setopt(hnd, CURLOPT_XFERINFOFUNCTION, dload_progress_cb);
+
+  printf("Start: %d\n", time(NULL));
+  ret = run(hnd, 1, 2);
+  if(ret)
+    fprintf(stderr, "error %d: %s\n", ret, buffer);
+
+  ret = run(hnd, 12000, 1);
+  if(ret != CURLE_OPERATION_TIMEDOUT)
+    fprintf(stderr, "error %d: %s\n", ret, buffer);
+  else
+    ret = 0;
+
+  printf("End: %d\n", time(NULL));
+  curl_easy_cleanup(hnd);
+
+  return (int)ret;
+}
index c63a109..8d2210e 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -29,7 +29,8 @@ int test(char *URL)
   CURL *curl = NULL;
   CURLcode res = CURLE_FAILED_INIT;
   char bURL[512];
-  snprintf(bURL, sizeof(bURL), "%s HTTP/1.1\r\nGET http://1529.com/1529", URL);
+  msnprintf(bURL, sizeof(bURL),
+            "%s HTTP/1.1\r\nGET http://1529.com/1529", URL);
 
   if(curl_global_init(CURL_GLOBAL_ALL) != CURLE_OK) {
     fprintf(stderr, "curl_global_init() failed\n");
index 9832c3a..7c5dde0 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -30,7 +30,7 @@ int test(char *URL)
   CURLcode res = CURLE_OK;
   char *ptr = NULL;
   int asize;
-  int outlen;
+  int outlen = 0;
   char *raw;
 
   (void)URL; /* we don't use this */
diff --git a/tests/libtest/lib1541.c b/tests/libtest/lib1541.c
new file mode 100644 (file)
index 0000000..f3b41f5
--- /dev/null
@@ -0,0 +1,151 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+#include "test.h"
+
+#include "testutil.h"
+#include "warnless.h"
+#include "memdebug.h"
+
+#ifdef HAVE_PTHREAD_H
+#include <pthread.h>
+#include <time.h>
+
+/* number of threads to fire up in parallel */
+#define NUM_THREADS 67
+
+/* for how many seconds each thread will loop */
+#define RUN_FOR_SECONDS 7
+
+static pthread_mutex_t connlock;
+
+static size_t write_db(void *ptr, size_t size, size_t nmemb, void *data)
+{
+  /* not interested in the downloaded bytes, return the size */
+  (void)ptr;  /* unused */
+  (void)data; /* unused */
+  return (size_t)(size * nmemb);
+}
+
+static void lock_cb(CURL *handle, curl_lock_data data,
+                    curl_lock_access access, void *userptr)
+{
+  (void)access; /* unused */
+  (void)userptr; /* unused */
+  (void)handle; /* unused */
+  (void)data; /* unused */
+  pthread_mutex_lock(&connlock);
+}
+
+static void unlock_cb(CURL *handle, curl_lock_data data,
+                      void *userptr)
+{
+  (void)userptr; /* unused */
+  (void)handle;  /* unused */
+  (void)data;    /* unused */
+  pthread_mutex_unlock(&connlock);
+}
+
+static void init_locks(void)
+{
+  pthread_mutex_init(&connlock, NULL);
+}
+
+static void kill_locks(void)
+{
+  pthread_mutex_destroy(&connlock);
+}
+
+struct initurl {
+  const char *url;
+  CURLSH *share;
+  int threadno;
+};
+
+static void *run_thread(void *ptr)
+{
+  struct initurl *u = (struct initurl *)ptr;
+  int i;
+  time_t end = time(NULL) + RUN_FOR_SECONDS;
+
+  for(i = 0; time(NULL) < end; i++) {
+    CURL *curl = curl_easy_init();
+    curl_easy_setopt(curl, CURLOPT_URL, u->url);
+    curl_easy_setopt(curl, CURLOPT_VERBOSE, 0L);
+    curl_easy_setopt(curl, CURLOPT_SHARE, u->share);
+    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_db);
+    curl_easy_perform(curl); /* ignores error */
+    curl_easy_cleanup(curl);
+    fprintf(stderr, "Thread %d transfer %d\n", u->threadno, i);
+  }
+
+  return NULL;
+}
+
+int test(char *URL)
+{
+  pthread_t tid[NUM_THREADS];
+  int i;
+  CURLSH *share;
+  struct initurl url[NUM_THREADS];
+
+  /* Must initialize libcurl before any threads are started */
+  curl_global_init(CURL_GLOBAL_ALL);
+
+  share = curl_share_init();
+  curl_share_setopt(share, CURLSHOPT_LOCKFUNC, lock_cb);
+  curl_share_setopt(share, CURLSHOPT_UNLOCKFUNC, unlock_cb);
+  curl_share_setopt(share, CURLSHOPT_SHARE, CURL_LOCK_DATA_CONNECT);
+
+  init_locks();
+
+  for(i = 0; i< NUM_THREADS; i++) {
+    int error;
+    url[i].url = URL;
+    url[i].share = share;
+    url[i].threadno = i;
+    error = pthread_create(&tid[i], NULL, run_thread, &url[i]);
+    if(0 != error)
+      fprintf(stderr, "Couldn't run thread number %d, errno %d\n", i, error);
+    else
+      fprintf(stderr, "Thread %d, gets %s\n", i, URL);
+  }
+
+  /* now wait for all threads to terminate */
+  for(i = 0; i< NUM_THREADS; i++) {
+    pthread_join(tid[i], NULL);
+    fprintf(stderr, "Thread %d terminated\n", i);
+  }
+
+  kill_locks();
+
+  curl_share_cleanup(share);
+  curl_global_cleanup();
+  return 0;
+}
+
+#else /* without pthread, this test doesn't work */
+int test(char *URL)
+{
+  (void)URL;
+  return 0;
+}
+#endif
index e4f2255..f7193b5 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2015, 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -36,14 +36,16 @@ static int progressCallback(void *arg,
                             double ulnow)
 {
   CURLcode res = 0;
+  char buffer[256];
+  size_t n = 0;
   (void)arg;
   (void)dltotal;
   (void)dlnow;
   (void)ultotal;
   (void)ulnow;
-  res = curl_easy_recv(curl, NULL, 0, NULL);
+  res = curl_easy_recv(curl, buffer, 256, &n);
   printf("curl_easy_recv returned %d\n", res);
-  res = curl_easy_send(curl, NULL, 0, NULL);
+  res = curl_easy_send(curl, buffer, n, &n);
   printf("curl_easy_send returned %d\n", res);
 
   return 1;
index bd0f20a..d7132ad 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -49,13 +49,13 @@ int test(char *URL)
   multi_perform(curlm, &running_handles);
 
   multi_remove_handle(curlm, curl2);
-  curl_easy_cleanup(curl2);
 
   /* If curl2 is still in the connect-pending list, this will crash */
   multi_remove_handle(curlm, curl1);
-  curl_easy_cleanup(curl1);
 
 test_cleanup:
+  curl_easy_cleanup(curl1);
+  curl_easy_cleanup(curl2);
   curl_multi_cleanup(curlm);
   curl_global_cleanup();
   return res;
diff --git a/tests/libtest/lib1558.c b/tests/libtest/lib1558.c
new file mode 100644 (file)
index 0000000..2305f4d
--- /dev/null
@@ -0,0 +1,65 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+#include "test.h"
+
+#include "testutil.h"
+#include "warnless.h"
+#include "memdebug.h"
+
+int test(char *URL)
+{
+  CURLcode res = 0;
+  CURL *curl = NULL;
+  long protocol = 0;
+
+  global_init(CURL_GLOBAL_ALL);
+  easy_init(curl);
+
+  easy_setopt(curl, CURLOPT_URL, URL);
+  res = curl_easy_perform(curl);
+  if(res) {
+    fprintf(stderr, "curl_easy_perform() returned %d (%s)\n",
+            res, curl_easy_strerror(res));
+    goto test_cleanup;
+  }
+
+  res = curl_easy_getinfo(curl, CURLINFO_PROTOCOL, &protocol);
+  if(res) {
+    fprintf(stderr, "curl_easy_getinfo() returned %d (%s)\n",
+            res, curl_easy_strerror(res));
+    goto test_cleanup;
+  }
+
+  printf("Protocol: %x\n", protocol);
+
+  curl_easy_cleanup(curl);
+  curl_global_cleanup();
+
+  return 0;
+
+test_cleanup:
+
+  curl_easy_cleanup(curl);
+  curl_global_cleanup();
+
+  return res; /* return the final return code */
+}
diff --git a/tests/libtest/lib1559.c b/tests/libtest/lib1559.c
new file mode 100644 (file)
index 0000000..e1b4175
--- /dev/null
@@ -0,0 +1,74 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+#include "test.h"
+
+#include "testutil.h"
+#include "warnless.h"
+#include "memdebug.h"
+
+#define EXCESSIVE 10*1000*1000
+int test(char *URL)
+{
+  CURLcode res = 0;
+  CURL *curl = NULL;
+  char *longurl = malloc(EXCESSIVE);
+  CURLU *u;
+  (void)URL;
+
+  if(!longurl)
+    return 1;
+
+  memset(longurl, 'a', EXCESSIVE);
+  longurl[EXCESSIVE-1] = 0;
+
+  global_init(CURL_GLOBAL_ALL);
+  easy_init(curl);
+
+  res = curl_easy_setopt(curl, CURLOPT_URL, longurl);
+  printf("CURLOPT_URL %d bytes URL == %d\n",
+         EXCESSIVE, (int)res);
+
+  res = curl_easy_setopt(curl, CURLOPT_POSTFIELDS, longurl);
+  printf("CURLOPT_POSTFIELDS %d bytes data == %d\n",
+         EXCESSIVE, (int)res);
+
+  u = curl_url();
+  if(u) {
+    CURLUcode uc = curl_url_set(u, CURLUPART_URL, longurl, 0);
+    printf("CURLUPART_URL %d bytes URL == %d\n",
+           EXCESSIVE, (int)uc);
+    uc = curl_url_set(u, CURLUPART_SCHEME, longurl, CURLU_NON_SUPPORT_SCHEME);
+    printf("CURLUPART_SCHEME %d bytes scheme == %d\n",
+           EXCESSIVE, (int)uc);
+    uc = curl_url_set(u, CURLUPART_USER, longurl, 0);
+    printf("CURLUPART_USER %d bytes user == %d\n",
+           EXCESSIVE, (int)uc);
+    curl_url_cleanup(u);
+  }
+
+test_cleanup:
+  free(longurl);
+  curl_easy_cleanup(curl);
+  curl_global_cleanup();
+
+  return res; /* return the final return code */
+}
index e0faa12..7f8accc 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -67,10 +67,10 @@ static int checkparts(CURLU *u, const char *in, const char *wanted,
     size_t n;
     rc = curl_url_get(u, parts[i].part, &p, getflags);
     if(!rc && p) {
-      snprintf(bufp, len, "%s%s", buf[0]?" | ":"", p);
+      msnprintf(bufp, len, "%s%s", buf[0]?" | ":"", p);
     }
     else
-      snprintf(bufp, len, "%s[%d]", buf[0]?" | ":"", (int)rc);
+      msnprintf(bufp, len, "%s[%d]", buf[0]?" | ":"", (int)rc);
 
     n = strlen(bufp);
     bufp += n;
@@ -99,7 +99,8 @@ struct setcase {
   const char *out;
   unsigned int urlflags;
   unsigned int setflags;
-  CURLUcode ucode;
+  CURLUcode ucode; /* for the main URL set */
+  CURLUcode pcode; /* for updating parts */
 };
 
 struct testcase {
@@ -128,8 +129,64 @@ struct querycase {
 };
 
 static struct testcase get_parts_list[] ={
+#ifdef WIN32
+  {"file:/C:\\programs\\foo",
+   "file | [11] | [12] | [13] | [14] | [15] | C:\\programs\\foo | [16] | [17]",
+   CURLU_DEFAULT_SCHEME, 0, CURLUE_OK},
+  {"file://C:\\programs\\foo",
+   "file | [11] | [12] | [13] | [14] | [15] | C:\\programs\\foo | [16] | [17]",
+   CURLU_DEFAULT_SCHEME, 0, CURLUE_OK},
+  {"file:///C:\\programs\\foo",
+   "file | [11] | [12] | [13] | [14] | [15] | C:\\programs\\foo | [16] | [17]",
+   CURLU_DEFAULT_SCHEME, 0, CURLUE_OK},
+#endif
+  {"https://example.com/color/#green?no-black",
+   "https | [11] | [12] | [13] | example.com | [15] | /color/ | [16] | "
+   "green?no-black",
+   CURLU_DEFAULT_SCHEME, 0, CURLUE_OK },
+  {"https://example.com/color/#green#no-black",
+   "https | [11] | [12] | [13] | example.com | [15] | /color/ | [16] | "
+   "green#no-black",
+   CURLU_DEFAULT_SCHEME, 0, CURLUE_OK },
+  {"https://example.com/color/?green#no-black",
+   "https | [11] | [12] | [13] | example.com | [15] | /color/ | green | "
+   "no-black",
+   CURLU_DEFAULT_SCHEME, 0, CURLUE_OK },
+  {"https://example.com/#color/?green#no-black",
+   "https | [11] | [12] | [13] | example.com | [15] | / | [16] | "
+   "color/?green#no-black",
+   CURLU_DEFAULT_SCHEME, 0, CURLUE_OK },
+  {"https://example.#com/color/?green#no-black",
+   "https | [11] | [12] | [13] | example. | [15] | / | [16] | "
+   "com/color/?green#no-black",
+   CURLU_DEFAULT_SCHEME, 0, CURLUE_OK },
+  {"http://[ab.be:1]/x", "",
+   CURLU_DEFAULT_SCHEME, 0, CURLUE_MALFORMED_INPUT},
+  {"http://[ab.be]/x", "",
+   CURLU_DEFAULT_SCHEME, 0, CURLUE_MALFORMED_INPUT},
+  /* URL without host name */
+  {"http://a:b@/x", "",
+   CURLU_DEFAULT_SCHEME, 0, CURLUE_NO_HOST},
+  {"boing:80",
+   "https | [11] | [12] | [13] | boing | 80 | / | [16] | [17]",
+   CURLU_DEFAULT_SCHEME, 0, CURLUE_OK},
+  {"http://[fd00:a41::50]:8080",
+   "http | [11] | [12] | [13] | [fd00:a41::50] | 8080 | / | [16] | [17]",
+   CURLU_DEFAULT_SCHEME, 0, CURLUE_OK},
+  {"http://[fd00:a41::50]/",
+   "http | [11] | [12] | [13] | [fd00:a41::50] | [15] | / | [16] | [17]",
+   CURLU_DEFAULT_SCHEME, 0, CURLUE_OK},
+  {"http://[fd00:a41::50]",
+   "http | [11] | [12] | [13] | [fd00:a41::50] | [15] | / | [16] | [17]",
+   CURLU_DEFAULT_SCHEME, 0, CURLUE_OK},
   {"https://[::1%252]:1234",
-   "https | [11] | [12] | [13] | [::1%252] | 1234 | / | [16] | [17]",
+   "https | [11] | [12] | [13] | [::1] | 1234 | / | [16] | [17]",
+   CURLU_DEFAULT_SCHEME, 0, CURLUE_OK},
+
+  /* here's "bad" zone id */
+  {"https://[fe80::20c:29ff:fe9c:409b%eth0]:1234",
+   "https | [11] | [12] | [13] | [fe80::20c:29ff:fe9c:409b] | 1234 "
+   "| / | [16] | [17]",
    CURLU_DEFAULT_SCHEME, 0, CURLUE_OK},
   {"https://127.0.0.1:443",
    "https | [11] | [12] | [13] | 127.0.0.1 | [15] | / | [16] | [17]",
@@ -249,6 +306,26 @@ static struct testcase get_parts_list[] ={
 };
 
 static struct urltestcase get_url_list[] = {
+  /* 40 bytes scheme is the max allowed */
+  {"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA://hostname/path",
+   "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa://hostname/path",
+   CURLU_NON_SUPPORT_SCHEME, 0, CURLUE_OK},
+  /* 41 bytes scheme is not allowed */
+  {"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA://hostname/path",
+   "",
+   CURLU_NON_SUPPORT_SCHEME, 0, CURLUE_MALFORMED_INPUT},
+  {"https://[fe80::20c:29ff:fe9c:409b%]:1234",
+   "",
+   0, 0, CURLUE_MALFORMED_INPUT},
+  {"https://[fe80::20c:29ff:fe9c:409b%25]:1234",
+   "https://[fe80::20c:29ff:fe9c:409b%2525]:1234/",
+   0, 0, CURLUE_OK},
+  {"https://[fe80::20c:29ff:fe9c:409b%eth0]:1234",
+   "https://[fe80::20c:29ff:fe9c:409b%25eth0]:1234/",
+   0, 0, CURLUE_OK},
+  {"https://[::%25fakeit]/moo",
+   "https://[::%25fakeit]/moo",
+   0, 0, CURLUE_OK},
   {"smtp.example.com/path/html",
    "smtp://smtp.example.com/path/html",
    CURLU_GUESS_SCHEME, 0, CURLUE_OK},
@@ -357,6 +434,18 @@ static struct urltestcase get_url_list[] = {
   {"tp://example.com/path/html",
    "tp://example.com/path/html",
    CURLU_NON_SUPPORT_SCHEME, 0, CURLUE_OK},
+  {"custom-scheme://host?expected=test-good",
+   "custom-scheme://host/?expected=test-good",
+   CURLU_NON_SUPPORT_SCHEME, 0, CURLUE_OK},
+  {"custom-scheme://?expected=test-bad",
+   "",
+   CURLU_NON_SUPPORT_SCHEME, 0, CURLUE_MALFORMED_INPUT},
+  {"custom-scheme://?expected=test-new-good",
+   "custom-scheme:///?expected=test-new-good",
+   CURLU_NON_SUPPORT_SCHEME | CURLU_NO_AUTHORITY, 0, CURLUE_OK},
+  {"custom-scheme://host?expected=test-still-good",
+   "custom-scheme://host/?expected=test-still-good",
+   CURLU_NON_SUPPORT_SCHEME | CURLU_NO_AUTHORITY, 0, CURLUE_OK},
   {NULL, NULL, 0, 0, 0}
 };
 
@@ -372,87 +461,140 @@ static int checkurl(const char *url, const char *out)
 
 /* !checksrc! disable SPACEBEFORECOMMA 1 */
 static struct setcase set_parts_list[] = {
+  {"https://example.com/",
+   /* Set a 41 bytes scheme. That's too long so the old scheme remains set. */
+   "scheme=bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbc,",
+   "https://example.com/",
+   0, CURLU_NON_SUPPORT_SCHEME, CURLUE_OK, CURLUE_MALFORMED_INPUT},
+  {"https://example.com/",
+   /* set a 40 bytes scheme */
+   "scheme=bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb,",
+   "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb://example.com/",
+   0, CURLU_NON_SUPPORT_SCHEME, CURLUE_OK, CURLUE_OK},
+  {"https://[::1%25fake]:1234/",
+   "zoneid=NULL,",
+   "https://[::1]:1234/",
+   0, 0, CURLUE_OK, CURLUE_OK},
+  {"https://host:1234/",
+   "port=NULL,",
+   "https://host/",
+   0, 0, CURLUE_OK, CURLUE_OK},
+  {"https://host:1234/",
+   "port=\"\",",
+   "https://host:1234/",
+   0, 0, CURLUE_OK, CURLUE_BAD_PORT_NUMBER},
+  {"https://host:1234/",
+   "port=56 78,",
+   "https://host:1234/",
+   0, 0, CURLUE_OK, CURLUE_MALFORMED_INPUT},
+  {"https://host:1234/",
+   "port=0,",
+   "https://host:1234/",
+   0, 0, CURLUE_OK, CURLUE_BAD_PORT_NUMBER},
+  {"https://host:1234/",
+   "port=65535,",
+   "https://host:65535/",
+   0, 0, CURLUE_OK, CURLUE_OK},
+  {"https://host:1234/",
+   "port=65536,",
+   "https://host:1234/",
+   0, 0, CURLUE_OK, CURLUE_BAD_PORT_NUMBER},
   {"https://host/",
    "path=%4A%4B%4C,",
    "https://host/%4a%4b%4c",
-   0, 0, CURLUE_NO_HOST},
+   0, 0, CURLUE_OK, CURLUE_OK},
   {"https://host/mooo?q#f",
    "path=NULL,query=NULL,fragment=NULL,",
    "https://host/",
-   0, 0, CURLUE_NO_HOST},
+   0, 0, CURLUE_OK, CURLUE_OK},
   {"https://user:secret@host/",
    "user=NULL,password=NULL,",
    "https://host/",
-   0, 0, CURLUE_NO_HOST},
+   0, 0, CURLUE_OK, CURLUE_OK},
   {NULL,
    "scheme=https,user=   @:,host=foobar,",
    "https://%20%20%20%40%3a@foobar/",
-   0, CURLU_URLENCODE, CURLUE_OK},
+   0, CURLU_URLENCODE, CURLUE_OK, CURLUE_OK},
   {NULL,
    "scheme=https,host=  ,path= ,user= ,password= ,query= ,fragment= ,",
    "https://%20:%20@%20%20/%20?+#%20",
-   0, CURLU_URLENCODE, CURLUE_OK},
+   0, CURLU_URLENCODE, CURLUE_OK, CURLUE_OK},
   {NULL,
    "scheme=https,host=foobar,path=/this /path /is /here,",
    "https://foobar/this%20/path%20/is%20/here",
-   0, CURLU_URLENCODE, CURLUE_OK},
+   0, CURLU_URLENCODE, CURLUE_OK, CURLUE_OK},
+  {NULL,
+   "scheme=https,host=foobar,path=\xc3\xa4\xc3\xb6\xc3\xbc,",
+   "https://foobar/%c3%a4%c3%b6%c3%bc",
+   0, CURLU_URLENCODE, CURLUE_OK, CURLUE_OK},
   {"imap://user:secret;opt@host/",
    "options=updated,scheme=imaps,password=p4ssw0rd,",
    "imaps://user:p4ssw0rd;updated@host/",
-   0, 0, CURLUE_NO_HOST},
+   0, 0, CURLUE_NO_HOST, CURLUE_OK},
   {"imap://user:secret;optit@host/",
    "scheme=https,",
    "https://user:secret@host/",
-   0, 0, CURLUE_NO_HOST},
+   0, 0, CURLUE_NO_HOST, CURLUE_OK},
   {"file:///file#anchor",
    "scheme=https,host=example,",
    "https://example/file#anchor",
-   0, 0, CURLUE_NO_HOST},
+   0, 0, CURLUE_NO_HOST, CURLUE_OK},
   {NULL, /* start fresh! */
    "scheme=file,host=127.0.0.1,path=/no,user=anonymous,",
    "file:///no",
-   0, 0, CURLUE_OK},
+   0, 0, CURLUE_OK, CURLUE_OK},
   {NULL, /* start fresh! */
    "scheme=ftp,host=127.0.0.1,path=/no,user=anonymous,",
    "ftp://anonymous@127.0.0.1/no",
-   0, 0, CURLUE_OK},
+   0, 0, CURLUE_OK, CURLUE_OK},
   {NULL, /* start fresh! */
    "scheme=https,host=example.com,",
    "https://example.com/",
-   0, CURLU_NON_SUPPORT_SCHEME, CURLUE_OK},
+   0, CURLU_NON_SUPPORT_SCHEME, CURLUE_OK, CURLUE_OK},
   {"http://user:foo@example.com/path?query#frag",
    "fragment=changed,",
    "http://user:foo@example.com/path?query#changed",
-   0, CURLU_NON_SUPPORT_SCHEME, CURLUE_OK},
+   0, CURLU_NON_SUPPORT_SCHEME, CURLUE_OK, CURLUE_OK},
   {"http://example.com/",
    "scheme=foo,", /* not accepted */
    "http://example.com/",
-   0, 0, CURLUE_OK},
+   0, 0, CURLUE_OK, CURLUE_UNSUPPORTED_SCHEME},
   {"http://example.com/",
    "scheme=https,path=/hello,fragment=snippet,",
    "https://example.com/hello#snippet",
-   0, 0, CURLUE_OK},
+   0, 0, CURLUE_OK, CURLUE_OK},
   {"http://example.com:80",
    "user=foo,port=1922,",
    "http://foo@example.com:1922/",
-   0, 0, CURLUE_OK},
+   0, 0, CURLUE_OK, CURLUE_OK},
   {"http://example.com:80",
    "user=foo,password=bar,",
    "http://foo:bar@example.com:80/",
-   0, 0, CURLUE_OK},
+   0, 0, CURLUE_OK, CURLUE_OK},
   {"http://example.com:80",
    "user=foo,",
    "http://foo@example.com:80/",
-   0, 0, CURLUE_OK},
+   0, 0, CURLUE_OK, CURLUE_OK},
   {"http://example.com",
    "host=www.example.com,",
    "http://www.example.com/",
-   0, 0, CURLUE_OK},
+   0, 0, CURLUE_OK, CURLUE_OK},
   {"http://example.com:80",
    "scheme=ftp,",
    "ftp://example.com:80/",
-   0, 0, CURLUE_OK},
-  {NULL, NULL, NULL, 0, 0, 0}
+   0, 0, CURLUE_OK, CURLUE_OK},
+  {"custom-scheme://host",
+   "host=\"\",",
+   "custom-scheme://host/",
+   CURLU_NON_SUPPORT_SCHEME, CURLU_NON_SUPPORT_SCHEME, CURLUE_OK,
+   CURLUE_MALFORMED_INPUT},
+  {"custom-scheme://host",
+   "host=\"\",",
+   "custom-scheme:///",
+   CURLU_NON_SUPPORT_SCHEME, CURLU_NON_SUPPORT_SCHEME | CURLU_NO_AUTHORITY,
+   CURLUE_OK, CURLUE_OK},
+
+  {NULL, NULL, NULL, 0, 0, 0, 0}
 };
 
 static CURLUPart part2id(char *part)
@@ -477,12 +619,15 @@ static CURLUPart part2id(char *part)
     return CURLUPART_QUERY;
   if(!strcmp("fragment", part))
     return CURLUPART_FRAGMENT;
+  if(!strcmp("zoneid", part))
+    return CURLUPART_ZONEID;
   return 9999; /* bad input => bad output */
 }
 
-static void updateurl(CURLU *u, const char *cmd, unsigned int setflags)
+static CURLUcode updateurl(CURLU *u, const char *cmd, unsigned int setflags)
 {
   const char *p = cmd;
+  CURLUcode uc;
 
   /* make sure the last command ends with a comma too! */
   while(p) {
@@ -500,17 +645,24 @@ static void updateurl(CURLU *u, const char *cmd, unsigned int setflags)
         /* for debugging this */
         fprintf(stderr, "%s = %s [%d]\n", part, value, (int)what);
 #endif
+        if(what > CURLUPART_ZONEID)
+          fprintf(stderr, "UNKNOWN part '%s'\n", part);
+
         if(!strcmp("NULL", value))
-          curl_url_set(u, what, NULL, setflags);
+          uc = curl_url_set(u, what, NULL, setflags);
+        else if(!strcmp("\"\"", value))
+          uc = curl_url_set(u, what, "", setflags);
         else
-          curl_url_set(u, what, value, setflags);
+          uc = curl_url_set(u, what, value, setflags);
+        if(uc)
+          return uc;
       }
       p = e + 1;
       continue;
     }
     break;
   }
-
+  return CURLUE_OK;
 }
 
 static struct redircase set_url_list[] = {
@@ -540,13 +692,11 @@ static struct redircase set_url_list[] = {
 static int set_url(void)
 {
   int i;
-  CURLUcode rc;
-  CURLU *urlp;
   int error = 0;
 
   for(i = 0; set_url_list[i].in && !error; i++) {
-    char *url = NULL;
-    urlp = curl_url();
+    CURLUcode rc;
+    CURLU *urlp = curl_url();
     if(!urlp)
       break;
     rc = curl_url_set(urlp, CURLUPART_URL, set_url_list[i].in,
@@ -561,6 +711,7 @@ static int set_url(void)
         error++;
       }
       else {
+        char *url = NULL;
         rc = curl_url_get(urlp, CURLUPART_URL, &url, 0);
         if(rc) {
           fprintf(stderr, "%s:%d Get URL returned %d\n",
@@ -572,8 +723,8 @@ static int set_url(void)
             error++;
           }
         }
+        curl_free(url);
       }
-      curl_free(url);
     }
     else if(rc != set_url_list[i].ucode) {
       fprintf(stderr, "Set URL\nin: %s\nreturned %d (expected %d)\n",
@@ -588,11 +739,10 @@ static int set_url(void)
 static int set_parts(void)
 {
   int i;
-  CURLUcode rc;
   int error = 0;
 
   for(i = 0; set_parts_list[i].set && !error; i++) {
-    char *url = NULL;
+    CURLUcode rc;
     CURLU *urlp = curl_url();
     if(!urlp) {
       error++;
@@ -604,7 +754,16 @@ static int set_parts(void)
     else
       rc = CURLUE_OK;
     if(!rc) {
-      updateurl(urlp, set_parts_list[i].set, set_parts_list[i].setflags);
+      char *url = NULL;
+      CURLUcode uc = updateurl(urlp, set_parts_list[i].set,
+                               set_parts_list[i].setflags);
+
+      if(uc != set_parts_list[i].pcode) {
+        fprintf(stderr, "updateurl\nin: %s\nreturned %d (expected %d)\n",
+                set_parts_list[i].set, (int)uc, set_parts_list[i].pcode);
+        error++;
+      }
+
       rc = curl_url_get(urlp, CURLUPART_URL, &url, 0);
 
       if(rc) {
@@ -615,13 +774,13 @@ static int set_parts(void)
       else if(checkurl(url, set_parts_list[i].out)) {
         error++;
       }
+      curl_free(url);
     }
     else if(rc != set_parts_list[i].ucode) {
       fprintf(stderr, "Set parts\nin: %s\nreturned %d (expected %d)\n",
               set_parts_list[i].in, (int)rc, set_parts_list[i].ucode);
       error++;
     }
-    curl_free(url);
     curl_url_cleanup(urlp);
   }
   return error;
@@ -630,10 +789,9 @@ static int set_parts(void)
 static int get_url(void)
 {
   int i;
-  CURLUcode rc;
   int error = 0;
   for(i = 0; get_url_list[i].in && !error; i++) {
-    char *url = NULL;
+    CURLUcode rc;
     CURLU *urlp = curl_url();
     if(!urlp) {
       error++;
@@ -642,6 +800,7 @@ static int get_url(void)
     rc = curl_url_set(urlp, CURLUPART_URL, get_url_list[i].in,
                       get_url_list[i].urlflags);
     if(!rc) {
+      char *url = NULL;
       rc = curl_url_get(urlp, CURLUPART_URL, &url, get_url_list[i].getflags);
 
       if(rc) {
@@ -654,13 +813,13 @@ static int get_url(void)
           error++;
         }
       }
+      curl_free(url);
     }
     else if(rc != get_url_list[i].ucode) {
       fprintf(stderr, "Get URL\nin: %s\nreturned %d (expected %d)\n",
               get_url_list[i].in, (int)rc, get_url_list[i].ucode);
       error++;
     }
-    curl_free(url);
     curl_url_cleanup(urlp);
   }
   return error;
@@ -669,11 +828,10 @@ static int get_url(void)
 static int get_parts(void)
 {
   int i;
-  CURLUcode rc;
-  CURLU *urlp;
   int error = 0;
   for(i = 0; get_parts_list[i].in && !error; i++) {
-    urlp = curl_url();
+    CURLUcode rc;
+    CURLU *urlp = curl_url();
     if(!urlp) {
       error++;
       break;
@@ -700,7 +858,7 @@ static int get_parts(void)
 static struct querycase append_list[] = {
   {"HTTP://test/?s", "name=joe\x02", "http://test/?s&name=joe%02",
    0, CURLU_URLENCODE, CURLUE_OK},
-  {"HTTP://test/?size=2#f", "name=joe=", "http://test/?size=2&name=joe=#f",
+  {"HTTP://test/?size=2#f", "name=joe=", "http://test/?size=2&name=joe%3d#f",
    0, CURLU_URLENCODE, CURLUE_OK},
   {"HTTP://test/?size=2#f", "name=joe doe",
    "http://test/?size=2&name=joe+doe#f",
@@ -718,11 +876,10 @@ static struct querycase append_list[] = {
 static int append(void)
 {
   int i;
-  CURLUcode rc;
-  CURLU *urlp;
   int error = 0;
   for(i = 0; append_list[i].in && !error; i++) {
-    urlp = curl_url();
+    CURLUcode rc;
+    CURLU *urlp = curl_url();
     if(!urlp) {
       error++;
       break;
@@ -766,10 +923,139 @@ static int append(void)
   return error;
 }
 
+static int scopeid(void)
+{
+  CURLU *u = curl_url();
+  int error = 0;
+  CURLUcode rc;
+  char *url;
+
+  rc = curl_url_set(u, CURLUPART_URL,
+                    "https://[fe80::20c:29ff:fe9c:409b%25eth0]/hello.html", 0);
+  if(rc != CURLUE_OK) {
+    fprintf(stderr, "%s:%d curl_url_set returned %d\n",
+            __FILE__, __LINE__, (int)rc);
+    error++;
+  }
+
+  rc = curl_url_get(u, CURLUPART_HOST, &url, 0);
+  if(rc != CURLUE_OK) {
+    fprintf(stderr, "%s:%d curl_url_get CURLUPART_HOST returned %d\n",
+            __FILE__, __LINE__, (int)rc);
+    error++;
+  }
+  else {
+    printf("we got %s\n", url);
+    curl_free(url);
+  }
+
+  rc = curl_url_set(u, CURLUPART_HOST, "[::1]", 0);
+  if(rc != CURLUE_OK) {
+    fprintf(stderr, "%s:%d curl_url_set CURLUPART_HOST returned %d\n",
+            __FILE__, __LINE__, (int)rc);
+    error++;
+  }
+
+  rc = curl_url_get(u, CURLUPART_URL, &url, 0);
+  if(rc != CURLUE_OK) {
+    fprintf(stderr, "%s:%d curl_url_get CURLUPART_URL returned %d\n",
+            __FILE__, __LINE__, (int)rc);
+    error++;
+  }
+  else {
+    printf("we got %s\n", url);
+    curl_free(url);
+  }
+
+  rc = curl_url_set(u, CURLUPART_HOST, "example.com", 0);
+  if(rc != CURLUE_OK) {
+    fprintf(stderr, "%s:%d curl_url_set CURLUPART_HOST returned %d\n",
+            __FILE__, __LINE__, (int)rc);
+    error++;
+  }
+
+  rc = curl_url_get(u, CURLUPART_URL, &url, 0);
+  if(rc != CURLUE_OK) {
+    fprintf(stderr, "%s:%d curl_url_get CURLUPART_URL returned %d\n",
+            __FILE__, __LINE__, (int)rc);
+    error++;
+  }
+  else {
+    printf("we got %s\n", url);
+    curl_free(url);
+  }
+
+  rc = curl_url_set(u, CURLUPART_HOST,
+                    "[fe80::20c:29ff:fe9c:409b%25eth0]", 0);
+  if(rc != CURLUE_OK) {
+    fprintf(stderr, "%s:%d curl_url_set CURLUPART_HOST returned %d\n",
+            __FILE__, __LINE__, (int)rc);
+    error++;
+  }
+
+  rc = curl_url_get(u, CURLUPART_URL, &url, 0);
+  if(rc != CURLUE_OK) {
+    fprintf(stderr, "%s:%d curl_url_get CURLUPART_URL returned %d\n",
+            __FILE__, __LINE__, (int)rc);
+    error++;
+  }
+  else {
+    printf("we got %s\n", url);
+    curl_free(url);
+  }
+
+  rc = curl_url_get(u, CURLUPART_HOST, &url, 0);
+  if(rc != CURLUE_OK) {
+    fprintf(stderr, "%s:%d curl_url_get CURLUPART_HOST returned %d\n",
+            __FILE__, __LINE__, (int)rc);
+    error++;
+  }
+  else {
+    printf("we got %s\n", url);
+    curl_free(url);
+  }
+
+  rc = curl_url_get(u, CURLUPART_ZONEID, &url, 0);
+  if(rc != CURLUE_OK) {
+    fprintf(stderr, "%s:%d curl_url_get CURLUPART_ZONEID returned %d\n",
+            __FILE__, __LINE__, (int)rc);
+    error++;
+  }
+  else {
+    printf("we got %s\n", url);
+    curl_free(url);
+  }
+
+  rc = curl_url_set(u, CURLUPART_ZONEID, "clown", 0);
+  if(rc != CURLUE_OK) {
+    fprintf(stderr, "%s:%d curl_url_set CURLUPART_ZONEID returned %d\n",
+            __FILE__, __LINE__, (int)rc);
+    error++;
+  }
+
+  rc = curl_url_get(u, CURLUPART_URL, &url, 0);
+  if(rc != CURLUE_OK) {
+    fprintf(stderr, "%s:%d curl_url_get CURLUPART_URL returned %d\n",
+            __FILE__, __LINE__, (int)rc);
+    error++;
+  }
+  else {
+    printf("we got %s\n", url);
+    curl_free(url);
+  }
+
+  curl_url_cleanup(u);
+
+  return error;
+}
+
 int test(char *URL)
 {
   (void)URL; /* not used */
 
+  if(scopeid())
+    return 6;
+
   if(append())
     return 5;
 
diff --git a/tests/libtest/lib1564.c b/tests/libtest/lib1564.c
new file mode 100644 (file)
index 0000000..225c8c6
--- /dev/null
@@ -0,0 +1,142 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+#include "test.h"
+
+#include "testutil.h"
+#include "warnless.h"
+#include "memdebug.h"
+
+#define TEST_HANG_TIMEOUT 60 * 1000
+#define WAKEUP_NUM 1234567
+
+int test(char *URL)
+{
+  CURLM *multi = NULL;
+  int numfds;
+  int i;
+  int res = 0;
+  struct timeval time_before_wait, time_after_wait;
+
+  (void)URL;
+
+  start_test_timing();
+
+  global_init(CURL_GLOBAL_ALL);
+
+  multi_init(multi);
+
+  /* no wakeup */
+
+  time_before_wait = tutil_tvnow();
+  multi_poll(multi, NULL, 0, 1000, &numfds);
+  time_after_wait = tutil_tvnow();
+
+  if(tutil_tvdiff(time_after_wait, time_before_wait) < 500) {
+    fprintf(stderr, "%s:%d curl_multi_poll returned too early\n",
+            __FILE__, __LINE__);
+    res = TEST_ERR_MAJOR_BAD;
+    goto test_cleanup;
+  }
+
+  abort_on_test_timeout();
+
+  /* try a single wakeup */
+
+  multi_wakeup(multi);
+
+  time_before_wait = tutil_tvnow();
+  multi_poll(multi, NULL, 0, 1000, &numfds);
+  time_after_wait = tutil_tvnow();
+
+  if(tutil_tvdiff(time_after_wait, time_before_wait) > 500) {
+    fprintf(stderr, "%s:%d curl_multi_poll returned too late\n",
+            __FILE__, __LINE__);
+    res = TEST_ERR_MAJOR_BAD;
+    goto test_cleanup;
+  }
+
+  abort_on_test_timeout();
+
+  /* previous wakeup should not wake up this */
+
+  time_before_wait = tutil_tvnow();
+  multi_poll(multi, NULL, 0, 1000, &numfds);
+  time_after_wait = tutil_tvnow();
+
+  if(tutil_tvdiff(time_after_wait, time_before_wait) < 500) {
+    fprintf(stderr, "%s:%d curl_multi_poll returned too early\n",
+            __FILE__, __LINE__);
+    res = TEST_ERR_MAJOR_BAD;
+    goto test_cleanup;
+  }
+
+  abort_on_test_timeout();
+
+  /* try lots of wakeup */
+
+  for(i = 0; i < WAKEUP_NUM; ++i)
+    multi_wakeup(multi);
+
+  time_before_wait = tutil_tvnow();
+  multi_poll(multi, NULL, 0, 1000, &numfds);
+  time_after_wait = tutil_tvnow();
+
+  if(tutil_tvdiff(time_after_wait, time_before_wait) > 500) {
+    fprintf(stderr, "%s:%d curl_multi_poll returned too late\n",
+            __FILE__, __LINE__);
+    res = TEST_ERR_MAJOR_BAD;
+    goto test_cleanup;
+  }
+
+  abort_on_test_timeout();
+
+#if !defined(WIN32) && !defined(_WIN32) && !defined(__WIN32__) \
+    && !defined(__CYGWIN__)
+  /* Even lots of previous wakeups should not wake up this.
+
+     On Windows (particularly when using MinGW), the socketpair
+     used for curl_multi_wakeup() is really asynchronous,
+     meaning when it's called a lot, it can take some time
+     before all of the data can be read. Sometimes it can wake
+     up more than one curl_multi_poll() call. */
+
+  time_before_wait = tutil_tvnow();
+  multi_poll(multi, NULL, 0, 1000, &numfds);
+  time_after_wait = tutil_tvnow();
+
+  if(tutil_tvdiff(time_after_wait, time_before_wait) < 500) {
+    fprintf(stderr, "%s:%d curl_multi_poll returned too early\n",
+            __FILE__, __LINE__);
+    res = TEST_ERR_MAJOR_BAD;
+    goto test_cleanup;
+  }
+
+  abort_on_test_timeout();
+#endif
+
+test_cleanup:
+
+  curl_multi_cleanup(multi);
+  curl_global_cleanup();
+
+  return res;
+}
diff --git a/tests/libtest/lib1565.c b/tests/libtest/lib1565.c
new file mode 100644 (file)
index 0000000..b2fa40a
--- /dev/null
@@ -0,0 +1,204 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+#include "test.h"
+
+#include "testutil.h"
+#include "warnless.h"
+#include "memdebug.h"
+
+#ifdef HAVE_PTHREAD_H
+#include <pthread.h>
+#include <unistd.h>
+
+#define TEST_HANG_TIMEOUT 60 * 1000
+#define CONN_NUM 3
+#define TIME_BETWEEN_START_SECS 2
+
+static pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
+static CURL *pending_handles[CONN_NUM];
+static int pending_num = 0;
+static int test_failure = 0;
+
+static CURLM *multi = NULL;
+static const char *url;
+
+static void *run_thread(void *ptr)
+{
+  CURL *easy = NULL;
+  int res = 0;
+  int i;
+
+  (void)ptr;
+
+  for(i = 0; i < CONN_NUM; i++) {
+    sleep(TIME_BETWEEN_START_SECS);
+
+    easy_init(easy);
+
+    easy_setopt(easy, CURLOPT_URL, url);
+    easy_setopt(easy, CURLOPT_VERBOSE, 0L);
+
+    pthread_mutex_lock(&lock);
+
+    if(test_failure) {
+      pthread_mutex_unlock(&lock);
+      goto test_cleanup;
+    }
+
+    pending_handles[pending_num] = easy;
+    pending_num++;
+    easy = NULL;
+
+    pthread_mutex_unlock(&lock);
+
+    multi_wakeup(multi);
+  }
+
+test_cleanup:
+
+  curl_easy_cleanup(easy);
+
+  pthread_mutex_lock(&lock);
+
+  if(!test_failure)
+    test_failure = res;
+
+  pthread_mutex_unlock(&lock);
+
+  return NULL;
+}
+
+int test(char *URL)
+{
+  int still_running;
+  int num;
+  int i;
+  int res = 0;
+  CURL *started_handles[CONN_NUM];
+  int started_num = 0;
+  int finished_num = 0;
+  pthread_t tid = 0;
+  struct CURLMsg *message;
+
+  start_test_timing();
+
+  global_init(CURL_GLOBAL_ALL);
+
+  multi_init(multi);
+
+  url = URL;
+
+  res = pthread_create(&tid, NULL, run_thread, NULL);
+  if(0 != res) {
+    fprintf(stderr, "%s:%d Couldn't create thread, errno %d\n",
+            __FILE__, __LINE__, res);
+    goto test_cleanup;
+  }
+
+  while(1) {
+    multi_perform(multi, &still_running);
+
+    abort_on_test_timeout();
+
+    while((message = curl_multi_info_read(multi, &num)) != NULL) {
+      if(message->msg == CURLMSG_DONE) {
+        res = message->data.result;
+        if(res)
+          goto test_cleanup;
+        multi_remove_handle(multi, message->easy_handle);
+        finished_num++;
+      }
+      else {
+        fprintf(stderr, "%s:%d Got an unexpected message from curl: %i\n",
+              __FILE__, __LINE__, (int)message->msg);
+        res = TEST_ERR_MAJOR_BAD;
+        goto test_cleanup;
+      }
+
+      abort_on_test_timeout();
+    }
+
+    if(CONN_NUM == finished_num)
+      break;
+
+    multi_poll(multi, NULL, 0, TEST_HANG_TIMEOUT, &num);
+
+    abort_on_test_timeout();
+
+    pthread_mutex_lock(&lock);
+
+    while(pending_num > 0) {
+      res_multi_add_handle(multi, pending_handles[pending_num - 1]);
+      if(res) {
+        pthread_mutex_unlock(&lock);
+        goto test_cleanup;
+      }
+
+      started_handles[started_num] = pending_handles[pending_num - 1];
+      started_num++;
+      pending_num--;
+    }
+
+    pthread_mutex_unlock(&lock);
+
+    abort_on_test_timeout();
+  }
+
+  if(CONN_NUM != started_num) {
+    fprintf(stderr, "%s:%d Not all connections started: %d of %d\n",
+            __FILE__, __LINE__, started_num, CONN_NUM);
+    goto test_cleanup;
+  }
+
+  if(CONN_NUM != finished_num) {
+    fprintf(stderr, "%s:%d Not all connections finished: %d of %d\n",
+            __FILE__, __LINE__, started_num, CONN_NUM);
+    goto test_cleanup;
+  }
+
+test_cleanup:
+
+  pthread_mutex_lock(&lock);
+  if(!test_failure)
+    test_failure = res;
+  pthread_mutex_unlock(&lock);
+
+  if(0 != tid)
+    pthread_join(tid, NULL);
+
+  curl_multi_cleanup(multi);
+  for(i = 0; i < pending_num; i++)
+    curl_easy_cleanup(pending_handles[i]);
+  for(i = 0; i < started_num; i++)
+    curl_easy_cleanup(started_handles[i]);
+  curl_global_cleanup();
+
+  return test_failure;
+}
+
+#else /* without pthread, this test doesn't work */
+int test(char *URL)
+{
+  (void)URL;
+  return 0;
+}
+#endif
diff --git a/tests/libtest/lib1591.c b/tests/libtest/lib1591.c
new file mode 100644 (file)
index 0000000..cc1c5b2
--- /dev/null
@@ -0,0 +1,118 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+
+/*
+ * This unit test PUT http data over proxy. Proxy header will be different
+ * from server http header
+ */
+
+#include "test.h"
+#include <stdio.h>
+#include "memdebug.h"
+
+static char data [] = "Hello Cloud!\r\n";
+static size_t consumed = 0;
+
+static size_t read_callback(void *ptr, size_t size, size_t nmemb, void *stream)
+{
+  size_t  amount = nmemb * size; /* Total bytes curl wants */
+
+  if(consumed == strlen(data)) {
+    return 0;
+  }
+
+  if(amount > strlen(data)-consumed) {
+    amount = strlen(data);
+  }
+
+  consumed += amount;
+  (void)stream;
+  memcpy(ptr, data, amount);
+  return amount;
+}
+
+/*
+ * carefully not leak memory on OOM
+ */
+static int trailers_callback(struct curl_slist **list, void *userdata)
+{
+  struct curl_slist *nlist = NULL;
+  struct curl_slist *nlist2 = NULL;
+  (void)userdata;
+  nlist = curl_slist_append(*list, "my-super-awesome-trailer: trail1");
+  if(nlist)
+    nlist2 = curl_slist_append(nlist, "my-other-awesome-trailer: trail2");
+  if(nlist2) {
+    *list = nlist2;
+    return CURL_TRAILERFUNC_OK;
+  }
+  else {
+    curl_slist_free_all(nlist);
+    return CURL_TRAILERFUNC_ABORT;
+  }
+}
+
+int test(char *URL)
+{
+  CURL *curl = NULL;
+  CURLcode res = CURLE_FAILED_INIT;
+  /* http and proxy header list*/
+  struct curl_slist *hhl = NULL;
+
+  if(curl_global_init(CURL_GLOBAL_ALL) != CURLE_OK) {
+    fprintf(stderr, "curl_global_init() failed\n");
+    return TEST_ERR_MAJOR_BAD;
+  }
+
+
+  curl = curl_easy_init();
+  if(!curl) {
+    fprintf(stderr, "curl_easy_init() failed\n");
+    curl_global_cleanup();
+    return TEST_ERR_MAJOR_BAD;
+  }
+
+  hhl = curl_slist_append(hhl, "Trailer: my-super-awesome-trailer,"
+                               " my-other-awesome-trailer");
+  if(!hhl) {
+    goto test_cleanup;
+  }
+
+  test_setopt(curl, CURLOPT_URL, URL);
+  test_setopt(curl, CURLOPT_HTTPHEADER, hhl);
+  test_setopt(curl, CURLOPT_PUT, 1L);
+  test_setopt(curl, CURLOPT_READFUNCTION, read_callback);
+  test_setopt(curl, CURLOPT_TRAILERFUNCTION, trailers_callback);
+  test_setopt(curl, CURLOPT_TRAILERDATA, NULL);
+
+  res = curl_easy_perform(curl);
+
+test_cleanup:
+
+  curl_easy_cleanup(curl);
+
+  curl_slist_free_all(hhl);
+
+  curl_global_cleanup();
+
+  return (int)res;
+}
diff --git a/tests/libtest/lib1592.c b/tests/libtest/lib1592.c
new file mode 100644 (file)
index 0000000..5e6bf04
--- /dev/null
@@ -0,0 +1,119 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+/*
+ * See https://github.com/curl/curl/issues/3371
+ *
+ * This test case checks whether curl_multi_remove_handle() cancels
+ * asynchronous DNS resolvers without blocking where possible.  Obviously, it
+ * only tests whichever resolver cURL is actually built with.
+ */
+
+/* We're willing to wait a very generous two seconds for the removal.  This is
+   as low as we can go while still easily supporting SIGALRM timing for the
+   non-threaded blocking resolver.  It doesn't matter that much because when
+   the test passes, we never wait this long. */
+#define TEST_HANG_TIMEOUT 2 * 1000
+
+#include "test.h"
+#include "testutil.h"
+
+#include <sys/stat.h>
+
+int test(char *URL)
+{
+  int stillRunning;
+  CURLM *multiHandle = NULL;
+  CURL *curl = NULL;
+  CURLMcode res = CURLM_OK;
+  int timeout;
+
+  global_init(CURL_GLOBAL_ALL);
+
+  multi_init(multiHandle);
+
+  easy_init(curl);
+
+  easy_setopt(curl, CURLOPT_VERBOSE, 1L);
+  easy_setopt(curl, CURLOPT_URL, URL);
+
+  /* Set a DNS server that hopefully will not respond when using c-ares. */
+  if(curl_easy_setopt(curl, CURLOPT_DNS_SERVERS, "0.0.0.0") == CURLE_OK)
+    /* Since we could set the DNS server, presume we are working with a
+       resolver that can be cancelled (i.e. c-ares).  Thus,
+       curl_multi_remove_handle() should not block even when the resolver
+       request is outstanding.  So, set a request timeout _longer_ than the
+       test hang timeout so we will fail if the handle removal call incorrectly
+       blocks. */
+    timeout = TEST_HANG_TIMEOUT * 2;
+  else {
+    /* If we can't set the DNS server, presume that we are configured to use a
+       resolver that can't be cancelled (i.e. the threaded resolver or the
+       non-threaded blocking resolver).  So, we just test that the
+       curl_multi_remove_handle() call does finish well within our test
+       timeout.
+
+       But, it is very unlikely that the resolver request will take any time at
+       all because we haven't been able to configure the resolver to use an
+       non-responsive DNS server.  At least we exercise the flow.
+       */
+    fprintf(stderr,
+            "CURLOPT_DNS_SERVERS not supported; "
+            "assuming curl_multi_remove_handle() will block\n");
+    timeout = TEST_HANG_TIMEOUT / 2;
+  }
+
+  /* Setting a timeout on the request should ensure that even if we have to
+     wait for the resolver during curl_multi_remove_handle(), it won't take
+     longer than this, because the resolver request inherits its timeout from
+     this. */
+  easy_setopt(curl, CURLOPT_TIMEOUT_MS, timeout);
+
+  multi_add_handle(multiHandle, curl);
+
+  /* This should move the handle from INIT => CONNECT => WAITRESOLVE. */
+  fprintf(stderr, "curl_multi_perform()...\n");
+  multi_perform(multiHandle, &stillRunning);
+  fprintf(stderr, "curl_multi_perform() succeeded\n");
+
+  /* Start measuring how long it takes to remove the handle. */
+  fprintf(stderr, "curl_multi_remove_handle()...\n");
+  start_test_timing();
+  res = curl_multi_remove_handle(multiHandle, curl);
+  if(res) {
+    fprintf(stderr, "curl_multi_remove_handle() failed, "
+            "with code %d\n", (int)res);
+    goto test_cleanup;
+  }
+  fprintf(stderr, "curl_multi_remove_handle() succeeded\n");
+
+  /* Fail the test if it took too long to remove.  This happens after the fact,
+     and says "it seems that it would have run forever", which isn't true, but
+     it's close enough, and simple to do. */
+  abort_on_test_timeout();
+
+test_cleanup:
+  curl_easy_cleanup(curl);
+  curl_multi_cleanup(multiHandle);
+  curl_global_cleanup();
+
+  return (int)res;
+}
diff --git a/tests/libtest/lib1593.c b/tests/libtest/lib1593.c
new file mode 100644 (file)
index 0000000..5408c72
--- /dev/null
@@ -0,0 +1,79 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+
+/* Test suppressing the If-Modified-Since header */
+
+#include "test.h"
+
+#include "memdebug.h"
+
+int test(char *URL)
+{
+  struct curl_slist *header = NULL;
+  long unmet;
+  CURL *curl = NULL;
+  int res = 0;
+
+  global_init(CURL_GLOBAL_ALL);
+
+  easy_init(curl);
+
+  easy_setopt(curl, CURLOPT_URL, URL);
+  easy_setopt(curl, CURLOPT_TIMECONDITION, (long)CURL_TIMECOND_IFMODSINCE);
+  /* Some TIMEVALUE; it doesn't matter. */
+  easy_setopt(curl, CURLOPT_TIMEVALUE, 1566210680L);
+
+  header = curl_slist_append(NULL, "If-Modified-Since:");
+  if(!header) {
+    res = TEST_ERR_MAJOR_BAD;
+    goto test_cleanup;
+  }
+
+  easy_setopt(curl, CURLOPT_HTTPHEADER, header);
+
+  res = curl_easy_perform(curl);
+  if(res)
+    goto test_cleanup;
+
+  /* Confirm that the condition checking still worked, even though we
+   * suppressed the actual header.
+   * The server returns 304, which means the condition is "unmet".
+   */
+
+  res = curl_easy_getinfo(curl, CURLINFO_CONDITION_UNMET, &unmet);
+  if(res)
+    goto test_cleanup;
+
+  if(unmet != 1L) {
+    res = TEST_ERR_FAILURE;
+    goto test_cleanup;
+  }
+
+test_cleanup:
+
+  /* always cleanup */
+  curl_easy_cleanup(curl);
+  curl_slist_free_all(header);
+  curl_global_cleanup();
+
+  return res;
+}
diff --git a/tests/libtest/lib1594.c b/tests/libtest/lib1594.c
new file mode 100644 (file)
index 0000000..a769715
--- /dev/null
@@ -0,0 +1,66 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+
+/* Testing Retry-After header parser */
+
+#include "test.h"
+
+#include "memdebug.h"
+
+int test(char *URL)
+{
+  struct curl_slist *header = NULL;
+  curl_off_t retry;
+  CURL *curl = NULL;
+  int res = 0;
+
+  global_init(CURL_GLOBAL_ALL);
+
+  easy_init(curl);
+
+  easy_setopt(curl, CURLOPT_URL, URL);
+
+  res = curl_easy_perform(curl);
+  if(res)
+    goto test_cleanup;
+
+  res = curl_easy_getinfo(curl, CURLINFO_RETRY_AFTER, &retry);
+  if(res)
+    goto test_cleanup;
+
+#ifdef LIB1596
+  /* we get a relative number of seconds, so add the number of seconds
+     we're at to make it a somewhat stable number. Then remove accuracy. */
+  retry += time(NULL);
+  retry /= 10000;
+#endif
+  printf("Retry-After: %" CURL_FORMAT_CURL_OFF_T "\n", retry);
+
+test_cleanup:
+
+  /* always cleanup */
+  curl_easy_cleanup(curl);
+  curl_slist_free_all(header);
+  curl_global_cleanup();
+
+  return res;
+}
index cf55fb3..2a70f8e 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 2013 - 2017, Linus Nielsen Feltzing, <linus@haxx.se>
+ * Copyright (C) 2013 - 2019, Linus Nielsen Feltzing, <linus@haxx.se>
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -113,7 +113,7 @@ static void setup_handle(char *base_url, CURLM *m, int handlenum)
 {
   char urlbuf[256];
 
-  snprintf(urlbuf, sizeof(urlbuf), "%s%s", base_url, urlstring[handlenum]);
+  msnprintf(urlbuf, sizeof(urlbuf), "%s%s", base_url, urlstring[handlenum]);
   curl_easy_setopt(handles[handlenum], CURLOPT_URL, urlbuf);
   curl_easy_setopt(handles[handlenum], CURLOPT_VERBOSE, 1L);
   curl_easy_setopt(handles[handlenum], CURLOPT_FAILONERROR, 1L);
@@ -138,7 +138,7 @@ int test(char *URL)
   CURLM *m = NULL;
   CURLMsg *msg; /* for picking up messages with the transfer status */
   int msgs_left; /* how many messages are left */
-  int running;
+  int running = 0;
   int handlenum = 0;
   struct timeval last_handle_add;
 
diff --git a/tests/libtest/lib1905.c b/tests/libtest/lib1905.c
new file mode 100644 (file)
index 0000000..7556d45
--- /dev/null
@@ -0,0 +1,93 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+#include "test.h"
+
+#include "testutil.h"
+#include "warnless.h"
+#include "memdebug.h"
+
+int test(char *URL)
+{
+  CURLSH *sh = NULL;
+  CURL *ch = NULL;
+  int unfinished;
+
+  CURLM *cm = curl_multi_init();
+  if(!cm)
+    return 1;
+  sh = curl_share_init();
+  if(!sh)
+    goto cleanup;
+
+  curl_share_setopt(sh, CURLSHOPT_SHARE, CURL_LOCK_DATA_COOKIE);
+  curl_share_setopt(sh, CURLSHOPT_SHARE, CURL_LOCK_DATA_COOKIE);
+
+  ch = curl_easy_init();
+  if(!ch)
+    goto cleanup;
+
+  curl_easy_setopt(ch, CURLOPT_SHARE, sh);
+  curl_easy_setopt(ch, CURLOPT_URL, URL);
+  curl_easy_setopt(ch, CURLOPT_COOKIEFILE, "log/cookies1905");
+  curl_easy_setopt(ch, CURLOPT_COOKIEJAR, "log/cookies1905");
+
+  curl_multi_add_handle(cm, ch);
+
+  unfinished = 1;
+  while(unfinished) {
+    int MAX = 0;
+    long max_tout;
+    fd_set R, W, E;
+    struct timeval timeout;
+
+    FD_ZERO(&R);
+    FD_ZERO(&W);
+    FD_ZERO(&E);
+    curl_multi_perform(cm, &unfinished);
+
+    curl_multi_fdset(cm, &R, &W, &E, &MAX);
+    curl_multi_timeout(cm, &max_tout);
+
+    if(max_tout > 0) {
+      timeout.tv_sec = max_tout / 1000;
+      timeout.tv_usec = (max_tout % 1000) * 1000;
+    }
+    else {
+      timeout.tv_sec = 0;
+      timeout.tv_usec = 1000;
+    }
+
+    select(MAX + 1, &R, &W, &E, &timeout);
+  }
+
+  curl_easy_setopt(ch, CURLOPT_COOKIELIST, "FLUSH");
+  curl_easy_setopt(ch, CURLOPT_SHARE, NULL);
+
+  curl_multi_remove_handle(cm, ch);
+  cleanup:
+  curl_easy_cleanup(ch);
+  curl_share_cleanup(sh);
+  curl_multi_cleanup(cm);
+  curl_global_cleanup();
+
+  return 0;
+}
diff --git a/tests/libtest/lib1906.c b/tests/libtest/lib1906.c
new file mode 100644 (file)
index 0000000..6c7a4bf
--- /dev/null
@@ -0,0 +1,72 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+#include "test.h"
+
+#include "testutil.h"
+#include "warnless.h"
+#include "memdebug.h"
+
+int test(char *URL)
+{
+  char *url_after;
+  CURLU *curlu = curl_url();
+  CURL *curl = curl_easy_init();
+  CURLcode curl_code;
+  char error_buffer[CURL_ERROR_SIZE] = "";
+
+  curl_url_set(curlu, CURLUPART_URL, URL, CURLU_DEFAULT_SCHEME);
+  curl_easy_setopt(curl, CURLOPT_CURLU, curlu);
+  curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, error_buffer);
+  curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
+  /* set a port number that makes this reqeuest fail */
+  curl_easy_setopt(curl, CURLOPT_PORT, 1L);
+  curl_code = curl_easy_perform(curl);
+  if(!curl_code)
+    fprintf(stderr, "failure expected, "
+            "curl_easy_perform returned %ld: <%s>, <%s>\n",
+            (long) curl_code, curl_easy_strerror(curl_code), error_buffer);
+
+  /* print the used url */
+  curl_url_get(curlu, CURLUPART_URL, &url_after, 0);
+  fprintf(stderr, "curlu now: <%s>\n", url_after);
+  curl_free(url_after);
+
+  /* now reset CURLOP_PORT to go back to originally set port number */
+  curl_easy_setopt(curl, CURLOPT_PORT, 0L);
+
+  curl_code = curl_easy_perform(curl);
+  if(curl_code)
+    fprintf(stderr, "success expected, "
+            "curl_easy_perform returned %ld: <%s>, <%s>\n",
+            (long) curl_code, curl_easy_strerror(curl_code), error_buffer);
+
+  /* print url */
+  curl_url_get(curlu, CURLUPART_URL, &url_after, 0);
+  fprintf(stderr, "curlu now: <%s>\n", url_after);
+  curl_free(url_after);
+
+  curl_easy_cleanup(curl);
+  curl_url_cleanup(curlu);
+  curl_global_cleanup();
+
+  return 0;
+}
diff --git a/tests/libtest/lib1907.c b/tests/libtest/lib1907.c
new file mode 100644 (file)
index 0000000..2d9465a
--- /dev/null
@@ -0,0 +1,54 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+#include "test.h"
+
+#include "testutil.h"
+#include "warnless.h"
+#include "memdebug.h"
+
+int test(char *URL)
+{
+  char *url_after;
+  CURL *curl;
+  CURLcode curl_code;
+  char error_buffer[CURL_ERROR_SIZE] = "";
+
+  curl_global_init(CURL_GLOBAL_DEFAULT);
+  curl = curl_easy_init();
+  curl_easy_setopt(curl, CURLOPT_URL, URL);
+  curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, error_buffer);
+  curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
+  curl_code = curl_easy_perform(curl);
+  if(!curl_code)
+    fprintf(stderr, "failure expected, "
+            "curl_easy_perform returned %ld: <%s>, <%s>\n",
+            (long) curl_code, curl_easy_strerror(curl_code), error_buffer);
+
+  /* print the used url */
+  if(!curl_easy_getinfo(curl, CURLINFO_EFFECTIVE_URL, &url_after))
+    printf("Effective URL: %s\n", url_after);
+
+  curl_easy_cleanup(curl);
+  curl_global_cleanup();
+
+  return 0;
+}
index 9f656e0..e0325ee 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -142,6 +142,7 @@ static void *fire(void *ptr)
   curl_easy_setopt(curl, CURLOPT_VERBOSE,    1L);
   curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
   curl_easy_setopt(curl, CURLOPT_URL,        tdata->url);
+  curl_easy_setopt(curl, CURLOPT_COOKIEFILE, "");
   printf("CURLOPT_SHARE\n");
   curl_easy_setopt(curl, CURLOPT_SHARE, tdata->share);
 
index 59ced35..e8e803f 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -21,6 +21,8 @@
  ***************************************************************************/
 #include "test.h"
 
+#include <string.h>
+
 /*
  * This test uses these funny custom memory callbacks for the only purpose
  * of verifying that curl_global_init_mem() functionality is present in
index 81c5a5f..1a3091f 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -55,10 +55,10 @@ static char msgbuff[256];
 static void store_errmsg(const char *msg, int err)
 {
   if(!err)
-    snprintf(msgbuff, sizeof(msgbuff), "%s", msg);
+    msnprintf(msgbuff, sizeof(msgbuff), "%s", msg);
   else
-    snprintf(msgbuff, sizeof(msgbuff), "%s, errno %d, %s", msg,
-             err, strerror(err));
+    msnprintf(msgbuff, sizeof(msgbuff), "%s, errno %d, %s", msg,
+              err, strerror(err));
 }
 
 static void close_file_descriptors(void)
@@ -132,7 +132,7 @@ static int rlimit(int keep_open)
     strcpy(strbuff, "INFINITY");
   else
 #endif
-    snprintf(strbuff, sizeof(strbuff), fmt, rl.rlim_cur);
+    msnprintf(strbuff, sizeof(strbuff), fmt, rl.rlim_cur);
   fprintf(stderr, "initial soft limit: %s\n", strbuff);
 
 #ifdef RLIM_INFINITY
@@ -140,7 +140,7 @@ static int rlimit(int keep_open)
     strcpy(strbuff, "INFINITY");
   else
 #endif
-    snprintf(strbuff, sizeof(strbuff), fmt, rl.rlim_max);
+    msnprintf(strbuff, sizeof(strbuff), fmt, rl.rlim_max);
   fprintf(stderr, "initial hard limit: %s\n", strbuff);
 
   /* show our constants */
@@ -198,7 +198,7 @@ static int rlimit(int keep_open)
       strcpy(strbuff, "INFINITY");
     else
 #endif
-      snprintf(strbuff, sizeof(strbuff), fmt, rl.rlim_cur);
+      msnprintf(strbuff, sizeof(strbuff), fmt, rl.rlim_cur);
     fprintf(stderr, "current soft limit: %s\n", strbuff);
 
 #ifdef RLIM_INFINITY
@@ -206,7 +206,7 @@ static int rlimit(int keep_open)
       strcpy(strbuff, "INFINITY");
     else
 #endif
-      snprintf(strbuff, sizeof(strbuff), fmt, rl.rlim_max);
+      msnprintf(strbuff, sizeof(strbuff), fmt, rl.rlim_max);
     fprintf(stderr, "current hard limit: %s\n", strbuff);
 
   } /* (rl.rlim_cur != rl.rlim_max) */
@@ -233,10 +233,10 @@ static int rlimit(int keep_open)
      (rl.rlim_cur != RLIM_INFINITY) &&
 #endif
      (rl.rlim_cur <= num_open.rlim_cur)) {
-    snprintf(strbuff2, sizeof(strbuff2), fmt, rl.rlim_cur);
-    snprintf(strbuff1, sizeof(strbuff1), fmt, num_open.rlim_cur);
-    snprintf(strbuff, sizeof(strbuff), "fds needed %s > system limit %s",
-             strbuff1, strbuff2);
+    msnprintf(strbuff2, sizeof(strbuff2), fmt, rl.rlim_cur);
+    msnprintf(strbuff1, sizeof(strbuff1), fmt, num_open.rlim_cur);
+    msnprintf(strbuff, sizeof(strbuff), "fds needed %s > system limit %s",
+              strbuff1, strbuff2);
     store_errmsg(strbuff, 0);
     fprintf(stderr, "%s\n", msgbuff);
     return -4;
@@ -257,7 +257,7 @@ static int rlimit(int keep_open)
     nitems = 0x40000;
   do {
     num_open.rlim_max = sizeof(*memchunk) * (size_t)nitems;
-    snprintf(strbuff, sizeof(strbuff), fmt, num_open.rlim_max);
+    msnprintf(strbuff, sizeof(strbuff), fmt, num_open.rlim_max);
     fprintf(stderr, "allocating memchunk %s byte array\n", strbuff);
     memchunk = malloc(sizeof(*memchunk) * (size_t)nitems);
     if(!memchunk) {
@@ -285,9 +285,9 @@ static int rlimit(int keep_open)
   /* verify that we won't overflow size_t in malloc() */
 
   if((size_t)(num_open.rlim_max) > ((size_t)-1) / sizeof(*fd)) {
-    snprintf(strbuff1, sizeof(strbuff1), fmt, num_open.rlim_max);
-    snprintf(strbuff, sizeof(strbuff), "unable to allocate an array for %s "
-             "file descriptors, would overflow size_t", strbuff1);
+    msnprintf(strbuff1, sizeof(strbuff1), fmt, num_open.rlim_max);
+    msnprintf(strbuff, sizeof(strbuff), "unable to allocate an array for %s "
+              "file descriptors, would overflow size_t", strbuff1);
     store_errmsg(strbuff, 0);
     fprintf(stderr, "%s\n", msgbuff);
     free(memchunk);
@@ -296,7 +296,7 @@ static int rlimit(int keep_open)
 
   /* allocate array for file descriptors */
 
-  snprintf(strbuff, sizeof(strbuff), fmt, num_open.rlim_max);
+  msnprintf(strbuff, sizeof(strbuff), fmt, num_open.rlim_max);
   fprintf(stderr, "allocating array for %s file descriptors\n", strbuff);
 
   fd = malloc(sizeof(*fd) * (size_t)(num_open.rlim_max));
@@ -316,14 +316,14 @@ static int rlimit(int keep_open)
       num_open.rlim_cur++)
     fd[num_open.rlim_cur] = -1;
 
-  snprintf(strbuff, sizeof(strbuff), fmt, num_open.rlim_max);
+  msnprintf(strbuff, sizeof(strbuff), fmt, num_open.rlim_max);
   fprintf(stderr, "trying to open %s file descriptors\n", strbuff);
 
   /* open a dummy descriptor */
 
   fd[0] = open(DEV_NULL, O_RDONLY);
   if(fd[0] < 0) {
-    snprintf(strbuff, sizeof(strbuff), "opening of %s failed", DEV_NULL);
+    msnprintf(strbuff, sizeof(strbuff), "opening of %s failed", DEV_NULL);
     store_errmsg(strbuff, errno);
     fprintf(stderr, "%s\n", msgbuff);
     free(fd);
@@ -344,20 +344,20 @@ static int rlimit(int keep_open)
 
       fd[num_open.rlim_cur] = -1;
 
-      snprintf(strbuff1, sizeof(strbuff1), fmt, num_open.rlim_cur);
-      snprintf(strbuff, sizeof(strbuff), "dup() attempt %s failed", strbuff1);
+      msnprintf(strbuff1, sizeof(strbuff1), fmt, num_open.rlim_cur);
+      msnprintf(strbuff, sizeof(strbuff), "dup() attempt %s failed", strbuff1);
       fprintf(stderr, "%s\n", strbuff);
 
-      snprintf(strbuff1, sizeof(strbuff), fmt, num_open.rlim_cur);
-      snprintf(strbuff, sizeof(strbuff), "fds system limit seems close to %s",
+      msnprintf(strbuff1, sizeof(strbuff), fmt, num_open.rlim_cur);
+      msnprintf(strbuff, sizeof(strbuff), "fds system limit seems close to %s",
                strbuff1);
       fprintf(stderr, "%s\n", strbuff);
 
       num_open.rlim_max = NUM_NEEDED;
 
-      snprintf(strbuff2, sizeof(strbuff2), fmt, num_open.rlim_max);
-      snprintf(strbuff1, sizeof(strbuff1), fmt, num_open.rlim_cur);
-      snprintf(strbuff, sizeof(strbuff), "fds needed %s > system limit %s",
+      msnprintf(strbuff2, sizeof(strbuff2), fmt, num_open.rlim_max);
+      msnprintf(strbuff1, sizeof(strbuff1), fmt, num_open.rlim_cur);
+      msnprintf(strbuff, sizeof(strbuff), "fds needed %s > system limit %s",
                strbuff2, strbuff1);
       store_errmsg(strbuff, 0);
       fprintf(stderr, "%s\n", msgbuff);
@@ -375,7 +375,7 @@ static int rlimit(int keep_open)
 
   }
 
-  snprintf(strbuff, sizeof(strbuff), fmt, num_open.rlim_max);
+  msnprintf(strbuff, sizeof(strbuff), fmt, num_open.rlim_max);
   fprintf(stderr, "%s file descriptors open\n", strbuff);
 
 #if !defined(HAVE_POLL_FINE)    && \
@@ -395,7 +395,7 @@ static int rlimit(int keep_open)
 
   num_open.rlim_cur = FD_SETSIZE - SAFETY_MARGIN;
   if(num_open.rlim_max > num_open.rlim_cur) {
-    snprintf(strbuff, sizeof(strbuff), "select limit is FD_SETSIZE %d",
+    msnprintf(strbuff, sizeof(strbuff), "select limit is FD_SETSIZE %d",
              FD_SETSIZE);
     store_errmsg(strbuff, 0);
     fprintf(stderr, "%s\n", msgbuff);
@@ -410,7 +410,7 @@ static int rlimit(int keep_open)
       rl.rlim_cur++) {
     if((fd[rl.rlim_cur] > 0) &&
        ((unsigned int)fd[rl.rlim_cur] > num_open.rlim_cur)) {
-      snprintf(strbuff, sizeof(strbuff), "select limit is FD_SETSIZE %d",
+      msnprintf(strbuff, sizeof(strbuff), "select limit is FD_SETSIZE %d",
                FD_SETSIZE);
       store_errmsg(strbuff, 0);
       fprintf(stderr, "%s\n", msgbuff);
@@ -432,12 +432,12 @@ static int rlimit(int keep_open)
    */
 
   if(!fopen_works()) {
-    snprintf(strbuff1, sizeof(strbuff1), fmt, num_open.rlim_max);
-    snprintf(strbuff, sizeof(strbuff),
+    msnprintf(strbuff1, sizeof(strbuff1), fmt, num_open.rlim_max);
+    msnprintf(strbuff, sizeof(strbuff),
              "fopen fails with %s fds open()",
              strbuff1);
     fprintf(stderr, "%s\n", msgbuff);
-    snprintf(strbuff, sizeof(strbuff),
+    msnprintf(strbuff, sizeof(strbuff),
              "fopen fails with lots of fds open()");
     store_errmsg(strbuff, 0);
     close_file_descriptors();
index 7b71fa5..8581303 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -53,7 +53,7 @@ int test(char *URL)
     /* get an easy handle */
     easy_init(curl[i]);
     /* specify target */
-    snprintf(target_url, sizeof(target_url), "%s%04i", URL, i + 1);
+    msnprintf(target_url, sizeof(target_url), "%s%04i", URL, i + 1);
     target_url[sizeof(target_url) - 1] = '\0';
     easy_setopt(curl[i], CURLOPT_URL, target_url);
     /* go verbose */
diff --git a/tests/libtest/lib536.c b/tests/libtest/lib536.c
deleted file mode 100644 (file)
index e694362..0000000
+++ /dev/null
@@ -1,142 +0,0 @@
-/***************************************************************************
- *                                  _   _ ____  _
- *  Project                     ___| | | |  _ \| |
- *                             / __| | | | |_) | |
- *                            | (__| |_| |  _ <| |___
- *                             \___|\___/|_| \_\_____|
- *
- * Copyright (C) 1998 - 2011, 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
- *
- * This software is licensed as described in the file COPYING, which
- * you should have received as part of this distribution. The terms
- * are also available at https://curl.haxx.se/docs/copyright.html.
- *
- * You may opt to use, copy, modify, merge, publish, distribute and/or sell
- * copies of the Software, and permit persons to whom the Software is
- * furnished to do so, under the terms of the COPYING file.
- *
- * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
- * KIND, either express or implied.
- *
- ***************************************************************************/
-#include "test.h"
-
-#include <fcntl.h>
-
-#include "testutil.h"
-#include "warnless.h"
-#include "memdebug.h"
-
-#define TEST_HANG_TIMEOUT 60 * 1000
-
-static int perform(CURLM *multi)
-{
-  int handles;
-  fd_set fdread, fdwrite, fdexcep;
-  int res = 0;
-
-  for(;;) {
-    struct timeval interval;
-    int maxfd = -99;
-
-    interval.tv_sec = 0;
-    interval.tv_usec = 100000L; /* 100 ms */
-
-    res_multi_perform(multi, &handles);
-    if(res)
-      return res;
-
-    res_test_timedout();
-    if(res)
-      return res;
-
-    if(!handles)
-      break; /* done */
-
-    FD_ZERO(&fdread);
-    FD_ZERO(&fdwrite);
-    FD_ZERO(&fdexcep);
-
-    res_multi_fdset(multi, &fdread, &fdwrite, &fdexcep, &maxfd);
-    if(res)
-      return res;
-
-    /* At this point, maxfd is guaranteed to be greater or equal than -1. */
-
-    res_select_test(maxfd + 1, &fdread, &fdwrite, &fdexcep, &interval);
-    if(res)
-      return res;
-
-    res_test_timedout();
-    if(res)
-      return res;
-  }
-
-  return 0; /* success */
-}
-
-int test(char *URL)
-{
-  CURLM *multi = NULL;
-  CURL *easy = NULL;
-  int res = 0;
-
-  start_test_timing();
-
-  global_init(CURL_GLOBAL_ALL);
-
-  multi_init(multi);
-
-  easy_init(easy);
-
-  multi_setopt(multi, CURLMOPT_PIPELINING, 1L);
-
-  easy_setopt(easy, CURLOPT_WRITEFUNCTION, fwrite);
-  easy_setopt(easy, CURLOPT_FAILONERROR, 1L);
-  easy_setopt(easy, CURLOPT_URL, URL);
-
-  res_multi_add_handle(multi, easy);
-  if(res) {
-    printf("curl_multi_add_handle() 1 failed\n");
-    goto test_cleanup;
-  }
-
-  res = perform(multi);
-  if(res) {
-    printf("retrieve 1 failed\n");
-    goto test_cleanup;
-  }
-
-  curl_multi_remove_handle(multi, easy);
-
-  curl_easy_reset(easy);
-
-  easy_setopt(easy, CURLOPT_FAILONERROR, 1L);
-  easy_setopt(easy, CURLOPT_URL, libtest_arg2);
-
-  res_multi_add_handle(multi, easy);
-  if(res) {
-    printf("curl_multi_add_handle() 2 failed\n");
-    goto test_cleanup;
-  }
-
-  res = perform(multi);
-  if(res) {
-    printf("retrieve 2 failed\n");
-    goto test_cleanup;
-  }
-
-  curl_multi_remove_handle(multi, easy);
-
-test_cleanup:
-
-  /* undocumented cleanup sequence - type UB */
-
-  curl_easy_cleanup(easy);
-  curl_multi_cleanup(multi);
-  curl_global_cleanup();
-
-  printf("Finished!\n");
-
-  return res;
-}
index bdc2e62..e8fb16a 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -56,10 +56,10 @@ static char msgbuff[256];
 static void store_errmsg(const char *msg, int err)
 {
   if(!err)
-    snprintf(msgbuff, sizeof(msgbuff), "%s", msg);
+    msnprintf(msgbuff, sizeof(msgbuff), "%s", msg);
   else
-    snprintf(msgbuff, sizeof(msgbuff), "%s, errno %d, %s", msg, err,
-             strerror(err));
+    msnprintf(msgbuff, sizeof(msgbuff), "%s, errno %d, %s", msg, err,
+              strerror(err));
 }
 
 static void close_file_descriptors(void)
@@ -133,7 +133,7 @@ static int rlimit(int keep_open)
     strcpy(strbuff, "INFINITY");
   else
 #endif
-    snprintf(strbuff, sizeof(strbuff), fmt, rl.rlim_cur);
+    msnprintf(strbuff, sizeof(strbuff), fmt, rl.rlim_cur);
   fprintf(stderr, "initial soft limit: %s\n", strbuff);
 
 #ifdef RLIM_INFINITY
@@ -141,7 +141,7 @@ static int rlimit(int keep_open)
     strcpy(strbuff, "INFINITY");
   else
 #endif
-    snprintf(strbuff, sizeof(strbuff), fmt, rl.rlim_max);
+    msnprintf(strbuff, sizeof(strbuff), fmt, rl.rlim_max);
   fprintf(stderr, "initial hard limit: %s\n", strbuff);
 
   /*
@@ -193,7 +193,7 @@ static int rlimit(int keep_open)
       strcpy(strbuff, "INFINITY");
     else
 #endif
-      snprintf(strbuff, sizeof(strbuff), fmt, rl.rlim_cur);
+      msnprintf(strbuff, sizeof(strbuff), fmt, rl.rlim_cur);
     fprintf(stderr, "current soft limit: %s\n", strbuff);
 
 #ifdef RLIM_INFINITY
@@ -201,7 +201,7 @@ static int rlimit(int keep_open)
       strcpy(strbuff, "INFINITY");
     else
 #endif
-      snprintf(strbuff, sizeof(strbuff), fmt, rl.rlim_max);
+      msnprintf(strbuff, sizeof(strbuff), fmt, rl.rlim_max);
     fprintf(stderr, "current hard limit: %s\n", strbuff);
 
   } /* (rl.rlim_cur != rl.rlim_max) */
@@ -231,7 +231,7 @@ static int rlimit(int keep_open)
     nitems = 0x40000;
   do {
     num_open.rlim_max = sizeof(*memchunk) * nitems;
-    snprintf(strbuff, sizeof(strbuff), fmt, num_open.rlim_max);
+    msnprintf(strbuff, sizeof(strbuff), fmt, num_open.rlim_max);
     fprintf(stderr, "allocating memchunk %s byte array\n", strbuff);
     memchunk = malloc(sizeof(*memchunk) * (size_t)nitems);
     if(!memchunk) {
@@ -274,9 +274,9 @@ static int rlimit(int keep_open)
   /* verify that we won't overflow size_t in malloc() */
 
   if((size_t)(num_open.rlim_max) > ((size_t)-1) / sizeof(*fd)) {
-    snprintf(strbuff1, sizeof(strbuff1), fmt, num_open.rlim_max);
-    snprintf(strbuff, sizeof(strbuff), "unable to allocate an array for %s "
-             "file descriptors, would overflow size_t", strbuff1);
+    msnprintf(strbuff1, sizeof(strbuff1), fmt, num_open.rlim_max);
+    msnprintf(strbuff, sizeof(strbuff), "unable to allocate an array for %s "
+              "file descriptors, would overflow size_t", strbuff1);
     store_errmsg(strbuff, 0);
     fprintf(stderr, "%s\n", msgbuff);
     free(memchunk);
@@ -286,7 +286,7 @@ static int rlimit(int keep_open)
   /* allocate array for file descriptors */
 
   do {
-    snprintf(strbuff, sizeof(strbuff), fmt, num_open.rlim_max);
+    msnprintf(strbuff, sizeof(strbuff), fmt, num_open.rlim_max);
     fprintf(stderr, "allocating array for %s file descriptors\n", strbuff);
     fd = malloc(sizeof(*fd) * (size_t)(num_open.rlim_max));
     if(!fd) {
@@ -310,14 +310,14 @@ static int rlimit(int keep_open)
       num_open.rlim_cur++)
     fd[num_open.rlim_cur] = -1;
 
-  snprintf(strbuff, sizeof(strbuff), fmt, num_open.rlim_max);
+  msnprintf(strbuff, sizeof(strbuff), fmt, num_open.rlim_max);
   fprintf(stderr, "trying to open %s file descriptors\n", strbuff);
 
   /* open a dummy descriptor */
 
   fd[0] = open(DEV_NULL, O_RDONLY);
   if(fd[0] < 0) {
-    snprintf(strbuff, sizeof(strbuff), "opening of %s failed", DEV_NULL);
+    msnprintf(strbuff, sizeof(strbuff), "opening of %s failed", DEV_NULL);
     store_errmsg(strbuff, errno);
     fprintf(stderr, "%s\n", msgbuff);
     free(fd);
@@ -338,21 +338,21 @@ static int rlimit(int keep_open)
 
       fd[num_open.rlim_cur] = -1;
 
-      snprintf(strbuff1, sizeof(strbuff1), fmt, num_open.rlim_cur);
-      snprintf(strbuff, sizeof(strbuff), "dup() attempt %s failed", strbuff1);
+      msnprintf(strbuff1, sizeof(strbuff1), fmt, num_open.rlim_cur);
+      msnprintf(strbuff, sizeof(strbuff), "dup() attempt %s failed", strbuff1);
       fprintf(stderr, "%s\n", strbuff);
 
-      snprintf(strbuff1, sizeof(strbuff1), fmt, num_open.rlim_cur);
-      snprintf(strbuff, sizeof(strbuff), "fds system limit seems close to %s",
-               strbuff1);
+      msnprintf(strbuff1, sizeof(strbuff1), fmt, num_open.rlim_cur);
+      msnprintf(strbuff, sizeof(strbuff), "fds system limit seems close to %s",
+                strbuff1);
       fprintf(stderr, "%s\n", strbuff);
 
       num_open.rlim_max = num_open.rlim_cur - SAFETY_MARGIN;
 
       num_open.rlim_cur -= num_open.rlim_max;
-      snprintf(strbuff1, sizeof(strbuff1), fmt, num_open.rlim_cur);
-      snprintf(strbuff, sizeof(strbuff), "closing %s file descriptors",
-               strbuff1);
+      msnprintf(strbuff1, sizeof(strbuff1), fmt, num_open.rlim_cur);
+      msnprintf(strbuff, sizeof(strbuff), "closing %s file descriptors",
+                strbuff1);
       fprintf(stderr, "%s\n", strbuff);
 
       for(num_open.rlim_cur = num_open.rlim_max;
@@ -362,7 +362,7 @@ static int rlimit(int keep_open)
         fd[num_open.rlim_cur] = -1;
       }
 
-      snprintf(strbuff, sizeof(strbuff), fmt, num_open.rlim_max);
+      msnprintf(strbuff, sizeof(strbuff), fmt, num_open.rlim_max);
       fprintf(stderr, "shrinking array for %s file descriptors\n", strbuff);
 
       /* we don't care if we can't shrink it */
@@ -379,7 +379,7 @@ static int rlimit(int keep_open)
 
   }
 
-  snprintf(strbuff, sizeof(strbuff), fmt, num_open.rlim_max);
+  msnprintf(strbuff, sizeof(strbuff), fmt, num_open.rlim_max);
   fprintf(stderr, "%s file descriptors open\n", strbuff);
 
 #if !defined(HAVE_POLL_FINE)    && \
@@ -399,8 +399,8 @@ static int rlimit(int keep_open)
 
   num_open.rlim_cur = FD_SETSIZE - SAFETY_MARGIN;
   if(num_open.rlim_max > num_open.rlim_cur) {
-    snprintf(strbuff, sizeof(strbuff), "select limit is FD_SETSIZE %d",
-             FD_SETSIZE);
+    msnprintf(strbuff, sizeof(strbuff), "select limit is FD_SETSIZE %d",
+              FD_SETSIZE);
     store_errmsg(strbuff, 0);
     fprintf(stderr, "%s\n", msgbuff);
     close_file_descriptors();
@@ -414,8 +414,8 @@ static int rlimit(int keep_open)
       rl.rlim_cur++) {
     if((fd[rl.rlim_cur] > 0) &&
        ((unsigned int)fd[rl.rlim_cur] > num_open.rlim_cur)) {
-      snprintf(strbuff, sizeof(strbuff), "select limit is FD_SETSIZE %d",
-               FD_SETSIZE);
+      msnprintf(strbuff, sizeof(strbuff), "select limit is FD_SETSIZE %d",
+                FD_SETSIZE);
       store_errmsg(strbuff, 0);
       fprintf(stderr, "%s\n", msgbuff);
       close_file_descriptors();
@@ -436,11 +436,11 @@ static int rlimit(int keep_open)
    */
 
   if(!fopen_works()) {
-    snprintf(strbuff1, sizeof(strbuff1), fmt, num_open.rlim_max);
-    snprintf(strbuff, sizeof(strbuff), "fopen fails with %s fds open",
-            strbuff1);
+    msnprintf(strbuff1, sizeof(strbuff1), fmt, num_open.rlim_max);
+    msnprintf(strbuff, sizeof(strbuff), "fopen fails with %s fds open",
+              strbuff1);
     fprintf(stderr, "%s\n", msgbuff);
-    snprintf(strbuff, sizeof(strbuff), "fopen fails with lots of fds open");
+    msnprintf(strbuff, sizeof(strbuff), "fopen fails with lots of fds open");
     store_errmsg(strbuff, 0);
     close_file_descriptors();
     free(memchunk);
index ff8a9b0..a52d8c5 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -198,7 +198,7 @@ int test(char *URL)
   if(test_argc < 4)
     return 99;
 
-  snprintf(buffer, sizeof(buffer), "Host: %s", HOST);
+  msnprintf(buffer, sizeof(buffer), "Host: %s", HOST);
 
   /* now add a custom Host: header */
   headers = curl_slist_append(headers, buffer);
index 94a26a4..bcbaa48 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -97,7 +97,7 @@ int test(char *URL)
   test_setopt(curl, CURLOPT_READDATA, hd_src);
 
   /* Now run off and do what you've been told! */
-  res = curl_easy_perform(curl);
+  curl_easy_perform(curl);
 
   /* and now upload the exact same again, but without rewinding so it already
      is at end of file */
index c06561e..95b5ac3 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -75,7 +75,7 @@ int test(char *URL)
   }
 
   for(i = 0; i < NUM_HEADERS; i++) {
-    int len = snprintf(buf, sizeof(buf), "Header%d: ", i);
+    int len = msnprintf(buf, sizeof(buf), "Header%d: ", i);
     memset(&buf[len], 'A', SIZE_HEADERS);
     buf[len + SIZE_HEADERS] = 0; /* zero terminate */
     hl = curl_slist_append(headerlist,  buf);
index 69b2c09..0595000 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -70,7 +70,7 @@ int test(char *URL)
       "GET /556 HTTP/1.2\r\n"
       "Host: ninja\r\n\r\n";
 #endif
-    size_t iolen;
+    size_t iolen = 0;
 
     res = curl_easy_send(curl, request, strlen(request), &iolen);
 
index 22ab9ec..2e51b99 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -122,7 +122,7 @@ static struct curloff_st  co_test[COFFT_TESTS_ARRSZ];
 static int test_unsigned_short_formatting(void)
 {
   int i, j;
-  int num_ushort_tests;
+  int num_ushort_tests = 0;
   int failed = 0;
 
 #if (SIZEOF_SHORT == 1)
@@ -229,7 +229,7 @@ static int test_unsigned_short_formatting(void)
 static int test_signed_short_formatting(void)
 {
   int i, j;
-  int num_sshort_tests;
+  int num_sshort_tests = 0;
   int failed = 0;
 
 #if (SIZEOF_SHORT == 1)
@@ -399,7 +399,7 @@ static int test_signed_short_formatting(void)
 static int test_unsigned_int_formatting(void)
 {
   int i, j;
-  int num_uint_tests;
+  int num_uint_tests = 0;
   int failed = 0;
 
 #if (SIZEOF_INT == 2)
@@ -549,7 +549,7 @@ static int test_unsigned_int_formatting(void)
 static int test_signed_int_formatting(void)
 {
   int i, j;
-  int num_sint_tests;
+  int num_sint_tests = 0;
   int failed = 0;
 
 #if (SIZEOF_INT == 2)
@@ -777,7 +777,7 @@ static int test_signed_int_formatting(void)
 static int test_unsigned_long_formatting(void)
 {
   int i, j;
-  int num_ulong_tests;
+  int num_ulong_tests = 0;
   int failed = 0;
 
 #if (SIZEOF_LONG == 2)
@@ -926,7 +926,7 @@ static int test_unsigned_long_formatting(void)
 static int test_signed_long_formatting(void)
 {
   int i, j;
-  int num_slong_tests;
+  int num_slong_tests = 0;
   int failed = 0;
 
 #if (SIZEOF_LONG == 2)
@@ -1154,7 +1154,7 @@ static int test_signed_long_formatting(void)
 static int test_curl_off_t_formatting(void)
 {
   int i, j;
-  int num_cofft_tests;
+  int num_cofft_tests = 0;
   int failed = 0;
 
 #if (SIZEOF_CURL_OFF_T == 2)
@@ -1396,7 +1396,7 @@ static int _strlen_check(int linenumber, char *buf, size_t len)
   size_t buflen = strlen(buf);
   if(len != buflen) {
     /* they shouldn't differ */
-    printf("sprintf strlen:%d failed:\nwe '%d'\nsystem: '%d'\n",
+    printf("sprintf strlen:%d failed:\nwe '%zu'\nsystem: '%zu'\n",
            linenumber, buflen, len);
     return 1;
   }
index 9c25db4..80116da 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -39,9 +39,8 @@ int test(char *URL)
   char *rtsp_session_id;
   int request = 1;
   int i;
-  FILE *idfile = NULL;
 
-  idfile = fopen(libtest_arg2, "wb");
+  FILE *idfile = fopen(libtest_arg2, "wb");
   if(idfile == NULL) {
     fprintf(stderr, "couldn't open the Session ID File\n");
     return TEST_ERR_MAJOR_BAD;
index c048747..0026178 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -104,9 +104,8 @@ int test(char *URL)
   CURL *curl;
   char *stream_uri = NULL;
   int request = 1;
-  FILE *protofile = NULL;
 
-  protofile = fopen(libtest_arg2, "wb");
+  FILE *protofile = fopen(libtest_arg2, "wb");
   if(protofile == NULL) {
     fprintf(stderr, "Couldn't open the protocol dump file\n");
     return TEST_ERR_MAJOR_BAD;
index d7f38c4..e34505c 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
 /*
  * Test case for below scenario:
  *   - Connect to an FTP server using CONNECT_ONLY option
- *   - transfer some files with re-using the connection (omitted in test case)
- *   - Disconnect from FTP server with sending QUIT command
  *
  * The test case originated for verifying CONNECT_ONLY option shall not
  * block after protocol connect is done, but it returns the message
  * with function curl_multi_info_read().
  */
 
-enum {
-  CONNECT_ONLY_PHASE = 0,
-  QUIT_PHASE,
-  LAST_PHASE
-};
-
 int test(char *URL)
 {
   CURL *easy = NULL;
@@ -53,7 +45,6 @@ int test(char *URL)
   int res = 0;
   int running;
   int msgs_left;
-  int phase;
   CURLMsg *msg;
 
   start_test_timing();
@@ -64,76 +55,65 @@ int test(char *URL)
 
   multi_init(multi);
 
-  for(phase = CONNECT_ONLY_PHASE; phase < LAST_PHASE; ++phase) {
-    /* go verbose */
-    easy_setopt(easy, CURLOPT_VERBOSE, 1L);
-
-    /* specify target */
-    easy_setopt(easy, CURLOPT_URL, URL);
-
-    /* enable 'CONNECT_ONLY' option when in connect phase */
-    if(phase == CONNECT_ONLY_PHASE)
-      easy_setopt(easy, CURLOPT_CONNECT_ONLY, 1L);
-
-    /* enable 'NOBODY' option to send 'QUIT' command in quit phase */
-    if(phase == QUIT_PHASE) {
-      easy_setopt(easy, CURLOPT_CONNECT_ONLY, 0L);
-      easy_setopt(easy, CURLOPT_NOBODY, 1L);
-      easy_setopt(easy, CURLOPT_FORBID_REUSE, 1L);
-    }
+  /* go verbose */
+  easy_setopt(easy, CURLOPT_VERBOSE, 1L);
 
-    multi_add_handle(multi, easy);
+  /* specify target */
+  easy_setopt(easy, CURLOPT_URL, URL);
 
-    for(;;) {
-      struct timeval interval;
-      fd_set fdread;
-      fd_set fdwrite;
-      fd_set fdexcep;
-      long timeout = -99;
-      int maxfd = -99;
+  easy_setopt(easy, CURLOPT_CONNECT_ONLY, 1L);
 
-      multi_perform(multi, &running);
+  multi_add_handle(multi, easy);
 
-      abort_on_test_timeout();
+  for(;;) {
+    struct timeval interval;
+    fd_set fdread;
+    fd_set fdwrite;
+    fd_set fdexcep;
+    long timeout = -99;
+    int maxfd = -99;
 
-      if(!running)
-        break; /* done */
+    multi_perform(multi, &running);
 
-      FD_ZERO(&fdread);
-      FD_ZERO(&fdwrite);
-      FD_ZERO(&fdexcep);
+    abort_on_test_timeout();
 
-      multi_fdset(multi, &fdread, &fdwrite, &fdexcep, &maxfd);
+    if(!running)
+      break; /* done */
 
-      /* At this point, maxfd is guaranteed to be greater or equal than -1. */
+    FD_ZERO(&fdread);
+    FD_ZERO(&fdwrite);
+    FD_ZERO(&fdexcep);
 
-      multi_timeout(multi, &timeout);
+    multi_fdset(multi, &fdread, &fdwrite, &fdexcep, &maxfd);
 
-      /* At this point, timeout is guaranteed to be greater or equal than
-         -1. */
+    /* At this point, maxfd is guaranteed to be greater or equal than -1. */
 
-      if(timeout != -1L) {
-        int itimeout = (timeout > (long)INT_MAX) ? INT_MAX : (int)timeout;
-        interval.tv_sec = itimeout/1000;
-        interval.tv_usec = (itimeout%1000)*1000;
-      }
-      else {
-        interval.tv_sec = TEST_HANG_TIMEOUT/1000 + 1;
-        interval.tv_usec = 0;
-      }
+    multi_timeout(multi, &timeout);
 
-      select_test(maxfd + 1, &fdread, &fdwrite, &fdexcep, &interval);
+    /* At this point, timeout is guaranteed to be greater or equal than
+       -1. */
 
-      abort_on_test_timeout();
+    if(timeout != -1L) {
+      int itimeout = (timeout > (long)INT_MAX) ? INT_MAX : (int)timeout;
+      interval.tv_sec = itimeout/1000;
+      interval.tv_usec = (itimeout%1000)*1000;
+    }
+    else {
+      interval.tv_sec = TEST_HANG_TIMEOUT/1000 + 1;
+      interval.tv_usec = 0;
     }
 
-    msg = curl_multi_info_read(multi, &msgs_left);
-    if(msg)
-      res = msg->data.result;
+    select_test(maxfd + 1, &fdread, &fdwrite, &fdexcep, &interval);
 
-    multi_remove_handle(multi, easy);
+    abort_on_test_timeout();
   }
 
+  msg = curl_multi_info_read(multi, &msgs_left);
+  if(msg)
+    res = msg->data.result;
+
+  multi_remove_handle(multi, easy);
+
 test_cleanup:
 
   /* undocumented cleanup sequence - type UA */
diff --git a/tests/libtest/lib658.c b/tests/libtest/lib658.c
new file mode 100644 (file)
index 0000000..98e0db4
--- /dev/null
@@ -0,0 +1,76 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2011, 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+#include "test.h"
+
+#include "testutil.h"
+#include "warnless.h"
+#include "memdebug.h"
+
+/*
+ * Get a single URL without select().
+ */
+
+int test(char *URL)
+{
+  CURL *handle = NULL;
+  CURLcode res = 0;
+  CURLU *urlp = NULL;
+  CURLUcode uc = 0;
+
+  global_init(CURL_GLOBAL_ALL);
+  easy_init(handle);
+
+  urlp = curl_url();
+
+  if(!urlp) {
+    fprintf(stderr, "problem init URL api.");
+    goto test_cleanup;
+  }
+
+  uc = curl_url_set(urlp, CURLUPART_URL, URL, 0);
+  if(uc) {
+    fprintf(stderr, "problem setting CURLUPART_URL.");
+    goto test_cleanup;
+  }
+
+  /* demonstrate override behavior */
+  easy_setopt(handle, CURLOPT_URL, "http://www.example.com");
+
+  easy_setopt(handle, CURLOPT_CURLU, urlp);
+  easy_setopt(handle, CURLOPT_VERBOSE, 1L);
+
+  res = curl_easy_perform(handle);
+
+  if(res) {
+    fprintf(stderr, "%s:%d curl_easy_perform() failed with code %d (%s)\n",
+            __FILE__, __LINE__, res, curl_easy_strerror(res));
+    goto test_cleanup;
+  }
+
+test_cleanup:
+
+  curl_url_cleanup(urlp);
+  curl_easy_cleanup(handle);
+  curl_global_cleanup();
+
+  return res;
+}
diff --git a/tests/libtest/lib659.c b/tests/libtest/lib659.c
new file mode 100644 (file)
index 0000000..b37e8e9
--- /dev/null
@@ -0,0 +1,75 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+#include "test.h"
+
+#include "testutil.h"
+#include "warnless.h"
+#include "memdebug.h"
+
+/*
+ * Get a single URL without select().
+ */
+
+int test(char *URL)
+{
+  CURL *handle = NULL;
+  CURLcode res = 0;
+  CURLU *urlp = NULL;
+
+  global_init(CURL_GLOBAL_ALL);
+  easy_init(handle);
+
+  urlp = curl_url();
+
+  if(!urlp) {
+    fprintf(stderr, "problem init URL api.");
+    goto test_cleanup;
+  }
+
+  /* this doesn't set the PATH part */
+  if(curl_url_set(urlp, CURLUPART_HOST, "www.example.com", 0) ||
+     curl_url_set(urlp, CURLUPART_SCHEME, "http", 0) ||
+     curl_url_set(urlp, CURLUPART_PORT, "80", 0)) {
+    fprintf(stderr, "problem setting CURLUPART");
+    goto test_cleanup;
+  }
+
+  easy_setopt(handle, CURLOPT_CURLU, urlp);
+  easy_setopt(handle, CURLOPT_VERBOSE, 1L);
+  easy_setopt(handle, CURLOPT_PROXY, URL);
+
+  res = curl_easy_perform(handle);
+
+  if(res) {
+    fprintf(stderr, "%s:%d curl_easy_perform() failed with code %d (%s)\n",
+            __FILE__, __LINE__, res, curl_easy_strerror(res));
+    goto test_cleanup;
+  }
+
+test_cleanup:
+
+  curl_url_cleanup(urlp);
+  curl_easy_cleanup(handle);
+  curl_global_cleanup();
+
+  return res;
+}
diff --git a/tests/libtest/lib661.c b/tests/libtest/lib661.c
new file mode 100644 (file)
index 0000000..a4f2c8e
--- /dev/null
@@ -0,0 +1,150 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+#include "test.h"
+#include "memdebug.h"
+
+int test(char *URL)
+{
+   CURLcode res;
+   CURL *curl = NULL;
+   char *newURL = NULL;
+   struct curl_slist *slist = NULL;
+
+   if(curl_global_init(CURL_GLOBAL_ALL) != CURLE_OK) {
+     fprintf(stderr, "curl_global_init() failed\n");
+     return TEST_ERR_MAJOR_BAD;
+   }
+
+   curl = curl_easy_init();
+   if(!curl) {
+     fprintf(stderr, "curl_easy_init() failed\n");
+     res = TEST_ERR_MAJOR_BAD;
+     goto test_cleanup;
+   }
+
+   /* test: CURLFTPMETHOD_SINGLECWD with absolute path should
+            skip CWD to entry path */
+   newURL = aprintf("%s/folderA/661", URL);
+   test_setopt(curl, CURLOPT_URL, newURL);
+   test_setopt(curl, CURLOPT_VERBOSE, 1L);
+   test_setopt(curl, CURLOPT_IGNORE_CONTENT_LENGTH, 1L);
+   test_setopt(curl, CURLOPT_FTP_FILEMETHOD, (long) CURLFTPMETHOD_SINGLECWD);
+   res = curl_easy_perform(curl);
+
+   free(newURL);
+   newURL = aprintf("%s/folderB/661", URL);
+   test_setopt(curl, CURLOPT_URL, newURL);
+   res = curl_easy_perform(curl);
+
+   /* test: CURLFTPMETHOD_NOCWD with absolute path should
+      never emit CWD (for both new and reused easy handle) */
+   curl_easy_cleanup(curl);
+   curl = curl_easy_init();
+   if(!curl) {
+     fprintf(stderr, "curl_easy_init() failed\n");
+     res = TEST_ERR_MAJOR_BAD;
+     goto test_cleanup;
+   }
+
+   free(newURL);
+   newURL = aprintf("%s/folderA/661", URL);
+   test_setopt(curl, CURLOPT_URL, newURL);
+   test_setopt(curl, CURLOPT_VERBOSE, 1L);
+   test_setopt(curl, CURLOPT_IGNORE_CONTENT_LENGTH, 1L);
+   test_setopt(curl, CURLOPT_FTP_FILEMETHOD, (long) CURLFTPMETHOD_NOCWD);
+   res = curl_easy_perform(curl);
+
+   /* curve ball: CWD /folderB before reusing connection with _NOCWD */
+   free(newURL);
+   newURL = aprintf("%s/folderB/661", URL);
+   test_setopt(curl, CURLOPT_URL, newURL);
+   test_setopt(curl, CURLOPT_FTP_FILEMETHOD, (long) CURLFTPMETHOD_SINGLECWD);
+   res = curl_easy_perform(curl);
+
+   free(newURL);
+   newURL = aprintf("%s/folderA/661", URL);
+   test_setopt(curl, CURLOPT_URL, newURL);
+   test_setopt(curl, CURLOPT_FTP_FILEMETHOD, (long) CURLFTPMETHOD_NOCWD);
+   res = curl_easy_perform(curl);
+
+   /* test: CURLFTPMETHOD_NOCWD with home-relative path should
+      not emit CWD for first FTP access after login */
+   curl_easy_cleanup(curl);
+   curl = curl_easy_init();
+   if(!curl) {
+     fprintf(stderr, "curl_easy_init() failed\n");
+     res = TEST_ERR_MAJOR_BAD;
+     goto test_cleanup;
+   }
+
+   slist = curl_slist_append(NULL, "SYST");
+   if(slist == NULL) {
+     fprintf(stderr, "curl_slist_append() failed\n");
+     res = TEST_ERR_MAJOR_BAD;
+     goto test_cleanup;
+   }
+
+   test_setopt(curl, CURLOPT_URL, URL);
+   test_setopt(curl, CURLOPT_VERBOSE, 1L);
+   test_setopt(curl, CURLOPT_NOBODY, 1L);
+   test_setopt(curl, CURLOPT_FTP_FILEMETHOD, (long) CURLFTPMETHOD_NOCWD);
+   test_setopt(curl, CURLOPT_QUOTE, slist);
+   res = curl_easy_perform(curl);
+
+   /* test: CURLFTPMETHOD_SINGLECWD with home-relative path should
+      not emit CWD for first FTP access after login */
+   curl_easy_cleanup(curl);
+   curl = curl_easy_init();
+   if(!curl) {
+     fprintf(stderr, "curl_easy_init() failed\n");
+     res = TEST_ERR_MAJOR_BAD;
+     goto test_cleanup;
+   }
+
+   test_setopt(curl, CURLOPT_URL, URL);
+   test_setopt(curl, CURLOPT_VERBOSE, 1L);
+   test_setopt(curl, CURLOPT_NOBODY, 1L);
+   test_setopt(curl, CURLOPT_FTP_FILEMETHOD, (long) CURLFTPMETHOD_SINGLECWD);
+   test_setopt(curl, CURLOPT_QUOTE, slist);
+   res = curl_easy_perform(curl);
+
+   /* test: CURLFTPMETHOD_NOCWD with home-relative path should
+      not emit CWD for second FTP access when not needed +
+      bonus: see if path buffering survives curl_easy_reset() */
+   curl_easy_reset(curl);
+   test_setopt(curl, CURLOPT_URL, URL);
+   test_setopt(curl, CURLOPT_VERBOSE, 1L);
+   test_setopt(curl, CURLOPT_NOBODY, 1L);
+   test_setopt(curl, CURLOPT_FTP_FILEMETHOD, (long) CURLFTPMETHOD_NOCWD);
+   test_setopt(curl, CURLOPT_QUOTE, slist);
+   res = curl_easy_perform(curl);
+
+
+test_cleanup:
+
+   curl_slist_free_all(slist);
+   free(newURL);
+   curl_easy_cleanup(curl);
+   curl_global_cleanup();
+
+   return (int)res;
+}
index 8e348ad..cfad6f3 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -38,7 +38,7 @@ static CURLcode send_request(CURL *curl, const char *url, int seq,
     return CURLE_OUT_OF_MEMORY;
   }
 
-  snprintf(full_url, len, "%s%04d", url, seq);
+  msnprintf(full_url, len, "%s%04d", url, seq);
   fprintf(stderr, "Sending new request %d to %s with credential %s "
           "(auth %ld)\n", seq, full_url, userpwd, auth_scheme);
   test_setopt(curl, CURLOPT_URL, full_url);
index e17b991..426f6f2 100644 (file)
@@ -135,11 +135,11 @@ int test(char *url)
       easy_init(easy[num_handles]);
 
       if(num_handles % 3 == 2) {
-        snprintf(full_url, urllen, "%s0200", url);
+        msnprintf(full_url, urllen, "%s0200", url);
         easy_setopt(easy[num_handles], CURLOPT_HTTPAUTH, CURLAUTH_NTLM);
       }
       else {
-        snprintf(full_url, urllen, "%s0100", url);
+        msnprintf(full_url, urllen, "%s0100", url);
         easy_setopt(easy[num_handles], CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
       }
       easy_setopt(easy[num_handles], CURLOPT_FRESH_CONNECT, 1L);
index 9771cf5..f4add1a 100755 (executable)
@@ -6,7 +6,7 @@
 #                            | (__| |_| |  _ <| |___
 #                             \___|\___/|_| \_\_____|
 #
-# Copyright (C) 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 2017 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 #
 # This software is licensed as described in the file COPYING, which
 # you should have received as part of this distribution. The terms
@@ -121,6 +121,7 @@ static int geterr(const char *name, CURLcode val, int lineno)
 static curl_progress_callback progresscb;
 static curl_write_callback headercb;
 static curl_debug_callback debugcb;
+static curl_trailer_callback trailercb;
 static curl_ssl_ctx_callback ssl_ctx_cb;
 static curl_ioctl_callback ioctlcb;
 static curl_sockopt_callback sockoptcb;
@@ -204,17 +205,6 @@ while(<STDIN>) {
               print "  (void)curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, 0);\n";
               print "${pref} stringpointerextra);\n$check";
             }
-            elsif(($name eq "HTTPHEADER") ||
-                  ($name eq "POSTQUOTE") ||
-                  ($name eq "PREQUOTE") ||
-                  ($name eq "HTTP200ALIASES") ||
-                  ($name eq "TELNETOPTIONS") ||
-                  ($name eq "MAIL_RCPT") ||
-                  ($name eq "RESOLVE") ||
-                  ($name eq "PROXYHEADER") ||
-                  ($name eq "QUOTE")) {
-              print "${pref} slist);\n$check";
-            }
             elsif($name eq "HTTPPOST") {
               print "${pref} httppost);\n$check";
             }
@@ -229,6 +219,9 @@ while(<STDIN>) {
             }
             print "${pref} NULL);\n$check";
         }
+        elsif($type eq "SLISTPOINT") {
+            print "${pref} slist);\n$check";
+        }
         elsif($type eq "FUNCTIONPOINT") {
             if($name =~ /([^ ]*)FUNCTION/) {
               my $l=lc($1);
index aaa7796..873e263 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 2017-2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 2017-2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -28,6 +28,8 @@
 
 #include "stub_gssapi.h"
 
+/* !checksrc! disable SNPRINTF all */
+
 #define MAX_CREDS_LENGTH 250
 #define APPROX_TOKEN_LEN 250
 
@@ -42,15 +44,15 @@ enum min_err_code {
     GSS_LAST
 };
 
-const char *min_err_table[] = {
-    "stub-gss: no error",
-    "stub-gss: no memory",
-    "stub-gss: invalid arguments",
-    "stub-gss: invalid credentials",
-    "stub-gss: invalid context",
-    "stub-gss: server returned error",
-    "stub-gss: cannot find a mechanism",
-    NULL
+static const char *min_err_table[] = {
+  "stub-gss: no error",
+  "stub-gss: no memory",
+  "stub-gss: invalid arguments",
+  "stub-gss: invalid credentials",
+  "stub-gss: invalid context",
+  "stub-gss: server returned error",
+  "stub-gss: cannot find a mechanism",
+  NULL
 };
 
 struct gss_ctx_id_t_desc_struct {
@@ -202,6 +204,8 @@ OM_uint32 gss_init_sec_context(OM_uint32 *min,
   }
 
   /* Token format: creds:target:type:padding */
+  /* Note: this is using the *real* snprintf() and not the curl provided
+     one */
   used = snprintf(token, length, "%s:%s:%d:", creds,
                   (char *) target_name, ctx->sent);
 
index bb1acca..3937439 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
  *
  ***************************************************************************/
 
-/* !checksrc! disable ASSIGNWITHINCONDITION all */
+/* !checksrc! disable ASSIGNWITHINCONDITION 14 */
 
 /* Now include the curl_setup.h file from libcurl's private libdir (the source
    version, but that might include "curl_config.h" from the build dir so we
@@ -131,7 +131,7 @@ extern int unitfail;
     fprintf(stderr, "%s:%d curl_easy_init() failed\n", (Y), (Z)); \
     res = TEST_ERR_EASY_INIT;                                     \
   }                                                               \
-} WHILE_FALSE
+} while(0)
 
 #define res_easy_init(A) \
   exe_easy_init((A), (__FILE__), (__LINE__))
@@ -140,7 +140,7 @@ extern int unitfail;
   exe_easy_init((A), (Y), (Z));   \
   if(res)                         \
     goto test_cleanup;            \
-} WHILE_FALSE
+} while(0)
 
 #define easy_init(A) \
   chk_easy_init((A), (__FILE__), (__LINE__))
@@ -152,7 +152,7 @@ extern int unitfail;
     fprintf(stderr, "%s:%d curl_multi_init() failed\n", (Y), (Z)); \
     res = TEST_ERR_MULTI_INIT;                                     \
   }                                                                \
-} WHILE_FALSE
+} while(0)
 
 #define res_multi_init(A) \
   exe_multi_init((A), (__FILE__), (__LINE__))
@@ -161,7 +161,7 @@ extern int unitfail;
   exe_multi_init((A), (Y), (Z));   \
   if(res)                          \
     goto test_cleanup;             \
-} WHILE_FALSE
+} while(0)
 
 #define multi_init(A) \
   chk_multi_init((A), (__FILE__), (__LINE__))
@@ -176,7 +176,7 @@ extern int unitfail;
             (Y), (Z), (int)ec, curl_easy_strerror(ec));    \
     res = (int)ec;                                         \
   }                                                        \
-} WHILE_FALSE
+} while(0)
 
 #define res_easy_setopt(A, B, C) \
   exe_easy_setopt((A), (B), (C), (__FILE__), (__LINE__))
@@ -185,7 +185,7 @@ extern int unitfail;
   exe_easy_setopt((A), (B), (C), (Y), (Z)); \
   if(res)                                   \
     goto test_cleanup;                      \
-} WHILE_FALSE
+} while(0)
 
 #define easy_setopt(A, B, C) \
   chk_easy_setopt((A), (B), (C), (__FILE__), (__LINE__))
@@ -200,7 +200,7 @@ extern int unitfail;
             (Y), (Z), (int)ec, curl_multi_strerror(ec));    \
     res = (int)ec;                                          \
   }                                                         \
-} WHILE_FALSE
+} while(0)
 
 #define res_multi_setopt(A,B,C) \
   exe_multi_setopt((A), (B), (C), (__FILE__), (__LINE__))
@@ -209,7 +209,7 @@ extern int unitfail;
   exe_multi_setopt((A), (B), (C), (Y), (Z)); \
   if(res)                                    \
     goto test_cleanup;                       \
-} WHILE_FALSE
+} while(0)
 
 #define multi_setopt(A,B,C) \
   chk_multi_setopt((A), (B), (C), (__FILE__), (__LINE__))
@@ -224,7 +224,7 @@ extern int unitfail;
             (Y), (Z), (int)ec, curl_multi_strerror(ec));     \
     res = (int)ec;                                           \
   }                                                          \
-} WHILE_FALSE
+} while(0)
 
 #define res_multi_add_handle(A, B) \
   exe_multi_add_handle((A), (B), (__FILE__), (__LINE__))
@@ -233,7 +233,7 @@ extern int unitfail;
   exe_multi_add_handle((A), (B), (Y), (Z));   \
   if(res)                                     \
     goto test_cleanup;                        \
-} WHILE_FALSE
+} while(0)
 
 #define multi_add_handle(A, B) \
   chk_multi_add_handle((A), (B), (__FILE__), (__LINE__))
@@ -248,7 +248,7 @@ extern int unitfail;
             (Y), (Z), (int)ec, curl_multi_strerror(ec));        \
     res = (int)ec;                                              \
   }                                                             \
-} WHILE_FALSE
+} while(0)
 
 #define res_multi_remove_handle(A, B) \
   exe_multi_remove_handle((A), (B), (__FILE__), (__LINE__))
@@ -257,7 +257,7 @@ extern int unitfail;
   exe_multi_remove_handle((A), (B), (Y), (Z));   \
   if(res)                                        \
     goto test_cleanup;                           \
-} WHILE_FALSE
+} while(0)
 
 
 #define multi_remove_handle(A, B) \
@@ -279,7 +279,7 @@ extern int unitfail;
             (Y), (Z), (int)*((B)));                              \
     res = TEST_ERR_NUM_HANDLES;                                  \
   }                                                              \
-} WHILE_FALSE
+} while(0)
 
 #define res_multi_perform(A, B) \
   exe_multi_perform((A), (B), (__FILE__), (__LINE__))
@@ -288,7 +288,7 @@ extern int unitfail;
   exe_multi_perform((A), (B), (Y), (Z));   \
   if(res)                                  \
     goto test_cleanup;                     \
-} WHILE_FALSE
+} while(0)
 
 #define multi_perform(A,B) \
   chk_multi_perform((A), (B), (__FILE__), (__LINE__))
@@ -309,7 +309,7 @@ extern int unitfail;
             (Y), (Z), (int)*((E)));                                  \
     res = TEST_ERR_NUM_HANDLES;                                      \
   }                                                                  \
-} WHILE_FALSE
+} while(0)
 
 #define res_multi_fdset(A, B, C, D, E) \
   exe_multi_fdset((A), (B), (C), (D), (E), (__FILE__), (__LINE__))
@@ -318,7 +318,7 @@ extern int unitfail;
     exe_multi_fdset((A), (B), (C), (D), (E), (Y), (Z)); \
     if(res)                                             \
       goto test_cleanup;                                \
-  } WHILE_FALSE
+  } while(0)
 
 #define multi_fdset(A, B, C, D, E) \
   chk_multi_fdset((A), (B), (C), (D), (E), (__FILE__), (__LINE__))
@@ -339,7 +339,7 @@ extern int unitfail;
             (Y), (Z), (long)*((B)));                         \
     res = TEST_ERR_BAD_TIMEOUT;                              \
   }                                                          \
-} WHILE_FALSE
+} while(0)
 
 #define res_multi_timeout(A, B) \
   exe_multi_timeout((A), (B), (__FILE__), (__LINE__))
@@ -348,13 +348,67 @@ extern int unitfail;
     exe_multi_timeout((A), (B), (Y), (Z)); \
     if(res)                                \
       goto test_cleanup;                   \
-  } WHILE_FALSE
+  } while(0)
 
 #define multi_timeout(A, B) \
   chk_multi_timeout((A), (B), (__FILE__), (__LINE__))
 
 /* ---------------------------------------------------------------- */
 
+#define exe_multi_poll(A,B,C,D,E,Y,Z) do {                          \
+  CURLMcode ec;                                                     \
+  if((ec = curl_multi_poll((A), (B), (C), (D), (E))) != CURLM_OK) { \
+    fprintf(stderr, "%s:%d curl_multi_poll() failed, "              \
+            "with code %d (%s)\n",                                  \
+            (Y), (Z), (int)ec, curl_multi_strerror(ec));            \
+    res = (int)ec;                                                  \
+  }                                                                 \
+  else if(*((E)) < 0) {                                             \
+    fprintf(stderr, "%s:%d curl_multi_poll() succeeded, "           \
+            "but returned invalid numfds value (%d)\n",             \
+            (Y), (Z), (int)*((E)));                                 \
+    res = TEST_ERR_NUM_HANDLES;                                     \
+  }                                                                 \
+} while(0)
+
+#define res_multi_poll(A, B, C, D, E) \
+  exe_multi_poll((A), (B), (C), (D), (E), (__FILE__), (__LINE__))
+
+#define chk_multi_poll(A, B, C, D, E, Y, Z) do {     \
+  exe_multi_poll((A), (B), (C), (D), (E), (Y), (Z)); \
+  if(res)                                            \
+    goto test_cleanup;                               \
+} while(0)
+
+#define multi_poll(A, B, C, D, E) \
+  chk_multi_poll((A), (B), (C), (D), (E), (__FILE__), (__LINE__))
+
+/* ---------------------------------------------------------------- */
+
+#define exe_multi_wakeup(A,Y,Z) do {                     \
+  CURLMcode ec;                                          \
+  if((ec = curl_multi_wakeup((A))) != CURLM_OK) {        \
+    fprintf(stderr, "%s:%d curl_multi_wakeup() failed, " \
+            "with code %d (%s)\n",                       \
+            (Y), (Z), (int)ec, curl_multi_strerror(ec)); \
+    res = (int)ec;                                       \
+  }                                                      \
+} while(0)
+
+#define res_multi_wakeup(A) \
+  exe_multi_wakeup((A), (__FILE__), (__LINE__))
+
+#define chk_multi_wakeup(A, Y, Z) do { \
+  exe_multi_wakeup((A), (Y), (Z));     \
+  if(res)                              \
+    goto test_cleanup;                 \
+} while(0)
+
+#define multi_wakeup(A) \
+  chk_multi_wakeup((A), (__FILE__), (__LINE__))
+
+/* ---------------------------------------------------------------- */
+
 #define exe_select_test(A, B, C, D, E, Y, Z) do {               \
     int ec;                                                     \
     if(select_wrapper((A), (B), (C), (D), (E)) == -1) {         \
@@ -364,7 +418,7 @@ extern int unitfail;
               (Y), (Z), ec, strerror(ec));                      \
       res = TEST_ERR_SELECT;                                    \
     }                                                           \
-  } WHILE_FALSE
+  } while(0)
 
 #define res_select_test(A, B, C, D, E) \
   exe_select_test((A), (B), (C), (D), (E), (__FILE__), (__LINE__))
@@ -373,7 +427,7 @@ extern int unitfail;
     exe_select_test((A), (B), (C), (D), (E), (Y), (Z)); \
     if(res)                                             \
       goto test_cleanup;                                \
-  } WHILE_FALSE
+  } while(0)
 
 #define select_test(A, B, C, D, E) \
   chk_select_test((A), (B), (C), (D), (E), (__FILE__), (__LINE__))
@@ -382,7 +436,7 @@ extern int unitfail;
 
 #define start_test_timing() do { \
   tv_test_start = tutil_tvnow(); \
-} WHILE_FALSE
+} while(0)
 
 #define exe_test_timedout(Y,Z) do {                                    \
   if(tutil_tvdiff(tutil_tvnow(), tv_test_start) > TEST_HANG_TIMEOUT) { \
@@ -390,7 +444,7 @@ extern int unitfail;
                     "that it would have run forever.\n", (Y), (Z));    \
     res = TEST_ERR_RUNS_FOREVER;                                       \
   }                                                                    \
-} WHILE_FALSE
+} while(0)
 
 #define res_test_timedout() \
   exe_test_timedout((__FILE__), (__LINE__))
@@ -399,7 +453,7 @@ extern int unitfail;
     exe_test_timedout(Y, Z);         \
     if(res)                          \
       goto test_cleanup;             \
-  } WHILE_FALSE
+  } while(0)
 
 #define abort_on_test_timeout() \
   chk_test_timedout((__FILE__), (__LINE__))
@@ -414,7 +468,7 @@ extern int unitfail;
             (Y), (Z), (int)ec, curl_easy_strerror(ec)); \
     res = (int)ec;                                      \
   }                                                     \
-} WHILE_FALSE
+} while(0)
 
 #define res_global_init(A) \
   exe_global_init((A), (__FILE__), (__LINE__))
@@ -423,7 +477,7 @@ extern int unitfail;
     exe_global_init((A), (Y), (Z));   \
     if(res)                           \
       return res;                     \
-  } WHILE_FALSE
+  } while(0)
 
 /* global_init() is different than other macros. In case of
    failure it 'return's instead of going to 'test_cleanup'. */
index 0a98d00..2718ef9 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -108,8 +108,8 @@ int libtest_debug_cb(CURL *handle, curl_infotype type,
     }
     secs = epoch_offset + tv.tv_sec;
     now = localtime(&secs);  /* not thread safe but we don't care */
-    snprintf(timebuf, sizeof(timebuf), "%02d:%02d:%02d.%06ld ",
-             now->tm_hour, now->tm_min, now->tm_sec, (long)tv.tv_usec);
+    msnprintf(timebuf, sizeof(timebuf), "%02d:%02d:%02d.%06ld ",
+              now->tm_hour, now->tm_min, now->tm_sec, (long)tv.tv_usec);
   }
 
   switch(type) {
index b6864c8..ba6577c 100755 (executable)
@@ -6,7 +6,7 @@
 #                            | (__| |_| |  _ <| |___
 #                             \___|\___/|_| \_\_____|
 #
-# Copyright (C) 2016, 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 2016 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 #
 # This software is licensed as described in the file COPYING, which
 # you should have received as part of this distribution. The terms
@@ -138,6 +138,7 @@ my %opts = (
     '-N, --no-buffer' => 1,
     '--no-sessionid' => 1,
     '--no-keepalive' => 1,
+    '--no-progress-meter' => 1,
 
     # pretend these options without -no exist in curl.1 and tool_help.c
     '--alpn' => 6,
@@ -147,6 +148,7 @@ my %opts = (
     '--keepalive' => 6,
     '-N, --buffer' => 6,
     '--sessionid' => 6,
+    '--progress-meter' => 6,
 
     # deprecated options do not need to be in tool_help.c nor curl.1
     '--krb4' => 6,
diff --git a/tests/manpage-syntax.pl b/tests/manpage-syntax.pl
new file mode 100644 (file)
index 0000000..7a7137a
--- /dev/null
@@ -0,0 +1,63 @@
+#!/usr/bin/env perl
+#***************************************************************************
+#                                  _   _ ____  _
+#  Project                     ___| | | |  _ \| |
+#                             / __| | | | |_) | |
+#                            | (__| |_| |  _ <| |___
+#                             \___|\___/|_| \_\_____|
+#
+# Copyright (C) 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
+# are also available at https://curl.haxx.se/docs/copyright.html.
+#
+# You may opt to use, copy, modify, merge, publish, distribute and/or sell
+# copies of the Software, and permit persons to whom the Software is
+# furnished to do so, under the terms of the COPYING file.
+#
+# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+# KIND, either express or implied.
+#
+###########################################################################
+#
+# Scan man page(s) and detect some simple and yet common formatting mistakes.
+#
+# Output all deviances to stderr.
+
+use strict;
+use warnings;
+
+# we may get the dir roots pointed out
+my @manpages=@ARGV;
+my $errors = 0;
+
+sub scanmanpage {
+    my ($file) = @_;
+
+    print "Check $file\n";
+    open(M, "<$file") || die "no such file: $file";
+    my $line = 1;
+    while(<M>) {
+        if($_ =~ /^\'/) {
+            print STDERR "$file:$line line starts with single quote!\n";
+            $errors++;
+        }
+        if($_ =~ /\\f([BI])(.*)/) {
+            my ($format, $rest) = ($1, $2);
+            if($rest !~ /\\fP/) {
+                print STDERR "$file:$line missing \\f${format} terminator!\n";
+                $errors++;
+            }
+        }
+        $line++;
+    }
+    close(M);
+}
+
+
+for my $m (@manpages) {
+    scanmanpage($m);
+}
+
+exit $errors;
similarity index 97%
rename from lib/objnames-test08.sh
rename to tests/objnames-test08.sh
index 4859757..0e4a252 100755 (executable)
@@ -6,7 +6,7 @@
 # *                            | (__| |_| |  _ <| |___
 # *                             \___|\___/|_| \_\_____|
 # *
-# * Copyright (C) 2013, Daniel Stenberg, <daniel@haxx.se>, et al.
+# * Copyright (C) 2013 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 # *
 # * This software is licensed as described in the file COPYING, which
 # * you should have received as part of this distribution. The terms
@@ -48,7 +48,7 @@ fi
 
 srcdir=${1}
 
-if test -f "$srcdir/../lib/objnames.inc"; then
+if test -f "$srcdir/objnames.inc"; then
   :
 else
   echo "$0: Missing objnames.inc"
@@ -72,7 +72,7 @@ list_obj_uniq=$logdir/${tstnum}_list_obj_uniq
 # Source curl_8char_object_name() function definition
 #
 
-. $srcdir/../lib/objnames.inc
+. $srcdir/objnames.inc
 
 #
 # Some curl_8char_object_name() unit tests
similarity index 97%
rename from lib/objnames-test10.sh
rename to tests/objnames-test10.sh
index 62184b8..3d101dc 100755 (executable)
@@ -6,7 +6,7 @@
 # *                            | (__| |_| |  _ <| |___
 # *                             \___|\___/|_| \_\_____|
 # *
-# * Copyright (C) 2013, Daniel Stenberg, <daniel@haxx.se>, et al.
+# * Copyright (C) 2013 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 # *
 # * This software is licensed as described in the file COPYING, which
 # * you should have received as part of this distribution. The terms
@@ -48,7 +48,7 @@ fi
 
 srcdir=${1}
 
-if test -f "$srcdir/../lib/objnames.inc"; then
+if test -f "$srcdir/objnames.inc"; then
   :
 else
   echo "$0: Missing objnames.inc"
@@ -72,7 +72,7 @@ list_obj_uniq=$logdir/${tstnum}_list_obj_uniq
 # Source curl_10char_object_name() function definition
 #
 
-. $srcdir/../lib/objnames.inc
+. $srcdir/objnames.inc
 
 #
 # Some curl_10char_object_name() unit tests
similarity index 100%
rename from lib/objnames.inc
rename to tests/objnames.inc
index dc8777e..791377b 100644 (file)
@@ -1,3 +1,5 @@
+from __future__ import print_function
+from __future__ import absolute_import
 # Copyright (c) 2003-2016 CORE Security Technologies
 #
 # This software is provided under under a slightly modified version
@@ -40,7 +42,7 @@ from random import randint
 from struct import pack, unpack
 import time
 
-from structure import Structure
+from .structure import Structure
 
 CVS_REVISION = '$Revision: 526 $'
 
@@ -454,7 +456,7 @@ class NetBIOS:
             except socket.error:
                 pass
         if not has_bind:
-            raise NetBIOSError, ( 'Cannot bind to a good UDP port', ERRCLASS_OS, errno.EAGAIN )
+            raise NetBIOSError( 'Cannot bind to a good UDP port', ERRCLASS_OS, errno.EAGAIN)
         self.__sock = s
 
     # Set the default NetBIOS domain nameserver.
@@ -531,15 +533,15 @@ class NetBIOS:
                             if res.get_rcode() == 0x03:
                                 return None
                             else:
-                                raise NetBIOSError, ( 'Negative name query response', ERRCLASS_QUERY, res.get_rcode() )
+                                raise NetBIOSError( 'Negative name query response', ERRCLASS_QUERY, res.get_rcode())
                         
                         if res.get_ancount() != 1:
                             raise NetBIOSError( 'Malformed response')
                         
                         return NBPositiveNameQueryResponse(res.get_answers())
-            except select.error, ex:
+            except select.error as ex:
                 if ex[0] != errno.EINTR and ex[0] != errno.EAGAIN:
-                    raise NetBIOSError, ( 'Error occurs while waiting for response', ERRCLASS_OS, ex[0] )
+                    raise NetBIOSError( 'Error occurs while waiting for response', ERRCLASS_OS, ex[0])
                 raise
 
 
@@ -570,25 +572,25 @@ class NetBIOS:
                 else:
                     try:
                         data, _ = self.__sock.recvfrom(65536, 0)
-                    except Exception, e:
-                        raise NetBIOSError, "recvfrom error: %s" % str(e)
+                    except Exception as e:
+                        raise NetBIOSError("recvfrom error: %s" % str(e))
                     self.__sock.close()
                     res = NetBIOSPacket(data)
                     if res.get_trn_id() == p.get_trn_id():
                         if res.get_rcode():
                             if res.get_rcode() == 0x03:
                                 # I'm just guessing here
-                                raise NetBIOSError, "Cannot get data from server"
+                                raise NetBIOSError("Cannot get data from server")
                             else:
-                                raise NetBIOSError, ( 'Negative name query response', ERRCLASS_QUERY, res.get_rcode() )
+                                raise NetBIOSError( 'Negative name query response', ERRCLASS_QUERY, res.get_rcode())
                         answ = NBNodeStatusResponse(res.get_answers())
                         self.mac = answ.get_mac()
                         return answ.get_node_names()
-            except select.error, ex:
+            except select.error as ex:
                 if ex[0] != errno.EINTR and ex[0] != errno.EAGAIN:
-                    raise NetBIOSError, ( 'Error occurs while waiting for response', ERRCLASS_OS, ex[0] )
-            except socket.error, ex:
-                raise NetBIOSError, 'Connection error: %s' % str(ex)
+                    raise NetBIOSError( 'Error occurs while waiting for response', ERRCLASS_OS, ex[0])
+            except socket.error as ex:
+                raise NetBIOSError('Connection error: %s' % str(ex))
 
 # Perform first and second level encoding of name as specified in RFC 1001 (Section 4)
 def encode_name(name, type, scope):
@@ -841,7 +843,7 @@ class NetBIOSTCPSession(NetBIOSSession):
             af, socktype, proto, canonname, sa = socket.getaddrinfo(peer[0], peer[1], 0, socket.SOCK_STREAM)[0]
             sock = socket.socket(af, socktype, proto)
             sock.connect(sa)
-        except socket.error, e:
+        except socket.error as e:
             raise socket.error("Connection error (%s:%s)" % (peer[0], peer[1]), e)
         return sock
 
@@ -866,7 +868,7 @@ class NetBIOSTCPSession(NetBIOSSession):
         while 1:
             p = self.recv_packet(timeout)
             if p.get_type() == NETBIOS_SESSION_NEGATIVE_RESPONSE:
-                raise NetBIOSError, ( 'Cannot request session', ERRCLASS_SESSION, ord(p.get_trailer()[0]) )
+                raise NetBIOSError( 'Cannot request session', ERRCLASS_SESSION, ord(p.get_trailer()[0]))
             elif p.get_type() == NETBIOS_SESSION_POSITIVE_RESPONSE:
                 break
             else:
@@ -896,13 +898,13 @@ class NetBIOSTCPSession(NetBIOSSession):
 
                 received = self._sock.recv(bytes_left)
                 if len(received) == 0:
-                    raise NetBIOSError( 'Error while reading from remote', ERRCLASS_OS, None)
+                    raise NetBIOSError( 'Error while reading from remote', ERRCLASS_OS, None)
 
                 data = data + received
                 bytes_left = read_length - len(data)
-            except select.error, ex:
+            except select.error as ex:
                 if ex[0] != errno.EINTR and ex[0] != errno.EAGAIN:
-                    raise NetBIOSError, ( 'Error occurs while reading from remote', ERRCLASS_OS, ex[0] )
+                    raise NetBIOSError( 'Error occurs while reading from remote', ERRCLASS_OS, ex[0])
 
         return data
 
@@ -919,13 +921,13 @@ class NetBIOSTCPSession(NetBIOSSession):
 
                 received = self._sock.recv(bytes_left)
                 if len(received) == 0:
-                    raise NetBIOSError( 'Error while reading from remote', ERRCLASS_OS, None)
+                    raise NetBIOSError( 'Error while reading from remote', ERRCLASS_OS, None)
 
                 data = data + received
                 bytes_left = read_length - len(data)
-            except select.error, ex:
+            except select.error as ex:
                 if ex[0] != errno.EINTR and ex[0] != errno.EAGAIN:
-                    raise NetBIOSError, ( 'Error occurs while reading from remote', ERRCLASS_OS, ex[0] )
+                    raise NetBIOSError( 'Error occurs while reading from remote', ERRCLASS_OS, ex[0])
 
         return data
 
@@ -974,7 +976,7 @@ def main():
                 
     
     n = get_netbios_host_by_name("some-host")
-    print n
+    print(n)
 
 if __name__ == '__main__':
     main()
index 8376644..8845e9d 100644 (file)
@@ -1,3 +1,4 @@
+from __future__ import print_function
 # Copyright (c) 2003-2016 CORE Security Technologies:
 #
 # This software is provided under under a slightly modified version
@@ -17,8 +18,8 @@ from impacket.structure import Structure
 from impacket import LOG
 
 
-# This is important. NTLMv2 is not negotiated by the client or server. 
-# It is used if set locally on both sides. Change this item if you don't want to use 
+# This is important. NTLMv2 is not negotiated by the client or server.
+# It is used if set locally on both sides. Change this item if you don't want to use
 # NTLMv2 by default and fall back to NTLMv1 (with EXTENDED_SESSION_SECURITY or not)
 # Check the following links:
 # http://davenport.sourceforge.net/ntlm.html
@@ -209,7 +210,7 @@ class AV_PAIRS():
         self.fields[key] = (len(value),value)
 
     def __getitem__(self, key):
-        if self.fields.has_key(key):
+        if key in self.fields:
            return self.fields[key]
         return None
 
@@ -236,16 +237,16 @@ class AV_PAIRS():
 
     def dump(self):
         for i in self.fields.keys():
-            print "%s: {%r}" % (i,self[i])
+            print("%s: {%r}" % (i,self[i]))
 
     def getData(self):
-        if self.fields.has_key(NTLMSSP_AV_EOL):
+        if NTLMSSP_AV_EOL in self.fields:
             del self.fields[NTLMSSP_AV_EOL]
         ans = ''
         for i in self.fields.keys():
             ans+= struct.pack('<HH', i, self[i][0])
             ans+= self[i][1]
+
         # end with a NTLMSSP_AV_EOL
         ans += struct.pack('<HH', NTLMSSP_AV_EOL, 0)
 
@@ -260,7 +261,7 @@ class NTLMAuthMixin:
             minor_v = struct.unpack('B',self['os_version'][1])[0]
             build_v = struct.unpack('H',self['os_version'][2:4])
             return (mayor_v,minor_v,build_v)
-        
+
 class NTLMAuthNegotiate(Structure, NTLMAuthMixin):
 
     structure = (
@@ -276,7 +277,7 @@ class NTLMAuthNegotiate(Structure, NTLMAuthMixin):
         ('os_version',':'),
         ('host_name',':'),
         ('domain_name',':'))
-                                                                                
+
     def __init__(self):
         Structure.__init__(self)
         self['flags']= (
@@ -293,7 +294,7 @@ class NTLMAuthNegotiate(Structure, NTLMAuthMixin):
         self['host_name']=''
         self['domain_name']=''
         self['os_version']=''
-    
+
     def getData(self):
         if len(self.fields['host_name']) > 0:
             self['flags'] |= NTLMSSP_NEGOTIATE_OEM_WORKSTATION_SUPPLIED
@@ -342,7 +343,7 @@ class NTLMAuthChallenge(Structure):
         ('TargetInfoFields_len','<H-TargetInfoFields'),
         ('TargetInfoFields_max_len','<H-TargetInfoFields'),
         ('TargetInfoFields_offset','<L'),
-        ('VersionLen','_-Version','self.checkVersion(self["flags"])'), 
+        ('VersionLen','_-Version','self.checkVersion(self["flags"])'),
         ('Version',':'),
         ('domain_name',':'),
         ('TargetInfoFields',':'))
@@ -365,11 +366,11 @@ class NTLMAuthChallenge(Structure):
         self['TargetInfoFields'] = self['TargetInfoFields'][:self['TargetInfoFields_len']]
         # We gotta process the TargetInfoFields
         #if self['TargetInfoFields_len'] > 0:
-        #    av_pairs = AV_PAIRS(self['TargetInfoFields'][:self['TargetInfoFields_len']]) 
+        #    av_pairs = AV_PAIRS(self['TargetInfoFields'][:self['TargetInfoFields_len']])
         #    self['TargetInfoFields'] = av_pairs
 
         return self
-        
+
 class NTLMAuthChallengeResponse(Structure, NTLMAuthMixin):
 
     structure = (
@@ -394,7 +395,7 @@ class NTLMAuthChallengeResponse(Structure, NTLMAuthMixin):
         ('session_key_max_len','<H-session_key'),
         ('session_key_offset','<L'),
         ('flags','<L'),
-        ('VersionLen','_-Version','self.checkVersion(self["flags"])'), 
+        ('VersionLen','_-Version','self.checkVersion(self["flags"])'),
         ('Version',':=""'),
         ('MICLen','_-MIC','self.checkMIC(self["flags"])'),
         ('MIC',':=""'),
@@ -424,7 +425,7 @@ class NTLMAuthChallengeResponse(Structure, NTLMAuthMixin):
            # NTLMSSP_TARGET      |
            0)
         # Here we do the stuff
-        if username and ( lmhash != '' or nthash != ''):            
+        if username and ( lmhash != '' or nthash != ''):
             self['lanman'] = get_ntlmv1_response(lmhash, challenge)
             self['ntlm'] = get_ntlmv1_response(nthash, challenge)
         elif (username and password):
@@ -450,7 +451,7 @@ class NTLMAuthChallengeResponse(Structure, NTLMAuthMixin):
            if flags & NTLMSSP_NEGOTIATE_VERSION == 0:
               return 0
         return 16
-                                                                                
+
     def getData(self):
         self['domain_offset']=64+self.checkMIC(self["flags"])+self.checkVersion(self["flags"])
         self['user_offset']=64+self.checkMIC(self["flags"])+self.checkVersion(self["flags"])+len(self['domain_name'])
@@ -463,7 +464,7 @@ class NTLMAuthChallengeResponse(Structure, NTLMAuthMixin):
     def fromString(self,data):
         Structure.fromString(self,data)
         # [MS-NLMP] page 27
-        # Payload data can be present in any order within the Payload field, 
+        # Payload data can be present in any order within the Payload field,
         # with variable-length padding before or after the data
 
         domain_offset = self['domain_offset']
@@ -478,15 +479,15 @@ class NTLMAuthChallengeResponse(Structure, NTLMAuthMixin):
         user_end    = self['user_len'] + user_offset
         self['user_name'] = data[ user_offset: user_end ]
 
-        ntlm_offset = self['ntlm_offset'] 
-        ntlm_end    = self['ntlm_len'] + ntlm_offset 
+        ntlm_offset = self['ntlm_offset']
+        ntlm_end    = self['ntlm_len'] + ntlm_offset
         self['ntlm'] = data[ ntlm_offset : ntlm_end ]
 
-        lanman_offset = self['lanman_offset'] 
+        lanman_offset = self['lanman_offset']
         lanman_end    = self['lanman_len'] + lanman_offset
         self['lanman'] = data[ lanman_offset : lanman_end]
 
-        #if len(data) >= 36: 
+        #if len(data) >= 36:
         #    self['os_version'] = data[32:36]
         #else:
         #    self['os_version'] = ''
@@ -607,11 +608,11 @@ def getNTLMSSPType3(type1, type2, user, password, domain, lmhash = '', nthash =
     # Let's start with the original flags sent in the type1 message
     responseFlags = type1['flags']
 
-    # Token received and parsed. Depending on the authentication 
+    # Token received and parsed. Depending on the authentication
     # method we will create a valid ChallengeResponse
     ntlmChallengeResponse = NTLMAuthChallengeResponse(user, password, ntlmChallenge['challenge'])
 
-    clientChallenge = "".join([random.choice(string.digits+string.letters) for i in xrange(8)])
+    clientChallenge = "".join([random.choice(string.digits+string.letters) for i in range(8)])
 
     serverName = ntlmChallenge['TargetInfoFields']
 
@@ -647,7 +648,7 @@ def getNTLMSSPType3(type1, type2, user, password, domain, lmhash = '', nthash =
     if ntlmChallenge['flags'] & NTLMSSP_NEGOTIATE_KEY_EXCH:
        # not exactly what I call random tho :\
        # exportedSessionKey = this is the key we should use to sign
-       exportedSessionKey = "".join([random.choice(string.digits+string.letters) for i in xrange(16)])
+       exportedSessionKey = "".join([random.choice(string.digits+string.letters) for i in range(16)])
        #exportedSessionKey = "A"*16
        #print "keyExchangeKey %r" % keyExchangeKey
        # Let's generate the right session key based on the challenge flags
@@ -677,7 +678,7 @@ def getNTLMSSPType3(type1, type2, user, password, domain, lmhash = '', nthash =
     ntlmChallengeResponse['domain_name'] = domain.encode('utf-16le')
     ntlmChallengeResponse['lanman'] = lmResponse
     ntlmChallengeResponse['ntlm'] = ntResponse
-    if encryptedRandomSessionKey is not None: 
+    if encryptedRandomSessionKey is not None:
         ntlmChallengeResponse['session_key'] = encryptedRandomSessionKey
 
     return ntlmChallengeResponse, exportedSessionKey
@@ -688,13 +689,13 @@ def getNTLMSSPType3(type1, type2, user, password, domain, lmhash = '', nthash =
 def generateSessionKeyV1(password, lmhash, nthash):
     if POW:
         hash = POW.Digest(POW.MD4_DIGEST)
-    else:        
+    else:
         hash = MD4.new()
     hash.update(NTOWFv1(password, lmhash, nthash))
     return hash.digest()
-    
+
 def computeResponseNTLMv1(flags, serverChallenge, clientChallenge, serverName, domain, user, password, lmhash='', nthash='', use_ntlmv2 = USE_NTLMv2):
-    if (user == '' and password == ''): 
+    if (user == '' and password == ''):
         # Special case for anonymous authentication
         lmResponse = ''
         ntResponse = ''
@@ -713,7 +714,7 @@ def computeResponseNTLMv1(flags, serverChallenge, clientChallenge, serverName, d
         else:
            ntResponse = get_ntlmv1_response(nthash,serverChallenge)
            lmResponse = get_ntlmv1_response(lmhash, serverChallenge)
-   
+
     sessionBaseKey = generateSessionKeyV1(password, lmhash, nthash)
     return ntResponse, lmResponse, sessionBaseKey
 
@@ -727,7 +728,7 @@ def compute_lmhash(password):
 def NTOWFv1(password, lmhash = '', nthash=''):
     if nthash != '':
        return nthash
-    return compute_nthash(password)   
+    return compute_nthash(password)
 
 def LMOWFv1(password, lmhash = '', nthash=''):
     if lmhash != '':
@@ -738,13 +739,15 @@ def compute_nthash(password):
     # This is done according to Samba's encryption specification (docs/html/ENCRYPTION.html)
     try:
         password = unicode(password).encode('utf_16le')
+    except NameError:  # unicode() was removed in Python 3
+        password = str(password).encode('utf_16le')
     except UnicodeDecodeError:
         import sys
         password = password.decode(sys.getfilesystemencoding()).encode('utf_16le')
 
     if POW:
         hash = POW.Digest(POW.MD4_DIGEST)
-    else:        
+    else:
         hash = MD4.new()
     hash.update(password)
     return hash.digest()
@@ -780,7 +783,7 @@ def MAC(flags, handle, signingKey, seqNum, message):
        messageSignature['SeqNum'] = handle('\x00\x00\x00\x00')
        messageSignature['SeqNum'] = struct.unpack('<i',messageSignature['SeqNum'])[0] ^ seqNum
        messageSignature['RandomPad'] = 0
-       
+
    return messageSignature
 
 def SEAL(flags, signingKey, sealingKey, messageToSign, messageToEncrypt, seqNum, handle):
@@ -863,7 +866,7 @@ def KXKEY(flags, sessionBaseKey, lmChallengeResponse, serverChallenge, password,
        raise "Can't create a valid KXKEY!"
 
    return keyExchangeKey
-      
+
 def hmac_md5(key, data):
     if POW:
         h = POW.Hmac(POW.MD5_DIGEST, key)
@@ -878,7 +881,7 @@ def hmac_md5(key, data):
 
 def NTOWFv2( user, password, domain, hash = ''):
     if hash != '':
-       theHash = hash 
+       theHash = hash
     else:
        theHash = compute_nthash(password)
     return hmac_md5(theHash, user.upper().encode('utf-16le') + domain.encode('utf-16le'))
@@ -907,7 +910,7 @@ def computeResponseNTLMv2(flags, serverChallenge, clientChallenge,  serverName,
        #aTime = '\x00'*8
        av_pairs[NTLMSSP_AV_TIME] = aTime
     serverName = av_pairs.getData()
-          
+
     ######################
     #aTime = '\x00'*8
     ######################
@@ -937,20 +940,20 @@ class NTLM_HTTP(object):
         if msg_64 != '':
             msg = base64.b64decode(msg_64[5:]) # Remove the 'NTLM '
             msg_type = ord(msg[8])
-    
+
         for _cls in NTLM_HTTP.__subclasses__():
             if msg_type == _cls.MSG_TYPE:
                 instance = _cls()
                 instance.fromString(msg)
                 return instance
 
-    
+
 class NTLM_HTTP_AuthRequired(NTLM_HTTP):
     commonHdr = ()
     # Message 0 means the first HTTP request e.g. 'GET /bla.png'
     MSG_TYPE = 0
 
-    def fromString(self,data): 
+    def fromString(self,data):
         pass
 
 
@@ -968,4 +971,3 @@ class NTLM_HTTP_AuthChallengeResponse(NTLM_HTTP, NTLMAuthChallengeResponse):
 
     def __init__(self):
         NTLMAuthChallengeResponse.__init__(self)
-
index 95efb2c..c4ea6fc 100644 (file)
@@ -629,9 +629,9 @@ class SharedFile:
     @staticmethod
     def __convert_smbtime(t):
         x = t >> 32
-        y = t & 0xffffffffL
+        y = t & 0xffffffff
         geo_cal_offset = 11644473600.0  # = 369.0 * 365.25 * 24 * 60 * 60 - (3.0 * 24 * 60 * 60 + 6.0 * 60 * 60)
-        return (x * 4.0 * (1 << 30) + (y & 0xfff00000L)) * 1.0e-7 - geo_cal_offset
+        return (x * 4.0 * (1 << 30) + (y & 0xfff00000)) * 1.0e-7 - geo_cal_offset
 
 
 # Contain information about a SMB machine
@@ -676,12 +676,12 @@ class NewSMBPacket(Structure):
     def __init__(self, **kargs):
         Structure.__init__(self, **kargs)
 
-        if self.fields.has_key('Flags2') is False:
+        if ('Flags2' in self.fields) is False:
              self['Flags2'] = 0
-        if self.fields.has_key('Flags1') is False:
+        if ('Flags1' in self.fields) is False:
              self['Flags1'] = 0
 
-        if not kargs.has_key('data'):
+        if 'data' not in kargs:
             self['Data'] = []
 
     def addCommand(self, command):
@@ -709,9 +709,9 @@ class NewSMBPacket(Structure):
                 return 1
             elif self.isMoreProcessingRequired():
                 return 1
-            raise SessionError("SMB Library Error", self['ErrorClass'] + (self['_reserved'] << 8), self['ErrorCode'], self['Flags2'] & SMB.FLAGS2_NT_STATUS)
+            raise SessionError("SMB Library Error", self['ErrorClass'] + (self['_reserved'] << 8), self['ErrorCode'], self['Flags2'] & SMB.FLAGS2_NT_STATUS)
         else:
-            raise UnsupportedFeature("Unexpected answer from server: Got %d, Expected %d" % (self['Command'], cmd))
+            raise UnsupportedFeature("Unexpected answer from server: Got %d, Expected %d" % (self['Command'], cmd))
 
 
 class SMBCommand(Structure):
@@ -2550,7 +2550,7 @@ class SMB:
                     if s.get_error_class() == 0x00 and s.get_error_code() == 0x00:
                         return 1
                     else:
-                        raise SessionError, ( "SMB Library Error", s.get_error_class()+ (s.get_reserved() << 8), s.get_error_code() , s.get_flags2() & SMB.FLAGS2_NT_STATUS )
+                        raise SessionError( "SMB Library Error", s.get_error_class()+ (s.get_reserved() << 8), s.get_error_code() , s.get_flags2() & SMB.FLAGS2_NT_STATUS)
                 else:
                     break
         return 0
@@ -2583,7 +2583,7 @@ class SMB:
                         self.__server_name = self._dialects_data['ServerName']
 
                     if self._dialects_parameters['DialectIndex'] == 0xffff:
-                        raise UnsupportedFeature,"Remote server does not know NT LM 0.12"
+                        raise UnsupportedFeature("Remote server does not know NT LM 0.12")
                     return 1
             else:
                 return 0
@@ -2734,7 +2734,7 @@ class SMB:
         self._SigningSessionKey = key
 
     def get_encryption_key(self):
-        if self._dialects_data.fields.has_key('Challenge'):
+        if 'Challenge' in self._dialects_data.fields:
             return self._dialects_data['Challenge']
         else:
             return None
@@ -3241,7 +3241,7 @@ class SMB:
                        pass
 
             # Parse Version to know the target Operating system name. Not provided elsewhere anymore
-            if ntlmChallenge.fields.has_key('Version'):
+            if 'Version' in ntlmChallenge.fields:
                 version = ntlmChallenge['Version']
 
                 if len(version) >= 4:
index 5548e4b..d81c7e1 100644 (file)
@@ -1,3 +1,4 @@
+from __future__ import print_function
 # Copyright (c) 2003-2016 CORE Security Technologies
 #
 # This software is provided under under a slightly modified version
@@ -231,13 +232,13 @@ class SMB3:
             self.negotiateSession(preferredDialect)
 
     def printStatus(self):
-        print "CONNECTION"
+        print("CONNECTION")
         for i in self._Connection.items():
-            print "%-40s : %s" % i
-        print
-        print "SESSION"
+            print("%-40s : %s" % i)
+        print()
+        print("SESSION")
         for i in self._Session.items():
-            print "%-40s : %s" % i
+            print("%-40s : %s" % i)
 
     def getServerName(self):
         return self._Session['ServerName']
@@ -308,7 +309,7 @@ class SMB3:
         packet['SessionID'] = self._Session['SessionID']
 
         # Default the credit charge to 1 unless set by the caller
-        if packet.fields.has_key('CreditCharge') is False:
+        if ('CreditCharge' in packet.fields) is False:
             packet['CreditCharge'] = 1
 
         # Standard credit request after negotiating protocol
@@ -318,7 +319,7 @@ class SMB3:
         messageId = packet['MessageID']
 
         if self._Session['SigningActivated'] is True and self._Connection['SequenceWindow'] > 2:
-            if packet['TreeID'] > 0 and self._Session['TreeConnectTable'].has_key(packet['TreeID']) is True:
+            if packet['TreeID'] > 0 and (packet['TreeID'] in self._Session['TreeConnectTable']) is True:
                 if self._Session['TreeConnectTable'][packet['TreeID']]['EncryptData'] is False:
                     packet['Flags'] = SMB2_FLAGS_SIGNED
                     self.signSMB(packet)
@@ -350,7 +351,7 @@ class SMB3:
 
     def recvSMB(self, packetID = None):
         # First, verify we don't have the packet already
-        if self._Connection['OutstandingResponses'].has_key(packetID):
+        if packetID in self._Connection['OutstandingResponses']:
             return self._Connection['OutstandingResponses'].pop(packetID) 
 
         data = self._NetBIOSSession.recv_packet(self._timeout) 
@@ -727,7 +728,7 @@ class SMB3:
                        pass 
 
                 # Parse Version to know the target Operating system name. Not provided elsewhere anymore
-                if ntlmChallenge.fields.has_key('Version'):
+                if 'Version' in ntlmChallenge.fields:
                     version = ntlmChallenge['Version']
 
                     if len(version) >= 4:
@@ -785,7 +786,7 @@ class SMB3:
 
         #print self._Session['TreeConnectTable']
         share = share.split('\\')[-1]
-        if self._Session['TreeConnectTable'].has_key(share):
+        if share in self._Session['TreeConnectTable']:
             # Already connected, no need to reconnect
             treeEntry =  self._Session['TreeConnectTable'][share]
             treeEntry['NumberOfUses'] += 1
@@ -837,10 +838,10 @@ class SMB3:
            return packet['TreeID'] 
 
     def disconnectTree(self, treeId):
-        if self._Session['TreeConnectTable'].has_key(treeId) is False:
+        if (treeId in self._Session['TreeConnectTable']) is False:
             raise SessionError(STATUS_INVALID_PARAMETER)
 
-        if self._Session['TreeConnectTable'].has_key(treeId):
+        if treeId in self._Session['TreeConnectTable']:
             # More than 1 use? descrease it and return, if not, send the packet
             if self._Session['TreeConnectTable'][treeId]['NumberOfUses'] > 1:
                 treeEntry =  self._Session['TreeConnectTable'][treeId]
@@ -862,7 +863,7 @@ class SMB3:
             return True
 
     def create(self, treeId, fileName, desiredAccess, shareMode, creationOptions, creationDisposition, fileAttributes, impersonationLevel = SMB2_IL_IMPERSONATION, securityFlags = 0, oplockLevel = SMB2_OPLOCK_LEVEL_NONE, createContexts = None):
-        if self._Session['TreeConnectTable'].has_key(treeId) is False:
+        if (treeId in self._Session['TreeConnectTable']) is False:
             raise SessionError(STATUS_INVALID_PARAMETER)
 
         fileName = string.replace(fileName, '/', '\\')
@@ -885,7 +886,7 @@ class SMB3:
            # Is this file NOT on the root directory?
            if len(fileName.split('\\')) > 2:
                parentDir = ntpath.dirname(pathName)
-           if self.GlobalFileTable.has_key(parentDir):
+           if parentDir in self.GlobalFileTable:
                LOG.critical("Don't know what to do now! :-o")
                raise
            else:
@@ -957,9 +958,9 @@ class SMB3:
             return str(createResponse['FileID'])
 
     def close(self, treeId, fileId):
-        if self._Session['TreeConnectTable'].has_key(treeId) is False:
+        if (treeId in self._Session['TreeConnectTable']) is False:
             raise SessionError(STATUS_INVALID_PARAMETER)
-        if self._Session['OpenTable'].has_key(fileId) is False:
+        if (fileId in self._Session['OpenTable']) is False:
             raise SessionError(STATUS_INVALID_PARAMETER)
 
         packet = self.SMB_PACKET()
@@ -988,9 +989,9 @@ class SMB3:
         # This function should NOT be used for reading files directly, but another higher
         # level function should be used that will break the read into smaller pieces
 
-        if self._Session['TreeConnectTable'].has_key(treeId) is False:
+        if (treeId in self._Session['TreeConnectTable']) is False:
             raise SessionError(STATUS_INVALID_PARAMETER)
-        if self._Session['OpenTable'].has_key(fileId) is False:
+        if (fileId in self._Session['OpenTable']) is False:
             raise SessionError(STATUS_INVALID_PARAMETER)
 
         packet = self.SMB_PACKET()
@@ -1030,9 +1031,9 @@ class SMB3:
         # This function should NOT be used for writing directly to files, but another higher
         # level function should be used that will break the writes into smaller pieces
 
-        if self._Session['TreeConnectTable'].has_key(treeId) is False:
+        if (treeId in self._Session['TreeConnectTable']) is False:
             raise SessionError(STATUS_INVALID_PARAMETER)
-        if self._Session['OpenTable'].has_key(fileId) is False:
+        if (fileId in self._Session['OpenTable']) is False:
             raise SessionError(STATUS_INVALID_PARAMETER)
 
         packet = self.SMB_PACKET()
@@ -1071,9 +1072,9 @@ class SMB3:
             return bytesWritten
 
     def queryDirectory(self, treeId, fileId, searchString = '*', resumeIndex = 0, informationClass = FILENAMES_INFORMATION, maxBufferSize = None, enumRestart = False, singleEntry = False):
-        if self._Session['TreeConnectTable'].has_key(treeId) is False:
+        if (treeId in self._Session['TreeConnectTable']) is False:
             raise SessionError(STATUS_INVALID_PARAMETER)
-        if self._Session['OpenTable'].has_key(fileId) is False:
+        if (fileId in self._Session['OpenTable']) is False:
             raise SessionError(STATUS_INVALID_PARAMETER)
 
         packet = self.SMB_PACKET()
@@ -1124,12 +1125,12 @@ class SMB3:
         self.sendSMB(packet)
 
     def ioctl(self, treeId, fileId = None, ctlCode = -1, flags = 0, inputBlob = '',  maxInputResponse = None, maxOutputResponse = None, waitAnswer = 1):
-        if self._Session['TreeConnectTable'].has_key(treeId) is False:
+        if (treeId in self._Session['TreeConnectTable']) is False:
             raise SessionError(STATUS_INVALID_PARAMETER)
         if fileId is None:
             fileId = '\xff'*16
         else:
-            if self._Session['OpenTable'].has_key(fileId) is False:
+            if (fileId in self._Session['OpenTable']) is False:
                 raise SessionError(STATUS_INVALID_PARAMETER)
 
         packet = self.SMB_PACKET()
@@ -1165,9 +1166,9 @@ class SMB3:
             return smbIoctlResponse['Buffer']
 
     def flush(self,treeId, fileId):
-        if self._Session['TreeConnectTable'].has_key(treeId) is False:
+        if (treeId in self._Session['TreeConnectTable']) is False:
             raise SessionError(STATUS_INVALID_PARAMETER)
-        if self._Session['OpenTable'].has_key(fileId) is False:
+        if (fileId in self._Session['OpenTable']) is False:
             raise SessionError(STATUS_INVALID_PARAMETER)
 
         packet = self.SMB_PACKET()
@@ -1186,9 +1187,9 @@ class SMB3:
             return True
 
     def lock(self, treeId, fileId, locks, lockSequence = 0):
-        if self._Session['TreeConnectTable'].has_key(treeId) is False:
+        if (treeId in self._Session['TreeConnectTable']) is False:
             raise SessionError(STATUS_INVALID_PARAMETER)
-        if self._Session['OpenTable'].has_key(fileId) is False:
+        if (fileId in self._Session['OpenTable']) is False:
             raise SessionError(STATUS_INVALID_PARAMETER)
 
         packet = self.SMB_PACKET()
@@ -1248,9 +1249,9 @@ class SMB3:
             return True
 
     def queryInfo(self, treeId, fileId, inputBlob = '', infoType = SMB2_0_INFO_FILE, fileInfoClass = SMB2_FILE_STANDARD_INFO, additionalInformation = 0, flags = 0 ):
-        if self._Session['TreeConnectTable'].has_key(treeId) is False:
+        if (treeId in self._Session['TreeConnectTable']) is False:
             raise SessionError(STATUS_INVALID_PARAMETER)
-        if self._Session['OpenTable'].has_key(fileId) is False:
+        if (fileId in self._Session['OpenTable']) is False:
             raise SessionError(STATUS_INVALID_PARAMETER)
 
         packet = self.SMB_PACKET()
@@ -1280,9 +1281,9 @@ class SMB3:
             return queryResponse['Buffer']
 
     def setInfo(self, treeId, fileId, inputBlob = '', infoType = SMB2_0_INFO_FILE, fileInfoClass = SMB2_FILE_STANDARD_INFO, additionalInformation = 0 ):
-        if self._Session['TreeConnectTable'].has_key(treeId) is False:
+        if (treeId in self._Session['TreeConnectTable']) is False:
             raise SessionError(STATUS_INVALID_PARAMETER)
-        if self._Session['OpenTable'].has_key(fileId) is False:
+        if (fileId in self._Session['OpenTable']) is False:
             raise SessionError(STATUS_INVALID_PARAMETER)
 
         packet = self.SMB_PACKET()
@@ -1385,7 +1386,7 @@ class SMB3:
                         files.append(smb.SharedFile(fileInfo['CreationTime'],fileInfo['LastAccessTime'],fileInfo['LastChangeTime'],fileInfo['EndOfFile'],fileInfo['AllocationSize'],fileInfo['ExtFileAttributes'],fileInfo['FileName'].decode('utf-16le'), fileInfo['FileName'].decode('utf-16le')))
                         nextOffset = fileInfo['NextEntryOffset']
                         res = res[nextOffset:]
-                except SessionError, e:
+                except SessionError as e:
                     if (e.get_error_code()) != STATUS_NO_MORE_FILES:
                         raise
                     break 
@@ -1512,7 +1513,7 @@ class SMB3:
 
     def waitNamedPipe(self, treeId, pipename, timeout = 5):
         pipename = ntpath.basename(pipename)
-        if self._Session['TreeConnectTable'].has_key(treeId) is False:
+        if (treeId in self._Session['TreeConnectTable']) is False:
             raise SessionError(STATUS_INVALID_PARAMETER)
         if len(pipename) > 0xffff:
             raise SessionError(STATUS_INVALID_PARAMETER)
index aa795e5..3473c9f 100644 (file)
@@ -54,6 +54,12 @@ from impacket.nt_errors import STATUS_NO_MORE_FILES, STATUS_NETWORK_NAME_DELETED
 STATUS_SMB_BAD_UID = 0x005B0002
 STATUS_SMB_BAD_TID = 0x00050002
 
+try:
+    unicode        # Python 2
+except NameError:
+    unicode = str  # Python 3
+
+
 # Utility functions
 # and general functions.
 # There are some common functions that can be accessed from more than one SMB
@@ -80,7 +86,7 @@ def outputToJohnFormat(challenge, username, domain, lmresponse, ntresponse):
             else:
                 # NTLMv1
                 ret_value = {'hash_string':'%s::%s:%s:%s:%s' % (username, domain, hexlify(lmresponse), hexlify(ntresponse), hexlify(challenge)), 'hash_version':'ntlm'}
-        except Exception, e:
+        except Exception as e:
             LOG.error("outputToJohnFormat: %s" % e)
             pass
 
@@ -183,7 +189,7 @@ def openFile(path,fileName, accessMode, fileAttributes, openMode):
         if sys.platform == 'win32':
             mode |= os.O_BINARY
         fid = os.open(pathName, mode)
-    except Exception, e:
+    except Exception as e:
         LOG.error("openFile: %s,%s" % (pathName, mode) ,e)
         fid = 0
         errorCode = STATUS_ACCESS_DENIED
@@ -442,7 +448,7 @@ def queryPathInformation(path, filename, level):
     else:
         # NOT FOUND
         return None, STATUS_OBJECT_NAME_NOT_FOUND
-  except Exception, e:
+  except Exception as e:
       LOG.error('queryPathInfo: %s' % e)
       raise
 
@@ -486,7 +492,7 @@ class TRANSCommands:
                     # (beto) If offset == 0 it crashes explorer.exe on windows 7
                     entry['RemarkOffsetLow'] = 20 * len(shares) + len(tailData)
                     respData += entry.getData()
-                    if shares[i].has_key('comment'):
+                    if 'comment' in shares[i]:
                         tailData += shares[i]['comment'] + '\x00'
                     else:
                         tailData += '\x00'
@@ -511,7 +517,7 @@ class TRANSCommands:
             shareInfo['NetworkName'] = request['ShareName'].upper() + '\x00'
             shareInfo['Type']        = int(share['share type'])
             respData = shareInfo.getData()
-            if share.has_key('comment'):
+            if 'comment' in share:
                 shareInfo['RemarkOffsetLow'] = len(respData)
                 respData += share['comment'] + '\x00'
             respParameters['TotalBytesAvailable'] = len(respData)
@@ -538,7 +544,7 @@ class TRANSCommands:
         # Extract the FID
         fid = struct.unpack('<H', transParameters['Setup'][2:])[0]
 
-        if connData['OpenedFiles'].has_key(fid):
+        if fid in connData['OpenedFiles']:
             fileHandle = connData['OpenedFiles'][fid]['FileHandle']
             if fileHandle != PIPE_FILE_DESCRIPTOR:
                 os.write(fileHandle,data)
@@ -566,7 +572,7 @@ class TRANS2Commands:
         respData = ''
         errorCode = STATUS_SUCCESS
         setPathInfoParameters = smb.SMBSetPathInformation_Parameters(flags = recvPacket['Flags2'], data = parameters)
-        if connData['ConnectedShares'].has_key(recvPacket['Tid']):
+        if recvPacket['Tid'] in connData['ConnectedShares']:
             path     = connData['ConnectedShares'][recvPacket['Tid']]['path']
             fileName = decodeSMBString(recvPacket['Flags2'], setPathInfoParameters['FileName'])
             fileName = os.path.normpath(fileName.replace('\\','/'))
@@ -619,8 +625,8 @@ class TRANS2Commands:
         errorCode = STATUS_SUCCESS
         setFileInfoParameters = smb.SMBSetFileInformation_Parameters(parameters)
 
-        if connData['ConnectedShares'].has_key(recvPacket['Tid']):
-            if connData['OpenedFiles'].has_key(setFileInfoParameters['FID']):
+        if recvPacket['Tid'] in connData['ConnectedShares']:
+            if setFileInfoParameters['FID'] in connData['OpenedFiles']:
                 fileName = connData['OpenedFiles'][setFileInfoParameters['FID']]['FileName']
                 informationLevel = setFileInfoParameters['InformationLevel']
                 if informationLevel == smb.SMB_SET_FILE_DISPOSITION_INFO:
@@ -675,8 +681,8 @@ class TRANS2Commands:
 
         queryFileInfoParameters = smb.SMBQueryFileInformation_Parameters(parameters)
 
-        if connData['ConnectedShares'].has_key(recvPacket['Tid']):
-            if connData['OpenedFiles'].has_key(queryFileInfoParameters['FID']):
+        if recvPacket['Tid'] in connData['ConnectedShares']:
+            if queryFileInfoParameters['FID'] in connData['OpenedFiles']:
                 fileName = connData['OpenedFiles'][queryFileInfoParameters['FID']]['FileName']
 
                 infoRecord, errorCode = queryFileInformation('', fileName, queryFileInfoParameters['InformationLevel'])
@@ -704,11 +710,11 @@ class TRANS2Commands:
 
         queryPathInfoParameters = smb.SMBQueryPathInformation_Parameters(flags = recvPacket['Flags2'], data = parameters)
 
-        if connData['ConnectedShares'].has_key(recvPacket['Tid']):
+        if recvPacket['Tid'] in connData['ConnectedShares']:
             path = connData['ConnectedShares'][recvPacket['Tid']]['path']
             try:
                infoRecord, errorCode = queryPathInformation(path, decodeSMBString(recvPacket['Flags2'], queryPathInfoParameters['FileName']), queryPathInfoParameters['InformationLevel'])
-            except Exception, e:
+            except Exception as e:
                smbServer.log("queryPathInformation: %s" % e,logging.ERROR)
 
             if infoRecord is not None:
@@ -726,7 +732,7 @@ class TRANS2Commands:
         connData = smbServer.getConnectionData(connId)
         errorCode = 0
         # Get the Tid associated
-        if connData['ConnectedShares'].has_key(recvPacket['Tid']):
+        if recvPacket['Tid'] in connData['ConnectedShares']:
             data = queryFsInformation(connData['ConnectedShares'][recvPacket['Tid']]['path'], '', struct.unpack('<H',parameters)[0])
 
         smbServer.setConnectionData(connId, connData)
@@ -744,8 +750,8 @@ class TRANS2Commands:
         findNext2Parameters = smb.SMBFindNext2_Parameters(flags = recvPacket['Flags2'], data = parameters)
 
         sid = findNext2Parameters['SID']
-        if connData['ConnectedShares'].has_key(recvPacket['Tid']):
-            if connData['SIDs'].has_key(sid):
+        if recvPacket['Tid'] in connData['ConnectedShares']:
+            if sid in connData['SIDs']:
                 searchResult = connData['SIDs'][sid]
                 respParameters = smb.SMBFindNext2Response_Parameters()
                 endOfSearch = 1
@@ -790,7 +796,7 @@ class TRANS2Commands:
         respData = ''
         findFirst2Parameters = smb.SMBFindFirst2_Parameters( recvPacket['Flags2'], data = parameters)
 
-        if connData['ConnectedShares'].has_key(recvPacket['Tid']):
+        if recvPacket['Tid'] in connData['ConnectedShares']:
             path = connData['ConnectedShares'][recvPacket['Tid']]['path']
 
             searchResult, searchCount, errorCode = findFirst2(path,
@@ -881,7 +887,7 @@ class SMBCommands:
             else:
                 command = struct.unpack('<H', transParameters['Setup'][:2])[0]
 
-            if transCommands.has_key(command):
+            if command in transCommands:
                # Call the TRANS subcommand
                setup = ''
                parameters = ''
@@ -893,7 +899,7 @@ class SMBCommands:
                                 transData['Trans_Parameters'],
                                 transData['Trans_Data'],
                                 transParameters['MaxDataCount'])
-               except Exception, e:
+               except Exception as e:
                    #print 'Transaction: %s' % e,e
                    smbServer.log('Transaction: (%r,%s)' % (command, e), logging.ERROR)
                    errorCode = STATUS_ACCESS_DENIED
@@ -1018,7 +1024,7 @@ class SMBCommands:
 
             # Call the handler for this TRANSACTION
             command = NTTransParameters['Function']
-            if transCommands.has_key(command):
+            if command in transCommands:
                # Call the NT TRANS subcommand
                setup = ''
                parameters = ''
@@ -1030,7 +1036,7 @@ class SMBCommands:
                                 NTTransData['NT_Trans_Parameters'],
                                 NTTransData['NT_Trans_Data'],
                                 NTTransParameters['MaxDataCount'])
-               except Exception, e:
+               except Exception as e:
                    smbServer.log('NTTransaction: (0x%x,%s)' % (command, e), logging.ERROR)
                    errorCode = STATUS_ACCESS_DENIED
                    #raise
@@ -1157,7 +1163,7 @@ class SMBCommands:
 
             # Call the handler for this TRANSACTION
             command = struct.unpack('<H', trans2Parameters['Setup'])[0]
-            if transCommands.has_key(command):
+            if command in transCommands:
                # Call the TRANS2 subcommand
                try:
                    setup, parameters, data, errorCode = transCommands[command](connId,
@@ -1166,7 +1172,7 @@ class SMBCommands:
                                 trans2Data['Trans_Parameters'],
                                 trans2Data['Trans_Data'],
                                 trans2Parameters['MaxDataCount'])
-               except Exception, e:
+               except Exception as e:
                    smbServer.log('Transaction2: (0x%x,%s)' % (command, e), logging.ERROR)
                    #import traceback
                    #traceback.print_exc()
@@ -1282,7 +1288,7 @@ class SMBCommands:
 
         comClose =  smb.SMBClose_Parameters(SMBCommand['Parameters'])
 
-        if connData['OpenedFiles'].has_key(comClose['FID']):
+        if comClose['FID'] in connData['OpenedFiles']:
              errorCode = STATUS_SUCCESS
              fileHandle = connData['OpenedFiles'][comClose['FID']]['FileHandle']
              try:
@@ -1290,7 +1296,7 @@ class SMBCommands:
                      connData['OpenedFiles'][comClose['FID']]['Socket'].close()
                  elif fileHandle != VOID_FILE_DESCRIPTOR:
                      os.close(fileHandle)
-             except Exception, e:
+             except Exception as e:
                  smbServer.log("comClose %s" % e, logging.ERROR)
                  errorCode = STATUS_ACCESS_DENIED
              else:
@@ -1298,7 +1304,7 @@ class SMBCommands:
                  if connData['OpenedFiles'][comClose['FID']]['DeleteOnClose'] is True:
                      try:
                          os.remove(connData['OpenedFiles'][comClose['FID']]['FileName'])
-                     except Exception, e:
+                     except Exception as e:
                          smbServer.log("comClose %s" % e, logging.ERROR)
                          errorCode = STATUS_ACCESS_DENIED
                  del(connData['OpenedFiles'][comClose['FID']])
@@ -1326,7 +1332,7 @@ class SMBCommands:
         comWriteParameters =  smb.SMBWrite_Parameters(SMBCommand['Parameters'])
         comWriteData = smb.SMBWrite_Data(SMBCommand['Data'])
 
-        if connData['OpenedFiles'].has_key(comWriteParameters['Fid']):
+        if comWriteParameters['Fid'] in connData['OpenedFiles']:
              fileHandle = connData['OpenedFiles'][comWriteParameters['Fid']]['FileHandle']
              errorCode = STATUS_SUCCESS
              try:
@@ -1340,7 +1346,7 @@ class SMBCommands:
                      sock = connData['OpenedFiles'][comWriteParameters['Fid']]['Socket']
                      sock.send(comWriteData['Data'])
                  respParameters['Count']    = comWriteParameters['Count']
-             except Exception, e:
+             except Exception as e:
                  smbServer.log('smbComWrite: %s' % e, logging.ERROR)
                  errorCode = STATUS_ACCESS_DENIED
         else:
@@ -1367,12 +1373,12 @@ class SMBCommands:
 
         comFlush =  smb.SMBFlush_Parameters(SMBCommand['Parameters'])
 
-        if connData['OpenedFiles'].has_key(comFlush['FID']):
+        if comFlush['FID'] in connData['OpenedFiles']:
              errorCode = STATUS_SUCCESS
              fileHandle = connData['OpenedFiles'][comFlush['FID']]['FileHandle']
              try:
                  os.fsync(fileHandle)
-             except Exception, e:
+             except Exception as e:
                  smbServer.log("comFlush %s" % e, logging.ERROR)
                  errorCode = STATUS_ACCESS_DENIED
         else:
@@ -1400,7 +1406,7 @@ class SMBCommands:
         comCreateDirectoryData=  smb.SMBCreateDirectory_Data(flags = recvPacket['Flags2'], data = SMBCommand['Data'])
 
         # Get the Tid associated
-        if connData['ConnectedShares'].has_key(recvPacket['Tid']):
+        if recvPacket['Tid'] in connData['ConnectedShares']:
              errorCode = STATUS_SUCCESS
              path = connData['ConnectedShares'][recvPacket['Tid']]['path']
              fileName = os.path.normpath(decodeSMBString(recvPacket['Flags2'],comCreateDirectoryData['DirectoryName']).replace('\\','/'))
@@ -1417,7 +1423,7 @@ class SMBCommands:
              else:
                  try:
                      os.mkdir(pathName)
-                 except Exception, e:
+                 except Exception as e:
                      smbServer.log("smbComCreateDirectory: %s" % e, logging.ERROR)
                      errorCode = STATUS_ACCESS_DENIED
         else:
@@ -1444,7 +1450,7 @@ class SMBCommands:
 
         comRenameData      =  smb.SMBRename_Data(flags = recvPacket['Flags2'], data = SMBCommand['Data'])
         # Get the Tid associated
-        if connData['ConnectedShares'].has_key(recvPacket['Tid']):
+        if recvPacket['Tid'] in connData['ConnectedShares']:
              errorCode = STATUS_SUCCESS
              path = connData['ConnectedShares'][recvPacket['Tid']]['path']
              oldFileName = os.path.normpath(decodeSMBString(recvPacket['Flags2'],comRenameData['OldFileName']).replace('\\','/'))
@@ -1466,7 +1472,7 @@ class SMBCommands:
              else:
                  try:
                      os.rename(oldPathName,newPathName)
-                 except OSError, e:
+                 except OSError as e:
                      smbServer.log("smbComRename: %s" % e, logging.ERROR)
                      errorCode = STATUS_ACCESS_DENIED
         else:
@@ -1494,7 +1500,7 @@ class SMBCommands:
         comDeleteData         =  smb.SMBDelete_Data(flags = recvPacket['Flags2'], data = SMBCommand['Data'])
 
         # Get the Tid associated
-        if connData['ConnectedShares'].has_key(recvPacket['Tid']):
+        if recvPacket['Tid'] in connData['ConnectedShares']:
              errorCode = STATUS_SUCCESS
              path = connData['ConnectedShares'][recvPacket['Tid']]['path']
              fileName = os.path.normpath(decodeSMBString(recvPacket['Flags2'],comDeleteData['FileName']).replace('\\','/'))
@@ -1510,7 +1516,7 @@ class SMBCommands:
              else:
                  try:
                      os.remove(pathName)
-                 except OSError, e:
+                 except OSError as e:
                      smbServer.log("smbComDelete: %s" % e, logging.ERROR)
                      errorCode = STATUS_ACCESS_DENIED
         else:
@@ -1538,7 +1544,7 @@ class SMBCommands:
         comDeleteDirectoryData=  smb.SMBDeleteDirectory_Data(flags = recvPacket['Flags2'], data = SMBCommand['Data'])
 
         # Get the Tid associated
-        if connData['ConnectedShares'].has_key(recvPacket['Tid']):
+        if recvPacket['Tid'] in connData['ConnectedShares']:
              errorCode = STATUS_SUCCESS
              path = connData['ConnectedShares'][recvPacket['Tid']]['path']
              fileName = os.path.normpath(decodeSMBString(recvPacket['Flags2'],comDeleteDirectoryData['DirectoryName']).replace('\\','/'))
@@ -1554,7 +1560,7 @@ class SMBCommands:
              else:
                  try:
                      os.rmdir(pathName)
-                 except OSError, e:
+                 except OSError as e:
                      smbServer.log("smbComDeleteDirectory: %s" % e,logging.ERROR)
                      if e.errno == errno.ENOTEMPTY:
                          errorCode = STATUS_DIRECTORY_NOT_EMPTY
@@ -1593,13 +1599,13 @@ class SMBCommands:
         writeAndXData.fromString(SMBCommand['Data'])
 
 
-        if connData['OpenedFiles'].has_key(writeAndX['Fid']):
+        if writeAndX['Fid'] in connData['OpenedFiles']:
              fileHandle = connData['OpenedFiles'][writeAndX['Fid']]['FileHandle']
              errorCode = STATUS_SUCCESS
              try:
                  if fileHandle != PIPE_FILE_DESCRIPTOR:
                      offset = writeAndX['Offset']
-                     if writeAndX.fields.has_key('HighOffset'):
+                     if 'HighOffset' in writeAndX.fields:
                          offset += (writeAndX['HighOffset'] << 32)
                      # If we're trying to write past the file end we just skip the write call (Vista does this)
                      if os.lseek(fileHandle, 0, 2) >= offset:
@@ -1611,7 +1617,7 @@ class SMBCommands:
 
                  respParameters['Count']    = writeAndX['DataLength']
                  respParameters['Available']= 0xff
-             except Exception, e:
+             except Exception as e:
                  smbServer.log('smbComWriteAndx: %s' % e, logging.ERROR)
                  errorCode = STATUS_ACCESS_DENIED
         else:
@@ -1637,7 +1643,7 @@ class SMBCommands:
 
         comReadParameters =  smb.SMBRead_Parameters(SMBCommand['Parameters'])
 
-        if connData['OpenedFiles'].has_key(comReadParameters['Fid']):
+        if comReadParameters['Fid'] in connData['OpenedFiles']:
              fileHandle = connData['OpenedFiles'][comReadParameters['Fid']]['FileHandle']
              errorCode = STATUS_SUCCESS
              try:
@@ -1651,7 +1657,7 @@ class SMBCommands:
                  respParameters['Count']    = len(content)
                  respData['DataLength']     = len(content)
                  respData['Data']           = content
-             except Exception, e:
+             except Exception as e:
                  smbServer.log('smbComRead: %s ' % e, logging.ERROR)
                  errorCode = STATUS_ACCESS_DENIED
         else:
@@ -1680,13 +1686,13 @@ class SMBCommands:
         else:
             readAndX =  smb.SMBReadAndX_Parameters(SMBCommand['Parameters'])
 
-        if connData['OpenedFiles'].has_key(readAndX['Fid']):
+        if readAndX['Fid'] in connData['OpenedFiles']:
              fileHandle = connData['OpenedFiles'][readAndX['Fid']]['FileHandle']
              errorCode = 0
              try:
                  if fileHandle != PIPE_FILE_DESCRIPTOR:
                      offset = readAndX['Offset']
-                     if readAndX.fields.has_key('HighOffset'):
+                     if 'HighOffset' in readAndX.fields:
                          offset += (readAndX['HighOffset'] << 32)
                      os.lseek(fileHandle,offset,0)
                      content = os.read(fileHandle,readAndX['MaxCount'])
@@ -1698,7 +1704,7 @@ class SMBCommands:
                  respParameters['DataOffset']   = 59
                  respParameters['DataCount_Hi'] = 0
                  respData = content
-             except Exception, e:
+             except Exception as e:
                  smbServer.log('smbComReadAndX: %s ' % e, logging.ERROR)
                  errorCode = STATUS_ACCESS_DENIED
         else:
@@ -1725,7 +1731,7 @@ class SMBCommands:
         queryInformation= smb.SMBQueryInformation_Data(flags = recvPacket['Flags2'], data = SMBCommand['Data'])
 
         # Get the Tid associated
-        if connData['ConnectedShares'].has_key(recvPacket['Tid']):
+        if recvPacket['Tid'] in connData['ConnectedShares']:
             fileSize, lastWriteTime, fileAttributes = queryFsInformation(
                 connData['ConnectedShares'][recvPacket['Tid']]['path'],
                 decodeSMBString(recvPacket['Flags2'],queryInformation['FileName']))
@@ -1755,7 +1761,7 @@ class SMBCommands:
         respData       = ''
 
         # Get the Tid associated
-        if connData['ConnectedShares'].has_key(recvPacket['Tid']):
+        if recvPacket['Tid'] in connData['ConnectedShares']:
             totalUnits, freeUnits = queryDiskInformation(
                         connData['ConnectedShares'][recvPacket['Tid']]['path'])
 
@@ -1807,7 +1813,7 @@ class SMBCommands:
         respParameters = ''
         respData = ''
 
-        if connData['ConnectedShares'].has_key(recvPacket['Tid']):
+        if recvPacket['Tid'] in connData['ConnectedShares']:
             smbServer.log("Disconnecting Share(%d:%s)" % (recvPacket['Tid'],connData['ConnectedShares'][recvPacket['Tid']]['shareName']))
             del(connData['ConnectedShares'][recvPacket['Tid']])
             errorCode = STATUS_SUCCESS
@@ -1854,7 +1860,7 @@ class SMBCommands:
 
         queryInformation2 = smb.SMBQueryInformation2_Parameters(SMBCommand['Parameters'])
         errorCode = 0xFF
-        if connData['OpenedFiles'].has_key(queryInformation2['Fid']):
+        if queryInformation2['Fid'] in connData['OpenedFiles']:
              errorCode = STATUS_SUCCESS
              pathName = connData['OpenedFiles'][queryInformation2['Fid']]['FileName']
              try:
@@ -1873,7 +1879,7 @@ class SMBCommands:
                  if os.path.isfile(pathName):
                      attribs = smb.SMB_FILE_ATTRIBUTE_NORMAL
                  respParameters['FileAttributes'] = attribs
-             except Exception, e:
+             except Exception as e:
                  smbServer.log('smbComQueryInformation2 %s' % e,logging.ERROR)
                  errorCode = STATUS_ACCESS_DENIED
 
@@ -1904,14 +1910,14 @@ class SMBCommands:
         #    respParameters['VolumeGUID'] = '\x00'
 
         # Get the Tid associated
-        if connData['ConnectedShares'].has_key(recvPacket['Tid']):
+        if recvPacket['Tid'] in connData['ConnectedShares']:
              # If we have a rootFid, the path is relative to that fid
              errorCode = STATUS_SUCCESS
              if ntCreateAndXParameters['RootFid'] > 0:
                  path = connData['OpenedFiles'][ntCreateAndXParameters['RootFid']]['FileName']
                  LOG.debug("RootFid present %s!" % path)
              else:
-                 if connData['ConnectedShares'][recvPacket['Tid']].has_key('path'):
+                 if 'path' in connData['ConnectedShares'][recvPacket['Tid']]:
                      path = connData['ConnectedShares'][recvPacket['Tid']]['path']
                  else:
                      path = 'NONE'
@@ -1947,7 +1953,7 @@ class SMBCommands:
                  else:
                      mode |= os.O_CREAT
              elif createDisposition & smb.FILE_OPEN == smb.FILE_OPEN:
-                 if os.path.exists(pathName) is not True and smbServer.getRegisteredNamedPipes().has_key(unicode(pathName)) is not True:
+                 if os.path.exists(pathName) is not True and (unicode(pathName) in smbServer.getRegisteredNamedPipes()) is not True:
                      errorCode = STATUS_NO_SUCH_FILE
 
              if errorCode == STATUS_SUCCESS:
@@ -1969,7 +1975,7 @@ class SMBCommands:
                              # Let's create the directory
                              os.mkdir(pathName)
                              mode = os.O_RDONLY
-                         except Exception, e:
+                         except Exception as e:
                              smbServer.log("NTCreateAndX: %s,%s,%s" % (pathName,mode,e),logging.ERROR)
                              errorCode = STATUS_ACCESS_DENIED
                  if createOptions & smb.FILE_NON_DIRECTORY_FILE == smb.FILE_NON_DIRECTORY_FILE:
@@ -1989,13 +1995,13 @@ class SMBCommands:
                          else:
                             if sys.platform == 'win32':
                                mode |= os.O_BINARY
-                            if smbServer.getRegisteredNamedPipes().has_key(unicode(pathName)):
+                            if unicode(pathName) in smbServer.getRegisteredNamedPipes():
                                 fid = PIPE_FILE_DESCRIPTOR
                                 sock = socket.socket()
                                 sock.connect(smbServer.getRegisteredNamedPipes()[unicode(pathName)])
                             else:
                                 fid = os.open(pathName, mode)
-                     except Exception, e:
+                     except Exception as e:
                          smbServer.log("NTCreateAndX: %s,%s,%s" % (pathName,mode,e),logging.ERROR)
                          #print e
                          fid = 0
@@ -2074,7 +2080,7 @@ class SMBCommands:
         openAndXData       = smb.SMBOpenAndX_Data( flags = recvPacket['Flags2'], data = SMBCommand['Data'])
 
         # Get the Tid associated
-        if connData['ConnectedShares'].has_key(recvPacket['Tid']):
+        if recvPacket['Tid'] in connData['ConnectedShares']:
              path = connData['ConnectedShares'][recvPacket['Tid']]['path']
              openedFile, mode, pathName, errorCode = openFile(path,
                      decodeSMBString(recvPacket['Flags2'],openAndXData['FileName']),
@@ -2223,7 +2229,7 @@ class SMBCommands:
                    mechType = blob['MechTypes'][0]
                    if mechType != TypesMech['NTLMSSP - Microsoft NTLM Security Support Provider']:
                        # Nope, do we know it?
-                       if MechTypes.has_key(mechType):
+                       if mechType in MechTypes:
                            mechStr = MechTypes[mechType]
                        else:
                            mechStr = hexlify(mechType)
@@ -2431,7 +2437,7 @@ class SMBCommands:
                     _dialects_parameters = smb.SMBNTLMDialect_Parameters()
                     _dialects_data= smb.SMBNTLMDialect_Data()
                     _dialects_data['Payload'] = ''
-                    if connData.has_key('EncryptionKey'):
+                    if 'EncryptionKey' in connData:
                         _dialects_data['Challenge'] = connData['EncryptionKey']
                         _dialects_parameters['ChallengeLength'] = len(str(_dialects_data))
                     else:
@@ -2463,7 +2469,7 @@ class SMBCommands:
            connData['_dialects_data']       = _dialects_data
            connData['_dialects_parameters'] = _dialects_parameters
 
-        except Exception, e:
+        except Exception as e:
            # No NTLM throw an error
            smbServer.log('smbComNegotiate: %s' % e, logging.ERROR)
            respSMBCommand['Data'] = struct.pack('<H',0xffff)
@@ -2570,7 +2576,7 @@ class SMB2Commands:
                mechType = blob['MechTypes'][0]
                if mechType != TypesMech['NTLMSSP - Microsoft NTLM Security Support Provider']:
                    # Nope, do we know it?
-                   if MechTypes.has_key(mechType):
+                   if mechType in MechTypes:
                        mechStr = MechTypes[mechType]
                    else:
                        mechStr = hexlify(mechType)
@@ -2781,10 +2787,10 @@ class SMB2Commands:
 
         respSMBCommand['Buffer'] = '\x00'
         # Get the Tid associated
-        if connData['ConnectedShares'].has_key(recvPacket['TreeID']):
+        if recvPacket['TreeID'] in connData['ConnectedShares']:
              # If we have a rootFid, the path is relative to that fid
              errorCode = STATUS_SUCCESS
-             if connData['ConnectedShares'][recvPacket['TreeID']].has_key('path'):
+             if 'path' in connData['ConnectedShares'][recvPacket['TreeID']]:
                  path = connData['ConnectedShares'][recvPacket['TreeID']]['path']
              else:
                  path = 'NONE'
@@ -2820,7 +2826,7 @@ class SMB2Commands:
                  else:
                      mode |= os.O_CREAT
              elif createDisposition & smb2.FILE_OPEN == smb2.FILE_OPEN:
-                 if os.path.exists(pathName) is not True and smbServer.getRegisteredNamedPipes().has_key(unicode(pathName)) is not True:
+                 if os.path.exists(pathName) is not True and (unicode(pathName) in smbServer.getRegisteredNamedPipes()) is not True:
                      errorCode = STATUS_NO_SUCH_FILE
 
              if errorCode == STATUS_SUCCESS:
@@ -2842,7 +2848,7 @@ class SMB2Commands:
                              # Let's create the directory
                              os.mkdir(pathName)
                              mode = os.O_RDONLY
-                         except Exception, e:
+                         except Exception as e:
                              smbServer.log("SMB2_CREATE: %s,%s,%s" % (pathName,mode,e),logging.ERROR)
                              errorCode = STATUS_ACCESS_DENIED
                  if createOptions & smb2.FILE_NON_DIRECTORY_FILE == smb2.FILE_NON_DIRECTORY_FILE:
@@ -2862,13 +2868,13 @@ class SMB2Commands:
                          else:
                             if sys.platform == 'win32':
                                mode |= os.O_BINARY
-                            if smbServer.getRegisteredNamedPipes().has_key(unicode(pathName)):
+                            if unicode(pathName) in smbServer.getRegisteredNamedPipes():
                                 fid = PIPE_FILE_DESCRIPTOR
                                 sock = socket.socket()
                                 sock.connect(smbServer.getRegisteredNamedPipes()[unicode(pathName)])
                             else:
                                 fid = os.open(pathName, mode)
-                     except Exception, e:
+                     except Exception as e:
                          smbServer.log("SMB2_CREATE: %s,%s,%s" % (pathName,mode,e),logging.ERROR)
                          #print e
                          fid = 0
@@ -2939,14 +2945,14 @@ class SMB2Commands:
 
         if str(closeRequest['FileID']) == '\xff'*16:
             # Let's take the data from the lastRequest
-            if  connData['LastRequest'].has_key('SMB2_CREATE'):
+            if  'SMB2_CREATE' in connData['LastRequest']:
                 fileID = connData['LastRequest']['SMB2_CREATE']['FileID']
             else:
                 fileID = str(closeRequest['FileID'])
         else:
             fileID = str(closeRequest['FileID'])
 
-        if connData['OpenedFiles'].has_key(fileID):
+        if fileID in connData['OpenedFiles']:
              errorCode = STATUS_SUCCESS
              fileHandle = connData['OpenedFiles'][fileID]['FileHandle']
              pathName = connData['OpenedFiles'][fileID]['FileName']
@@ -2957,7 +2963,7 @@ class SMB2Commands:
                  elif fileHandle != VOID_FILE_DESCRIPTOR:
                      os.close(fileHandle)
                      infoRecord, errorCode = queryFileInformation(os.path.dirname(pathName), os.path.basename(pathName), smb2.SMB2_FILE_NETWORK_OPEN_INFO)
-             except Exception, e:
+             except Exception as e:
                  smbServer.log("SMB2_CLOSE %s" % e, logging.ERROR)
                  errorCode = STATUS_INVALID_HANDLE
              else:
@@ -2968,7 +2974,7 @@ class SMB2Commands:
                              shutil.rmtree(connData['OpenedFiles'][fileID]['FileName'])
                          else:
                              os.remove(connData['OpenedFiles'][fileID]['FileName'])
-                     except Exception, e:
+                     except Exception as e:
                          smbServer.log("SMB2_CLOSE %s" % e, logging.ERROR)
                          errorCode = STATUS_ACCESS_DENIED
 
@@ -3004,15 +3010,15 @@ class SMB2Commands:
 
         if str(queryInfo['FileID']) == '\xff'*16:
             # Let's take the data from the lastRequest
-            if  connData['LastRequest'].has_key('SMB2_CREATE'):
+            if  'SMB2_CREATE' in connData['LastRequest']:
                 fileID = connData['LastRequest']['SMB2_CREATE']['FileID']
             else:
                 fileID = str(queryInfo['FileID'])
         else:
             fileID = str(queryInfo['FileID'])
 
-        if connData['ConnectedShares'].has_key(recvPacket['TreeID']):
-            if connData['OpenedFiles'].has_key(fileID):
+        if recvPacket['TreeID'] in connData['ConnectedShares']:
+            if fileID in connData['OpenedFiles']:
                 fileName = connData['OpenedFiles'][fileID]['FileName']
 
                 if queryInfo['InfoType'] == smb2.SMB2_0_INFO_FILE:
@@ -3055,16 +3061,16 @@ class SMB2Commands:
 
         if str(setInfo['FileID']) == '\xff'*16:
             # Let's take the data from the lastRequest
-            if  connData['LastRequest'].has_key('SMB2_CREATE'):
+            if  'SMB2_CREATE' in connData['LastRequest']:
                 fileID = connData['LastRequest']['SMB2_CREATE']['FileID']
             else:
                 fileID = str(setInfo['FileID'])
         else:
             fileID = str(setInfo['FileID'])
 
-        if connData['ConnectedShares'].has_key(recvPacket['TreeID']):
+        if recvPacket['TreeID'] in connData['ConnectedShares']:
             path     = connData['ConnectedShares'][recvPacket['TreeID']]['path']
-            if connData['OpenedFiles'].has_key(fileID):
+            if fileID in connData['OpenedFiles']:
                 pathName = connData['OpenedFiles'][fileID]['FileName']
 
                 if setInfo['InfoType'] == smb2.SMB2_0_INFO_FILE:
@@ -3104,7 +3110,7 @@ class SMB2Commands:
                         try:
                              os.rename(pathName,newPathName)
                              connData['OpenedFiles'][fileID]['FileName'] = newPathName
-                        except Exception, e:
+                        except Exception as e:
                              smbServer.log("smb2SetInfo: %s" % e, logging.ERROR)
                              errorCode = STATUS_ACCESS_DENIED
                     else:
@@ -3145,14 +3151,14 @@ class SMB2Commands:
 
         if str(writeRequest['FileID']) == '\xff'*16:
             # Let's take the data from the lastRequest
-            if  connData['LastRequest'].has_key('SMB2_CREATE'):
+            if  'SMB2_CREATE' in connData['LastRequest']:
                 fileID = connData['LastRequest']['SMB2_CREATE']['FileID']
             else:
                 fileID = str(writeRequest['FileID'])
         else:
             fileID = str(writeRequest['FileID'])
 
-        if connData['OpenedFiles'].has_key(fileID):
+        if fileID in connData['OpenedFiles']:
              fileHandle = connData['OpenedFiles'][fileID]['FileHandle']
              errorCode = STATUS_SUCCESS
              try:
@@ -3168,7 +3174,7 @@ class SMB2Commands:
 
                  respSMBCommand['Count']    = writeRequest['Length']
                  respSMBCommand['Remaining']= 0xff
-             except Exception, e:
+             except Exception as e:
                  smbServer.log('SMB2_WRITE: %s' % e, logging.ERROR)
                  errorCode = STATUS_ACCESS_DENIED
         else:
@@ -3188,14 +3194,14 @@ class SMB2Commands:
 
         if str(readRequest['FileID']) == '\xff'*16:
             # Let's take the data from the lastRequest
-            if  connData['LastRequest'].has_key('SMB2_CREATE'):
+            if  'SMB2_CREATE' in connData['LastRequest']:
                 fileID = connData['LastRequest']['SMB2_CREATE']['FileID']
             else:
                 fileID = str(readRequest['FileID'])
         else:
             fileID = str(readRequest['FileID'])
 
-        if connData['OpenedFiles'].has_key(fileID):
+        if fileID in connData['OpenedFiles']:
              fileHandle = connData['OpenedFiles'][fileID]['FileHandle']
              errorCode = 0
              try:
@@ -3211,7 +3217,7 @@ class SMB2Commands:
                  respSMBCommand['DataLength']   = len(content)
                  respSMBCommand['DataRemaining']= 0
                  respSMBCommand['Buffer']       = content
-             except Exception, e:
+             except Exception as e:
                  smbServer.log('SMB2_READ: %s ' % e, logging.ERROR)
                  errorCode = STATUS_ACCESS_DENIED
         else:
@@ -3227,12 +3233,12 @@ class SMB2Commands:
         respSMBCommand = smb2.SMB2Flush_Response()
         flushRequest   = smb2.SMB2Flush(recvPacket['Data'])
 
-        if connData['OpenedFiles'].has_key(str(flushRequest['FileID'])):
+        if str(flushRequest['FileID']) in connData['OpenedFiles']:
              fileHandle = connData['OpenedFiles'][str(flushRequest['FileID'])]['FileHandle']
              errorCode = STATUS_SUCCESS
              try:
                  os.fsync(fileHandle)
-             except Exception, e:
+             except Exception as e:
                  smbServer.log("SMB2_FLUSH %s" % e, logging.ERROR)
                  errorCode = STATUS_ACCESS_DENIED
         else:
@@ -3251,21 +3257,21 @@ class SMB2Commands:
         respSMBCommand['Buffer'] = '\x00'
 
         # The server MUST locate the tree connection, as specified in section 3.3.5.2.11.
-        if connData['ConnectedShares'].has_key(recvPacket['TreeID']) is False:
+        if (recvPacket['TreeID'] in connData['ConnectedShares']) is False:
             return [smb2.SMB2Error()], None, STATUS_NETWORK_NAME_DELETED
 
         # Next, the server MUST locate the open for the directory to be queried
         # If no open is found, the server MUST fail the request with STATUS_FILE_CLOSED
         if str(queryDirectoryRequest['FileID']) == '\xff'*16:
             # Let's take the data from the lastRequest
-            if  connData['LastRequest'].has_key('SMB2_CREATE'):
+            if  'SMB2_CREATE' in connData['LastRequest']:
                 fileID = connData['LastRequest']['SMB2_CREATE']['FileID']
             else:
                 fileID = str(queryDirectoryRequest['FileID'])
         else:
             fileID = str(queryDirectoryRequest['FileID'])
 
-        if connData['OpenedFiles'].has_key(fileID) is False:
+        if (fileID in connData['OpenedFiles']) is False:
             return [smb2.SMB2Error()], None, STATUS_FILE_CLOSED
 
         # If the open is not an open to a directory, the request MUST be failed
@@ -3383,7 +3389,7 @@ class SMB2Commands:
 
         respSMBCommand = smb2.SMB2TreeDisconnect_Response()
 
-        if connData['ConnectedShares'].has_key(recvPacket['TreeID']):
+        if recvPacket['TreeID'] in connData['ConnectedShares']:
             smbServer.log("Disconnecting Share(%d:%s)" % (recvPacket['TreeID'],connData['ConnectedShares'][recvPacket['TreeID']]['shareName']))
             del(connData['ConnectedShares'][recvPacket['TreeID']])
             errorCode = STATUS_SUCCESS
@@ -3420,7 +3426,7 @@ class SMB2Commands:
         ioctlRequest   = smb2.SMB2Ioctl(recvPacket['Data'])
 
         ioctls = smbServer.getIoctls()
-        if ioctls.has_key(ioctlRequest['CtlCode']):
+        if ioctlRequest['CtlCode'] in ioctls:
             outputData, errorCode = ioctls[ioctlRequest['CtlCode']](connId, smbServer, ioctlRequest)
             if errorCode == STATUS_SUCCESS:
                 respSMBCommand['CtlCode']      = ioctlRequest['CtlCode']
@@ -3475,7 +3481,7 @@ class Ioctls:
 
         ioctlResponse = ''
 
-        if connData['OpenedFiles'].has_key(str(ioctlRequest['FileID'])):
+        if str(ioctlRequest['FileID']) in connData['OpenedFiles']:
              fileHandle = connData['OpenedFiles'][str(ioctlRequest['FileID'])]['FileHandle']
              errorCode = STATUS_SUCCESS
              try:
@@ -3485,7 +3491,7 @@ class Ioctls:
                      sock = connData['OpenedFiles'][str(ioctlRequest['FileID'])]['Socket']
                      sock.sendall(ioctlRequest['Buffer'])
                      ioctlResponse = sock.recv(ioctlRequest['MaxOutputResponse'])
-             except Exception, e:
+             except Exception as e:
                  smbServer.log('fsctlPipeTransceive: %s ' % e, logging.ERROR)
                  errorCode = STATUS_ACCESS_DENIED
         else:
@@ -3551,7 +3557,7 @@ class SMBSERVERHandler(SocketServer.BaseRequestHandler):
                    # a single packet
                    for i in resp:
                        session.send_packet(str(i))
-            except Exception, e:
+            except Exception as e:
                 self.__SMB.log("Handle: %s" % e)
                 #import traceback
                 #traceback.print_exc()
@@ -3734,7 +3740,7 @@ smb.SMB.TRANS_TRANSACT_NMPIPE          :self.__smbTransHandler.transactNamedPipe
     def getConnectionData(self, connId, checkStatus = True):
         conn = self.__activeConnections[connId]
         if checkStatus is True:
-            if conn.has_key('Authenticated') is not True:
+            if ('Authenticated' in conn) is not True:
                 # Can't keep going further
                 raise Exception("User not Authenticated!")
         return conn
@@ -3747,13 +3753,13 @@ smb.SMB.TRANS_TRANSACT_NMPIPE          :self.__smbTransHandler.transactNamedPipe
         return True
 
     def unregisterNamedPipe(self, pipeName):
-        if self.__registeredNamedPipes.has_key(pipeName):
+        if pipeName in self.__registeredNamedPipes:
             del(self.__registeredNamedPipes[unicode(pipeName)])
             return True
         return False
 
     def unregisterTransaction(self, transCommand):
-        if self.__smbTransCommands.has_key(transCommand):
+        if transCommand in self.__smbTransCommands:
            del(self.__smbTransCommands[transCommand])
 
     def hookTransaction(self, transCommand, callback):
@@ -3788,7 +3794,7 @@ smb.SMB.TRANS_TRANSACT_NMPIPE          :self.__smbTransHandler.transactNamedPipe
         # respData: the data reponse of the transaction
         # errorCode: the NT error code
 
-        if self.__smbTransCommands.has_key(transCommand):
+        if transCommand in self.__smbTransCommands:
            originalCommand = self.__smbTransCommands[transCommand]
         else:
            originalCommand = None
@@ -3797,13 +3803,13 @@ smb.SMB.TRANS_TRANSACT_NMPIPE          :self.__smbTransHandler.transactNamedPipe
         return originalCommand
 
     def unregisterTransaction2(self, transCommand):
-        if self.__smbTrans2Commands.has_key(transCommand):
+        if transCommand in self.__smbTrans2Commands:
            del(self.__smbTrans2Commands[transCommand])
 
     def hookTransaction2(self, transCommand, callback):
         # Here we should add to __smbTrans2Commands
         # Same description as Transaction
-        if self.__smbTrans2Commands.has_key(transCommand):
+        if transCommand in self.__smbTrans2Commands:
            originalCommand = self.__smbTrans2Commands[transCommand]
         else:
            originalCommand = None
@@ -3812,13 +3818,13 @@ smb.SMB.TRANS_TRANSACT_NMPIPE          :self.__smbTransHandler.transactNamedPipe
         return originalCommand
 
     def unregisterNTTransaction(self, transCommand):
-        if self.__smbNTTransCommands.has_key(transCommand):
+        if transCommand in self.__smbNTTransCommands:
            del(self.__smbNTTransCommands[transCommand])
 
     def hookNTTransaction(self, transCommand, callback):
         # Here we should add to __smbNTTransCommands
         # Same description as Transaction
-        if self.__smbNTTransCommands.has_key(transCommand):
+        if transCommand in self.__smbNTTransCommands:
            originalCommand = self.__smbNTTransCommands[transCommand]
         else:
            originalCommand = None
@@ -3827,7 +3833,7 @@ smb.SMB.TRANS_TRANSACT_NMPIPE          :self.__smbTransHandler.transactNamedPipe
         return originalCommand
 
     def unregisterSmbCommand(self, smbCommand):
-        if self.__smbCommands.has_key(smbCommand):
+        if smbCommand in self.__smbCommands:
            del(self.__smbCommands[smbCommand])
 
     def hookSmbCommand(self, smbCommand, callback):
@@ -3866,7 +3872,7 @@ smb.SMB.TRANS_TRANSACT_NMPIPE          :self.__smbTransHandler.transactNamedPipe
         # transCommands: a list of transaction subcommands already registered
         #
 
-        if self.__smbCommands.has_key(smbCommand):
+        if smbCommand in self.__smbCommands:
            originalCommand = self.__smbCommands[smbCommand]
         else:
            originalCommand = None
@@ -3875,11 +3881,11 @@ smb.SMB.TRANS_TRANSACT_NMPIPE          :self.__smbTransHandler.transactNamedPipe
         return originalCommand
 
     def unregisterSmb2Command(self, smb2Command):
-        if self.__smb2Commands.has_key(smb2Command):
+        if smb2Command in self.__smb2Commands:
            del(self.__smb2Commands[smb2Command])
 
     def hookSmb2Command(self, smb2Command, callback):
-        if self.__smb2Commands.has_key(smb2Command):
+        if smb2Command in self.__smb2Commands:
            originalCommand = self.__smb2Commands[smb2Command]
         else:
            originalCommand = None
@@ -3969,13 +3975,13 @@ smb.SMB.TRANS_TRANSACT_NMPIPE          :self.__smbTransHandler.transactNamedPipe
                                   packet,
                                   self.__smbTransCommands)
                 else:
-                    if self.__smbCommands.has_key(packet['Command']):
+                    if packet['Command'] in self.__smbCommands:
                        if self.__SMB2Support is True:
                            if packet['Command'] == smb.SMB.SMB_COM_NEGOTIATE:
                                try:
                                    respCommands, respPackets, errorCode = self.__smb2Commands[smb2.SMB2_NEGOTIATE](connId, self, packet, True)
                                    isSMB2 = True
-                               except Exception, e:
+                               except Exception as e:
                                    self.log('SMB2_NEGOTIATE: %s' % e, logging.ERROR)
                                    # If something went wrong, let's fallback to SMB1
                                    respCommands, respPackets, errorCode = self.__smbCommands[packet['Command']](
@@ -4006,7 +4012,7 @@ smb.SMB.TRANS_TRANSACT_NMPIPE          :self.__smbTransHandler.transactNamedPipe
             else:
                 done = False
                 while not done:
-                    if self.__smb2Commands.has_key(packet['Command']):
+                    if packet['Command'] in self.__smb2Commands:
                        if self.__SMB2Support is True:
                            respCommands, respPackets, errorCode = self.__smb2Commands[packet['Command']](
                                    connId,
@@ -4025,7 +4031,7 @@ smb.SMB.TRANS_TRANSACT_NMPIPE          :self.__smbTransHandler.transactNamedPipe
                     else:
                         done = True
 
-        except Exception, e:
+        except Exception as e:
             #import traceback
             #traceback.print_exc()
             # Something wen't wrong, defaulting to Bad user ID
index 43e65fb..98069f5 100644 (file)
@@ -1,3 +1,4 @@
+from __future__ import print_function
 # Copyright (c) 2003-2016 CORE Security Technologies
 #
 # This software is provided under under a slightly modified version
@@ -13,7 +14,7 @@
 from struct import pack, unpack, calcsize
 
 ############### GSS Stuff ################
-GSS_API_SPNEGO_UUID              = '\x2b\x06\x01\x05\x05\x02' 
+GSS_API_SPNEGO_UUID              = '\x2b\x06\x01\x05\x05\x02'
 ASN1_SEQUENCE                    = 0x30
 ASN1_AID                         = 0x60
 ASN1_OID                         = 0x06
@@ -33,59 +34,59 @@ MechTypes = {
 TypesMech = dict((v,k) for k, v in MechTypes.iteritems())
 
 def asn1encode(data = ''):
-        #res = asn1.SEQUENCE(str).encode()
-        #import binascii
-        #print '\nalex asn1encode str: %s\n' % binascii.hexlify(str)
-        if 0 <= len(data) <= 0x7F:
-            res = pack('B', len(data)) + data
-        elif 0x80 <= len(data) <= 0xFF:
-            res = pack('BB', 0x81, len(data)) + data
-        elif 0x100 <= len(data) <= 0xFFFF:
-            res = pack('!BH', 0x82, len(data)) + data
-        elif 0x10000 <= len(data) <= 0xffffff:
-            res = pack('!BBH', 0x83, len(data) >> 16, len(data) & 0xFFFF) + data
-        elif 0x1000000 <= len(data) <= 0xffffffff:
-            res = pack('!BL', 0x84, len(data)) + data
-        else:
-            raise Exception('Error in asn1encode')
-        return str(res)
+    #res = asn1.SEQUENCE(str).encode()
+    #import binascii
+    #print '\nalex asn1encode str: %s\n' % binascii.hexlify(str)
+    if 0 <= len(data) <= 0x7F:
+        res = pack('B', len(data)) + data
+    elif 0x80 <= len(data) <= 0xFF:
+        res = pack('BB', 0x81, len(data)) + data
+    elif 0x100 <= len(data) <= 0xFFFF:
+        res = pack('!BH', 0x82, len(data)) + data
+    elif 0x10000 <= len(data) <= 0xffffff:
+        res = pack('!BBH', 0x83, len(data) >> 16, len(data) & 0xFFFF) + data
+    elif 0x1000000 <= len(data) <= 0xffffffff:
+        res = pack('!BL', 0x84, len(data)) + data
+    else:
+        raise Exception('Error in asn1encode')
+    return str(res)
 
 def asn1decode(data = ''):
-        len1 = unpack('B', data[:1])[0]
-        data = data[1:]
-        if len1 == 0x81:
-            pad = calcsize('B')
-            len2 = unpack('B',data[:pad])[0]
-            data = data[pad:]
-            ans = data[:len2]
-        elif len1 == 0x82:
-            pad = calcsize('H')
-            len2 = unpack('!H', data[:pad])[0]
-            data = data[pad:]
-            ans = data[:len2]
-        elif len1 == 0x83:
-            pad = calcsize('B') + calcsize('!H')
-            len2, len3 = unpack('!BH', data[:pad])
-            data = data[pad:]
-            ans = data[:len2 << 16 + len3]
-        elif len1 == 0x84:
-            pad = calcsize('!L')
-            len2 = unpack('!L', data[:pad])[0]
-            data = data[pad:]
-            ans = data[:len2]
-        # 1 byte length, string <= 0x7F
-       else:
-            pad = 0
-            ans = data[:len1]
-        return ans, len(ans)+pad+1
+    len1 = unpack('B', data[:1])[0]
+    data = data[1:]
+    if len1 == 0x81:
+        pad = calcsize('B')
+        len2 = unpack('B',data[:pad])[0]
+        data = data[pad:]
+        ans = data[:len2]
+    elif len1 == 0x82:
+        pad = calcsize('H')
+        len2 = unpack('!H', data[:pad])[0]
+        data = data[pad:]
+        ans = data[:len2]
+    elif len1 == 0x83:
+        pad = calcsize('B') + calcsize('!H')
+        len2, len3 = unpack('!BH', data[:pad])
+        data = data[pad:]
+        ans = data[:len2 << 16 + len3]
+    elif len1 == 0x84:
+        pad = calcsize('!L')
+        len2 = unpack('!L', data[:pad])[0]
+        data = data[pad:]
+        ans = data[:len2]
+    # 1 byte length, string <= 0x7F
+    else:
+        pad = 0
+        ans = data[:len1]
+    return ans, len(ans)+pad+1
 
 class GSSAPI:
-# Generic GSSAPI Header Format 
+# Generic GSSAPI Header Format
     def __init__(self, data = None):
         self.fields = {}
         self['UUID'] = GSS_API_SPNEGO_UUID
         if data:
-             self.fromString(data)
+            self.fromString(data)
         pass
 
     def __setitem__(self,key,value):
@@ -115,27 +116,27 @@ class GSSAPI:
         if next_byte != ASN1_AID:
             raise Exception('Unknown AID=%x' % next_byte)
         data = data[1:]
-        decode_data, total_bytes = asn1decode(data) 
+        decode_data, total_bytes = asn1decode(data)
         # Now we should have a OID tag
-               next_byte = unpack('B',decode_data[:1])[0]
+        next_byte = unpack('B',decode_data[:1])[0]
         if next_byte !=  ASN1_OID:
             raise Exception('OID tag not found %x' % next_byte)
         decode_data = decode_data[1:]
         # Now the OID contents, should be SPNEGO UUID
-        uuid, total_bytes = asn1decode(decode_data)                
+        uuid, total_bytes = asn1decode(decode_data)
         self['OID'] = uuid
         # the rest should be the data
         self['Payload'] = decode_data[total_bytes:]
         #pass
-        
+
     def dump(self):
         for i in self.fields.keys():
-            print "%s: {%r}" % (i,self[i])
+            print("%s: {%r}" % (i,self[i]))
 
     def getData(self):
         ans = pack('B',ASN1_AID)
         ans += asn1encode(
-               pack('B',ASN1_OID) + 
+               pack('B',ASN1_OID) +
                asn1encode(self['UUID']) +
                self['Payload'] )
         return ans
@@ -163,7 +164,7 @@ class SPNEGO_NegTokenResp:
     def __init__(self, data = None):
         self.fields = {}
         if data:
-             self.fromString(data)
+            self.fromString(data)
         pass
 
     def __setitem__(self,key,value):
@@ -198,7 +199,7 @@ class SPNEGO_NegTokenResp:
         if next_byte != ASN1_MECH_TYPE:
             # MechType not found, could be an AUTH answer
             if next_byte != ASN1_RESPONSE_TOKEN:
-               raise Exception('MechType/ResponseToken tag not found %x' % next_byte)
+                raise Exception('MechType/ResponseToken tag not found %x' % next_byte)
         else:
             decode_data2 = decode_data[1:]
             decode_data2, total_bytes = asn1decode(decode_data2)
@@ -245,30 +246,30 @@ class SPNEGO_NegTokenResp:
 
     def dump(self):
         for i in self.fields.keys():
-            print "%s: {%r}" % (i,self[i])
-        
+            print("%s: {%r}" % (i,self[i]))
+
     def getData(self):
         ans = pack('B',SPNEGO_NegTokenResp.SPNEGO_NEG_TOKEN_RESP)
-        if self.fields.has_key('NegResult') and self.fields.has_key('SupportedMech'):
+        if 'NegResult' in self.fields and 'SupportedMech' in self.fields:
             # Server resp
             ans += asn1encode(
                pack('B', ASN1_SEQUENCE) +
                asn1encode(
                pack('B',SPNEGO_NegTokenResp.SPNEGO_NEG_TOKEN_TARG) +
                asn1encode(
-               pack('B',ASN1_ENUMERATED) + 
+               pack('B',ASN1_ENUMERATED) +
                asn1encode( self['NegResult'] )) +
                pack('B',ASN1_SUPPORTED_MECH) +
-               asn1encode( 
+               asn1encode(
                pack('B',ASN1_OID) +
                asn1encode(self['SupportedMech'])) +
                pack('B',ASN1_RESPONSE_TOKEN ) +
                asn1encode(
                pack('B', ASN1_OCTET_STRING) + asn1encode(self['ResponseToken']))))
-        elif self.fields.has_key('NegResult'):
+        elif 'NegResult' in self.fields:
             # Server resp
             ans += asn1encode(
-               pack('B', ASN1_SEQUENCE) + 
+               pack('B', ASN1_SEQUENCE) +
                asn1encode(
                pack('B', SPNEGO_NegTokenResp.SPNEGO_NEG_TOKEN_TARG) +
                asn1encode(
@@ -285,24 +286,24 @@ class SPNEGO_NegTokenResp:
         return ans
 
 class SPNEGO_NegTokenInit(GSSAPI):
-    # http://tools.ietf.org/html/rfc4178#page-8 
+    # http://tools.ietf.org/html/rfc4178#page-8
     # NegTokeInit :: = SEQUENCE {
-    #   mechTypes      [0] MechTypeList,
+    #   mechTypes       [0] MechTypeList,
     #   reqFlags        [1] ContextFlags OPTIONAL,
-    #   mechToken       [2] OCTET STRING OPTIONAL,     
+    #   mechToken       [2] OCTET STRING OPTIONAL,
     #   mechListMIC     [3] OCTET STRING OPTIONAL,
     # }
     SPNEGO_NEG_TOKEN_INIT = 0xa0
     def fromString(self, data = 0):
         GSSAPI.fromString(self, data)
         payload = self['Payload']
-        next_byte = unpack('B', payload[:1])[0] 
+        next_byte = unpack('B', payload[:1])[0]
         if next_byte != SPNEGO_NegTokenInit.SPNEGO_NEG_TOKEN_INIT:
             raise Exception('NegTokenInit not found %x' % next_byte)
         payload = payload[1:]
         decode_data, total_bytes = asn1decode(payload)
         # Now we should have a SEQUENCE Tag
-       next_byte = unpack('B', decode_data[:1])[0]
+        next_byte = unpack('B', decode_data[:1])[0]
         if next_byte != ASN1_SEQUENCE:
             raise Exception('SEQUENCE tag not found %x' % next_byte)
         decode_data = decode_data[1:]
@@ -321,14 +322,14 @@ class SPNEGO_NegTokenInit(GSSAPI):
         # And finally we should have the MechTypes
         self['MechTypes'] = []
         while decode_data:
-           next_byte = unpack('B', decode_data[:1])[0]
-           if next_byte != ASN1_OID:    
-             # Not a valid OID, there must be something else we won't unpack
-             break
-           decode_data = decode_data[1:]
-           item, total_bytes = asn1decode(decode_data)
-           self['MechTypes'].append(item)
-           decode_data = decode_data[total_bytes:]
+            next_byte = unpack('B', decode_data[:1])[0]
+            if next_byte != ASN1_OID:
+            # Not a valid OID, there must be something else we won't unpack
+                break
+            decode_data = decode_data[1:]
+            item, total_bytes = asn1decode(decode_data)
+            self['MechTypes'].append(item)
+            decode_data = decode_data[total_bytes:]
 
         # Do we have MechTokens as well?
         decode_data = remaining_data[total_bytes3:]
@@ -352,7 +353,7 @@ class SPNEGO_NegTokenInit(GSSAPI):
 
         mechToken = ''
         # Do we have tokens to send?
-        if self.fields.has_key('MechToken'):
+        if 'MechToken' in self.fields:
             mechToken = pack('B', ASN1_MECH_TOKEN) + asn1encode(
                 pack('B', ASN1_OCTET_STRING) + asn1encode(
                     self['MechToken']))
@@ -363,10 +364,9 @@ class SPNEGO_NegTokenInit(GSSAPI):
                asn1encode(
                pack('B', ASN1_MECH_TYPE) +
                asn1encode(
-               pack('B', ASN1_SEQUENCE) + 
+               pack('B', ASN1_SEQUENCE) +
                asn1encode(mechTypes)) + mechToken ))
 
 
         self['Payload'] = ans
         return GSSAPI.getData(self)
-     
index 7a04117..68066a6 100644 (file)
@@ -1,3 +1,4 @@
+from __future__ import print_function
 # Copyright (c) 2003-2016 CORE Security Technologies
 #
 # This software is provided under under a slightly modified version
@@ -97,18 +98,18 @@ class Structure:
 
     def packField(self, fieldName, format = None):
         if self.debug:
-            print "packField( %s | %s )" % (fieldName, format)
+            print("packField( %s | %s )" % (fieldName, format))
 
         if format is None:
             format = self.formatForField(fieldName)
 
-        if self.fields.has_key(fieldName):
+        if fieldName in self.fields:
             ans = self.pack(format, self.fields[fieldName], field = fieldName)
         else:
             ans = self.pack(format, None, field = fieldName)
 
         if self.debug:
-            print "\tanswer %r" % ans
+            print("\tanswer %r" % ans)
 
         return ans
 
@@ -119,8 +120,8 @@ class Structure:
         for field in self.commonHdr+self.structure:
             try:
                 data += self.packField(field[0], field[1])
-            except Exception, e:
-                if self.fields.has_key(field[0]):
+            except Exception as e:
+                if field[0] in self.fields:
                     e.args += ("When packing field '%s | %s | %r' in %s" % (field[0], field[1], self[field[0]], self.__class__),)
                 else:
                     e.args += ("When packing field '%s | %s' in %s" % (field[0], field[1], self.__class__),)
@@ -136,16 +137,16 @@ class Structure:
         self.rawData = data
         for field in self.commonHdr+self.structure:
             if self.debug:
-                print "fromString( %s | %s | %r )" % (field[0], field[1], data)
+                print("fromString( %s | %s | %r )" % (field[0], field[1], data))
             size = self.calcUnpackSize(field[1], data, field[0])
             if self.debug:
-                print "  size = %d" % size
+                print("  size = %d" % size)
             dataClassOrCode = str
             if len(field) > 2:
                 dataClassOrCode = field[2]
             try:
                 self[field[0]] = self.unpack(field[1], data[:size], dataClassOrCode = dataClassOrCode, field = field[0])
-            except Exception,e:
+            except Exception as e:
                 e.args += ("When unpacking field '%s | %s | %r[:%d]'" % (field[0], field[1], data, size),)
                 raise
 
@@ -175,7 +176,7 @@ class Structure:
 
     def pack(self, format, data, field = None):
         if self.debug:
-            print "  pack( %s | %r | %s)" %  (format, data, field)
+            print("  pack( %s | %r | %s)" %  (format, data, field))
 
         if field:
             addressField = self.findAddressFieldFor(field)
@@ -206,7 +207,7 @@ class Structure:
             try:
                 return self.pack(two[0], data)
             except:
-                if (self.fields.has_key(two[1])) and (self[two[1]] is not None):
+                if (two[1] in self.fields) and (self[two[1]] is not None):
                     return self.pack(two[0], id(self[two[1]]) & ((1<<(calcsize(two[0])*8))-1) )
                 else:
                     return self.pack(two[0], 0)
@@ -228,7 +229,7 @@ class Structure:
             if two[0]:
                 if two[0].isdigit():
                     if int(two[0]) != len(data):
-                        raise Exception, "Array field has a constant size, and it doesn't match the actual value"
+                        raise Exception("Array field has a constant size, and it doesn't match the actual value")
                 else:
                     return self.pack(two[0], len(data))+answer
             return answer
@@ -256,7 +257,7 @@ class Structure:
             return '%s\0\0\0\0%s%s' % (l,l,data)
                     
         if data is None:
-            raise Exception, "Trying to pack None"
+            raise Exception("Trying to pack None")
         
         # literal specifier
         if format[:1] == ':':
@@ -267,7 +268,7 @@ class Structure:
 
     def unpack(self, format, data, dataClassOrCode = str, field = None):
         if self.debug:
-            print "  unpack( %s | %r )" %  (format, data)
+            print("  unpack( %s | %r )" %  (format, data))
 
         if field:
             addressField = self.findAddressFieldFor(field)
@@ -288,7 +289,7 @@ class Structure:
         if format[:1] == "'" or format[:1] == '"':
             answer = format[1:]
             if answer != data:
-                raise Exception, "Unpacked data doesn't match constant value '%r' should be '%r'" % (data, answer)
+                raise Exception("Unpacked data doesn't match constant value '%r' should be '%r'" % (data, answer))
             return answer
 
         # address specifier
@@ -334,13 +335,13 @@ class Structure:
         # asciiz specifier
         if format == 'z':
             if data[-1] != '\x00':
-                raise Exception("%s 'z' field is not NUL terminated: %r" % (field, data))
+                raise Exception("%s 'z' field is not NUL terminated: %r" % (field, data))
             return data[:-1] # remove trailing NUL
 
         # unicode specifier
         if format == 'u':
             if data[-2:] != '\x00\x00':
-                raise Exception("%s 'u' field is not NUL-NUL terminated: %r" % (field, data))
+                raise Exception("%s 'u' field is not NUL-NUL terminated: %r" % (field, data))
             return data[:-2] # remove trailing NUL
 
         # DCE-RPC/NDR string specifier
@@ -392,7 +393,7 @@ class Structure:
             answer = 0
             if two[0].isdigit():
                     if int(two[0]) != len(data):
-                        raise Exception, "Array field has a constant size, and it doesn't match the actual value"
+                        raise Exception("Array field has a constant size, and it doesn't match the actual value")
             elif two[0]:
                 answer += self.calcPackSize(two[0], len(data))
 
@@ -428,7 +429,7 @@ class Structure:
 
     def calcUnpackSize(self, format, data, field = None):
         if self.debug:
-            print "  calcUnpackSize( %s | %s | %r)" %  (field, format, data)
+            print("  calcUnpackSize( %s | %s | %r)" %  (field, format, data))
 
         # void specifier
         if format[:1] == '_':
@@ -487,7 +488,7 @@ class Structure:
 
         # "printf" string specifier
         if format[:1] == '%':
-            raise Exception, "Can't guess the size of a printf like specifier for unpacking"
+            raise Exception("Can't guess the size of a printf like specifier for unpacking")
 
         # asciiz specifier
         if format[:1] == 'z':
@@ -520,7 +521,7 @@ class Structure:
         for field in self.commonHdr+self.structure:
             if field[0] == fieldName:
                 return field[1]
-        raise Exception("Field %s not found" % fieldName)
+        raise Exception("Field %s not found" % fieldName)
 
     def findAddressFieldFor(self, fieldName):
         descriptor = '&%s' % fieldName
@@ -558,7 +559,7 @@ class Structure:
     def dump(self, msg = None, indent = 0):
         if msg is None: msg = self.__class__.__name__
         ind = ' '*indent
-        print "\n%s" % msg
+        print("\n%s" % msg)
         fixedFields = []
         for field in self.commonHdr+self.structure:
             i = field[0] 
@@ -566,18 +567,18 @@ class Structure:
                 fixedFields.append(i)
                 if isinstance(self[i], Structure):
                     self[i].dump('%s%s:{' % (ind,i), indent = indent + 4)
-                    print "%s}" % ind
+                    print("%s}" % ind)
                 else:
-                    print "%s%s: {%r}" % (ind,i,self[i])
+                    print("%s%s: {%r}" % (ind,i,self[i]))
         # Do we have remaining fields not defined in the structures? let's 
         # print them
         remainingFields = list(set(self.fields) - set(fixedFields))
         for i in remainingFields:
             if isinstance(self[i], Structure):
                 self[i].dump('%s%s:{' % (ind,i), indent = indent + 4)
-                print "%s}" % ind
+                print("%s}" % ind)
             else:
-                print "%s%s: {%r}" % (ind,i,self[i])
+                print("%s%s: {%r}" % (ind,i,self[i]))
 
 
 class _StructureTest:
@@ -589,23 +590,23 @@ class _StructureTest:
             return self.theClass(alignment = self.alignment)
 
     def run(self):
-        print
-        print "-"*70
+        print()
+        print("-"*70)
         testName = self.__class__.__name__
-        print "starting test: %s....." % testName
+        print("starting test: %s....." % testName)
         a = self.create()
         self.populate(a)
         a.dump("packing.....")
         a_str = str(a)
-        print "packed: %r" % a_str
-        print "unpacking....."
+        print("packed: %r" % a_str)
+        print("unpacking.....")
         b = self.create(a_str)
         b.dump("unpacked.....")
-        print "repacking....."
+        print("repacking.....")
         b_str = str(b)
         if b_str != a_str:
-            print "ERROR: original packed and repacked don't match"
-            print "packed: %r" % b_str
+            print("ERROR: original packed and repacked don't match")
+            print("packed: %r" % b_str)
 
 class _Test_simple(_StructureTest):
     class theClass(Structure):
@@ -732,7 +733,7 @@ if __name__ == '__main__':
     try:
         _Test_fixedLength().run()
     except:
-        print "cannot repack because length is bogus"
+        print("cannot repack because length is bogus")
 
     _Test_simple_aligned4().run()
     _Test_nested().run()
index fb4d7b3..750eba4 100644 (file)
@@ -17,9 +17,14 @@ import re
 from random import randrange
 from struct import pack, unpack
 
+try:
+    long        # Python 2
+except NameError:
+    long = int  # Python 3
+
 def generate():
     # UHm... crappy Python has an maximum integer of 2**31-1.
-    top = (1L<<31)-1
+    top = (1<<31)-1
     return pack("IIII", randrange(top), randrange(top), randrange(top), randrange(top))
 
 def bin_to_string(uuid):
@@ -49,16 +54,16 @@ def bin_to_uuidtup(bin):
     return uuidstr, "%d.%d" % (maj, min)
 
 #input: string
-#output: tuple (uuid,version) 
+#output: tuple (uuid,version)
 #if version is not found in the input string "1.0"  is returned
-#example: 
-#           "00000000-0000-0000-0000-000000000000 3.0" returns ('00000000-0000-0000-0000-000000000000','3.0') 
-#           "10000000-2000-3000-4000-500000000000 version 3.0" returns ('00000000-0000-0000-0000-000000000000','3.0') 
-#           "10000000-2000-3000-4000-500000000000 v 3.0" returns ('00000000-0000-0000-0000-000000000000','3.0') 
-#           "10000000-2000-3000-4000-500000000000" returns ('00000000-0000-0000-0000-000000000000','1.0') 
+#example:
+#           "00000000-0000-0000-0000-000000000000 3.0" returns ('00000000-0000-0000-0000-000000000000','3.0')
+#           "10000000-2000-3000-4000-500000000000 version 3.0" returns ('00000000-0000-0000-0000-000000000000','3.0')
+#           "10000000-2000-3000-4000-500000000000 v 3.0" returns ('00000000-0000-0000-0000-000000000000','3.0')
+#           "10000000-2000-3000-4000-500000000000" returns ('00000000-0000-0000-0000-000000000000','1.0')
 def string_to_uuidtup(s):
     g =  re.search("([A-Fa-f0-9]{8}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{12}).*?([0-9]{1,5}\.[0-9]{1,5})",s+" 1.0")
-    if g: 
+    if g:
         (u,v) = g.groups()
         return (u,v)
     return
index 5b63e56..4fe8750 100644 (file)
@@ -5,7 +5,7 @@
 .\" *                            | (__| |_| |  _ <| |___
 .\" *                             \___|\___/|_| \_\_____|
 .\" *
-.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 .\" *
 .\" * This software is licensed as described in the file COPYING, which
 .\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH runtests.pl 1 "May 05, 2017" "Curl 7.62.0" "runtests"
+.TH runtests.pl 1 "December 13, 2019" "Curl 7.68.0" "runtests"
 
 .SH NAME
 runtests.pl \- run one or more test cases
@@ -83,8 +83,20 @@ Run the tests in a scrambled, or randomized, order instead of sequentially.
 Display run time statistics. (Requires Perl Time::HiRes module)
 .IP "-rf"
 Display full run time statistics. (Requires Perl Time::HiRes module)
+.IP "--repeat=[num]"
+This will repeat the given set of test numbers this many times. If no test
+numbers are given, it will repeat ALL tests this many times. It iteratively
+adds the new sequence at the end of the initially given one.
+
+If \fB-R\fP is also used, the scrambling is done after the repeats have
+extended the test sequence.
 .IP "-s"
 Shorter output. Speaks less than default.
+.IP "--shallow=[num](,seed)"
+Used together with \fB-t\fP. This limits the number of tests to fail in
+torture mode to no more than 'num' per test case. If this reduces the amount,
+the given 'seed' will be used to randomly discard entries to fail until the
+amount is 'num'.
 .IP "-t[num]"
 Selects a \fBtorture\fP test for the given tests. This makes runtests.pl first
 run the tests once and count the number of memory allocations made. It then
index 5dce330..27f62ed 100755 (executable)
@@ -6,7 +6,7 @@
 #                            | (__| |_| |  _ <| |___
 #                             \___|\___/|_| \_\_____|
 #
-# Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 #
 # This software is licensed as described in the file COPYING, which
 # you should have received as part of this distribution. The terms
@@ -150,8 +150,8 @@ my $SMBSPORT;            # SMBS server port
 my $NEGTELNETPORT;       # TELNET server port with negotiation
 
 my $srcdir = $ENV{'srcdir'} || '.';
-my $CURL="../src/curl".exe_ext(); # what curl executable to run on the tests
-my $VCURL="curl";   # what curl binary to use to verify the servers with
+my $CURL="../src/curl".exe_ext('TOOL'); # what curl executable to run on the tests
+my $VCURL=$CURL;   # what curl binary to use to verify the servers with
                    # VCURL is handy to set to the system one when the one you
                    # just built hangs or crashes and thus prevent verification
 my $DBGCURL=$CURL; #"../src/.libs/curl";  # alternative for debugging
@@ -186,6 +186,7 @@ my $server_response_maxtime=13;
 my $debug_build=0;          # built debug enabled (--enable-debug)
 my $has_memory_tracking=0;  # built with memory tracking (--enable-curldebug)
 my $libtool;
+my $repeat = 0;
 
 # name of the file that the memory debugging creates:
 my $memdump="$LOGDIR/memdump";
@@ -206,6 +207,9 @@ my $valgrind_tool;
 my $gdb = checktestcmd("gdb");
 my $httptlssrv = find_httptlssrv();
 
+my $uname_release = `uname -r`;
+my $is_wsl = $uname_release =~ /Microsoft$/;
+
 my $has_ssl;        # set if libcurl is built with SSL support
 my $has_largefile;  # set if libcurl is built with large file support
 my $has_idn;        # set if libcurl is built with IDN support
@@ -233,6 +237,7 @@ my $has_crypto;     # set if libcurl is built with cryptographic support
 my $has_cares;      # set if built with c-ares
 my $has_threadedres;# set if built with threaded resolver
 my $has_psl;        # set if libcurl is built with PSL support
+my $has_altsvc;     # set if libcurl is built with alt-svc support
 my $has_ldpreload;  # set if curl is built for systems supporting LD_PRELOAD
 my $has_multissl;   # set if curl is build with MultiSSL support
 my $has_manual;     # set if curl is built with built-in manual
@@ -243,9 +248,8 @@ my $h2cver = "h2c";
 my $has_openssl;    # built with a lib using an OpenSSL-like API
 my $has_gnutls;     # built with GnuTLS
 my $has_nss;        # built with NSS
-my $has_yassl;      # built with yassl
+my $has_wolfssl;    # built with wolfSSL
 my $has_polarssl;   # built with polarssl
-my $has_axtls;      # built with axTLS
 my $has_winssl;     # built with WinSSL    (Secure Channel aka Schannel)
 my $has_darwinssl;  # built with DarwinSSL (Secure Transport)
 my $has_boringssl;  # built with BoringSSL
@@ -258,7 +262,6 @@ my $has_sslpinning; # built with a TLS backend that supports pinning
 my $has_shared = "unknown";  # built shared
 
 my $resolver;       # name of the resolver backend (for human presentation)
-my $ssllib;         # name of the SSL library we use (for human presentation)
 
 my $has_textaware;  # set if running on a system that has a text mode concept
                     # on files. Windows for example
@@ -277,7 +280,7 @@ my $sshdvernum;  # for socks server, ssh daemon version number
 my $sshdverstr;  # for socks server, ssh daemon version string
 my $sshderror;   # for socks server, ssh daemon version error
 
-my $defserverlogslocktimeout = 20; # timeout to await server logs lock removal
+my $defserverlogslocktimeout = 2; # timeout to await server logs lock removal
 my $defpostcommanddelay = 0; # delay between command and postcheck sections
 
 my $timestats;   # time stamping and stats generation
@@ -292,6 +295,7 @@ my %timevrfyend; # timestamp for each test result verification end
 
 my $testnumcheck; # test number, set in singletest sub.
 my %oldenv;
+my %feature; # array of enabled features
 
 #######################################################################
 # variables that command line options may set
@@ -318,13 +322,20 @@ my %runcert;      # cert file currently in use by an ssl running server
 my $torture;
 my $tortnum;
 my $tortalloc;
+my $shallow;
+my $shallowseed;
 
 #######################################################################
 # logmsg is our general message logging subroutine.
 #
 sub logmsg {
     for(@_) {
-        print "$_";
+        my $line = $_;
+        if ($is_wsl) {
+            # use \r\n for WSL shell
+            $line =~ s/\r?\n$/\r\n/g;
+        }
+        print "$line";
     }
 }
 
@@ -590,13 +601,34 @@ sub torture {
         return 0;
     }
 
-    logmsg " $count functions to make fail\n";
+    my @ttests = (1 .. $count);
+    if($shallow && ($shallow < $count)) {
+        my $discard = scalar(@ttests) - $shallow;
+        my $percent = sprintf("%.2f%%", $shallow * 100 / scalar(@ttests));;
+        logmsg " $count functions found, but only fail $shallow ($percent)\n";
+        while($discard) {
+            my $rm;
+            do {
+                # find a test to discard
+                $rm = rand(scalar(@ttests));
+            } while(!$ttests[$rm]);
+            $ttests[$rm] = undef;
+            $discard--;
+        }
+    }
+    else {
+        logmsg " $count functions to make fail\n";
+    }
 
-    for ( 1 .. $count ) {
+    for (@ttests) {
         my $limit = $_;
         my $fail;
         my $dumped_core;
 
+        if(!defined($limit)) {
+            # --shallow can undefine them
+            next;
+        }
         if($tortalloc && ($tortalloc != $limit)) {
             next;
         }
@@ -793,7 +825,6 @@ sub verifyhttp {
     $flags .= "--verbose ";
     $flags .= "--globoff ";
     $flags .= "--unix-socket '$port_or_path' " if $ipvnum eq "unix";
-    $flags .= "-1 "         if($has_axtls);
     $flags .= "--insecure " if($proto eq 'https');
     $flags .= "\"$proto://$ip:$port/${bonus}verifiedserver\"";
 
@@ -2014,7 +2045,6 @@ sub runsshserver {
     my ($id, $verbose, $ipv6) = @_;
     my $ip=$HOSTIP;
     my $port = $SSHPORT;
-    my $socksport = $SOCKSPORT;
     my $proto = 'ssh';
     my $ipvnum = 4;
     my $idnum = ($id && ($id =~ /^(\d+)$/) && ($id > 1)) ? $id : 1;
@@ -2048,7 +2078,7 @@ sub runsshserver {
     $flags .= "--pidfile \"$pidfile\" ";
     $flags .= "--id $idnum " if($idnum > 1);
     $flags .= "--ipv$ipvnum --addr \"$ip\" ";
-    $flags .= "--sshport $port --socksport $socksport ";
+    $flags .= "--sshport $port ";
     $flags .= "--user \"$USER\"";
 
     my $cmd = "$perl $srcdir/sshserver.pl $flags";
@@ -2141,108 +2171,27 @@ sub runsocksserver {
 
     $logfile = server_logfilename($LOGDIR, $proto, $ipvnum, $idnum);
 
-    # The ssh server must be already running
-    if(!$run{'ssh'}) {
-        logmsg "RUN: SOCKS server cannot find running SSH server\n";
-        $doesntrun{$pidfile} = 1;
-        return (0,0);
-    }
-
-    # Find out ssh daemon canonical file name
-    my $sshd = find_sshd();
-    if(!$sshd) {
-        logmsg "RUN: SOCKS server cannot find $sshdexe\n";
-        $doesntrun{$pidfile} = 1;
-        return (0,0);
-    }
-
-    # Find out ssh daemon version info
-    ($sshdid, $sshdvernum, $sshdverstr, $sshderror) = sshversioninfo($sshd);
-    if(!$sshdid) {
-        # Not an OpenSSH or SunSSH ssh daemon
-        logmsg "$sshderror\n" if($verbose);
-        logmsg "SCP, SFTP and SOCKS tests require OpenSSH 2.9.9 or later\n";
-        $doesntrun{$pidfile} = 1;
-        return (0,0);
-    }
-    logmsg "ssh server found $sshd is $sshdverstr\n" if($verbose);
+    # start our socks server, get commands from the FTP cmd file
+    my $cmd="server/socksd".
+        " --port $port ".
+        " --pidfile $pidfile".
+        " --backend $HOSTIP".
+        " --config $FTPDCMD";
+    my ($sockspid, $pid2) = startnew($cmd, $pidfile, 30, 0);
 
-    # Find out ssh client canonical file name
-    my $ssh = find_ssh();
-    if(!$ssh) {
-        logmsg "RUN: SOCKS server cannot find $sshexe\n";
-        $doesntrun{$pidfile} = 1;
-        return (0,0);
-    }
-
-    # Find out ssh client version info
-    my ($sshid, $sshvernum, $sshverstr, $ssherror) = sshversioninfo($ssh);
-    if(!$sshid) {
-        # Not an OpenSSH or SunSSH ssh client
-        logmsg "$ssherror\n" if($verbose);
-        logmsg "SCP, SFTP and SOCKS tests require OpenSSH 2.9.9 or later\n";
-        $doesntrun{$pidfile} = 1;
-        return (0,0);
-    }
-
-    # Verify minimum ssh client version
-    if((($sshid =~ /OpenSSH/) && ($sshvernum < 299)) ||
-       (($sshid =~ /SunSSH/)  && ($sshvernum < 100))) {
-        logmsg "ssh client found $ssh is $sshverstr\n";
-        logmsg "SCP, SFTP and SOCKS tests require OpenSSH 2.9.9 or later\n";
-        $doesntrun{$pidfile} = 1;
-        return (0,0);
-    }
-    logmsg "ssh client found $ssh is $sshverstr\n" if($verbose);
-
-    # Verify if ssh client and ssh daemon versions match
-    if(($sshdid ne $sshid) || ($sshdvernum != $sshvernum)) {
-        # Our test harness might work with slightly mismatched versions
-        logmsg "Warning: version mismatch: sshd $sshdverstr - ssh $sshverstr\n"
-            if($verbose);
-    }
-
-    # Config file options for ssh client are previously set from sshserver.pl
-    if(! -e $sshconfig) {
-        logmsg "RUN: SOCKS server cannot find $sshconfig\n";
-        $doesntrun{$pidfile} = 1;
-        return (0,0);
-    }
-
-    $sshlog  = server_logfilename($LOGDIR, 'socks', $ipvnum, $idnum);
-
-    # start our socks server
-    my $cmd="\"$ssh\" -N -F $sshconfig $ip > $sshlog 2>&1";
-    my ($sshpid, $pid2) = startnew($cmd, $pidfile, 30, 1); # fake pidfile
-
-    if($sshpid <= 0 || !pidexists($sshpid)) {
+    if($sockspid <= 0 || !pidexists($sockspid)) {
         # it is NOT alive
         logmsg "RUN: failed to start the $srvrname server\n";
-        display_sshlog();
-        display_sshconfig();
-        display_sshdlog();
-        display_sshdconfig();
         stopserver($server, "$pid2");
         $doesntrun{$pidfile} = 1;
         return (0,0);
     }
 
-    # Ugly hack but ssh doesn't support pid files. PID is from fake pidfile.
-    my $pid3 = verifyserver($proto, $ipvnum, $idnum, $ip, $port);
-    if(!$pid3) {
-        logmsg "RUN: $srvrname server failed verification\n";
-        # failed to talk to it properly. Kill the server and return failure
-        stopserver($server, "$sshpid $pid2");
-        $doesntrun{$pidfile} = 1;
-        return (0,0);
-    }
-    $pid2 = $pid3;
-
     if($verbose) {
         logmsg "RUN: $srvrname server is now running PID $pid2\n";
     }
 
-    return ($pid2, $sshpid);
+    return ($pid2, $sockspid);
 }
 
 #######################################################################
@@ -2286,7 +2235,8 @@ sub rundictserver {
     $flags .= "--verbose 1 " if($debugprotocol);
     $flags .= "--pidfile \"$pidfile\" --logfile \"$logfile\" ";
     $flags .= "--id $idnum " if($idnum > 1);
-    $flags .= "--port $port --srcdir \"$srcdir\"";
+    $flags .= "--port $port --srcdir \"$srcdir\" ";
+    $flags .= "--host $HOSTIP";
 
     my $cmd = "$srcdir/dictserver.py $flags";
     my ($dictpid, $pid2) = startnew($cmd, $pidfile, 15, 0);
@@ -2362,7 +2312,8 @@ sub runsmbserver {
     $flags .= "--verbose 1 " if($debugprotocol);
     $flags .= "--pidfile \"$pidfile\" --logfile \"$logfile\" ";
     $flags .= "--id $idnum " if($idnum > 1);
-    $flags .= "--port $port --srcdir \"$srcdir\"";
+    $flags .= "--port $port --srcdir \"$srcdir\" ";
+    $flags .= "--host $HOSTIP";
 
     my $cmd = "$srcdir/smbserver.py $flags";
     my ($smbpid, $pid2) = startnew($cmd, $pidfile, 15, 0);
@@ -2628,7 +2579,7 @@ sub compare {
 
     if($result) {
         # timestamp test result verification end
-        $timevrfyend{$testnum} = Time::HiRes::time() if($timestats);
+        $timevrfyend{$testnum} = Time::HiRes::time();
 
         if(!$short) {
             logmsg "\n $testnum: $subject FAILED:\n";
@@ -2645,6 +2596,65 @@ sub compare {
     return $result;
 }
 
+sub setupfeatures {
+    $feature{"SSL"} = $has_ssl;
+    $feature{"MultiSSL"} = $has_multissl;
+    $feature{"SSLpinning"} = $has_sslpinning;
+    $feature{"OpenSSL"} = $has_openssl;
+    $feature{"GnuTLS"} = $has_gnutls;
+    $feature{"NSS"} = $has_nss;
+    $feature{"WinSSL"} = $has_winssl;
+    $feature{"Schannel"} = $has_winssl; # alias
+    $feature{"sectransp"} = $has_darwinssl;
+    $feature{"DarwinSSL"} = $has_darwinssl; # alias
+    $feature{"ld_preload"} = ($has_ldpreload && !$debug_build);
+    $feature{"unittest"} = $debug_build;
+    $feature{"debug"} = $debug_build;
+    $feature{"TrackMemory"} = $has_memory_tracking;
+    $feature{"large_file"} = $has_largefile;
+    $feature{"idn"} = $has_idn;
+    $feature{"ipv6"} = $has_ipv6;
+    $feature{"libz"} = $has_libz;
+    $feature{"brotli"} = $has_brotli;
+    $feature{"NTLM"} = $has_ntlm;
+    $feature{"NTLM_WB"} = $has_ntlm_wb;
+    $feature{"SSPI"} = $has_sspi;
+    $feature{"GSS-API"} = $has_gssapi;
+    $feature{"Kerberos"} = $has_kerberos;
+    $feature{"SPNEGO"} = $has_spnego;
+    $feature{"getrlimit"} = $has_getrlimit;
+    $feature{"crypto"} = $has_crypto;
+    $feature{"TLS-SRP"} = $has_tls_srp;
+    $feature{"Metalink"} = $has_metalink;
+    $feature{"http/2"} = $has_http2;
+    $feature{"threaded-resolver"} = $has_threadedres;
+    $feature{"PSL"} = $has_psl;
+    $feature{"alt-svc"} = $has_altsvc;
+    $feature{"manual"} = $has_manual;
+    $feature{"unix-sockets"} = $has_unix;
+
+    # make each protocol an enabled "feature"
+    for my $p (@protocols) {
+        $feature{$p} = 1;
+    }
+    # 'socks' was once here but is now removed
+
+    #
+    # strings that must match the names used in server/disabled.c
+    #
+    $feature{"cookies"} = 1;
+    $feature{"DoH"} = 1;
+    $feature{"HTTP-auth"} = 1;
+    $feature{"Mime"} = 1;
+    $feature{"netrc"} = 1;
+    $feature{"parsedate"} = 1;
+    $feature{"proxy"} = 1;
+    $feature{"shuffle-dns"} = 1;
+    $feature{"typecheck"} = 1;
+    $feature{"verbose-strings"} = 1;
+
+}
+
 #######################################################################
 # display information about curl and the host the test suite runs on
 #
@@ -2658,6 +2668,8 @@ sub checksystem {
     my $versretval;
     my $versnoexec;
     my @version=();
+    my @disabled;
+    my $dis = "";
 
     my $curlverout="$LOGDIR/curlverout.log";
     my $curlvererr="$LOGDIR/curlvererr.log";
@@ -2673,6 +2685,15 @@ sub checksystem {
     @version = <VERSOUT>;
     close(VERSOUT);
 
+    open(DISABLED, "server/disabled|");
+    @disabled = <DISABLED>;
+    close(DISABLED);
+
+    if($disabled[0]) {
+        map s/[\r\n]//g, @disabled;
+        $dis = join(", ", @disabled);
+    }
+
     $resolver="stock";
     for(@version) {
         chomp;
@@ -2689,60 +2710,47 @@ sub checksystem {
                 # This is a Windows MinGW build or native build, we need to use
                 # Win32-style path.
                 $pwd = pathhelp::sys_native_current_path();
+                $has_textaware = 1;
             }
-           if ($libcurl =~ /winssl/i) {
+           if ($libcurl =~ /(winssl|schannel)/i) {
                $has_winssl=1;
                $has_sslpinning=1;
-               $ssllib="WinSSL";
            }
            elsif ($libcurl =~ /openssl/i) {
                $has_openssl=1;
                $has_sslpinning=1;
-               $ssllib="OpenSSL";
            }
            elsif ($libcurl =~ /gnutls/i) {
                $has_gnutls=1;
                $has_sslpinning=1;
-               $ssllib="GnuTLS";
            }
            elsif ($libcurl =~ /nss/i) {
                $has_nss=1;
                $has_sslpinning=1;
-               $ssllib="NSS";
            }
-           elsif ($libcurl =~ /(yassl|wolfssl)/i) {
-               $has_yassl=1;
+           elsif ($libcurl =~ /wolfssl/i) {
+               $has_wolfssl=1;
                $has_sslpinning=1;
-               $ssllib="yassl";
            }
            elsif ($libcurl =~ /polarssl/i) {
                $has_polarssl=1;
                $has_sslpinning=1;
-               $ssllib="polarssl";
-           }
-           elsif ($libcurl =~ /axtls/i) {
-               $has_axtls=1;
-               $ssllib="axTLS";
            }
            elsif ($libcurl =~ /securetransport/i) {
                $has_darwinssl=1;
                $has_sslpinning=1;
-               $ssllib="DarwinSSL";
            }
            elsif ($libcurl =~ /BoringSSL/i) {
                $has_boringssl=1;
                $has_sslpinning=1;
-               $ssllib="BoringSSL";
            }
            elsif ($libcurl =~ /libressl/i) {
                $has_libressl=1;
                $has_sslpinning=1;
-               $ssllib="libressl";
            }
            elsif ($libcurl =~ /mbedTLS/i) {
                $has_mbedtls=1;
                $has_sslpinning=1;
-               $ssllib="mbedTLS";
            }
            if ($libcurl =~ /ares/i) {
                $has_cares=1;
@@ -2750,7 +2758,6 @@ sub checksystem {
            }
            if ($libcurl =~ /mesalink/i) {
                $has_mesalink=1;
-               $ssllib="MesaLink";
            }
         }
         elsif($_ =~ /^Protocols: (.*)/i) {
@@ -2856,6 +2863,10 @@ sub checksystem {
                 # PSL enabled
                 $has_psl=1;
             }
+            if($feat =~ /alt-svc/i) {
+                # alt-svc enabled
+                $has_altsvc=1;
+            }
             if($feat =~ /AsynchDNS/i) {
                 if(!$has_cares) {
                     # this means threaded resolver
@@ -2928,7 +2939,8 @@ sub checksystem {
         # client has IPv6 support
 
         # check if the HTTP server has it!
-        my @sws = `server/sws --version`;
+        my $cmd = "server/sws".exe_ext('SRV')." --version";
+        my @sws = `$cmd`;
         if($sws[0] =~ /IPv6/) {
             # HTTP server has IPv6 support!
             $http_ipv6 = 1;
@@ -2936,7 +2948,8 @@ sub checksystem {
         }
 
         # check if the FTP server has it!
-        @sws = `server/sockfilt --version`;
+        $cmd = "server/sockfilt".exe_ext('SRV')." --version";
+        @sws = `$cmd`;
         if($sws[0] =~ /IPv6/) {
             # FTP server has IPv6 support!
             $ftp_ipv6 = 1;
@@ -2945,7 +2958,8 @@ sub checksystem {
 
     if($has_unix) {
         # client has Unix sockets support, check whether the HTTP server has it
-        my @sws = `server/sws --version`;
+        my $cmd = "server/sws".exe_ext('SRV')." --version";
+        my @sws = `$cmd`;
         $http_unix = 1 if($sws[0] =~ /unix/);
     }
 
@@ -2972,11 +2986,12 @@ sub checksystem {
     my $hosttype=join(' ', runclientoutput("uname -a"));
 
     logmsg ("********* System characteristics ******** \n",
-    "* $curl\n",
-    "* $libcurl\n",
-    "* Features: $feat\n",
-    "* Host: $hostname",
-    "* System: $hosttype");
+            "* $curl\n",
+            "* $libcurl\n",
+            "* Features: $feat\n",
+            "* Disabled: $dis\n",
+            "* Host: $hostname",
+            "* System: $hosttype");
 
     if($has_memory_tracking && $has_threadedres) {
         $has_memory_tracking = 0;
@@ -3045,9 +3060,14 @@ sub checksystem {
             }
         }
     }
-    $has_textaware = ($^O eq 'MSWin32') || ($^O eq 'msys');
 
     logmsg "***************************************** \n";
+
+    setupfeatures();
+    # toggle off the features that were disabled in the build
+    for my $d(@disabled) {
+        $feature{$d} = 0;
+    }
 }
 
 #######################################################################
@@ -3119,6 +3139,13 @@ sub subVariables {
   $$thing =~ s/%CURL/$CURL/g;
   $$thing =~ s/%PWD/$pwd/g;
   $$thing =~ s/%POSIX_PWD/$posix_pwd/g;
+
+  my $file_pwd = $pwd;
+  if($file_pwd !~ /^\//) {
+      $file_pwd = "/$file_pwd";
+  }
+
+  $$thing =~ s/%FILE_PWD/$file_pwd/g;
   $$thing =~ s/%SRCDIR/$srcdir/g;
   $$thing =~ s/%USER/$USER/g;
 
@@ -3209,16 +3236,18 @@ sub singletest {
 
     my @what;
     my $why;
-    my %feature;
     my $cmd;
     my $disablevalgrind;
 
+    # fist, remove all lingering log files
+    cleardir($LOGDIR);
+
     # copy test number to a global scope var, this allows
     # testnum checking when starting test harness servers.
     $testnumcheck = $testnum;
 
     # timestamp test preparation start
-    $timeprepini{$testnum} = Time::HiRes::time() if($timestats);
+    $timeprepini{$testnum} = Time::HiRes::time();
 
     if($disttests !~ /test$testnum\W/ ) {
         logmsg "Warning: test$testnum not present in tests/data/Makefile.inc\n";
@@ -3245,177 +3274,7 @@ sub singletest {
         $f =~ s/\s//g;
 
         if($f =~ /^([^!].*)$/) {
-            # Store the feature for later
-            $feature{$1} = $1;
-
-            if($1 eq "SSL") {
-                if($has_ssl) {
-                    next;
-                }
-            }
-            elsif($1 eq "MultiSSL") {
-                if($has_multissl) {
-                    next;
-                }
-            }
-            elsif($1 eq "SSLpinning") {
-                if($has_sslpinning) {
-                    next;
-                }
-            }
-            elsif($1 eq "OpenSSL") {
-                if($has_openssl) {
-                    next;
-                }
-            }
-            elsif($1 eq "GnuTLS") {
-                if($has_gnutls) {
-                    next;
-                }
-            }
-            elsif($1 eq "NSS") {
-                if($has_nss) {
-                    next;
-                }
-            }
-            elsif($1 eq "axTLS") {
-                if($has_axtls) {
-                    next;
-                }
-            }
-            elsif($1 eq "WinSSL") {
-                if($has_winssl) {
-                    next;
-                }
-            }
-            elsif($1 eq "DarwinSSL") {
-                if($has_darwinssl) {
-                    next;
-                }
-            }
-            elsif($1 eq "ld_preload") {
-                if($has_ldpreload && !$debug_build) {
-                    next;
-                }
-            }
-            elsif($1 eq "unittest") {
-                if($debug_build) {
-                    next;
-                }
-            }
-            elsif($1 eq "debug") {
-                if($debug_build) {
-                    next;
-                }
-            }
-            elsif($1 eq "TrackMemory") {
-                if($has_memory_tracking) {
-                    next;
-                }
-            }
-            elsif($1 eq "large_file") {
-                if($has_largefile) {
-                    next;
-                }
-            }
-            elsif($1 eq "idn") {
-                if($has_idn) {
-                    next;
-                }
-            }
-            elsif($1 eq "ipv6") {
-                if($has_ipv6) {
-                    next;
-                }
-            }
-            elsif($1 eq "libz") {
-                if($has_libz) {
-                    next;
-                }
-            }
-            elsif($1 eq "brotli") {
-                if($has_brotli) {
-                    next;
-                }
-            }
-            elsif($1 eq "NTLM") {
-                if($has_ntlm) {
-                    next;
-                }
-            }
-            elsif($1 eq "NTLM_WB") {
-                if($has_ntlm_wb) {
-                    next;
-                }
-            }
-            elsif($1 eq "SSPI") {
-                if($has_sspi) {
-                    next;
-                }
-            }
-            elsif($1 eq "GSS-API") {
-                if($has_gssapi) {
-                    next;
-                }
-            }
-            elsif($1 eq "Kerberos") {
-                if($has_kerberos) {
-                    next;
-                }
-            }
-            elsif($1 eq "SPNEGO") {
-                if($has_spnego) {
-                    next;
-                }
-            }
-            elsif($1 eq "getrlimit") {
-                if($has_getrlimit) {
-                    next;
-                }
-            }
-            elsif($1 eq "crypto") {
-                if($has_crypto) {
-                    next;
-                }
-            }
-            elsif($1 eq "TLS-SRP") {
-                if($has_tls_srp) {
-                    next;
-                }
-            }
-            elsif($1 eq "Metalink") {
-                if($has_metalink) {
-                    next;
-                }
-            }
-            elsif($1 eq "http/2") {
-                if($has_http2) {
-                    next;
-                }
-            }
-            elsif($1 eq "threaded-resolver") {
-                if($has_threadedres) {
-                    next;
-                }
-            }
-            elsif($1 eq "PSL") {
-                if($has_psl) {
-                    next;
-                }
-            }
-            elsif($1 eq "manual") {
-                if($has_manual) {
-                    next;
-                }
-            }
-            elsif($1 eq "socks") {
-                next;
-            }
-            elsif($1 eq "unix-sockets") {
-                next if $has_unix;
-            }
-            # See if this "feature" is in the list of supported protocols
-            elsif (grep /^\Q$1\E$/i, @protocols) {
+            if($feature{$1}) {
                 next;
             }
 
@@ -3431,140 +3290,7 @@ sub singletest {
             $f =~ s/\s//g;
 
             if($f =~ /^!(.*)$/) {
-                if($1 eq "SSL") {
-                    if(!$has_ssl) {
-                        next;
-                    }
-                }
-                elsif($1 eq "MultiSSL") {
-                    if(!$has_multissl) {
-                        next;
-                    }
-                }
-                elsif($1 eq "OpenSSL") {
-                    if(!$has_openssl) {
-                        next;
-                    }
-                }
-                elsif($1 eq "GnuTLS") {
-                    if(!$has_gnutls) {
-                        next;
-                    }
-                }
-                elsif($1 eq "NSS") {
-                    if(!$has_nss) {
-                        next;
-                    }
-                }
-                elsif($1 eq "axTLS") {
-                    if(!$has_axtls) {
-                        next;
-                    }
-                }
-                elsif($1 eq "WinSSL") {
-                    if(!$has_winssl) {
-                        next;
-                    }
-                }
-                elsif($1 eq "DarwinSSL") {
-                    if(!$has_darwinssl) {
-                        next;
-                    }
-                }
-                elsif($1 eq "TrackMemory") {
-                    if(!$has_memory_tracking) {
-                        next;
-                    }
-                }
-                elsif($1 eq "large_file") {
-                    if(!$has_largefile) {
-                        next;
-                    }
-                }
-                elsif($1 eq "idn") {
-                    if(!$has_idn) {
-                        next;
-                    }
-                }
-                elsif($1 eq "ipv6") {
-                    if(!$has_ipv6) {
-                        next;
-                    }
-                }
-                elsif($1 eq "unix-sockets") {
-                    next if !$has_unix;
-                }
-                elsif($1 eq "libz") {
-                    if(!$has_libz) {
-                        next;
-                    }
-                }
-                elsif($1 eq "brotli") {
-                    if(!$has_brotli) {
-                        next;
-                    }
-                }
-                elsif($1 eq "NTLM") {
-                    if(!$has_ntlm) {
-                        next;
-                    }
-                }
-                elsif($1 eq "NTLM_WB") {
-                    if(!$has_ntlm_wb) {
-                        next;
-                    }
-                }
-                elsif($1 eq "SSPI") {
-                    if(!$has_sspi) {
-                        next;
-                    }
-                }
-                elsif($1 eq "GSS-API") {
-                    if(!$has_gssapi) {
-                        next;
-                    }
-                }
-                elsif($1 eq "Kerberos") {
-                    if(!$has_kerberos) {
-                        next;
-                    }
-                }
-                elsif($1 eq "SPNEGO") {
-                    if(!$has_spnego) {
-                        next;
-                    }
-                }
-                elsif($1 eq "getrlimit") {
-                    if(!$has_getrlimit) {
-                        next;
-                    }
-                }
-                elsif($1 eq "crypto") {
-                    if(!$has_crypto) {
-                        next;
-                    }
-                }
-                elsif($1 eq "TLS-SRP") {
-                    if(!$has_tls_srp) {
-                        next;
-                    }
-                }
-                elsif($1 eq "Metalink") {
-                    if(!$has_metalink) {
-                        next;
-                    }
-                }
-                elsif($1 eq "PSL") {
-                    if(!$has_psl) {
-                        next;
-                    }
-                }
-                elsif($1 eq "threaded-resolver") {
-                    if(!$has_threadedres) {
-                        next;
-                    }
-                }
-                else {
+                if(!$feature{$1}) {
                     next;
                 }
             }
@@ -3619,14 +3345,14 @@ sub singletest {
     unlink($FTPDCMD) if(-f $FTPDCMD);
 
     # timestamp required servers verification start
-    $timesrvrini{$testnum} = Time::HiRes::time() if($timestats);
+    $timesrvrini{$testnum} = Time::HiRes::time();
 
     if(!$why) {
         $why = serverfortest($testnum);
     }
 
     # timestamp required servers verification end
-    $timesrvrend{$testnum} = Time::HiRes::time() if($timestats);
+    $timesrvrend{$testnum} = Time::HiRes::time();
 
     my @setenv = getpart("client", "setenv");
     if(@setenv) {
@@ -3643,7 +3369,7 @@ sub singletest {
                 }
                 else {
                     if($var =~ /^LD_PRELOAD/) {
-                        if(exe_ext() && (exe_ext() eq '.exe')) {
+                        if(exe_ext('TOOL') && (exe_ext('TOOL') eq '.exe')) {
                             # print "Skipping LD_PRELOAD due to lack of OS support\n";
                             next;
                         }
@@ -3653,6 +3379,7 @@ sub singletest {
                         }
                     }
                     $ENV{$var} = "$content";
+                    print "setenv $var = $content\n" if($verbose);
                 }
             }
         }
@@ -3755,6 +3482,7 @@ sub singletest {
 
     # if this section exists, we verify that the stdout contained this:
     my @validstdout = fixarray ( getpart("verify", "stdout") );
+    my @validstderr = fixarray ( getpart("verify", "stderr") );
 
     # if this section exists, we verify upload
     my @upload = getpart("verify", "upload");
@@ -3767,7 +3495,7 @@ sub singletest {
     }
 
     # if this section exists, it might be FTP server instructions:
-    my @ftpservercmd = getpart("reply", "servercmd");
+    my @ftpservercmd = fixarray ( getpart("reply", "servercmd") );
 
     my $CURLOUT="$LOGDIR/curl$testnum.out"; # curl output if not stdout
 
@@ -3788,6 +3516,7 @@ sub singletest {
     if(@codepieces) {
         $tool = $codepieces[0];
         chomp $tool;
+        $tool .= exe_ext('TOOL');
     }
 
     # remove server output logfile
@@ -3874,7 +3603,7 @@ sub singletest {
     if($cmdtype eq "perl") {
         # run the command line prepended with "perl"
         $cmdargs ="$cmd";
-        $CMDLINE = "perl ";
+        $CMDLINE = "$perl ";
         $tool=$CMDLINE;
         $disablevalgrind=1;
     }
@@ -3887,8 +3616,6 @@ sub singletest {
     }
     elsif(!$tool) {
         # run curl, add suitable command line options
-        $cmd = "-1 ".$cmd if(exists $feature{"SSL"} && ($has_axtls));
-
         my $inc="";
         if((!$cmdhash{'option'}) || ($cmdhash{'option'} !~ /no-include/)) {
             $inc = " --include";
@@ -3993,7 +3720,7 @@ sub singletest {
     }
 
     # timestamp starting of test command
-    $timetoolini{$testnum} = Time::HiRes::time() if($timestats);
+    $timetoolini{$testnum} = Time::HiRes::time();
 
     # run the command line we built
     if ($torture) {
@@ -4021,7 +3748,7 @@ sub singletest {
     }
 
     # timestamp finishing of test command
-    $timetoolend{$testnum} = Time::HiRes::time() if($timestats);
+    $timetoolend{$testnum} = Time::HiRes::time();
 
     if(!$dumped_core) {
         if(-r "core") {
@@ -4071,7 +3798,7 @@ sub singletest {
     sleep($postcommanddelay) if($postcommanddelay);
 
     # timestamp removal of server logs advisor read lock
-    $timesrvrlog{$testnum} = Time::HiRes::time() if($timestats);
+    $timesrvrlog{$testnum} = Time::HiRes::time();
 
     # test definition might instruct to stop some servers
     # stop also all servers relative to the given one
@@ -4156,7 +3883,7 @@ sub singletest {
             if($rc != 0 && !$torture) {
                 logmsg " postcheck FAILED\n";
                 # timestamp test result verification end
-                $timevrfyend{$testnum} = Time::HiRes::time() if($timestats);
+                $timevrfyend{$testnum} = Time::HiRes::time();
                 return 1;
             }
         }
@@ -4176,11 +3903,8 @@ sub singletest {
 
     # Skip all the verification on torture tests
     if ($torture) {
-        if(!$cmdres && !$keepoutfiles) {
-            cleardir($LOGDIR);
-        }
         # timestamp test result verification end
-        $timevrfyend{$testnum} = Time::HiRes::time() if($timestats);
+        $timevrfyend{$testnum} = Time::HiRes::time();
         return $cmdres;
     }
 
@@ -4240,6 +3964,57 @@ sub singletest {
         $ok .= "-"; # stdout not checked
     }
 
+    if (@validstderr) {
+        # verify redirected stderr
+        my @actual = loadarray($STDERR);
+
+        # what parts to cut off from stderr
+        my @stripfile = getpart("verify", "stripfile");
+
+        foreach my $strip (@stripfile) {
+            chomp $strip;
+            my @newgen;
+            for(@actual) {
+                eval $strip;
+                if($_) {
+                    push @newgen, $_;
+                }
+            }
+            # this is to get rid of array entries that vanished (zero
+            # length) because of replacements
+            @actual = @newgen;
+        }
+
+        # variable-replace in the stderr we have from the test case file
+        @validstderr = fixarray(@validstderr);
+
+        # get all attributes
+        my %hash = getpartattr("verify", "stderr");
+
+        # get the mode attribute
+        my $filemode=$hash{'mode'};
+        if($filemode && ($filemode eq "text") && $has_textaware) {
+            # text mode when running on windows: fix line endings
+            map s/\r\n/\n/g, @validstderr;
+            map s/\n/\r\n/g, @validstderr;
+        }
+
+        if($hash{'nonewline'}) {
+            # Yes, we must cut off the final newline from the final line
+            # of the protocol data
+            chomp($validstderr[$#validstderr]);
+        }
+
+        $res = compare($testnum, $testname, "stderr", \@actual, \@validstderr);
+        if($res) {
+            return 1;
+        }
+        $ok .= "r";
+    }
+    else {
+        $ok .= "-"; # stderr not checked
+    }
+
     if(@protocol) {
         # Verify the sent request
         my @out = loadarray($SERVERIN);
@@ -4386,7 +4161,7 @@ sub singletest {
                        "has no name attribute\n";
                 stopservers($verbose);
                 # timestamp test result verification end
-                $timevrfyend{$testnum} = Time::HiRes::time() if($timestats);
+                $timevrfyend{$testnum} = Time::HiRes::time();
                 return -1;
             }
             my @generated=loadarray($filename);
@@ -4450,7 +4225,7 @@ sub singletest {
         }
         logmsg " exit FAILED\n";
         # timestamp test result verification end
-        $timevrfyend{$testnum} = Time::HiRes::time() if($timestats);
+        $timevrfyend{$testnum} = Time::HiRes::time();
         return 1;
     }
 
@@ -4473,7 +4248,7 @@ sub singletest {
                 logmsg "\n** MEMORY FAILURE\n";
                 logmsg @memdata;
                 # timestamp test result verification end
-                $timevrfyend{$testnum} = Time::HiRes::time() if($timestats);
+                $timevrfyend{$testnum} = Time::HiRes::time();
                 return 1;
             }
             else {
@@ -4490,7 +4265,7 @@ sub singletest {
             unless(opendir(DIR, "$LOGDIR")) {
                 logmsg "ERROR: unable to read $LOGDIR\n";
                 # timestamp test result verification end
-                $timevrfyend{$testnum} = Time::HiRes::time() if($timestats);
+                $timevrfyend{$testnum} = Time::HiRes::time();
                 return 1;
             }
             my @files = readdir(DIR);
@@ -4505,7 +4280,7 @@ sub singletest {
             if(!$vgfile) {
                 logmsg "ERROR: valgrind log file missing for test $testnum\n";
                 # timestamp test result verification end
-                $timevrfyend{$testnum} = Time::HiRes::time() if($timestats);
+                $timevrfyend{$testnum} = Time::HiRes::time();
                 return 1;
             }
             my @e = valgrindparse("$LOGDIR/$vgfile");
@@ -4518,7 +4293,7 @@ sub singletest {
                     logmsg @e;
                 }
                 # timestamp test result verification end
-                $timevrfyend{$testnum} = Time::HiRes::time() if($timestats);
+                $timevrfyend{$testnum} = Time::HiRes::time();
                 return 1;
             }
             $ok .= "v";
@@ -4538,27 +4313,26 @@ sub singletest {
 
     logmsg "$ok " if(!$short);
 
+    # timestamp test result verification end
+    $timevrfyend{$testnum} = Time::HiRes::time();
+
     my $sofar= time()-$start;
     my $esttotal = $sofar/$count * $total;
     my $estleft = $esttotal - $sofar;
     my $left=sprintf("remaining: %02d:%02d",
                      $estleft/60,
                      $estleft%60);
-
+    my $took = $timevrfyend{$testnum} - $timeprepini{$testnum};
+    my $duration = sprintf("duration: %02d:%02d",
+                           $sofar/60, $sofar%60);
     if(!$automakestyle) {
-        logmsg sprintf("OK (%-3d out of %-3d, %s)\n", $count, $total, $left);
+        logmsg sprintf("OK (%-3d out of %-3d, %s, took %.1fs, %s)\n",
+                       $count, $total, $left, $took, $duration);
     }
     else {
         logmsg "PASS: $testnum - $testname\n";
     }
 
-    # the test succeeded, remove all log files
-    if(!$keepoutfiles) {
-        cleardir($LOGDIR);
-    }
-
-    # timestamp test result verification end
-    $timevrfyend{$testnum} = Time::HiRes::time() if($timestats);
 
     return 0;
 }
@@ -4800,10 +4574,6 @@ sub startservers {
                 # we can't run ftps tests without stunnel
                 return "no stunnel";
             }
-            if(!$has_ssl) {
-                # we can't run ftps tests if libcurl is SSL-less
-                return "curl lacks SSL support";
-            }
             if($runcert{'ftps'} && ($runcert{'ftps'} ne $certfile)) {
                 # stop server when running and using a different cert
                 stopserver('ftps');
@@ -4838,10 +4608,6 @@ sub startservers {
                 # we can't run https tests without stunnel
                 return "no stunnel";
             }
-            if(!$has_ssl) {
-                # we can't run https tests if libcurl is SSL-less
-                return "curl lacks SSL support";
-            }
             if($runcert{'https'} && ($runcert{'https'} ne $certfile)) {
                 # stop server when running and using a different cert
                 stopserver('https');
@@ -4935,7 +4701,7 @@ sub startservers {
                 $run{'tftp-ipv6'}="$pid $pid2";
             }
         }
-        elsif($what eq "sftp" || $what eq "scp" || $what eq "socks4" || $what eq "socks5" ) {
+        elsif($what eq "sftp" || $what eq "scp") {
             if(!$run{'ssh'}) {
                 ($pid, $pid2) = runsshserver("", $verbose);
                 if($pid <= 0) {
@@ -4944,32 +4710,15 @@ sub startservers {
                 printf ("* pid ssh => %d %d\n", $pid, $pid2) if($verbose);
                 $run{'ssh'}="$pid $pid2";
             }
-            if($what eq "socks4" || $what eq "socks5") {
-                if(!$run{'socks'}) {
-                    ($pid, $pid2) = runsocksserver("", $verbose);
-                    if($pid <= 0) {
-                        return "failed starting socks server";
-                    }
-                    printf ("* pid socks => %d %d\n", $pid, $pid2) if($verbose);
-                    $run{'socks'}="$pid $pid2";
-                }
-            }
-            if($what eq "socks5") {
-                if(!$sshdid) {
-                    # Not an OpenSSH or SunSSH ssh daemon
-                    logmsg "Not OpenSSH or SunSSH; socks5 tests need at least OpenSSH 3.7\n";
-                    return "failed starting socks5 server";
-                }
-                elsif(($sshdid =~ /OpenSSH/) && ($sshdvernum < 370)) {
-                    # Need OpenSSH 3.7 for socks5 - https://www.openssh.com/txt/release-3.7
-                    logmsg "$sshdverstr insufficient; socks5 tests need at least OpenSSH 3.7\n";
-                    return "failed starting socks5 server";
-                }
-                elsif(($sshdid =~ /SunSSH/)  && ($sshdvernum < 100)) {
-                    # Need SunSSH 1.0 for socks5
-                    logmsg "$sshdverstr insufficient; socks5 tests need at least SunSSH 1.0\n";
-                    return "failed starting socks5 server";
+        }
+        elsif($what eq "socks4" || $what eq "socks5" ) {
+            if(!$run{'socks'}) {
+                ($pid, $pid2) = runsocksserver("", $verbose);
+                if($pid <= 0) {
+                    return "failed starting socks server";
                 }
+                printf ("* pid socks => %d %d\n", $pid, $pid2) if($verbose);
+                $run{'socks'}="$pid $pid2";
             }
         }
         elsif($what eq "http-unix") {
@@ -5297,6 +5046,18 @@ while(@ARGV) {
             $tortalloc = $1;
         }
     }
+    elsif($ARGV[0] =~ /--shallow=(\d+)(,|)(\d*)/) {
+        # Fail no more than this amount per tests when running
+        # torture.
+        my ($num, $seed)=($1,$3);
+        $shallow=$num;
+        $shallowseed=$seed?$seed:1234; # get a real seed later
+        srand($shallowseed); # make it predictable
+    }
+    elsif($ARGV[0] =~ /--repeat=(\d+)/) {
+        # Repeat-run the given tests this many times
+        $repeat = $1;
+    }
     elsif($ARGV[0] eq "-a") {
         # continue anyway, even if a test fail
         $anyway=1;
@@ -5345,6 +5106,7 @@ while(@ARGV) {
         print <<EOHELP
 Usage: runtests.pl [options] [test selection(s)]
   -a       continue even if a test fails
+  -am      automake style output PASS/FAIL: [number] [name]
   -bN      use base port number N for test servers (default $base)
   -c path  use this curl executable
   -d       display server debug info
@@ -5360,7 +5122,7 @@ Usage: runtests.pl [options] [test selection(s)]
   -r       run time statistics
   -rf      full run time statistics
   -s       short output
-  -am      automake style output PASS/FAIL: [number] [name]
+  --shallow=[num](,seed) make the torture tests thinner
   -t[N]    torture (simulate function failures); N means fail Nth function
   -v       verbose output
   -vc path use this curl only to verify the existing servers
@@ -5585,6 +5347,13 @@ else {
     }
     $TESTCASES = $verified;
 }
+if($repeat) {
+    my $s;
+    for(1 .. $repeat) {
+        $s .= $TESTCASES;
+    }
+    $TESTCASES = $s;
+}
 
 if($scrambleorder) {
     # scramble the order of the test cases
index c897ee5..969fb17 100755 (executable)
@@ -264,6 +264,11 @@ if($stunnel_version < 400) {
 #
 if($stunnel_version >= 400) {
     $socketopt = "a:SO_REUSEADDR=1";
+    if(($stunnel_version >= 534) && $tstunnel_windows) {
+        # SO_EXCLUSIVEADDRUSE is on by default on Vista or newer,
+        # but does not work together with SO_REUSEADDR being on.
+        $socketopt .= "\nsocket = a:SO_EXCLUSIVEADDRUSE=0";
+    }
     $cmd  = "$stunnel $conffile ";
     $cmd .= ">$logfile 2>&1";
     # setup signal handler
index 78b9b70..d532436 100644 (file)
@@ -1,7 +1,7 @@
 set(TARGET_LABEL_PREFIX "Test server ")
 
 if(MSVC)
-  set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /wd4127 /wd4306")
+  set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /wd4306")
 endif()
 
 function(SETUP_EXECUTABLE TEST_NAME)    # ARGN are the files in the test
index f2067f2..ca306e2 100644 (file)
@@ -5,7 +5,7 @@
 #                            | (__| |_| |  _ <| |___
 #                             \___|\___/|_| \_\_____|
 #
-# Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 #
 # This software is licensed as described in the file COPYING, which
 # you should have received as part of this distribution. The terms
@@ -56,8 +56,13 @@ include Makefile.inc
 
 EXTRA_DIST = base64.pl Makefile.inc CMakeLists.txt
 
+CHECKSRC = $(CS_$(V))
+CS_0 = @echo "  RUN     " $@;
+CS_1 =
+CS_ = $(CS_0)
+
 checksrc:
-       @PERL@ $(top_srcdir)/lib/checksrc.pl $(srcdir)/*.c
+       $(CHECKSRC)@PERL@ $(top_srcdir)/lib/checksrc.pl $(srcdir)/*.[ch]
 
 if CURLDEBUG
 # for debug builds, we scan the sources on all regular make invokes
index b29d402..9610523 100644 (file)
@@ -91,11 +91,10 @@ host_triplet = @host@
 @DOING_NATIVE_WINDOWS_TRUE@am__append_1 = -DCURL_STATICLIB
 noinst_PROGRAMS = getpart$(EXEEXT) resolve$(EXEEXT) rtspd$(EXEEXT) \
        sockfilt$(EXEEXT) sws$(EXEEXT) tftpd$(EXEEXT) \
-       fake_ntlm$(EXEEXT)
+       fake_ntlm$(EXEEXT) socksd$(EXEEXT) disabled$(EXEEXT)
 subdir = tests/server
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/ax_code_coverage.m4 \
-       $(top_srcdir)/m4/ax_compile_check_sizeof.m4 \
+am__aclocal_m4_deps = $(top_srcdir)/m4/ax_compile_check_sizeof.m4 \
        $(top_srcdir)/m4/curl-compilers.m4 \
        $(top_srcdir)/m4/curl-confopts.m4 \
        $(top_srcdir)/m4/curl-functions.m4 \
@@ -121,6 +120,13 @@ CONFIG_HEADER = $(top_builddir)/lib/curl_config.h
 CONFIG_CLEAN_FILES =
 CONFIG_CLEAN_VPATH_FILES =
 PROGRAMS = $(noinst_PROGRAMS)
+am_disabled_OBJECTS = disabled.$(OBJEXT)
+disabled_OBJECTS = $(am_disabled_OBJECTS)
+disabled_LDADD = $(LDADD)
+AM_V_lt = $(am__v_lt_@AM_V@)
+am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 = 
 am__dirstamp = $(am__leading_dot)dirstamp
 am__objects_1 = ../../lib/fake_ntlm-mprintf.$(OBJEXT) \
        ../../lib/fake_ntlm-nonblock.$(OBJEXT) \
@@ -137,10 +143,6 @@ am_fake_ntlm_OBJECTS = $(am__objects_1) $(am__objects_2) \
        fake_ntlm-fake_ntlm.$(OBJEXT)
 fake_ntlm_OBJECTS = $(am_fake_ntlm_OBJECTS)
 fake_ntlm_DEPENDENCIES =
-AM_V_lt = $(am__v_lt_@AM_V@)
-am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
-am__v_lt_0 = --silent
-am__v_lt_1 = 
 fake_ntlm_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
        $(LIBTOOLFLAGS) --mode=link $(CCLD) $(fake_ntlm_CFLAGS) \
        $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
@@ -209,33 +211,50 @@ sockfilt_DEPENDENCIES =
 sockfilt_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
        $(LIBTOOLFLAGS) --mode=link $(CCLD) $(sockfilt_CFLAGS) \
        $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
-am__objects_16 = ../../lib/sws-mprintf.$(OBJEXT) \
+am__objects_16 = ../../lib/socksd-mprintf.$(OBJEXT) \
+       ../../lib/socksd-nonblock.$(OBJEXT) \
+       ../../lib/socksd-strtoofft.$(OBJEXT) \
+       ../../lib/socksd-warnless.$(OBJEXT) \
+       ../../lib/socksd-curl_ctype.$(OBJEXT)
+am__objects_17 = socksd-getpart.$(OBJEXT) \
+       ../../lib/socksd-base64.$(OBJEXT) \
+       ../../lib/socksd-memdebug.$(OBJEXT)
+am__objects_18 = socksd-util.$(OBJEXT)
+am_socksd_OBJECTS = $(am__objects_16) $(am__objects_2) \
+       $(am__objects_17) $(am__objects_18) socksd-socksd.$(OBJEXT) \
+       ../../lib/socksd-inet_pton.$(OBJEXT)
+socksd_OBJECTS = $(am_socksd_OBJECTS)
+socksd_DEPENDENCIES =
+socksd_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+       $(LIBTOOLFLAGS) --mode=link $(CCLD) $(socksd_CFLAGS) $(CFLAGS) \
+       $(AM_LDFLAGS) $(LDFLAGS) -o $@
+am__objects_19 = ../../lib/sws-mprintf.$(OBJEXT) \
        ../../lib/sws-nonblock.$(OBJEXT) \
        ../../lib/sws-strtoofft.$(OBJEXT) \
        ../../lib/sws-warnless.$(OBJEXT) \
        ../../lib/sws-curl_ctype.$(OBJEXT)
-am__objects_17 = sws-getpart.$(OBJEXT) ../../lib/sws-base64.$(OBJEXT) \
+am__objects_20 = sws-getpart.$(OBJEXT) ../../lib/sws-base64.$(OBJEXT) \
        ../../lib/sws-memdebug.$(OBJEXT)
-am__objects_18 = sws-util.$(OBJEXT)
-am_sws_OBJECTS = $(am__objects_16) $(am__objects_2) $(am__objects_17) \
-       $(am__objects_18) sws-sws.$(OBJEXT) \
+am__objects_21 = sws-util.$(OBJEXT)
+am_sws_OBJECTS = $(am__objects_19) $(am__objects_2) $(am__objects_20) \
+       $(am__objects_21) sws-sws.$(OBJEXT) \
        ../../lib/sws-inet_pton.$(OBJEXT)
 sws_OBJECTS = $(am_sws_OBJECTS)
 sws_DEPENDENCIES =
 sws_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
        $(LIBTOOLFLAGS) --mode=link $(CCLD) $(sws_CFLAGS) $(CFLAGS) \
        $(AM_LDFLAGS) $(LDFLAGS) -o $@
-am__objects_19 = ../../lib/tftpd-mprintf.$(OBJEXT) \
+am__objects_22 = ../../lib/tftpd-mprintf.$(OBJEXT) \
        ../../lib/tftpd-nonblock.$(OBJEXT) \
        ../../lib/tftpd-strtoofft.$(OBJEXT) \
        ../../lib/tftpd-warnless.$(OBJEXT) \
        ../../lib/tftpd-curl_ctype.$(OBJEXT)
-am__objects_20 = tftpd-getpart.$(OBJEXT) \
+am__objects_23 = tftpd-getpart.$(OBJEXT) \
        ../../lib/tftpd-base64.$(OBJEXT) \
        ../../lib/tftpd-memdebug.$(OBJEXT)
-am__objects_21 = tftpd-util.$(OBJEXT)
-am_tftpd_OBJECTS = $(am__objects_19) $(am__objects_2) \
-       $(am__objects_20) $(am__objects_21) tftpd-tftpd.$(OBJEXT)
+am__objects_24 = tftpd-util.$(OBJEXT)
+am_tftpd_OBJECTS = $(am__objects_22) $(am__objects_2) \
+       $(am__objects_23) $(am__objects_24) tftpd-tftpd.$(OBJEXT)
 tftpd_OBJECTS = $(am_tftpd_OBJECTS)
 tftpd_DEPENDENCIES =
 tftpd_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
@@ -292,6 +311,14 @@ am__depfiles_remade = ../../lib/$(DEPDIR)/fake_ntlm-base64.Po \
        ../../lib/$(DEPDIR)/sockfilt-nonblock.Po \
        ../../lib/$(DEPDIR)/sockfilt-strtoofft.Po \
        ../../lib/$(DEPDIR)/sockfilt-warnless.Po \
+       ../../lib/$(DEPDIR)/socksd-base64.Po \
+       ../../lib/$(DEPDIR)/socksd-curl_ctype.Po \
+       ../../lib/$(DEPDIR)/socksd-inet_pton.Po \
+       ../../lib/$(DEPDIR)/socksd-memdebug.Po \
+       ../../lib/$(DEPDIR)/socksd-mprintf.Po \
+       ../../lib/$(DEPDIR)/socksd-nonblock.Po \
+       ../../lib/$(DEPDIR)/socksd-strtoofft.Po \
+       ../../lib/$(DEPDIR)/socksd-warnless.Po \
        ../../lib/$(DEPDIR)/sws-base64.Po \
        ../../lib/$(DEPDIR)/sws-curl_ctype.Po \
        ../../lib/$(DEPDIR)/sws-inet_pton.Po \
@@ -306,7 +333,7 @@ am__depfiles_remade = ../../lib/$(DEPDIR)/fake_ntlm-base64.Po \
        ../../lib/$(DEPDIR)/tftpd-mprintf.Po \
        ../../lib/$(DEPDIR)/tftpd-nonblock.Po \
        ../../lib/$(DEPDIR)/tftpd-strtoofft.Po \
-       ../../lib/$(DEPDIR)/tftpd-warnless.Po \
+       ../../lib/$(DEPDIR)/tftpd-warnless.Po ./$(DEPDIR)/disabled.Po \
        ./$(DEPDIR)/fake_ntlm-fake_ntlm.Po \
        ./$(DEPDIR)/fake_ntlm-getpart.Po ./$(DEPDIR)/fake_ntlm-util.Po \
        ./$(DEPDIR)/getpart-getpart.Po ./$(DEPDIR)/getpart-testpart.Po \
@@ -315,9 +342,11 @@ am__depfiles_remade = ../../lib/$(DEPDIR)/fake_ntlm-base64.Po \
        ./$(DEPDIR)/rtspd-rtspd.Po ./$(DEPDIR)/rtspd-util.Po \
        ./$(DEPDIR)/sockfilt-getpart.Po \
        ./$(DEPDIR)/sockfilt-sockfilt.Po ./$(DEPDIR)/sockfilt-util.Po \
-       ./$(DEPDIR)/sws-getpart.Po ./$(DEPDIR)/sws-sws.Po \
-       ./$(DEPDIR)/sws-util.Po ./$(DEPDIR)/tftpd-getpart.Po \
-       ./$(DEPDIR)/tftpd-tftpd.Po ./$(DEPDIR)/tftpd-util.Po
+       ./$(DEPDIR)/socksd-getpart.Po ./$(DEPDIR)/socksd-socksd.Po \
+       ./$(DEPDIR)/socksd-util.Po ./$(DEPDIR)/sws-getpart.Po \
+       ./$(DEPDIR)/sws-sws.Po ./$(DEPDIR)/sws-util.Po \
+       ./$(DEPDIR)/tftpd-getpart.Po ./$(DEPDIR)/tftpd-tftpd.Po \
+       ./$(DEPDIR)/tftpd-util.Po
 am__mv = mv -f
 COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
        $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
@@ -337,12 +366,13 @@ AM_V_CCLD = $(am__v_CCLD_@AM_V@)
 am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
 am__v_CCLD_0 = @echo "  CCLD    " $@;
 am__v_CCLD_1 = 
-SOURCES = $(fake_ntlm_SOURCES) $(getpart_SOURCES) $(resolve_SOURCES) \
-       $(rtspd_SOURCES) $(sockfilt_SOURCES) $(sws_SOURCES) \
-       $(tftpd_SOURCES)
-DIST_SOURCES = $(fake_ntlm_SOURCES) $(getpart_SOURCES) \
+SOURCES = $(disabled_SOURCES) $(fake_ntlm_SOURCES) $(getpart_SOURCES) \
        $(resolve_SOURCES) $(rtspd_SOURCES) $(sockfilt_SOURCES) \
-       $(sws_SOURCES) $(tftpd_SOURCES)
+       $(socksd_SOURCES) $(sws_SOURCES) $(tftpd_SOURCES)
+DIST_SOURCES = $(disabled_SOURCES) $(fake_ntlm_SOURCES) \
+       $(getpart_SOURCES) $(resolve_SOURCES) $(rtspd_SOURCES) \
+       $(sockfilt_SOURCES) $(socksd_SOURCES) $(sws_SOURCES) \
+       $(tftpd_SOURCES)
 am__can_run_installinfo = \
   case $$AM_UPDATE_INFO_DIR in \
     n|no|NO) false;; \
@@ -385,12 +415,6 @@ CC = @CC@
 CCDEPMODE = @CCDEPMODE@
 CFLAGS = @CFLAGS@
 CFLAG_CURL_SYMBOL_HIDING = @CFLAG_CURL_SYMBOL_HIDING@
-CODE_COVERAGE_CFLAGS = @CODE_COVERAGE_CFLAGS@
-CODE_COVERAGE_CPPFLAGS = @CODE_COVERAGE_CPPFLAGS@
-CODE_COVERAGE_CXXFLAGS = @CODE_COVERAGE_CXXFLAGS@
-CODE_COVERAGE_ENABLED = @CODE_COVERAGE_ENABLED@
-CODE_COVERAGE_LDFLAGS = @CODE_COVERAGE_LDFLAGS@
-CODE_COVERAGE_LIBS = @CODE_COVERAGE_LIBS@
 CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
@@ -432,14 +456,15 @@ ENABLE_SHARED = @ENABLE_SHARED@
 ENABLE_STATIC = @ENABLE_STATIC@
 EXEEXT = @EXEEXT@
 FGREP = @FGREP@
+FISH_FUNCTIONS_DIR = @FISH_FUNCTIONS_DIR@
 GCOV = @GCOV@
-GENHTML = @GENHTML@
 GREP = @GREP@
 HAVE_BROTLI = @HAVE_BROTLI@
 HAVE_GNUTLS_SRP = @HAVE_GNUTLS_SRP@
 HAVE_LDAP_SSL = @HAVE_LDAP_SSL@
 HAVE_LIBZ = @HAVE_LIBZ@
 HAVE_OPENSSL_SRP = @HAVE_OPENSSL_SRP@
+HAVE_PROTO_BSDSOCKET_H = @HAVE_PROTO_BSDSOCKET_H@
 IDN_ENABLED = @IDN_ENABLED@
 INSTALL = @INSTALL@
 INSTALL_DATA = @INSTALL_DATA@
@@ -502,9 +527,7 @@ STRIP = @STRIP@
 SUPPORT_FEATURES = @SUPPORT_FEATURES@
 SUPPORT_PROTOCOLS = @SUPPORT_PROTOCOLS@
 USE_ARES = @USE_ARES@
-USE_AXTLS = @USE_AXTLS@
-USE_CYASSL = @USE_CYASSL@
-USE_DARWINSSL = @USE_DARWINSSL@
+USE_BEARSSL = @USE_BEARSSL@
 USE_GNUTLS = @USE_GNUTLS@
 USE_GNUTLS_NETTLE = @USE_GNUTLS_NETTLE@
 USE_LIBRTMP = @USE_LIBRTMP@
@@ -513,12 +536,17 @@ USE_LIBSSH2 = @USE_LIBSSH2@
 USE_MBEDTLS = @USE_MBEDTLS@
 USE_MESALINK = @USE_MESALINK@
 USE_NGHTTP2 = @USE_NGHTTP2@
+USE_NGHTTP3 = @USE_NGHTTP3@
+USE_NGTCP2 = @USE_NGTCP2@
+USE_NGTCP2_CRYPTO_OPENSSL = @USE_NGTCP2_CRYPTO_OPENSSL@
 USE_NSS = @USE_NSS@
 USE_OPENLDAP = @USE_OPENLDAP@
-USE_POLARSSL = @USE_POLARSSL@
+USE_QUICHE = @USE_QUICHE@
 USE_SCHANNEL = @USE_SCHANNEL@
+USE_SECTRANSP = @USE_SECTRANSP@
 USE_UNIX_SOCKETS = @USE_UNIX_SOCKETS@
 USE_WINDOWS_SSPI = @USE_WINDOWS_SSPI@
+USE_WOLFSSL = @USE_WOLFSSL@
 VERSION = @VERSION@
 VERSIONNUM = @VERSIONNUM@
 ZLIB_LIBS = @ZLIB_LIBS@
@@ -586,7 +614,7 @@ top_srcdir = @top_srcdir@
 #                            | (__| |_| |  _ <| |___
 #                             \___|\___/|_| \_\_____|
 #
-# Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 #
 # This software is licensed as described in the file COPYING, which
 # you should have received as part of this distribution. The terms
@@ -670,6 +698,12 @@ sockfilt_SOURCES = $(CURLX_SRCS) $(CURLX_HDRS) $(USEFUL) $(UTIL) \
 
 sockfilt_LDADD = @CURL_NETWORK_AND_TIME_LIBS@
 sockfilt_CFLAGS = $(AM_CFLAGS)
+socksd_SOURCES = $(CURLX_SRCS) $(CURLX_HDRS) $(USEFUL) $(UTIL) \
+ server_sockaddr.h socksd.c \
+ ../../lib/inet_pton.c
+
+socksd_LDADD = @CURL_NETWORK_AND_TIME_LIBS@
+socksd_CFLAGS = $(AM_CFLAGS)
 sws_SOURCES = $(CURLX_SRCS) $(CURLX_HDRS) $(USEFUL) $(UTIL) \
  server_sockaddr.h \
  sws.c \
@@ -689,9 +723,14 @@ fake_ntlm_SOURCES = $(CURLX_SRCS) $(CURLX_HDRS) $(USEFUL) $(UTIL) \
 
 fake_ntlm_LDADD = @CURL_NETWORK_AND_TIME_LIBS@
 fake_ntlm_CFLAGS = $(AM_CFLAGS)
+disabled_SOURCES = disabled.c
 
 # Makefile.inc provides neat definitions
 EXTRA_DIST = base64.pl Makefile.inc CMakeLists.txt
+CHECKSRC = $(CS_$(V))
+CS_0 = @echo "  RUN     " $@;
+CS_1 = 
+CS_ = $(CS_0)
 all: all-am
 
 .SUFFIXES:
@@ -735,6 +774,10 @@ clean-noinstPROGRAMS:
        list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
        echo " rm -f" $$list; \
        rm -f $$list
+
+disabled$(EXEEXT): $(disabled_OBJECTS) $(disabled_DEPENDENCIES) $(EXTRA_disabled_DEPENDENCIES) 
+       @rm -f disabled$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(disabled_OBJECTS) $(disabled_LDADD) $(LIBS)
 ../../lib/$(am__dirstamp):
        @$(MKDIR_P) ../../lib
        @: > ../../lib/$(am__dirstamp)
@@ -833,6 +876,26 @@ rtspd$(EXEEXT): $(rtspd_OBJECTS) $(rtspd_DEPENDENCIES) $(EXTRA_rtspd_DEPENDENCIE
 sockfilt$(EXEEXT): $(sockfilt_OBJECTS) $(sockfilt_DEPENDENCIES) $(EXTRA_sockfilt_DEPENDENCIES) 
        @rm -f sockfilt$(EXEEXT)
        $(AM_V_CCLD)$(sockfilt_LINK) $(sockfilt_OBJECTS) $(sockfilt_LDADD) $(LIBS)
+../../lib/socksd-mprintf.$(OBJEXT): ../../lib/$(am__dirstamp) \
+       ../../lib/$(DEPDIR)/$(am__dirstamp)
+../../lib/socksd-nonblock.$(OBJEXT): ../../lib/$(am__dirstamp) \
+       ../../lib/$(DEPDIR)/$(am__dirstamp)
+../../lib/socksd-strtoofft.$(OBJEXT): ../../lib/$(am__dirstamp) \
+       ../../lib/$(DEPDIR)/$(am__dirstamp)
+../../lib/socksd-warnless.$(OBJEXT): ../../lib/$(am__dirstamp) \
+       ../../lib/$(DEPDIR)/$(am__dirstamp)
+../../lib/socksd-curl_ctype.$(OBJEXT): ../../lib/$(am__dirstamp) \
+       ../../lib/$(DEPDIR)/$(am__dirstamp)
+../../lib/socksd-base64.$(OBJEXT): ../../lib/$(am__dirstamp) \
+       ../../lib/$(DEPDIR)/$(am__dirstamp)
+../../lib/socksd-memdebug.$(OBJEXT): ../../lib/$(am__dirstamp) \
+       ../../lib/$(DEPDIR)/$(am__dirstamp)
+../../lib/socksd-inet_pton.$(OBJEXT): ../../lib/$(am__dirstamp) \
+       ../../lib/$(DEPDIR)/$(am__dirstamp)
+
+socksd$(EXEEXT): $(socksd_OBJECTS) $(socksd_DEPENDENCIES) $(EXTRA_socksd_DEPENDENCIES) 
+       @rm -f socksd$(EXEEXT)
+       $(AM_V_CCLD)$(socksd_LINK) $(socksd_OBJECTS) $(socksd_LDADD) $(LIBS)
 ../../lib/sws-mprintf.$(OBJEXT): ../../lib/$(am__dirstamp) \
        ../../lib/$(DEPDIR)/$(am__dirstamp)
 ../../lib/sws-nonblock.$(OBJEXT): ../../lib/$(am__dirstamp) \
@@ -915,6 +978,14 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/sockfilt-nonblock.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/sockfilt-strtoofft.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/sockfilt-warnless.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/socksd-base64.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/socksd-curl_ctype.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/socksd-inet_pton.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/socksd-memdebug.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/socksd-mprintf.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/socksd-nonblock.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/socksd-strtoofft.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/socksd-warnless.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/sws-base64.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/sws-curl_ctype.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/sws-inet_pton.Po@am__quote@ # am--include-marker
@@ -930,6 +1001,7 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/tftpd-nonblock.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/tftpd-strtoofft.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/tftpd-warnless.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/disabled.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fake_ntlm-fake_ntlm.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fake_ntlm-getpart.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fake_ntlm-util.Po@am__quote@ # am--include-marker
@@ -944,6 +1016,9 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sockfilt-getpart.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sockfilt-sockfilt.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sockfilt-util.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/socksd-getpart.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/socksd-socksd.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/socksd-util.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sws-getpart.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sws-sws.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sws-util.Po@am__quote@ # am--include-marker
@@ -1681,6 +1756,160 @@ sockfilt-sockfilt.obj: sockfilt.c
 @AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sockfilt_CFLAGS) $(CFLAGS) -c -o ../../lib/sockfilt-inet_pton.obj `if test -f '../../lib/inet_pton.c'; then $(CYGPATH_W) '../../lib/inet_pton.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/inet_pton.c'; fi`
 
+../../lib/socksd-mprintf.o: ../../lib/mprintf.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(socksd_CFLAGS) $(CFLAGS) -MT ../../lib/socksd-mprintf.o -MD -MP -MF ../../lib/$(DEPDIR)/socksd-mprintf.Tpo -c -o ../../lib/socksd-mprintf.o `test -f '../../lib/mprintf.c' || echo '$(srcdir)/'`../../lib/mprintf.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/socksd-mprintf.Tpo ../../lib/$(DEPDIR)/socksd-mprintf.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='../../lib/mprintf.c' object='../../lib/socksd-mprintf.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(socksd_CFLAGS) $(CFLAGS) -c -o ../../lib/socksd-mprintf.o `test -f '../../lib/mprintf.c' || echo '$(srcdir)/'`../../lib/mprintf.c
+
+../../lib/socksd-mprintf.obj: ../../lib/mprintf.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(socksd_CFLAGS) $(CFLAGS) -MT ../../lib/socksd-mprintf.obj -MD -MP -MF ../../lib/$(DEPDIR)/socksd-mprintf.Tpo -c -o ../../lib/socksd-mprintf.obj `if test -f '../../lib/mprintf.c'; then $(CYGPATH_W) '../../lib/mprintf.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/mprintf.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/socksd-mprintf.Tpo ../../lib/$(DEPDIR)/socksd-mprintf.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='../../lib/mprintf.c' object='../../lib/socksd-mprintf.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(socksd_CFLAGS) $(CFLAGS) -c -o ../../lib/socksd-mprintf.obj `if test -f '../../lib/mprintf.c'; then $(CYGPATH_W) '../../lib/mprintf.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/mprintf.c'; fi`
+
+../../lib/socksd-nonblock.o: ../../lib/nonblock.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(socksd_CFLAGS) $(CFLAGS) -MT ../../lib/socksd-nonblock.o -MD -MP -MF ../../lib/$(DEPDIR)/socksd-nonblock.Tpo -c -o ../../lib/socksd-nonblock.o `test -f '../../lib/nonblock.c' || echo '$(srcdir)/'`../../lib/nonblock.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/socksd-nonblock.Tpo ../../lib/$(DEPDIR)/socksd-nonblock.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='../../lib/nonblock.c' object='../../lib/socksd-nonblock.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(socksd_CFLAGS) $(CFLAGS) -c -o ../../lib/socksd-nonblock.o `test -f '../../lib/nonblock.c' || echo '$(srcdir)/'`../../lib/nonblock.c
+
+../../lib/socksd-nonblock.obj: ../../lib/nonblock.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(socksd_CFLAGS) $(CFLAGS) -MT ../../lib/socksd-nonblock.obj -MD -MP -MF ../../lib/$(DEPDIR)/socksd-nonblock.Tpo -c -o ../../lib/socksd-nonblock.obj `if test -f '../../lib/nonblock.c'; then $(CYGPATH_W) '../../lib/nonblock.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/nonblock.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/socksd-nonblock.Tpo ../../lib/$(DEPDIR)/socksd-nonblock.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='../../lib/nonblock.c' object='../../lib/socksd-nonblock.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(socksd_CFLAGS) $(CFLAGS) -c -o ../../lib/socksd-nonblock.obj `if test -f '../../lib/nonblock.c'; then $(CYGPATH_W) '../../lib/nonblock.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/nonblock.c'; fi`
+
+../../lib/socksd-strtoofft.o: ../../lib/strtoofft.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(socksd_CFLAGS) $(CFLAGS) -MT ../../lib/socksd-strtoofft.o -MD -MP -MF ../../lib/$(DEPDIR)/socksd-strtoofft.Tpo -c -o ../../lib/socksd-strtoofft.o `test -f '../../lib/strtoofft.c' || echo '$(srcdir)/'`../../lib/strtoofft.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/socksd-strtoofft.Tpo ../../lib/$(DEPDIR)/socksd-strtoofft.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='../../lib/strtoofft.c' object='../../lib/socksd-strtoofft.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(socksd_CFLAGS) $(CFLAGS) -c -o ../../lib/socksd-strtoofft.o `test -f '../../lib/strtoofft.c' || echo '$(srcdir)/'`../../lib/strtoofft.c
+
+../../lib/socksd-strtoofft.obj: ../../lib/strtoofft.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(socksd_CFLAGS) $(CFLAGS) -MT ../../lib/socksd-strtoofft.obj -MD -MP -MF ../../lib/$(DEPDIR)/socksd-strtoofft.Tpo -c -o ../../lib/socksd-strtoofft.obj `if test -f '../../lib/strtoofft.c'; then $(CYGPATH_W) '../../lib/strtoofft.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/strtoofft.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/socksd-strtoofft.Tpo ../../lib/$(DEPDIR)/socksd-strtoofft.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='../../lib/strtoofft.c' object='../../lib/socksd-strtoofft.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(socksd_CFLAGS) $(CFLAGS) -c -o ../../lib/socksd-strtoofft.obj `if test -f '../../lib/strtoofft.c'; then $(CYGPATH_W) '../../lib/strtoofft.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/strtoofft.c'; fi`
+
+../../lib/socksd-warnless.o: ../../lib/warnless.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(socksd_CFLAGS) $(CFLAGS) -MT ../../lib/socksd-warnless.o -MD -MP -MF ../../lib/$(DEPDIR)/socksd-warnless.Tpo -c -o ../../lib/socksd-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/socksd-warnless.Tpo ../../lib/$(DEPDIR)/socksd-warnless.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='../../lib/warnless.c' object='../../lib/socksd-warnless.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(socksd_CFLAGS) $(CFLAGS) -c -o ../../lib/socksd-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
+
+../../lib/socksd-warnless.obj: ../../lib/warnless.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(socksd_CFLAGS) $(CFLAGS) -MT ../../lib/socksd-warnless.obj -MD -MP -MF ../../lib/$(DEPDIR)/socksd-warnless.Tpo -c -o ../../lib/socksd-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/socksd-warnless.Tpo ../../lib/$(DEPDIR)/socksd-warnless.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='../../lib/warnless.c' object='../../lib/socksd-warnless.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(socksd_CFLAGS) $(CFLAGS) -c -o ../../lib/socksd-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
+
+../../lib/socksd-curl_ctype.o: ../../lib/curl_ctype.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(socksd_CFLAGS) $(CFLAGS) -MT ../../lib/socksd-curl_ctype.o -MD -MP -MF ../../lib/$(DEPDIR)/socksd-curl_ctype.Tpo -c -o ../../lib/socksd-curl_ctype.o `test -f '../../lib/curl_ctype.c' || echo '$(srcdir)/'`../../lib/curl_ctype.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/socksd-curl_ctype.Tpo ../../lib/$(DEPDIR)/socksd-curl_ctype.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='../../lib/curl_ctype.c' object='../../lib/socksd-curl_ctype.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(socksd_CFLAGS) $(CFLAGS) -c -o ../../lib/socksd-curl_ctype.o `test -f '../../lib/curl_ctype.c' || echo '$(srcdir)/'`../../lib/curl_ctype.c
+
+../../lib/socksd-curl_ctype.obj: ../../lib/curl_ctype.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(socksd_CFLAGS) $(CFLAGS) -MT ../../lib/socksd-curl_ctype.obj -MD -MP -MF ../../lib/$(DEPDIR)/socksd-curl_ctype.Tpo -c -o ../../lib/socksd-curl_ctype.obj `if test -f '../../lib/curl_ctype.c'; then $(CYGPATH_W) '../../lib/curl_ctype.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/curl_ctype.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/socksd-curl_ctype.Tpo ../../lib/$(DEPDIR)/socksd-curl_ctype.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='../../lib/curl_ctype.c' object='../../lib/socksd-curl_ctype.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(socksd_CFLAGS) $(CFLAGS) -c -o ../../lib/socksd-curl_ctype.obj `if test -f '../../lib/curl_ctype.c'; then $(CYGPATH_W) '../../lib/curl_ctype.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/curl_ctype.c'; fi`
+
+socksd-getpart.o: getpart.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(socksd_CFLAGS) $(CFLAGS) -MT socksd-getpart.o -MD -MP -MF $(DEPDIR)/socksd-getpart.Tpo -c -o socksd-getpart.o `test -f 'getpart.c' || echo '$(srcdir)/'`getpart.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/socksd-getpart.Tpo $(DEPDIR)/socksd-getpart.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='getpart.c' object='socksd-getpart.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(socksd_CFLAGS) $(CFLAGS) -c -o socksd-getpart.o `test -f 'getpart.c' || echo '$(srcdir)/'`getpart.c
+
+socksd-getpart.obj: getpart.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(socksd_CFLAGS) $(CFLAGS) -MT socksd-getpart.obj -MD -MP -MF $(DEPDIR)/socksd-getpart.Tpo -c -o socksd-getpart.obj `if test -f 'getpart.c'; then $(CYGPATH_W) 'getpart.c'; else $(CYGPATH_W) '$(srcdir)/getpart.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/socksd-getpart.Tpo $(DEPDIR)/socksd-getpart.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='getpart.c' object='socksd-getpart.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(socksd_CFLAGS) $(CFLAGS) -c -o socksd-getpart.obj `if test -f 'getpart.c'; then $(CYGPATH_W) 'getpart.c'; else $(CYGPATH_W) '$(srcdir)/getpart.c'; fi`
+
+../../lib/socksd-base64.o: ../../lib/base64.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(socksd_CFLAGS) $(CFLAGS) -MT ../../lib/socksd-base64.o -MD -MP -MF ../../lib/$(DEPDIR)/socksd-base64.Tpo -c -o ../../lib/socksd-base64.o `test -f '../../lib/base64.c' || echo '$(srcdir)/'`../../lib/base64.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/socksd-base64.Tpo ../../lib/$(DEPDIR)/socksd-base64.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='../../lib/base64.c' object='../../lib/socksd-base64.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(socksd_CFLAGS) $(CFLAGS) -c -o ../../lib/socksd-base64.o `test -f '../../lib/base64.c' || echo '$(srcdir)/'`../../lib/base64.c
+
+../../lib/socksd-base64.obj: ../../lib/base64.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(socksd_CFLAGS) $(CFLAGS) -MT ../../lib/socksd-base64.obj -MD -MP -MF ../../lib/$(DEPDIR)/socksd-base64.Tpo -c -o ../../lib/socksd-base64.obj `if test -f '../../lib/base64.c'; then $(CYGPATH_W) '../../lib/base64.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/base64.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/socksd-base64.Tpo ../../lib/$(DEPDIR)/socksd-base64.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='../../lib/base64.c' object='../../lib/socksd-base64.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(socksd_CFLAGS) $(CFLAGS) -c -o ../../lib/socksd-base64.obj `if test -f '../../lib/base64.c'; then $(CYGPATH_W) '../../lib/base64.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/base64.c'; fi`
+
+../../lib/socksd-memdebug.o: ../../lib/memdebug.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(socksd_CFLAGS) $(CFLAGS) -MT ../../lib/socksd-memdebug.o -MD -MP -MF ../../lib/$(DEPDIR)/socksd-memdebug.Tpo -c -o ../../lib/socksd-memdebug.o `test -f '../../lib/memdebug.c' || echo '$(srcdir)/'`../../lib/memdebug.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/socksd-memdebug.Tpo ../../lib/$(DEPDIR)/socksd-memdebug.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='../../lib/memdebug.c' object='../../lib/socksd-memdebug.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(socksd_CFLAGS) $(CFLAGS) -c -o ../../lib/socksd-memdebug.o `test -f '../../lib/memdebug.c' || echo '$(srcdir)/'`../../lib/memdebug.c
+
+../../lib/socksd-memdebug.obj: ../../lib/memdebug.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(socksd_CFLAGS) $(CFLAGS) -MT ../../lib/socksd-memdebug.obj -MD -MP -MF ../../lib/$(DEPDIR)/socksd-memdebug.Tpo -c -o ../../lib/socksd-memdebug.obj `if test -f '../../lib/memdebug.c'; then $(CYGPATH_W) '../../lib/memdebug.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/memdebug.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/socksd-memdebug.Tpo ../../lib/$(DEPDIR)/socksd-memdebug.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='../../lib/memdebug.c' object='../../lib/socksd-memdebug.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(socksd_CFLAGS) $(CFLAGS) -c -o ../../lib/socksd-memdebug.obj `if test -f '../../lib/memdebug.c'; then $(CYGPATH_W) '../../lib/memdebug.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/memdebug.c'; fi`
+
+socksd-util.o: util.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(socksd_CFLAGS) $(CFLAGS) -MT socksd-util.o -MD -MP -MF $(DEPDIR)/socksd-util.Tpo -c -o socksd-util.o `test -f 'util.c' || echo '$(srcdir)/'`util.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/socksd-util.Tpo $(DEPDIR)/socksd-util.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='util.c' object='socksd-util.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(socksd_CFLAGS) $(CFLAGS) -c -o socksd-util.o `test -f 'util.c' || echo '$(srcdir)/'`util.c
+
+socksd-util.obj: util.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(socksd_CFLAGS) $(CFLAGS) -MT socksd-util.obj -MD -MP -MF $(DEPDIR)/socksd-util.Tpo -c -o socksd-util.obj `if test -f 'util.c'; then $(CYGPATH_W) 'util.c'; else $(CYGPATH_W) '$(srcdir)/util.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/socksd-util.Tpo $(DEPDIR)/socksd-util.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='util.c' object='socksd-util.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(socksd_CFLAGS) $(CFLAGS) -c -o socksd-util.obj `if test -f 'util.c'; then $(CYGPATH_W) 'util.c'; else $(CYGPATH_W) '$(srcdir)/util.c'; fi`
+
+socksd-socksd.o: socksd.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(socksd_CFLAGS) $(CFLAGS) -MT socksd-socksd.o -MD -MP -MF $(DEPDIR)/socksd-socksd.Tpo -c -o socksd-socksd.o `test -f 'socksd.c' || echo '$(srcdir)/'`socksd.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/socksd-socksd.Tpo $(DEPDIR)/socksd-socksd.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='socksd.c' object='socksd-socksd.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(socksd_CFLAGS) $(CFLAGS) -c -o socksd-socksd.o `test -f 'socksd.c' || echo '$(srcdir)/'`socksd.c
+
+socksd-socksd.obj: socksd.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(socksd_CFLAGS) $(CFLAGS) -MT socksd-socksd.obj -MD -MP -MF $(DEPDIR)/socksd-socksd.Tpo -c -o socksd-socksd.obj `if test -f 'socksd.c'; then $(CYGPATH_W) 'socksd.c'; else $(CYGPATH_W) '$(srcdir)/socksd.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/socksd-socksd.Tpo $(DEPDIR)/socksd-socksd.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='socksd.c' object='socksd-socksd.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(socksd_CFLAGS) $(CFLAGS) -c -o socksd-socksd.obj `if test -f 'socksd.c'; then $(CYGPATH_W) 'socksd.c'; else $(CYGPATH_W) '$(srcdir)/socksd.c'; fi`
+
+../../lib/socksd-inet_pton.o: ../../lib/inet_pton.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(socksd_CFLAGS) $(CFLAGS) -MT ../../lib/socksd-inet_pton.o -MD -MP -MF ../../lib/$(DEPDIR)/socksd-inet_pton.Tpo -c -o ../../lib/socksd-inet_pton.o `test -f '../../lib/inet_pton.c' || echo '$(srcdir)/'`../../lib/inet_pton.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/socksd-inet_pton.Tpo ../../lib/$(DEPDIR)/socksd-inet_pton.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='../../lib/inet_pton.c' object='../../lib/socksd-inet_pton.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(socksd_CFLAGS) $(CFLAGS) -c -o ../../lib/socksd-inet_pton.o `test -f '../../lib/inet_pton.c' || echo '$(srcdir)/'`../../lib/inet_pton.c
+
+../../lib/socksd-inet_pton.obj: ../../lib/inet_pton.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(socksd_CFLAGS) $(CFLAGS) -MT ../../lib/socksd-inet_pton.obj -MD -MP -MF ../../lib/$(DEPDIR)/socksd-inet_pton.Tpo -c -o ../../lib/socksd-inet_pton.obj `if test -f '../../lib/inet_pton.c'; then $(CYGPATH_W) '../../lib/inet_pton.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/inet_pton.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/socksd-inet_pton.Tpo ../../lib/$(DEPDIR)/socksd-inet_pton.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='../../lib/inet_pton.c' object='../../lib/socksd-inet_pton.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(socksd_CFLAGS) $(CFLAGS) -c -o ../../lib/socksd-inet_pton.obj `if test -f '../../lib/inet_pton.c'; then $(CYGPATH_W) '../../lib/inet_pton.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/inet_pton.c'; fi`
+
 ../../lib/sws-mprintf.o: ../../lib/mprintf.c
 @am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sws_CFLAGS) $(CFLAGS) -MT ../../lib/sws-mprintf.o -MD -MP -MF ../../lib/$(DEPDIR)/sws-mprintf.Tpo -c -o ../../lib/sws-mprintf.o `test -f '../../lib/mprintf.c' || echo '$(srcdir)/'`../../lib/mprintf.c
 @am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/sws-mprintf.Tpo ../../lib/$(DEPDIR)/sws-mprintf.Po
@@ -2145,6 +2374,14 @@ distclean: distclean-am
        -rm -f ../../lib/$(DEPDIR)/sockfilt-nonblock.Po
        -rm -f ../../lib/$(DEPDIR)/sockfilt-strtoofft.Po
        -rm -f ../../lib/$(DEPDIR)/sockfilt-warnless.Po
+       -rm -f ../../lib/$(DEPDIR)/socksd-base64.Po
+       -rm -f ../../lib/$(DEPDIR)/socksd-curl_ctype.Po
+       -rm -f ../../lib/$(DEPDIR)/socksd-inet_pton.Po
+       -rm -f ../../lib/$(DEPDIR)/socksd-memdebug.Po
+       -rm -f ../../lib/$(DEPDIR)/socksd-mprintf.Po
+       -rm -f ../../lib/$(DEPDIR)/socksd-nonblock.Po
+       -rm -f ../../lib/$(DEPDIR)/socksd-strtoofft.Po
+       -rm -f ../../lib/$(DEPDIR)/socksd-warnless.Po
        -rm -f ../../lib/$(DEPDIR)/sws-base64.Po
        -rm -f ../../lib/$(DEPDIR)/sws-curl_ctype.Po
        -rm -f ../../lib/$(DEPDIR)/sws-inet_pton.Po
@@ -2160,6 +2397,7 @@ distclean: distclean-am
        -rm -f ../../lib/$(DEPDIR)/tftpd-nonblock.Po
        -rm -f ../../lib/$(DEPDIR)/tftpd-strtoofft.Po
        -rm -f ../../lib/$(DEPDIR)/tftpd-warnless.Po
+       -rm -f ./$(DEPDIR)/disabled.Po
        -rm -f ./$(DEPDIR)/fake_ntlm-fake_ntlm.Po
        -rm -f ./$(DEPDIR)/fake_ntlm-getpart.Po
        -rm -f ./$(DEPDIR)/fake_ntlm-util.Po
@@ -2174,6 +2412,9 @@ distclean: distclean-am
        -rm -f ./$(DEPDIR)/sockfilt-getpart.Po
        -rm -f ./$(DEPDIR)/sockfilt-sockfilt.Po
        -rm -f ./$(DEPDIR)/sockfilt-util.Po
+       -rm -f ./$(DEPDIR)/socksd-getpart.Po
+       -rm -f ./$(DEPDIR)/socksd-socksd.Po
+       -rm -f ./$(DEPDIR)/socksd-util.Po
        -rm -f ./$(DEPDIR)/sws-getpart.Po
        -rm -f ./$(DEPDIR)/sws-sws.Po
        -rm -f ./$(DEPDIR)/sws-util.Po
@@ -2261,6 +2502,14 @@ maintainer-clean: maintainer-clean-am
        -rm -f ../../lib/$(DEPDIR)/sockfilt-nonblock.Po
        -rm -f ../../lib/$(DEPDIR)/sockfilt-strtoofft.Po
        -rm -f ../../lib/$(DEPDIR)/sockfilt-warnless.Po
+       -rm -f ../../lib/$(DEPDIR)/socksd-base64.Po
+       -rm -f ../../lib/$(DEPDIR)/socksd-curl_ctype.Po
+       -rm -f ../../lib/$(DEPDIR)/socksd-inet_pton.Po
+       -rm -f ../../lib/$(DEPDIR)/socksd-memdebug.Po
+       -rm -f ../../lib/$(DEPDIR)/socksd-mprintf.Po
+       -rm -f ../../lib/$(DEPDIR)/socksd-nonblock.Po
+       -rm -f ../../lib/$(DEPDIR)/socksd-strtoofft.Po
+       -rm -f ../../lib/$(DEPDIR)/socksd-warnless.Po
        -rm -f ../../lib/$(DEPDIR)/sws-base64.Po
        -rm -f ../../lib/$(DEPDIR)/sws-curl_ctype.Po
        -rm -f ../../lib/$(DEPDIR)/sws-inet_pton.Po
@@ -2276,6 +2525,7 @@ maintainer-clean: maintainer-clean-am
        -rm -f ../../lib/$(DEPDIR)/tftpd-nonblock.Po
        -rm -f ../../lib/$(DEPDIR)/tftpd-strtoofft.Po
        -rm -f ../../lib/$(DEPDIR)/tftpd-warnless.Po
+       -rm -f ./$(DEPDIR)/disabled.Po
        -rm -f ./$(DEPDIR)/fake_ntlm-fake_ntlm.Po
        -rm -f ./$(DEPDIR)/fake_ntlm-getpart.Po
        -rm -f ./$(DEPDIR)/fake_ntlm-util.Po
@@ -2290,6 +2540,9 @@ maintainer-clean: maintainer-clean-am
        -rm -f ./$(DEPDIR)/sockfilt-getpart.Po
        -rm -f ./$(DEPDIR)/sockfilt-sockfilt.Po
        -rm -f ./$(DEPDIR)/sockfilt-util.Po
+       -rm -f ./$(DEPDIR)/socksd-getpart.Po
+       -rm -f ./$(DEPDIR)/socksd-socksd.Po
+       -rm -f ./$(DEPDIR)/socksd-util.Po
        -rm -f ./$(DEPDIR)/sws-getpart.Po
        -rm -f ./$(DEPDIR)/sws-sws.Po
        -rm -f ./$(DEPDIR)/sws-util.Po
@@ -2334,7 +2587,7 @@ uninstall-am:
 
 
 checksrc:
-       @PERL@ $(top_srcdir)/lib/checksrc.pl $(srcdir)/*.c
+       $(CHECKSRC)@PERL@ $(top_srcdir)/lib/checksrc.pl $(srcdir)/*.[ch]
 
 # for debug builds, we scan the sources on all regular make invokes
 @CURLDEBUG_TRUE@all-local: checksrc
index c6233af..6296af7 100644 (file)
@@ -1,4 +1,4 @@
-noinst_PROGRAMS = getpart resolve rtspd sockfilt sws tftpd fake_ntlm
+noinst_PROGRAMS = getpart resolve rtspd sockfilt sws tftpd fake_ntlm socksd disabled
 
 CURLX_SRCS = \
  ../../lib/mprintf.c \
@@ -50,6 +50,12 @@ sockfilt_SOURCES = $(CURLX_SRCS) $(CURLX_HDRS) $(USEFUL) $(UTIL) \
 sockfilt_LDADD = @CURL_NETWORK_AND_TIME_LIBS@
 sockfilt_CFLAGS = $(AM_CFLAGS)
 
+socksd_SOURCES = $(CURLX_SRCS) $(CURLX_HDRS) $(USEFUL) $(UTIL) \
+ server_sockaddr.h socksd.c \
+ ../../lib/inet_pton.c
+socksd_LDADD = @CURL_NETWORK_AND_TIME_LIBS@
+socksd_CFLAGS = $(AM_CFLAGS)
+
 sws_SOURCES = $(CURLX_SRCS) $(CURLX_HDRS) $(USEFUL) $(UTIL) \
  server_sockaddr.h \
  sws.c \
@@ -68,3 +74,5 @@ fake_ntlm_SOURCES = $(CURLX_SRCS) $(CURLX_HDRS) $(USEFUL) $(UTIL) \
  fake_ntlm.c
 fake_ntlm_LDADD = @CURL_NETWORK_AND_TIME_LIBS@
 fake_ntlm_CFLAGS = $(AM_CFLAGS)
+
+disabled_SOURCES = disabled.c
diff --git a/tests/server/disabled.c b/tests/server/disabled.c
new file mode 100644 (file)
index 0000000..c82847d
--- /dev/null
@@ -0,0 +1,79 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+
+/*
+ * The purpose of this tool is to figure out which, if any, features that are
+ * disabled which should otherwise exist and work. These aren't visible in
+ * regular curl -V output.
+ *
+ * Disabled protocols are visible in curl_version_info() and are not included
+ * in this table.
+ */
+
+#include "curl_setup.h"
+#include <stdio.h>
+
+static const char *disabled[]={
+#ifdef CURL_DISABLE_COOKIES
+  "cookies",
+#endif
+#ifdef CURL_DISABLE_CRYPTO_AUTH
+  "crypto",
+#endif
+#ifdef CURL_DISABLE_DOH
+  "DoH",
+#endif
+#ifdef CURL_DISABLE_HTTP_AUTH
+  "HTTP-auth",
+#endif
+#ifdef CURL_DISABLE_MIME
+  "Mime",
+#endif
+#ifdef CURL_DISABLE_NETRC
+  "netrc",
+#endif
+#ifdef CURL_DISABLE_PARSEDATE
+  "parsedate",
+#endif
+#ifdef CURL_DISABLE_PROXY
+  "proxy",
+#endif
+#ifdef CURL_DISABLE_SHUFFLE_DNS
+  "shuffle-dns",
+#endif
+#ifdef CURL_DISABLE_TYPECHECK
+  "typecheck",
+#endif
+#ifdef CURL_DISABLE_VERBOSE_STRINGS
+  "verbose-strings",
+#endif
+  NULL
+};
+
+int main(void)
+{
+  int i;
+  for(i = 0; disabled[i]; i++)
+    printf("%s\n", disabled[i]);
+
+  return 0;
+}
index ec127a8..c6e36b6 100644 (file)
@@ -6,7 +6,7 @@
  *                             \___|\___/|_| \_\_____|
  *
  * Copyright (C) 2010, Mandy Wu, <mandy.wu@intel.com>
- * Copyright (C) 2011 - 2013, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 2011 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -75,7 +75,7 @@ static char *printable(char *inbuf, size_t inlength)
     return NULL;
 
   if(!inlength) {
-    snprintf(&outbuf[0], outsize, "%s", NOTHING_STR);
+    msnprintf(&outbuf[0], outsize, "%s", NOTHING_STR);
     return outbuf;
   }
 
@@ -97,7 +97,7 @@ static char *printable(char *inbuf, size_t inlength)
       o++;
     }
     else {
-      snprintf(&outbuf[o], outsize - o, HEX_FMT_STR, inbuf[i]);
+      msnprintf(&outbuf[o], outsize - o, HEX_FMT_STR, inbuf[i]);
       o += HEX_STR_LEN;
     }
 
@@ -174,7 +174,7 @@ int main(int argc, char *argv[])
   }
 
   /* logmsg cannot be used until this file name is set */
-  snprintf(logfilename, sizeof(logfilename), LOGFILE, testnum);
+  msnprintf(logfilename, sizeof(logfilename), LOGFILE, testnum);
   serverlogfile = logfilename;
 
   logmsg("fake_ntlm (user: %s) (proto: %s) (domain: %s) (cached creds: %s)",
index 4cbdba6..993e031 100644 (file)
@@ -68,7 +68,7 @@ int main(int argc, char *argv[])
   while(argc>arg) {
     if(!strcmp("--version", argv[arg])) {
       printf("resolve IPv4%s\n",
-#ifdef ENABLE_IPV6
+#if defined(CURLRES_IPV6)
              "/IPv6"
 #else
              ""
@@ -95,7 +95,7 @@ int main(int argc, char *argv[])
     puts("Usage: resolve [option] <host>\n"
          " --version\n"
          " --ipv4"
-#ifdef ENABLE_IPV6
+#if defined(CURLRES_IPV6)
          "\n --ipv6"
 #endif
          );
@@ -107,7 +107,7 @@ int main(int argc, char *argv[])
   atexit(win32_cleanup);
 #endif
 
-#ifdef ENABLE_IPV6
+#if defined(CURLRES_IPV6)
   if(use_ipv6) {
     /* Check that the system has IPv6 enabled before checking the resolver */
     curl_socket_t s = socket(PF_INET6, SOCK_DGRAM, 0);
index 0629d8a..7563fd2 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -382,11 +382,11 @@ static int ProcessRequest(struct httprequest *req)
       char *filename;
 
       if((strlen(doc) + strlen(request)) < 200)
-        snprintf(logbuf, sizeof(logbuf), "Got request: %s %s %s/%d.%d",
-                 request, doc, prot_str, prot_major, prot_minor);
+        msnprintf(logbuf, sizeof(logbuf), "Got request: %s %s %s/%d.%d",
+                  request, doc, prot_str, prot_major, prot_minor);
       else
-        snprintf(logbuf, sizeof(logbuf), "Got a *HUGE* request %s/%d.%d",
-                prot_str, prot_major, prot_minor);
+        msnprintf(logbuf, sizeof(logbuf), "Got a *HUGE* request %s/%d.%d",
+                  prot_str, prot_major, prot_minor);
       logmsg("%s", logbuf);
 
       if(!strncmp("/verifiedserver", ptr, 15)) {
@@ -416,8 +416,8 @@ static int ProcessRequest(struct httprequest *req)
       else
         req->partno = 0;
 
-      snprintf(logbuf, sizeof(logbuf), "Requested test number %ld part %ld",
-               req->testno, req->partno);
+      msnprintf(logbuf, sizeof(logbuf), "Requested test number %ld part %ld",
+                req->testno, req->partno);
       logmsg("%s", logbuf);
 
       filename = test2file(req->testno);
@@ -540,9 +540,9 @@ static int ProcessRequest(struct httprequest *req)
     else {
       if(sscanf(req->reqbuf, "CONNECT %" MAXDOCNAMELEN_TXT "s HTTP/%d.%d",
                 doc, &prot_major, &prot_minor) == 3) {
-        snprintf(logbuf, sizeof(logbuf),
-                 "Received a CONNECT %s HTTP/%d.%d request",
-                 doc, prot_major, prot_minor);
+        msnprintf(logbuf, sizeof(logbuf),
+                  "Received a CONNECT %s HTTP/%d.%d request",
+                  doc, prot_major, prot_minor);
         logmsg("%s", logbuf);
 
         if(req->prot_version == 10)
@@ -947,12 +947,12 @@ static int send_doc(curl_socket_t sock, struct httprequest *req)
     case DOCNUMBER_WERULEZ:
       /* we got a "friends?" question, reply back that we sure are */
       logmsg("Identifying ourselves as friends");
-      snprintf(msgbuf, sizeof(msgbuf), "RTSP_SERVER WE ROOLZ: %ld\r\n",
-               (long)getpid());
+      msnprintf(msgbuf, sizeof(msgbuf), "RTSP_SERVER WE ROOLZ: %ld\r\n",
+                (long)getpid());
       msglen = strlen(msgbuf);
-      snprintf(weare, sizeof(weare),
-               "HTTP/1.1 200 OK\r\nContent-Length: %zu\r\n\r\n%s",
-               msglen, msgbuf);
+      msnprintf(weare, sizeof(weare),
+                "HTTP/1.1 200 OK\r\nContent-Length: %zu\r\n\r\n%s",
+                msglen, msgbuf);
       buffer = weare;
       break;
     case DOCNUMBER_INTERNAL:
@@ -985,7 +985,7 @@ static int send_doc(curl_socket_t sock, struct httprequest *req)
     char partbuf[80]="data";
     FILE *stream;
     if(0 != req->partno)
-      snprintf(partbuf, sizeof(partbuf), "data%ld", req->partno);
+      msnprintf(partbuf, sizeof(partbuf), "data%ld", req->partno);
 
     stream = fopen(filename, "rb");
     if(!stream) {
index 86a1ff5..569be6f 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -486,20 +486,20 @@ static void lograw(unsigned char *buffer, ssize_t len)
   for(i = 0; i<len; i++) {
     switch(ptr[i]) {
     case '\n':
-      snprintf(optr, left, "\\n");
+      msnprintf(optr, left, "\\n");
       width += 2;
       optr += 2;
       left -= 2;
       break;
     case '\r':
-      snprintf(optr, left, "\\r");
+      msnprintf(optr, left, "\\r");
       width += 2;
       optr += 2;
       left -= 2;
       break;
     default:
-      snprintf(optr, left, "%c", (ISGRAPH(ptr[i]) ||
-                                  ptr[i] == 0x20) ?ptr[i]:'.');
+      msnprintf(optr, left, "%c", (ISGRAPH(ptr[i]) ||
+                                   ptr[i] == 0x20) ?ptr[i]:'.');
       width++;
       optr++;
       left--;
@@ -1062,9 +1062,9 @@ static bool juggle(curl_socket_t *sockfdp,
     else if(!memcmp("PORT", buffer, 4)) {
       /* Question asking us what PORT number we are listening to.
          Replies to PORT with "IPv[num]/[port]" */
-      snprintf((char *)buffer, sizeof(buffer), "%s/%hu\n", ipv_inuse, port);
+      msnprintf((char *)buffer, sizeof(buffer), "%s/%hu\n", ipv_inuse, port);
       buffer_len = (ssize_t)strlen((char *)buffer);
-      snprintf(data, sizeof(data), "PORT\n%04zx\n", buffer_len);
+      msnprintf(data, sizeof(data), "PORT\n%04zx\n", buffer_len);
       if(!write_stdout(data, 10))
         return FALSE;
       if(!write_stdout(buffer, buffer_len))
@@ -1155,7 +1155,7 @@ static bool juggle(curl_socket_t *sockfdp,
     nread_socket = sread(sockfd, buffer, sizeof(buffer));
 
     if(nread_socket > 0) {
-      snprintf(data, sizeof(data), "DATA\n%04zx\n", nread_socket);
+      msnprintf(data, sizeof(data), "DATA\n%04zx\n", nread_socket);
       if(!write_stdout(data, 10))
         return FALSE;
       if(!write_stdout(buffer, nread_socket))
diff --git a/tests/server/socksd.c b/tests/server/socksd.c
new file mode 100644 (file)
index 0000000..5e32bc9
--- /dev/null
@@ -0,0 +1,1162 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+#include "server_setup.h"
+#include <stdlib.h>
+
+/* Function
+ *
+ * Accepts a TCP connection on a custom port (IPv4 or IPv6). Connects to a
+ * given addr + port backend (that is NOT extracted form the client's
+ * request). The backend server default to connect to can be set with
+ * --backend and --backendport.
+ *
+ * Read commands from FILE (set with --config). The commands control how to
+ * act and is reset to defaults each client TCP connect.
+ *
+ * Config file keywords:
+ *
+ * "version [number: 5]" - requires the communication to use this version.
+ * "nmethods_min [number: 1]" - the minimum numberf NMETHODS the client must
+ *                              state
+ * "nmethods_max [number: 3]" - the minimum numberf NMETHODS the client must
+ *                              state
+ * "user [string]" - the user name that must match (if method is 2)
+ * "password [string]" - the password that must match (if method is 2)
+ * "backend [IPv4]" - numerical IPv4 address of backend to connect to
+ * "backendport [number:0]" - TCP port of backend to connect to. 0 means use
+                              the client's specified port number.
+ * "method [number: 0]" - connect method to respond with:
+ *                        0 - no auth
+ *                        1 - GSSAPI (not supported)
+ *                        2 - user + password
+ * "response [number]" - the decimal number to repsond to a connect
+ *                       SOCKS5: 0 is OK, SOCKS4: 90 is ok
+ *
+ */
+
+/* based on sockfilt.c */
+
+#ifdef HAVE_SIGNAL_H
+#include <signal.h>
+#endif
+#ifdef HAVE_NETINET_IN_H
+#include <netinet/in.h>
+#endif
+#ifdef HAVE_NETINET_IN6_H
+#include <netinet/in6.h>
+#endif
+#ifdef HAVE_ARPA_INET_H
+#include <arpa/inet.h>
+#endif
+#ifdef HAVE_NETDB_H
+#include <netdb.h>
+#endif
+
+#define ENABLE_CURLX_PRINTF
+/* make the curlx header define all printf() functions to use the curlx_*
+   versions instead */
+#include "curlx.h" /* from the private lib dir */
+#include "getpart.h"
+#include "inet_pton.h"
+#include "util.h"
+#include "server_sockaddr.h"
+#include "warnless.h"
+
+/* include memdebug.h last */
+#include "memdebug.h"
+
+#ifdef USE_WINSOCK
+#undef  EINTR
+#define EINTR    4 /* errno.h value */
+#undef  EAGAIN
+#define EAGAIN  11 /* errno.h value */
+#undef  ENOMEM
+#define ENOMEM  12 /* errno.h value */
+#undef  EINVAL
+#define EINVAL  22 /* errno.h value */
+#endif
+
+#define DEFAULT_PORT 8905
+
+#ifndef DEFAULT_LOGFILE
+#define DEFAULT_LOGFILE "log/socksd.log"
+#endif
+
+#ifndef DEFAULT_CONFIG
+#define DEFAULT_CONFIG "socksd.config"
+#endif
+
+static const char *backendaddr = "127.0.0.1";
+static unsigned short backendport = 0; /* default is use client's */
+
+struct configurable {
+  unsigned char version; /* initial version byte in the request must match
+                            this */
+  unsigned char nmethods_min; /* minimum number of nmethods to expect */
+  unsigned char nmethods_max; /* maximum number of nmethods to expect */
+  unsigned char responseversion;
+  unsigned char responsemethod;
+  unsigned char reqcmd;
+  unsigned char connectrep;
+  unsigned short port; /* backend port */
+  char addr[32]; /* backend IPv4 numerical */
+  char user[256];
+  char password[256];
+};
+
+#define CONFIG_VERSION 5
+#define CONFIG_NMETHODS_MIN 1 /* unauth, gssapi, auth */
+#define CONFIG_NMETHODS_MAX 3
+#define CONFIG_RESPONSEVERSION CONFIG_VERSION
+#define CONFIG_RESPONSEMETHOD 0 /* no auth */
+#define CONFIG_REQCMD 1 /* CONNECT */
+#define CONFIG_PORT backendport
+#define CONFIG_ADDR backendaddr
+#define CONFIG_CONNECTREP 0
+
+static struct configurable config;
+
+const char *serverlogfile = DEFAULT_LOGFILE;
+static const char *configfile = DEFAULT_CONFIG;
+
+#ifdef ENABLE_IPV6
+static bool use_ipv6 = FALSE;
+#endif
+static const char *ipv_inuse = "IPv4";
+static unsigned short port = DEFAULT_PORT;
+
+static void resetdefaults(void)
+{
+  logmsg("Reset to defaults");
+  config.version = CONFIG_VERSION;
+  config.nmethods_min = CONFIG_NMETHODS_MIN;
+  config.nmethods_max = CONFIG_NMETHODS_MAX;
+  config.responseversion = CONFIG_RESPONSEVERSION;
+  config.responsemethod = CONFIG_RESPONSEMETHOD;
+  config.reqcmd = CONFIG_REQCMD;
+  config.connectrep = CONFIG_CONNECTREP;
+  config.port = CONFIG_PORT;
+  strcpy(config.addr, CONFIG_ADDR);
+  strcpy(config.user, "user");
+  strcpy(config.password, "password");
+}
+
+static unsigned char byteval(char *value)
+{
+  unsigned long num = strtoul(value, NULL, 10);
+  return num & 0xff;
+}
+
+static unsigned short shortval(char *value)
+{
+  unsigned long num = strtoul(value, NULL, 10);
+  return num & 0xffff;
+}
+
+static void getconfig(void)
+{
+  FILE *fp = fopen(configfile, FOPEN_READTEXT);
+  resetdefaults();
+  if(fp) {
+    char buffer[512];
+    logmsg("parse config file");
+    while(fgets(buffer, sizeof(buffer), fp)) {
+      char key[32];
+      char value[32];
+      if(2 == sscanf(buffer, "%31s %31s", key, value)) {
+        if(!strcmp(key, "version")) {
+          config.version = byteval(value);
+          logmsg("version [%d] set", config.version);
+        }
+        else if(!strcmp(key, "nmethods_min")) {
+          config.nmethods_min = byteval(value);
+          logmsg("nmethods_min [%d] set", config.nmethods_min);
+        }
+        else if(!strcmp(key, "nmethods_max")) {
+          config.nmethods_max = byteval(value);
+          logmsg("nmethods_max [%d] set", config.nmethods_max);
+        }
+        else if(!strcmp(key, "backend")) {
+          strcpy(config.addr, value);
+          logmsg("backend [%s] set", config.addr);
+        }
+        else if(!strcmp(key, "backendport")) {
+          config.port = shortval(value);
+          logmsg("backendport [%d] set", config.port);
+        }
+        else if(!strcmp(key, "user")) {
+          strcpy(config.user, value);
+          logmsg("user [%s] set", config.user);
+        }
+        else if(!strcmp(key, "password")) {
+          strcpy(config.password, value);
+          logmsg("password [%s] set", config.password);
+        }
+        /* Methods:
+           o  X'00' NO AUTHENTICATION REQUIRED
+           o  X'01' GSSAPI
+           o  X'02' USERNAME/PASSWORD
+        */
+        else if(!strcmp(key, "method")) {
+          config.responsemethod = byteval(value);
+          logmsg("method [%d] set", config.responsemethod);
+        }
+        else if(!strcmp(key, "response")) {
+          config.connectrep = byteval(value);
+          logmsg("response [%d] set", config.connectrep);
+        }
+      }
+    }
+    fclose(fp);
+  }
+}
+
+
+/* do-nothing macro replacement for systems which lack siginterrupt() */
+
+#ifndef HAVE_SIGINTERRUPT
+#define siginterrupt(x,y) do {} while(0)
+#endif
+
+/* vars used to keep around previous signal handlers */
+
+typedef RETSIGTYPE (*SIGHANDLER_T)(int);
+
+#ifdef SIGHUP
+static SIGHANDLER_T old_sighup_handler  = SIG_ERR;
+#endif
+
+#ifdef SIGPIPE
+static SIGHANDLER_T old_sigpipe_handler = SIG_ERR;
+#endif
+
+#ifdef SIGALRM
+static SIGHANDLER_T old_sigalrm_handler = SIG_ERR;
+#endif
+
+#ifdef SIGINT
+static SIGHANDLER_T old_sigint_handler  = SIG_ERR;
+#endif
+
+#if defined(SIGBREAK) && defined(WIN32)
+static SIGHANDLER_T old_sigbreak_handler = SIG_ERR;
+#endif
+
+/* var which if set indicates that the program should finish execution */
+
+SIG_ATOMIC_T got_exit_signal = 0;
+
+/* if next is set indicates the first signal handled in exit_signal_handler */
+
+static volatile int exit_signal = 0;
+
+/* signal handler that will be triggered to indicate that the program
+  should finish its execution in a controlled manner as soon as possible.
+  The first time this is called it will set got_exit_signal to one and
+  store in exit_signal the signal that triggered its execution. */
+
+static RETSIGTYPE exit_signal_handler(int signum)
+{
+  int old_errno = errno;
+  if(got_exit_signal == 0) {
+    got_exit_signal = 1;
+    exit_signal = signum;
+  }
+  (void)signal(signum, exit_signal_handler);
+  errno = old_errno;
+}
+
+static void install_signal_handlers(void)
+{
+#ifdef SIGHUP
+  /* ignore SIGHUP signal */
+  old_sighup_handler = signal(SIGHUP, SIG_IGN);
+  if(old_sighup_handler == SIG_ERR)
+    logmsg("cannot install SIGHUP handler: %s", strerror(errno));
+#endif
+#ifdef SIGPIPE
+  /* ignore SIGPIPE signal */
+  old_sigpipe_handler = signal(SIGPIPE, SIG_IGN);
+  if(old_sigpipe_handler == SIG_ERR)
+    logmsg("cannot install SIGPIPE handler: %s", strerror(errno));
+#endif
+#ifdef SIGALRM
+  /* ignore SIGALRM signal */
+  old_sigalrm_handler = signal(SIGALRM, SIG_IGN);
+  if(old_sigalrm_handler == SIG_ERR)
+    logmsg("cannot install SIGALRM handler: %s", strerror(errno));
+#endif
+#ifdef SIGINT
+  /* handle SIGINT signal with our exit_signal_handler */
+  old_sigint_handler = signal(SIGINT, exit_signal_handler);
+  if(old_sigint_handler == SIG_ERR)
+    logmsg("cannot install SIGINT handler: %s", strerror(errno));
+  else
+    siginterrupt(SIGINT, 1);
+#endif
+#if defined(SIGBREAK) && defined(WIN32)
+  /* handle SIGBREAK signal with our exit_signal_handler */
+  old_sigbreak_handler = signal(SIGBREAK, exit_signal_handler);
+  if(old_sigbreak_handler == SIG_ERR)
+    logmsg("cannot install SIGBREAK handler: %s", strerror(errno));
+  else
+    siginterrupt(SIGBREAK, 1);
+#endif
+}
+
+static void restore_signal_handlers(void)
+{
+#ifdef SIGHUP
+  if(SIG_ERR != old_sighup_handler)
+    (void)signal(SIGHUP, old_sighup_handler);
+#endif
+#ifdef SIGPIPE
+  if(SIG_ERR != old_sigpipe_handler)
+    (void)signal(SIGPIPE, old_sigpipe_handler);
+#endif
+#ifdef SIGALRM
+  if(SIG_ERR != old_sigalrm_handler)
+    (void)signal(SIGALRM, old_sigalrm_handler);
+#endif
+#ifdef SIGINT
+  if(SIG_ERR != old_sigint_handler)
+    (void)signal(SIGINT, old_sigint_handler);
+#endif
+#if defined(SIGBREAK) && defined(WIN32)
+  if(SIG_ERR != old_sigbreak_handler)
+    (void)signal(SIGBREAK, old_sigbreak_handler);
+#endif
+}
+
+static void loghex(unsigned char *buffer, ssize_t len)
+{
+  char data[1200];
+  ssize_t i;
+  unsigned char *ptr = buffer;
+  char *optr = data;
+  ssize_t width = 0;
+  int left = sizeof(data);
+
+  for(i = 0; i<len && (left >= 0); i++) {
+    msnprintf(optr, left, "%02x", ptr[i]);
+    width += 2;
+    optr += 2;
+    left -= 2;
+  }
+  if(width)
+    logmsg("'%s'", data);
+}
+
+/* RFC 1928, SOCKS5 byte index */
+#define SOCKS5_VERSION 0
+#define SOCKS5_NMETHODS 1 /* number of methods that is listed */
+
+/* in the request: */
+#define SOCKS5_REQCMD 1
+#define SOCKS5_RESERVED 2
+#define SOCKS5_ATYP 3
+#define SOCKS5_DSTADDR 4
+
+/* connect response */
+#define SOCKS5_REP 1
+#define SOCKS5_BNDADDR 4
+
+/* auth request */
+#define SOCKS5_ULEN 1
+#define SOCKS5_UNAME 2
+
+#define SOCKS4_CD 1
+#define SOCKS4_DSTPORT 2
+
+/* connect to a given IPv4 address, not the one asked for */
+static curl_socket_t socksconnect(unsigned short connectport,
+                                  const char *connectaddr)
+{
+  int rc;
+  srvr_sockaddr_union_t me;
+  curl_socket_t sock = socket(AF_INET, SOCK_STREAM, 0);
+  if(sock == CURL_SOCKET_BAD)
+    return CURL_SOCKET_BAD;
+  memset(&me.sa4, 0, sizeof(me.sa4));
+  me.sa4.sin_family = AF_INET;
+  me.sa4.sin_port = htons(connectport);
+  me.sa4.sin_addr.s_addr = INADDR_ANY;
+  Curl_inet_pton(AF_INET, connectaddr, &me.sa4.sin_addr);
+
+  rc = connect(sock, &me.sa, sizeof(me.sa4));
+
+  if(rc) {
+    int error = SOCKERRNO;
+    logmsg("Error connecting to %s:%hu: (%d) %s",
+           connectaddr, connectport, error, strerror(error));
+    return CURL_SOCKET_BAD;
+  }
+  logmsg("Connected fine to %s:%d", connectaddr, connectport);
+  return sock;
+}
+
+static curl_socket_t socks4(curl_socket_t fd,
+                            unsigned char *buffer,
+                            ssize_t rc)
+{
+  unsigned char response[256 + 16];
+  curl_socket_t connfd;
+  unsigned char cd;
+  unsigned short s4port;
+
+  if(buffer[SOCKS4_CD] != 1) {
+    logmsg("SOCKS4 CD is not 1: %d", buffer[SOCKS4_CD]);
+    return CURL_SOCKET_BAD;
+  }
+  if(rc < 9) {
+    logmsg("SOCKS4 connect message too short: %d", rc);
+    return CURL_SOCKET_BAD;
+  }
+  if(!config.port)
+    s4port = (unsigned short)((buffer[SOCKS4_DSTPORT]<<8) |
+                              (buffer[SOCKS4_DSTPORT + 1]));
+  else
+    s4port = config.port;
+
+  connfd = socksconnect(s4port, config.addr);
+  if(connfd == CURL_SOCKET_BAD) {
+    /* failed */
+    cd = 91;
+  }
+  else {
+    /* success */
+    cd = 90;
+  }
+  response[0] = 0; /* reply version 0 */
+  response[1] = cd; /* result */
+  /* copy port and address from connect request */
+  memcpy(&response[2], &buffer[SOCKS4_DSTPORT], 6);
+  rc = (send)(fd, (char *)response, 8, 0);
+  if(rc != 8) {
+    logmsg("Sending SOCKS4 response failed!");
+    return CURL_SOCKET_BAD;
+  }
+  logmsg("Sent %d bytes", rc);
+  loghex(response, rc);
+
+  if(cd == 90)
+    /* now do the transfer */
+    return connfd;
+
+  if(connfd != CURL_SOCKET_BAD)
+    sclose(connfd);
+
+  return CURL_SOCKET_BAD;
+}
+
+static curl_socket_t sockit(curl_socket_t fd)
+{
+  unsigned char buffer[256 + 16];
+  unsigned char response[256 + 16];
+  ssize_t rc;
+  unsigned char len;
+  unsigned char type;
+  unsigned char rep = 0;
+  unsigned char *address;
+  unsigned short socksport;
+  curl_socket_t connfd = CURL_SOCKET_BAD;
+  unsigned short s5port;
+
+  getconfig();
+
+  rc = recv(fd, (char *)buffer, sizeof(buffer), 0);
+
+  logmsg("READ %d bytes", rc);
+  loghex(buffer, rc);
+
+  if(buffer[SOCKS5_VERSION] == 4)
+    return socks4(fd, buffer, rc);
+
+  if(buffer[SOCKS5_VERSION] != config.version) {
+    logmsg("VERSION byte not %d", config.version);
+    return CURL_SOCKET_BAD;
+  }
+  if((buffer[SOCKS5_NMETHODS] < config.nmethods_min) ||
+     (buffer[SOCKS5_NMETHODS] > config.nmethods_max)) {
+    logmsg("NMETHODS byte not within %d - %d ",
+           config.nmethods_min, config.nmethods_max);
+    return CURL_SOCKET_BAD;
+  }
+  /* after NMETHODS follows that many bytes listing the methods the client
+     says it supports */
+  if(rc != (buffer[SOCKS5_NMETHODS] + 2)) {
+    logmsg("Expected %d bytes, got %d", buffer[SOCKS5_NMETHODS] + 2, rc);
+    return CURL_SOCKET_BAD;
+  }
+  logmsg("Incoming request deemed fine!");
+
+  /* respond with two bytes: VERSION + METHOD */
+  response[0] = config.responseversion;
+  response[1] = config.responsemethod;
+  rc = (send)(fd, (char *)response, 2, 0);
+  if(rc != 2) {
+    logmsg("Sending response failed!");
+    return CURL_SOCKET_BAD;
+  }
+  logmsg("Sent %d bytes", rc);
+  loghex(response, rc);
+
+  /* expect the request or auth */
+  rc = recv(fd, (char *)buffer, sizeof(buffer), 0);
+
+  logmsg("READ %d bytes", rc);
+  loghex(buffer, rc);
+
+  if(config.responsemethod == 2) {
+    /* RFC 1929 authentication
+       +----+------+----------+------+----------+
+       |VER | ULEN |  UNAME   | PLEN |  PASSWD  |
+       +----+------+----------+------+----------+
+       | 1  |  1   | 1 to 255 |  1   | 1 to 255 |
+       +----+------+----------+------+----------+
+    */
+    unsigned char ulen;
+    unsigned char plen;
+    bool login = TRUE;
+    if(rc < 5) {
+      logmsg("Too short auth input: %d", rc);
+      return CURL_SOCKET_BAD;
+    }
+    if(buffer[SOCKS5_VERSION] != 1) {
+      logmsg("Auth VERSION byte not 1, got %d", buffer[SOCKS5_VERSION]);
+      return CURL_SOCKET_BAD;
+    }
+    ulen = buffer[SOCKS5_ULEN];
+    if(rc < 4 + ulen) {
+      logmsg("Too short packet for username: %d", rc);
+      return CURL_SOCKET_BAD;
+    }
+    plen = buffer[SOCKS5_ULEN + ulen + 1];
+    if(rc < 3 + ulen + plen) {
+      logmsg("Too short packet for ulen %d plen %d: %d", ulen, plen, rc);
+      return CURL_SOCKET_BAD;
+    }
+    if((ulen != strlen(config.user)) ||
+       (plen != strlen(config.password)) ||
+       memcmp(&buffer[SOCKS5_UNAME], config.user, ulen) ||
+       memcmp(&buffer[SOCKS5_UNAME + ulen + 1], config.password, plen)) {
+      /* no match! */
+      logmsg("mismatched credentials!");
+      login = FALSE;
+    }
+    response[0] = 1;
+    response[1] = login ? 0 : 1;
+    rc = (send)(fd, (char *)response, 2, 0);
+    if(rc != 2) {
+      logmsg("Sending auth response failed!");
+      return CURL_SOCKET_BAD;
+    }
+    logmsg("Sent %d bytes", rc);
+    loghex(response, rc);
+    if(!login)
+      return CURL_SOCKET_BAD;
+
+    /* expect the request */
+    rc = recv(fd, (char *)buffer, sizeof(buffer), 0);
+
+    logmsg("READ %d bytes", rc);
+    loghex(buffer, rc);
+  }
+  if(rc < 6) {
+    logmsg("Too short for request: %d", rc);
+    return CURL_SOCKET_BAD;
+  }
+
+  if(buffer[SOCKS5_VERSION] != config.version) {
+    logmsg("Request VERSION byte not %d", config.version);
+    return CURL_SOCKET_BAD;
+  }
+  /* 1 == CONNECT */
+  if(buffer[SOCKS5_REQCMD] != config.reqcmd) {
+    logmsg("Request COMMAND byte not %d", config.reqcmd);
+    return CURL_SOCKET_BAD;
+  }
+  /* reserved, should be zero */
+  if(buffer[SOCKS5_RESERVED] != 0) {
+    logmsg("Request COMMAND byte not %d", config.reqcmd);
+    return CURL_SOCKET_BAD;
+  }
+  /* ATYP:
+     o  IP V4 address: X'01'
+     o  DOMAINNAME: X'03'
+     o  IP V6 address: X'04'
+  */
+  type = buffer[SOCKS5_ATYP];
+  address = &buffer[SOCKS5_DSTADDR];
+  switch(type) {
+  case 1:
+    /* 4 bytes IPv4 address */
+    len = 4;
+    break;
+  case 3:
+    /* The first octet of the address field contains the number of octets of
+       name that follow */
+    len = buffer[SOCKS5_DSTADDR];
+    len++;
+    break;
+  case 4:
+    /* 16 bytes IPv6 address */
+    len = 16;
+    break;
+  default:
+    logmsg("Unknown ATYP %d", type);
+    return CURL_SOCKET_BAD;
+  }
+  if(rc < (4 + len + 2)) {
+    logmsg("Request too short: %d, expected %d", rc, 4 + len + 2);
+    return CURL_SOCKET_BAD;
+  }
+
+  if(!config.port) {
+    unsigned char *portp = &buffer[SOCKS5_DSTADDR + len];
+    s5port = (unsigned short)((portp[0]<<8) | (portp[1]));
+  }
+  else
+    s5port = config.port;
+
+  if(!config.connectrep)
+    connfd = socksconnect(s5port, config.addr);
+
+  if(connfd == CURL_SOCKET_BAD) {
+    /* failed */
+    rep = 1;
+  }
+  else {
+    rep = config.connectrep;
+  }
+
+  /* */
+  response[SOCKS5_VERSION] = config.responseversion;
+
+  /*
+    o  REP    Reply field:
+    o  X'00' succeeded
+    o  X'01' general SOCKS server failure
+    o  X'02' connection not allowed by ruleset
+    o  X'03' Network unreachable
+    o  X'04' Host unreachable
+    o  X'05' Connection refused
+    o  X'06' TTL expired
+    o  X'07' Command not supported
+    o  X'08' Address type not supported
+    o  X'09' to X'FF' unassigned
+  */
+  response[SOCKS5_REP] = rep;
+  response[SOCKS5_RESERVED] = 0; /* must be zero */
+  response[SOCKS5_ATYP] = type; /* address type */
+
+  /* mirror back the original addr + port */
+
+  /* address or hostname */
+  memcpy(&response[SOCKS5_BNDADDR], address, len);
+
+  /* port number */
+  memcpy(&response[SOCKS5_BNDADDR + len],
+         &buffer[SOCKS5_DSTADDR + len], sizeof(socksport));
+
+  rc = (send)(fd, (char *)response, len + 6, 0);
+  if(rc != (len + 6)) {
+    logmsg("Sending connect response failed!");
+    return CURL_SOCKET_BAD;
+  }
+  logmsg("Sent %d bytes", rc);
+  loghex(response, rc);
+
+  if(!rep)
+    return connfd;
+
+  if(connfd != CURL_SOCKET_BAD)
+    sclose(connfd);
+
+  return CURL_SOCKET_BAD;
+}
+
+struct perclient {
+  size_t fromremote;
+  size_t fromclient;
+  curl_socket_t remotefd;
+  curl_socket_t clientfd;
+  bool used;
+};
+
+/* return non-zero when transfer is done */
+static int tunnel(struct perclient *cp, fd_set *fds)
+{
+  ssize_t nread;
+  ssize_t nwrite;
+  char buffer[512];
+  if(FD_ISSET(cp->clientfd, fds)) {
+    /* read from client, send to remote */
+    nread = recv(cp->clientfd, buffer, sizeof(buffer), 0);
+    if(nread > 0) {
+      nwrite = send(cp->remotefd, (char *)buffer,
+                    (SEND_TYPE_ARG3)nread, 0);
+      if(nwrite != nread)
+        return 1;
+      cp->fromclient += nwrite;
+    }
+    else
+      return 1;
+  }
+  if(FD_ISSET(cp->remotefd, fds)) {
+    /* read from remote, send to client */
+    nread = recv(cp->remotefd, buffer, sizeof(buffer), 0);
+    if(nread > 0) {
+      nwrite = send(cp->clientfd, (char *)buffer,
+                    (SEND_TYPE_ARG3)nread, 0);
+      if(nwrite != nread)
+        return 1;
+      cp->fromremote += nwrite;
+    }
+    else
+      return 1;
+  }
+  return 0;
+}
+
+/*
+  sockfdp is a pointer to an established stream or CURL_SOCKET_BAD
+
+  if sockfd is CURL_SOCKET_BAD, listendfd is a listening socket we must
+  accept()
+*/
+static bool incoming(curl_socket_t listenfd)
+{
+  fd_set fds_read;
+  fd_set fds_write;
+  fd_set fds_err;
+  int clients = 0; /* connected clients */
+  struct perclient c[2];
+
+  memset(c, 0, sizeof(c));
+  if(got_exit_signal) {
+    logmsg("signalled to die, exiting...");
+    return FALSE;
+  }
+
+#ifdef HAVE_GETPPID
+  /* As a last resort, quit if socks5 process becomes orphan. */
+  if(getppid() <= 1) {
+    logmsg("process becomes orphan, exiting");
+    return FALSE;
+  }
+#endif
+
+  do {
+    int i;
+    ssize_t rc;
+    int error = 0;
+    curl_socket_t sockfd = listenfd;
+    int maxfd = (int)sockfd;
+
+    FD_ZERO(&fds_read);
+    FD_ZERO(&fds_write);
+    FD_ZERO(&fds_err);
+
+    /* there's always a socket to wait for */
+    FD_SET(sockfd, &fds_read);
+
+    for(i = 0; i < 2; i++) {
+      if(c[i].used) {
+        curl_socket_t fd = c[i].clientfd;
+        FD_SET(fd, &fds_read);
+        if((int)fd > maxfd)
+          maxfd = (int)fd;
+        fd = c[i].remotefd;
+        FD_SET(fd, &fds_read);
+        if((int)fd > maxfd)
+          maxfd = (int)fd;
+      }
+    }
+
+    do {
+      /* select() blocking behavior call on blocking descriptors please */
+      rc = select(maxfd + 1, &fds_read, &fds_write, &fds_err, NULL);
+      if(got_exit_signal) {
+        logmsg("signalled to die, exiting...");
+        return FALSE;
+      }
+    } while((rc == -1) && ((error = errno) == EINTR));
+
+    if(rc < 0) {
+      logmsg("select() failed with error: (%d) %s",
+             error, strerror(error));
+      return FALSE;
+    }
+
+    if((clients < 2) && FD_ISSET(sockfd, &fds_read)) {
+      curl_socket_t newfd = accept(sockfd, NULL, NULL);
+      if(CURL_SOCKET_BAD == newfd) {
+        error = SOCKERRNO;
+        logmsg("accept(%d, NULL, NULL) failed with error: (%d) %s",
+               sockfd, error, strerror(error));
+      }
+      else {
+        curl_socket_t remotefd;
+        logmsg("====> Client connect, fd %d. Read config from %s",
+               newfd, configfile);
+        remotefd = sockit(newfd); /* SOCKS until done */
+        if(remotefd == CURL_SOCKET_BAD) {
+          logmsg("====> Client disconnect");
+          sclose(newfd);
+        }
+        else {
+          struct perclient *cp = &c[0];
+          logmsg("====> Tunnel transfer");
+
+          if(c[0].used)
+            cp = &c[1];
+          cp->fromremote = 0;
+          cp->fromclient = 0;
+          cp->clientfd = newfd;
+          cp->remotefd = remotefd;
+          cp->used = TRUE;
+          clients++;
+        }
+
+      }
+    }
+    for(i = 0; i < 2; i++) {
+      struct perclient *cp = &c[i];
+      if(cp->used) {
+        if(tunnel(cp, &fds_read)) {
+          logmsg("SOCKS transfer completed. Bytes: < %zu > %zu",
+                 cp->fromremote, cp->fromclient);
+          sclose(cp->clientfd);
+          sclose(cp->remotefd);
+          cp->used = FALSE;
+          clients--;
+        }
+      }
+    }
+  } while(clients);
+
+  return TRUE;
+}
+
+static curl_socket_t sockdaemon(curl_socket_t sock,
+                                unsigned short *listenport)
+{
+  /* passive daemon style */
+  srvr_sockaddr_union_t listener;
+  int flag;
+  int rc;
+  int totdelay = 0;
+  int maxretr = 10;
+  int delay = 20;
+  int attempt = 0;
+  int error = 0;
+
+  do {
+    attempt++;
+    flag = 1;
+    rc = setsockopt(sock, SOL_SOCKET, SO_REUSEADDR,
+         (void *)&flag, sizeof(flag));
+    if(rc) {
+      error = SOCKERRNO;
+      logmsg("setsockopt(SO_REUSEADDR) failed with error: (%d) %s",
+             error, strerror(error));
+      if(maxretr) {
+        rc = wait_ms(delay);
+        if(rc) {
+          /* should not happen */
+          error = errno;
+          logmsg("wait_ms() failed with error: (%d) %s",
+                 error, strerror(error));
+          sclose(sock);
+          return CURL_SOCKET_BAD;
+        }
+        if(got_exit_signal) {
+          logmsg("signalled to die, exiting...");
+          sclose(sock);
+          return CURL_SOCKET_BAD;
+        }
+        totdelay += delay;
+        delay *= 2; /* double the sleep for next attempt */
+      }
+    }
+  } while(rc && maxretr--);
+
+  if(rc) {
+    logmsg("setsockopt(SO_REUSEADDR) failed %d times in %d ms. Error: (%d) %s",
+           attempt, totdelay, error, strerror(error));
+    logmsg("Continuing anyway...");
+  }
+
+  /* When the specified listener port is zero, it is actually a
+     request to let the system choose a non-zero available port. */
+
+#ifdef ENABLE_IPV6
+  if(!use_ipv6) {
+#endif
+    memset(&listener.sa4, 0, sizeof(listener.sa4));
+    listener.sa4.sin_family = AF_INET;
+    listener.sa4.sin_addr.s_addr = INADDR_ANY;
+    listener.sa4.sin_port = htons(*listenport);
+    rc = bind(sock, &listener.sa, sizeof(listener.sa4));
+#ifdef ENABLE_IPV6
+  }
+  else {
+    memset(&listener.sa6, 0, sizeof(listener.sa6));
+    listener.sa6.sin6_family = AF_INET6;
+    listener.sa6.sin6_addr = in6addr_any;
+    listener.sa6.sin6_port = htons(*listenport);
+    rc = bind(sock, &listener.sa, sizeof(listener.sa6));
+  }
+#endif /* ENABLE_IPV6 */
+  if(rc) {
+    error = SOCKERRNO;
+    logmsg("Error binding socket on port %hu: (%d) %s",
+           *listenport, error, strerror(error));
+    sclose(sock);
+    return CURL_SOCKET_BAD;
+  }
+
+  if(!*listenport) {
+    /* The system was supposed to choose a port number, figure out which
+       port we actually got and update the listener port value with it. */
+    curl_socklen_t la_size;
+    srvr_sockaddr_union_t localaddr;
+#ifdef ENABLE_IPV6
+    if(!use_ipv6)
+#endif
+      la_size = sizeof(localaddr.sa4);
+#ifdef ENABLE_IPV6
+    else
+      la_size = sizeof(localaddr.sa6);
+#endif
+    memset(&localaddr.sa, 0, (size_t)la_size);
+    if(getsockname(sock, &localaddr.sa, &la_size) < 0) {
+      error = SOCKERRNO;
+      logmsg("getsockname() failed with error: (%d) %s",
+             error, strerror(error));
+      sclose(sock);
+      return CURL_SOCKET_BAD;
+    }
+    switch(localaddr.sa.sa_family) {
+    case AF_INET:
+      *listenport = ntohs(localaddr.sa4.sin_port);
+      break;
+#ifdef ENABLE_IPV6
+    case AF_INET6:
+      *listenport = ntohs(localaddr.sa6.sin6_port);
+      break;
+#endif
+    default:
+      break;
+    }
+    if(!*listenport) {
+      /* Real failure, listener port shall not be zero beyond this point. */
+      logmsg("Apparently getsockname() succeeded, with listener port zero.");
+      logmsg("A valid reason for this failure is a binary built without");
+      logmsg("proper network library linkage. This might not be the only");
+      logmsg("reason, but double check it before anything else.");
+      sclose(sock);
+      return CURL_SOCKET_BAD;
+    }
+  }
+
+  /* start accepting connections */
+  rc = listen(sock, 5);
+  if(0 != rc) {
+    error = SOCKERRNO;
+    logmsg("listen(%d, 5) failed with error: (%d) %s",
+           sock, error, strerror(error));
+    sclose(sock);
+    return CURL_SOCKET_BAD;
+  }
+
+  return sock;
+}
+
+
+int main(int argc, char *argv[])
+{
+  curl_socket_t sock = CURL_SOCKET_BAD;
+  curl_socket_t msgsock = CURL_SOCKET_BAD;
+  int wrotepidfile = 0;
+  const char *pidname = ".socksd.pid";
+  bool juggle_again;
+  int error;
+  int arg = 1;
+
+  while(argc>arg) {
+    if(!strcmp("--version", argv[arg])) {
+      printf("socksd IPv4%s\n",
+#ifdef ENABLE_IPV6
+             "/IPv6"
+#else
+             ""
+#endif
+             );
+      return 0;
+    }
+    else if(!strcmp("--pidfile", argv[arg])) {
+      arg++;
+      if(argc>arg)
+        pidname = argv[arg++];
+    }
+    else if(!strcmp("--config", argv[arg])) {
+      arg++;
+      if(argc>arg)
+        configfile = argv[arg++];
+    }
+    else if(!strcmp("--backend", argv[arg])) {
+      arg++;
+      if(argc>arg)
+        backendaddr = argv[arg++];
+    }
+    else if(!strcmp("--backendport", argv[arg])) {
+      arg++;
+      if(argc>arg)
+        backendport = (unsigned short)atoi(argv[arg++]);
+    }
+    else if(!strcmp("--logfile", argv[arg])) {
+      arg++;
+      if(argc>arg)
+        serverlogfile = argv[arg++];
+    }
+    else if(!strcmp("--ipv6", argv[arg])) {
+#ifdef ENABLE_IPV6
+      ipv_inuse = "IPv6";
+      use_ipv6 = TRUE;
+#endif
+      arg++;
+    }
+    else if(!strcmp("--ipv4", argv[arg])) {
+      /* for completeness, we support this option as well */
+#ifdef ENABLE_IPV6
+      ipv_inuse = "IPv4";
+      use_ipv6 = FALSE;
+#endif
+      arg++;
+    }
+    else if(!strcmp("--port", argv[arg])) {
+      arg++;
+      if(argc>arg) {
+        char *endptr;
+        unsigned long ulnum = strtoul(argv[arg], &endptr, 10);
+        if((endptr != argv[arg] + strlen(argv[arg])) ||
+           ((ulnum != 0UL) && ((ulnum < 1025UL) || (ulnum > 65535UL)))) {
+          fprintf(stderr, "socksd: invalid --port argument (%s)\n",
+                  argv[arg]);
+          return 0;
+        }
+        port = curlx_ultous(ulnum);
+        arg++;
+      }
+    }
+    else {
+      puts("Usage: socksd [option]\n"
+           " --backend [ipv4 addr]\n"
+           " --backendport [TCP port]\n"
+           " --config [file]\n"
+           " --version\n"
+           " --logfile [file]\n"
+           " --pidfile [file]\n"
+           " --ipv4\n"
+           " --ipv6\n"
+           " --bindonly\n"
+           " --port [port]\n");
+      return 0;
+    }
+  }
+
+#ifdef WIN32
+  win32_init();
+  atexit(win32_cleanup);
+
+  setmode(fileno(stdin), O_BINARY);
+  setmode(fileno(stdout), O_BINARY);
+  setmode(fileno(stderr), O_BINARY);
+#endif
+
+  install_signal_handlers();
+
+#ifdef ENABLE_IPV6
+  if(!use_ipv6)
+#endif
+    sock = socket(AF_INET, SOCK_STREAM, 0);
+#ifdef ENABLE_IPV6
+  else
+    sock = socket(AF_INET6, SOCK_STREAM, 0);
+#endif
+
+  if(CURL_SOCKET_BAD == sock) {
+    error = SOCKERRNO;
+    logmsg("Error creating socket: (%d) %s",
+           error, strerror(error));
+    goto socks5_cleanup;
+  }
+
+  {
+    /* passive daemon style */
+    sock = sockdaemon(sock, &port);
+    if(CURL_SOCKET_BAD == sock) {
+      goto socks5_cleanup;
+    }
+    msgsock = CURL_SOCKET_BAD; /* no stream socket yet */
+  }
+
+  logmsg("Running %s version", ipv_inuse);
+  logmsg("Listening on port %hu", port);
+
+  wrotepidfile = write_pidfile(pidname);
+  if(!wrotepidfile) {
+    goto socks5_cleanup;
+  }
+
+  do {
+    juggle_again = incoming(sock);
+  } while(juggle_again);
+
+socks5_cleanup:
+
+  if((msgsock != sock) && (msgsock != CURL_SOCKET_BAD))
+    sclose(msgsock);
+
+  if(sock != CURL_SOCKET_BAD)
+    sclose(sock);
+
+  if(wrotepidfile)
+    unlink(pidname);
+
+  restore_signal_handlers();
+
+  if(got_exit_signal) {
+    logmsg("============> socksd exits with signal (%d)", exit_signal);
+    /*
+     * To properly set the return status of the process we
+     * must raise the same signal SIGINT or SIGTERM that we
+     * caught and let the old handler take care of it.
+     */
+    raise(exit_signal);
+  }
+
+  logmsg("============> socksd quits");
+  return 0;
+}
index 8df4d76..10982b6 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -111,15 +111,12 @@ struct httprequest {
   bool ntlm;      /* Authorization ntlm header found */
   int writedelay; /* if non-zero, delay this number of seconds between
                      writes in the response */
-  int pipe;       /* if non-zero, expect this many requests to do a "piped"
-                     request/response */
   int skip;       /* if non-zero, the server is instructed to not read this
                      many bytes from a PUT/POST request. Ie the client sends N
                      bytes said in Content-Length, but the server only reads N
                      - skip bytes. */
   int rcmd;       /* doing a special command, see defines above */
   int prot_version;  /* HTTP version * 10 */
-  bool pipelining;   /* true if request is pipelined */
   int callcount;  /* times ProcessRequest() gets called */
   bool connmon;   /* monitor the state of the connection, log disconnects */
   bool upgrade;   /* test case allows upgrade to http2 */
@@ -253,6 +250,9 @@ SIG_ATOMIC_T got_exit_signal = 0;
 
 static volatile int exit_signal = 0;
 
+/* work around for handling trailing headers */
+static int already_recv_zeroed_chunk = FALSE;
+
 /* signal handler that will be triggered to indicate that the program
   should finish its execution in a controlled manner as soon as possible.
   The first time this is called it will set got_exit_signal to one and
@@ -367,6 +367,8 @@ static int parse_servercmd(struct httprequest *req)
 
   filename = test2file(req->testno);
   req->close = FALSE;
+  req->connmon = FALSE;
+
   stream = fopen(filename, "rb");
   if(!stream) {
     error = errno;
@@ -391,8 +393,6 @@ static int parse_servercmd(struct httprequest *req)
       return 1; /* done */
     }
 
-    req->connmon = FALSE;
-
     cmd = orgcmd;
     while(cmd && cmdsize) {
       char *check;
@@ -423,14 +423,6 @@ static int parse_servercmd(struct httprequest *req)
         logmsg("swsclose: close this connection after response");
         req->close = TRUE;
       }
-      else if(1 == sscanf(cmd, "pipe: %d", &num)) {
-        logmsg("instructed to allow a pipe size of %d", num);
-        if(num < 0)
-          logmsg("negative pipe size ignored");
-        else if(num > 0)
-          req->pipe = num-1; /* decrease by one since we don't count the
-                                first request in this number */
-      }
       else if(1 == sscanf(cmd, "skip: %d", &num)) {
         logmsg("instructed to skip this number of bytes %d", num);
         req->skip = num;
@@ -509,11 +501,11 @@ static int ProcessRequest(struct httprequest *req)
     /* get the number after it */
     if(ptr) {
       if((strlen(doc) + strlen(request)) < 400)
-        snprintf(logbuf, sizeof(logbuf), "Got request: %s %s HTTP/%d.%d",
-                 request, doc, prot_major, prot_minor);
+        msnprintf(logbuf, sizeof(logbuf), "Got request: %s %s HTTP/%d.%d",
+                  request, doc, prot_major, prot_minor);
       else
-        snprintf(logbuf, sizeof(logbuf), "Got a *HUGE* request HTTP/%d.%d",
-                 prot_major, prot_minor);
+        msnprintf(logbuf, sizeof(logbuf), "Got a *HUGE* request HTTP/%d.%d",
+                  prot_major, prot_minor);
       logmsg("%s", logbuf);
 
       if(!strncmp("/verifiedserver", ptr, 15)) {
@@ -545,15 +537,14 @@ static int ProcessRequest(struct httprequest *req)
 
       if(req->testno) {
 
-        snprintf(logbuf, sizeof(logbuf), "Requested test number %ld part %ld",
-                 req->testno, req->partno);
+        msnprintf(logbuf, sizeof(logbuf), "Requested test number %ld part %ld",
+                  req->testno, req->partno);
         logmsg("%s", logbuf);
-
-        /* find and parse <servercmd> for this test */
-        parse_servercmd(req);
       }
-      else
+      else {
+        logmsg("No test number");
         req->testno = DOCNUMBER_NOTHING;
+      }
 
     }
 
@@ -565,9 +556,9 @@ static int ProcessRequest(struct httprequest *req)
                 doc, &prot_major, &prot_minor) == 3) {
         char *portp = NULL;
 
-        snprintf(logbuf, sizeof(logbuf),
-                 "Received a CONNECT %s HTTP/%d.%d request",
-                 doc, prot_major, prot_minor);
+        msnprintf(logbuf, sizeof(logbuf),
+                  "Received a CONNECT %s HTTP/%d.%d request",
+                  doc, prot_major, prot_minor);
         logmsg("%s", logbuf);
 
         req->connect_request = TRUE;
@@ -614,14 +605,6 @@ static int ProcessRequest(struct httprequest *req)
     }
 
     if(req->testno == DOCNUMBER_NOTHING) {
-      /* check for a Testno: header with the test case number */
-      char *testno = strstr(line, "\nTestno: ");
-      if(testno) {
-        req->testno = strtol(&testno[9], NULL, 10);
-        logmsg("Found test number %d in Testno: header!", req->testno);
-      }
-    }
-    if(req->testno == DOCNUMBER_NOTHING) {
       /* Still no test case number. Try to get the the number off the last dot
          instead, IE we consider the TLD to be the test number. Test 123 can
          then be written as "example.com.123". */
@@ -645,9 +628,9 @@ static int ProcessRequest(struct httprequest *req)
         else
           req->partno = 0;
 
-        snprintf(logbuf, sizeof(logbuf),
-                 "Requested test number %ld part %ld (from host name)",
-                 req->testno, req->partno);
+        msnprintf(logbuf, sizeof(logbuf),
+                  "Requested test number %ld part %ld (from host name)",
+                  req->testno, req->partno);
         logmsg("%s", logbuf);
 
       }
@@ -661,8 +644,8 @@ static int ProcessRequest(struct httprequest *req)
     }
   }
   else if((req->offset >= 3) && (req->testno == DOCNUMBER_NOTHING)) {
-    logmsg("** Unusual request. Starts with %02x %02x %02x",
-           line[0], line[1], line[2]);
+    logmsg("** Unusual request. Starts with %02x %02x %02x (%c%c%c)",
+           line[0], line[1], line[2], line[0], line[1], line[2]);
   }
 
   if(!end) {
@@ -670,7 +653,22 @@ static int ProcessRequest(struct httprequest *req)
     logmsg("request not complete yet");
     return 0; /* not complete yet */
   }
-  logmsg("- request found to be complete");
+  logmsg("- request found to be complete (%d)", req->testno);
+
+  if(req->testno == DOCNUMBER_NOTHING) {
+    /* check for a Testno: header with the test case number */
+    char *testno = strstr(line, "\nTestno: ");
+    if(testno) {
+      req->testno = strtol(&testno[9], NULL, 10);
+      logmsg("Found test number %d in Testno: header!", req->testno);
+    }
+    else {
+      logmsg("No Testno: header");
+    }
+  }
+
+  /* find and parse <servercmd> for this test */
+  parse_servercmd(req);
 
   if(use_gopher) {
     /* when using gopher we cannot check the request until the entire
@@ -696,18 +694,13 @@ static int ProcessRequest(struct httprequest *req)
       else
         req->partno = 0;
 
-      snprintf(logbuf, sizeof(logbuf),
-               "Requested GOPHER test number %ld part %ld",
-               req->testno, req->partno);
+      msnprintf(logbuf, sizeof(logbuf),
+                "Requested GOPHER test number %ld part %ld",
+                req->testno, req->partno);
       logmsg("%s", logbuf);
     }
   }
 
-  if(req->pipe)
-    /* we do have a full set, advance the checkindex to after the end of the
-       headers, for the pipelining case mostly */
-    req->checkindex += (end - line) + strlen(end_of_headers);
-
   /* **** Persistence ****
    *
    * If the request is a HTTP/1.0 one, we close the connection unconditionally
@@ -755,10 +748,27 @@ static int ProcessRequest(struct httprequest *req)
       chunked = TRUE;
     }
 
+
     if(chunked) {
-      if(strstr(req->reqbuf, "\r\n0\r\n\r\n"))
+      if(strstr(req->reqbuf, "\r\n0\r\n\r\n")) {
         /* end of chunks reached */
         return 1; /* done */
+      }
+      else if(strstr(req->reqbuf, "\r\n0\r\n")) {
+        char *last_crlf_char = strstr(req->reqbuf, "\r\n\r\n");
+        while(TRUE) {
+          if(!strstr(last_crlf_char + 4, "\r\n\r\n"))
+            break;
+          last_crlf_char = strstr(last_crlf_char + 4, "\r\n\r\n");
+        }
+        if(last_crlf_char &&
+           last_crlf_char > strstr(req->reqbuf, "\r\n0\r\n"))
+          return 1;
+        already_recv_zeroed_chunk = TRUE;
+        return 0;
+      }
+      else if(already_recv_zeroed_chunk && strstr(req->reqbuf, "\r\n\r\n"))
+        return 1;
       else
         return 0; /* not done */
     }
@@ -824,8 +834,7 @@ static int ProcessRequest(struct httprequest *req)
   if(strstr(req->reqbuf, "Connection: close"))
     req->open = FALSE; /* close connection after this request */
 
-  if(!req->pipe &&
-     req->open &&
+  if(req->open &&
      req->prot_version >= 11 &&
      end &&
      req->reqbuf + req->offset > end + strlen(end_of_headers) &&
@@ -835,19 +844,6 @@ static int ProcessRequest(struct httprequest *req)
     /* If we have a persistent connection, HTTP version >= 1.1
        and GET/HEAD request, enable pipelining. */
     req->checkindex = (end - req->reqbuf) + strlen(end_of_headers);
-    req->pipelining = TRUE;
-  }
-
-  while(req->pipe) {
-    if(got_exit_signal)
-      return 1; /* done */
-    /* scan for more header ends within this chunk */
-    line = &req->reqbuf[req->checkindex];
-    end = strstr(line, end_of_headers);
-    if(!end)
-      break;
-    req->checkindex += (end - line) + strlen(end_of_headers);
-    req->pipe--;
   }
 
   /* If authentication is required and no auth was provided, end now. This
@@ -931,13 +927,8 @@ storerequest_cleanup:
 
 static void init_httprequest(struct httprequest *req)
 {
-  /* Pipelining is already set, so do not initialize it here. Only initialize
-     checkindex and offset if pipelining is not set, since in a pipeline they
-     need to be inherited from the previous request. */
-  if(!req->pipelining) {
-    req->checkindex = 0;
-    req->offset = 0;
-  }
+  req->checkindex = 0;
+  req->offset = 0;
   req->testno = DOCNUMBER_NOTHING;
   req->partno = 0;
   req->connect_request = FALSE;
@@ -947,7 +938,6 @@ static void init_httprequest(struct httprequest *req)
   req->cl = 0;
   req->digest = FALSE;
   req->ntlm = FALSE;
-  req->pipe = 0;
   req->skip = 0;
   req->writedelay = 0;
   req->rcmd = RCMD_NORMALREQ;
@@ -968,39 +958,19 @@ static int get_request(curl_socket_t sock, struct httprequest *req)
   ssize_t got = 0;
   int overflow = 0;
 
-  char *pipereq = NULL;
-  size_t pipereq_length = 0;
-
-  if(req->pipelining) {
-    pipereq = reqbuf + req->checkindex;
-    pipereq_length = req->offset - req->checkindex;
-
-    /* Now that we've got the pipelining info we can reset the
-       pipelining-related vars which were skipped in init_httprequest */
-    req->pipelining = FALSE;
-    req->checkindex = 0;
-    req->offset = 0;
-  }
-
   if(req->offset >= REQBUFSIZ-1) {
     /* buffer is already full; do nothing */
     overflow = 1;
   }
   else {
-    if(pipereq_length && pipereq) {
-      memmove(reqbuf, pipereq, pipereq_length);
-      got = curlx_uztosz(pipereq_length);
-      pipereq_length = 0;
-    }
-    else {
-      if(req->skip)
-        /* we are instructed to not read the entire thing, so we make sure to
-           only read what we're supposed to and NOT read the enire thing the
-           client wants to send! */
-        got = sread(sock, reqbuf + req->offset, req->cl);
-      else
-        got = sread(sock, reqbuf + req->offset, REQBUFSIZ-1 - req->offset);
-    }
+    if(req->skip)
+      /* we are instructed to not read the entire thing, so we make sure to
+         only read what we're supposed to and NOT read the enire thing the
+         client wants to send! */
+      got = sread(sock, reqbuf + req->offset, req->cl);
+    else
+      got = sread(sock, reqbuf + req->offset, REQBUFSIZ-1 - req->offset);
+
     if(got_exit_signal)
       return -1;
     if(got == 0) {
@@ -1031,11 +1001,6 @@ static int get_request(curl_socket_t sock, struct httprequest *req)
     req->done_processing = ProcessRequest(req);
     if(got_exit_signal)
       return -1;
-    if(req->done_processing && req->pipe) {
-      logmsg("Waiting for another piped request");
-      req->done_processing = 0;
-      req->pipe--;
-    }
   }
 
   if(overflow || (req->offset == REQBUFSIZ-1 && got > 0)) {
@@ -1055,7 +1020,7 @@ static int get_request(curl_socket_t sock, struct httprequest *req)
 
   /* at the end of a request dump it to an external file */
   if(fail || req->done_processing)
-    storerequest(reqbuf, req->pipelining ? req->checkindex : req->offset);
+    storerequest(reqbuf, req->offset);
   if(got_exit_signal)
     return -1;
 
@@ -1117,14 +1082,14 @@ static int send_doc(curl_socket_t sock, struct httprequest *req)
     case DOCNUMBER_WERULEZ:
       /* we got a "friends?" question, reply back that we sure are */
       logmsg("Identifying ourselves as friends");
-      snprintf(msgbuf, sizeof(msgbuf), "WE ROOLZ: %ld\r\n", (long)getpid());
+      msnprintf(msgbuf, sizeof(msgbuf), "WE ROOLZ: %ld\r\n", (long)getpid());
       msglen = strlen(msgbuf);
       if(use_gopher)
-        snprintf(weare, sizeof(weare), "%s", msgbuf);
+        msnprintf(weare, sizeof(weare), "%s", msgbuf);
       else
-        snprintf(weare, sizeof(weare),
-                 "HTTP/1.1 200 OK\r\nContent-Length: %zu\r\n\r\n%s",
-                 msglen, msgbuf);
+        msnprintf(weare, sizeof(weare),
+                  "HTTP/1.1 200 OK\r\nContent-Length: %zu\r\n\r\n%s",
+                  msglen, msgbuf);
       buffer = weare;
       break;
     case DOCNUMBER_404:
@@ -1145,9 +1110,9 @@ static int send_doc(curl_socket_t sock, struct httprequest *req)
     const char *section = req->connect_request?"connect":"data";
 
     if(req->partno)
-      snprintf(partbuf, sizeof(partbuf), "%s%ld", section, req->partno);
+      msnprintf(partbuf, sizeof(partbuf), "%s%ld", section, req->partno);
     else
-      snprintf(partbuf, sizeof(partbuf), "%s", section);
+      msnprintf(partbuf, sizeof(partbuf), "%s", section);
 
     logmsg("Send response test%ld section <%s>", req->testno, partbuf);
 
@@ -1277,6 +1242,8 @@ static int send_doc(curl_socket_t sock, struct httprequest *req)
     logmsg("Sending response failed. Only (%zu bytes) of (%zu bytes) "
            "were sent",
            responsesize-count, responsesize);
+    prevtestno = req->testno;
+    prevpartno = req->partno;
     free(ptr);
     free(cmd);
     return -1;
@@ -1578,7 +1545,6 @@ static void http_connect(curl_socket_t *infdp,
               logmsg("====> TCP_NODELAY for client DATA connection failed");
           }
 #endif
-          req2.pipelining = FALSE;
           init_httprequest(&req2);
           while(!req2.done_processing) {
             err = get_request(datafd, &req2);
@@ -2118,7 +2084,7 @@ int main(int argc, char *argv[])
     }
   }
 
-  snprintf(port_str, sizeof(port_str), "port %hu", port);
+  msnprintf(port_str, sizeof(port_str), "port %hu", port);
 
 #ifdef WIN32
   win32_init();
@@ -2261,7 +2227,6 @@ int main(int argc, char *argv[])
      the pipelining struct field must be initialized previously to FALSE
      every time a new connection arrives. */
 
-  req.pipelining = FALSE;
   init_httprequest(&req);
 
   for(;;) {
index c00731f..35419b0 100644 (file)
@@ -15,7 +15,7 @@
  */
 
 /*
- * Copyright (c) 1983, 2016 Regents of the University of California.
+ * Copyright (c) 1983 Regents of the University of California.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -569,7 +569,7 @@ static ssize_t write_behind(struct testcase *test, int convert)
 
   if(!test->ofile) {
     char outfile[256];
-    snprintf(outfile, sizeof(outfile), "log/upload.%ld", test->testno);
+    msnprintf(outfile, sizeof(outfile), "log/upload.%ld", test->testno);
 #ifdef WIN32
     test->ofile = open(outfile, O_CREAT|O_RDWR|O_BINARY, 0777);
 #else
@@ -1141,8 +1141,8 @@ static int validate_access(struct testcase *test,
 
   if(!strncmp("verifiedserver", filename, 14)) {
     char weare[128];
-    size_t count = snprintf(weare, sizeof(weare),
-                            "WE ROOLZ: %ld\r\n", (long)getpid());
+    size_t count = msnprintf(weare, sizeof(weare),
+                             "WE ROOLZ: %ld\r\n", (long)getpid());
 
     logmsg("Are-we-friendly question received");
     test->buffer = strdup(weare);
@@ -1187,7 +1187,7 @@ static int validate_access(struct testcase *test,
     file = test2file(testno);
 
     if(0 != partno)
-      snprintf(partbuf, sizeof(partbuf), "data%ld", partno);
+      msnprintf(partbuf, sizeof(partbuf), "data%ld", partno);
 
     if(file) {
       FILE *stream = fopen(file, "rb");
index 07ef63e..263f0ce 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -87,7 +87,7 @@ char *data_to_hex(char *data, size_t len)
     if((data[i] >= 0x20) && (data[i] < 0x7f))
       *optr++ = *iptr++;
     else {
-      snprintf(optr, 4, "%%%02x", *iptr++);
+      msnprintf(optr, 4, "%%%02x", *iptr++);
       optr += 3;
     }
   }
@@ -121,11 +121,12 @@ void logmsg(const char *msg, ...)
   sec = epoch_offset + tv.tv_sec;
   now = localtime(&sec); /* not thread safe but we don't care */
 
-  snprintf(timebuf, sizeof(timebuf), "%02d:%02d:%02d.%06ld",
-    (int)now->tm_hour, (int)now->tm_min, (int)now->tm_sec, (long)tv.tv_usec);
+  msnprintf(timebuf, sizeof(timebuf), "%02d:%02d:%02d.%06ld",
+            (int)now->tm_hour, (int)now->tm_min, (int)now->tm_sec,
+            (long)tv.tv_usec);
 
   va_start(ap, msg);
-  vsnprintf(buffer, sizeof(buffer), msg, ap);
+  mvsnprintf(buffer, sizeof(buffer), msg, ap);
   va_end(ap);
 
   logfp = fopen(serverlogfile, "ab");
@@ -149,9 +150,10 @@ void win32_perror(const char *msg)
   char buf[512];
   DWORD err = SOCKERRNO;
 
-  if(!FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, err,
-                    LANG_NEUTRAL, buf, sizeof(buf), NULL))
-     snprintf(buf, sizeof(buf), "Unknown error %lu (%#lx)", err, err);
+  if(!FormatMessageA((FORMAT_MESSAGE_FROM_SYSTEM |
+                      FORMAT_MESSAGE_IGNORE_INSERTS), NULL, err,
+                     LANG_NEUTRAL, buf, sizeof(buf), NULL))
+    msnprintf(buf, sizeof(buf), "Unknown error %lu (%#lx)", err, err);
   if(msg)
     fprintf(stderr, "%s: ", msg);
   fprintf(stderr, "%s\n", buf);
@@ -195,7 +197,7 @@ const char *path = ".";
 char *test2file(long testno)
 {
   static char filename[256];
-  snprintf(filename, sizeof(filename), TEST_DATA_PATH, path, testno);
+  msnprintf(filename, sizeof(filename), TEST_DATA_PATH, path, testno);
   return filename;
 }
 
@@ -421,7 +423,7 @@ static struct timeval tvnow(void)
   DWORD milliseconds = GetTickCount();
 #endif
   now.tv_sec = (long)(milliseconds / 1000);
-  now.tv_usec = (milliseconds % 1000) * 1000;
+  now.tv_usec = (long)((milliseconds % 1000) * 1000);
   return now;
 }
 
index 195ae39..4fcd34f 100755 (executable)
 from __future__ import (absolute_import, division, print_function)
 # unicode_literals)
 import argparse
-import ConfigParser
 import os
 import sys
 import logging
 import tempfile
+try: # Python 3
+    import configparser
+except ImportError: # Python 2
+    import ConfigParser as configparser
 
 # Import our curl test data helper
 import curl_test_data
@@ -58,7 +61,7 @@ def smbserver(options):
             f.write("{0}".format(pid))
 
     # Here we write a mini config for the server
-    smb_config = ConfigParser.ConfigParser()
+    smb_config = configparser.ConfigParser()
     smb_config.add_section("global")
     smb_config.set("global", "server_name", "SERVICE")
     smb_config.set("global", "server_os", "UNIX")
@@ -86,7 +89,7 @@ def smbserver(options):
 
     test_data_dir = os.path.join(options.srcdir, "data")
 
-    smb_server = TestSmbServer(("127.0.0.1", options.port),
+    smb_server = TestSmbServer((options.host, options.port),
                                config_parser=smb_config,
                                test_data_directory=test_data_dir)
     log.info("[SMB] setting up SMB server on port %s", options.port)
@@ -312,6 +315,8 @@ def get_options():
 
     parser.add_argument("--port", action="store", default=9017,
                       type=int, help="port to listen on")
+    parser.add_argument("--host", action="store", default="127.0.0.1",
+                      help="host to listen on")
     parser.add_argument("--verbose", action="store", type=int, default=0,
                         help="verbose output")
     parser.add_argument("--pidfile", action="store",
index 7345eb3..248be67 100644 (file)
@@ -106,12 +106,12 @@ use vars qw(
 #***************************************************************************
 # Global variables initialization
 #
-$sshdexe         = 'sshd'        .exe_ext(); # base name and ext of ssh daemon
-$sshexe          = 'ssh'         .exe_ext(); # base name and ext of ssh client
-$sftpsrvexe      = 'sftp-server' .exe_ext(); # base name and ext of sftp-server
-$sftpexe         = 'sftp'        .exe_ext(); # base name and ext of sftp client
-$sshkeygenexe    = 'ssh-keygen'  .exe_ext(); # base name and ext of ssh-keygen
-$httptlssrvexe   = 'gnutls-serv' .exe_ext(); # base name and ext of gnutls-serv
+$sshdexe         = 'sshd'        .exe_ext('SSH'); # base name and ext of ssh daemon
+$sshexe          = 'ssh'         .exe_ext('SSH'); # base name and ext of ssh client
+$sftpsrvexe      = 'sftp-server' .exe_ext('SSH'); # base name and ext of sftp-server
+$sftpexe         = 'sftp'        .exe_ext('SSH'); # base name and ext of sftp client
+$sshkeygenexe    = 'ssh-keygen'  .exe_ext('SSH'); # base name and ext of ssh-keygen
+$httptlssrvexe   = 'gnutls-serv' .exe_ext('SSH'); # base name and ext of gnutls-serv
 $sshdconfig      = 'curl_sshd_config';       # ssh daemon config file
 $sshconfig       = 'curl_ssh_config';        # ssh client config file
 $sftpconfig      = 'curl_sftp_config';       # sftp client config file
@@ -180,6 +180,13 @@ $clipubkeyf      = 'curl_client_key.pub';    # client public key file
 # Return file extension for executable files on this operating system
 #
 sub exe_ext {
+    my ($component, @arr) = @_;
+    if ($ENV{'CURL_TEST_EXE_EXT'}) {
+        return $ENV{'CURL_TEST_EXE_EXT'};
+    }
+    if ($ENV{'CURL_TEST_EXE_EXT_'.$component}) {
+        return $ENV{'CURL_TEST_EXE_EXT_'.$component};
+    }
     if ($^O eq 'MSWin32' || $^O eq 'cygwin' || $^O eq 'msys' ||
         $^O eq 'dos' || $^O eq 'os2') {
         return '.exe';
@@ -314,7 +321,7 @@ sub find_exe_file {
     my $fn = $_[0];
     shift;
     my @path = @_;
-    my $xext = exe_ext();
+    my $xext = exe_ext('SSH');
     foreach (@path) {
         my $file = File::Spec->catfile($_, $fn);
         if(-e $file && ! -d $file) {
@@ -430,6 +437,16 @@ sub sshversioninfo {
                 $error = undef;
                 last;
             }
+            if($tmpstr =~ /OpenSSH[_-]for[_-]Windows[_-](\d+)\.(\d+)(\.(\d+))*/i) {
+                $major = $1;
+                $minor = $2;
+                $patch = $4?$4:0;
+                $sshid = 'OpenSSH-Windows';
+                $versnum = (100*$major) + (10*$minor) + $patch;
+                $versstr = "$sshid $major.$minor.$patch";
+                $error = undef;
+                last;
+            }
             if($tmpstr =~ /Sun[_-]SSH[_-](\d+)\.(\d+)(\.(\d+))*/i) {
                 $major = $1;
                 $minor = $2;
old mode 100755 (executable)
new mode 100644 (file)
index 9b3d122..197e8b8
@@ -6,7 +6,7 @@
 #                            | (__| |_| |  _ <| |___
 #                             \___|\___/|_| \_\_____|
 #
-# Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 #
 # This software is licensed as described in the file COPYING, which
 # you should have received as part of this distribution. The terms
@@ -21,7 +21,7 @@
 #
 #***************************************************************************
 
-# Starts sshd for use in the SCP, SFTP and SOCKS curl test harness tests.
+# Starts sshd for use in the SCP and SFTP curl test harness tests.
 # Also creates the ssh configuration files needed for these tests.
 
 use strict;
@@ -81,7 +81,6 @@ use pathhelp;
 my $verbose = 0;              # set to 1 for debugging
 my $debugprotocol = 0;        # set to 1 for protocol debugging
 my $port = 8999;              # our default SCP/SFTP server port
-my $socksport = $port + 1;    # our default SOCKS4/5 server port
 my $listenaddr = '127.0.0.1'; # default address on which to listen
 my $ipvnum = 4;               # default IP version of listener address
 my $idnum = 1;                # default ssh daemon instance number
@@ -157,14 +156,6 @@ while(@ARGV) {
             }
         }
     }
-    elsif($ARGV[0] eq '--socksport') {
-        if($ARGV[1]) {
-            if($ARGV[1] =~ /^(\d+)$/) {
-                $socksport = $1;
-                shift @ARGV;
-            }
-        }
-    }
     else {
         print STDERR "\nWarning: sshserver.pl unknown parameter: $ARGV[0]\n";
     }
@@ -181,11 +172,10 @@ if(!$pidfile) {
 
 
 #***************************************************************************
-# ssh, socks and sftp server log file names
+# ssh and sftp server log file names
 #
 $sshdlog = server_logfilename($logdir, 'ssh', $ipvnum, $idnum);
 $sftplog = server_logfilename($logdir, 'sftp', $ipvnum, $idnum);
-$sshlog  = server_logfilename($logdir, 'socks', $ipvnum, $idnum);
 
 
 #***************************************************************************
@@ -226,7 +216,7 @@ my ($sshdid, $sshdvernum, $sshdverstr, $sshderror) = sshversioninfo($sshd);
 if(!$sshdid) {
     # Not an OpenSSH or SunSSH ssh daemon
     logmsg $sshderror if($verbose);
-    logmsg 'SCP, SFTP and SOCKS tests require OpenSSH 2.9.9 or later';
+    logmsg 'SCP and SFTP tests require OpenSSH 2.9.9 or later';
     exit 1;
 }
 logmsg "ssh server found $sshd is $sshdverstr" if($verbose);
@@ -255,7 +245,7 @@ logmsg "ssh server found $sshd is $sshdverstr" if($verbose);
 #
 if((($sshdid =~ /OpenSSH/) && ($sshdvernum < 299)) ||
    (($sshdid =~ /SunSSH/)  && ($sshdvernum < 100))) {
-    logmsg 'SCP, SFTP and SOCKS tests require OpenSSH 2.9.9 or later';
+    logmsg 'SCP and SFTP tests require OpenSSH 2.9.9 or later';
     exit 1;
 }
 
@@ -310,7 +300,7 @@ my ($sshid, $sshvernum, $sshverstr, $ssherror) = sshversioninfo($ssh);
 if(!$sshid) {
     # Not an OpenSSH or SunSSH ssh client
     logmsg $ssherror if($verbose);
-    logmsg 'SCP, SFTP and SOCKS tests require OpenSSH 2.9.9 or later';
+    logmsg 'SCP and SFTP tests require OpenSSH 2.9.9 or later';
     exit 1;
 }
 logmsg "ssh client found $ssh is $sshverstr" if($verbose);
@@ -341,7 +331,7 @@ logmsg "ssh client found $ssh is $sshverstr" if($verbose);
 #
 if((($sshid =~ /OpenSSH/) && ($sshvernum < 299)) ||
    (($sshid =~ /SunSSH/)  && ($sshvernum < 100))) {
-    logmsg 'SCP, SFTP and SOCKS tests require OpenSSH 2.9.9 or later';
+    logmsg 'SCP and SFTP tests require OpenSSH 2.9.9 or later';
     exit 1;
 }
 
@@ -381,6 +371,9 @@ if((! -e $hstprvkeyf) || (! -s $hstprvkeyf) ||
         logmsg 'Could not generate client key';
         exit 1;
     }
+    # Make sure that permissions are restricted so openssh doesn't complain
+    system "chmod 600 $hstprvkeyf";
+    system "chmod 600 $cliprvkeyf";
 }
 
 
@@ -399,6 +392,17 @@ if ($^O eq 'MSWin32' || $^O eq 'cygwin' || $^O eq 'msys') {
     $pidfile_config = pathhelp::build_sys_abs_path($pidfile_config);
     $sftpsrv_config = "internal-sftp";
 }
+if ($sshdid =~ /OpenSSH-Windows/) {
+    # Ensure to use native Windows paths with OpenSSH for Windows
+    $clipubkeyf_config = pathhelp::sys_native_abs_path($clipubkeyf);
+    $hstprvkeyf_config = pathhelp::sys_native_abs_path($hstprvkeyf);
+    $pidfile_config = pathhelp::sys_native_abs_path($pidfile);
+    $sftpsrv_config = pathhelp::sys_native_abs_path($sftpsrv);
+
+    $sshdconfig = pathhelp::sys_native_abs_path($sshdconfig);
+    $sshconfig = pathhelp::sys_native_abs_path($sshconfig);
+    $sftpconfig = pathhelp::sys_native_abs_path($sftpconfig);
+}
 
 #***************************************************************************
 #  ssh daemon configuration file options we might use and version support
@@ -493,8 +497,18 @@ logmsg 'generating ssh server config file...' if($verbose);
 push @cfgarr, '# This is a generated file.  Do not edit.';
 push @cfgarr, "# $sshdverstr sshd configuration file for curl testing";
 push @cfgarr, '#';
-push @cfgarr, "DenyUsers !$username";
-push @cfgarr, "AllowUsers $username";
+
+# AllowUsers and DenyUsers options should use lowercase on Windows
+# and do not support quotes around values for some unknown reason.
+if ($sshdid =~ /OpenSSH-Windows/) {
+    my $username_lc = lc $username;
+    push @cfgarr, "DenyUsers !$username_lc";
+    push @cfgarr, "AllowUsers $username_lc";
+} else {
+    push @cfgarr, "DenyUsers !$username";
+    push @cfgarr, "AllowUsers $username";
+}
+
 push @cfgarr, 'DenyGroups';
 push @cfgarr, 'AllowGroups';
 push @cfgarr, '#';
@@ -768,7 +782,11 @@ if ($^O eq 'MSWin32' || $^O eq 'cygwin' || $^O eq 'msys') {
     $identity_config = pathhelp::build_sys_abs_path($identity_config);
     $knownhosts_config = pathhelp::build_sys_abs_path($knownhosts_config);
 }
-
+if ($sshdid =~ /OpenSSH-Windows/) {
+    # Ensure to use native Windows paths with OpenSSH for Windows
+    $identity_config = pathhelp::sys_native_abs_path($identity);
+    $knownhosts_config = pathhelp::sys_native_abs_path($knownhosts);
+}
 
 #***************************************************************************
 #  ssh client configuration file options we might use and version support
@@ -863,8 +881,12 @@ push @cfgarr, "HostName $listenaddr";
 push @cfgarr, "User $username";
 push @cfgarr, 'Protocol 2';
 push @cfgarr, '#';
-push @cfgarr, "BindAddress $listenaddr";
-push @cfgarr, "DynamicForward $socksport";
+
+# BindAddress option is not supported by OpenSSH for Windows
+if (!($sshdid =~ /OpenSSH-Windows/)) {
+    push @cfgarr, "BindAddress $listenaddr";
+}
+
 push @cfgarr, '#';
 push @cfgarr, "IdentityFile $identity_config";
 push @cfgarr, "UserKnownHostsFile $knownhosts_config";
@@ -886,8 +908,12 @@ push @cfgarr, 'NumberOfPasswordPrompts 0';
 push @cfgarr, 'PasswordAuthentication no';
 push @cfgarr, 'PreferredAuthentications publickey';
 push @cfgarr, 'PubkeyAuthentication yes';
-push @cfgarr, 'RhostsRSAAuthentication no';
-push @cfgarr, 'RSAAuthentication no';
+
+# RSA authentication options are not supported by OpenSSH for Windows
+if (!($sshdid =~ /OpenSSH-Windows/)) {
+    push @cfgarr, 'RhostsRSAAuthentication no';
+    push @cfgarr, 'RSAAuthentication no';
+}
 
 # Disabled StrictHostKeyChecking since it makes the tests fail on my
 # OpenSSH_6.0p1 on Debian Linux / Daniel
index 5d570d8..1379299 100755 (executable)
@@ -6,7 +6,7 @@
 #                            | (__| |_| |  _ <| |___
 #                             \___|\___/|_| \_\_____|
 #
-# Copyright (C) 2010-2011, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 2010-2018, Daniel Stenberg, <daniel@haxx.se>, et al.
 #
 # This software is licensed as described in the file COPYING, which
 # you should have received as part of this distribution. The terms
@@ -53,6 +53,7 @@ my $i = ($ARGV[1]) ? "-I$ARGV[1] " : '';
 
 my $h = "$root/include/curl/curl.h";
 my $mh = "$root/include/curl/multi.h";
+my $ua = "$root/include/curl/urlapi.h";
 
 my $verbose=0;
 my $summary=0;
@@ -87,6 +88,7 @@ sub scanheader {
 
 scanheader($h);
 scanheader($mh);
+scanheader($ua);
 
 open S, "<$root/docs/libcurl/symbols-in-versions";
 while(<S>) {
@@ -117,11 +119,13 @@ for my $e (sort @syms) {
     # CURL_EXTERN - is a define used for libcurl functions that are external,
     # public. No app or other code should ever use it.
     #
+    # CURLINC_ - defines for header dual-include prevention, ignore those.
+    #
     # *_LAST and *_LASTENTRY are just prefix for the placeholders used for the
     # last entry in many enum series.
     #
 
-    if($e =~ /(OBSOLETE|^CURL_EXTERN|_LAST\z|_LASTENTRY\z)/) {
+    if($e =~ /(OBSOLETE|^CURL_EXTERN|^CURLINC_|_LAST\z|_LASTENTRY\z)/) {
         $ignored++;
         next;
     }
index 68aeb78..7370ffc 100644 (file)
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH testcurl.pl 1 "October 22, 2016" "Curl 7.62.0" "testcurl"
+.TH testcurl.pl 1 "October 22, 2016" "Curl 7.68.0" "testcurl"
 
 .SH NAME
 testcurl.pl \- (automatically) test curl
index 4b0cec4..bc06992 100644 (file)
@@ -22,6 +22,7 @@ set(UT_SRC
 # Broken link on Linux
 #  unit1604.c
   unit1620.c
+  unit1655.c
   )
 
 set(UT_COMMON_FILES ../libtest/first.c ../libtest/test.h curlcheck.h)
index fab82d2..4bcd47d 100644 (file)
@@ -5,7 +5,7 @@
 #                            | (__| |_| |  _ <| |___
 #                             \___|\___/|_| \_\_____|
 #
-# Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 #
 # This software is licensed as described in the file COPYING, which
 # you should have received as part of this distribution. The terms
@@ -64,8 +64,13 @@ AM_CPPFLAGS += -DCURL_STATICLIB -DUNITTESTS
 # Makefile.inc provides neat definitions
 include Makefile.inc
 
+CHECKSRC = $(CS_$(V))
+CS_0 = @echo "  RUN     " $@;
+CS_1 =
+CS_ = $(CS_0)
+
 checksrc:
-       @PERL@ $(top_srcdir)/lib/checksrc.pl $(srcdir)/*.c
+       $(CHECKSRC)@PERL@ $(top_srcdir)/lib/checksrc.pl $(srcdir)/*.[ch]
 
 if BUILD_UNITTESTS
 noinst_PROGRAMS = $(UNITPROGS)
index 0841351..b173150 100644 (file)
@@ -93,8 +93,7 @@ host_triplet = @host@
 @BUILD_UNITTESTS_TRUE@noinst_PROGRAMS = $(am__EXEEXT_1)
 subdir = tests/unit
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/ax_code_coverage.m4 \
-       $(top_srcdir)/m4/ax_compile_check_sizeof.m4 \
+am__aclocal_m4_deps = $(top_srcdir)/m4/ax_compile_check_sizeof.m4 \
        $(top_srcdir)/m4/curl-compilers.m4 \
        $(top_srcdir)/m4/curl-confopts.m4 \
        $(top_srcdir)/m4/curl-functions.m4 \
@@ -128,7 +127,9 @@ am__EXEEXT_1 = unit1300$(EXEEXT) unit1301$(EXEEXT) unit1302$(EXEEXT) \
        unit1601$(EXEEXT) unit1602$(EXEEXT) unit1603$(EXEEXT) \
        unit1604$(EXEEXT) unit1605$(EXEEXT) unit1606$(EXEEXT) \
        unit1607$(EXEEXT) unit1608$(EXEEXT) unit1609$(EXEEXT) \
-       unit1620$(EXEEXT) unit1650$(EXEEXT) unit1651$(EXEEXT)
+       unit1620$(EXEEXT) unit1621$(EXEEXT) unit1650$(EXEEXT) \
+       unit1651$(EXEEXT) unit1652$(EXEEXT) unit1653$(EXEEXT) \
+       unit1654$(EXEEXT) unit1655$(EXEEXT)
 PROGRAMS = $(noinst_PROGRAMS)
 am__dirstamp = $(am__leading_dot)dirstamp
 am__objects_1 = ../libtest/unit1300-first.$(OBJEXT)
@@ -304,18 +305,47 @@ unit1620_OBJECTS = $(am_unit1620_OBJECTS)
 unit1620_LDADD = $(LDADD)
 unit1620_DEPENDENCIES = $(top_builddir)/src/libcurltool.la \
        $(top_builddir)/lib/libcurlu.la
-am__objects_29 = ../libtest/unit1650-first.$(OBJEXT)
-am_unit1650_OBJECTS = unit1650-unit1650.$(OBJEXT) $(am__objects_29)
+am__objects_29 = ../libtest/unit1621-first.$(OBJEXT)
+am_unit1621_OBJECTS = unit1621-unit1621.$(OBJEXT) $(am__objects_29)
+unit1621_OBJECTS = $(am_unit1621_OBJECTS)
+unit1621_DEPENDENCIES = $(top_builddir)/src/libcurltool.la \
+       $(top_builddir)/lib/libcurl.la
+am__objects_30 = ../libtest/unit1650-first.$(OBJEXT)
+am_unit1650_OBJECTS = unit1650-unit1650.$(OBJEXT) $(am__objects_30)
 unit1650_OBJECTS = $(am_unit1650_OBJECTS)
 unit1650_LDADD = $(LDADD)
 unit1650_DEPENDENCIES = $(top_builddir)/src/libcurltool.la \
        $(top_builddir)/lib/libcurlu.la
-am__objects_30 = ../libtest/unit1651-first.$(OBJEXT)
-am_unit1651_OBJECTS = unit1651-unit1651.$(OBJEXT) $(am__objects_30)
+am__objects_31 = ../libtest/unit1651-first.$(OBJEXT)
+am_unit1651_OBJECTS = unit1651-unit1651.$(OBJEXT) $(am__objects_31)
 unit1651_OBJECTS = $(am_unit1651_OBJECTS)
 unit1651_LDADD = $(LDADD)
 unit1651_DEPENDENCIES = $(top_builddir)/src/libcurltool.la \
        $(top_builddir)/lib/libcurlu.la
+am__objects_32 = ../libtest/unit1652-first.$(OBJEXT)
+am_unit1652_OBJECTS = unit1652-unit1652.$(OBJEXT) $(am__objects_32)
+unit1652_OBJECTS = $(am_unit1652_OBJECTS)
+unit1652_LDADD = $(LDADD)
+unit1652_DEPENDENCIES = $(top_builddir)/src/libcurltool.la \
+       $(top_builddir)/lib/libcurlu.la
+am__objects_33 = ../libtest/unit1653-first.$(OBJEXT)
+am_unit1653_OBJECTS = unit1653-unit1653.$(OBJEXT) $(am__objects_33)
+unit1653_OBJECTS = $(am_unit1653_OBJECTS)
+unit1653_LDADD = $(LDADD)
+unit1653_DEPENDENCIES = $(top_builddir)/src/libcurltool.la \
+       $(top_builddir)/lib/libcurlu.la
+am__objects_34 = ../libtest/unit1654-first.$(OBJEXT)
+am_unit1654_OBJECTS = unit1654-unit1654.$(OBJEXT) $(am__objects_34)
+unit1654_OBJECTS = $(am_unit1654_OBJECTS)
+unit1654_LDADD = $(LDADD)
+unit1654_DEPENDENCIES = $(top_builddir)/src/libcurltool.la \
+       $(top_builddir)/lib/libcurlu.la
+am__objects_35 = ../libtest/unit1655-first.$(OBJEXT)
+am_unit1655_OBJECTS = unit1655-unit1655.$(OBJEXT) $(am__objects_35)
+unit1655_OBJECTS = $(am_unit1655_OBJECTS)
+unit1655_LDADD = $(LDADD)
+unit1655_DEPENDENCIES = $(top_builddir)/src/libcurltool.la \
+       $(top_builddir)/lib/libcurlu.la
 AM_V_P = $(am__v_P_@AM_V@)
 am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
 am__v_P_0 = false
@@ -359,8 +389,13 @@ am__depfiles_remade = ../libtest/$(DEPDIR)/unit1300-first.Po \
        ../libtest/$(DEPDIR)/unit1608-first.Po \
        ../libtest/$(DEPDIR)/unit1609-first.Po \
        ../libtest/$(DEPDIR)/unit1620-first.Po \
+       ../libtest/$(DEPDIR)/unit1621-first.Po \
        ../libtest/$(DEPDIR)/unit1650-first.Po \
        ../libtest/$(DEPDIR)/unit1651-first.Po \
+       ../libtest/$(DEPDIR)/unit1652-first.Po \
+       ../libtest/$(DEPDIR)/unit1653-first.Po \
+       ../libtest/$(DEPDIR)/unit1654-first.Po \
+       ../libtest/$(DEPDIR)/unit1655-first.Po \
        ./$(DEPDIR)/unit1300-unit1300.Po \
        ./$(DEPDIR)/unit1301-unit1301.Po \
        ./$(DEPDIR)/unit1302-unit1302.Po \
@@ -389,8 +424,13 @@ am__depfiles_remade = ../libtest/$(DEPDIR)/unit1300-first.Po \
        ./$(DEPDIR)/unit1608-unit1608.Po \
        ./$(DEPDIR)/unit1609-unit1609.Po \
        ./$(DEPDIR)/unit1620-unit1620.Po \
+       ./$(DEPDIR)/unit1621-unit1621.Po \
        ./$(DEPDIR)/unit1650-unit1650.Po \
-       ./$(DEPDIR)/unit1651-unit1651.Po
+       ./$(DEPDIR)/unit1651-unit1651.Po \
+       ./$(DEPDIR)/unit1652-unit1652.Po \
+       ./$(DEPDIR)/unit1653-unit1653.Po \
+       ./$(DEPDIR)/unit1654-unit1654.Po \
+       ./$(DEPDIR)/unit1655-unit1655.Po
 am__mv = mv -f
 COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
        $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
@@ -419,7 +459,9 @@ SOURCES = $(unit1300_SOURCES) $(unit1301_SOURCES) $(unit1302_SOURCES) \
        $(unit1601_SOURCES) $(unit1602_SOURCES) $(unit1603_SOURCES) \
        $(unit1604_SOURCES) $(unit1605_SOURCES) $(unit1606_SOURCES) \
        $(unit1607_SOURCES) $(unit1608_SOURCES) $(unit1609_SOURCES) \
-       $(unit1620_SOURCES) $(unit1650_SOURCES) $(unit1651_SOURCES)
+       $(unit1620_SOURCES) $(unit1621_SOURCES) $(unit1650_SOURCES) \
+       $(unit1651_SOURCES) $(unit1652_SOURCES) $(unit1653_SOURCES) \
+       $(unit1654_SOURCES) $(unit1655_SOURCES)
 DIST_SOURCES = $(unit1300_SOURCES) $(unit1301_SOURCES) \
        $(unit1302_SOURCES) $(unit1303_SOURCES) $(unit1304_SOURCES) \
        $(unit1305_SOURCES) $(unit1307_SOURCES) $(unit1308_SOURCES) \
@@ -429,8 +471,9 @@ DIST_SOURCES = $(unit1300_SOURCES) $(unit1301_SOURCES) \
        $(unit1600_SOURCES) $(unit1601_SOURCES) $(unit1602_SOURCES) \
        $(unit1603_SOURCES) $(unit1604_SOURCES) $(unit1605_SOURCES) \
        $(unit1606_SOURCES) $(unit1607_SOURCES) $(unit1608_SOURCES) \
-       $(unit1609_SOURCES) $(unit1620_SOURCES) $(unit1650_SOURCES) \
-       $(unit1651_SOURCES)
+       $(unit1609_SOURCES) $(unit1620_SOURCES) $(unit1621_SOURCES) \
+       $(unit1650_SOURCES) $(unit1651_SOURCES) $(unit1652_SOURCES) \
+       $(unit1653_SOURCES) $(unit1654_SOURCES) $(unit1655_SOURCES)
 am__can_run_installinfo = \
   case $$AM_UPDATE_INFO_DIR in \
     n|no|NO) false;; \
@@ -473,12 +516,6 @@ CC = @CC@
 CCDEPMODE = @CCDEPMODE@
 CFLAGS = @CFLAGS@ @CURL_CFLAG_EXTRAS@
 CFLAG_CURL_SYMBOL_HIDING = @CFLAG_CURL_SYMBOL_HIDING@
-CODE_COVERAGE_CFLAGS = @CODE_COVERAGE_CFLAGS@
-CODE_COVERAGE_CPPFLAGS = @CODE_COVERAGE_CPPFLAGS@
-CODE_COVERAGE_CXXFLAGS = @CODE_COVERAGE_CXXFLAGS@
-CODE_COVERAGE_ENABLED = @CODE_COVERAGE_ENABLED@
-CODE_COVERAGE_LDFLAGS = @CODE_COVERAGE_LDFLAGS@
-CODE_COVERAGE_LIBS = @CODE_COVERAGE_LIBS@
 CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
@@ -520,14 +557,15 @@ ENABLE_SHARED = @ENABLE_SHARED@
 ENABLE_STATIC = @ENABLE_STATIC@
 EXEEXT = @EXEEXT@
 FGREP = @FGREP@
+FISH_FUNCTIONS_DIR = @FISH_FUNCTIONS_DIR@
 GCOV = @GCOV@
-GENHTML = @GENHTML@
 GREP = @GREP@
 HAVE_BROTLI = @HAVE_BROTLI@
 HAVE_GNUTLS_SRP = @HAVE_GNUTLS_SRP@
 HAVE_LDAP_SSL = @HAVE_LDAP_SSL@
 HAVE_LIBZ = @HAVE_LIBZ@
 HAVE_OPENSSL_SRP = @HAVE_OPENSSL_SRP@
+HAVE_PROTO_BSDSOCKET_H = @HAVE_PROTO_BSDSOCKET_H@
 IDN_ENABLED = @IDN_ENABLED@
 INSTALL = @INSTALL@
 INSTALL_DATA = @INSTALL_DATA@
@@ -590,9 +628,7 @@ STRIP = @STRIP@
 SUPPORT_FEATURES = @SUPPORT_FEATURES@
 SUPPORT_PROTOCOLS = @SUPPORT_PROTOCOLS@
 USE_ARES = @USE_ARES@
-USE_AXTLS = @USE_AXTLS@
-USE_CYASSL = @USE_CYASSL@
-USE_DARWINSSL = @USE_DARWINSSL@
+USE_BEARSSL = @USE_BEARSSL@
 USE_GNUTLS = @USE_GNUTLS@
 USE_GNUTLS_NETTLE = @USE_GNUTLS_NETTLE@
 USE_LIBRTMP = @USE_LIBRTMP@
@@ -601,12 +637,17 @@ USE_LIBSSH2 = @USE_LIBSSH2@
 USE_MBEDTLS = @USE_MBEDTLS@
 USE_MESALINK = @USE_MESALINK@
 USE_NGHTTP2 = @USE_NGHTTP2@
+USE_NGHTTP3 = @USE_NGHTTP3@
+USE_NGTCP2 = @USE_NGTCP2@
+USE_NGTCP2_CRYPTO_OPENSSL = @USE_NGTCP2_CRYPTO_OPENSSL@
 USE_NSS = @USE_NSS@
 USE_OPENLDAP = @USE_OPENLDAP@
-USE_POLARSSL = @USE_POLARSSL@
+USE_QUICHE = @USE_QUICHE@
 USE_SCHANNEL = @USE_SCHANNEL@
+USE_SECTRANSP = @USE_SECTRANSP@
 USE_UNIX_SOCKETS = @USE_UNIX_SOCKETS@
 USE_WINDOWS_SSPI = @USE_WINDOWS_SSPI@
+USE_WOLFSSL = @USE_WOLFSSL@
 VERSION = @VERSION@
 VERSIONNUM = @VERSIONNUM@
 ZLIB_LIBS = @ZLIB_LIBS@
@@ -674,7 +715,7 @@ top_srcdir = @top_srcdir@
 #                            | (__| |_| |  _ <| |___
 #                             \___|\___/|_| \_\_____|
 #
-# Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 #
 # This software is licensed as described in the file COPYING, which
 # you should have received as part of this distribution. The terms
@@ -730,8 +771,8 @@ UNITPROGS = unit1300 unit1301 unit1302 unit1303 unit1304 unit1305 unit1307 \
  unit1330 unit1394 unit1395 unit1396 unit1397 unit1398 \
  unit1399 \
  unit1600 unit1601 unit1602 unit1603 unit1604 unit1605 unit1606 unit1607 \
- unit1608 unit1609 unit1620 \
- unit1650 unit1651
+ unit1608 unit1609 unit1620 unit1621 \
+ unit1650 unit1651 unit1652 unit1653 unit1654 unit1655
 
 unit1300_SOURCES = unit1300.c $(UNITFILES)
 unit1300_CPPFLAGS = $(AM_CPPFLAGS)
@@ -792,10 +833,27 @@ unit1609_SOURCES = unit1609.c $(UNITFILES)
 unit1609_CPPFLAGS = $(AM_CPPFLAGS)
 unit1620_SOURCES = unit1620.c $(UNITFILES)
 unit1620_CPPFLAGS = $(AM_CPPFLAGS)
+unit1621_SOURCES = unit1621.c $(UNITFILES)
+unit1621_CPPFLAGS = $(AM_CPPFLAGS)
+unit1621_LDADD = $(top_builddir)/src/libcurltool.la $(top_builddir)/lib/libcurl.la
 unit1650_SOURCES = unit1650.c $(UNITFILES)
 unit1650_CPPFLAGS = $(AM_CPPFLAGS)
 unit1651_SOURCES = unit1651.c $(UNITFILES)
 unit1651_CPPFLAGS = $(AM_CPPFLAGS)
+unit1652_SOURCES = unit1652.c $(UNITFILES)
+unit1652_CPPFLAGS = $(AM_CPPFLAGS)
+unit1653_SOURCES = unit1653.c $(UNITFILES)
+unit1653_CPPFLAGS = $(AM_CPPFLAGS)
+unit1654_SOURCES = unit1654.c $(UNITFILES)
+unit1654_CPPFLAGS = $(AM_CPPFLAGS)
+unit1655_SOURCES = unit1655.c $(UNITFILES)
+unit1655_CPPFLAGS = $(AM_CPPFLAGS)
+
+# Makefile.inc provides neat definitions
+CHECKSRC = $(CS_$(V))
+CS_0 = @echo "  RUN     " $@;
+CS_1 = 
+CS_ = $(CS_0)
 all: all-am
 
 .SUFFIXES:
@@ -1013,6 +1071,12 @@ unit1609$(EXEEXT): $(unit1609_OBJECTS) $(unit1609_DEPENDENCIES) $(EXTRA_unit1609
 unit1620$(EXEEXT): $(unit1620_OBJECTS) $(unit1620_DEPENDENCIES) $(EXTRA_unit1620_DEPENDENCIES) 
        @rm -f unit1620$(EXEEXT)
        $(AM_V_CCLD)$(LINK) $(unit1620_OBJECTS) $(unit1620_LDADD) $(LIBS)
+../libtest/unit1621-first.$(OBJEXT): ../libtest/$(am__dirstamp) \
+       ../libtest/$(DEPDIR)/$(am__dirstamp)
+
+unit1621$(EXEEXT): $(unit1621_OBJECTS) $(unit1621_DEPENDENCIES) $(EXTRA_unit1621_DEPENDENCIES) 
+       @rm -f unit1621$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(unit1621_OBJECTS) $(unit1621_LDADD) $(LIBS)
 ../libtest/unit1650-first.$(OBJEXT): ../libtest/$(am__dirstamp) \
        ../libtest/$(DEPDIR)/$(am__dirstamp)
 
@@ -1025,6 +1089,30 @@ unit1650$(EXEEXT): $(unit1650_OBJECTS) $(unit1650_DEPENDENCIES) $(EXTRA_unit1650
 unit1651$(EXEEXT): $(unit1651_OBJECTS) $(unit1651_DEPENDENCIES) $(EXTRA_unit1651_DEPENDENCIES) 
        @rm -f unit1651$(EXEEXT)
        $(AM_V_CCLD)$(LINK) $(unit1651_OBJECTS) $(unit1651_LDADD) $(LIBS)
+../libtest/unit1652-first.$(OBJEXT): ../libtest/$(am__dirstamp) \
+       ../libtest/$(DEPDIR)/$(am__dirstamp)
+
+unit1652$(EXEEXT): $(unit1652_OBJECTS) $(unit1652_DEPENDENCIES) $(EXTRA_unit1652_DEPENDENCIES) 
+       @rm -f unit1652$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(unit1652_OBJECTS) $(unit1652_LDADD) $(LIBS)
+../libtest/unit1653-first.$(OBJEXT): ../libtest/$(am__dirstamp) \
+       ../libtest/$(DEPDIR)/$(am__dirstamp)
+
+unit1653$(EXEEXT): $(unit1653_OBJECTS) $(unit1653_DEPENDENCIES) $(EXTRA_unit1653_DEPENDENCIES) 
+       @rm -f unit1653$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(unit1653_OBJECTS) $(unit1653_LDADD) $(LIBS)
+../libtest/unit1654-first.$(OBJEXT): ../libtest/$(am__dirstamp) \
+       ../libtest/$(DEPDIR)/$(am__dirstamp)
+
+unit1654$(EXEEXT): $(unit1654_OBJECTS) $(unit1654_DEPENDENCIES) $(EXTRA_unit1654_DEPENDENCIES) 
+       @rm -f unit1654$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(unit1654_OBJECTS) $(unit1654_LDADD) $(LIBS)
+../libtest/unit1655-first.$(OBJEXT): ../libtest/$(am__dirstamp) \
+       ../libtest/$(DEPDIR)/$(am__dirstamp)
+
+unit1655$(EXEEXT): $(unit1655_OBJECTS) $(unit1655_DEPENDENCIES) $(EXTRA_unit1655_DEPENDENCIES) 
+       @rm -f unit1655$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(unit1655_OBJECTS) $(unit1655_LDADD) $(LIBS)
 
 mostlyclean-compile:
        -rm -f *.$(OBJEXT)
@@ -1061,8 +1149,13 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@../libtest/$(DEPDIR)/unit1608-first.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@../libtest/$(DEPDIR)/unit1609-first.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@../libtest/$(DEPDIR)/unit1620-first.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@../libtest/$(DEPDIR)/unit1621-first.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@../libtest/$(DEPDIR)/unit1650-first.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@../libtest/$(DEPDIR)/unit1651-first.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@../libtest/$(DEPDIR)/unit1652-first.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@../libtest/$(DEPDIR)/unit1653-first.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@../libtest/$(DEPDIR)/unit1654-first.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@../libtest/$(DEPDIR)/unit1655-first.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/unit1300-unit1300.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/unit1301-unit1301.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/unit1302-unit1302.Po@am__quote@ # am--include-marker
@@ -1091,8 +1184,13 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/unit1608-unit1608.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/unit1609-unit1609.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/unit1620-unit1620.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/unit1621-unit1621.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/unit1650-unit1650.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/unit1651-unit1651.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/unit1652-unit1652.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/unit1653-unit1653.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/unit1654-unit1654.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/unit1655-unit1655.Po@am__quote@ # am--include-marker
 
 $(am__depfiles_remade):
        @$(MKDIR_P) $(@D)
@@ -1908,6 +2006,34 @@ unit1620-unit1620.obj: unit1620.c
 @AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1620_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../libtest/unit1620-first.obj `if test -f '../libtest/first.c'; then $(CYGPATH_W) '../libtest/first.c'; else $(CYGPATH_W) '$(srcdir)/../libtest/first.c'; fi`
 
+unit1621-unit1621.o: unit1621.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1621_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT unit1621-unit1621.o -MD -MP -MF $(DEPDIR)/unit1621-unit1621.Tpo -c -o unit1621-unit1621.o `test -f 'unit1621.c' || echo '$(srcdir)/'`unit1621.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/unit1621-unit1621.Tpo $(DEPDIR)/unit1621-unit1621.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='unit1621.c' object='unit1621-unit1621.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1621_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o unit1621-unit1621.o `test -f 'unit1621.c' || echo '$(srcdir)/'`unit1621.c
+
+unit1621-unit1621.obj: unit1621.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1621_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT unit1621-unit1621.obj -MD -MP -MF $(DEPDIR)/unit1621-unit1621.Tpo -c -o unit1621-unit1621.obj `if test -f 'unit1621.c'; then $(CYGPATH_W) 'unit1621.c'; else $(CYGPATH_W) '$(srcdir)/unit1621.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/unit1621-unit1621.Tpo $(DEPDIR)/unit1621-unit1621.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='unit1621.c' object='unit1621-unit1621.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1621_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o unit1621-unit1621.obj `if test -f 'unit1621.c'; then $(CYGPATH_W) 'unit1621.c'; else $(CYGPATH_W) '$(srcdir)/unit1621.c'; fi`
+
+../libtest/unit1621-first.o: ../libtest/first.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1621_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../libtest/unit1621-first.o -MD -MP -MF ../libtest/$(DEPDIR)/unit1621-first.Tpo -c -o ../libtest/unit1621-first.o `test -f '../libtest/first.c' || echo '$(srcdir)/'`../libtest/first.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) ../libtest/$(DEPDIR)/unit1621-first.Tpo ../libtest/$(DEPDIR)/unit1621-first.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='../libtest/first.c' object='../libtest/unit1621-first.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1621_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../libtest/unit1621-first.o `test -f '../libtest/first.c' || echo '$(srcdir)/'`../libtest/first.c
+
+../libtest/unit1621-first.obj: ../libtest/first.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1621_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../libtest/unit1621-first.obj -MD -MP -MF ../libtest/$(DEPDIR)/unit1621-first.Tpo -c -o ../libtest/unit1621-first.obj `if test -f '../libtest/first.c'; then $(CYGPATH_W) '../libtest/first.c'; else $(CYGPATH_W) '$(srcdir)/../libtest/first.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) ../libtest/$(DEPDIR)/unit1621-first.Tpo ../libtest/$(DEPDIR)/unit1621-first.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='../libtest/first.c' object='../libtest/unit1621-first.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1621_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../libtest/unit1621-first.obj `if test -f '../libtest/first.c'; then $(CYGPATH_W) '../libtest/first.c'; else $(CYGPATH_W) '$(srcdir)/../libtest/first.c'; fi`
+
 unit1650-unit1650.o: unit1650.c
 @am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1650_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT unit1650-unit1650.o -MD -MP -MF $(DEPDIR)/unit1650-unit1650.Tpo -c -o unit1650-unit1650.o `test -f 'unit1650.c' || echo '$(srcdir)/'`unit1650.c
 @am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/unit1650-unit1650.Tpo $(DEPDIR)/unit1650-unit1650.Po
@@ -1964,6 +2090,118 @@ unit1651-unit1651.obj: unit1651.c
 @AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1651_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../libtest/unit1651-first.obj `if test -f '../libtest/first.c'; then $(CYGPATH_W) '../libtest/first.c'; else $(CYGPATH_W) '$(srcdir)/../libtest/first.c'; fi`
 
+unit1652-unit1652.o: unit1652.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1652_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT unit1652-unit1652.o -MD -MP -MF $(DEPDIR)/unit1652-unit1652.Tpo -c -o unit1652-unit1652.o `test -f 'unit1652.c' || echo '$(srcdir)/'`unit1652.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/unit1652-unit1652.Tpo $(DEPDIR)/unit1652-unit1652.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='unit1652.c' object='unit1652-unit1652.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1652_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o unit1652-unit1652.o `test -f 'unit1652.c' || echo '$(srcdir)/'`unit1652.c
+
+unit1652-unit1652.obj: unit1652.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1652_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT unit1652-unit1652.obj -MD -MP -MF $(DEPDIR)/unit1652-unit1652.Tpo -c -o unit1652-unit1652.obj `if test -f 'unit1652.c'; then $(CYGPATH_W) 'unit1652.c'; else $(CYGPATH_W) '$(srcdir)/unit1652.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/unit1652-unit1652.Tpo $(DEPDIR)/unit1652-unit1652.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='unit1652.c' object='unit1652-unit1652.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1652_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o unit1652-unit1652.obj `if test -f 'unit1652.c'; then $(CYGPATH_W) 'unit1652.c'; else $(CYGPATH_W) '$(srcdir)/unit1652.c'; fi`
+
+../libtest/unit1652-first.o: ../libtest/first.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1652_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../libtest/unit1652-first.o -MD -MP -MF ../libtest/$(DEPDIR)/unit1652-first.Tpo -c -o ../libtest/unit1652-first.o `test -f '../libtest/first.c' || echo '$(srcdir)/'`../libtest/first.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) ../libtest/$(DEPDIR)/unit1652-first.Tpo ../libtest/$(DEPDIR)/unit1652-first.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='../libtest/first.c' object='../libtest/unit1652-first.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1652_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../libtest/unit1652-first.o `test -f '../libtest/first.c' || echo '$(srcdir)/'`../libtest/first.c
+
+../libtest/unit1652-first.obj: ../libtest/first.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1652_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../libtest/unit1652-first.obj -MD -MP -MF ../libtest/$(DEPDIR)/unit1652-first.Tpo -c -o ../libtest/unit1652-first.obj `if test -f '../libtest/first.c'; then $(CYGPATH_W) '../libtest/first.c'; else $(CYGPATH_W) '$(srcdir)/../libtest/first.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) ../libtest/$(DEPDIR)/unit1652-first.Tpo ../libtest/$(DEPDIR)/unit1652-first.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='../libtest/first.c' object='../libtest/unit1652-first.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1652_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../libtest/unit1652-first.obj `if test -f '../libtest/first.c'; then $(CYGPATH_W) '../libtest/first.c'; else $(CYGPATH_W) '$(srcdir)/../libtest/first.c'; fi`
+
+unit1653-unit1653.o: unit1653.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1653_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT unit1653-unit1653.o -MD -MP -MF $(DEPDIR)/unit1653-unit1653.Tpo -c -o unit1653-unit1653.o `test -f 'unit1653.c' || echo '$(srcdir)/'`unit1653.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/unit1653-unit1653.Tpo $(DEPDIR)/unit1653-unit1653.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='unit1653.c' object='unit1653-unit1653.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1653_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o unit1653-unit1653.o `test -f 'unit1653.c' || echo '$(srcdir)/'`unit1653.c
+
+unit1653-unit1653.obj: unit1653.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1653_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT unit1653-unit1653.obj -MD -MP -MF $(DEPDIR)/unit1653-unit1653.Tpo -c -o unit1653-unit1653.obj `if test -f 'unit1653.c'; then $(CYGPATH_W) 'unit1653.c'; else $(CYGPATH_W) '$(srcdir)/unit1653.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/unit1653-unit1653.Tpo $(DEPDIR)/unit1653-unit1653.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='unit1653.c' object='unit1653-unit1653.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1653_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o unit1653-unit1653.obj `if test -f 'unit1653.c'; then $(CYGPATH_W) 'unit1653.c'; else $(CYGPATH_W) '$(srcdir)/unit1653.c'; fi`
+
+../libtest/unit1653-first.o: ../libtest/first.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1653_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../libtest/unit1653-first.o -MD -MP -MF ../libtest/$(DEPDIR)/unit1653-first.Tpo -c -o ../libtest/unit1653-first.o `test -f '../libtest/first.c' || echo '$(srcdir)/'`../libtest/first.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) ../libtest/$(DEPDIR)/unit1653-first.Tpo ../libtest/$(DEPDIR)/unit1653-first.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='../libtest/first.c' object='../libtest/unit1653-first.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1653_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../libtest/unit1653-first.o `test -f '../libtest/first.c' || echo '$(srcdir)/'`../libtest/first.c
+
+../libtest/unit1653-first.obj: ../libtest/first.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1653_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../libtest/unit1653-first.obj -MD -MP -MF ../libtest/$(DEPDIR)/unit1653-first.Tpo -c -o ../libtest/unit1653-first.obj `if test -f '../libtest/first.c'; then $(CYGPATH_W) '../libtest/first.c'; else $(CYGPATH_W) '$(srcdir)/../libtest/first.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) ../libtest/$(DEPDIR)/unit1653-first.Tpo ../libtest/$(DEPDIR)/unit1653-first.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='../libtest/first.c' object='../libtest/unit1653-first.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1653_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../libtest/unit1653-first.obj `if test -f '../libtest/first.c'; then $(CYGPATH_W) '../libtest/first.c'; else $(CYGPATH_W) '$(srcdir)/../libtest/first.c'; fi`
+
+unit1654-unit1654.o: unit1654.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1654_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT unit1654-unit1654.o -MD -MP -MF $(DEPDIR)/unit1654-unit1654.Tpo -c -o unit1654-unit1654.o `test -f 'unit1654.c' || echo '$(srcdir)/'`unit1654.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/unit1654-unit1654.Tpo $(DEPDIR)/unit1654-unit1654.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='unit1654.c' object='unit1654-unit1654.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1654_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o unit1654-unit1654.o `test -f 'unit1654.c' || echo '$(srcdir)/'`unit1654.c
+
+unit1654-unit1654.obj: unit1654.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1654_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT unit1654-unit1654.obj -MD -MP -MF $(DEPDIR)/unit1654-unit1654.Tpo -c -o unit1654-unit1654.obj `if test -f 'unit1654.c'; then $(CYGPATH_W) 'unit1654.c'; else $(CYGPATH_W) '$(srcdir)/unit1654.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/unit1654-unit1654.Tpo $(DEPDIR)/unit1654-unit1654.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='unit1654.c' object='unit1654-unit1654.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1654_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o unit1654-unit1654.obj `if test -f 'unit1654.c'; then $(CYGPATH_W) 'unit1654.c'; else $(CYGPATH_W) '$(srcdir)/unit1654.c'; fi`
+
+../libtest/unit1654-first.o: ../libtest/first.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1654_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../libtest/unit1654-first.o -MD -MP -MF ../libtest/$(DEPDIR)/unit1654-first.Tpo -c -o ../libtest/unit1654-first.o `test -f '../libtest/first.c' || echo '$(srcdir)/'`../libtest/first.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) ../libtest/$(DEPDIR)/unit1654-first.Tpo ../libtest/$(DEPDIR)/unit1654-first.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='../libtest/first.c' object='../libtest/unit1654-first.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1654_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../libtest/unit1654-first.o `test -f '../libtest/first.c' || echo '$(srcdir)/'`../libtest/first.c
+
+../libtest/unit1654-first.obj: ../libtest/first.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1654_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../libtest/unit1654-first.obj -MD -MP -MF ../libtest/$(DEPDIR)/unit1654-first.Tpo -c -o ../libtest/unit1654-first.obj `if test -f '../libtest/first.c'; then $(CYGPATH_W) '../libtest/first.c'; else $(CYGPATH_W) '$(srcdir)/../libtest/first.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) ../libtest/$(DEPDIR)/unit1654-first.Tpo ../libtest/$(DEPDIR)/unit1654-first.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='../libtest/first.c' object='../libtest/unit1654-first.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1654_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../libtest/unit1654-first.obj `if test -f '../libtest/first.c'; then $(CYGPATH_W) '../libtest/first.c'; else $(CYGPATH_W) '$(srcdir)/../libtest/first.c'; fi`
+
+unit1655-unit1655.o: unit1655.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1655_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT unit1655-unit1655.o -MD -MP -MF $(DEPDIR)/unit1655-unit1655.Tpo -c -o unit1655-unit1655.o `test -f 'unit1655.c' || echo '$(srcdir)/'`unit1655.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/unit1655-unit1655.Tpo $(DEPDIR)/unit1655-unit1655.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='unit1655.c' object='unit1655-unit1655.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1655_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o unit1655-unit1655.o `test -f 'unit1655.c' || echo '$(srcdir)/'`unit1655.c
+
+unit1655-unit1655.obj: unit1655.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1655_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT unit1655-unit1655.obj -MD -MP -MF $(DEPDIR)/unit1655-unit1655.Tpo -c -o unit1655-unit1655.obj `if test -f 'unit1655.c'; then $(CYGPATH_W) 'unit1655.c'; else $(CYGPATH_W) '$(srcdir)/unit1655.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/unit1655-unit1655.Tpo $(DEPDIR)/unit1655-unit1655.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='unit1655.c' object='unit1655-unit1655.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1655_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o unit1655-unit1655.obj `if test -f 'unit1655.c'; then $(CYGPATH_W) 'unit1655.c'; else $(CYGPATH_W) '$(srcdir)/unit1655.c'; fi`
+
+../libtest/unit1655-first.o: ../libtest/first.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1655_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../libtest/unit1655-first.o -MD -MP -MF ../libtest/$(DEPDIR)/unit1655-first.Tpo -c -o ../libtest/unit1655-first.o `test -f '../libtest/first.c' || echo '$(srcdir)/'`../libtest/first.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) ../libtest/$(DEPDIR)/unit1655-first.Tpo ../libtest/$(DEPDIR)/unit1655-first.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='../libtest/first.c' object='../libtest/unit1655-first.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1655_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../libtest/unit1655-first.o `test -f '../libtest/first.c' || echo '$(srcdir)/'`../libtest/first.c
+
+../libtest/unit1655-first.obj: ../libtest/first.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1655_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../libtest/unit1655-first.obj -MD -MP -MF ../libtest/$(DEPDIR)/unit1655-first.Tpo -c -o ../libtest/unit1655-first.obj `if test -f '../libtest/first.c'; then $(CYGPATH_W) '../libtest/first.c'; else $(CYGPATH_W) '$(srcdir)/../libtest/first.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) ../libtest/$(DEPDIR)/unit1655-first.Tpo ../libtest/$(DEPDIR)/unit1655-first.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='../libtest/first.c' object='../libtest/unit1655-first.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit1655_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../libtest/unit1655-first.obj `if test -f '../libtest/first.c'; then $(CYGPATH_W) '../libtest/first.c'; else $(CYGPATH_W) '$(srcdir)/../libtest/first.c'; fi`
+
 mostlyclean-libtool:
        -rm -f *.lo
 
@@ -2125,8 +2363,13 @@ distclean: distclean-am
        -rm -f ../libtest/$(DEPDIR)/unit1608-first.Po
        -rm -f ../libtest/$(DEPDIR)/unit1609-first.Po
        -rm -f ../libtest/$(DEPDIR)/unit1620-first.Po
+       -rm -f ../libtest/$(DEPDIR)/unit1621-first.Po
        -rm -f ../libtest/$(DEPDIR)/unit1650-first.Po
        -rm -f ../libtest/$(DEPDIR)/unit1651-first.Po
+       -rm -f ../libtest/$(DEPDIR)/unit1652-first.Po
+       -rm -f ../libtest/$(DEPDIR)/unit1653-first.Po
+       -rm -f ../libtest/$(DEPDIR)/unit1654-first.Po
+       -rm -f ../libtest/$(DEPDIR)/unit1655-first.Po
        -rm -f ./$(DEPDIR)/unit1300-unit1300.Po
        -rm -f ./$(DEPDIR)/unit1301-unit1301.Po
        -rm -f ./$(DEPDIR)/unit1302-unit1302.Po
@@ -2155,8 +2398,13 @@ distclean: distclean-am
        -rm -f ./$(DEPDIR)/unit1608-unit1608.Po
        -rm -f ./$(DEPDIR)/unit1609-unit1609.Po
        -rm -f ./$(DEPDIR)/unit1620-unit1620.Po
+       -rm -f ./$(DEPDIR)/unit1621-unit1621.Po
        -rm -f ./$(DEPDIR)/unit1650-unit1650.Po
        -rm -f ./$(DEPDIR)/unit1651-unit1651.Po
+       -rm -f ./$(DEPDIR)/unit1652-unit1652.Po
+       -rm -f ./$(DEPDIR)/unit1653-unit1653.Po
+       -rm -f ./$(DEPDIR)/unit1654-unit1654.Po
+       -rm -f ./$(DEPDIR)/unit1655-unit1655.Po
        -rm -f Makefile
 distclean-am: clean-am distclean-compile distclean-generic \
        distclean-tags
@@ -2230,8 +2478,13 @@ maintainer-clean: maintainer-clean-am
        -rm -f ../libtest/$(DEPDIR)/unit1608-first.Po
        -rm -f ../libtest/$(DEPDIR)/unit1609-first.Po
        -rm -f ../libtest/$(DEPDIR)/unit1620-first.Po
+       -rm -f ../libtest/$(DEPDIR)/unit1621-first.Po
        -rm -f ../libtest/$(DEPDIR)/unit1650-first.Po
        -rm -f ../libtest/$(DEPDIR)/unit1651-first.Po
+       -rm -f ../libtest/$(DEPDIR)/unit1652-first.Po
+       -rm -f ../libtest/$(DEPDIR)/unit1653-first.Po
+       -rm -f ../libtest/$(DEPDIR)/unit1654-first.Po
+       -rm -f ../libtest/$(DEPDIR)/unit1655-first.Po
        -rm -f ./$(DEPDIR)/unit1300-unit1300.Po
        -rm -f ./$(DEPDIR)/unit1301-unit1301.Po
        -rm -f ./$(DEPDIR)/unit1302-unit1302.Po
@@ -2260,8 +2513,13 @@ maintainer-clean: maintainer-clean-am
        -rm -f ./$(DEPDIR)/unit1608-unit1608.Po
        -rm -f ./$(DEPDIR)/unit1609-unit1609.Po
        -rm -f ./$(DEPDIR)/unit1620-unit1620.Po
+       -rm -f ./$(DEPDIR)/unit1621-unit1621.Po
        -rm -f ./$(DEPDIR)/unit1650-unit1650.Po
        -rm -f ./$(DEPDIR)/unit1651-unit1651.Po
+       -rm -f ./$(DEPDIR)/unit1652-unit1652.Po
+       -rm -f ./$(DEPDIR)/unit1653-unit1653.Po
+       -rm -f ./$(DEPDIR)/unit1654-unit1654.Po
+       -rm -f ./$(DEPDIR)/unit1655-unit1655.Po
        -rm -f Makefile
 maintainer-clean-am: distclean-am maintainer-clean-generic
 
@@ -2299,10 +2557,8 @@ uninstall-am:
 .PRECIOUS: Makefile
 
 
-# Makefile.inc provides neat definitions
-
 checksrc:
-       @PERL@ $(top_srcdir)/lib/checksrc.pl $(srcdir)/*.c
+       $(CHECKSRC)@PERL@ $(top_srcdir)/lib/checksrc.pl $(srcdir)/*.[ch]
 
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
index 95d6cb4..45278ba 100644 (file)
@@ -10,8 +10,8 @@ UNITPROGS = unit1300 unit1301 unit1302 unit1303 unit1304 unit1305 unit1307 \
  unit1330 unit1394 unit1395 unit1396 unit1397 unit1398 \
  unit1399 \
  unit1600 unit1601 unit1602 unit1603 unit1604 unit1605 unit1606 unit1607 \
- unit1608 unit1609 unit1620 \
- unit1650 unit1651
+ unit1608 unit1609 unit1620 unit1621 \
+ unit1650 unit1651 unit1652 unit1653 unit1654 unit1655
 
 unit1300_SOURCES = unit1300.c $(UNITFILES)
 unit1300_CPPFLAGS = $(AM_CPPFLAGS)
@@ -100,8 +100,25 @@ unit1609_CPPFLAGS = $(AM_CPPFLAGS)
 unit1620_SOURCES = unit1620.c $(UNITFILES)
 unit1620_CPPFLAGS = $(AM_CPPFLAGS)
 
+unit1621_SOURCES = unit1621.c $(UNITFILES)
+unit1621_CPPFLAGS = $(AM_CPPFLAGS)
+unit1621_LDADD = $(top_builddir)/src/libcurltool.la $(top_builddir)/lib/libcurl.la
+
 unit1650_SOURCES = unit1650.c $(UNITFILES)
 unit1650_CPPFLAGS = $(AM_CPPFLAGS)
 
 unit1651_SOURCES = unit1651.c $(UNITFILES)
 unit1651_CPPFLAGS = $(AM_CPPFLAGS)
+
+unit1652_SOURCES = unit1652.c $(UNITFILES)
+unit1652_CPPFLAGS = $(AM_CPPFLAGS)
+
+unit1653_SOURCES = unit1653.c $(UNITFILES)
+unit1653_CPPFLAGS = $(AM_CPPFLAGS)
+
+unit1654_SOURCES = unit1654.c $(UNITFILES)
+unit1654_CPPFLAGS = $(AM_CPPFLAGS)
+
+unit1655_SOURCES = unit1655.c $(UNITFILES)
+unit1655_CPPFLAGS = $(AM_CPPFLAGS)
+
index b8a513b..060b670 100644 (file)
@@ -35,6 +35,9 @@ We put tests that focus on an area or a specific function into a single C
 source file. The source file should be named 'unitNNNN.c' where NNNN is a
 number that starts with 1300 and you can pick the next free number.
 
+Add your test to tests/unit/Makefile.inc (if it is a unit test).
+Add your test data to tests/data/Makefile.inc
+
 You also need a separate file called tests/data/testNNNN (using the same
 number) that describes your test case. See the test1300 file for inspiration
 and the tests/FILEFORMAT documentation.
@@ -46,9 +49,10 @@ For the actual C file, here's a very simple example:
 
 #include "a libcurl header.h" /* from the lib dir */
 
-static void unit_setup( void )
+static CURLcode unit_setup( void )
 {
   /* whatever you want done first */
+  return CURLE_OK;
 }
 
 static void unit_stop( void )
index c358afa..ecc5565 100644 (file)
@@ -52,7 +52,7 @@
     fprintf(stderr, "%s:%d test failed: '%s'\n",                       \
             __FILE__, __LINE__, msg);                                  \
     unitfail++;                                                        \
-  } WHILE_FALSE
+  } while(0)
 
 
 /* The abort macros mark the current test step as failed, and exit the test */
@@ -77,7 +77,7 @@
             __FILE__, __LINE__, msg);                         \
     unitfail++;                                               \
     goto unit_test_abort;                                     \
-  } WHILE_FALSE
+  } while(0)
 
 
 
index b065683..945b82b 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -68,7 +68,7 @@ struct timetest {
   int timeout_ms;
   int connecttimeout_ms;
   bool connecting;
-  time_t result;
+  timediff_t result;
   const char *comment;
 };
 
@@ -138,7 +138,7 @@ UNITTEST_START
   data->progress.t_startop.tv_usec = 0;
 
   for(i = 0; i < sizeof(run)/sizeof(run[0]); i++) {
-    time_t timeout;
+    timediff_t timeout;
     NOW(run[i].now_s, run[i].now_us);
     TIMEOUTS(run[i].timeout_ms, run[i].connecttimeout_ms);
     timeout =  Curl_timeleft(data, &now, run[i].connecting);
index 83375f5..c1d36e8 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -47,6 +47,8 @@ static void unit_stop(void)
 
 UNITTEST_START
   int result;
+  bool login_changed;
+  bool password_changed;
 
   static const char * const filename1 = "log/netrc1304";
   memcpy(filename, filename1, strlen(filename1));
@@ -54,7 +56,8 @@ UNITTEST_START
   /*
    * Test a non existent host in our netrc file.
    */
-  result = Curl_parsenetrc("test.example.com", &login, &password, filename);
+  result = Curl_parsenetrc("test.example.com", &login, &password,
+             &login_changed, &password_changed, filename);
   fail_unless(result == 1, "Host not found should return 1");
   abort_unless(password != NULL, "returned NULL!");
   fail_unless(password[0] == 0, "password should not have been changed");
@@ -67,13 +70,16 @@ UNITTEST_START
   free(login);
   login = strdup("me");
   abort_unless(login != NULL, "returned NULL!");
-  result = Curl_parsenetrc("example.com", &login, &password, filename);
-  fail_unless(result == 0, "Host should be found");
+  result = Curl_parsenetrc("example.com", &login, &password,
+             &login_changed, &password_changed, filename);
+  fail_unless(result == 0, "Host should have been found");
   abort_unless(password != NULL, "returned NULL!");
   fail_unless(password[0] == 0, "password should not have been changed");
+  fail_unless(!password_changed, "password should not have been changed");
   abort_unless(login != NULL, "returned NULL!");
   fail_unless(strncmp(login, "me", 2) == 0,
               "login should not have been changed");
+  fail_unless(!login_changed, "login should not have been changed");
 
   /*
    * Test a non existent login and host in our netrc file.
@@ -81,8 +87,9 @@ UNITTEST_START
   free(login);
   login = strdup("me");
   abort_unless(login != NULL, "returned NULL!");
-  result = Curl_parsenetrc("test.example.com", &login, &password, filename);
-  fail_unless(result == 1, "Host should be found");
+  result = Curl_parsenetrc("test.example.com", &login, &password,
+             &login_changed, &password_changed, filename);
+  fail_unless(result == 1, "Host not found should return 1");
   abort_unless(password != NULL, "returned NULL!");
   fail_unless(password[0] == 0, "password should not have been changed");
   abort_unless(login != NULL, "returned NULL!");
@@ -96,13 +103,16 @@ UNITTEST_START
   free(login);
   login = strdup("admi");
   abort_unless(login != NULL, "returned NULL!");
-  result = Curl_parsenetrc("example.com", &login, &password, filename);
-  fail_unless(result == 0, "Host should be found");
+  result = Curl_parsenetrc("example.com", &login, &password,
+             &login_changed, &password_changed, filename);
+  fail_unless(result == 0, "Host should have been found");
   abort_unless(password != NULL, "returned NULL!");
   fail_unless(password[0] == 0, "password should not have been changed");
+  fail_unless(!password_changed, "password should not have been changed");
   abort_unless(login != NULL, "returned NULL!");
   fail_unless(strncmp(login, "admi", 4) == 0,
               "login should not have been changed");
+  fail_unless(!login_changed, "login should not have been changed");
 
   /*
    * Test a non existent login (superstring of an existing one)
@@ -111,13 +121,16 @@ UNITTEST_START
   free(login);
   login = strdup("adminn");
   abort_unless(login != NULL, "returned NULL!");
-  result = Curl_parsenetrc("example.com", &login, &password, filename);
-  fail_unless(result == 0, "Host should be found");
+  result = Curl_parsenetrc("example.com", &login, &password,
+             &login_changed, &password_changed, filename);
+  fail_unless(result == 0, "Host should have been found");
   abort_unless(password != NULL, "returned NULL!");
   fail_unless(password[0] == 0, "password should not have been changed");
+  fail_unless(!password_changed, "password should not have been changed");
   abort_unless(login != NULL, "returned NULL!");
   fail_unless(strncmp(login, "adminn", 6) == 0,
               "login should not have been changed");
+  fail_unless(!login_changed, "login should not have been changed");
 
   /*
    * Test for the first existing host in our netrc file
@@ -126,13 +139,16 @@ UNITTEST_START
   free(login);
   login = strdup("");
   abort_unless(login != NULL, "returned NULL!");
-  result = Curl_parsenetrc("example.com", &login, &password, filename);
+  result = Curl_parsenetrc("example.com", &login, &password,
+             &login_changed, &password_changed, filename);
   fail_unless(result == 0, "Host should have been found");
   abort_unless(password != NULL, "returned NULL!");
   fail_unless(strncmp(password, "passwd", 6) == 0,
               "password should be 'passwd'");
+  fail_unless(password_changed, "password should have been changed");
   abort_unless(login != NULL, "returned NULL!");
   fail_unless(strncmp(login, "admin", 5) == 0, "login should be 'admin'");
+  fail_unless(login_changed, "login should have been changed");
 
   /*
    * Test for the first existing host in our netrc file
@@ -141,13 +157,16 @@ UNITTEST_START
   free(password);
   password = strdup("");
   abort_unless(password != NULL, "returned NULL!");
-  result = Curl_parsenetrc("example.com", &login, &password, filename);
+  result = Curl_parsenetrc("example.com", &login, &password,
+             &login_changed, &password_changed, filename);
   fail_unless(result == 0, "Host should have been found");
   abort_unless(password != NULL, "returned NULL!");
   fail_unless(strncmp(password, "passwd", 6) == 0,
               "password should be 'passwd'");
+  fail_unless(password_changed, "password should have been changed");
   abort_unless(login != NULL, "returned NULL!");
   fail_unless(strncmp(login, "admin", 5) == 0, "login should be 'admin'");
+  fail_unless(!login_changed, "login should not have been changed");
 
   /*
    * Test for the second existing host in our netrc file
@@ -159,13 +178,16 @@ UNITTEST_START
   free(login);
   login = strdup("");
   abort_unless(login != NULL, "returned NULL!");
-  result = Curl_parsenetrc("curl.example.com", &login, &password, filename);
+  result = Curl_parsenetrc("curl.example.com", &login, &password,
+             &login_changed, &password_changed, filename);
   fail_unless(result == 0, "Host should have been found");
   abort_unless(password != NULL, "returned NULL!");
   fail_unless(strncmp(password, "none", 4) == 0,
               "password should be 'none'");
+  fail_unless(password_changed, "password should have been changed");
   abort_unless(login != NULL, "returned NULL!");
   fail_unless(strncmp(login, "none", 4) == 0, "login should be 'none'");
+  fail_unless(login_changed, "login should have been changed");
 
   /*
    * Test for the second existing host in our netrc file
@@ -174,16 +196,15 @@ UNITTEST_START
   free(password);
   password = strdup("");
   abort_unless(password != NULL, "returned NULL!");
-  result = Curl_parsenetrc("curl.example.com", &login, &password, filename);
+  result = Curl_parsenetrc("curl.example.com", &login, &password,
+             &login_changed, &password_changed, filename);
   fail_unless(result == 0, "Host should have been found");
   abort_unless(password != NULL, "returned NULL!");
   fail_unless(strncmp(password, "none", 4) == 0,
               "password should be 'none'");
+  fail_unless(password_changed, "password should have been changed");
   abort_unless(login != NULL, "returned NULL!");
   fail_unless(strncmp(login, "none", 4) == 0, "login should be 'none'");
+  fail_unless(!login_changed, "login should not have been changed");
 
-  /* TODO:
-   * Test over the size limit password / login!
-   * Test files with a bad format
-   */
 UNITTEST_STOP
index d6664ff..7e88ea4 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
 
 #include "curl_fnmatch.h"
 
+static CURLcode unit_setup(void)
+{
+  return CURLE_OK;
+}
+
+static void unit_stop(void)
+{
+}
+
+#ifndef CURL_DISABLE_FTP
+
 /*
    CURL_FNMATCH_MATCH    0
    CURL_FNMATCH_NOMATCH  1
@@ -239,15 +250,6 @@ static const struct testcase tests[] = {
                                 "a",                      NOMATCH|LINUX_FAIL}
 };
 
-static CURLcode unit_setup(void)
-{
-  return CURLE_OK;
-}
-
-static void unit_stop(void)
-{
-}
-
 static const char *ret2name(int i)
 {
   switch(i) {
@@ -308,3 +310,14 @@ UNITTEST_START
   }
 }
 UNITTEST_STOP
+
+#else
+
+UNITTEST_START
+{
+  /* nothing to do, just fail */
+  return 1;
+}
+UNITTEST_STOP
+
+#endif
index 539433c..432b909 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -36,7 +36,7 @@ static void unit_stop(void)
 UNITTEST_START
 
 /* only these backends define the tested functions */
-#if defined(USE_OPENSSL) || defined(USE_AXTLS) || defined(USE_GSKIT)
+#if defined(USE_OPENSSL) || defined(USE_GSKIT)
 
   /* here you start doing things and checking that the results are good */
 
index b726019..8b132a0 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -74,7 +74,6 @@ fail_unless(!strcmp(output, "     bu"), "wrong output");
 
 /* output a number in a limited output */
 rc = curl_msnprintf(output, 4, "%d", 10240);
-/* TODO: this should return 5 to be POSIX/snprintf compliant! */
 fail_unless(rc == 4, "return code should be 4");
 fail_unless(!strcmp(output, "102"), "wrong output");
 
index 897a343..3b52989 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -50,7 +50,7 @@ static void fake_t_startsingle_time(struct Curl_easy *data,
   data->progress.t_startsingle.tv_usec = fake_now.tv_usec;
 }
 
-static bool usec_matches_seconds(time_t time_usec, int expected_seconds)
+static bool usec_matches_seconds(timediff_t time_usec, int expected_seconds)
 {
   int time_sec = (int)(time_usec / usec_magnitude);
   bool same = (time_sec == expected_seconds);
@@ -63,7 +63,7 @@ static bool usec_matches_seconds(time_t time_usec, int expected_seconds)
 static void expect_timer_seconds(struct Curl_easy *data, int seconds)
 {
   char msg[64];
-  snprintf(msg, sizeof(msg), "about %d seconds should have passed", seconds);
+  msnprintf(msg, sizeof(msg), "about %d seconds should have passed", seconds);
   fail_unless(usec_matches_seconds(data->progress.t_nslookup, seconds), msg);
   fail_unless(usec_matches_seconds(data->progress.t_connect, seconds), msg);
   fail_unless(usec_matches_seconds(data->progress.t_appconnect, seconds), msg);
index fbfd2c4..c285ced 100644 (file)
@@ -46,11 +46,15 @@ static char *getflagstr(int flags)
 {
   char *buf = malloc(256);
   if(buf) {
-    snprintf(buf, 256, "%s,%s,%s,%s",
-      ((flags & SANITIZE_ALLOW_COLONS) ? "SANITIZE_ALLOW_COLONS" : ""),
-      ((flags & SANITIZE_ALLOW_PATH) ? "SANITIZE_ALLOW_PATH" : ""),
-      ((flags & SANITIZE_ALLOW_RESERVED) ? "SANITIZE_ALLOW_RESERVED" : ""),
-      ((flags & SANITIZE_ALLOW_TRUNCATE) ? "SANITIZE_ALLOW_TRUNCATE" : ""));
+    msnprintf(buf, 256, "%s,%s,%s,%s",
+              ((flags & SANITIZE_ALLOW_COLONS) ?
+               "SANITIZE_ALLOW_COLONS" : ""),
+              ((flags & SANITIZE_ALLOW_PATH) ?
+               "SANITIZE_ALLOW_PATH" : ""),
+              ((flags & SANITIZE_ALLOW_RESERVED) ?
+               "SANITIZE_ALLOW_RESERVED" : ""),
+              ((flags & SANITIZE_ALLOW_TRUNCATE) ?
+               "SANITIZE_ALLOW_TRUNCATE" : ""));
   }
   return buf;
 }
@@ -59,13 +63,13 @@ static char *getcurlcodestr(int cc)
 {
   char *buf = malloc(256);
   if(buf) {
-    snprintf(buf, 256, "%s (%d)",
-      (cc == SANITIZE_ERR_OK ? "SANITIZE_ERR_OK" :
-       cc == SANITIZE_ERR_BAD_ARGUMENT ? "SANITIZE_ERR_BAD_ARGUMENT" :
-       cc == SANITIZE_ERR_INVALID_PATH ? "SANITIZE_ERR_INVALID_PATH" :
-       cc == SANITIZE_ERR_OUT_OF_MEMORY ? "SANITIZE_ERR_OUT_OF_MEMORY" :
-       "unexpected error code - add name"),
-      cc);
+    msnprintf(buf, 256, "%s (%d)",
+              (cc == SANITIZE_ERR_OK ? "SANITIZE_ERR_OK" :
+               cc == SANITIZE_ERR_BAD_ARGUMENT ? "SANITIZE_ERR_BAD_ARGUMENT" :
+               cc == SANITIZE_ERR_INVALID_PATH ? "SANITIZE_ERR_INVALID_PATH" :
+               cc == SANITIZE_ERR_OUT_OF_MEMORY ? "SANITIZE_ERR_OUT_OF_MEMORY":
+               "unexpected error code - add name"),
+              cc);
   }
   return buf;
 }
index 64b6371..e8d4120 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
 
 #include "memdebug.h" /* LAST include file */
 
-static struct Curl_easy *easy;
-static struct curl_hash *hostcache;
-
 static void unit_stop(void)
 {
-  curl_easy_cleanup(easy);
   curl_global_cleanup();
 }
 
@@ -42,18 +38,6 @@ static CURLcode unit_setup(void)
 
   global_init(CURL_GLOBAL_ALL);
 
-  easy = curl_easy_init();
-  if(!easy) {
-    curl_global_cleanup();
-    return CURLE_OUT_OF_MEMORY;
-  }
-
-  hostcache = Curl_global_host_cache_init();
-  if(!hostcache) {
-    unit_stop();
-    return CURLE_OUT_OF_MEMORY;
-  }
-
   return res;
 }
 
@@ -115,34 +99,39 @@ static const struct testcase tests[] = {
 };
 
 UNITTEST_START
+{
   int i;
   int testnum = sizeof(tests) / sizeof(struct testcase);
+  struct Curl_multi *multi = NULL;
+  struct Curl_easy *easy = NULL;
+  struct curl_slist *list = NULL;
 
-  for(i = 0; i < testnum; ++i, curl_easy_reset(easy)) {
+  for(i = 0; i < testnum; ++i) {
     int j;
     int addressnum = sizeof(tests[i].address) / sizeof(*tests[i].address);
     struct Curl_addrinfo *addr;
     struct Curl_dns_entry *dns;
-    struct curl_slist *list;
     void *entry_id;
     bool problem = false;
+    easy = curl_easy_init();
+    if(!easy)
+      goto error;
 
-    Curl_hostcache_clean(easy, hostcache);
-    easy->dns.hostcache = hostcache;
-    easy->dns.hostcachetype = HCACHE_GLOBAL;
+    /* create a multi handle and add the easy handle to it so that the
+       hostcache is setup */
+    multi = curl_multi_init();
+    curl_multi_add_handle(multi, easy);
 
     list = curl_slist_append(NULL, tests[i].optval);
     if(!list)
-        goto unit_test_abort;
+      goto error;
     curl_easy_setopt(easy, CURLOPT_RESOLVE, list);
 
     Curl_loadhostpairs(easy);
 
     entry_id = (void *)aprintf("%s:%d", tests[i].host, tests[i].port);
-    if(!entry_id) {
-      curl_slist_free_all(list);
-      goto unit_test_abort;
-    }
+    if(!entry_id)
+      goto error;
     dns = Curl_hash_pick(easy->dns.hostcache, entry_id, strlen(entry_id) + 1);
     free(entry_id);
     entry_id = NULL;
@@ -159,8 +148,8 @@ UNITTEST_START
       if(tests[i].address[j] == &skip)
         continue;
 
-      if(addr && !Curl_getaddressinfo(addr->ai_addr,
-                                      ipaddress, &port)) {
+      if(addr && !Curl_addr2string(addr->ai_addr, addr->ai_addrlen,
+                                   ipaddress, &port)) {
         fprintf(stderr, "%s:%d tests[%d] failed. getaddressinfo failed.\n",
                 __FILE__, __LINE__, i);
         problem = true;
@@ -210,12 +199,21 @@ UNITTEST_START
       addr = addr->ai_next;
     }
 
-    Curl_hostcache_clean(easy, easy->dns.hostcache);
+    curl_easy_cleanup(easy);
+    easy = NULL;
+    curl_multi_cleanup(multi);
+    multi = NULL;
     curl_slist_free_all(list);
+    list = NULL;
 
     if(problem) {
       unitfail++;
       continue;
     }
   }
+  error:
+  curl_easy_cleanup(easy);
+  curl_multi_cleanup(multi);
+  curl_slist_free_all(list);
+}
 UNITTEST_STOP
index 9ae474b..38d5cb2 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -23,6 +23,9 @@
 
 #include "hostip.h"
 
+CURLcode Curl_shuffle_addr(struct Curl_easy *data,
+                           Curl_addrinfo **addr);
+
 #define NUM_ADDRS 8
 static struct Curl_addrinfo addrs[NUM_ADDRS];
 
@@ -62,6 +65,7 @@ UNITTEST_START
   }
 
   curl_easy_cleanup(easy);
+  curl_global_cleanup();
 
   abort_unless(addrhead != addrs, "addresses are not being reordered");
 
index 2b99bee..ce3ddf9 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
 
 #include "memdebug.h" /* LAST include file */
 
-static struct Curl_easy *easy;
-static struct curl_hash *hostcache;
-
 static void unit_stop(void)
 {
-  curl_easy_cleanup(easy);
   curl_global_cleanup();
 }
 
@@ -42,18 +38,6 @@ static CURLcode unit_setup(void)
 
   global_init(CURL_GLOBAL_ALL);
 
-  easy = curl_easy_init();
-  if(!easy) {
-    curl_global_cleanup();
-    return CURLE_OUT_OF_MEMORY;
-  }
-
-  hostcache = Curl_global_host_cache_init();
-  if(!hostcache) {
-    unit_stop();
-    return CURLE_OUT_OF_MEMORY;
-  }
-
   return res;
 }
 
@@ -113,38 +97,49 @@ static const struct testcase tests[] = {
 };
 
 UNITTEST_START
+{
   int i;
   int testnum = sizeof(tests) / sizeof(struct testcase);
+  struct Curl_multi *multi = NULL;
+  struct Curl_easy *easy = NULL;
+  struct curl_slist *list = NULL;
 
 /* important: we setup cache outside of the loop
   and also clean cache after the loop. In contrast,for example,
   test 1607 sets up and cleans cache on each iteration. */
-  Curl_hostcache_clean(easy, hostcache);
-  easy->dns.hostcache = hostcache;
-  easy->dns.hostcachetype = HCACHE_GLOBAL;
 
-  for(i = 0; i < testnum; ++i, curl_easy_reset(easy)) {
+  for(i = 0; i < testnum; ++i) {
     int j;
     int addressnum = sizeof (tests[i].address) / sizeof (*tests[i].address);
     struct Curl_addrinfo *addr;
     struct Curl_dns_entry *dns;
-    struct curl_slist *list;
     void *entry_id;
     bool problem = false;
+    easy = curl_easy_init();
+    if(!easy) {
+      curl_global_cleanup();
+      return CURLE_OUT_OF_MEMORY;
+    }
+    /* create a multi handle and add the easy handle to it so that the
+       hostcache is setup */
+    multi = curl_multi_init();
+    if(!multi)
+      goto error;
+    curl_multi_add_handle(multi, easy);
 
     list = curl_slist_append(NULL, tests[i].optval);
     if(!list)
-        goto unit_test_abort;
+      goto error;
 
     curl_easy_setopt(easy, CURLOPT_RESOLVE, list);
 
-    Curl_loadhostpairs(easy);
+    if(Curl_loadhostpairs(easy))
+      goto error;
 
     entry_id = (void *)aprintf("%s:%d", tests[i].host, tests[i].port);
-    if(!entry_id) {
-      curl_slist_free_all(list);
-      goto unit_test_abort;
-    }
+    if(!entry_id)
+      goto error;
+
     dns = Curl_hash_pick(easy->dns.hostcache, entry_id, strlen(entry_id) + 1);
     free(entry_id);
     entry_id = NULL;
@@ -158,9 +153,9 @@ UNITTEST_START
       if(!addr && !tests[i].address[j])
         break;
 
-      if(addr && !Curl_getaddressinfo(addr->ai_addr,
-                                      ipaddress, &port)) {
-        fprintf(stderr, "%s:%d tests[%d] failed. getaddressinfo failed.\n",
+      if(addr && !Curl_addr2string(addr->ai_addr, addr->ai_addrlen,
+                                   ipaddress, &port)) {
+        fprintf(stderr, "%s:%d tests[%d] failed. Curl_addr2string failed.\n",
                 __FILE__, __LINE__, i);
         problem = true;
         break;
@@ -201,14 +196,23 @@ UNITTEST_START
       addr = addr->ai_next;
     }
 
+    curl_easy_cleanup(easy);
+    easy = NULL;
+    Curl_hash_destroy(&multi->hostcache);
+    curl_multi_cleanup(multi);
+    multi = NULL;
     curl_slist_free_all(list);
+    list = NULL;
 
     if(problem) {
       unitfail++;
       continue;
     }
   }
-
-  Curl_hostcache_clean(easy, easy->dns.hostcache);
-
+  goto unit_test_abort;
+  error:
+  curl_easy_cleanup(easy);
+  curl_multi_cleanup(multi);
+  curl_slist_free_all(list);
+}
 UNITTEST_STOP
index a47ff49..6e572c6 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -46,9 +46,11 @@ UNITTEST_START
   bool protocol_connect = FALSE;
 
   rc = Curl_open(&empty);
+  if(rc)
+    goto unit_test_abort;
   fail_unless(rc == CURLE_OK, "Curl_open() failed");
 
-  rc = Curl_connect(empty, &empty->easy_conn, &async, &protocol_connect);
+  rc = Curl_connect(empty, &async, &protocol_connect);
   fail_unless(rc == CURLE_URL_MALFORMAT,
               "Curl_connect() failed to return CURLE_URL_MALFORMAT");
 
@@ -56,14 +58,14 @@ UNITTEST_START
               "empty->magic should be equal to CURLEASY_MAGIC_NUMBER");
 
   /* double invoke to ensure no dependency on internal state */
-  rc = Curl_connect(empty, &empty->easy_conn, &async, &protocol_connect);
+  rc = Curl_connect(empty, &async, &protocol_connect);
   fail_unless(rc == CURLE_URL_MALFORMAT,
               "Curl_connect() failed to return CURLE_URL_MALFORMAT");
 
   rc = Curl_init_userdefined(empty);
   fail_unless(rc == CURLE_OK, "Curl_userdefined() failed");
 
-  rc = Curl_init_do(empty, empty->easy_conn);
+  rc = Curl_init_do(empty, empty->conn);
   fail_unless(rc == CURLE_OK, "Curl_init_do() failed");
 
   rc = Curl_parse_login_details(
@@ -71,7 +73,7 @@ UNITTEST_START
   fail_unless(rc == CURLE_OK,
               "Curl_parse_login_details() failed");
 
-  rc = Curl_disconnect(empty, empty->easy_conn, FALSE);
+  rc = Curl_disconnect(empty, empty->conn, FALSE);
   fail_unless(rc == CURLE_OK,
               "Curl_disconnect() with dead_connection set FALSE failed");
 
@@ -83,7 +85,7 @@ UNITTEST_START
 
   Curl_free_request_state(empty);
 
-  rc = Curl_close(empty);
+  rc = Curl_close(&empty);
   fail_unless(rc == CURLE_OK, "Curl_close() failed");
 
 }
diff --git a/tests/unit/unit1621.c b/tests/unit/unit1621.c
new file mode 100644 (file)
index 0000000..618abed
--- /dev/null
@@ -0,0 +1,91 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+#include "curlcheck.h"
+
+#include "urldata.h"
+#include "url.h"
+
+#include "memdebug.h" /* LAST include file */
+
+static CURLcode unit_setup(void)
+{
+  return CURLE_OK;
+}
+
+static void unit_stop(void)
+{
+}
+
+#if defined(__MINGW32__)  || \
+  (!defined(HAVE_FSETXATTR) && \
+  (!defined(__FreeBSD_version) || (__FreeBSD_version < 500000)))
+UNITTEST_START
+{
+  return 0;
+}
+UNITTEST_STOP
+#else
+
+bool stripcredentials(char **url);
+
+struct checkthis {
+  const char *input;
+  const char *output;
+};
+
+static struct checkthis tests[] = {
+  { "ninja://foo@example.com", "ninja://foo@example.com" },
+  { "https://foo@example.com", "https://example.com/" },
+  { "https://localhost:45", "https://localhost:45/" },
+  { "https://foo@localhost:45", "https://localhost:45/" },
+  { "http://daniel:password@localhost", "http://localhost/" },
+  { "http://daniel@localhost", "http://localhost/" },
+  { "http://localhost/", "http://localhost/" },
+  { NULL, NULL } /* end marker */
+};
+
+UNITTEST_START
+{
+  bool cleanup;
+  char *url;
+  int i;
+  int rc = 0;
+
+  for(i = 0; tests[i].input; i++) {
+    url = (char *)tests[i].input;
+    cleanup = stripcredentials(&url);
+    printf("Test %u got input \"%s\", output: \"%s\"\n",
+           i, tests[i].input, url);
+
+    if(strcmp(tests[i].output, url)) {
+      fprintf(stderr, "Test %u got input \"%s\", expected output \"%s\"\n"
+              " Actual output: \"%s\"\n", i, tests[i].input, tests[i].output,
+              url);
+      rc++;
+    }
+    if(cleanup)
+      curl_free(url);
+  }
+  return rc;
+}
+UNITTEST_STOP
+#endif
index ddf228f..35ac12c 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 2018 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -33,7 +33,7 @@ static void unit_stop(void)
 
 }
 
-#ifdef USE_NGHTTP2
+#ifndef CURL_DISABLE_DOH
 #define DNS_PREAMBLE "\x00\x00\x01\x00\x00\x01\x00\x00\x00\x00\x00\x00"
 #define LABEL_TEST "\x04\x74\x65\x73\x74"
 #define LABEL_HOST "\x04\x68\x6f\x73\x74"
@@ -152,7 +152,7 @@ static struct dohresp resp[] = {
 
 UNITTEST_START
 {
-  size_t size;
+  size_t size = 0;
   unsigned char buffer[256];
   size_t i;
   unsigned char *p;
@@ -160,13 +160,13 @@ UNITTEST_START
     int rc = doh_encode(req[i].name, req[i].type,
                         buffer, sizeof(buffer), &size);
     if(rc != req[i].rc) {
-      fprintf(stderr, "req %d: Expected return code %d got %d\n", i,
+      fprintf(stderr, "req %zu: Expected return code %d got %d\n", i,
               req[i].rc, rc);
       return 1;
     }
     else if(size != req[i].size) {
-      fprintf(stderr, "req %d: Expected size %d got %d\n", i,
-              (int)req[i].size, (int)size);
+      fprintf(stderr, "req %zu: Expected size %zu got %zu\n", i,
+              req[i].size, size);
       fprintf(stderr, "DNS encode made: %s\n", hexdump(buffer, size));
       return 2;
     }
@@ -188,7 +188,7 @@ UNITTEST_START
     rc = doh_decode((unsigned char *)resp[i].packet, resp[i].size,
                     resp[i].type, &d);
     if(rc != resp[i].rc) {
-      fprintf(stderr, "resp %d: Expected return code %d got %d\n", i,
+      fprintf(stderr, "resp %zu: Expected return code %d got %d\n", i,
               resp[i].rc, rc);
       return 4;
     }
@@ -200,7 +200,7 @@ UNITTEST_START
       a = &d.addr[u];
       if(resp[i].type == DNS_TYPE_A) {
         p = &a->ip.v4[0];
-        snprintf(ptr, len, "%u.%u.%u.%u ", p[0], p[1], p[2], p[3]);
+        msnprintf(ptr, len, "%u.%u.%u.%u ", p[0], p[1], p[2], p[3]);
         o = strlen(ptr);
         len -= o;
         ptr += o;
@@ -209,27 +209,27 @@ UNITTEST_START
         int j;
         for(j = 0; j < 16; j += 2) {
           size_t l;
-          snprintf(ptr, len, "%s%02x%02x", j?":":"", a->ip.v6[j],
+          msnprintf(ptr, len, "%s%02x%02x", j?":":"", a->ip.v6[j],
                    a->ip.v6[j + 1]);
           l = strlen(ptr);
           len -= l;
           ptr += l;
         }
-        snprintf(ptr, len, " ");
+        msnprintf(ptr, len, " ");
         len--;
         ptr++;
       }
     }
     for(u = 0; u < d.numcname; u++) {
       size_t o;
-      snprintf(ptr, len, "%s ", d.cname[u].alloc);
+      msnprintf(ptr, len, "%s ", d.cname[u].alloc);
       o = strlen(ptr);
       len -= o;
       ptr += o;
     }
     de_cleanup(&d);
     if(resp[i].out && strcmp((char *)buffer, resp[i].out)) {
-      fprintf(stderr, "resp %d: Expected %s got %s\n", i,
+      fprintf(stderr, "resp %zu: Expected %s got %s\n", i,
               resp[i].out, buffer);
       return 1;
     }
@@ -244,7 +244,7 @@ UNITTEST_START
       rc = doh_decode((unsigned char *)full49, i, DNS_TYPE_A, &d);
       if(!rc) {
         /* none of them should work */
-        fprintf(stderr, "%d: %d\n", i, rc);
+        fprintf(stderr, "%zu: %d\n", i, rc);
         return 5;
       }
     }
@@ -257,7 +257,7 @@ UNITTEST_START
                       DNS_TYPE_A, &d);
       if(!rc) {
         /* none of them should work */
-        fprintf(stderr, "2 %d: %d\n", i, rc);
+        fprintf(stderr, "2 %zu: %d\n", i, rc);
         return 7;
       }
     }
@@ -271,8 +271,8 @@ UNITTEST_START
       fail_if(d.numaddr != 1, "missing address");
       a = &d.addr[0];
       p = &a->ip.v4[0];
-      snprintf((char *)buffer, sizeof(buffer),
-               "%u.%u.%u.%u", p[0], p[1], p[2], p[3]);
+      msnprintf((char *)buffer, sizeof(buffer),
+                "%u.%u.%u.%u", p[0], p[1], p[2], p[3]);
       if(rc || strcmp((char *)buffer, "127.0.0.1")) {
         fprintf(stderr, "bad address decoded: %s, rc == %d\n", buffer, rc);
         return 7;
@@ -283,7 +283,7 @@ UNITTEST_START
 }
 UNITTEST_STOP
 
-#else /* USE_NGHTTP2 */
+#else /* CURL_DISABLE_DOH */
 UNITTEST_START
 {
   return 1; /* nothing to do, just fail */
index fcd3b54..3652601 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 2018 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -33,7 +33,7 @@ static void unit_stop(void)
 
 }
 #if defined(USE_GSKIT) || defined(USE_NSS) || defined(USE_GNUTLS) || \
-    defined(USE_CYASSL) || defined(USE_SCHANNEL)
+    defined(USE_WOLFSSL) || defined(USE_SCHANNEL)
 
 /* cert captured from gdb when connecting to curl.haxx.se on October 26
    2018 */
@@ -352,6 +352,8 @@ UNITTEST_START
   struct Curl_easy *data = curl_easy_init();
   int i;
   int byte;
+  if(!data)
+    return 2;
 
   memset(&conn, 0, sizeof(struct connectdata));
   /* this is a lot of assuming, but we expect the parsing function to only
diff --git a/tests/unit/unit1652.c b/tests/unit/unit1652.c
new file mode 100644 (file)
index 0000000..9693fe6
--- /dev/null
@@ -0,0 +1,133 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+#include "curlcheck.h"
+
+#include "urldata.h"
+#include "sendf.h"
+
+/*
+ * This test hardcodes the knowledge of the buffer size which is internal to
+ * Curl_infof(). If that buffer is changed in size, this tests needs to be
+ * updated to still be valid.
+ */
+
+static struct Curl_easy *data;
+
+static char input[4096];
+static char result[4096];
+
+int debugf_cb(CURL *handle, curl_infotype type, char *buf, size_t size,
+              void *userptr);
+
+/*
+ * This debugf callback is simply dumping the string into the static buffer
+ * for the unit test to inspect. Since we know that we're only dealing with
+ * text we can afford the luxury of skipping the type check here.
+ */
+int
+debugf_cb(CURL *handle, curl_infotype type, char *buf, size_t size,
+                void *userptr)
+{
+  (void)handle;
+  (void)type;
+  (void)userptr;
+
+  memset(result, '\0', sizeof(result));
+  memcpy(result, buf, size);
+  return 0;
+}
+
+static CURLcode
+unit_setup(void)
+{
+  int res = 0;
+
+  global_init(CURL_GLOBAL_ALL);
+  data = curl_easy_init();
+  if(!data)
+    return CURLE_OUT_OF_MEMORY;
+  curl_easy_setopt(data, CURLOPT_DEBUGFUNCTION, debugf_cb);
+  curl_easy_setopt(data, CURLOPT_VERBOSE, 1L);
+  return CURLE_OK;
+}
+
+static void
+unit_stop(void)
+{
+  curl_easy_cleanup(data);
+  curl_global_cleanup();
+}
+
+UNITTEST_START
+
+/* Injecting a simple short string via a format */
+msnprintf(input, sizeof(input), "Simple Test");
+Curl_infof(data, "%s", input);
+fail_unless(strcmp(result, input) == 0, "Simple string test");
+
+/* Injecting a few different variables with a format */
+Curl_infof(data, "%s %u testing %lu\n", input, 42, 43L);
+fail_unless(strcmp(result, "Simple Test 42 testing 43\n") == 0,
+            "Format string");
+
+/* Variations of empty strings */
+Curl_infof(data, "");
+fail_unless(strlen(result) == 0, "Empty string");
+Curl_infof(data, "%s", NULL);
+fail_unless(strcmp(result, "(nil)") == 0, "Passing NULL as string");
+
+/* A string just long enough to not be truncated */
+memset(input, '\0', sizeof(input));
+memset(input, 'A', 2048);
+Curl_infof(data, "%s", input);
+fail_unless(strlen(result) == 2048, "No truncation of infof input");
+fail_unless(strcmp(result, input) == 0, "No truncation of infof input");
+fail_unless(result[sizeof(result) - 1] == '\0',
+            "No truncation of infof input");
+
+/* Just over the limit for truncation without newline */
+memset(input + 2047, 'A', 4);
+Curl_infof(data, "%s", input);
+fail_unless(strlen(result) == 2048, "Truncation of infof input 1");
+fail_unless(result[sizeof(result) - 1] == '\0', "Truncation of infof input 1");
+fail_unless(strncmp(result + 2045, "...", 3) == 0,
+            "Truncation of infof input 1");
+
+/* Just over the limit for truncation with newline */
+memset(input + 2047, 'A', 4);
+memset(input + 2047 + 4, '\n', 1);
+Curl_infof(data, "%s\n", input);
+fail_unless(strlen(result) == 2048, "Truncation of infof input 2");
+fail_unless(result[sizeof(result) - 1] == '\0', "Truncation of infof input 2");
+fail_unless(strncmp(result + 2044, "...", 3) == 0,
+            "Truncation of infof input 2");
+
+/* Way over the limit for truncation with newline */
+memset(input, '\0', sizeof(input));
+memset(input, 'A', sizeof(input) - 1);
+Curl_infof(data, "%s\n", input);
+fail_unless(strlen(result) == 2048, "Truncation of infof input 3");
+fail_unless(result[sizeof(result) - 1] == '\0', "Truncation of infof input 3");
+fail_unless(strncmp(result + 2044, "...", 3) == 0,
+            "Truncation of infof input 3");
+
+UNITTEST_STOP
diff --git a/tests/unit/unit1653.c b/tests/unit/unit1653.c
new file mode 100644 (file)
index 0000000..c5d8f3b
--- /dev/null
@@ -0,0 +1,192 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+#include "curlcheck.h"
+
+#include "urldata.h"
+#include "curl/urlapi.h"
+#include "urlapi-int.h"
+
+
+static CURLU *u;
+
+static CURLcode
+unit_setup(void)
+{
+  return CURLE_OK;
+}
+
+static void
+unit_stop(void)
+{
+  curl_global_cleanup();
+}
+
+#define free_and_clear(x) free(x); x = NULL
+
+UNITTEST_START
+{
+  CURLUcode ret;
+  char *ipv6port = NULL;
+  char *portnum;
+
+  /* Valid IPv6 */
+  u = curl_url();
+  if(!u)
+    goto fail;
+  ipv6port = strdup("[fe80::250:56ff:fea7:da15]");
+  if(!ipv6port)
+    goto fail;
+  ret = Curl_parse_port(u, ipv6port);
+  fail_unless(ret == CURLUE_OK, "Curl_parse_port returned error");
+  ret = curl_url_get(u, CURLUPART_PORT, &portnum, CURLU_NO_DEFAULT_PORT);
+  fail_unless(ret != CURLUE_OK, "curl_url_get portnum returned something");
+  free_and_clear(ipv6port);
+  curl_url_cleanup(u);
+
+  /* Invalid IPv6 */
+  u = curl_url();
+  if(!u)
+    goto fail;
+  ipv6port = strdup("[fe80::250:56ff:fea7:da15|");
+  if(!ipv6port)
+    goto fail;
+  ret = Curl_parse_port(u, ipv6port);
+  fail_unless(ret != CURLUE_OK, "Curl_parse_port true on error");
+  free_and_clear(ipv6port);
+  curl_url_cleanup(u);
+
+  u = curl_url();
+  if(!u)
+    goto fail;
+  ipv6port = strdup("[fe80::250:56ff;fea7:da15]:80");
+  if(!ipv6port)
+    goto fail;
+  ret = Curl_parse_port(u, ipv6port);
+  fail_unless(ret != CURLUE_OK, "Curl_parse_port true on error");
+  free_and_clear(ipv6port);
+  curl_url_cleanup(u);
+
+  /* Valid IPv6 with zone index and port number */
+  u = curl_url();
+  if(!u)
+    goto fail;
+  ipv6port = strdup("[fe80::250:56ff:fea7:da15%25eth3]:80");
+  if(!ipv6port)
+    goto fail;
+  ret = Curl_parse_port(u, ipv6port);
+  fail_unless(ret == CURLUE_OK, "Curl_parse_port returned error");
+  ret = curl_url_get(u, CURLUPART_PORT, &portnum, 0);
+  fail_unless(ret == CURLUE_OK, "curl_url_get portnum returned error");
+  fail_unless(portnum && !strcmp(portnum, "80"), "Check portnumber");
+  curl_free(portnum);
+  free_and_clear(ipv6port);
+  curl_url_cleanup(u);
+
+  /* Valid IPv6 with zone index without port number */
+  u = curl_url();
+  if(!u)
+    goto fail;
+  ipv6port = strdup("[fe80::250:56ff:fea7:da15%25eth3]");
+  if(!ipv6port)
+    goto fail;
+  ret = Curl_parse_port(u, ipv6port);
+  fail_unless(ret == CURLUE_OK, "Curl_parse_port returned error");
+  free_and_clear(ipv6port);
+  curl_url_cleanup(u);
+
+  /* Valid IPv6 with port number */
+  u = curl_url();
+  if(!u)
+    goto fail;
+  ipv6port = strdup("[fe80::250:56ff:fea7:da15]:81");
+  if(!ipv6port)
+    goto fail;
+  ret = Curl_parse_port(u, ipv6port);
+  fail_unless(ret == CURLUE_OK, "Curl_parse_port returned error");
+  ret = curl_url_get(u, CURLUPART_PORT, &portnum, 0);
+  fail_unless(ret == CURLUE_OK, "curl_url_get portnum returned error");
+  fail_unless(portnum && !strcmp(portnum, "81"), "Check portnumber");
+  curl_free(portnum);
+  free_and_clear(ipv6port);
+  curl_url_cleanup(u);
+
+  /* Valid IPv6 with syntax error in the port number */
+  u = curl_url();
+  if(!u)
+    goto fail;
+  ipv6port = strdup("[fe80::250:56ff:fea7:da15];81");
+  if(!ipv6port)
+    goto fail;
+  ret = Curl_parse_port(u, ipv6port);
+  fail_unless(ret != CURLUE_OK, "Curl_parse_port true on error");
+  free_and_clear(ipv6port);
+  curl_url_cleanup(u);
+
+  u = curl_url();
+  if(!u)
+    goto fail;
+  ipv6port = strdup("[fe80::250:56ff:fea7:da15]80");
+  if(!ipv6port)
+    goto fail;
+  ret = Curl_parse_port(u, ipv6port);
+  fail_unless(ret != CURLUE_OK, "Curl_parse_port true on error");
+  free_and_clear(ipv6port);
+  curl_url_cleanup(u);
+
+  /* Valid IPv6 with no port after the colon, should use default */
+  u = curl_url();
+  if(!u)
+    goto fail;
+  ipv6port = strdup("[fe80::250:56ff:fea7:da15]:");
+  if(!ipv6port)
+    goto fail;
+  ret = Curl_parse_port(u, ipv6port);
+  fail_unless(ret == CURLUE_OK, "Curl_parse_port returned error");
+  free_and_clear(ipv6port);
+  curl_url_cleanup(u);
+
+  /* Incorrect zone index syntax */
+  u = curl_url();
+  if(!u)
+    goto fail;
+  ipv6port = strdup("[fe80::250:56ff:fea7:da15!25eth3]:80");
+  if(!ipv6port)
+    goto fail;
+  ret = Curl_parse_port(u, ipv6port);
+  fail_unless(ret != CURLUE_OK, "Curl_parse_port returned non-error");
+  free_and_clear(ipv6port);
+  curl_url_cleanup(u);
+
+  /* Non percent-encoded zone index */
+  u = curl_url();
+  if(!u)
+    goto fail;
+  ipv6port = strdup("[fe80::250:56ff:fea7:da15%eth3]:80");
+  if(!ipv6port)
+    goto fail;
+  ret = Curl_parse_port(u, ipv6port);
+  fail_unless(ret == CURLUE_OK, "Curl_parse_port returned error");
+  fail:
+  free(ipv6port);
+  curl_url_cleanup(u);
+}
+UNITTEST_STOP
diff --git a/tests/unit/unit1654.c b/tests/unit/unit1654.c
new file mode 100644 (file)
index 0000000..a800d9c
--- /dev/null
@@ -0,0 +1,135 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+#include "curlcheck.h"
+
+#include "urldata.h"
+#include "altsvc.h"
+
+static CURLcode
+unit_setup(void)
+{
+  return CURLE_OK;
+}
+
+static void
+unit_stop(void)
+{
+  curl_global_cleanup();
+}
+
+#if defined(CURL_DISABLE_HTTP) || !defined(USE_ALTSVC)
+UNITTEST_START
+{
+  return 0; /* nothing to do when HTTP is disabled or alt-svc support is
+               missing */
+}
+UNITTEST_STOP
+#else
+UNITTEST_START
+{
+  char outname[256];
+  CURL *curl;
+  CURLcode result;
+  struct altsvcinfo *asi = Curl_altsvc_init();
+  if(!asi)
+    return 1;
+  result = Curl_altsvc_load(asi, arg);
+  if(result) {
+    Curl_altsvc_cleanup(asi);
+    return result;
+  }
+  curl = curl_easy_init();
+  if(!curl)
+    goto fail;
+  fail_unless(asi->num == 4, "wrong number of entries");
+  msnprintf(outname, sizeof(outname), "%s-out", arg);
+
+  result = Curl_altsvc_parse(curl, asi, "h2=\"example.com:8080\"",
+                             ALPN_h1, "example.org", 8080);
+  if(result) {
+    fprintf(stderr, "Curl_altsvc_parse() failed!\n");
+    unitfail++;
+  }
+  fail_unless(asi->num == 5, "wrong number of entries");
+
+  result = Curl_altsvc_parse(curl, asi, "h3=\":8080\"",
+                             ALPN_h1, "2.example.org", 8080);
+  if(result) {
+    fprintf(stderr, "Curl_altsvc_parse(2) failed!\n");
+    unitfail++;
+  }
+  fail_unless(asi->num == 6, "wrong number of entries");
+
+  result = Curl_altsvc_parse(curl, asi,
+                             "h2=\"example.com:8080\", h3=\"yesyes.com\"",
+                             ALPN_h1, "3.example.org", 8080);
+  if(result) {
+    fprintf(stderr, "Curl_altsvc_parse(3) failed!\n");
+    unitfail++;
+  }
+  /* that one should make two entries */
+  fail_unless(asi->num == 8, "wrong number of entries");
+
+  result = Curl_altsvc_parse(curl, asi, "h2=\"example.com:443\"; ma = 120;",
+                             ALPN_h2, "example.org", 80);
+  if(result) {
+    fprintf(stderr, "Curl_altsvc_parse(4) failed!\n");
+    unitfail++;
+  }
+  fail_unless(asi->num == 9, "wrong number of entries");
+
+  /* quoted 'ma' value */
+  result = Curl_altsvc_parse(curl, asi, "h2=\"example.net:443\"; ma=\"180\";",
+                             ALPN_h2, "example.net", 80);
+  if(result) {
+    fprintf(stderr, "Curl_altsvc_parse(4) failed!\n");
+    unitfail++;
+  }
+  fail_unless(asi->num == 10, "wrong number of entries");
+
+  result = Curl_altsvc_parse(curl, asi,
+                             "h2=\":443\", h3=\":443\"; ma = 120; persist = 1",
+                             ALPN_h1, "curl.haxx.se", 80);
+  if(result) {
+    fprintf(stderr, "Curl_altsvc_parse(5) failed!\n");
+    unitfail++;
+  }
+  fail_unless(asi->num == 12, "wrong number of entries");
+
+  /* clear that one again and decrease the counter */
+  result = Curl_altsvc_parse(curl, asi, "clear;",
+                             ALPN_h1, "curl.haxx.se", 80);
+  if(result) {
+    fprintf(stderr, "Curl_altsvc_parse(6) failed!\n");
+    unitfail++;
+  }
+  fail_unless(asi->num == 10, "wrong number of entries");
+
+  Curl_altsvc_save(asi, outname);
+
+  curl_easy_cleanup(curl);
+  fail:
+  Curl_altsvc_cleanup(asi);
+  return unitfail;
+}
+UNITTEST_STOP
+#endif
diff --git a/tests/unit/unit1655.c b/tests/unit/unit1655.c
new file mode 100644 (file)
index 0000000..a06b23a
--- /dev/null
@@ -0,0 +1,189 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+#include "curlcheck.h"
+
+#include "doh.h" /* from the lib dir */
+
+static CURLcode unit_setup(void)
+{
+  /* whatever you want done first */
+  return CURLE_OK;
+}
+
+static void unit_stop(void)
+{
+    /* done before shutting down and exiting */
+}
+
+#ifndef CURL_DISABLE_DOH
+
+UNITTEST_START
+
+/*
+ * Prove detection of write overflow using a short buffer and a name
+ * of maximal valid length.
+ *
+ * Prove detection of other invalid input.
+ */
+do {
+  const char *max =
+    /* ..|....1.........2.........3.........4.........5.........6... */
+    /* 3456789012345678901234567890123456789012345678901234567890123 */
+    "this.is.a.maximum-length.hostname."                  /* 34:  34 */
+    "with-no-label-of-greater-length-than-the-sixty-three-characters."
+                                                          /* 64:  98 */
+    "specified.in.the.RFCs."                              /* 22: 120 */
+    "and.with.a.QNAME.encoding.whose.length.is.exactly."  /* 50: 170 */
+    "the.maximum.length.allowed."                         /* 27: 197 */
+    "that.is.two-hundred.and.fifty-six."                  /* 34: 231 */
+    "including.the.last.null."                            /* 24: 255 */
+    "";
+  const char *toolong =
+    /* ..|....1.........2.........3.........4.........5.........6... */
+    /* 3456789012345678901234567890123456789012345678901234567890123 */
+    "here.is.a.hostname.which.is.just.barely.too.long."   /* 49:  49 */
+    "to.be.encoded.as.a.QNAME.of.the.maximum.allowed.length."
+                                                          /* 55: 104 */
+    "which.is.256.including.a.final.zero-length.label."   /* 49: 153 */
+    "representing.the.root.node.so.that.a.name.with."     /* 47: 200 */
+    "a.trailing.dot.may.have.up.to."                      /* 30: 230 */
+    "255.characters.never.more."                          /* 26: 256 */
+    "";
+  const char *emptylabel =
+    "this.is.an.otherwise-valid.hostname."
+    ".with.an.empty.label.";
+  const char *outsizelabel =
+    "this.is.an.otherwise-valid.hostname."
+    "with-a-label-of-greater-length-than-the-sixty-three-characters-"
+    "specified.in.the.RFCs.";
+
+  struct test {
+    const char *name;
+    const DOHcode expected_result;
+  };
+
+  /* plays the role of struct dnsprobe in urldata.h */
+  struct demo {
+    unsigned char dohbuffer[255 + 16]; /* deliberately short buffer */
+    unsigned char canary1;
+    unsigned char canary2;
+    unsigned char canary3;
+  };
+
+  const struct test playlist[4] = {
+    { toolong, DOH_DNS_NAME_TOO_LONG },  /* expect early failure */
+    { emptylabel, DOH_DNS_BAD_LABEL },   /* also */
+    { outsizelabel, DOH_DNS_BAD_LABEL }, /* also */
+    { max, DOH_OK }                      /* expect buffer overwrite */
+  };
+
+  for(int i = 0; i < (int)(sizeof(playlist)/sizeof(*playlist)); i++) {
+    const char *name = playlist[i].name;
+    size_t olen = 100000;
+    struct demo victim;
+    DOHcode d;
+
+    victim.canary1 = 87; /* magic numbers, arbritrarily picked */
+    victim.canary2 = 35;
+    victim.canary3 = 41;
+    d = doh_encode(name, DNS_TYPE_A, victim.dohbuffer,
+                   sizeof(struct demo), /* allow room for overflow */
+                   &olen);
+
+    fail_unless(d == playlist[i].expected_result,
+                "result returned was not as expected");
+    if(d == playlist[i].expected_result) {
+      if(name == max) {
+        fail_if(victim.canary1 == 87,
+                "demo one-byte buffer overwrite did not happen");
+      }
+      else {
+        fail_unless(victim.canary1 == 87,
+                    "one-byte buffer overwrite has happened");
+      }
+      fail_unless(victim.canary2 == 35,
+                  "two-byte buffer overwrite has happened");
+      fail_unless(victim.canary3 == 41,
+                  "three-byte buffer overwrite has happened");
+    }
+    else {
+      if(d == DOH_OK) {
+        fail_unless(olen <= sizeof(victim.dohbuffer), "wrote outside bounds");
+        fail_unless(olen > strlen(name), "unrealistic low size");
+      }
+    }
+  }
+} while(0);
+
+/* run normal cases and try to trigger buffer length related errors */
+do {
+  DNStype dnstype = DNS_TYPE_A;
+  unsigned char buffer[128];
+  const size_t buflen = sizeof(buffer);
+  const size_t magic1 = 9765;
+  size_t olen1 = magic1;
+  const char *sunshine1 = "a.com";
+  const char *dotshine1 = "a.com.";
+  const char *sunshine2 = "aa.com";
+  size_t olen2;
+  DOHcode ret2;
+  size_t olen;
+
+  DOHcode ret = doh_encode(sunshine1, dnstype, buffer, buflen, &olen1);
+  fail_unless(ret == DOH_OK, "sunshine case 1 should pass fine");
+  fail_if(olen1 == magic1, "olen has not been assigned properly");
+  fail_unless(olen1 > strlen(sunshine1), "bad out length");
+
+  /* with a trailing dot, the response should have the same length */
+  olen2 = magic1;
+  ret2 = doh_encode(dotshine1, dnstype, buffer, buflen, &olen2);
+  fail_unless(ret2 == DOH_OK, "dotshine case should pass fine");
+  fail_if(olen2 == magic1, "olen has not been assigned properly");
+  fail_unless(olen1 == olen2, "olen should not grow for a trailing dot");
+
+  /* add one letter, the response should be one longer */
+  olen2 = magic1;
+  ret2 = doh_encode(sunshine2, dnstype, buffer, buflen, &olen2);
+  fail_unless(ret2 == DOH_OK, "sunshine case 2 should pass fine");
+  fail_if(olen2 == magic1, "olen has not been assigned properly");
+  fail_unless(olen1 + 1 == olen2, "olen should grow with the hostname");
+
+  /* pass a short buffer, should fail */
+  ret = doh_encode(sunshine1, dnstype, buffer, olen1 - 1, &olen);
+  fail_if(ret == DOH_OK, "short buffer should have been noticed");
+
+  /* pass a minimum buffer, should succeed */
+  ret = doh_encode(sunshine1, dnstype, buffer, olen1, &olen);
+  fail_unless(ret == DOH_OK, "minimal length buffer should be long enough");
+  fail_unless(olen == olen1, "bad buffer length");
+} while(0);
+UNITTEST_STOP
+
+#else /* CURL_DISABLE_DOH */
+
+UNITTEST_START
+{
+  return 1; /* nothing to do, just fail */
+}
+UNITTEST_STOP
+
+#endif
index c75b15c..0e88e64 100644 (file)
@@ -86,6 +86,7 @@ where <options> is one or many of:
   WITH_CARES=<dll or static>     - Enable c-ares support, DLL or static\r
   WITH_ZLIB=<dll or static>      - Enable zlib support, DLL or static\r
   WITH_SSH2=<dll or static>      - Enable libSSH2 support, DLL or static\r
+  WITH_PREFIX=<dir>              - Where to install the build\r
   ENABLE_SSPI=<yes or no>        - Enable SSPI support, defaults to yes\r
   ENABLE_IPV6=<yes or no>        - Enable IPv6, defaults to yes\r
   ENABLE_IDN=<yes or no>         - Enable use of Windows IDN APIs, defaults to yes\r
@@ -113,6 +114,12 @@ already built but not with that option, or if the option was specified
 differently, you must destroy the build directory containing the configuration\r
 so that nmake can build it from scratch.\r
 \r
+Building your own application with a static libcurl\r
+===================================================\r
+When building an application that uses the static libcurl library on Windows,\r
+you must define CURL_STATICLIB. Otherwise the linker will look for dynamic\r
+import symbols.\r
+\r
 Legacy Windows and SSL\r
 ======================\r
 When you build curl using the build files in this directory the default SSL\r
index 94ce8db..7ad49f0 100644 (file)
@@ -5,7 +5,7 @@
 #                            | (__| |_| |  _ <| |___
 #                             \___|\___/|_| \_\_____|
 #
-# Copyright (C) 1999 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 1999 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 #
 # This software is licensed as described in the file COPYING, which
 # you should have received as part of this distribution. The terms
@@ -39,9 +39,13 @@ CFGSET=true
 !MESSAGE where <options> is one or many of:
 !MESSAGE   VC=<6,7,8,9,10,11,12,14,15>    - VC versions
 !MESSAGE   WITH_DEVEL=<path>              - Paths for the development files (SSL, zlib, etc.)
-!MESSAGE                                    Defaults to sibbling directory deps: ../deps
+!MESSAGE                                    Defaults to curl's sibling directory deps: ../deps
 !MESSAGE                                    Libraries can be fetched at https://windows.php.net/downloads/php-sdk/deps/
 !MESSAGE                                    Uncompress them into the deps folder.
+!MESSAGE   WITH_PREFIX=<path>             - Installation directory path
+!MESSAGE                                    Defaults to a configuration dependent (SSL, zlib, etc.)
+!MESSAGE                                    directory inside curl's subdirectory builds: ./builds
+!MESSAGE                                    Use backslashes as path separator
 !MESSAGE   WITH_SSL=<dll or static>       - Enable OpenSSL support, DLL or static
 !MESSAGE   WITH_NGHTTP2=<dll or static>   - Enable HTTP/2 support, DLL or static
 !MESSAGE   WITH_CARES=<dll or static>     - Enable c-ares support, DLL or static
@@ -55,6 +59,7 @@ CFGSET=true
 !MESSAGE   ENABLE_WINSSL=<yes or no>      - Enable native Windows SSL support, defaults to yes
 !MESSAGE   ENABLE_OPENSSL_AUTO_LOAD_CONFIG=<yes or no>
 !MESSAGE                                  - Whether the OpenSSL configuration will be loaded automatically, defaults to yes
+!MESSAGE   ENABLE_UNICODE=<yes or no>     - Enable UNICODE support, defaults to no
 !MESSAGE   GEN_PDB=<yes or no>            - Generate Program Database (debug symbols for release build)
 !MESSAGE   DEBUG=<yes or no>              - Debug builds
 !MESSAGE   MACHINE=<x86 or x64>           - Target architecture (default x64 on AMD64, x86 on others)
@@ -134,6 +139,20 @@ USE_WINSSL = false
 
 !IFNDEF ENABLE_OPENSSL_AUTO_LOAD_CONFIG
 ENABLE_OPENSSL_AUTO_LOAD_CONFIG = true
+!ELSEIF "$(ENABLE_OPENSSL_AUTO_LOAD_CONFIG)"=="yes"
+!UNDEF ENABLE_OPENSSL_AUTO_LOAD_CONFIG
+ENABLE_OPENSSL_AUTO_LOAD_CONFIG = true
+!ELSEIF "$(ENABLE_OPENSSL_AUTO_LOAD_CONFIG)"=="no"
+!UNDEF ENABLE_OPENSSL_AUTO_LOAD_CONFIG
+ENABLE_OPENSSL_AUTO_LOAD_CONFIG = false
+!ENDIF
+
+!IFNDEF ENABLE_UNICODE
+USE_UNICODE = false
+!ELSEIF "$(ENABLE_UNICODE)"=="yes"
+USE_UNICODE = true
+!ELSEIF "$(ENABLE_UNICODE)"=="no"
+USE_UNICODE = false
 !ENDIF
 
 CONFIG_NAME_LIB = libcurl
@@ -168,12 +187,6 @@ USE_MBEDTLS = true
 MBEDTLS     = $(WITH_MBEDTLS)
 !ENDIF
 
-!IF ( "$(USE_SSL)"=="true" && "$(USE_WINSSL)"=="true" ) \
- || ( "$(USE_SSL)"=="true" && "$(USE_MBEDTLS)"=="true" ) \
- || ( "$(USE_MBEDTLS)"=="true" && "$(USE_WINSSL)"=="true" )
-!ERROR SSL, MBEDTLS and WINSSL are mutual exclusive options.
-!ENDIF
-
 !IF "$(WITH_CARES)"=="dll"
 USE_CARES = true
 CARES     = dll
@@ -273,6 +286,7 @@ $(MODE):
        @SET USE_IPV6=$(USE_IPV6)
        @SET USE_SSPI=$(USE_SSPI)
        @SET USE_WINSSL=$(USE_WINSSL)
+       @SET USE_UNICODE=$(USE_UNICODE)
 # compatibility bit
        @SET WITH_NGHTTP2=$(WITH_NGHTTP2)
 
index 5cda390..4e39be6 100644 (file)
@@ -61,11 +61,11 @@ CC = cl.exe
 !IF "$(VC)"=="6"\r
 CC_NODEBUG  = $(CC) /O2 /DNDEBUG\r
 CC_DEBUG    = $(CC) /Od /Gm /Zi /D_DEBUG /GZ\r
-CFLAGS      = /I. /I../lib /I../include /nologo /W4 /wd4127 /GX /DWIN32 /YX /FD /c /DBUILDING_LIBCURL\r
+CFLAGS      = /I. /I../lib /I../include /nologo /W4 /GX /DWIN32 /YX /FD /c /DBUILDING_LIBCURL\r
 !ELSE\r
 CC_NODEBUG  = $(CC) /O2 /DNDEBUG\r
 CC_DEBUG    = $(CC) /Od /D_DEBUG /RTC1 /Z7 /LDd\r
-CFLAGS      = /I. /I ../lib /I../include /nologo /W4 /wd4127 /EHsc /DWIN32 /FD /c /DBUILDING_LIBCURL\r
+CFLAGS      = /I. /I ../lib /I../include /nologo /W4 /EHsc /DWIN32 /FD /c /DBUILDING_LIBCURL\r
 !ENDIF\r
 \r
 LFLAGS     = /nologo /machine:$(MACHINE)\r
@@ -222,6 +222,9 @@ CARES          = static
 \r
 !IFDEF USE_CARES\r
 CARES_CFLAGS   = /DUSE_ARES /I"$(CARES_INC_DIR)"\r
+!IF "$(CARES)"=="static"\r
+CARES_CFLAGS   = $(CARES_CFLAGS) /DCARES_STATICLIB\r
+!ENDIF\r
 !ENDIF\r
 \r
 \r
@@ -239,6 +242,7 @@ ZLIB_LIB_DIR = $(DEVEL_LIB)
 !IF "$(WITH_ZLIB)"=="dll"\r
 !IF EXISTS("$(ZLIB_LIB_DIR)\zlibwapi.lib")\r
 ZLIB_LIBS = zlibwapi.lib\r
+ADDITIONAL_ZLIB_CFLAGS = /DZLIB_WINAPI\r
 !ELSEIF EXISTS("$(ZLIB_LIB_DIR)\zdll.lib")\r
 ZLIB_LIBS   = zdll.lib\r
 !ELSE\r
@@ -249,6 +253,7 @@ ZLIB        = dll
 !ELSEIF "$(WITH_ZLIB)"=="static"\r
 !IF EXISTS("$(ZLIB_LIB_DIR)\zlibstat.lib")\r
 ZLIB_LIBS   = zlibstat.lib\r
+ADDITIONAL_ZLIB_CFLAGS = /DZLIB_WINAPI\r
 !ELSEIF EXISTS("$(ZLIB_LIB_DIR)\zlib.lib")\r
 ZLIB_LIBS   = zlib.lib\r
 !ELSE\r
@@ -259,7 +264,7 @@ ZLIB        = static
 !ENDIF\r
 \r
 !IFDEF USE_ZLIB\r
-ZLIB_CFLAGS = /DHAVE_ZLIB_H /DHAVE_ZLIB /DHAVE_LIBZ /I"$(ZLIB_INC_DIR)"\r
+ZLIB_CFLAGS = /DHAVE_ZLIB_H /DHAVE_ZLIB /DHAVE_LIBZ $(ADDITIONAL_ZLIB_CFLAGS) /I"$(ZLIB_INC_DIR)"\r
 !ENDIF\r
 \r
 \r
@@ -391,11 +396,11 @@ CFGSET = true
 !IF "$(DEBUG)"=="yes"\r
 RC_FLAGS = /dDEBUGBUILD=1 /Fo $@ $(LIBCURL_SRC_DIR)\libcurl.rc\r
 CURL_CC       = $(CC_DEBUG) $(RTLIB_DEBUG)\r
-CURL_RC_FLAGS = /i../include /dDEBUGBUILD=1 /Fo $@ $(CURL_SRC_DIR)\curl.rc\r
+CURL_RC_FLAGS = $(CURL_RC_FLAGS) /i../include /dDEBUGBUILD=1 /Fo $@ $(CURL_SRC_DIR)\curl.rc\r
 !ELSE\r
 RC_FLAGS = /dDEBUGBUILD=0 /Fo $@ $(LIBCURL_SRC_DIR)\libcurl.rc\r
 CURL_CC       = $(CC_NODEBUG) $(RTLIB)\r
-CURL_RC_FLAGS = /i../include /dDEBUGBUILD=0 /Fo $@ $(CURL_SRC_DIR)\curl.rc\r
+CURL_RC_FLAGS = $(CURL_RC_FLAGS) /i../include /dDEBUGBUILD=0 /Fo $@ $(CURL_SRC_DIR)\curl.rc\r
 !ENDIF\r
 \r
 !IF "$(AS_DLL)" == "true"\r
@@ -477,9 +482,24 @@ CFLAGS = $(CFLAGS) $(CFLAGS_PDB) /Fd"$(LIB_DIROBJ)\$(PDB)"
 LFLAGS = $(LFLAGS) $(LFLAGS_PDB)\r
 !ENDIF\r
 \r
+!IF ( "$(USE_SSL)"=="true" && "$(USE_WINSSL)"=="true" ) \\r
+ || ( "$(USE_SSL)"=="true" && "$(USE_MBEDTLS)"=="true" ) \\r
+ || ( "$(USE_MBEDTLS)"=="true" && "$(USE_WINSSL)"=="true" )\r
+CFLAGS = $(CFLAGS) /DCURL_WITH_MULTI_SSL\r
+!ENDIF\r
+\r
+!IF "$(USE_UNICODE)"=="true"\r
+CFLAGS = $(CFLAGS) /DUNICODE /D_UNICODE\r
+!ENDIF\r
+\r
 LIB_DIROBJ = ..\builds\$(CONFIG_NAME_LIB)-obj-lib\r
 CURL_DIROBJ = ..\builds\$(CONFIG_NAME_LIB)-obj-curl\r
+\r
+!IFDEF WITH_PREFIX\r
+DIRDIST = $(WITH_PREFIX)\r
+!ELSE\r
 DIRDIST = ..\builds\$(CONFIG_NAME_LIB)\\r
+!ENDIF\r
 \r
 #\r
 # curl.exe\r
@@ -546,6 +566,8 @@ $(LIB_DIROBJ):
        @if not exist "$(LIB_DIROBJ)" mkdir $(LIB_DIROBJ)\r
        @if not exist "$(LIB_DIROBJ)\vauth" mkdir $(LIB_DIROBJ)\vauth\r
        @if not exist "$(LIB_DIROBJ)\vtls" mkdir $(LIB_DIROBJ)\vtls\r
+       @if not exist "$(LIB_DIROBJ)\vssh" mkdir $(LIB_DIROBJ)\vssh\r
+       @if not exist "$(LIB_DIROBJ)\vquic" mkdir $(LIB_DIROBJ)\vquic\r
 \r
 $(CURL_DIROBJ):\r
        @if not exist "$(CURL_DIROBJ)" mkdir $(CURL_DIROBJ)\r
@@ -564,6 +586,12 @@ $(CURL_DIROBJ):
 {$(LIBCURL_SRC_DIR)\vtls\}.c{$(LIB_DIROBJ)\vtls\}.obj:\r
        $(CURL_CC) $(CFLAGS) /Fo"$@"  $<\r
 \r
+{$(LIBCURL_SRC_DIR)\vssh\}.c{$(LIB_DIROBJ)\vssh\}.obj:\r
+       $(CURL_CC) $(CFLAGS) /Fo"$@"  $<\r
+\r
+{$(LIBCURL_SRC_DIR)\vquic\}.c{$(LIB_DIROBJ)\vquic\}.obj:\r
+       $(CURL_CC) $(CFLAGS) /Fo"$@"  $<\r
+\r
 $(LIB_DIROBJ)\libcurl.res: $(LIBCURL_SRC_DIR)\libcurl.rc\r
        $(RC) $(RC_FLAGS)\r
 \r
index c640cee..79a27ac 100755 (executable)
@@ -1,8 +1,32 @@
-@echo OFF
-@if exist %OUTFILE% (
-    del %OUTFILE%
+@echo off
+rem ***************************************************************************
+rem *                                  _   _ ____  _
+rem *  Project                     ___| | | |  _ \| |
+rem *                             / __| | | | |_) | |
+rem *                            | (__| |_| |  _ <| |___
+rem *                             \___|\___/|_| \_\_____|
+rem *
+rem * Copyright (C) 2011 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+rem *
+rem * This software is licensed as described in the file COPYING, which
+rem * you should have received as part of this distribution. The terms
+rem * are also available at https://curl.haxx.se/docs/copyright.html.
+rem *
+rem * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+rem * copies of the Software, and permit persons to whom the Software is
+rem * furnished to do so, under the terms of the COPYING file.
+rem *
+rem * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+rem * KIND, either express or implied.
+rem *
+rem ***************************************************************************
+
+if exist %OUTFILE% (
+  del %OUTFILE%
 )
-@echo %MACRO_NAME% = \> %OUTFILE%
-@for %%i in (%*) do @echo              %DIROBJ%/%%i \>>  %OUTFILE%
-@echo. >>  %OUTFILE%
+
+echo %MACRO_NAME% = \> %OUTFILE%
+for %%i in (%*) do echo                %DIROBJ%/%%i \>>  %OUTFILE%
+echo. >>  %OUTFILE%
+
 :END